iozone3_508/src/current/Changes.txt0000555000000000000000000037542715051766073016155 0ustar rootrootV1.0 (capps): Capps: Beginning of the code base. Isom: Added reread Added rewrite Added read backwards Added lseek+read Added lseek+reread Capps: Added more accurate time collection method. Added alignment in the on chip Cache code. Added change step when passing 16 Meg size file. Capps: Added auto+ to purge on chip cache. kcollins: replaced the lseek+read &reread test with random reads and writes Capps: Replaced reverse re-read with record rewrite. This gives both source and destination on chip cache hits. Capps: added auto+multi Support for multiple buffers in the iozone. Capps: Removed the recursion through main(). Cleaned up the printout when not in auto mode. Added support for stride-read. ( Manual mode only ) Capps: Cleanup so it will build for bsd4_2 ( C series machines ) Capps: Cleanup on frontend. Now uses getopt() and has a real parser. Cleanup on error handling. Added throughput tests. Eliminated page faults in the throughput tests. Capps: Made all perf tests table driven. Add back Bill's Copyright. ansify, prototypes, scope limitations. V2.1 (kcollins): Simplified auto mode logic. auto test now runs from MEGABYTES_START to MEGABYTES_END and from RECLEN_START to RECLEN_END with values multiplied by MULTIPLIER each iteration. Range set to (4K...16M) for RECLEN and (1M...512M) for MEGABYTES. (the physical I/O tests for RECLEN <4K take several hours on a 1200). Enlarged MAXBUFFERSIZE to 16MB for large record tests. Added error checking for mallocs (!-). Changed multibuffer code to use all of MAXBUFFERSIZE as a circular buffer, with the number of buffers varying as MAXBUFFERSIZE/reclen. This corrects problems where MAXBUFFERSIZE*MAXBUFFERS was very large. Also modified auto mode so that tests where reclen>filesize are skipped. Modified preadv code to vary the number of buffers as necessary such that they will fit in min(MAXBUFFERSIZE,filesize). This fixes problems where the number of buffers in the i/o vector exceeded the size of mainbuffer. Added bzero for buffer when it is first malloc'd. This ensures that it is initialized before use. Created a script (profile.fs) that runs a series of tests to generate a "box" around common application variables such as filesize, buffer size, buffer encachement, and number of concurrent processes. This is intended to serve as the "standard" filesystem profile. buffer reset to mainbuffer before each test loop V2.3 (kcollins): added -F option to write to specify pathnames for throughput tests (allowing throughput tests to multiple filesystems). V2.4 (capps): Changed preadv/pwritev to use a non-sequential access pattern. Changed the version number. Moved all user interface values to KB. This simplifies the user interface. (consistant scaling) and it also allows one to start with 512kb file. This is very important since the first indirect block causes a significant slowdown in the initial write cases. V2.5 (capps): Re-structure and cleanup. V2.6 (kcollins) Bug fix for the throughput tests. V2.7 (capps): Added -o flag. This makes all file opens for writes have the O_SYNC flag set. This makes all writes go to disk before competion. This is useful for seeing what the media can do without the buffer cache helping. V2.8 (capps): Added -V flag. This turns on pattern verification. If the user were to type: -V 165 Then bit pattern 0xa5 would be placed in every byte in the buffer and when read back from buffer cache, or disk, it will be verified to be correct. If it fails then the error handler will specify the byte location of the miscompare. V2.9 (capps): Added fread/re-fread, fwrite/re-fwrite to list of tests. Added -E to allow the user to run pread and friends as an option. V2.10 (capps): Added -R. This will generate Excel compatible files that can then be imported into Excel and graphed. Added support for 5 targets to the makefile. Added -M This prints out the uname -a stuff about a machine. Added -O This gives all results in operations/sec instead of KB/sec. More code cleanup. Update comments. V2.11 (kcollins) added -A. Auto mode with no crossover and read/write tests only changed default record size to 64KB (from 512 bytes) V2.12 (capps) Added shared memory barrier sync for throughput mode. This provides much finer control over the actual timeing of the children. Added mmap() for BSD (Convex) machines that do not have System V shared memory. Added two ways of showing throughput results. The second method takes into consideration children that lag behind due to slow devices, and gives results that are more accurate. Cleanup of some tab problems in throughput results. Cleanup of floating point output taking to much space. Added -d to allow a variable delay comming out of the barrier in the throughput tests. V2.12 (kcollins) added declaration for create_list to make ansi c compiles work several fixes to some of the SPPUX 5.x make targets added date run to banner (hope this doesn't break your scripts $-) V2.13 (capps) Added "stone walling". During throughput tests, if one process finishes then all others are sent a signal to tell them to stop. (The parallel region has finished). This provides better numbers for throughput. Only bzero or fill min(reclen,CACHE_SIZE) this saves a bunch of paging on workstations with small memory systems. Fixed broken target in the makefile. Note: use of -d is not advised. It makes the children not run in parallel. V2.14 (capps) Bug fix to avoid anomaly in SPP-UX. In SPP-UX the filesystem code preallocates meta-data to improve initial file writes. The first indirect block allocation was causing a block of zeros to be written syncronously. In SPP-UX the filesytem code preallocates zero filled blocks when the first writer touches a filesystem after a sync. A pool of on disk zero'd blocks are created asynchronously and handed out to writers when they cross the boundry into the first level indirect and would have had to stop and wait for the zero filled block to be written. Iozone's testing methodology was not allowing the OS to have any time to complete the async pre-allocation and was not showing the speed up that real applications would see. V2.15 (capps) Improve throughput testing mode. V2.16 (capps) Added -U option. This allows the filesystem to be unmounted and remounted between tests. This guarentees that the buffer cache is cold. V2.17 (capps) Added -T option. This makes the throughput tests use threads instead of processes. Currently using pthread_create(), pthread_self(), and pthread_exit(). Cleaned up file cleanup mechanism. Control C will now cause all temp files to be deleted. Removed all signals used to control sub-processes. V2.18 (capps) Cleanup. Added read stride, read backwards to the throughput tests. Various bug fixes V2.19 (capps) Removed all calls to malloc() and all use of system V shared memory. mmap() is much easier to deal with. As for malloc() HP programs are very limited on the ammount of malloc() space and not nearly so constrained on mmap() memory. It was necessary to move to mmap() since multiple threads all need buffers in the processes address space. Removed dependency on first thread being number 2. Iozone now probes to find out what the thread library will return for the first thread. This makes the switching thread libraries much easier. V2.20 (capps) Children now set stop_flag and shutdown all other children.There is no further need to tell the parent to distribute the stop_flag. verify, purge, and osync are now supported in the throughput tests. Fixed bug where pthreads stack size was causing segmentation violation when purgeit() was called for buffer that were greater than 256kb. V2.21 (capps) Enhanced throughput reporting. Now provides: Child throughput, Parent throughput, Minimum throughput for any child in the group, Maximum throughput for any child in the group, and Minimum transfer count. Due to stone walling not all children write the full requested size. This minimum transfer count provides the user with knowledge of how much work was performed by the slowest child. Added -C flag. This allows the user to see all of the transfer counts for each child. Had to add system 5 shared memory back. Linux does not support mmap(MAP_ANONYMOUS|MAP_SHARED). So it must use SYSV shared memory get get sharing working. V2.22 (capps) Made changes to make iozone work correctly on Linux on a PC. Changes are just scaling down the test to fit on a pc, and scaling down shared segments to < 16 Meg so it can run on an Intel 386 class machine. Added: -L # Set the processor cache line size in bytes. Added: -S # Set the processor cache size in kbytes. Removed spin wait in parent waiting for threads to finish each throughput test. Code not uses thread_join(). Fixed -O (operations/sec) mode to work in throughput tests. V2.23 (capps) Close small timing hole where thread/process has set stop flag and others are in a system call. The hole allowed threads/processes to continue to increment work done after one had finished and told the others to stop. The result was that the children would report slightly high numbers as they were not truely parallel at the finish line. Added random read throughput test. Fixes for VxFS small extents being created by prime_zb() functions. Provides more details about the throughput run. V2.24 (capps) Added support for -R (Excell chart generation) to the throughput tests. Also added support for the -O (ops/sec) to the throughput Excell chart. V2.25 (capps) Added support for selecting which test to run. -i # -i 0 -i 3 will run write and read-backwards tests only. For a list of the test numbers type iozone -h. V2.26 (capps) Added support for LARGE_FILES for the hpux-11.0 target. V2.27 (capps) All tests now verify one long word of data from each page written/read to/from the file. This is to level the playing field with systems that do not move data when "read" or "write" is called, but instead just map the file and perform the I/O when the address space is touched. Benchmarks that do not validate the data ,at least touch each page, do not measure the read/write times just the map times. Note: The -V option still verifies each byte of the buffer, the default is now to verify one long from each page. V2.28 (capps) Added support for benchmarking mmap() files. Added more command line options. -B -G -D B = Use mmap() files for the benchmark. G = Use msync(MS_SYNC) for mmap files. D = Use msync(MS_ASYNC) for mmap files. V2.29 (capps) Bug fixes for: Combination of running individual tests and mmap() files support. Stride read bug that caused only portions of the total file to be examined. V2.30 (capps) Fixups for build under SPP-UX V2.31 (capps) Fixups for build under Linux. Added -j ### to support user setting the stride size for the stride read benchmark. V2.32 (capps) Add support for IRIX and IRIX64. V2.33 (capps) Add support for POSIX async I/O benchmarking. Uses a library to interface to POSIX async I/O model. The library provides and extended async_read() interface. It takes the standard calling options of read() but also allows the application to perform read-ahead with a stride. (positive or negative) and allows the user to specify how much read ahead to perform. Tested on HP-UX 11.0, Linux, SGI Origin. V2.34 (capps) Added -k. This allows POSIX async I/O to utilize the buffer specified and not to perform any bcopys. Fixes to make multi-threadedness work on SGI Origin. V2.34 (capps) Added [-k #]. This allows POSIX async I/O to utilize the buffer specified and not to perform any bcopys. Fixes to make multi-threadedness work on SGI Origin. V2.36 (capps) Iozone is now a 64 bit application. It may be compiled for either 64 bit or 32 bit machines. The makefile supports 64 and 32 bit targets for machines that support 32 & 64 bit targets. All version numbers are now automatically generated by RCS. This is the last time we have to bump the version number by hand. ----------------------------------------------------------------------------------- Changed over to RCS source control here: Version Numbers are reset at this point back to Version 1.1. ----------------------------------------------------------------------------------- RCS file: iozone.c,v; Working file: iozone.c head: 1.94 locks: ; strict access list: symbolic names: comment leader: " * " total revisions: 94; selected revisions: 94 description: Initial rcs version of Iozone ---------------------------- Revision 1.94 date: 99/01/18 13:02:57; author: capps; state: Exp; lines added/del: 7/2 Call msync if writer wants sync in timing and terminates early in multi thread test case. ---------------------------- Revision 1.93 date: 99/01/18 11:46:11; author: capps; state: Exp; lines added/del: 309/126 Cleanup for include_flush and include_close for single and multi threaded operations. ---------------------------- Revision 1.92 date: 99/01/15 10:53:58; author: capps; state: Exp; lines added/del: 40/11 Add include_close support for throughput testing ---------------------------- Revision 1.91 date: 98/12/07 09:26:22; author: capps; state: Exp; lines added/del: 43/24 For Windows: Use the high resolution timers instead of timeofday(); Fix a few casting problems. ---------------------------- Revision 1.90 date: 98/11/30 14:49:46; author: capps; state: Exp; lines added/del: 24/17 Update the copyright and names and places ---------------------------- Revision 1.89 date: 98/10/30 09:04:51; author: capps; state: Exp; lines added/del: 1/2 An extra close(fd) causes HP-UX to fail future unmounts... ---------------------------- Revision 1.88 date: 98/10/29 09:47:25; author: capps; state: Exp; lines added/del: 17/17 Cleanup the help screen ---------------------------- Revision 1.87 date: 98/10/28 23:31:11; author: capps; state: Exp; lines added/del: 7/6 Spelling error fix. ---------------------------- Revision 1.86 date: 98/10/14 11:21:50; author: capps; state: Exp; lines added/del: 23/68 Unified the time method to only have 2 ways to get time. ---------------------------- Revision 1.85 date: 98/10/14 09:22:09; author: capps; state: Exp; lines added/del: 91/91 Added code to remove the latency of gettimeofday() from the file performance measurements. ---------------------------- Revision 1.84 date: 98/10/12 11:44:50; author: capps; state: Exp; lines added/del: 107/8 Add time resolution output, and fix the divide by zero when the time in a system call turns out to be Zero. This will introduce distortion for machines that have very fast system calls and very poor time resolution. Windows has a 50 Milli second resolution on gettimeofday(). So... to fix it all calls that take less than 50 Milli seconds will be rounded up to cost 50 milliseconds. ---------------------------- Revision 1.83 date: 98/10/06 09:58:16; author: capps; state: Exp; lines added/del: 46/2 Add support for Windows build ---------------------------- Revision 1.82 date: 98/09/23 09:48:02; author: capps; state: Exp; lines added/del: 2/2 Fix bug where -i # was leaving tmp files after throughput test. ---------------------------- Revision 1.81 date: 98/09/23 09:41:12; author: capps; state: Exp; lines added/del: 1/3 Remove debug printf ---------------------------- Revision 1.80 date: 98/09/23 09:29:01; author: capps; state: Exp; lines added/del: 23/1 Add my_nap(). This allows the threads to switch processors to their new bound processor before performing any work. ---------------------------- Revision 1.79 date: 98/09/22 11:57:20; author: capps; state: Exp; lines added/del: 8/8 Change xx back into an int so the modulo will work better. ---------------------------- Revision 1.78 date: 98/09/18 16:27:05; author: capps; state: Exp; lines added/del: 18/15 Remove create in rewrite path. ---------------------------- Revision 1.77 date: 98/08/17 16:44:06; author: capps; state: Exp; lines added/del: 23/1 Fixes for Solaris and the new processor bind feature. ---------------------------- Revision 1.76 date: 98/08/17 16:17:45; author: capps; state: Exp; lines added/del: 1/2 Remove debug code. ---------------------------- Revision 1.75 date: 98/08/17 16:16:15; author: capps; state: Exp; lines added/del: 92/5 Add support for binding procs/threads to cpus. ---------------------------- Revision 1.74 date: 98/08/07 16:51:41; author: capps; state: Exp; lines added/del: 4/3 Add fsync to the fwrite test case when the user specifies -e ---------------------------- Revision 1.73 date: 98/08/07 16:47:38; author: capps; state: Exp; lines added/del: 178/208 Add -c and -e to allow closes and fsyncs to be inside the timing calculations. ---------------------------- Revision 1.72 date: 98/08/06 22:40:15; author: capps; state: Exp; lines added/del: 9/1 Add setvbuf to fwrite and fread tests so that the internal fwrite and fread buffer size is the same as the record size. This is what a well tuned application would do. ---------------------------- Revision 1.71 date: 98/08/06 09:03:06; author: capps; state: Exp; lines added/del: 2/3 Fix fsync filename problem in fwrite_perf_test ---------------------------- Revision 1.70 date: 98/08/05 18:06:41; author: capps; state: Exp; lines added/del: 6/2 Add fsync after fwrite test case so the fread will start with a clean buffer cache and no writes in progress. ---------------------------- Revision 1.69 date: 98/08/03 10:45:49; author: capps; state: Exp; lines added/del: 3/3 Bug fix for -V option not filling the entire buffer. ---------------------------- Revision 1.68 date: 98/07/30 22:11:11; author: capps; state: Exp; lines added/del: 2/3 Fix for solaris ---------------------------- Revision 1.67 date: 98/07/30 22:08:19; author: capps; state: Exp; lines added/del: 2/2 Fix for solaris ---------------------------- Revision 1.66 date: 98/07/30 22:05:02; author: capps; state: Exp; lines added/del: 43/15 Add support for Solaris ---------------------------- Revision 1.65 date: 98/07/01 14:19:19; author: capps; state: Exp; lines added/del: 80/82 Move end_async inside the timing loops as in async I/O it counts. ---------------------------- Revision 1.64 date: 98/06/16 17:04:36; author: capps; state: Exp; lines added/del: 13/2 Correct problem where user specifies pread tests on hpux... which does not support these operations. The test now prints an error message and exits. ---------------------------- Revision 1.63 date: 98/06/16 16:54:22; author: capps; state: Exp; lines added/del: 1/2 Remove exit from auto_test. This allows the message "iozone test complete" to be printed when in auto test mode. ---------------------------- Revision 1.62 date: 98/06/10 10:54:28; author: capps; state: Exp; lines added/del: 175/173 All exit()s now have a unique exit value. ---------------------------- Revision 1.61 date: 98/05/18 13:34:03; author: capps; state: Exp; lines added/del: 17/18 Move .dat file descriptors to global data. Needed to prevent re-opens. ---------------------------- Revision 1.60 date: 98/05/18 13:24:22; author: capps; state: Exp; lines added/del: 6/3 Bug fix. Prevents re-opending .dat files when in auto mode. ---------------------------- Revision 1.59 date: 98/05/08 13:03:02; author: capps; state: Exp; lines added/del: 21/3 Enhance throughput tests to follow the -i test number to run options. ---------------------------- Revision 1.58 date: 98/05/07 14:15:49; author: capps; state: Exp; lines added/del: 109/39 Make VXFS a define in the make command. This makes moving to other targets easier. It removes the binding of HPUX and VXFS. Also, Added -Q to support offset/latency file generation for later use as inputs to plot program. ---------------------------- Revision 1.57 date: 98/05/06 15:09:43; author: capps; state: Exp; lines added/del: 100/27 Add -N to provide results in microseconds per operation. ---------------------------- Revision 1.56 date: 98/05/05 13:23:29; author: capps; state: Exp; lines added/del: 3/10 If the user specifies -i 0 then run both write and rewrite tests. ---------------------------- Revision 1.55 date: 98/04/30 15:19:02; author: capps; state: Exp; lines added/del: 1/1 No change ---------------------------- Revision 1.54 date: 98/04/30 15:09:58; author: capps; state: Exp; lines added/del: 2/2 Unlink the vxfstest when the test fails. ---------------------------- Revision 1.53 date: 98/04/30 13:07:21; author: capps; state: Exp; lines added/del: 7/5 Cleanup help output. ---------------------------- Revision 1.52 date: 98/04/30 12:58:29; author: capps; state: Exp; lines added/del: 21/4 Add async I/O with no bcopy to throughput tests. ---------------------------- Revision 1.51 date: 98/04/29 15:29:29; author: capps; state: Exp; lines added/del: 5/1 Fixes so it will compile on the SGI Origin. ---------------------------- Revision 1.50 date: 98/04/29 11:57:58; author: capps; state: Exp; lines added/del: 5/1 Do not need to limit async ops. Fix is in libasync.c ---------------------------- Revision 1.49 date: 98/04/29 10:45:19; author: capps; state: Exp; lines added/del: 61/3 Add async I/O to throughput testing for writes ---------------------------- Revision 1.48 date: 98/04/28 11:57:13; author: capps; state: Exp; lines added/del: 5/1 Limit max async operations to 60. Beyond this there be dragons. ---------------------------- Revision 1.47 date: 98/04/28 10:16:09; author: capps; state: Exp; lines added/del: 108/21 Completed support for no_bcopy POSIX async I/O in the async_write_no_copy path. This allows write tests to perform async I/O with buffers released when the write is completed. ---------------------------- Revision 1.46 date: 98/04/27 16:58:38; author: capps; state: Exp; lines added/del: 43/10 Add aio_write() to the write and re-write tests. This provides POSIX async I/O for the those tests. ---------------------------- Revision 1.45 date: 98/04/25 09:53:39; author: capps; state: Exp; lines added/del: 3/2 direct_flag is an int. Was a char in one place and an int in another. ---------------------------- Revision 1.44 date: 98/04/25 09:17:42; author: capps; state: Exp; lines added/del: 27/15 More support for vx_direct support in the write path ---------------------------- Revision 1.43 date: 98/04/24 16:33:44; author: capps; state: Exp; lines added/del: 115/77 Move VX_DIRECT to libasync. But keep the VX_DIRECT support also in iozone. So one can use VX_DIRECT with and without async I/O ---------------------------- Revision 1.42 date: 98/04/24 16:20:34; author: capps; state: Exp; lines added/del: 127/60 Move VX_DIRECT to the libasync module. ---------------------------- Revision 1.41 date: 98/04/24 15:50:54; author: capps; state: Exp; lines added/del: 190/7 Add support for VxFS VX_DIRECT Idea is to use VX_DIRECT and POSIX async I/O together ---------------------------- Revision 1.40 date: 98/04/22 16:38:25; author: capps; state: Exp; lines added/del: 5/5 Sppux wants ail_gettimeofday variables to be unsigned int. ---------------------------- Revision 1.39 date: 98/04/22 16:19:50; author: capps; state: Exp; lines added/del: 7/3 Fix -M option not printing cleanly Fix -R in 32 bit mode printing garbage. ---------------------------- Revision 1.38 date: 98/04/22 15:56:02; author: capps; state: Exp; lines added/del: 1/1 Change to only disply revision not full header. ---------------------------- Revision 1.37 date: 98/04/22 15:52:19; author: capps; state: Exp; lines added/del: 1/1 Add RCS Header to support versioning. ---------------------------- Revision 1.36 date: 98/04/22 15:38:26; author: capps; state: Exp; lines added/del: 1/1 fix to bcopy() third arg needs to be size_t for 32 bit mode. ---------------------------- Revision 1.35 date: 98/04/22 09:09:24; author: capps; state: Exp; lines added/del: 17/17 Bug fixes for 64 bit mode on IRIX, and addition on the internal inuse queue to insure that the internal struct_cache_ent structures are not released too early when doing direct I/O (async_read_no_copy). ---------------------------- Revision 1.34 date: 98/04/21 09:31:02; author: capps; state: Exp; lines added/del: 4/0 Fix to eliminate hidden (dot) files that iozone was creating in throughput mode. All files are now visible with ls. ---------------------------- Revision 1.33 date: 98/04/21 08:30:35; author: capps; state: Exp; lines added/del: 7/1 Have Iozone print the compile model used. ---------------------------- Revision 1.32 date: 98/04/20 18:46:02; author: capps; state: Exp; lines added/del: 49/20 Fixes for 32 bit mode. ---------------------------- Revision 1.31 date: 98/04/20 16:57:29; author: capps; state: Exp; lines added/del: 8/8 make sure malloc is called with (size_t) parameter. ---------------------------- Revision 1.30 date: 98/04/20 16:05:08; author: capps; state: Exp; lines added/del: 933/757 Iozone now 64 bit application ---------------------------- Revision 1.29 date: 98/04/20 12:32:25; author: capps; state: Exp; lines added/del: 4/4 Move msync to before munmap so file gets written. ---------------------------- Revision 1.28 date: 98/04/20 10:21:30; author: capps; state: Exp; lines added/del: 2/2 Minor fix for -O flag and -B not working smoothly together. ---------------------------- Revision 1.27 date: 98/04/20 10:17:19; author: capps; state: Exp; lines added/del: 0/0 No change ---------------------------- Revision 1.26 date: 98/04/19 15:11:07; author: capps; state: Exp; lines added/del: 5/5 Remove prime_zbfill. It causes problems with mmap files. ---------------------------- Revision 1.25 date: 98/04/16 15:24:50; author: capps; state: Exp; lines added/del: 228/70 -H is Nastran async I/O with bcopy -k is async I/O without any bcopys ---------------------------- Revision 1.24 date: 98/04/15 16:48:30; author: capps; state: Exp; lines added/del: 22/4 fix to make build on 9.05 and 10.1 ---------------------------- Revision 1.23 date: 98/04/15 15:36:55; author: capps; state: Exp; lines added/del: 9/9 Cleanup some compiler warnings about un-initialized variables. They are not really un-initialized and used but it does generate compiler warnings on some machines. ---------------------------- Revision 1.22 date: 98/04/15 15:32:56; author: capps; state: Exp; lines added/del: 7/7 Need to free the dummyname space a bit later. ---------------------------- Revision 1.21 date: 98/04/15 14:37:05; author: capps; state: Exp; lines added/del: 27/13 Fix to use smaller stack size in thread_ routines. It was causing the SGI to drop core in throughput tests. ---------------------------- Revision 1.20 date: 98/04/14 17:01:19; author: capps; state: Exp; lines added/del: 27/16 Fix a memory leak. In multi_throughput testing shmalloc was getting called for each iteration. This is not needed and causes much to much shm to be allocated. Not broken but definately a pig. ---------------------------- Revision 1.19 date: 98/04/14 15:19:15; author: capps; state: Exp; lines added/del: 2/0 When -k is specified alone this will turn on the POSIX async I/O and set depth to 0. ---------------------------- Revision 1.18 date: 98/04/14 15:00:18; author: capps; state: Exp; lines added/del: 21/20 Fixes to make multi-threaded version run on the SGI Origin. ---------------------------- Revision 1.17 date: 98/04/14 11:55:44; author: capps; state: Exp; lines added/del: 17/11 Add support for -k. When using POSIX async I/O use the buffer specified and do not perform any bcopys. ---------------------------- Revision 1.16 date: 98/04/13 10:22:18; author: capps; state: Exp; lines added/del: 27/380 Add libasync library support ---------------------------- Revision 1.15 date: 98/04/11 12:09:25; author: capps; state: Exp; lines added/del: 1/0 Fix memory leak. Now calls del_cache when ever any calls to async_end happen. This will ensure that there are no outstanding I/Os on the cache that ha ve not been canceled . ---------------------------- Revision 1.14 date: 98/04/11 11:57:10; author: capps; state: Exp; lines added/del: 632/47 Add support for POSIX async I/O testing ---------------------------- Revision 1.13 date: 98/03/31 14:30:15; author: capps; state: Exp; lines added/del: 44/6 Fix support for bsd4_2 and ConvexOS ---------------------------- Revision 1.12 date: 98/03/31 11:26:34; author: capps; state: Exp; lines added/del: 2/2 Bump version number to 2.32 ---------------------------- Revision 1.11 date: 98/03/31 11:20:51; author: capps; state: Exp; lines added/del: 70/6 Add support for SGI IRIX and SGI IRIX64 ---------------------------- Revision 1.10 date: 98/03/27 14:00:47; author: capps; state: Exp; lines added/del: 15/20 Put the bcopy back. It is more represenative of what the real application will do. ---------------------------- Revision 1.9 date: 98/03/27 13:25:02; author: capps; state: Exp; lines added/del: 40/14 Improved mmap file support. Now only have 1 long word from each page touched. This eliminates the overhead of bcopy dominating the results. It also is performing the same work that the non-mmap version does with verify(). ---------------------------- Revision 1.8 date: 98/03/27 10:41:13; author: capps; state: Exp; lines added/del: 10/4 Bug fix. Frewrite was truncating the file. This fix ensures that the Frewrite test opens without trunc. ---------------------------- Revision 1.7 date: 98/03/27 10:16:41; author: capps; state: Exp; lines added/del: 3/3 Fix report to specify stride size as a function of reclen. It did not make sense to output kbytes as the value changes when in auto mode to match the current record length. ---------------------------- Revision 1.6 date: 98/03/26 15:28:15; author: capps; state: Exp; lines added/del: 16/8 Add support for -j option. This allows the user to specify the stride size for the strided file access benchmark. ---------------------------- Revision 1.5 date: 98/03/25 15:27:01; author: capps; state: Exp; lines added/del: 1/1 Fixup help screen to reflect new options ---------------------------- Revision 1.4 date: 98/03/25 15:21:23; author: capps; state: Exp; lines added/del: 1/1 Change the revision number ---------------------------- Revision 1.3 date: 98/03/25 15:20:28; author: capps; state: Exp; lines added/del: 16/1 Fixup support for Linux ---------------------------- Revision 1.2 date: 98/03/25 13:58:05; author: capps; state: Exp; lines added/del: 16/3 Bug fixes for SPP-UX ---------------------------- Revision 1.1 date: 98/03/25 10:43:45; author: capps; state: Exp; Initial revision ============================================================================= RCS file: libasync.c,v; Working file: libasync.c head: 1.39 locks: ; strict access list: symbolic names: comment leader: " * " total revisions: 39; selected revisions: 39 description: Initial version of POSIX async I/O library interface. ---------------------------- Revision 1.39 date: 98/07/30 22:05:21; author: capps; state: Exp; lines added/del: 3/1 Add support for Solaris ---------------------------- Revision 1.38 date: 98/07/07 13:00:39; author: capps; state: Exp; lines added/del: 1/11 Remove extra bcopy in the async_write_no_bcopy path. ---------------------------- Revision 1.37 date: 98/06/11 09:47:58; author: capps; state: Exp; lines added/del: 3/3 Fix syntax error for IRIX ---------------------------- Revision 1.36 date: 98/06/10 10:56:55; author: capps; state: Exp; lines added/del: 10/10 All exit()s now have a unique exit value. ---------------------------- Revision 1.35 date: 98/05/07 14:17:20; author: capps; state: Exp; lines added/del: 2/2 Make VXFS a define in the make command. This makes moving to other targets easier. It removes the binding of HPUX and VXFS. Also, Added -Q to support offset/latency file generation for later use as inputs to plot program. ---------------------------- Revision 1.34 date: 98/04/30 15:19:54; author: capps; state: Exp; lines added/del: 1/3 Remove debug code that breaks 64 bit mode compiled code. ---------------------------- Revision 1.33 date: 98/04/30 13:09:13; author: capps; state: Exp; lines added/del: 2/2 Make retval an int so it can be checked for less than zero. ---------------------------- Revision 1.32 date: 98/04/29 16:49:34; author: capps; state: Exp; lines added/del: 5/11 If overshooting on number of asyncs then terminate the loop and let the next time through pick up the I/O. ---------------------------- Revision 1.31 date: 98/04/29 16:37:49; author: capps; state: Exp; lines added/del: 3/3 Remove debug code ---------------------------- Revision 1.30 date: 98/04/29 15:29:48; author: capps; state: Exp; lines added/del: 3/1 Fixes so it will compile on the SGI Origin. ---------------------------- Revision 1.29 date: 98/04/29 11:56:27; author: capps; state: Exp; lines added/del: 36/10 Work around for bug in POSIX async I/O library ---------------------------- Revision 1.28 date: 98/04/29 11:04:26; author: capps; state: Exp; lines added/del: 1/2 Remove debug code ---------------------------- Revision 1.27 date: 98/04/29 11:02:54; author: capps; state: Exp; lines added/del: 54/27 Added resource shortage paths. ---------------------------- Revision 1.26 date: 98/04/28 18:12:51; author: capps; state: Exp; lines added/del: 1/3 Add async I/O to the throughput tests ---------------------------- Revision 1.25 date: 98/04/28 17:12:40; author: capps; state: Exp; lines added/del: 3/1 fix wait_for_ routine to reset w_tail if item being removed is also the tail. ---------------------------- Revision 1.24 date: 98/04/28 16:14:06; author: capps; state: Exp; lines added/del: 1/3 bug fix. 2 calls to malloc for aligned memory. ---------------------------- Revision 1.23 date: 98/04/28 11:57:39; author: capps; state: Exp; lines added/del: 37/13 Limit max async operations to 60. Beyond this there be dragons. ---------------------------- Revision 1.22 date: 98/04/28 10:17:22; author: capps; state: Exp; lines added/del: 127/42 Completed support for no_bcopy POSIX async I/O in the async_write_no_copy path. This allows write tests to perform async I/O with buffers released when the write is completed. ---------------------------- Revision 1.21 date: 98/04/27 16:59:14; author: capps; state: Exp; lines added/del: 246/9 Add aio_write() to the write and re-write tests. This provides POSIX async I/O for the those tests. ---------------------------- Revision 1.20 date: 98/04/24 16:20:55; author: capps; state: Exp; lines added/del: 15/3 Move VX_DIRECT to the libasync module. ---------------------------- Revision 1.19 date: 98/04/24 15:50:13; author: capps; state: Exp; lines added/del: 42/11 Add support for VxFS VX_DIRECT Idea is to use VX_DIRECT and POSIX async I/O together ---------------------------- Revision 1.18 date: 98/04/24 12:36:42; author: capps; state: Exp; lines added/del: 13/5 Fix some error printfs to match the size of the off_t. ---------------------------- Revision 1.17 date: 98/04/24 12:18:11; author: capps; state: Exp; lines added/del: 7/7 Fixes for LP64 mode. off_t changed to off64_t ---------------------------- Revision 1.16 date: 98/04/24 09:33:32; author: capps; state: Exp; lines added/del: 275/35 Add comments and fix for LP64 model on hpux. ---------------------------- Revision 1.15 date: 98/04/23 16:58:06; author: capps; state: Exp; lines added/del: 167/13 Make libasync large file aware. ---------------------------- Revision 1.14 date: 98/04/22 15:58:45; author: capps; state: Exp; lines added/del: 1/1 Change version to only display rcs version id. ---------------------------- Revision 1.13 date: 98/04/22 15:52:54; author: capps; state: Exp; lines added/del: 1/2 Add RCS version support ---------------------------- Revision 1.12 date: 98/04/22 11:39:35; author: capps; state: Exp; lines added/del: 52/8 Add firewall to prevent in flight changes to the aiocb structure. ---------------------------- Revision 1.11 date: 98/04/22 09:10:36; author: capps; state: Exp; lines added/del: 57/19 Bug fixes for 64 bit mode on IRIX, and addition on the internal inuse queue to insure that the internal struct_cache_ent structures are not released too early when doing direct I/O (async_read_no_copy). ---------------------------- Revision 1.10 date: 98/04/21 09:34:14; author: capps; state: Exp; lines added/del: 18/10 Improve error messages. ---------------------------- Revision 1.9 date: 98/04/20 16:06:21; author: capps; state: Exp; lines added/del: 53/50 Iozone now 64 bit application ---------------------------- Revision 1.8 date: 98/04/20 10:17:59; author: capps; state: Exp; lines added/del: 0/0 no change ---------------------------- Revision 1.7 date: 98/04/17 08:49:16; author: capps; state: Exp; lines added/del: 15/2 Optimization on async operations. Just add one to the end of the list if the list already has more than one item. ---------------------------- Revision 1.6 date: 98/04/17 00:00:30; author: capps; state: Exp; lines added/del: 10/2 Make cancel keep trying until it succeeds. Otherwise transfers after the buffer is freed can occur. ---------------------------- Revision 1.5 date: 98/04/16 16:49:28; author: capps; state: Exp; lines added/del: 49/4 Improve error handling when running machine out of memory. ---------------------------- Revision 1.4 date: 98/04/16 15:26:41; author: capps; state: Exp; lines added/del: 118/28 added async_read_no_copy(). This allows the application to let the library specify the destination buffer and perform the async I/O without unwanted bcopys. ---------------------------- Revision 1.3 date: 98/04/14 11:56:23; author: capps; state: Exp; lines added/del: 36/10 Add supporf for -k. When using POSIX async I/O use the buffer specified and do not perform any bcopys. ---------------------------- Revision 1.2 date: 98/04/13 10:35:20; author: capps; state: Exp; lines added/del: 5/7 Fixup for error path to propagate any small transfers. ---------------------------- Revision 1.1 date: 98/04/13 10:21:23; author: capps; state: Exp; Initial revision ============================================================================= RCS file: makefile,v; Working file: makefile head: 1.20 locks: ; strict access list: symbolic names: comment leader: "# " total revisions: 20; selected revisions: 20 description: Initial version of makefile ---------------------------- Revision 1.20 date: 98/10/06 10:36:22; author: capps; state: Exp; lines added/del: 87/28 Add comments to describe each targets capabilities. ---------------------------- Revision 1.19 date: 98/10/06 09:59:18; author: capps; state: Exp; lines added/del: 3/3 Fix spelling error ---------------------------- Revision 1.18 date: 98/10/06 09:58:29; author: capps; state: Exp; lines added/del: 18/3 Add support for Windows build ---------------------------- Revision 1.17 date: 98/08/17 16:44:56; author: capps; state: Exp; lines added/del: 2/2 Fixes for Solaris ---------------------------- Revision 1.16 date: 98/07/30 22:05:33; author: capps; state: Exp; lines added/del: 20/1 Add support for Solaris ---------------------------- Revision 1.15 date: 98/05/07 14:17:26; author: capps; state: Exp; lines added/del: 13/13 Make VXFS a define in the make command. This makes moving to other targets easier. It removes the binding of HPUX and VXFS. Also, Added -Q to support offset/latency file generation for later use as inputs to plot program. ---------------------------- Revision 1.14 date: 98/04/22 16:02:42; author: capps; state: Exp; lines added/del: 2/0 Add RCS version ids. ---------------------------- Revision 1.13 date: 98/04/22 13:58:54; author: capps; state: Exp; lines added/del: 6/6 For now only build the SGI targets in 32 bit mode. There is some problem with POSIX async I/O and 64 bit apps. ---------------------------- Revision 1.12 date: 98/04/22 12:08:25; author: capps; state: Exp; lines added/del: 3/3 Let the IRIX64 target default to its default compile mode. ---------------------------- Revision 1.11 date: 98/04/22 09:10:54; author: capps; state: Exp; lines added/del: 3/3 Bug fixes for 64 bit mode on IRIX, and addition on the internal inuse queue to insure that the internal struct_cache_ent structures are not released too early when doing direct I/O (async_read_no_copy). ---------------------------- Revision 1.10 date: 98/04/21 09:29:57; author: capps; state: Exp; lines added/del: 17/17 Improve dependencies ---------------------------- Revision 1.9 date: 98/04/20 16:05:48; author: capps; state: Exp; lines added/del: 58/29 Iozone now 64 bit application ---------------------------- Revision 1.8 date: 98/04/20 10:17:44; author: capps; state: Exp; lines added/del: 0/0 *** empty log message *** ---------------------------- Revision 1.7 date: 98/04/16 16:50:11; author: capps; state: Exp; lines added/del: 6/6 Have the SGI build 32 bit app too. ---------------------------- Revision 1.6 date: 98/04/15 16:48:09; author: capps; state: Exp; lines added/del: 5/5 Fix to make build on 9.05 and 10.1 ---------------------------- Revision 1.5 date: 98/04/13 10:22:34; author: capps; state: Exp; lines added/del: 14/6 Add support for libasync library. ---------------------------- Revision 1.4 date: 98/04/11 11:57:34; author: capps; state: Exp; lines added/del: 10/10 AAdd support for POSIX async I/O testing ---------------------------- Revision 1.3 date: 98/03/31 11:21:34; author: capps; state: Exp; lines added/del: 24/0 Add support for SGI IRIX and SGI IRIX64 ---------------------------- Revision 1.2 date: 98/03/25 13:59:18; author: capps; state: Exp; lines added/del: 21/9 Fixes for SPP-UX ---------------------------- Revision 1.1 date: 98/03/25 10:48:21; author: capps; state: Exp; Initial revision ============================================================================= Added support for BIFF file output. Iozone can now write Excel spreadsheet format. This allows one to directly access the Excel spreadsheet without needing to import with tab and space delimited method. Added support for large files and threads for Solaris. Add support for FreeBSD Change default stride value to avoid nodalization with various spindle counts. ============================================================================= Version 3.3: Changed name of processor_bind to ioz_processor_bind to avoid collision with SVR5.4.MP shared library. Removed leading tab on an #ifdef that caused some compilers to get sick. ============================================================================= Version 3.4: Add support for OpenBSD ============================================================================= Version 3.6: Lots of code cleanup. Added support for OSF1 on the DEC Alpha. ============================================================================= Version 3.7: Add support for OSF Version 4. Add timer resolution problem detection. ============================================================================= Add support for OSF Version 5. ============================================================================= Version 3.13: Add support for Linux to use pthreads. ============================================================================= Version 3.16: ============================================================================= Add support for Netbsd Add support for Largefiles and Async I/O to Linux target ============================================================================= Version 3.17: ============================================================================= Removed small model for Linux. In the past Iozone was forced to use a small model for testing Linux as the normal load caused Redhat to panic. Redhat users have told me that the system now works fine with the normal load. They have tested Redhat 6.1 and it no longer panics. ============================================================================= Version 3.18: ============================================================================= Add support for BSDI. Base, largefiles, pthread. No async I/O ============================================================================= Revision 3.19 ============================================================================= date: 2000/03/08 14:47:21; author: capps; state: Exp; lines added/del: 4/1 Add support for getpagesize. This is used when available. ============================================================================= Revision 3.20 ============================================================================= date: 00/04/01 11:04:59; author: capps; state: Exp; lines added/del: 2/2 Fix for multiple filenames and range of threads being used. ============================================================================= Revision 3.21 ============================================================================= date: 00/04/01 11:10:54; author: capps; state: Exp; lines added/del: 3/1 SPPUX does not have getpagesize... ============================================================================= Revision 3.22 ============================================================================= Add support for Linux-ia64 Add support for mmap & normal file I/O mixing. ============================================================================= Revision 3.23 Fixups for IBM AIX. ============================================================================= Revision 3.24 Fixups for BSD 2.7 (New release of BSD that supports O_SYNC) ============================================================================= Revision 3.27 Fixups for Cygnus compiler changes. (Windows targets). With this change Iozone will compile with at least 2 versions of the Cygnus compilers. ============================================================================= Revision 3.28 ============================================================================= Add support for reading and writing while holding lockf() on the file. This turns out to be important aspect of NFS benchmarking. ============================================================================= Revision 3.29 ============================================================================= Change calls to lockf() to calls to fcntl(). This is more portable. ============================================================================= Revision 3.30 ============================================================================= Add support for variable compute cycle time before each I/O operation. This allows one to more accuratly represent a specific application that is doing compute/read/compute/read style operations. ============================================================================= Revision 3.30 through 3.37 ============================================================================= Add support for read and write telemetry files. ============================================================================= Revision 3.40 ============================================================================= Code cleanup for popen() usage in -M path. ============================================================================= Revision 3.41 ============================================================================= Bug fix for ops/sec in rewrite throughput testing. Added average throughput to output in throughput mode. ============================================================================= Revision 3.42 ============================================================================= Bug fix for read and re-read. Usage of un-initialized variable that caused results to be wrong. ============================================================================= Revision 3.43 ============================================================================= Add support for latency plot data for throughput testing. Each child thread/process gets its own data file. ============================================================================= Revision 3.44 ============================================================================= Enhance compatibility of multi-thread/proc latency offsets with telemetry file support. ============================================================================= Revision 3.45 through 3.48 ============================================================================= Added latency/offset plot data files for all throughput tests. ============================================================================= Revision 3.49 ============================================================================= Fixed compile warning for Linux off64_t redefinition. Add Solaris2.6 target with simple build. ============================================================================= Revision 3.50 ============================================================================= Added support for openbsd-threads Cleanup for page size foo. ============================================================================= Revision 3.51, 3.52, 3.53 ============================================================================= Cleanup for new random write testing in throughput mode. Improve perror handling. ============================================================================= Revision 3.54 ============================================================================= Add -g maxfilesize so people will not have to edit the source to test files bigger than 512 Mbytes. ============================================================================= Revision 3.55 ============================================================================= Supports -n and -g to set the min and max file sizes to be used for an auto mode run. ============================================================================= Revision 3.56 ============================================================================= Added support for SCO Unixware SVR5 with gcc compiler ============================================================================= Revision 3.57 ============================================================================= Fixed bug where file locking was not being used when _LARGE_FILE64_SOURCE was defined in read_perf_test. ============================================================================= Revision 3.58 ============================================================================= Added -z option. This is to be used with the -a option. It provides more complete testing for small record sizes when the file sizes are very large. Fixed -a so that the cross-over mechanism works correctly. ============================================================================= Revision 3.59 ============================================================================= Fix a bug where the user specified -R -s but did not specify -a or -r. This caused the Excel report to print a bunch of zeros. ============================================================================= Revision 3.60 ============================================================================= Fix headers in the Excel output when cross over kicks in. ============================================================================= Revision 3.61 ============================================================================= Added -y and -q to set record size range Added command line to output ============================================================================= Revision 3.62 ============================================================================= Put auto cross over back to 16 Meg ============================================================================= Revision 3.63 ============================================================================= Minor code cleanups for error messages ============================================================================= Revision 3.64 ============================================================================= Re-organize the help listing. ============================================================================= Revision 3.65 ============================================================================= Add labels to the latency/offset output files. ============================================================================= Revision 3.66 ============================================================================= Added Randy Dunlap to the list of contributors. Thanks Randy !! ============================================================================= Revision 3.67 ============================================================================= Fix labels when using -R and -i options together. ============================================================================= Revision 3.68 ============================================================================= Code cleanup. No functionality changes. ============================================================================= Revision 3.69 ============================================================================= Prevent mixed modes. Auto and throughput. Added support for the Plus extended options. ============================================================================= Revision 3.70 ============================================================================= Added support for -+u option. Cpu utilization. ============================================================================= Revision 3.71 ============================================================================= Added comment for the support for -+u option. Cpu utilization. ============================================================================= Revision 3.72 ============================================================================= Added network testing mode. -+m (Experimental) Tested: Linux, HP-UX ============================================================================= Revision 3.73 ============================================================================= Added -xflag support for distributed mode. Handle interrupts when in distributed mode. ============================================================================= Revision 3.74 ============================================================================= Add default for REMOTE_SHELL ============================================================================= Revision 3.75 ============================================================================= Code cleanup. ============================================================================= Revision 3.76 ============================================================================= Portability change for shmat(). Added and example of client_list file to the distribution. ============================================================================= Revision 3.77 ============================================================================= Disable CPU utilization in distributed mode. Bug fix for CPU utilization in normal mode. ============================================================================= Revision 3.78 ============================================================================= Fix compatibility with AIX for shmat() ============================================================================= Revision 3.79 ============================================================================= Fix throughput labels when user is selecting specific tests with -i option. ============================================================================= Revision 3.80 ============================================================================= Remove dependency on min() and max(). They are not portable. ============================================================================= Revision 3.81 ============================================================================= Changes for 64bit architectures. Brad Smith. OpenBSD. ============================================================================= Revision 3.83 ============================================================================= Add -+m cluster option to the help list and the list of options. ============================================================================= Revision 3.84 -> 3.88 ============================================================================= Fix file descriptor leak in cluster mode. ============================================================================= Revision 3.89 -> 3.91 ============================================================================= Support for heterogeneous clusters, bug fix for -C ============================================================================= Revision 3.92 ============================================================================= Add a small sleep in the client so the master's terminate message can arrive before the client exits and closes the channel. ============================================================================= Revision 3.93 ============================================================================= Add support for UWIN (Unix for Windows) ============================================================================= Revision 3.94 ============================================================================= Bug fix for client's working dir in cluster mode. ============================================================================= Revision 3.95 ============================================================================= Enable more options in Cluster mode. ============================================================================= Revision 3.96 ============================================================================= Add support for Solaris 8 in 64-bit mode. ============================================================================= Revision 3.97 ============================================================================= Linux demands a function proto for functions that take floats as args. ============================================================================= Revision 3.98 ============================================================================= Changes for Solaris to make their silly compiler eat reasonable function prototypes. (yech !!) ============================================================================= Revision 3.99 ============================================================================= Add protocol version checking for distributed messages. Add support for AIX 5.2 ============================================================================= Revision 3.100 ============================================================================= Fixes for socket ports. Needed to be in network format. ============================================================================= Revision 3.101 ============================================================================= Add support for RSH environment override. ============================================================================= Revision 3.102 ============================================================================= Improve O_DIRECT and VX_DIRECT so that testing is done on the correct file on the correct client. ============================================================================= Revision 3.103 ============================================================================= Code cleanup. ============================================================================= Revision 3.104 ============================================================================= Code cleanup. Bug fix for O_DIRECT in read_perf_test. ============================================================================= Revision 3.105 ============================================================================= Bug fix for TRU64 and OSF where reclen was not getting displayed. ============================================================================= Revision 3.106 ============================================================================= Add -+d file I/O diagnostic mode. ============================================================================= Revision 3.107 ============================================================================= Fixes for the awesome Diagnostics mode. ============================================================================= Revision 3.108 ============================================================================= turn off cdebug Switch child comm to SOCK_STREAM. Avoid UDP fragment problems. ============================================================================= Revision 3.109 ============================================================================= Fix for "disrupt" and Direct I/O. Needs to be page size and aligned. ============================================================================= Revision 3.110 ============================================================================= Cleanup for -Wall to all source files. ============================================================================= Revision 3.111 ============================================================================= Fixes for UWIN compile warnings. ============================================================================= Revision 3.112 ============================================================================= Fixes for Windows compile warnings. do_compute() proto. ============================================================================= Revision 3.113 ============================================================================= Add definition char *dumb for Solaris to alloc_mem() ============================================================================= Revision 3.114 ============================================================================= Code cleanup for AIX. No async support caused warnings. ============================================================================= Revision 3.115 ============================================================================= Fix for Solaris returning short reads() from socket to child_listen. ============================================================================= Revision 3.116 ============================================================================= Add support for Mac OS X ============================================================================= Revision 3.117 ============================================================================= Add code to set the socket buffer window size. Solaris needs this. ============================================================================= Revision 3.118 ============================================================================= Add O_Direct for AIX ============================================================================= Revision 3.119-> 3.120 ============================================================================= Fix some compiler warnings and implement the -+x option for setting the multiplier used for file and record size incrementing. ============================================================================= Revision 3.121 ============================================================================= Add changes from Debian. Add powerpc and sparc. Add changes to fix warning on Irix and Irix64 ============================================================================= Revision 3.122 ============================================================================= Bug fix for cluster mode. Need to bzero buffers before sprintf or sscanf ============================================================================= Revision 3.123 ============================================================================= Bug fix for handling all chars that are transported over messaging. ============================================================================= Revision 3.124 ============================================================================= Simplify the child's debug output mechanism. ============================================================================= Revision 3.125 ============================================================================= Fix for stonewall in cluster mode. ============================================================================= Revision 3.126 ============================================================================= Shrink the client_neutral_command structure so it fits in a single UDP packet. ============================================================================= Revision 3.127 ============================================================================= Improve debug code for cluster mode. ============================================================================= Revision 3.128 ============================================================================= Reduce the message traffic due to master's distribution of STOP. Only one STOP distribution is needed. More can lead to socket buffer overflows. ============================================================================= Revision 3.129 ============================================================================= Bzero structures on the stack before using. No problem seen but it is a possible hole. ============================================================================= Revision 3.130 ============================================================================= Add error checking for the client file contents. ============================================================================= Revision 3.131 ============================================================================= Use prealloc() for HP-UX to create file for use with mmap. ============================================================================= Revision 3.132 ============================================================================= Add random mix mode. ============================================================================= Revision 3.133 ============================================================================= Make a better 32 bit random offset from calling rand()<<16||rand() ============================================================================= Revision 3.134 ============================================================================= Add -+p percentage read option. ============================================================================= Revision 3.135 ============================================================================= Improve the mixed mode distribution algorithm. ============================================================================= Revision 3.136 ============================================================================= Fix auto bug introduced by mixed mode testing. Introduce -+r for O_RSYNC. ============================================================================= Revision 3.137 ============================================================================= Code cleanup for some warnings on IA-64 systems. ============================================================================= Revision 3.138 ============================================================================= Fixes for FreeBSD ============================================================================= Revision 3.139 ============================================================================= Add support for multiple -r and -s options. ============================================================================= Revision 3.140 ============================================================================= Code cleanup for non-ansi builds Add target build to output. ============================================================================= Revision 3.141 ============================================================================= Add speed check code. ============================================================================= Revision 3.142 ============================================================================= Increase maximum threads/procs to 256 ============================================================================= Revision 3.143 ============================================================================= Add contribs and -+t to help splash screen. ============================================================================= Revision 3.144 ============================================================================= Bug fix for Redhat. ============================================================================= Revision 3.145 ============================================================================= Bug fix for when user used -l but failed to use -u too. ============================================================================= Revision 3.146 ============================================================================= Add void to speed_main() for non-ansi compiles. ============================================================================= Revision 3.147 ============================================================================= Add "Test running" So users will know the test is running and not to hit control 'c' too soon. Bug fix in libbif.c do_float() ============================================================================= Revision 3.148 ============================================================================= Turn off some child debug code. ============================================================================= Revision 3.149 ============================================================================= Disable fread and fwrite testing if mmap or async is in use. ============================================================================= Revision 3.150 ============================================================================= Add pread/pwrite to Linux ============================================================================= Revision 3.151 ============================================================================= Handle -EB ============================================================================= Revision 3.152 ============================================================================= Add pread/pwrite throughput testing ============================================================================= Revision 3.153 ============================================================================= Changed second parameter to mmap() to be size_t. AIX needs this. ============================================================================= Revision 3.154 ============================================================================= Add support for madvise(). ============================================================================= Revision 3.155 ============================================================================= Code cleanup. ============================================================================= Revision 3.156 ============================================================================= Fixes for -w -t -R from Veritas ============================================================================= Revision 3.157 ============================================================================= Make madvise() go away for windows. ============================================================================= Revision 3.158 ============================================================================= Permit smaller values for -n and -g ============================================================================= Revision 3.159 ============================================================================= Make initial write in initfile() a page size request. ============================================================================= Revision 3.160 ============================================================================= Stop test if file can not be written. ============================================================================= Revision 3.161 ============================================================================= Special handling for mmap of a file that is opened (O_DIRECT) ============================================================================= Revision 3.162 ============================================================================= Fixup for systems that do not have O_DIRECT. ============================================================================= Revision 3.163 ============================================================================= Simplify the prototype for do_compute() ============================================================================= Revision 3.164 ============================================================================= Zero compute_val inside of loops. ============================================================================= Revision 3.165 ============================================================================= Add support for O_DIRECT for IRIX and IRIX64 ============================================================================= Revision 3.166 ============================================================================= Improve macros and add prototypes. ============================================================================= Revision 3.167 ============================================================================= Improve resolution of get_resolution(). ============================================================================= Revision 3.168 ============================================================================= Changes to support RedHat 9.0. ============================================================================= Revision 3.169 ============================================================================= Special handling of NAME for broken frontend in Cygwin/Windows env. ============================================================================= Revision 3.170 ============================================================================= Add support for the CrayX1 ============================================================================= Revision 3.171 ============================================================================= Remove reference to PAGE_SIZE for linux. This causes problems with SuSe 8. ============================================================================= Revision 3.172 ============================================================================= Fixup for SCO build. ============================================================================= Revision 3.173 ============================================================================= Add -DHAVE_PREAD for Solaris8-64 target. ============================================================================= Revision 3.174 ============================================================================= Code cleanup for Linux ============================================================================= Revision 3.177 ============================================================================= Improve -+d so that each byte is more unique. Improve byte level validation. ============================================================================= Revision 3.178 ============================================================================= Provide byte level error detection with Found char and Expecting Char in -+d mode. ============================================================================= Revision 3.179 ============================================================================= Improve speed of -+d without losing uniqueness of bytes. ============================================================================= Revision 3.180 ============================================================================= Fix so that Windows can use multiple processes. Needed mmap like SCO. ============================================================================= Revision 3.181 ============================================================================= Use malloc() instead of mmap() for threads memory, instead of mmap. ============================================================================= Revision 3.182 ============================================================================= Make CPU utilization use doubles everywhere. ============================================================================= Revision 3.183 ============================================================================= Add support for CPU utilization while in distributed mode. ============================================================================= Revision 3.184 ============================================================================= Make all times relative so multi node can do CPU usage. ============================================================================= Revision 3.185 ============================================================================= Remove unused variables. ============================================================================= Revision 3.186 ============================================================================= Add -+n option to disable re-testing. ============================================================================= Revision 3.187 ============================================================================= Fixup -+n for throughput mode. ============================================================================= Revision 3.188 ============================================================================= Fix Excel output when -+n is used. ============================================================================= Revision 3.189 ============================================================================= Add support for the IBM S390 running Linux. ============================================================================= Revision 3.190 ============================================================================= Cleanup naming conventions for the S390 and fixup a #define. ============================================================================= Revision 3.191 ============================================================================= Add 64 bit compiles for s390x Move BIG_ENDIAN to ZBIG_ENDIAN to avoid header conflicts. ============================================================================= Revision 3.192 ============================================================================= Make random offsets always based on 48 bit random values. ============================================================================= Revision 3.193 ============================================================================= Addition for make random offsets always based on 48 bit random values. ============================================================================= Revision 3.194 ============================================================================= Make rands long longs. ============================================================================= Revision 3.195 ============================================================================= Bug fix for 48 bit rands in bsd4_2 and Windows. ============================================================================= Revision 3.196 ============================================================================= Make big_rand a long long. ============================================================================= Revision 3.197 ============================================================================= Inject Erik's changes for Multi-client Windows. ============================================================================= Revision 3.198 ============================================================================= Change proto version due to changes in Windows -+m support. Add Eric to the contributors list. ============================================================================= Revision 3.199 ============================================================================= Add more Windows support. ============================================================================= Revision 3.200 ============================================================================= Spelling error. ============================================================================= Revision 3.201 ============================================================================= Bug fixes from Erik H. ============================================================================= Revision 3.202 ============================================================================= Reduce usage of shared memory. ============================================================================= Revision 3.203 ============================================================================= Eliminate STUPID warning from the silly compiler. ============================================================================= Revision 3.204 ============================================================================= Changes to remove warnings on BSD. Thanks to Christian Weisgerber ============================================================================= Revision 3.205 ============================================================================= Support for the AMD64 ============================================================================= Revision 3.206 ============================================================================= Add -+k for constant aggregate data set size in throughput mode. ============================================================================= Revision 3.207 ============================================================================= Add pread support for the TRU64 target. Department of Defense in Canada. Add -+q for delay in seconds between tests. ============================================================================= Revision 3.208 ============================================================================= Move variable up, GCC on Solaris was getting a bogus parse error ============================================================================= Revision 3.209 ============================================================================= Add support for -+D (O_DSYNC) mode testing. ============================================================================= Revision 3.210 ============================================================================= Make O_DSYNC conditional. ============================================================================= Revision 3.211 ============================================================================= Add telemetry support for pread/pwrite ============================================================================= Revision 3.212 ============================================================================= Add record locking Add single file, file sharing. ============================================================================= Revision 3.213 ============================================================================= Enhance fill/verify (diag mode) for shared file. ============================================================================= Revision 3.214 ============================================================================= Remove warnings. ============================================================================= Revision 3.215 ============================================================================= Add prototype for mylockr() ============================================================================= Revision 3.216 ============================================================================= Fix prototype for mylockr ============================================================================= Revision 3.217 ============================================================================= Enable options for Windows systems. ============================================================================= Revision 3.218 ============================================================================= Add label to Excel spreadsheet that describes the rows and columns. Add support for Solaris64 with VxFS. Add support for Linux-arm ============================================================================= Revision 3.219 ============================================================================= Add sleep to permit child to get connection up before master does connect. ============================================================================= Revision 3.220 ============================================================================= Improve master connect to child, without delays. ============================================================================= Revision 3.221 ============================================================================= Add -+B Mixed sequential testing. BlueArc request. ============================================================================= Revision 3.222 ============================================================================= Workaround for bug in Cygwin's sscanf ============================================================================= Revision 3.223 ============================================================================= Add transfer size to the output from -Q ============================================================================= Revision 3.224 ============================================================================= Work around for TCP_WAIT in Windows. ============================================================================= Revision 3.225 ============================================================================= Fix for broken rsh on Windows. ============================================================================= Revision 3.226 ============================================================================= Workaround for gcc 3.4. From the folks at Gentoo.org. ============================================================================= Revision 3.227 ============================================================================= Enable -+m and telemetry files. ============================================================================= Revision 3.228 ============================================================================= Make more unique file names for mmap files. ============================================================================= Revision 3.229 ============================================================================= Add -+T time stamps. ============================================================================= Revision 3.230 ============================================================================= Bug fix for -m and validation code. ============================================================================= Revision 3.231 ============================================================================= Add a space to the throughput output dump. ============================================================================= Revision 3.232 ============================================================================= Add another space to the throughput output dump. ============================================================================= Revision 3.233 ============================================================================= Enable shared file with no locking ============================================================================= Revision 3.234 ============================================================================= Add sanity check to validate that open(name, O_CREAT | O_WRONLY | O_TRUNC, 0) does work correctly. This is an NFS client test that detects if the NFS server's local filesystem is broken and fails to support the sequence above correctly. ============================================================================= Revision 3.235 ============================================================================= add a close(fd) to the sanity test. ============================================================================= Revision 3.237 ============================================================================= Transport the -o flag to remote clients. ============================================================================= Revision 3.238 ============================================================================= Fix hang when using HP-UX master, Linux client, ssh buildup. ============================================================================= Revision 3.239 ============================================================================= Add -+h hostname. Permits one to manually set the hostname. For systems with multiple names/NICs. ============================================================================= Revision 3.241 ============================================================================= Add -+h, set hostname, and fix Solaris hang. ============================================================================= Revision 3.242 ============================================================================= Remove the side effect of no-rereads when using -w. Now use -+n for consistancy. ============================================================================= Revision 3.243 ============================================================================= Bug fix for -+k option. ============================================================================= Revision 3.246 ============================================================================= Add the -+U for WIN32 API calls .. Unbuffered I/O. Sony studios. ============================================================================= Revision 3.247 ============================================================================= Add support for -+U with -K (WIN32API calls + Jitter) ============================================================================= Revision 3.248 ============================================================================= Bug fix. -J with -+m not passing compute delay correctly. ============================================================================= Revision 3.249 ============================================================================= Add support for -i 8 when used with -+B (sequential mix) ============================================================================= Revision 3.250 ============================================================================= Change the default pattern. Samba is trying to cheat by special casing IOZONE.tmp, and the pattern of 0xA5. ============================================================================= Revision 3.251 ============================================================================= Make the default pattern random, and based on Iozone version. This is to prevent the hack from Richard Sharpe (in Samba) from special casing Iozone, and lying to the user. ============================================================================= Revision 3.252 ============================================================================= bug fix in pattern gen. ============================================================================= Revision 3.253 ============================================================================= Add -+Z old data set mode. Add -+X constant data for short circuit testing only. ============================================================================= Revision 3.254 ============================================================================= Multi-node changes for new options. (-+Z and -+X) ============================================================================= Revision 3.255 ============================================================================= Add -+K flag for Sony. ============================================================================= Revision 3.256 ============================================================================= Move -+K outside of Windows only. ============================================================================= Revision 3.257 ============================================================================= Simplify percentage calculation ============================================================================= Revision 3.258 ============================================================================= Add error checking for -f and -F in the wrong modes. ============================================================================= Revision 3.259 ============================================================================= Bug fix for pbuffer allocation on remote clients. ============================================================================= Revision 3.260 ============================================================================= Check for max_rec_size when using ranges. -r -r -r ============================================================================= Revision 3.261 ============================================================================= Fix for Debian user bug. -r 1m -n 1m -g 2m gave bogus error. ============================================================================= Revision 3.262 ============================================================================= Bug fix for -k used in conjunction with -t and content validation. ============================================================================= Revision 3.263 ============================================================================= Bug fix for -k used in conjunction with -t and content validation. ============================================================================= Revision 3.264 ============================================================================= Add DragonFly target. ============================================================================= Revision 3.265 ============================================================================= Put PER_VECTOR_OFFSET in for HP-UX ============================================================================= Revision 3.266 ============================================================================= Fix compiler warning messages ============================================================================= Revision 3.267 ============================================================================= Enforce minimum file size of page_size ============================================================================= Revision 3.268 ============================================================================= Minor fixes. ============================================================================= Revision 3.269 ============================================================================= Check fsync and close for errors. ============================================================================= Revision 3.270 ============================================================================= Adding support for testing block devices. Will be done is phases. This is phase 1. (Single threaded mode only) ============================================================================= Revision 3.271 ============================================================================= Adding 4 token support to client_list. Each entry may now contain 4 tokens and the new one is the absolute path to the temp file for testing. ============================================================================= Revision 3.272 Editorial change. ============================================================================= Revision 3.273 Add support for external monitor start & stop for throughput tests. IMON_START and IMON_STOP environmental variables used. ============================================================================= Revision 3.274 ============================================================================= minor change. ============================================================================= Revision 3.275 Bug fix for systems without O_DIRECT. Fall through in switch statement. ============================================================================= Revision 3.276 Fix for -c -t over NFS and initial writer close() when told by another to stop ============================================================================= Revision 3.277 Add Benny Halevy to contributors list. ============================================================================= Revision 3.278 Fix for Cygwin environment. ============================================================================= Revision 3.279 Code cleanup, and add arg to external trigger. ============================================================================= Revision 3.280 Code fixes for macosx ============================================================================= ============================================================================= Revision 3.281 Add support for building with Sun's Studio 11 compiler ============================================================================= Revision 3.283 Bug fix for fread/fwrite with > 2Gig files. ============================================================================= Revision 3.287 Add O_DIRECT for Windows ============================================================================= Revision 3.288 Add -+w dedup testing mode. ============================================================================= Revision 3.289 Make remaining non-dedup data unique. ============================================================================= Revision 3.290 Make non-dedupable more unique. ============================================================================= Revision 3.291 Bug fix for non-dedup. ============================================================================= Revision 3.292 Make random offsets unique, using Knuth shuffle. ============================================================================= Revision 3.292 free memory used for random offset uniqueness. ============================================================================= Revision 3.294 Make unique/random offsets 64bits. ============================================================================= Revision 3.295 Add fallback for random/unique. ============================================================================= Revision 3.296 Make non-dedup region more unique ============================================================================= Revision 3.297 Add -+y ## to set percentage of interior dedup. ============================================================================= Revision 3.298 Add -+y ## to set percentage of interior dedup. ============================================================================= Revision 3.299 Bug fixes for -+w and -+y ============================================================================= Revision 3.300 Minor fix for dedup ============================================================================= Revision 3.302 Adding -+C to set percent of dedupable within a file. ============================================================================= Revision 3.303 bug fix ============================================================================= Revision 3.304 Add solaris to read sync O_RSYNC ============================================================================= Revision 3.305 Add space to avoid field output touching each other. ============================================================================= Revision 3.306 Add check for config file exceeding MAXSTREAMS. ============================================================================= Revision 3.307 Add new contributor's name. ============================================================================= Revision 3.308 Fix type-oh ============================================================================= Revision 3.309 Bug fix. rewrite_rec needed to fill entire buffer, or later stride read will fail. ============================================================================= Revision 3.310 ============================================================================= Add ability for remote clients to return errors to the master and have the master display on output. ============================================================================= Revision 3.311 ============================================================================= fix double reporting of client errors ============================================================================= Revision 3.312 ============================================================================= Eliminate extra file descriptor in fwrite test. ============================================================================= Revision 3.312 ============================================================================= bug fix for barray allocation in -T mode ============================================================================= Revision 3.313 Revision 3.314 Revision 3.315 ============================================================================= Changes from Debian: Retry umount, add fileop for linux-sparc, and fix column width in fileop for faster boxes. ============================================================================= Revision 3.316 Add O_DIRECT support to FreeBSD ============================================================================= Revision 3.317 Fix for defines in FreeBSD ============================================================================= Revision 3.318 Add IMON_SYNC to enable monitor scripts to be run sync. ============================================================================= Revision 3.319 Add directio() for Solaris ============================================================================= Revision 3.320 Add fixes for unresolved references in directio() for Solaris ============================================================================= Revision 3.321 Fix type oh. ============================================================================= Revision 3.322 Fix c++ style comment back to 'C' style comment. ============================================================================= Revision 3.323 Bug fix for check_filenames and large files ============================================================================= Revision 3.324 Replace tripple rand() calls with 64 bit Mersene twister. ============================================================================= Revision 3.325 Add read-only, external file, with no-verify. -+E ============================================================================= Revision 3.325 Permit -+E on dedup files. ============================================================================= Revision 3.327 Permit -+E on random read only testing, on existing file. ============================================================================= Revision 3.328 Add passing master listener's port to remote children if it is not HOST_LIST_PORT ============================================================================= Revision 3.329 Adding Dave Boone's notruncate option -+N ============================================================================= Revision 3.330 Bug fix for Dave's code. ============================================================================= Revision 3.331 Add multi -t ops. Fabrice ============================================================================= Revision 3.332 Added Li Qin's multi dedup set support. -+S # ============================================================================= Revision 3.333 Bug fix for -+S dedup_mseed needs to be an integer ============================================================================= Revision 3.334 Make -+S generate more uniqueness ============================================================================= Revision 3.335 Make -+S generate more uniqueness ============================================================================= Revision 3.336 Make -+S generate more uniqueness ============================================================================= Revision 3.337 Bug fix for -+S ============================================================================= Revision 3.338 Make umount/remount more robust, in the face of server errors. ============================================================================= Revision 3.339 Improve the help string for the -+S option. ============================================================================= Revision 3.340 Add new contributor name. ============================================================================= Revision 3.342 Add support for the programmable interdimensional timer. ============================================================================= Revision 3.343 Bug fix for PIT on remote clients. ============================================================================= Revision 3.344 Bug fix for PIT on remote clients. ============================================================================= Revision 3.345 Have children re-acquire get_resolution. ============================================================================= Revision 3.346 Bug fix for t_range addition. ============================================================================= Revision 3.347 Get rid of a warning. ( An invalid warning, but none the less ) ============================================================================= Revision 3.348 Add more words to the usage warnings and license ============================================================================= Revision 3.349 Remove Ascii dependency for IBM's Z/OS that speaks EBCDIC. ============================================================================= Revision 3.353 Add support for SUA ============================================================================= Revision 3.354 Remove Sanity check so that SMB on Windows, under SUA, works ============================================================================= Revision 3.355 Cache the getaddrinfo call. ============================================================================= Revision 3.356 delete optimization.. bad...Cache the getaddrinfo call. ============================================================================= Revision 3.358 Change pit to use unsigned long longs ============================================================================= Revision 3.359 Add Linux processor affinity ============================================================================= Revision 3.360 Remove UDP usage ============================================================================= Revision 3.361 Increment protocol_version to catch incompat versions. ============================================================================= Revision 3.362 Fixup for new include needed by Solaris10 ============================================================================= Revision 3.363 Patch for Mac errno ============================================================================= Revision 3.364 Patch for Mac printf's ============================================================================= Revision 3.365 Fix Josh's introduction of new Linux warnings. ============================================================================= Revision 3.366 Take sleep(1) out put path, deal with it in error/retry path ============================================================================= Revision 3.367 Add -+z latency histogram logging. ============================================================================= Revision 3.368 Format change for the -+z latency histogram logging. ============================================================================= Revision 3.369 Added -+O Op_rate control. ============================================================================= Revision 3.370 Close race condition with master closing socket to child async reader ============================================================================= Revision 3.371 Add "mygen" generation to the remote children protocol. This prevents zombies from coming back to life and killing future masters. ============================================================================= Revision 3.372 Set Listen(s,100) to Listen(s,MAXSTREAMS) ============================================================================= Revision 3.373 Move lable "again" to outside of cdebug. ============================================================================= Revision 3.374 More fixes for busted crap in Solaris !!! ============================================================================= Revision 3.376 AIX update. They now have errno.h ============================================================================= Revision 3.377 Need errno.h for FreeBSD ============================================================================= Revision 3.379 Need to include errno.h for Cygwin ============================================================================= Revision 3.381 Add SO_LINGER for master_listen and child_listen, so that wind-blows will work like all other systems on the planet. ============================================================================= Revision 3.382 Fix for linger addition ============================================================================= Revision 3.383 Fix for linger addition ============================================================================= Revision 3.384 Fix for linger addition ============================================================================= Revision 3.385 Make linger for all ============================================================================= Revision 3.387 Change sleep() calls, that help connect() to nanosleep() calls. ============================================================================= Revision 3.388 Fixup remainder for nanosleep() ============================================================================= Revision 3.389 Fixup remainder for nanosleep() ============================================================================= Revision 3.390 Add code for pread/pwrite from Ben England (Redhat) ============================================================================= Revision 3.391 Add code for MDEBUG and CDEBUG from Bob England (Redhat) ============================================================================= Revision 3.392 Add code for building HPUX. Errno.h ============================================================================= Revision 3.393 Fixes for Windows (nanosleep doesn't always work ) ============================================================================= Revision 3.394 Fixes for preadv and pwritev from RedHat (Ben Englanc) ============================================================================= Revision 3.395 Add warnings for default switch cases, and exit with value for unknowns. ============================================================================= Revision 3.396 Fix warnings from RedHat patches ============================================================================= Revision 3.397 Bug fix for getopt default case, with bad parameter handed in. ============================================================================= Revision 3.398 Adding thread_read_test and thread_write_test. ============================================================================= Revision 3.401 bug fix for re-write rec. ============================================================================= Revision 3.402 Mods for DragonFly support. ============================================================================= Revision 3.403 Add -+W to permit chid_skew. This permits adding files, and continuing the proper sharing/dedup within each quadrant, within same seed group and with previously existing files that were created with a different number of threads. ============================================================================= Revision 3.404 Fix type-oh in usage message. ============================================================================= Revision 3.405 Reduce CPU consumption in the op_rate control mechanism. ============================================================================= Revision 3.406 Increase buffer size for configuration lines. They might be 700 chars long. ============================================================================= Revision 3.407 Work around for cache_line_size suddenly becoming zero and breaking fetchit() ============================================================================= Revision 3.408 Bug fix for clobbering of buffer. "tfile" needed to be bigger, as its address was loaded into filearray[] and then that was overwritten by the mfflag causing parsed names to get loaded. ============================================================================= Revision 3.409 ============================================================================= Bug fix for using -m in combination with -+d ============================================================================= Revision 3.410 ============================================================================= Bug fix: Improve consistency of use_thread in thread_fread and thread_fwrite. ============================================================================= Revision 3.411 ============================================================================= Compat fix: Move from using macosx to IOZ_macosx, because APPLE started using macosx in Mountain Lion. ============================================================================= Revision 3.412 ============================================================================= Adding -+F flag for trunc before thread_write. Needed by Vangel for thread_mix_test. ============================================================================= Revision 3.413 ============================================================================= Bug fix for -+F flag. ============================================================================= Revision 3.414 ============================================================================= Add Vangel to the contributors list ============================================================================= Revision 3.415 ============================================================================= Minor bug fix for -J option (think time) in the thread_pread_test() ============================================================================= Revision 3.417 ============================================================================= Add -+J option. Include think time (-j #) in throughput calculation ============================================================================= Revision 3.419 ============================================================================= Add better handling of exit values. ============================================================================= Revision 3.420 ============================================================================= Add new contributor to list. ============================================================================= Revision 3.421 ============================================================================= Bug fix from Alp Aker: Patch for a minor issue in IOzone's signal_handler() function: the no_unlink option is respected only for the first member of the dummyfile[] array; the rest of the dummy files are unconditionally deleted, whether or not the '+w' flag has been passed to the program. ============================================================================= Revision 3.422 ============================================================================= Code cleanup. No functional changes. ============================================================================= Revision 3.423 ============================================================================= Improve consistency of Kbytes instead of kbytes, KBytes, kBytes... ============================================================================= Revision 3.424 ============================================================================= Fix for 64 bit and touch_dedup. ============================================================================= Revision 3.425 ============================================================================= Fix for 64 bit and gen_new_buf ============================================================================= Revision 3.427 Adjust formatting so fields don't run together. ============================================================================= Revision 3.428 Adjust formatting so fields don't run together. ============================================================================= Revision 3.429 Add two more characters to array my_port_num. ============================================================================= ============================================================================= Revision 3.430 Adding -+b option for bursty operations. Donated by: Avi Shchislowski ============================================================================= Revision 3.432 Adding NetBSD 64 bit. ============================================================================= Revision 3.434 Adding code from Alexey Skidanov. Pthread burst I/O. ============================================================================= Revision 3.434 Convert calls from atoi() into atoll() for those things that are actually long longs. ============================================================================= Revision 3.436 Code cleanup for casting consistency ============================================================================= Revision 3.442 Code cleanup for casting consistency and *&(^&*( compiler warnings !!! ============================================================================= Revision 3.443 Code cleanup for all of the un-needed void * maddness. ============================================================================= Revision 3.444 Cleanup 64 bit compiles. ============================================================================= Revision 3.445 Some BSD changes to avoid compiler complaints. ============================================================================= Revision 3.446 Some BSD changes to avoid compiler complaints. ============================================================================= Revision 3.447 Make sure we don't have missing prototypes. ============================================================================= Revision 3.448 Add support for building targets with NO_SIGNAL, NO_FORK, NO_SOCKET ============================================================================= Revision 3.449 Add support for building targets with NO_SIGNAL, NO_FORK, NO_SOCKET ============================================================================= Revision 3.450 Fix missing typedef in FreeBSD. ============================================================================= Revision 3.451 Fix typeoh in spelling of DragonFly. ============================================================================= Revision 3.452 Make the sighandler_t change effective for all BSD derivatives. ============================================================================= Revision 3.454 Make the my_sig_t change effective for all BSD derivatives. ============================================================================= Revision 3.455 Unify the usage of __FreeBSD__ ============================================================================= Revision 3.456 Build on BSD 10.3 without warnings. Clang compilers. ============================================================================= Revision 3.457 Build on BSD 10.3 without warnings. Clang compilers. ============================================================================= Revision 3.458 Make more friendly to build on Solaris. ============================================================================= Revision 3.459 Make more friendly to build on Solaris. ============================================================================= Revision 3.460 Make more friendly to build on Solaris. ============================================================================= Revision 3.461 Make more friendly to build on Solaris. ============================================================================= Revision 3.462 Make more friendly to build on Solaris. ============================================================================= Revision 3.463 Make more friendly to build on Solaris. ============================================================================= Revision 3.464 Make more friendly to build on Solaris. ============================================================================= Revision 3.465 Make more friendly to build on Solaris. ============================================================================= Revision 3.466 Fix error messages to use the correct file name from dummyfile[xx] instead of "filename" in the thread tests. ============================================================================= Revision 3.467 Fix compiler warning from Clang on MacOS for mythread_create(). Prototype didn't match the formal function definition. ============================================================================= Revision 3.469 Switch to IOZ_macosx everywhere for compatibility with Mountain Lion. ============================================================================= Revision 3.470 Increase MAXSTREAMS to 1024. Systems have more power today than 20+ years ago. ============================================================================= Revision 3.471 Make -+W -+C -+y use a flag instead of its option value to indiate its usage. ============================================================================= Revision 3.472 Adding -+M (special dedupe layout) Adding -+a (set compression in special layout) Adding -+Q (set dedupe granule size in special layout) ============================================================================= Revision 3.473 no change. ============================================================================= Revision 3.474 Cleanup for Cygwin64 build. ============================================================================= Revision 3.475 Cleanup for Cygwin64 build warnings. ============================================================================= Revision 3.476 Cleanup compiler warnings. ============================================================================= Revision 3.477 Bug fix code in special_gen_new_buf.. ============================================================================= Revision 3.478 Bug fix code in special_gen_new_buf.. More copies of the other bug. ============================================================================= Revision 3.479 Bug fix code in special_gen_new_buf.. needed (*op ==0) in one more line. ============================================================================= Revision 3.480 Add -+R option to specify the file names are in a file. ============================================================================= Revision 3.481 Adding new contributor Sudhir Kumar ============================================================================= Revision 3.482 Fix help menu for -+R option. It does not also use -F Bug fix for case of -H where gcc seems to think the size of long long is != size of off64_t Bug fix for prototype mismatch in async_write_no_copy. ============================================================================= Revision 3.483 Fix nesting of #ifdefs so that Windows lack of support for O_DIRECT presents splash indication. Enable O_DIRECT for Windows builds. ============================================================================= Revision 3.485 Improvements for building under Android ============================================================================= Revision 3.486 Fix compiler warning on Android. ============================================================================= Revision 3.488 Improve the Yates/Knuth method for shuffle. ============================================================================= Revision 3.489 Fix gcc-10 warning about no-common. ============================================================================= Revision 3.490 Fix compiler warning when HAVE_ANSIC is not defined ============================================================================= Revision 3.491 Fix CFLAGS issue from Fedora maintainer. ============================================================================= Revision 3.492 Improve the -+M option's compression pattern so that the achieved compressibility is closer to the value specifed in the -+a option. ============================================================================= Revision 3.493 Move memorey allocaiton of main buffer to after the getopt, else the -S can cause issues later. ============================================================================= Revision 3.494 Add support for sparse files. ============================================================================= Revision 3.495 Bug fix and comment out debug printf noise in libasync.c ============================================================================= Revision 3.496 Turn off debug printf noise in libasync.c ============================================================================= Revision 3.497 Disable verify_buffer for async I/O as the buffer can change locations if the I/Os complete in a different order. Thus causing verify_buffer to get confused. ============================================================================= Revision 3.498 Add more spaces between fields. ============================================================================= Revision 3.499 Fix cases where stride goes beyond EOF, and also missing SC_AIO_MAX ============================================================================= Revision 3.500 More cleanup when out of bounds read. ============================================================================= Revision 3.501 More cleanup when out of bounds read. ============================================================================= Revision 3.502 More cleanup when out of bounds read in strided reads. ============================================================================= Revision 3.503 Some design issues with async I/O that are now fixed. 1. Don't permit infinite outstanding aio_ Ops, as the memory consumption could cause issues. 2. The strided behavior happesns in read_stride_perf, but when it tries to use async, it hands the stride and depth to the async I/O library. Now the libasync.c library is duplicating the strided read-aheads that were also happening in iozone.c in read_stride_perf. 3. Changes were to have the code in Iozone.c do it's normal thing, and issue one aio read or write, and wait for it to complete. If the library does more, that's fine, but duplicating this was not cool. 4. There is still an assumption in libasync that if the depth is non zero that the offsets for the extra ops are going to be forward sequential. This may not be the intended direction, but for now it will be better than none. ============================================================================= Revision 3.504 Avoid terminating when some implementations return goofy values from aio_return() and/or aio_error(). ============================================================================= Revision 3.505 Fix async no copy ============================================================================= Revision 3.506 Fix async without no copy. ============================================================================= Revision 3.507 Fix GCC compile warnings. ============================================================================= Revision 3.508 Put an end to the (&*% stupid GCC breaking builds for no valid reason. ============================================================================= iozone3_508/src/current/iozone.c0000555000000000000000000257630715051766073015515 0ustar rootroot/************************************************************************/ /* Original Author: */ /* William Norcott (wnorcott@us.oracle.com) */ /* 4 Dunlap Drive */ /* Nashua, NH 03060 */ /* */ /************************************************************************/ /* Enhancements by: */ /* Don Capps (capps@iozone.org) */ /* 7417 Crenshaw Dr. */ /* Plano, TX 75025 */ /* */ /************************************************************************/ /* Copyright 1991, 1992, 1994, 1998, 2000, 2001 William D. Norcott */ /************************************************************************/ /* */ /* Iozone is based on the original work done by William Norrcot. It has */ /* been enhanced so that it provides a more complete filesystem */ /* characterization. */ /* Its purpose is to provide automated filesystem characterization. */ /* Enhancements have been made by: */ /* */ /* Don Capps capps@iozone.org */ /* */ /* Iozone can perform single stream and multi stream I/O */ /* also it now performs read, write, re-read, re-write, */ /* read backwards, read/write random, re-read record, */ /* pread, re-pread, re-pwrite, preadv, re-preadv, pwritev, */ /* stride read, and re-pwritev,mmap, POSIX async I/O, NFS */ /* cluster testing and much more. */ /* */ /* The frontend now uses getopt() and the user can control many more */ /* of the actions. */ /* */ /* */ /************************************************************************/ /* THIS SOFTWARE IS PROVIDED BY DON CAPPS AND THE IOZONE CREW "AS IS */ /* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ /* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A */ /* PARTICULAR PURPOSE ARE DISCLAIMED. */ /* */ /* IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY */ /* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL */ /* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */ /* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS */ /* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER */ /* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR */ /* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE. */ /************************************************************************/ /************************************************************************/ /* For the beginner... */ /* */ /* 1. make linux (linux, hpux, convex, hpux_no_ansi) */ /* 2. type ./iozone -Ra */ /* */ /* Hint: Type make (it will give you a list of valid targets) */ /* */ /************************************************************************/ /* The version number */ #define THISVERSION " Version $Revision: 3.508 $" #if defined(Windows) #define NO_THREADS #endif #if defined(linux) #define _GNU_SOURCE #endif /* Include for Cygnus development environment for Windows */ #if defined (Windows) #include #include #else #if defined(linux) || defined(solaris) || defined(IOZ_macosx) || defined(__AIX__) || defined(__FreeBSD__) || defined(_HPUX_SOURCE) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__NetBSD__) #include #else extern int errno; /* imported for errors */ extern int h_errno; /* imported for errors */ #endif #endif #ifdef NO_FORK #define fork no_fork #endif #include #include #if defined (__LP64__) || defined(OSF_64) || defined(__alpha__) || defined(__arch64__) || defined(_LP64) || defined(__s390x__) || defined(__AMD64__) #define MODE "\tCompiled for 64 bit mode." #define _64BIT_ARCH_ #else #define MODE "\tCompiled for 32 bit mode." #endif #ifndef NO_THREADS #include #endif #ifdef ANDROID #include #define pthread_setaffinity_np(pid, size, cpuset) \ syscall(__NR_sched_setaffinity, (pid_t)pid, (size_t)size, (void *)cpuset) #endif #if defined(HAVE_ANSIC_C) && defined(linux) #include #include #endif #ifdef HAVE_PROTO #include "proto.h" #else int atoi(const char *); int close(int); int unlink(const char *); int * main(int, char **); #if !defined(linux) int wait(); #endif int fsync(int); void srand48(long int); long lrand48(void); void create_list(); void init_by_array64(unsigned long long *, unsigned long long ); unsigned long long genrand64_int64(void); #endif #ifdef ASYNC_IO #include struct cache_ent { #if defined(_LARGEFILE64_SOURCE) && defined(__CrayX1__) aiocb64_t myaiocb; /* For use in large file mode */ #elif defined(_LARGEFILE64_SOURCE) && !defined(__LP64__) struct aiocb64 myaiocb; /* For use in large file mode */ #else struct aiocb myaiocb; #endif long long fd; /* File descriptor */ long long size; /* Size of the transfer */ struct cache_ent *forward; /* link to next element on cache list */ struct cache_ent *back; /* link to previous element on the cache list */ long long direct; /* flag to indicate if the buffer should be */ /* de-allocated by library */ char *real_address; /* Real address to free */ volatile void *oldbuf; /* Used for firewall to prevent in flight */ /* accidents */ int oldfd; /* Used for firewall to prevent in flight */ /* accidents */ size_t oldsize; /* Used for firewall to prevent in flight */ /* accidents */ off64_t offset; }; /* * Head of the cache list */ struct cache { struct cache_ent *head; /* Head of cache list */ struct cache_ent *tail; /* tail of cache list */ struct cache_ent *inuse_head; /* head of in-use list */ long long count; /* How many elements on the cache list */ struct cache_ent *w_head; /* Head of cache list */ struct cache_ent *w_tail; /* tail of cache list */ long long w_count; /* How many elements on the write list */ }; #endif #include char *help[] = { " Usage: iozone [-s filesize_kB] [-r record_size_kB] [-f [path]filename] [-h]", " [-i test] [-E] [-p] [-a] [-A] [-z] [-Z] [-m] [-M] [-t children]", " [-l min_number_procs] [-u max_number_procs] [-v] [-R] [-x] [-o]", " [-d microseconds] [-F path1 path2...] [-V pattern] [-j stride]", " [-T] [-C] [-B] [-D] [-G] [-I] [-H depth] [-k depth] [-U mount_point]", " [-S cache_size] [-O] [-L cacheline_size] [-K] [-g maxfilesize_kB]", " [-n minfilesize_kB] [-N] [-Q] [-P start_cpu] [-e] [-c] [-b Excel.xls]", " [-J milliseconds] [-X write_telemetry_filename] [-w] [-W]", " [-Y read_telemetry_filename] [-y minrecsize_kB] [-q maxrecsize_kB]", " [-+u] [-+m cluster_filename] [-+d] [-+x multiplier] [-+p # ]", " [-+r] [-+t] [-+X] [-+Z] [-+w percent dedupable] [-+y percent_interior_dedup]", " [-+C percent_dedup_within] [-+a zero_pct] [-+Q dedup granule size]", " [-+M dedup+compress flag ] [-+e Enable sparse files", " ", " -a Auto mode", " -A Auto2 mode", " -b Filename Create Excel worksheet file", " -B Use mmap() files", " -c Include close in the timing calculations", " -C Show bytes transferred by each child in throughput testing", " -d # Microsecond delay out of barrier", " -D Use msync(MS_ASYNC) on mmap files", " -e Include flush (fsync,fflush) in the timing calculations", " -E Run extension tests", " -f filename to use", " -F filenames for each process/thread in throughput test", " -g # Set maximum file size (in kBytes) for auto mode (or #m or #g)", " -G Use msync(MS_SYNC) on mmap files", " -h help", " -H # Use POSIX async I/O with # async operations", " -i # Test to run (0=write/rewrite, 1=read/re-read, 2=random-read/write", " 3=Read-backwards, 4=Re-write-record, 5=stride-read, 6=fwrite/re-fwrite", " 7=fread/Re-fread, 8=random_mix, 9=pwrite/Re-pwrite, 10=pread/Re-pread", " 11=pwritev/Re-pwritev, 12=preadv/Re-preadv)", " -I Use VxFS VX_DIRECT, O_DIRECT,or O_DIRECTIO for all file operations", " -j # Set stride of file accesses to (# * record size)", " -J # milliseconds of compute cycle before each I/O operation", " -k # Use POSIX async I/O (no bcopy) with # async operations", " -K Create jitter in the access pattern for readers", " -l # Lower limit on number of processes to run", " -L # Set processor cache line size to value (in bytes)", " -m Use multiple buffers", " -M Report uname -a output", " -n # Set minimum file size (in kBytes) for auto mode (or #m or #g)", " -N Report results in microseconds per operation", " -o Writes are synch (O_SYNC)", " -O Give results in ops/sec.", " -p Purge on", " -P # Bind processes/threads to processors, starting with this cpu", " -q # Set maximum record size (in kBytes) for auto mode (or #m or #g)", " -Q Create offset/latency files", " -r # record size in Kb", " or -r #k .. size in kB", " or -r #m .. size in MB", " or -r #g .. size in GB", " -R Generate Excel report", " -s # file size in Kb", " or -s #k .. size in kB", " or -s #m .. size in MB", " or -s #g .. size in GB", " -S # Set processor cache size to value (in kBytes)", " -t # Number of threads or processes to use in throughput test", " -T Use POSIX pthreads for throughput tests", " -u # Upper limit on number of processes to run", " -U Mount point to remount between tests", " -v version information", " -V # Verify data pattern write/read", " -w Do not unlink temporary file", " -W Lock file when reading or writing", " -x Turn off stone-walling", " -X filename Write telemetry file. Contains lines with (offset reclen compute_time) in ascii", " -y # Set minimum record size (in kBytes) for auto mode (or #m or #g)", " -Y filename Read telemetry file. Contains lines with (offset reclen compute_time) in ascii", " -z Used in conjunction with -a to test all possible record sizes", " -Z Enable mixing of mmap I/O and file I/O", " -+b #,# burst size (KB),sleep between burst (mili-second)", " -+E Use existing non-Iozone file for read-only testing", " -+F Truncate file before write in thread_mix_test", " -+J Include think time (-j #) in throughput calculation", " -+K Sony special. Manual control of test 8.", " -+m Cluster_filename Enable Cluster testing", " -+d File I/O diagnostic mode. (To troubleshoot a broken file I/O subsystem)", " -+u Enable CPU utilization output (Experimental)", " -+x # Multiplier to use for incrementing file and record sizes", " -+p # Percentage of mix to be reads", " -+r Enable O_RSYNC|O_SYNC for all testing.", " -+t Enable network performance test. Requires -+m ", " -+n No retests selected.", " -+k Use constant aggregate data set size.", " -+q Delay in seconds between tests.", " -+l Enable record locking mode.", " -+L Enable record locking mode, with shared file.", " -+B Sequential mixed workload.", #if defined(O_DSYNC) " -+D Enable O_DSYNC mode.", #endif #ifndef NO_MADVISE " -+A # Enable madvise. 0 = normal, 1=random, 2=sequential", " 3=dontneed, 4=willneed", #endif " -+N Do not truncate existing files on sequential writes.", " -+S # Dedup-able data is limited to sharing within each numerically", " identified file set.", " -+W # Add this value to the child thread ID, so that additional files", " can be added while maintaining the proper dedupability with previously", " existing files that are within the same seed group (-+S).", " -+V Enable shared file. No locking.", #if defined(Windows) " -+U Windows Unbufferd I/O API (Very Experimental)", #endif " -+X Enable short circuit mode for filesystem testing ONLY", " ALL Results are NOT valid in this mode.", " -+Z Enable old data set compatibility mode. WARNING.. Published", " hacks may invalidate these results and generate bogus, high", " values for results.", " -+w ## Percent of dedup-able data in buffers.", " -+y ## Percent of dedup-able within & across files in buffers.", " -+C ## Percent of dedup-able within & not across files in buffers.", " -+a ## Percent of data that is compressible.", " -+Q ## Dedup granule size.", " -+H Hostname Hostname of the PIT server.", " -+P Service Service of the PIT server.", " -+z Enable latency histogram logging.", " -+M Enable Dedup+compress option. (Experimental).", " -+R Enable iozone to take filenames from a file.", " -+e Enable sparse instead of within and across dedup regions", "" }; char *head1[] = { " 'Iozone' Filesystem Benchmark Program", " ", THISVERSION, MODE, " ", " Original Author: William Norcott (wnorcott@us.oracle.com)", " 4 Dunlap Drive", " Nashua, NH 03060", " ", " Enhancements: Don Capps (capps@iozone.org)", " 7417 Crenshaw", " Plano, TX 75025", " ", " Copyright 1991, 1992, 1994, 1998, 1999, 2002 William D. Norcott", " ", " License to freely use and distribute this software is hereby granted ", " by the author, subject to the condition that this copyright notice ", " remains intact. The author retains the exclusive right to publish ", " derivative works based on this work, including, but not limited to, ", " revised versions of this work", " ", " Other contributors:", " ", " Don Capps (Network Appliance) capps@iozone.org", " ", ""}; /****************************************************************** INCLUDE FILES (system-dependent) ******************************************************************/ #include #include #include #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__APPLE__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(solaris) || defined(Windows) #ifndef my_sig_t typedef void (*my_sig_t)(int); #endif #endif #include #include #if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__APPLE__) && !defined(__DragonFly__) #include #endif #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__APPLE__) || defined(__DragonFly__) || defined(__NetBSD__) #include #include #endif #if defined (__FreeBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__APPLE__) || defined(__DragonFly__) #ifndef O_SYNC #define O_SYNC O_FSYNC #endif #endif #if defined (__FreeBSD__) || defined(__DragonFly__) #ifndef O_RSYNC #define O_RSYNC O_FSYNC #endif #endif #if ((defined(solaris) && defined(__LP64__)) || defined(__s390x__)) /* If we are building for 64-bit Solaris, all functions that return pointers * must be declared before they are used; otherwise the compiler will assume * that they return ints and the top 32 bits of the pointer will be lost, * causing segmentation faults. The following includes take care of this. * It should be safe to add these for all other OSs too, but we're only * doing it for Solaris now in case another OS turns out to be a special case. */ #include #include #ifndef NO_SOCKET #include #endif #include #include #endif #if ( defined(solaris) && defined(studio11) ) #include #include #endif #if defined(OSFV5) || defined(linux) #include #endif #if defined(linux) #include #include #include #endif #ifndef MAP_FAILED #define MAP_FAILED -1 #endif #ifdef generic typedef long long off64_t; #endif #if defined(__FreeBSD__) #define __off64_t_defined typedef off_t off64_t; #endif #if defined(__DragonFly__) #define __off64_t_defined typedef off_t off64_t; #endif #ifndef ANDROID #ifndef solaris #ifndef off64_t #ifndef _OFF64_T #ifndef __AIX__ #ifndef __off64_t_defined #ifndef SCO_Unixware_gcc #ifndef UWIN #ifndef __DragonFly__ #ifndef __FreeBSD__ typedef long long off64_t; #endif #endif #endif #endif #endif #endif #endif #endif #endif #endif #ifdef __AIX__ #include #endif #ifdef VXFS #include #endif #ifdef unix #if defined (__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__) \ || defined(_SUA_) #include #endif #include #include #include #ifndef NULL #define NULL 0 #endif #ifndef nolimits #include #endif #endif #ifdef HAVE_ANSIC_C #define VOLATILE volatile #else #define VOLATILE #endif #include #ifdef SHARED_MEM #include #endif #if defined(bsd4_2) && !defined(MS_SYNC) #define MS_SYNC 0 #define MS_ASYNC 0 #endif #if defined(bsd4_4) || defined(__DragonFly__) #define MAP_ANONYMOUS MAP_ANON #endif #if defined(SCO_Unixware_gcc) || defined(solaris) || defined(UWIN) || defined(SCO) #define MAP_FILE (0) #endif #if defined(IRIX) || defined(IRIX64) || defined(Windows) || defined(bsd4_2) || defined(bsd4_4) || defined(SCO) || defined(Solaris) || defined(SCO_Unixware_gcc) long long page_size = 4096; #define GOT_PAGESIZE 1 #elif defined(NBPG) long long page_size = NBPG; #define GOT_PAGESIZE 1 #elif defined(old_linux) #include long long page_size = PAGE_SIZE; #define GOT_PAGESIZE 1 #elif !defined(GOT_PAGESIZE) long long page_size = 4096; /* Used when all else fails */ #endif #ifdef HAVE_PREAD #ifdef HAVE_PREADV #define PVECMAX 16 #ifdef _HPUX_SOURCE #define PER_VECTOR_OFFSET #include struct piovec piov[PVECMAX]; #else #include struct iovec piov[PVECMAX]; #define piov_base iov_base #define piov_len iov_len #endif #endif #endif #define DEDUPSEED 0x2719362 #define MAX_RAND 2147483647L #ifdef NO_SOCKET #define socket no_socket int no_socket(int, int, int); #define accept no_accept int no_accept(int , struct sockaddr *, socklen_t *); #define bind no_bind int no_bind(int, const struct sockaddr *, socklen_t); #define connect no_connect int no_connect(int, const struct sockaddr *, socklen_t); #endif #ifdef NO_SIGNAL #define kill no_kill int no_kill(pid_t, int ); #endif /* * In multi thread/process throughput mode each child keeps track of * statistics and communicates them through various flavors of * shared memory, and via messages. */ struct child_stats { long long flag; /* control space */ long long flag1; /* pad */ float walltime; /* child elapsed time */ float cputime; /* child CPU time */ float throughput; /* Throughput in either kb/sec or ops/sec */ float actual; /* Either actual kb read or # of ops performed */ } VOLATILE *child_stat; /* * Used for cpu time statistics. */ struct runtime { float walltime; float cputime; float cpuutil; }; #ifdef __convex_spp #include #endif #include #include #include /* * Messages the controlling process sends to children. * Internal representation that is arch specific. * This is used when using the network distributed mode. */ struct client_command { char c_host_name[100]; char c_pit_hostname[40]; char c_pit_service[8]; char c_client_name[100]; char c_working_dir[200]; char c_file_name[200]; char c_path_dir[200]; char c_execute_name[200]; char c_write_traj_filename[200]; char c_read_traj_filename[200]; int c_oflag; int c_mfflag; int c_unbuffered; int c_noretest; int c_notruncate; int c_read_sync; int c_jflag; int c_async_flag; int c_k_flag; int c_h_flag; int c_mflag; int c_pflag; int c_stride_flag; int c_verify; int c_sverify; int c_odsync; int c_diag_v; int c_zero_pct; int c_N_special; int c_dedup_granule_size; int c_dedup; int c_dedup_flag; int c_sparse_mode; int c_dedup_iflag; int c_dedup_bflag; int c_dedup_interior; int c_dedup_compress; int c_dedup_mseed; int c_chid_skew; int c_hist_summary; int c_op_rate; int c_op_rate_flag; int c_Q_flag; int c_inc_think; int c_L_flag; int c_OPS_flag; int c_mmapflag; int c_mmapasflag; int c_mmapnsflag; int c_mmapssflag; int c_no_copy_flag; int c_include_close; int c_include_flush; int c_disrupt_flag; int c_compute_flag; int c_xflag; int c_MS_flag; int c_mmap_mix; int c_Kplus_flag; int c_stop_flag; int c_w_traj_flag; int c_r_traj_flag; int c_direct_flag; int c_cpuutilflag; int c_seq_mix; int c_del_flag; int c_client_number; int c_command; int c_testnum; int c_no_unlink; int c_no_write; int c_file_lock; int c_rec_lock; int c_Kplus_readers; int c_multiplier; int c_share_file; int c_pattern; int c_version; int c_base_time; int c_num_child; int c_pct_read; int c_advise_op; int c_advise_flag; int c_restf; int c_mygen; long long c_stride; long long c_rest_val; long long c_delay; long long c_purge; long long c_fetchon; long long c_numrecs64; long long c_reclen; long long c_child_flag; long long c_delay_start; long long c_depth; float c_compute_time; }; /* * All data in this is in string format for portability in a * hetrogeneous environment. * * Messages that the master will send to the clients * over the socket. This provides neutral format * so that heterogeneous clusters will work. * This is used when using the network distributed mode. * WARNING !!! This data structure MUST not be bigger * than 1448 bytes or fragmentation will kick your butt. */ struct client_neutral_command { char c_host_name[100]; char c_pit_hostname[40]; char c_pit_service[8]; char c_client_name[100]; char c_working_dir[200]; char c_file_name[200]; char c_path_dir[200]; char c_execute_name[200]; char c_write_traj_filename[200]; char c_read_traj_filename[200]; char c_oflag[2]; char c_mfflag[2]; char c_unbuffered[2]; char c_noretest[2]; char c_notruncate[2]; char c_read_sync[2]; char c_jflag[2]; char c_async_flag[2]; char c_k_flag[2]; char c_h_flag[2]; char c_mflag[2]; char c_pflag[2]; char c_stride_flag[2]; char c_verify[2]; char c_sverify[2]; char c_odsync[2]; char c_diag_v[2]; char c_zero_pct[4]; char c_N_special[4]; char c_dedup_granule_size[8]; char c_dedup[4]; char c_dedup_flag[4]; char c_sparse_mode[4]; char c_dedup_iflag[4]; char c_dedup_bflag[4]; char c_dedup_interior[4]; char c_dedup_compress[4]; char c_dedup_mseed[4]; char c_chid_skew[4]; char c_hist_summary[4]; char c_op_rate[4]; char c_op_rate_flag[2]; char c_Q_flag[2]; char c_inc_think[2]; char c_L_flag[2]; char c_OPS_flag[2]; char c_mmapflag[2]; char c_mmapasflag[2]; char c_mmapnsflag[2]; char c_mmapssflag[2]; char c_no_copy_flag[2]; char c_include_close[2]; char c_include_flush[2]; char c_disrupt_flag[2]; char c_compute_flag[2]; char c_stop_flag[2]; char c_xflag[2]; char c_MS_flag[2]; char c_mmap_mix[2]; char c_Kplus_flag[2]; char c_w_traj_flag[2]; /* small int */ char c_r_traj_flag[2]; /* small int */ char c_direct_flag[2]; /* small int */ char c_cpuutilflag[2]; /* small int */ char c_seq_mix[2]; /* small int */ char c_del_flag[2]; /* small int */ char c_stride[10]; /* small long long */ char c_rest_val[10]; /* small long long */ char c_purge[10]; /* very small long long */ char c_fetchon[10]; /* very small long long */ char c_multiplier[10]; /* small int */ char c_share_file[10]; /* small int */ char c_file_lock[10]; /* small int */ char c_rec_lock[10]; /* small int */ char c_Kplus_readers[10]; /* small int */ char c_client_number[20]; /* int */ char c_command[20]; /* int */ char c_testnum[20]; /* int */ char c_no_unlink[4]; /* int */ char c_no_write[4]; /* int */ char c_pattern[20]; /* int */ char c_version[20]; /* int */ char c_base_time[20]; /* int */ char c_num_child[20]; /* int */ char c_pct_read[6]; /* small int */ char c_advise_op[4]; /* small int */ char c_advise_flag[4]; /* small int */ char c_restf[4]; /* small int */ char c_mygen[20]; /* long */ char c_depth[20]; /* small long long */ char c_child_flag[40]; /* small long long */ char c_delay[80]; /* long long */ char c_numrecs64[80]; /* long long */ char c_reclen[80]; /* long long */ char c_delay_start[80]; /* long long */ char c_compute_time[80]; /* float */ }; /* * Messages the clients will send to the master. * Internal representation on each client and the master. * This is used when using the network distributed mode. */ struct master_command { char m_host_name[100]; char m_client_name[100]; char m_stop_flag; int m_client_number; int m_client_error; int m_child_port; int m_child_async_port; int m_command; int m_testnum; int m_version; int m_mygen; float m_throughput; float m_cputime; float m_walltime; float m_actual; long long m_child_flag; }; /* * Messages that the clients will send to the master * over the socket. This provides neutral format * so that heterogeneous clusters will work. * This is used when using the network distributed mode. */ struct master_neutral_command { char m_host_name[100]; char m_client_name[100]; char m_client_number[20]; /* int */ char m_client_error[20]; /* int */ char m_stop_flag[4]; /* char +space */ char m_child_port[20]; /* int */ char m_child_async_port[20]; /* int */ char m_command[20]; /* int */ char m_testnum[20]; /* int */ char m_version[20]; /* int */ char m_mygen[20]; /* int */ char m_throughput[80]; /* float */ char m_cputime[80]; /* float */ char m_walltime[80]; /* float */ char m_actual[80]; /* float */ char m_child_flag[80]; /* long long */ }; /* * Possible values for the commands sent to the master */ #define R_CHILD_JOIN 1 #define R_STAT_DATA 2 #define R_FLAG_DATA 3 /* * Possible values for the master's commands sent to a client * * The R_FLAG_DATA is also used by the master to tell the * client to update its flags. */ #define R_JOIN_ACK 4 #define R_STOP_FLAG 5 #define R_TERMINATE 6 #define R_DEATH 7 /* These are the defaults for the processor. They can be * over written by the command line options. */ #define MY_CACHE_LINE_SIZE 32 #define MY_CACHE_SIZE ( 1024 * 1024 ) #define MEG (1024 * 1024) /* * For stride testing use a prime number to avoid stripe * wrap hitting the same spindle. */ #define STRIDE 17 /************************************************************************/ /* */ /* DEFINED CONSTANTS */ /* */ /* Never add a comment to the end of a #define. Some compilers will */ /* choke and fail the compile. */ /************************************************************************/ /* * Size of buffer for capturing the machine's name. */ #define IBUFSIZE 100 /* * How many I/Os before a non-uniform access. */ #define DISRUPT 100 /* * Set the crossover size. This is where the small transfers * are skipped to save time. There is an option to * disable the skipping. */ #define LARGE_REC 65536 /* Default number of kilobytes in file */ #define KILOBYTES 512 /* Default number of bytes in a record */ #define RECLEN 1024 /* Default size of file in bytes*/ #define FILESIZE (KILOBYTES*1024) /* Default number of records */ #define NUMRECS FILESIZE/RECLEN #ifdef __bsdi__ /* At 8 Meg switch to large records */ #define CROSSOVER (8*1024) /*maximum buffer size*/ #define MAXBUFFERSIZE (8*1024*1024) #else /* At 16 Meg switch to large records */ #define CROSSOVER (16*1024) /* Maximum buffer size*/ #define MAXBUFFERSIZE (16*1024*1024) #endif /* Maximum number of children. Threads/procs/clients */ #define MAXSTREAMS 1024 /* Minimum buffer size */ #define MINBUFFERSIZE 128 /* If things ran way too fast */ #define TOOFAST 10 /* Set the maximum number of types of tests */ #define MAXTESTS 12 /* Default fill pattern for verification */ #define PATTERN get_pattern(); #define PATTERN1 0xBB /* Used for Excel internal tables */ #define MAX_X 100 /* Used for Excel internal tables */ #define MAX_Y 512 #define USAGE "\tUsage: For usage information type iozone -h \n\n" /* Maximum number of characters in filename */ #define MAXNAMESIZE 1000 /* * Define the typical output that the user will see on their * screen. */ #ifdef NO_PRINT_LLD #ifdef HAVE_PREAD #include #if defined(HAVE_PREAD) && defined(HAVE_PREADV) #define CONTROL_STRING2 "%16s%8s%8s%11s%10s%10s%10s %9s%10s %10s %10s%10s%10s%10s%10s%10s%10s%10s%10s%10s%10s%10s%10s\n" #define CONTROL_STRING3 "%16s%8s%8s%11s%10s%10s%10s %9s%10s %10s %10s%10s%10s%10s%10s\n" #define CONTROL_STRING4 "%16s%8s%8s%11s%10s%10s\n" #else #define CONTROL_STRING2 "%16s%8s%8s%11s%10s%10s%10s %9s%10s %10s %10s%10s%10s%10s%10s%10s%10s%10s%10s\n" #define CONTROL_STRING3 "%16s%8s%8s%11s%10s%10s%10s %9s%10s %10s %10s\n" #define CONTROL_STRING4 "%16s%8s%8s%11s%10s%10s\n" #endif #else #define CONTROL_STRING2 "%16s%8s%8s%11s%10s%10s%10s %9s%10s %10s %10s%10s%10s%10s%10s\n" #define CONTROL_STRING3 "%16s%8s%8s%11s%10s%10s%10s %9s%10s %10s %10s%10s%10s%10s%10s\n" #define CONTROL_STRING4 "%16s%8s%8s%11s%10s%10s\n" #endif #endif #ifndef NO_PRINT_LLD #ifdef HAVE_PREAD #include #if defined(HAVE_PREAD) && defined(HAVE_PREADV) #define CONTROL_STRING2 "%16s%8s%9s%11s%10s%10s%10s %9s%10s %10s %10s%10s%10s%10s%10s%10s%10s%10s%10s%10s%10s%10s%10s\n" #define CONTROL_STRING3 "%16s%8s%9s%11s%10s%10s%10s %9s%10s %10s %10s%10s%10s%10s%10s\n" #define CONTROL_STRING4 "%16s%8s%9s%11s%10s%10s\n" #else #define CONTROL_STRING2 "%16s%8s%9s%11s%10s%10s%10s %9s%10s %10s %10s%10s%10s%10s%10s%10s%10s%10s%10s\n" #define CONTROL_STRING3 "%16s%8s%9s%11s%10s%10s%10s %9s%10s %10s %10s%10s%10s%10s%10s\n" #define CONTROL_STRING4 "%16s%8s%9s%11s%10s%10s\n" #endif #else #define CONTROL_STRING2 "%16s%8s%9s%11s%10s%10s%10s %9s%10s %10s %10s%10s%10s%10s%10s\n" #define CONTROL_STRING3 "%16s%8s%9s%11s%10s%10s%10s %9s%10s %10s %10s%10s%10s%10s%10s\n" #define CONTROL_STRING4 "%16s%8s%9s%11s%10s%10s\n" #endif #endif /* For 'auto mode', these defines determine the number of iterations to perform for both the file size and the record length. */ /* Start with 64 kbyte minimum file size by default */ #define KILOBYTES_START 64 /* Default maximum file size. This is 512 MBytes */ #define KILOBYTES_END (1024*512) /* Default starting record size */ #define RECLEN_START 4096 /* Default maximum record size */ #define RECLEN_END (MAXBUFFERSIZE) /* Multiplier for each itteration on file and record size */ #define MULTIPLIER 2 /* * Assign numeric values to each of the tests. */ #define WRITER_TEST 0 #define READER_TEST 1 #define RANDOM_RW_TEST 2 #define REVERSE_TEST 3 #define REWRITE_REC_TEST 4 #define STRIDE_READ_TEST 5 #define FWRITER_TEST 6 #define FREADER_TEST 7 #define RANDOM_MIX_TEST 8 #ifdef HAVE_PREAD #define PWRITER_TEST 9 #define PREADER_TEST 10 #endif /* HAVE_PREAD */ #ifdef HAVE_PREADV #define PWRITEV_TEST 11 #define PREADV_TEST 12 #endif /* HAVE_PREADV */ #define WRITER_MASK (1 << WRITER_TEST) #define READER_MASK (1 << READER_TEST) #define RANDOM_RW_MASK (1 << RANDOM_RW_TEST) #define RANDOM_MIX_MASK (1 << RANDOM_MIX_TEST) #define REVERSE_MASK (1 << REVERSE_TEST) #define REWRITE_REC_MASK (1 << REWRITE_REC_TEST) #define STRIDE_READ_MASK (1 << STRIDE_READ_TEST) #define FWRITER_MASK (1 << FWRITER_TEST) #define FREADER_MASK (1 << FREADER_TEST) #ifdef HAVE_PREAD #define PWRITER_MASK (1 << PWRITER_TEST) #define PREADER_MASK (1 << PREADER_TEST) #endif /* HAVE_PREAD */ #ifdef HAVE_PREADV #define PWRITEV_MASK (1 << PWRITEV_TEST) #define PREADV_MASK (1 << PREADV_TEST) #endif /* HAVE_PREADV */ /* * child_stat->flag values and transitions */ /* Parent initializes children to HOLD */ #define CHILD_STATE_HOLD 0 /* Child tells master when it's READY */ #define CHILD_STATE_READY 1 /* Parent tells child to BEGIN */ #define CHILD_STATE_BEGIN 2 /* Child tells parent that it's DONE */ #define CHILD_STATE_DONE 3 #define MERSENNE /******************************************************************/ /* */ /* FUNCTION DECLARATIONS */ /* */ /******************************************************************/ /*int pit_gettimeofday( struct timeval *, struct timezone *, char *, char *);*/ static int openSckt( const char *, const char *, unsigned int ); static void pit( int, struct timeval *); void auto_test(); /* perform automatic test series */ static double time_so_far(); /* time since start of program */ static void update_burst_sleep(int, long long, double *); #ifndef NO_THREADS static void count_burst(double* burst_acc_time_sec, long long stream_id); #endif #ifdef HAVE_ANSIC_C float do_compute(float); /* compute cycle simulation */ void begin(off64_t,long long); void record_command_line(int, char **); void show_help(void); /* show development help */ #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__APPLE__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(solaris) || defined(Windows) my_sig_t signal_handler(void); /* clean up if user interrupts us */ #else sighandler_t signal_handler(void); /* clean up if user interrupts us */ #endif void auto_test(void); void throughput_test(void); static double time_so_far(void); void fetchit(char *,long long); long long verify_buffer(volatile char *,long long, off64_t, long long, unsigned long long, char ); void purgeit(char *,long long); void prepage(char *,long long); void write_perf_test(off64_t,long long, long long *,long long *); void fwrite_perf_test(off64_t, long long, long long *,long long *); void fread_perf_test(off64_t, long long, long long *, long long *); void read_perf_test(off64_t,long long,long long *,long long *); void mix_perf_test(off64_t,long long,long long *,long long *); void random_perf_test(off64_t,long long, long long *,long long *); void reverse_perf_test(off64_t,long long,long long *,long long *); void rewriterec_perf_test(off64_t ,long long,long long *,long long *); void read_stride_perf_test(off64_t,long long,long long *,long long *); #ifdef HAVE_PREAD void pread_perf_test(off64_t,long long ,long long *,long long *); void pwrite_perf_test(off64_t ,long long ,long long *,long long *); #endif /* HAVE_PREAD */ #ifdef HAVE_PREADV void preadv_perf_test(off64_t ,long long ,long long *,long long *); void pwritev_perf_test(off64_t ,long long ,long long *,long long *); #endif /* HAVE_PREADV */ void store_dvalue(double); void print_header(void); void dump_excel(void); void dump_throughput(void); int sp_start_child_send(char *, int , struct in_addr *); int sp_start_master_listen(int , int ); void dump_report(long long); void dump_times(long long); void Poll(long long); long long l_max(long long,long long); void Kill(long long,long long); long long l_min(long long,long long); void multi_throughput_test(long long,long long); long long mythread_create( void *(*func)(void *),int); int thread_exit(void); void get_resolution(void); #ifndef NO_THREADS pthread_t mythread_self(void); #endif void dump_throughput_cpu(void); char * initfile(int , off64_t ,int ,int ); void mmap_end( char *, long long); void my_nap( int ); void my_unap( unsigned long long ); void get_rusage_resolution(void); static double time_so_far1(void); #ifdef unix static double clk_tck(void); /* Get the clocks per tick for times */ static double utime_so_far(void); /* Return user time in ticks as double */ static double stime_so_far(void); /* Return system time in ticks as double */ static double cputime_so_far(void); /* Return CPU time in seconds as double */ #else #define cputime_so_far(void) time_so_far(void) #endif int start_master_listen(void); void master_listen(int , int ); void child_send(char *, struct master_command *, int ); void master_send(int , char *, struct client_command *, int ); void stop_child_listen(int); void O_stop_child_send(int); void stop_master_listen(int); void stop_master_send(int); int start_child_listen(int); int start_child_listen_async(int); void start_child_listen_loop(void); int child_attach(int, int); void child_listen(int, int); void child_listen_async(int, int); int start_master_send(char *, int, struct in_addr *); int start_master_send_async(char *, int , struct in_addr ); long long start_child_proc(int ,long long , long long ); int pick_client(int,long long, long long); void become_client(void); void tell_master_stats(int, long long, double, double, float, double, char, long long); void stop_master_listen_loop(void); void tell_master_ready(long long); void wait_for_master_go(long long); void start_master_listen_loop(int); void tell_children_begin(long long); void wait_dist_join(void); int parse_client_line(char *,int); void child_remove_files(int); void terminate_child_async(void); void distribute_stop(void); void send_stop(void); void cleanup_children(void); void cleanup_comm(void); int sp_start_master_send(char *, int , struct in_addr *); int sp_start_child_listen(int, int); void get_date(char *); int get_pattern(void); void alloc_pbuf(void); int check_filename(char *); int gen_new_buf(char *, char *, long, int, int, int, int, int ); int special_gen_new_buf(char *, char *, long, int, int, int, int, int ); void touch_dedup(char *, int ); void init_genrand64(unsigned long long); long long genrand64_int63(void); double genrand64_real1(void); double genrand64_real2(void); double genrand64_real3(void); int pit_gettimeofday( struct timeval *, struct timezone *, char *, char *); #else /* NON ANSI C */ float do_compute(); /* compute cycle simulation */ void begin(); void record_command_line(); void show_help(); #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__APPLE__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(solaris) || defined(Windows) my_sig_t signal_handler(); /* clean up if user interrupts us */ #else sighandler_t signal_handler(); /* clean up if user interrupts us */ #endif void auto_test(); void throughput_test(); static double time_so_far(); void fetchit(); /* Prime on chip cache */ long long verify_buffer(); void purgeit(); /* Purge on chip cache */ void prepage(); /* Pre-fault user buffer */ void write_perf_test(off64_t, long long, long long *,long long *); /* void write_perf_test(); write/rewrite test */ void fwrite_perf_test(); /* fwrite/refwrite test */ void fread_perf_test(); /* fread/refread test */ void read_perf_test(); /* read/reread test */ void mix_perf_test(); /* read/reread test */ void random_perf_test(); /* random read/write test */ void reverse_perf_test(); /* reverse read test */ void rewriterec_perf_test(); /* rewrite record test */ void read_stride_perf_test(); /* read with stride test */ #ifdef HAVE_PREAD void pread_perf_test(); /* pread/re-pread test */ void pwrite_perf_test(); /* pwrite/re-pwrite test */ #endif /* HAVE_PREAD */ #ifdef HAVE_PREADV void preadv_perf_test(); /* preadv/re-preadv test */ void pwritev_perf_test(); /* pwritev/re-pwritev test */ #endif /* HAVE_PREADV */ void store_dvalue(); /* Store doubles array */ void print_header(); void dump_excel(); void dump_throughput(); int sp_start_child_send(); int sp_start_master_listen(); void dump_report(); void dump_times(); void Poll(); long long l_max(); void Kill(); long long l_min(); void multi_throughput_test(); /* Multi process throughput */ long long mythread_create(); int thread_exit(); #ifndef NO_THREADS pthread_t mythread_self(); #endif void dump_throughput_cpu(); char * initfile(); void mmap_end(); void my_nap(); void my_unap(); void get_resolution(); void get_rusage_resolution(); static double time_so_far1(); /* time since start of program */ #ifdef unix static double clk_tck(); /* Get clocks/tick */ static double utime_so_far(); /* user time */ static double stime_so_far(); /* system time */ static double cputime_so_far(); #else #define cputime_so_far() time_so_far() #endif int start_master_listen(); void master_listen(); void child_send(); void master_send(); void stop_child_listen(); void O_stop_child_send(); void stop_master_listen(); void stop_master_send(); int start_child_listen(); int start_child_listen_async(); void start_child_listen_loop(); int child_attach(); void child_listen(); void child_listen_async(); int start_master_send(); int start_master_send_async(); long long start_child_proc(); int pick_client(); void become_client(); void tell_master_stats(); void stop_master_listen_loop(); void tell_master_ready(); void wait_for_master_go(); void start_master_listen_loop(); void tell_children_begin(); void wait_dist_join(); int parse_client_line(); void child_remove_files(); void terminate_child_async(); void distribute_stop(); void send_stop(); void cleanup_children(); void cleanup_comm(void); int sp_start_master_send(char *, int , struct in_addr *); int sp_start_child_listen(int, int); void get_date(); int get_pattern(); void alloc_pbuf(); int check_filename(); int gen_new_buf(); int special_gen_new_buf(); void touch_dedup(); void init_genrand64(); long long genrand64_int63(); double genrand64_real1(); double genrand64_real2(); double genrand64_real3(); int pit_gettimeofday(); #endif /* End of HAVE ANSI C */ #ifdef HAVE_ANSIC_C #if defined (HAVE_PREAD) && defined(_LARGEFILE64_SOURCE) ssize_t pwrite64(int, const void *, size_t, off_t); /* ssize_t pwrite64(); */ ssize_t pread64(int, void *, size_t, off_t); /*ssize_t pread64(); */ #endif #if !defined(linux) char *getenv(); char *inet_ntoa(); int system(); #endif #ifdef ASYNC_IO void async_init(struct cache **,int, int); int async_read_no_copy(struct cache *, long long, char **, off64_t, long long, long long, off64_t, long long); void async_release(struct cache *gc); void end_async(struct cache *); int async_read(struct cache *, long long , char *, off64_t, long long, long long, off64_t, long long); size_t async_write(struct cache *,long long, char *, long long, off64_t, long long); size_t async_write_no_copy(struct cache *,long long ,char *,long long,long long,long long,char *); #else long long *gc=0; void async_init(long long **,int,int); int async_read(); int async_read_no_copy(); size_t async_write(); size_t async_write_no_copy(); void async_release(); #endif void do_float(int, double, int, int); int create_xls(char *); void close_xls(int); void do_label(int, char *, int, int ); int mylockf(int, int, int); int mylockr(int,int, int, off64_t, off64_t); int rand(void); void srand(unsigned int); int get_client_info(void); void exit(int); void find_remote_shell(char *); void find_external_mon(char *,char *); void start_monitor(char *); void stop_monitor(char *); void takeoff_cache(); void del_cache(); void fill_area(long long *, long long *, long long); void fill_buffer(char *,long long ,long long ,char, long long ); void store_value(off64_t); void store_times(double, double); static double cpu_util(double, double); void dump_cputimes(void); void purge_buffer_cache(void); char *alloc_mem(long long,int); void *(thread_rwrite_test)(int); void *(thread_write_test)(int); void *(thread_fwrite_test)(int); void *(thread_fread_test)(int); void *(thread_read_test)(int); #ifdef HAVE_PREAD void *(thread_pread_test)(int); void *(thread_pwrite_test)(int); #endif void *(thread_cleanup_test)(int); void *(thread_cleanup_quick)(int); void *(thread_ranread_test)(int); void *(thread_mix_test)(int); void *(thread_ranwrite_test)(int); void *(thread_rread_test)(int); void *(thread_reverse_read_test)(int); void *(thread_stride_read_test)(int); void *(thread_set_base)(int); void *(thread_join)(long long, void *); void disrupt(int); #if defined(Windows) void disruptw(HANDLE); #endif long long get_traj(FILE *, long long *, float *, long); void create_temp(off64_t, long long ); FILE *open_w_traj(void); FILE *open_r_traj(void); void traj_vers(void); void r_traj_size(void); long long w_traj_size(void); off64_t get_next_file_size(off64_t); void add_file_size(off64_t); void init_file_sizes( off64_t, off64_t); off64_t get_next_record_size(off64_t); void add_record_size(off64_t); void init_record_sizes( off64_t, off64_t); void del_record_sizes( void ); void hist_insert(double ); void dump_hist(char *,int ); void do_speed_check(int); #else void do_speed_check(); #if !defined(linux) char *getenv(); char *inet_ntoa(); int system(); #endif void close_xls(); void do_label(); int create_xls(); void do_float(); #ifdef ASYNC_IO void async_release(); size_t async_write(); size_t async_write_no_copy(); int async_read(); int async_read_no_copy(); #endif int mylockf(); int mylockr(); int rand(); void srand(); int get_client_info(); void exit(); void find_remote_shell(); void traj_vers(); void r_traj_size(); long long w_traj_size(); FILE *open_w_traj(); FILE *open_r_traj(); void create_temp(); void fill_buffer(); char *alloc_mem(); void *(thread_rwrite_test)(); void *(thread_write_test)(); void *(thread_fwrite_test)(); void *(thread_fread_test)(); void *(thread_read_test)(); void *(thread_cleanup_test)(); void *(thread_ranread_test)(); void *(thread_mix_test)(); void *(thread_ranwrite_test)(); void *(thread_rread_test)(); void *(thread_reverse_read_test)(); void *(thread_stride_read_test)(); void *(thread_set_base)(); void *(thread_join)(); void disrupt(); long long get_traj(); void init_file_sizes(); off64_t get_next_file_size(); void add_file_size(); void init_record_sizes(); off64_t get_next_record_size(); void add_record_size(); void dump_cputimes(); static double cpu_util(); void del_record_sizes(); void hist_insert(); void dump_hist(); #endif #ifdef _LARGEFILE64_SOURCE #define I_LSEEK(x,y,z) lseek64(x,(off64_t)(y),z) #define I_OPEN(x,y,z) open64(x,(int)(y),(int)(z)) #define I_CREAT(x,y) creat64(x,(int)(y)) #define I_FOPEN(x,y) fopen64(x,y) #define I_STAT(x,y) stat64(x,y) #ifdef HAVE_PREAD #define I_PREAD(a,b,c,d) pread64(a,b,(size_t)(c),(off64_t)(d)) #define I_PWRITE(a,b,c,d) pwrite64(a,b,(size_t)(c),(off64_t)(d)) #endif #define I_MMAP(a,b,c,d,e,f) mmap64((void *)(a),(size_t)(b),(int)(c),(int)(d),(int)(e),(off64_t)(f)) #else #define I_LSEEK(x,y,z) lseek(x,(off_t)(y),z) #define I_OPEN(x,y,z) open(x,(int)(y),(int)(z)) #define I_CREAT(x,y) creat(x,(int)(y)) #define I_FOPEN(x,y) fopen(x,y) #define I_STAT(x,y) stat(x,y) #ifdef HAVE_PREAD #define I_PREAD(a,b,c,d) pread(a,b,(size_t)(c),(off_t)(d)) #define I_PWRITE(a,b,c,d) pwrite(a,b,(size_t)(c),(off_t)(d)) #endif #define I_MMAP(a,b,c,d,e,f) mmap((void *)(a),(size_t)(b),(int)(c),(int)(d),(int)(e),(off_t)(f)) #endif /************************************************************************/ /* The list of tests to be called. */ /************************************************************************/ void (*func[])(off64_t,long long, long long *, long long *) = { write_perf_test, read_perf_test, random_perf_test, reverse_perf_test, rewriterec_perf_test, read_stride_perf_test, fwrite_perf_test, fread_perf_test, mix_perf_test #ifdef HAVE_PREAD , pwrite_perf_test, pread_perf_test #ifdef HAVE_PREADV , pwritev_perf_test, preadv_perf_test #endif /* HAVE_PREADV */ #endif /* HAVE_PREAD */ }; /* char *test_output[] = {" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " \n" }; */ #ifdef FOOBAR random random bkwd record stride write rewrite read reread read write read rewrite read fwrite frewrite fread freread pwv prwv prv prrv #endif char *test_output[] ={" ", " ", " ", " ", " ", " ", " ", " ", "", " ", " ", " ", " ", " ", " ", " \n" }; long long test_soutput[] = {2,2,2,1,1,1,2,2,2,2,2,2,2,2}; /******************************************************************/ /* */ /* GLOBAL VARIABLES */ /* */ /*******************************************************************/ /* * Set the size of the shared memory segment for the children * to put their results. */ #define SHMSIZE ((( sizeof(struct child_stats) * MAXSTREAMS) )+4096 ) /* * Pointer to the shared memory segment. */ VOLATILE struct child_stats *shmaddr; double totaltime,total_time, temp_time ,total_kilos; off64_t report_array[MAX_X][MAX_Y]; double report_darray[MAX_X][MAXSTREAMS]; double time_res,cputime_res; long long throughput_array[MAX_X]; /* Filesize & record size are constants */ short current_x, current_y; long long orig_size; long long max_x, max_y; unsigned long long goodkilos; off64_t kilobytes64 = (off64_t)KILOBYTES; long long goodrecl; off64_t offset = 0; /*offset for random I/O */ off64_t offset64 = 0; /*offset for random I/O */ off64_t filebytes64; off64_t r_range[100]; off64_t s_range[100]; int t_range[100]; int t_count = 0; int r_count,s_count; char *barray[MAXSTREAMS]; char *haveshm; #if !defined(Windows) extern int optind; #endif long long onetime, auto_mode, sfd, multi_buffer; int exit_code = 0; int fd; int sp_msfd,sp_mrfd,sp_csfd,sp_crfd; int begin_proc,num_processors,ioz_processor_bind; long long res_prob,rec_prob; char silent,read_sync; char master_iozone, client_iozone,distributed; int bif_fd,s_count; int bif_row,bif_column; int dedup_mseed = 1; int chid_skew = 0; int hist_summary; int op_rate; int op_rate_flag; char aflag, Eflag, hflag, Rflag, rflag, sflag,del_flag,mix_test; char diag_v,sent_stop,dedup,dedup_interior,dedup_compress, dedup_flag, sparse_mode, dedup_iflag,dedup_bflag; int zero_pct = -1; int N_special = 0; int W_special = 0; int dedup_granule_size = 4096; int dedup_unit_step = 1024; char *dedup_ibuf; char *dedup_temp; char bif_flag; int rlocking; int share_file; int ecount; char gflag,nflag; char yflag,qflag; #ifdef Windows char *build_name = "Windows"; #else char *build_name = NAME; #endif char imon_start[256],imon_stop[256]; char imon_sync; char trflag; char cpuutilflag; char seq_mix; long base_time; long long mint, maxt; long long w_traj_ops, r_traj_ops, w_traj_fsize,r_traj_fsize; long long r_traj_ops_completed,r_traj_bytes_completed; long long w_traj_ops_completed,w_traj_bytes_completed; int w_traj_items, r_traj_items; char fflag, Uflag,uflag,lflag,include_tflag; struct runtime runtimes [MAX_X] [MAX_Y]; /* in parallel with report_array[][] */ long long include_test[50]; long long include_mask; char RWONLYflag, NOCROSSflag; /*auto mode 2 - kcollins 8-21-96*/ char mfflag,F_flag; long long status, x, y, childids[MAXSTREAMS+1], myid, num_child; int pct_read,speed_code; #ifndef NO_THREADS pthread_t p_childids[MAXSTREAMS+1]; #endif off64_t next64; char wol_opened, rol_opened; FILE *wqfd,*rwqfd,*rqfd,*rrqfd; #if !defined(Windows) extern char *optarg; #endif #ifndef __AIX__ long long ret; #else short ret; #endif struct size_entry { struct size_entry *next; off64_t size; }; struct size_entry *size_list=0; struct size_entry *rec_size_list=0; off64_t maximum_file_size; off64_t minimum_file_size; off64_t burst_size_kb_64 = -1; /* the size of the burst (in KBytes) */ long long burst_sleep_duration_msec = -1; /* the sleep duration between burst */ long long written_this_burst = 0; /* How much data was writen so far in this burst*/ #ifndef NO_THREADS pthread_barrierattr_t barrier_attr; pthread_barrier_t *barrier; off64_t burst_size_per_child = 0; long long burst_written_so_far[MAXSTREAMS] = {0}; /* How much data was written so far in this burst per stream (thread/process)*/ #endif char bif_filename [MAXNAMESIZE]; /* name of biff file */ char filename [MAXNAMESIZE]; /* name of temporary file */ char mountname [MAXNAMESIZE]; /* name of device */ char dummyfile [MAXSTREAMS][MAXNAMESIZE]; /* name of dummy file */ char dummyfile1 [MAXNAMESIZE]; /* name of dummy file */ char *filearray[MAXSTREAMS]; /* array of file names */ int blkidx[MAXSTREAMS]; /* array of file names */ char tfile[MAXNAMESIZE]; char *buffer,*buffer1, *mbuffer,*mainbuffer; FILE *pi,*r_traj_fd,*w_traj_fd; VOLATILE char *pbuffer; char *default_filename="iozone.tmp"; /*default name of temporary file*/ VOLATILE char stoptime; char Cflag; char use_thread = 0; long long debug1=0; long long debug=0; unsigned long cache_size=(long long)MY_CACHE_SIZE; unsigned long cache_line_size=(long long)MY_CACHE_LINE_SIZE; long long *pstatus; off64_t min_file_size = KILOBYTES_START; off64_t max_file_size = KILOBYTES_END; long long min_rec_size = RECLEN_START; long long max_rec_size = RECLEN_END; long long orig_min_rec_size = RECLEN_START; long long orig_max_rec_size = RECLEN_END; long long xover = CROSSOVER; char *throughput_tests[] = {"Initial write","Rewrite","Read","Re-read", "Reverse Read","Stride read","Random read","Mixed workload","Random write","Pwrite","Pread","Fwrite","Fread"}; char command_line[1024] = "\0"; #ifdef unix double sc_clk_tck; #endif int argcsave; char **argvsave; char splash[80][80]; int splash_line; char client_filename[256]; char remote_shell[256]; int client_error; char pit_hostname[40]; char pit_service[8]; int junk; /* * Host ports used to listen, and handle errors. */ #define HOST_LIST_PORT 20000 #define HOST_ESEND_PORT (HOST_LIST_PORT+MAXSTREAMS) #define HOST_ASEND_PORT (HOST_ESEND_PORT+MAXSTREAMS) int controlling_host_port = HOST_LIST_PORT; /* * Childs ports used to listen, and handle errors. */ #define CHILD_ESEND_PORT (HOST_ASEND_PORT+MAXSTREAMS) #define CHILD_LIST_PORT (CHILD_ESEND_PORT+MAXSTREAMS) /* Childs async message port. Used for stop flag and terminate */ #define CHILD_ALIST_PORT (CHILD_LIST_PORT+MAXSTREAMS) /* Ports for the network speed code */ #define SP_CHILD_LISTEN_PORT 31000 #define SP_CHILD_ESEND_PORT (SP_CHILD_LISTEN_PORT+10) #define SP_MASTER_LISTEN_PORT (SP_CHILD_ESEND_PORT+10) #define SP_MASTER_ESEND_PORT (SP_MASTER_LISTEN_PORT+10) #define SP_MASTER_RESULTS_PORT (SP_MASTER_ESEND_PORT+10) #define THREAD_WRITE_TEST 1 #define THREAD_REWRITE_TEST 2 #define THREAD_READ_TEST 3 #define THREAD_REREAD_TEST 4 #define THREAD_STRIDE_TEST 5 #define THREAD_RANDOM_READ_TEST 6 #define THREAD_RANDOM_WRITE_TEST 7 #define THREAD_REVERSE_READ_TEST 8 #define THREAD_RANDOM_MIX_TEST 9 #define THREAD_PWRITE_TEST 10 #define THREAD_PREAD_TEST 11 #define THREAD_FWRITE_TEST 12 #define THREAD_FREAD_TEST 13 #define THREAD_CLEANUP_TEST 14 /* * Child states that the master is tracking. * The master uses these to determine how to shutdown * the clients when some fool hits control-C. */ #define C_STATE_ZERO 1 #define C_STATE_WAIT_WHO 2 #define C_STATE_WAIT_BARRIER 3 int c_port,a_port; /* port number */ int child_port; /* Virtualized due to fork */ int child_async_port; /* Virtualized due to fork */ int client_listen_pid; /* Virtualized due to fork */ int master_join_count; /* How many children have joined */ int l_sock,l_async_sock; /* Sockets for listening */ char master_rcv_buf[4096]; /* Master's receive buffer */ int master_listen_pid; /* Pid of the master's async listener proc */ char master_send_buf[4096]; /* Master's send buffer */ char child_rcv_buf[4096]; /* Child's receive buffer */ char child_async_rcv_buf[4096]; /* Child's async recieve buffer */ char child_send_buf[4096]; /* Child's send buffer */ int child_send_socket; /* Child's send socket */ int child_listen_socket; /* Child's listener socket */ int child_listen_socket_async; /* Child's async listener socket */ int master_send_socket; /* Needs to be an array. One for each child*/ int master_send_sockets[MAXSTREAMS]; /* Needs to be an array. One for each child*/ int master_send_async_sockets[MAXSTREAMS]; /* Needs to be an array. One for each child*/ int master_listen_port; /* Master's listener port number */ int master_listen_socket; /* Master's listener socket */ int clients_found; /* Number of clients found in the client file */ FILE *newstdin, *newstdout, *newstderr; /* used for debug in cluster mode.*/ char toutput[20][20]; /* Used to help format the output */ int toutputindex; /* Index to the current output line */ int cdebug = 0; /* Use to turn on child/client debugging in cluster mode. */ int mdebug = 0; /* Use to turn on master debug in cluster mode */ int aggflag; /* Used to indicate constant aggregate data set size */ struct sockaddr_in child_sync_sock, child_async_sock; /* * Change this whenever you change the message format of master or client. */ int proto_version = 25; /******************************************************************************/ /* Tele-port zone. These variables are updated on the clients when one is */ /* using cluster mode. (-+m) */ /* Do not touch these unless you have become one with the universe !! */ /******************************************************************************/ char controlling_host_name[100]; struct child_ident { char child_name[100]; char workdir[200]; char execute_path[200]; char file_name[200]; int state; int child_number; int child_port; int child_async_port; int master_socket_num; int master_async_socket_num; }child_idents[MAXSTREAMS]; int Kplus_readers; char write_traj_filename [MAXNAMESIZE]; /* name of write telemetry file */ char read_traj_filename [MAXNAMESIZE]; /* name of read telemetry file */ char oflag,jflag,k_flag,h_flag,mflag,pflag,unbuffered,Kplus_flag; char noretest; char notruncate; /* turn off truncation of files */ char async_flag,stride_flag,mmapflag,mmapasflag,mmapssflag,mmapnsflag,mmap_mix; char verify = 1; int restf; char sverify = 1; char odsync = 0; char inc_think, Q_flag,OPS_flag; char L_flag=0; char no_copy_flag,include_close,include_flush; char disrupt_flag,compute_flag,xflag,Z_flag, X_flag; int no_unlink = 0; int no_write = 0; int r_traj_flag,w_traj_flag; int mygen; char MS_flag; int advise_op,advise_flag; int direct_flag; int current_client_number; long long chid; int file_lock; unsigned int pattern; long long stride = STRIDE; long long delay,purge,fetchon; off64_t numrecs64 = (off64_t)NUMRECS; long long reclen = RECLEN; long long zsize; long long delay_start,depth; VOLATILE char *stop_flag; /* Used to stop all children */ float compute_time; int multiplier = MULTIPLIER; long long rest_val; #if defined(Windows) HANDLE hand; #endif /******************************************************************************/ /* End of Tele-port zone. */ /******************************************************************************/ /* * Prototypes * Sort of... Full prototypes break non-ansi C compilers. No protos is * a bit sloppy, so the compromise is this. */ void stop_child_send(); void stop_child_send(); void child_send(char *, struct master_command *, int ); void compressible_rand_16_int(int *); void new_touch_dedup(char *, int); /****************************************************************/ /* */ /* MAIN () */ /* */ /****************************************************************/ int negatives, positives; int * main(int argc,char **argv) { long long fileindx,i,tval; long long ind; int ret; FILE *pi; char reply[IBUFSIZE]; unsigned char inp_pat; time_t time_run; char *port,*m,*subarg; int num_child1; int cret; int anwser,bind_cpu; char *evalue; strcpy(tfile,"iozone"); /* Dummy name prefix */ anwser=bind_cpu=0; /* Used to make fread/fwrite do something better than their defaults */ setvbuf( stdout, NULL, _IONBF, (size_t) NULL ); setvbuf( stderr, NULL, _IONBF, (size_t) NULL ); /* Save the master's name */ gethostname(controlling_host_name,100); /* Let user activate mdebug or cdebug via environmental variables */ evalue = (char *)NULL; evalue=(char *)getenv("CDEBUG"); if(evalue) cdebug=atoi(evalue); evalue = (char *)NULL; evalue=(char *)getenv("MDEBUG"); if(evalue) mdebug=atoi(evalue); srand(time(0)); mygen=rand(); /* Pick a random generation number */ /* Try to find the actual VM page size, if possible */ #if defined (solaris) || defined (_HPUX_SOURCE) || defined (linux) || defined(IRIX) || defined (IRIX64) || defined(__NetBSD__) #ifndef __convex_spp page_size=getpagesize(); #endif #endif /* Try to find the actual number of ticks per second */ #ifdef unix sc_clk_tck = clk_tck(); #endif for(ind=0;ind 60) depth=60; */ #ifdef NO_PRINT_LLD sprintf(splash[splash_line++],"\tPOSIX Async I/O (no bcopy). Depth %ld \n",depth); #else sprintf(splash[splash_line++],"\tPOSIX Async I/O (no bcopy). Depth %lld \n",(long long)depth); #endif no_copy_flag=1; async_flag++; k_flag++; break; case 'T': /* Switch to POSIX thread based */ #ifndef NO_THREADS use_thread++; #else printf("\tThreads not supported in this version\n"); exit(2); #endif break; case 'H': /* Use POSIX async_io */ h_flag++; depth = (long long)(atoi(optarg)); if(depth <0) depth=0; /* * Hmmm. many systems fail is strange ways when the maximum * number of async I/Os per user or proc is exceeded. */ /* if(depth > 60) depth=60; */ #ifdef NO_PRINT_LLD sprintf(splash[splash_line++],"\tPOSIX async I/O (with bcopy). Depth %ld\n",depth); #else sprintf(splash[splash_line++],"\tPOSIX async I/O (with bcopy). Depth %lld\n",(long long)depth); #endif async_flag++; break; case 'I': /* Use VXFS direct advisory or O_DIRECT from Linux or AIX , or O_DIRECTIO for TRU64 or Solaris directio */ #ifdef VXFS direct_flag++; sprintf(splash[splash_line++],"\tVxFS advanced feature SET_CACHE, VX_DIRECT enabled\n"); break; #endif #if !defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined(__FreeBSD__) || defined(solaris) || defined(IOZ_macosx) direct_flag++; #if defined __APPLE__ && __MACH__ sprintf(splash[splash_line++],"\tF_NOCACHE=1 - Turns data caching off\n"); #else sprintf(splash[splash_line++],"\tO_DIRECT feature enabled\n"); #endif break; #endif #if defined(TRU64) direct_flag++; sprintf(splash[splash_line++],"\tO_DIRECTIO feature enabled\n"); break; #endif #else #if defined(Windows) sprintf(splash[splash_line++],"\tO_DIRECTIO feature not available in Windows version.\n"); #endif break; #endif case 'B': /* Use mmap file for test file */ sprintf(splash[splash_line++],"\tUsing mmap files\n"); mmapflag++; mmapnsflag++; break; case 'D': /* Use async msync mmap file */ sprintf(splash[splash_line++],"\tUsing msync(MS_ASYNC) on mmap files\n"); mmapflag++; mmapasflag++; mmapnsflag=0; break; case 'G': /* Use msync sync for mmap file */ sprintf(splash[splash_line++],"\tUsing msync(MS_SYNC) on mmap files\n"); mmapssflag++; mmapnsflag=0; break; case 'C': /* show children xfer counts */ Cflag++; break; case 'Q': /* Enable output offset/latency files */ sprintf(splash[splash_line++],"\tOffset/latency files enabled.\n"); Q_flag++; break; case 'x': /* Disable stone_wall */ sprintf(splash[splash_line++],"\tStonewall disabled\n"); xflag++; break; case 'a': /* auto mode */ fetchon=1; purge=0; multi_buffer=0; auto_mode = 1; aflag++; sprintf(splash[splash_line++],"\tAuto Mode\n"); break; case 'c': /* Include close in timing */ include_close++; sprintf(splash[splash_line++],"\tInclude close in write timing\n"); break; case 'e': /* Include fsync in timing */ include_flush++; sprintf(splash[splash_line++],"\tInclude fsync in write timing\n"); break; case 'A': /* auto2 mode. Soon to go away. Please use -az */ fetchon=1; purge=0; multi_buffer=0; auto_mode = 1; aflag++; sprintf(splash[splash_line++],"\tAuto Mode 2. This option is obsolete. Use -az -i0 -i1 \n"); RWONLYflag++; NOCROSSflag++; include_tflag++; /* automatically set WRITER_TEST and READER_TEST */ include_test[WRITER_TEST]++; include_test[READER_TEST]++; break; case 's': /* Set file size */ #ifdef NO_PRINT_LLD sscanf(optarg,"%ld",&kilobytes64); #else sscanf(optarg,"%lld",(long long *)&kilobytes64); #endif if(optarg[strlen(optarg)-1]=='k' || optarg[strlen(optarg)-1]=='K'){ ; } if(optarg[strlen(optarg)-1]=='m' || optarg[strlen(optarg)-1]=='M'){ kilobytes64 = kilobytes64 * 1024; } if(optarg[strlen(optarg)-1]=='g' || optarg[strlen(optarg)-1]=='G'){ kilobytes64 = kilobytes64 *1024 * 1024; } if(kilobytes64 <= 0) kilobytes64=512; s_range[s_count++]=kilobytes64; max_file_size = (off64_t)s_range[s_count-1]; /* Make visable globally */ min_file_size = (off64_t)s_range[0]; /* Make visable globally */ #ifdef NO_PRINT_LLD sprintf(splash[splash_line++],"\tFile size set to %ld kB\n",(long long)kilobytes64); #else sprintf(splash[splash_line++],"\tFile size set to %lld kB\n",(long long)kilobytes64); #endif sflag++; break; case 'l': /* Set lower thread/proc limit */ mint = (long long)(atoi(optarg)); if(mint <= 0) { mint=1; num_child=1; }else num_child=mint; if(mint > (long long)MAXSTREAMS){ printf("Invalid options: maximum streams for "); printf("throughput is MAXSTREAMS\n"); exit(4); } lflag++; trflag++; if(Uflag) { printf("Can not run throughput tests with unmount & remounts.\n"); exit(5); } break; case 'u': /* Set upper thread/proc limit */ maxt = (long long)(atoi(optarg)); if(maxt <= 0) maxt=1; if(maxt > MAXSTREAMS){ printf("Invalid options: maximum streams for "); printf("throughput is MAXSTREAMS\n"); exit(6); } uflag++; trflag++; if(Uflag) { printf("Can not run throughput tests with unmount & remounts.\n"); exit(7); } break; case 'm': /* Use multiple buffers */ fetchon=0; multi_buffer=1; mflag++; mbuffer = (char *) alloc_mem((long long)MAXBUFFERSIZE,(int)0); if(mbuffer == 0) { perror("Memory allocation failed:"); exit(8); } sprintf(splash[splash_line++],"\tMulti_buffer. Work area %d bytes\n", MAXBUFFERSIZE); break; case 'M': /* Report machine name and OS */ bzero(reply,sizeof(reply)); pi=popen("uname -a", "r"); if(pi == (FILE *)0) { sprintf(splash[splash_line++],"\n\tError using popen() on uname\n"); sprintf(splash[splash_line++],"\t-M option suppressed.\n"); } else { junk=fread(reply,IBUFSIZE-1,1,pi); pclose(pi); m=reply; while(*m) /* Strip new line */ { if(*m=='\n') *m=0; else m++; } sprintf(splash[splash_line++],"\n\tMachine = %s\n",reply); } break; case 'P': /* Set beginning processor for binding. */ #ifndef NO_THREADS #if defined(_HPUX_SOURCE) || defined(linux) #if defined(_HPUX_SOURCE) num_processors= pthread_num_processors_np(); #else num_processors = sysconf(_SC_NPROCESSORS_ONLN); #endif begin_proc = atoi(optarg); if(begin_proc < 0) begin_proc=0; if(begin_proc > num_processors) begin_proc=0; sprintf(splash[splash_line++],"\tBinding of processors beginning with %d \n",begin_proc); ioz_processor_bind++; #else sprintf(splash[splash_line++],"\tProcessor binding not available in this version\n"); #endif #endif break; case 'p': /* purge the processor cache */ sprintf(splash[splash_line++],"\tPurge Mode On\n"); fetchon=0; pflag++; purge=1; break; case 'h': /* show help */ hflag++; show_help(); exit(0); break; case 'E': /* Extended testing for pread/pwrite... */ Eflag++; break; case 'R': /* Generate Excel compatible Report */ Rflag++; sprintf(splash[splash_line++],"\tExcel chart generation enabled\n"); break; case 'o': /* Open OSYNC */ sprintf(splash[splash_line++],"\tSYNC Mode. \n"); oflag++; break; case 'O': /* Report in Ops/sec instead of kB/sec */ sprintf(splash[splash_line++],"\tOPS Mode. Output is in operations per second.\n"); OPS_flag++; break; case 'N': /* Report in usec/op */ sprintf(splash[splash_line++],"\tMicroseconds/op Mode. Output is in microseconds per operation.\n"); MS_flag++; break; case 'V': /* Turn on Verify every byte */ sverify=0; inp_pat = (char)(atoi(optarg)); if(inp_pat == 0) inp_pat = PATTERN; pattern = ((inp_pat << 24) | (inp_pat << 16) | (inp_pat << 8) | inp_pat); verify=1; sprintf(splash[splash_line++],"\tVerify Mode. Pattern %x\n",pattern); sprintf(splash[splash_line++],"\tPerformance measurements are invalid in this mode.\n"); break; case 'S': /* Set the processor cache size */ cache_size = (long)(atoi(optarg)*1024); if(cache_size == 0) cache_size = MY_CACHE_SIZE; break; case 'L': /* Set processor cache line size */ cache_line_size = (long)(atoi(optarg)); if(cache_line_size == 0) cache_line_size = MY_CACHE_LINE_SIZE; break; case 'f': /* Specify the file name */ if(mfflag) { printf("invalid options: -f and -F are mutually exclusive\n"); exit(10); } fflag++; strcpy(filename,optarg); sprintf(dummyfile[0],"%s.DUMMY",optarg); break; case 'b': /* Specify the biff file name */ Rflag++; bif_flag++; strcpy(bif_filename,optarg); break; case 'F': /* Specify multiple file names for -t */ mfflag++; F_flag++; if(fflag) { printf("invalid options: -f and -F are mutually exclusive\n"); exit(11); } if(!trflag) { printf("invalid options: must specify -t N before -F\n"); exit(12); } optind--; for(fileindx=0;fileindx argc) { #ifdef NO_PRINT_LLD printf("invalid options: not enough filenames for %ld streams\n",num_child); #else printf("invalid options: not enough filenames for %lld streams\n",num_child); #endif exit(13); } } break; case 'r': /* Specify the record size to use */ rflag++; reclen = ((long long)(atoll(optarg))*1024LL); if(optarg[strlen(optarg)-1]=='k' || optarg[strlen(optarg)-1]=='K'){ reclen = (long long)(1024LL * atoll(optarg)); } if(optarg[strlen(optarg)-1]=='m' || optarg[strlen(optarg)-1]=='M'){ reclen = (long long)(1024LL * 1024LL * atoll(optarg)); } if(optarg[strlen(optarg)-1]=='g' || optarg[strlen(optarg)-1]=='G'){ reclen = (long long)(1024LL * 1024LL * 1024LL *(long long)atoll(optarg)); } if(reclen <= 0) reclen=(long long)4096; r_range[r_count++]=reclen; max_rec_size = (off64_t)r_range[r_count-1]; /* Make visable globally */ min_rec_size = (off64_t)r_range[0]; /* Make visable globally */ #ifdef NO_PRINT_LLD sprintf(splash[splash_line++],"\tRecord Size %ld kB\n",reclen/1024); #else sprintf(splash[splash_line++],"\tRecord Size %lld kB\n",reclen/1024); #endif if(max_rec_size > MAXBUFFERSIZE) { #ifdef NO_PRINT_LLD printf("Error: maximum record size %ld kB is greater than maximum buffer size %ld kB\n ", max_rec_size/1024, MAXBUFFERSIZE/1024); #else printf("Error: maximum record size %lld kB is greater than maximum buffer size %lld kB\n ", (long long)(max_rec_size/1024LL), (long long)MAXBUFFERSIZE/1024LL); #endif exit(23); } break; case 'J': /* Specify the compute time in millisecs */ compute_time = (float)(atoi(optarg)); compute_time=compute_time/1000; if(compute_time < (float)0) compute_time=(float)0; else compute_flag=1; jflag++; break; case 'j': /* Specify the stride in records */ stride = (long long)(atoi(optarg)); if(stride < 0) stride=0; stride_flag=1; break; case 't': /* Specify the number of children to run */ num_child1=(atoi(optarg)); num_child = (long long)num_child1; if(num_child > (long long)MAXSTREAMS) { printf("invalid options: maximum streams for throughput is MAXSTREAMS\n"); #ifdef NO_PRINT_LLD printf("Numchild %ld %s\n",num_child,optarg); #else printf("Numchild %lld %s\n",num_child,optarg); #endif exit(14); } if(num_child <= 0) num_child = 8; if(num_child == 0) num_child=1; t_range[t_count++]=num_child; maxt = (maxt>num_child?maxt:num_child); trflag++; if(Uflag) { printf("Can not run throughput tests with unmount & remounts.\n"); exit(15); } #ifdef NO_THREADS if(burst_size_kb_64 != -1 && burst_sleep_duration_msec != -1) { printf("Can not run throughput tests with burst option.\n"); exit(100); } #endif break; case 'd': /* Specify the delay of children to run */ delay_start = (long long)(atoi(optarg)); if(delay_start < 0) delay_start=0; break; case 'i': /* Specify specific tests */ tval=(long long)(atoi(optarg)); if(tval < 0) tval=0; #ifndef HAVE_PREAD if(tval > RANDOM_MIX_TEST) { printf("\tPread tests not available on this operating system.\n"); exit(183); } #endif if(tval > (long long)(sizeof(func)/sizeof(char *))) { tval=0; sprintf(splash[splash_line++],"\tSelected test not available on the version.\n"); } include_test[tval]++; include_tflag++; break; case 'v': /* Show version information */ for(ind=0; strlen(head1[ind]); ind++) { printf("%s\n", head1[ind]); } exit(0); break; case 'U': /* Specify the dev name for umount/mount*/ Uflag++; strcpy(mountname,optarg); if(trflag) { printf("Can not run throughput tests with unmount & remounts.\n"); exit(16); } break; case 'w': /* Do not unlink files */ sprintf(splash[splash_line++],"\tSetting no_unlink\n"); no_unlink = 1; break; case 'Z': /* Turn on the mmap and file I/O mixing */ sprintf(splash[splash_line++],"\tEnable mmap & file I/O mixing.\n"); mmap_mix = 1; break; case 'W': /* Read/Write with file locked */ file_lock=1; sprintf(splash[splash_line++],"\tLock file when reading/writing.\n"); break; case 'K': /* Cause disrupted read pattern */ disrupt_flag=1; sprintf(splash[splash_line++],"\tDisrupted read patterns selected.\n"); break; case 'X': /* Open write telemetry file */ compute_flag=1; sverify=2; /* touch lightly */ w_traj_flag=1; strcpy(write_traj_filename,optarg); traj_vers(); w_traj_size(); sprintf(splash[splash_line++],"\tUsing write telemetry file \"%s\"\n", write_traj_filename); w_traj_fd=open_w_traj(); if(w_traj_fd == (FILE *)0) exit(200); break; case 'Y': /* Open Read telemetry file */ compute_flag=1; sverify=2; /* touch lightly */ r_traj_flag=1; strcpy(read_traj_filename,optarg); sprintf(splash[splash_line++],"\tUsing read telemetry file \"%s\"\n", read_traj_filename); traj_vers(); r_traj_size(); r_traj_fd=open_r_traj(); if(r_traj_fd == (FILE*) 0) exit(200); break; case 'n': /* Set min file size for auto mode */ nflag=1; minimum_file_size = (off64_t)atoll(optarg); if(optarg[strlen(optarg)-1]=='k' || optarg[strlen(optarg)-1]=='K'){ ; } if(optarg[strlen(optarg)-1]=='m' || optarg[strlen(optarg)-1]=='M'){ minimum_file_size = (long long)(1024LL * atoll(optarg)); } if(optarg[strlen(optarg)-1]=='g' || optarg[strlen(optarg)-1]=='G'){ minimum_file_size = (long long)(1024LL * 1024LL * (long long)atoll(optarg)); } if(minimum_file_size < RECLEN_START/1024) minimum_file_size=(off64_t)(RECLEN_START/1024); if(minimum_file_size < page_size/1024) minimum_file_size=(off64_t)(page_size/1024); #ifdef NO_PRINT_LLD sprintf(splash[splash_line++],"\tUsing minimum file size of %ld kilobytes.\n",(long long)minimum_file_size); #else sprintf(splash[splash_line++],"\tUsing minimum file size of %lld kilobytes.\n",(long long)minimum_file_size); #endif break; case 'g': /* Set maximum file size for auto mode */ gflag=1; maximum_file_size = (off64_t)atoll(optarg); if(optarg[strlen(optarg)-1]=='k' || optarg[strlen(optarg)-1]=='K'){ ; } if(optarg[strlen(optarg)-1]=='m' || optarg[strlen(optarg)-1]=='M'){ maximum_file_size = (long long)(1024LL * atoll(optarg)); } if(optarg[strlen(optarg)-1]=='g' || optarg[strlen(optarg)-1]=='G'){ maximum_file_size = (long long)(1024LL * 1024LL * (long long)atoll(optarg)); } if(maximum_file_size < RECLEN_START/1024LL) maximum_file_size=(off64_t)(RECLEN_START/1024LL); #ifdef NO_PRINT_LLD sprintf(splash[splash_line++],"\tUsing maximum file size of %ld kilobytes.\n",(long long)maximum_file_size); #else sprintf(splash[splash_line++],"\tUsing maximum file size of %lld kilobytes.\n",(long long)maximum_file_size); #endif break; case 'z': /* Set no cross over */ sprintf(splash[splash_line++],"\tCross over of record size disabled.\n"); NOCROSSflag=1; break; case 'y': /* Set min record size for auto mode */ yflag=1; min_rec_size = ((long long)(atoll(optarg))*1024); if(optarg[strlen(optarg)-1]=='k' || optarg[strlen(optarg)-1]=='K'){ min_rec_size = (long long)(1024LL * atoll(optarg)); } if(optarg[strlen(optarg)-1]=='m' || optarg[strlen(optarg)-1]=='M'){ min_rec_size = (long long)(1024LL * 1024LL * atoll(optarg)); } if(optarg[strlen(optarg)-1]=='g' || optarg[strlen(optarg)-1]=='G'){ min_rec_size = (long long)(1024LL * 1024LL * 1024LL *(long long)atoll(optarg)); } if(min_rec_size <= 0) min_rec_size=(long long)RECLEN_START; #ifdef NO_PRINT_LLD sprintf(splash[splash_line++],"\tUsing Minimum Record Size %ld kB\n", min_rec_size/1024LL); #else sprintf(splash[splash_line++],"\tUsing Minimum Record Size %lld kB\n", min_rec_size/1024LL); #endif break; case 'q': /* Set max record size for auto mode */ qflag=1; max_rec_size = ((long long)(atoll(optarg))*1024); if(optarg[strlen(optarg)-1]=='k' || optarg[strlen(optarg)-1]=='K'){ max_rec_size = (long long)(1024LL * atoll(optarg)); } if(optarg[strlen(optarg)-1]=='m' || optarg[strlen(optarg)-1]=='M'){ max_rec_size = (long long)(1024LL * 1024LL * atoll(optarg)); } if(optarg[strlen(optarg)-1]=='g' || optarg[strlen(optarg)-1]=='G'){ max_rec_size = (long long)(1024LL * 1024LL * 1024LL *(long long)atoll(optarg)); } if(max_rec_size <= 0) min_rec_size=(long long)RECLEN_END; if(max_rec_size > MAXBUFFERSIZE) { #ifdef NO_PRINT_LLD printf("Error: maximum record size %ld kB is greater than maximum buffer size %ld kB\n ", max_rec_size/1024, MAXBUFFERSIZE/1024); #else printf("Error: maximum record size %lld kB is greater than maximum buffer size %lld kB\n ", (long long)(max_rec_size/1024LL), (long long)MAXBUFFERSIZE/1024LL); #endif exit(23); } #ifdef NO_PRINT_LLD sprintf(splash[splash_line++],"\tUsing Maximum Record Size %ld kB\n", max_rec_size/1024); #else sprintf(splash[splash_line++],"\tUsing Maximum Record Size %lld kB\n", max_rec_size/1024); #endif break; /* * The + operator is for the new extended options mechanism * Syntax is -+ followed by option leter, and if the optino * takes an operand then it is implemented below. An example * -+a arg is shown below. This is a sub option with an argument. * -+b is shown below. This is a sub option with no argument. */ case '+': /* percent to make data compressible */ switch (*((char *)optarg)) { case 'a':/* Max value for random byte [0,255] */ subarg = argv[optind++]; if(subarg==(char *)0) { printf("-+a takes an operand !!\n"); exit(200); } zero_pct = atoi(subarg); if(zero_pct >100) zero_pct = 100; sprintf(splash[splash_line++],"\tZero Percent %d\n ",zero_pct); break; case 'Q': /* Dedup granule size */ subarg = argv[optind++]; if(subarg==(char *)0) { printf("-+Q takes an operand !!\n"); exit(200); } dedup_granule_size = atoi(subarg); if(dedup_granule_size <0) dedup_granule_size = 0; sprintf(splash[splash_line++],"\tDedup granule size %d\n",dedup_granule_size); dedup_unit_step = dedup_granule_size >> 2; break; case 'b': /* burst */ #ifdef NO_THREADS if(trflag) { printf("Can not run throughput tests with burst option.\n"); exit(100); } #endif subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+b takes an operand !!\n"); exit(200); } if (strchr(subarg,',') == NULL) { printf("-+b operand is of the format #,# (burst size (K/M/G) ,mili-second) !!\n"); exit(400); } burst_sleep_duration_msec = atoi(strchr(subarg,',') + 1); if (burst_sleep_duration_msec == 0) { printf("-+b cannot parse sleep duration !!\n"); exit(400); } *strchr(subarg,',') = '\0'; #ifdef NO_PRINT_LLD sscanf(subarg,"%ld",(long long *)&burst_size_kb_64); #else sscanf(subarg,"%lld",(long long *)&burst_size_kb_64); #endif if(subarg[strlen(subarg)-1]=='k' || subarg[strlen(subarg)-1]=='K'){ ; } if(subarg[strlen(subarg)-1]=='m' || subarg[strlen(subarg)-1]=='M'){ burst_size_kb_64 = burst_size_kb_64 * 1024; } if(subarg[strlen(optarg)-1]=='g' || subarg[strlen(optarg)-1]=='G'){ burst_size_kb_64 = burst_size_kb_64 * 1024 * 1024; } if (burst_size_kb_64 <= 0) { printf("-+b cannot parse burst size '%s'!!\n",subarg); exit(400); } *(subarg + strlen(subarg)) = ','; /* so it will be printed when dumping the argsuments */ break; case 'F': /* Example: Does not have an argument */ del_flag = 1; break; case 'M': /* Speical dedup+compress option. Experimental */ N_special = 1; sprintf(splash[splash_line++],"\tDedup+compress enabled\n "); break; case 'R': /* Speical Windows option to read filelist from a input file. Experimental */ mfflag++; subarg = argv[optind++]; if(subarg==(char *)0) { printf("-+R takes an operand !!\n"); exit(200); } sprintf(splash[splash_line++],"\tFilenames from a file option enabled. File: %s\n ",subarg); /* filename should be used instead of filelist */ struct stat outbuf; int result; result = stat(subarg, &outbuf); if(result == -1) { printf("Failed to stat the iozone input file: %s\n",argv[optind]); exit(errno); } else { /* read the input file and populate the filearray */ int fileindx = 0; FILE * fp; char * lbuffer; fp = fopen(subarg, "r"); while ( 1 ) { lbuffer=malloc(MAXNAMESIZE); memset(lbuffer,0,MAXNAMESIZE); if(fgets(lbuffer,MAXNAMESIZE,fp) == 0) break; if(strlen(lbuffer) > 0) { /* strip newline */ if(lbuffer[strlen(lbuffer)-1] == '\n') lbuffer[strlen(lbuffer)-1] = 0; filearray[fileindx]= lbuffer; fileindx++; } } fclose(fp); if(fileindx > num_child) { #ifdef NO_PRINT_LLD printf("invalid options: not enough filenames for %ld streams\n",num_child); #else printf("invalid options: not enough filenames for %lld streams\n",num_child); #endif exit(13); } } break; case 'c': /* Argument is the controlling host name */ /* I am a client for distributed Iozone */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+c takes an operand !!\n"); exit(200); } strcpy(controlling_host_name,subarg); distributed=1; client_iozone=1; master_iozone=0; break; case 'h': /* Argument is the controlling host name */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+h takes an operand !!\n"); exit(200); } strcpy(controlling_host_name,subarg); sprintf(splash[splash_line++],"\tHostname = %s\n",controlling_host_name); break; case 'm': /* I am the controlling process for distributed Iozone */ /* Does not have an argument */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+m takes an operand. ( filename )\n"); exit(201); } strcpy(client_filename,subarg); ret=get_client_info(); if(ret <= 0) { printf("Error reading client file\n"); exit(178); } clients_found=ret; distributed=1; master_iozone=1; client_iozone=0; sprintf(splash[splash_line++],"\tNetwork distribution mode enabled.\n"); break; case 'N': /* turn off truncating the file before write test */ notruncate = 1; break; case 'u': /* Set CPU utilization output flag */ cpuutilflag = 1; /* only used if R(eport) flag is also set */ get_rusage_resolution(); sprintf(splash[splash_line++],"\tCPU utilization Resolution = %5.3f seconds.\n",cputime_res); sprintf(splash[splash_line++],"\tCPU utilization Excel chart enabled\n"); break; case 's': /* Clients operate in silent mode. */ /* Does not have an argument */ silent=1; break; case 'd': /* Diagnostics mode */ sprintf(splash[splash_line++],"\t>>> I/O Diagnostic mode enabled. <<<\n"); sprintf(splash[splash_line++],"\tPerformance measurements are invalid in this mode.\n"); diag_v=1; sverify=0; break; case 'e': /* Sparse mode */ sprintf(splash[splash_line++],"\t>>> I/O Sparse mode enabled. <<<\n"); sparse_mode = 1; break; case 'x': /* Argument is the multiplier for rec size and file size */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+c takes an operand !!\n"); exit(200); } multiplier = atoi(subarg); if(multiplier <=1) multiplier = 2; break; case 'i': /* Argument is the host port */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+i takes an operand !!\n"); exit(200); } controlling_host_port = atoi(subarg); break; case 'p': /* Argument is the percentage read */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+p takes an operand !!\n"); exit(200); } pct_read = atoi(subarg); if(pct_read < 1) pct_read = 1; if(pct_read >=100) pct_read = 100; sprintf(splash[splash_line++],"\tPercent read in mix test is %d\n",pct_read); break; case 't': /* Speed code activated */ speed_code=1; break; #if defined(_HPUX_SOURCE) || defined(linux) || defined(solaris) case 'r': /* Read sync too */ read_sync=1; sprintf(splash[splash_line++],"\tRead & Write sync mode active.\n"); break; #endif #ifndef NO_MADVISE case 'A': /* Argument is madvise selector */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+A take an operand !!\n"); exit(200); } advise_flag=1; advise_op=atoi(subarg); sprintf(splash[splash_line++],"\tMadvise enabled: %d\n",advise_op); break; #endif case 'n': /* Set no-retest */ noretest = 1; sprintf(splash[splash_line++],"\tNo retest option selected\n"); break; case 'k': /* Constant aggregate data set size */ aggflag=1; break; case 'q': /* Argument is the rest time between tests in seconds */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+q takes an operand !!\n"); exit(200); } rest_val = (long long)atoi(subarg); if(rest_val <=0) rest_val = 0; restf=1; sprintf(splash[splash_line++],"\tDelay %d seconds between tests enabled.\n",atoi(subarg)); break; #if defined(O_DSYNC) case 'D': /* O_DSYNC mode */ sprintf(splash[splash_line++],"\t>>> O_DSYNC mode enabled. <<<\n"); odsync=1; break; #endif case 'l': /* Record locking mode */ sprintf(splash[splash_line++],"\t>>> Record locking mode enabled. <<<\n"); rlocking=1; break; case 'L': /* Record locking mode shared files*/ sprintf(splash[splash_line++],"\t>>> Record locking, shared file mode enabled. <<<\n"); share_file=1; rlocking=1; break; case 'J': /* Thinktime is included in thrhoughput */ sprintf(splash[splash_line++],"\t>>> Think time is included in throughput cal. <<<\n"); inc_think=1; break; case 'V': /* No Record locking shared files*/ sprintf(splash[splash_line++],"\t>>> Shared file mode enabled. <<<\n"); share_file=1; break; case 'B': /* Sequential mix */ sprintf(splash[splash_line++],"\t>>> Sequential Mixed workload. <<<\n"); seq_mix=1; break; /* Use an existing user file, that does not contain Iozone's pattern. Use file for testing, but read only, and no delete at the end of the test. Also, no pattern verification, but do touch the pages. */ case 'E': sprintf(splash[splash_line++],"\t>>> No Verify mode. <<<\n"); sverify=2; no_unlink=1; no_write=1; break; case 'T': /* Time stamps on */ L_flag=1; break; case 'X': /* Short circuit test mode */ X_flag = 1; sverify=1; verify=1; inp_pat = 0xBB; pattern = ((inp_pat << 24) | (inp_pat << 16) | (inp_pat << 8) | inp_pat); sprintf(splash[splash_line++],"\tShort circuit mode. For\n"); sprintf(splash[splash_line++],"\t filesystem development testing ONLY !\n"); break; case 'Z': /* Compatibility mode for 0xA5 */ Z_flag = 1; sverify=1; verify=1; inp_pat = 0xA5; pattern = ((inp_pat << 24) | (inp_pat << 16) | (inp_pat << 8) | inp_pat); sprintf(splash[splash_line++],"\tUsing old data sets.\n"); sprintf(splash[splash_line++],"\t Performance measurements may be invalid in this\n"); sprintf(splash[splash_line++],"\t mode due to published hack.\n"); break; #if defined(Windows) case 'U': /* Windows only Unbufferd I/O */ unbuffered=1; sprintf(splash[splash_line++],"\tUnbuffered Windows API usage. >>> Very Experimental <<<\n"); break; #endif case 'K': /* Sony special for manual control of test 8 */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+K takes an operand !!\n"); exit(204); } Kplus_readers = (int)atoi(subarg); if(Kplus_readers <=0) Kplus_readers = 1; Kplus_flag=1; sprintf(splash[splash_line++],"\tManual control of test 8. >>> Very Experimental. Sony special <<<\n"); break; case 'w': /* Argument is the percent of dedup */ /* Sets size of dedup region across files */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+w takes an operand !!\n"); exit(200); } dedup = atoi(subarg); if(dedup <=0) dedup = 0; if(dedup >100) dedup = 100; dedup_flag = 1; sprintf(splash[splash_line++],"\tDedup activated %d percent.\n",dedup); break; case 'y': /* Argument is the percent of interior dedup */ /* Sets size of dedup region within and across files */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+y takes an operand !!\n"); exit(200); } dedup_interior = atoi(subarg); if(dedup_interior <0) dedup_interior = 0; if(dedup_interior >100) dedup_interior = 100; dedup_iflag = 1; sprintf(splash[splash_line++],"\tDedup within & across %d percent.\n",dedup_interior); break; case 'C': /* Argument is the percent of dedup within & !across */ /* Sets size of dedup region within and !across files */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+C takes an operand !!\n"); exit(200); } dedup_compress = atoi(subarg); if(dedup_compress <0) dedup_compress = 0; if(dedup_compress >100) dedup_compress = 100; dedup_bflag = 1; sprintf(splash[splash_line++],"\tDedup within %d percent.\n",dedup_compress); break; case 'S': /* Argument is the seed for dedup */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+S takes an operand !!\n"); exit(200); } dedup_mseed = atoi(subarg); if(dedup_mseed ==0) dedup_mseed = 1; sprintf(splash[splash_line++],"\tDedup manual seed %d .\n",dedup_mseed); break; case 'W': /* Argument is the child_skew for dedup */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+W takes an operand !!\n"); exit(200); } chid_skew = atoi(subarg); sprintf(splash[splash_line++],"\tDedup chid_skew %d .\n",chid_skew); break; case 'H': /* Argument is hostname of the PIT */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+H takes operand !!\n"); exit(200); } strcpy(pit_hostname,subarg); sprintf(splash[splash_line++],"\tPIT_host %s\n",pit_hostname); break; case 'P': /* Argument is port of the PIT */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+P takes operand !!\n"); exit(200); } strcpy(pit_service,subarg); sprintf(splash[splash_line++],"\tPIT_port %s\n",pit_service); break; case 'z': /* Enable hist summary*/ hist_summary=1; sprintf(splash[splash_line++],"\tHistogram summary enabled.\n"); break; case 'O': /* Argument is the Op rate */ subarg=argv[optind++]; if(subarg==(char *)0) { printf("-+O takes an operand !!\n"); exit(200); } op_rate = atoi(subarg); if(op_rate <= 0) op_rate = 1; op_rate_flag = 1; sprintf(splash[splash_line++],"\tRate control active %d Ops/sec .\n",op_rate); break; default: printf("Unsupported Plus option -> %s <-\n",optarg); exit(255); break; } break; default: printf("Unsupported option -> %s <-\n",optarg); exit(255); } } /********************************************************/ /* Allocate and align buffer with beginning of the */ /* on chip data cache. */ /********************************************************/ buffer = (char *) alloc_mem((long long)(MAXBUFFERSIZE + (2 * cache_size)),(int)0); if(buffer == 0) { perror("Memory allocation failed:"); exit(1); } #ifdef _64BIT_ARCH_ buffer = (char *) ((long long )(buffer + cache_size ) & ~(cache_size-1)); #else buffer = (char *) ((long)(buffer + cache_size ) & ~((long)cache_size-1)); #endif mainbuffer = buffer; /* de-dup input buf */ buffer1 = (char *) alloc_mem((long long)(MAXBUFFERSIZE + (2 * cache_size)),(int)0); if(buffer1 == 0) { perror("Memory allocation failed:"); exit(1); } #ifdef _64BIT_ARCH_ buffer1 = (char *) ((long long )(buffer1 + cache_size ) & ~(cache_size-1)); #else buffer1 = (char *) ((long)(buffer1 + cache_size ) & ~((long)cache_size-1)); #endif dedup_ibuf = buffer1; dedup_temp = mainbuffer; touch_dedup(buffer1, MAXBUFFERSIZE); base_time=(long)time_so_far(); get_resolution(); /* Get clock resolution */ if(speed_code) { do_speed_check(client_iozone); exit(0); } if(r_count > 1) { aflag=1; rflag=0; NOCROSSflag=1; } if(s_count > 1) { aflag=1; sflag=0; NOCROSSflag=1; } /* * If not in silent mode then display the splash screen. */ for(i=0;i clients_found) { printf("You can not specify more threads/processes than you have in the client file list\n"); exit(202); } } if(!OPS_flag && !MS_flag) { if(!silent) printf("\tOutput is in kBytes/sec\n"); } if (min_rec_size > max_rec_size) { #ifdef NO_PRINT_LLD printf("Error: minimum record size %ld kB is greater than maximum record size %ld kB\n ", min_rec_size/1024, max_rec_size/1024); #else printf("Error: minimum record size %lld kB is greater than maximum record size %lld kB\n ", min_rec_size/1024, max_rec_size/1024); #endif exit(23); } orig_min_rec_size=min_rec_size; orig_max_rec_size=max_rec_size; /* * No telemetry files... just option selected */ if(compute_flag && jflag && !(r_traj_flag || w_traj_flag)) if(!silent) printf("\tCompute time %f seconds for reads and writes.\n",compute_time); /* * Read telemetry file and option selected */ if(compute_flag && r_traj_flag && !w_traj_flag) { if(r_traj_items==3) { if(!silent) printf("\tCompute time from telemetry files for reads.\n"); } else { if(jflag) if(!silent) printf("\tCompute time %f seconds for reads.\n",compute_time); } if(jflag) if(!silent) printf("\tCompute time %f seconds for writes.\n",compute_time); } /* * Write telemetry file and option selected */ if(compute_flag && !r_traj_flag && w_traj_flag) { if(w_traj_items==3) { if(!silent) printf("\tCompute time from telemetry files for writes.\n"); } else { if(jflag) if(!silent) printf("\tCompute time %f seconds for writes.\n",compute_time); } if(jflag) if(!silent) printf("\tCompute time %f seconds for reads.\n",compute_time); } if(compute_flag && r_traj_flag && w_traj_flag && jflag) { if(r_traj_items==3) { if(!silent) printf("\tCompute time from telemetry files for reads.\n"); } else { if(!silent) printf("\tCompute time %f seconds for reads.\n",compute_time); } if(w_traj_items==3) { if(!silent) printf("\tCompute time from telemetry files for writes.\n"); } else { if(!silent) printf("\tCompute time %f seconds for writes.\n",compute_time); } } if(compute_flag && r_traj_flag && w_traj_flag && !jflag) { if(r_traj_items==3) { if(!silent) printf("\tCompute time from telemetry files for reads.\n"); } else { if(!silent) printf("\tNo compute time for reads.\n"); } if(w_traj_items==3) { if(!silent) printf("\tCompute time from telemetry files for writes.\n"); } else { if(!silent) printf("\tNo compute time for writes.\n"); } } /* Enforce only write,rewrite,read,reread */ if(w_traj_flag || r_traj_flag) { for(i=2;i<(long long)(sizeof(func)/sizeof(char *));i++) { if(seq_mix && (i==8)) ; else include_test[i] = 0; } } if(r_traj_flag) { if(include_test[READER_TEST] == 0) { include_test[WRITER_TEST]=1; include_test[READER_TEST]=1; include_tflag=1; } } if(w_traj_flag) { if(include_test[WRITER_TEST] == 0) { include_test[WRITER_TEST]=1; include_tflag=1; } } if(w_traj_flag && w_traj_fsize != 0) kilobytes64=w_traj_fsize/1024; if(r_traj_flag && r_traj_fsize != 0) kilobytes64=r_traj_fsize/1024; if( sverify==0 && (w_traj_flag || r_traj_flag)) { printf("\n\tFull verification not supported in telemetry mode.\n\n"); exit(17); } ; if(disrupt_flag &&(w_traj_flag || r_traj_flag) ) { printf("\n\tDisrupt not supported in telemetry mode.\n\n"); exit(17); } if(aflag &&(w_traj_flag || r_traj_flag) ) { printf("\n\tAuto mode not supported in telemetry mode.\n"); printf("\tTry: -i 0 -i 1 \n\n"); exit(17); } if(sflag && w_traj_flag ) { printf("\n\tSize of file is determined by telemetry file.\n\n"); exit(17); } if(rflag && w_traj_flag ) { printf("\n\tRecord size of file is determined by telemetry file.\n\n"); exit(17); } if(stride_flag && (w_traj_flag || r_traj_flag)) { printf("\n\tStride size is determined by telemetry file.\n\n"); exit(17); } if(trflag && MS_flag) { printf("\n\tMicrosecond mode not supported in throughput mode.\n\n"); exit(17); } if (trflag /* throughput mode, don't allow auto-mode options: */ && (auto_mode || aflag || yflag || qflag || nflag || gflag)) { printf("\n\tCan not mix throughput mode and auto-mode flags.\n\n"); exit(17); } if(fflag && trflag) { printf("\n\tYou must use -F when using multiple threads or processes.\n\n"); exit(17); } if(aflag && mfflag) { printf("\n\tYou must use -f when using auto mode.\n\n"); exit(17); } if(async_flag && mmapflag) { printf("\n\tSorry ... Only mmap or async but not both\n\n"); exit(18); } #ifndef ASYNC_IO if(async_flag) { printf("\n\tSorry ... This version does not support async I/O\n\n"); exit(19); } #endif if(no_write) { if(!include_tflag) { printf("You must specify which tests ( -i # ) when using -+E\n"); exit(19); } } if(include_tflag) { for(i=0;i<(long long)(sizeof(func)/sizeof(char *));i++) if(include_test[i]) include_mask|=(long long)(1<> %llx",include_mask); HERE */ } if(no_write) /* Disable if any writer would disturbe existing file */ { if(include_test[0] || include_test[4] || include_test[6] || include_test[8] || include_test[9] || include_test[11]) { printf("You must disable any test that writes when using -+E\n"); exit(20); } } if(no_write) /* User must specify the existing file name */ { if(!(fflag | mfflag)) { printf("You must use -f or -F when using -+E\n"); exit(20); } } if(h_flag && k_flag) { printf("\n\tCan not do both -H and -k\n"); exit(20); } if((dedup_flag | dedup_iflag) && diag_v) { printf("\n\tCan not do both -+d and -+w\n"); exit(20); } if(!aflag && !rflag) max_rec_size=min_rec_size; init_record_sizes(min_rec_size,max_rec_size); if(!silent) printf("\tTime Resolution = %1.6f seconds.\n",time_res); #ifdef NO_PRINT_LLD if(!silent) printf("\tProcessor cache size set to %ld kBytes.\n",cache_size/1024); if(!silent) printf("\tProcessor cache line size set to %ld bytes.\n",cache_line_size); if(!silent) printf("\tFile stride size set to %ld * record size.\n",stride); #else if(!silent) printf("\tProcessor cache size set to %ld kBytes.\n",cache_size/1024); if(!silent) printf("\tProcessor cache line size set to %ld bytes.\n",cache_line_size); if(!silent) printf("\tFile stride size set to %lld * record size.\n",stride); #endif if (burst_size_kb_64 != -1 && !silent) #ifdef NO_PRINT_LLD printf("\tBurst size set to %ld Kbytes.\n\tBurst sleep duration set to %ld msec\n", (long long)burst_size_kb_64, (long long)burst_sleep_duration_msec); #else printf("\tBurst size set to %lld Kbytes.\n\tBurst sleep duration set to %lld msec\n", (long long)burst_size_kb_64, (long long)burst_sleep_duration_msec); #endif if(!rflag) reclen=(long long)4096; if(uflag && !lflag) num_child=mint = 1; if(lflag && !uflag) maxt = mint; if(use_thread) port="thread"; else port="process"; if(lflag || uflag){ #ifdef NO_PRINT_LLD if(!silent) printf("\tMin %s = %ld \n",port,mint); if(!silent) printf("\tMax %s = %ld \n",port,maxt); #else if(!silent) printf("\tMin %s = %lld \n",port,mint); if(!silent) printf("\tMax %s = %lld \n",port,maxt); #endif } if(trflag) { if(num_child > 1) { if(use_thread) { port="threads"; } else { port="processes"; } } #ifdef NO_PRINT_LLD if(!silent) printf("\tThroughput test with %ld %s\n", num_child,port); #else if(!silent) printf("\tThroughput test with %lld %s\n", num_child,port); #endif } numrecs64 = (long long)(kilobytes64*1024)/reclen; if (reclen > (long long)MAXBUFFERSIZE) { #ifdef NO_PRINT_LLD printf("Error: Maximum record length is %ld bytes\n", MAXBUFFERSIZE); #else printf("Error: Maximum record length is %lld bytes\n", (long long)MAXBUFFERSIZE); #endif exit(21); } if (reclen < (long long)MINBUFFERSIZE) { #ifdef NO_PRINT_LLD printf("Error: Minimum record length is %ld bytes\n", MINBUFFERSIZE); #else printf("Error: Minimum record length is %lld bytes\n", (long long)MINBUFFERSIZE); #endif exit(22); } /* Only bzero or fill that which you will use. The buffer is very large */ if(verify ) { fill_buffer((char *)buffer,l_min(reclen,(long long)cache_size),(long long)pattern,(char)sverify,(long long)0); if(pflag) fill_buffer((char *)pbuffer,l_min(reclen,(long long)cache_size),(long long)pattern,(char)sverify,(long long)0); if(mflag) fill_buffer((char *)mbuffer,l_min(reclen,(long long)cache_size),(long long)pattern,(char)sverify,(long long)0); } else { bzero(buffer,(size_t)l_min(reclen,(long long)cache_size)); } #ifndef NO_THREADS #if defined( _HPUX_SOURCE ) || defined ( linux ) if(ioz_processor_bind) { bind_cpu=begin_proc; #if defined( _HPUX_SOURCE ) pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); #else cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(bind_cpu, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); #endif my_nap(40); /* Switch to new cpu */ } #endif #endif orig_size=kilobytes64; if(trflag){ (void)multi_throughput_test(mint,maxt); goto out; } if(trflag && (mint == maxt)){ auto_mode=0; throughput_test(); goto out; } if (aflag) { print_header(); auto_test(); goto out; } print_header(); (void) begin(kilobytes64,reclen); out: if(r_traj_flag) fclose(r_traj_fd); if(w_traj_flag) fclose(w_traj_fd); if (!no_unlink) { if(check_filename(dummyfile[0])) unlink(dummyfile[0]); /* delete the file */ } if(!silent) printf("\niozone test complete.\n"); if(res_prob) { printf("Timer resolution is poor. Some small transfers may have \n"); printf("reported inaccurate results. Sizes %ld kBytes and below.\n", (long)(rec_prob/(long long)1024)); } if(Rflag && !trflag){ dump_excel(); } return(0); } #ifdef HAVE_ANSIC_C void record_command_line(int argc, char **argv) #else void record_command_line(argc, argv) int argc; char **argv; #endif { int ix, len = 0; /* print and save the entire command line */ if(!silent) printf("\tCommand line used:"); for (ix=0; ix < argc; ix++) { if(!silent) printf(" %s", argv[ix]); if ((len + strlen(argv[ix])) < sizeof(command_line)) { strcat (command_line, argv[ix]); strcat (command_line, " "); len += strlen(argv[ix]) + 1; } else { printf ("Command line too long to save completely.\n"); break; } } if(!silent) printf("\n"); } /*************************************************************************/ /* BEGIN() */ /* This is the main work horse. It is called from main and from */ /* auto_test. The caller provides the size of file and the record length.*/ /*************************************************************************/ #ifdef HAVE_ANSIC_C void begin(off64_t kilos64,long long reclength) #else void begin(kilos64,reclength) off64_t kilos64; long long reclength; #endif { long long num_tests,test_num,i,j; long long data1[MAXTESTS], data2[MAXTESTS]; num_tests = sizeof(func)/sizeof(char *); #if defined(HAVE_PREAD) if(!Eflag) { #if defined(HAVE_PREAD) && defined(HAVE_PREADV) num_tests -= 4; #else num_tests -= 2; #endif if(mmapflag || async_flag) { num_tests -= 2; } } else { if(mmapflag || async_flag) #if defined(HAVE_PREAD) && defined(HAVE_PREADV) num_tests -= 6; #else num_tests -= 4; #endif } #else if(mmapflag || async_flag) { num_tests -= 2; } #endif if(RWONLYflag) num_tests = 2; /* kcollins 8-21-96*/ sync(); /* just in case there were some dirty */ sync(); kilobytes64=kilos64; reclen=reclength; numrecs64 = (kilobytes64*1024)/reclen; store_value(kilobytes64); if(r_traj_flag || w_traj_flag) store_value((off64_t)0); else store_value((off64_t)(reclen/1024)); #ifdef NO_PRINT_LLD if(!silent) printf("%16ld",kilobytes64); if(r_traj_flag || w_traj_flag) { if(!silent) printf("%8ld",0); } else { if(!silent) printf("%8ld",reclen/1024); } #else if(!silent) printf("%16lld",(long long)kilobytes64); if(r_traj_flag || w_traj_flag) { if(!silent) printf("%8lld",(long long )0); } else { if(!silent) printf("%8lld",(long long)(reclen/1024)); } #endif if(include_tflag) { for(i=0;i (long long)(min_file_size*1024)) { #ifdef NO_PRINT_LLD printf("Error: record length %ld is greater than filesize %ld kB\n ", (long long)min_rec_size,(long long)min_file_size); #else printf("Error: record length %lld is greater than filesize %lld kB\n ", (long long)min_rec_size,(long long)min_file_size); #endif exit(23); } if(NOCROSSflag) xover = max_file_size; init_file_sizes(min_file_size, max_file_size); del_record_sizes(); orig_min_rec_size=min_rec_size; orig_max_rec_size=max_rec_size; init_record_sizes(min_rec_size, max_rec_size); for(kilosi=get_next_file_size((off64_t)0); kilosi>0; kilosi=get_next_file_size(kilosi)) { /****************************************************************/ /* Start with record size of min_rec_size bytes and repeat the */ /* test, multiplying the record size by MULTIPLIER each time, */ /* until we reach max_rec_size. At the CROSSOVER we stop doing */ /* small buffers as it takes forever and becomes very */ /* un-interesting. */ /****************************************************************/ if(!rflag && !sflag && !yflag && !qflag) if(kilosi > xover){ min_rec_size = LARGE_REC; mult = orig_min_rec_size/1024; del_record_sizes(); init_record_sizes(min_rec_size, max_rec_size); /************************************/ /* Generate dummy entries in the */ /* Excel buffer for skipped */ /* record sizes */ /************************************/ for(count1=min_rec_size; (count1 != orig_min_rec_size) && ( mult <= (kilosi*1024)) ; count1=(count1>>1)) { current_x=0; store_value((off64_t)kilosi); store_value((off64_t)mult); for(xx=0;xx<20;xx++) store_value((off64_t)0); mult=mult*2; current_y++; if(current_y>max_y) max_y=current_y; current_x=0; } } for (recszi=get_next_record_size((off64_t)0);recszi!=0;recszi=get_next_record_size(recszi)) { if(recszi > (kilosi*1024)) break; begin(kilosi, recszi ); current_x=0; current_y++; } } } /****************************************************************/ /* */ /* THROUGHPUT_TEST () Multi process throughput test */ /* */ /* Note: States for share memory barrier are: */ /* 0 = Child not running or has finished. */ /* 1 = Child is ready to begin. */ /* 2 = Child is told to begin. */ /****************************************************************/ /* Data in shared memory format is: */ /* */ /* struct child_stats { */ /* long long flag; Used to barrier */ /* double walltime; Child's elapsed time */ /* double cputime; Child's CPU time */ /* double throughput; Child's throughput */ /* double actual; Child's actual read/written */ /* } */ /* */ /* There is an array of child_stat structures layed out in */ /* shared memory. */ /* */ /****************************************************************/ #ifdef HAVE_ANSIC_C void throughput_test(void) #else void throughput_test() #endif { char *unit; double starttime1 = 0; double jstarttime = 0; double jtime = 0; double walltime = 0; double cputime = 0; char *port; char getout; long long throughsize = KILOBYTES; long long xx,xy,i; long long xyz; double ptotal; off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; VOLATILE char *temp; double min_throughput = 0; double max_throughput = 0; double avg_throughput = 0; double min_xfer = 0; toutputindex=0; strcpy(&toutput[0][0],throughput_tests[0]); ptotal=written_so_far=read_so_far=re_written_so_far=re_read_so_far=0 ; if(OPS_flag) unit="ops"; else unit="kB"; #ifndef NO_THREADS /*Init barriers*/ if(use_thread) { barrier = (pthread_barrier_t*)alloc_mem(sizeof(pthread_barrier_t), 0); // Not shared pthread_barrierattr_setpshared(&barrier_attr, PTHREAD_PROCESS_PRIVATE); pthread_barrier_init(barrier, &barrier_attr, num_child); } else { barrier = (pthread_barrier_t*)alloc_mem(sizeof(pthread_barrier_t), 1); // Shared pthread_barrierattr_setpshared(&barrier_attr, PTHREAD_PROCESS_SHARED); pthread_barrier_init(barrier, &barrier_attr, num_child); } if (burst_size_kb_64 != -1) burst_size_per_child = burst_size_kb_64 * 1024 / num_child; #endif if(!haveshm) { shmaddr=(struct child_stats *)alloc_mem((long long)SHMSIZE,(int)1); #ifdef _64BIT_ARCH_ if((long long)shmaddr==(long long)-1) #else if((long )shmaddr==(long)-1) #endif { printf("\nShared memory not working\n"); exit(24); } haveshm=(char*)shmaddr; } else shmaddr=(struct child_stats *)haveshm; if(use_thread) stop_flag = &stoptime; else { temp = (char *)&shmaddr[0]; stop_flag = (char *)&temp[(long long)SHMSIZE]-4; } for(xyz=0;xyzflag=CHILD_STATE_HOLD; child_stat->actual=0; child_stat->throughput=0; child_stat->cputime=0; child_stat->walltime=0; } *stop_flag = 0; if(!sflag) kilobytes64=throughsize; if(!rflag) reclen=(long long)4096; if(aggflag) kilobytes64=orig_size/num_child; numrecs64 = (long long)(kilobytes64*1024)/reclen; buffer=mainbuffer; if(use_thread) port="thread"; else port="process"; if(w_traj_flag) { #ifdef NO_PRINT_LLD if(!silent) printf("\tEach %s writes a %ld kByte file in telemetry controlled records\n", port,(long long)kilobytes64); #else if(!silent) printf("\tEach %s writes a %lld kByte file in telemetry controlled records\n", port,(long long)kilobytes64); #endif } else { #ifdef NO_PRINT_LLD if(!silent) printf("\tEach %s writes a %ld kByte file in %ld kbyte records\n", port,(long long)kilobytes64,(long long)reclen/1024); #else if(!silent) printf("\tEach %s writes a %lld kByte file in %lld kByte records\n", port,(long long)kilobytes64,(long long)reclen/1024); #endif } if(fflag) /* Each child has a file name to write */ for(xx=0;xxflag==CHILD_STATE_HOLD) Poll((long long)1); } for(i=0;iflag=CHILD_STATE_BEGIN; if(distributed && master_iozone) tell_children_begin(i); } starttime1 = time_so_far(); /* Start parents timer */ goto waitout; } waitout: getout=0; if((long long)getpid() == myid) { /* Parent only */ starttime1 = time_so_far(); /* Wait for all children */ for( i = 0; i < num_child; i++){ child_stat = (struct child_stats *) &shmaddr[i]; if(distributed && master_iozone) { printf("\n\tTest running:"); wait_dist_join(); break; } else { if(use_thread) { thread_join(childids[i],(void *)&pstatus); } else { wait(0); } } if(!jstarttime) jstarttime = time_so_far(); } jtime = (time_so_far()-jstarttime)-time_res; if(jtime < (double).000001) { jtime=time_res; } } total_time = (time_so_far() - starttime1)-time_res; /* get parents total time */ if(total_time < (double).000001) { total_time=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } #ifdef JTIME total_time=total_time-jtime;/* Remove the join time */ if(!silent) printf("\nJoin time %10.2f\n",jtime); #endif total_kilos=0; ptotal=0; walltime = 0.0; cputime = 0.0; if(!silent) printf("\n"); for(xyz=0;xyzthroughput; /* add up the children */ ptotal += child_stat->actual; if(!min_xfer) min_xfer=child_stat->actual; if(child_stat->actual < min_xfer) min_xfer=child_stat->actual; if(!min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput < min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput > max_throughput) max_throughput=child_stat->throughput; /* Add up the cpu times of all children */ cputime += child_stat->cputime; /* and find the child with the longest wall time */ /* Get the earliest start time and latest fini time to calc. elapsed time. */ if (child_stat->walltime < child_stat->cputime) child_stat->walltime = child_stat->cputime; if (child_stat->walltime > walltime) walltime = child_stat->walltime; } avg_throughput=total_kilos/num_child; if(cpuutilflag) { if (cputime < cputime_res) cputime = 0.0; } for(xyz=0;xyzflag = CHILD_STATE_HOLD; /* Start children at state 0 (HOLD) */ } if(cpuutilflag) store_times (walltime, cputime); /* Must be Before store_dvalue(). */ store_dvalue(total_kilos); #ifdef NO_PRINT_LLD if(!silent) printf("\tChildren see throughput for %2ld initial writers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %2ld initial writers \t= %10.2f %s/sec\n",num_child,((double)(ptotal)/total_time),unit); #else if(!silent) printf("\tChildren see throughput for %2lld initial writers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %2lld initial writers \t= %10.2f %s/sec\n",num_child,((double)(ptotal)/total_time),unit); #endif if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); /* CPU% can be > 100.0 for multiple CPUs */ if(cpuutilflag) { if(walltime == 0.0) { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 0.0); } else { if(!silent) printf("\tCPU Utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 100.0 * cputime / walltime); } } if(Cflag) { for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); } else { if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); } } } if((!distributed) || (distributed && master_iozone)) stop_monitor("Write"); /**********************************************************/ /*************** End of intitial writer *******************/ /**********************************************************/ sync(); sleep(2); if(restf) sleep((int)rest_val); *stop_flag=0; if(distributed && master_iozone) { stop_master_listen(master_listen_socket); cleanup_comm(); } /**********************************************************/ /* Re-write throughput performance test. ******************/ /**********************************************************/ walltime = 0.0; cputime = 0.0; jstarttime=0; total_kilos=0; toutputindex=1; strcpy(&toutput[1][0],throughput_tests[1]); if(noretest) { store_dvalue( (double)0); goto next0; } if((!distributed) || (distributed && master_iozone)) start_monitor("Rewrite"); /* Hooks to start the distributed Iozone client/server code */ if(distributed) { use_thread=0; /* Turn of any Posix threads */ if(master_iozone) master_listen_socket = start_master_listen(); else become_client(); } if(!use_thread) { for(xx = 0; xx< num_child ; xx++){ chid=xx; childids[xx] = start_child_proc(THREAD_REWRITE_TEST,numrecs64,reclen); if(childids[xx]==-1){ printf("\nFork failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)childids[xy],(long long)SIGTERM); } exit(28); } if(childids[xx] == 0){ #ifdef _64BIT_ARCH_ thread_rwrite_test((int)xx); #else thread_rwrite_test((int)xx); #endif } } } #ifndef NO_THREADS else { for(xx = 0; xx< num_child ; xx++){ /* Create the children */ if(!barray[xx]) { barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+( 2 * cache_size)),(int)0); if(barray[xx] == 0) { perror("Memory allocation failed:"); exit(26); } barray[xx] =(char *)(((long)barray[xx] + cache_size ) & ~(cache_size-1)); } #ifdef _64BIT_ARCH_ childids[xx] = mythread_create( (void *)thread_rwrite_test,(int)xx); #else childids[xx] = mythread_create( (void *)thread_rwrite_test,(int)xx); #endif if(childids[xx]==-1){ printf("\nThread create failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)myid,(long long)SIGTERM); } exit(29); } } } #endif if((long long)myid == getpid()) { if(distributed && master_iozone) { start_master_listen_loop((int) num_child); } for(i=0;iflag==CHILD_STATE_HOLD) Poll((long long)1); } for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ if(delay_start!=0) Poll((long long)delay_start); if(distributed && master_iozone) tell_children_begin(i); } starttime1 = time_so_far(); goto jump3; } jump3: getout=0; if((long long)myid == getpid()){ /* Parent only here */ for( i = 0; i < num_child; i++){ child_stat=(struct child_stats *)&shmaddr[i]; if(distributed && master_iozone) { printf("\n\tTest running:"); wait_dist_join(); break; } else { if(use_thread) { thread_join(childids[i],(void *)&pstatus); } else { wait(0); } } if(!jstarttime) jstarttime = time_so_far(); } jtime = (time_so_far()-jstarttime)-time_res; if(jtime < (double).000001) { jtime=time_res; } } total_time = (time_so_far() - starttime1)-time_res; /* Parents total time */ if(total_time < (double).000001) { total_time=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } #ifdef JTIME total_time=total_time-jtime;/* Remove the join time */ if(!silent) printf("\nJoin time %10.2f\n",jtime); #endif total_kilos=0; ptotal=0; min_throughput=max_throughput=min_xfer=0; if(!silent) printf("\n"); for(xyz=0;xyzthroughput; ptotal+=child_stat->actual; if(!min_xfer) min_xfer=child_stat->actual; if(child_stat->actual < min_xfer) min_xfer=child_stat->actual; if(!min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput < min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput > max_throughput) max_throughput=child_stat->throughput; cputime += child_stat->cputime; /* Get the earliest start time and latest fini time to calc. elapsed time. */ if (child_stat->walltime < child_stat->cputime) child_stat->walltime = child_stat->cputime; if (child_stat->walltime > walltime) walltime = child_stat->walltime; } avg_throughput=total_kilos/num_child; if(cpuutilflag) { /* if (walltime < cputime_res) walltime = 0.0; */ if (cputime < cputime_res) cputime = 0.0; } for(xyz=0;xyzflag = CHILD_STATE_HOLD; } if(cpuutilflag) store_times (walltime, cputime); /* Must be Before store_dvalue(). */ store_dvalue(total_kilos); #ifdef NO_PRINT_LLD if(!silent) printf("\tChildren see throughput for %2ld rewriters \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %2ld rewriters \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #else if(!silent) printf("\tChildren see throughput for %2lld rewriters \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %2lld rewriters \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #endif if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); /* CPU% can be > 100.0 for multiple CPUs */ if(cpuutilflag) { if(walltime == 0.0) { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 0.0); } else { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 100.0 * cputime / walltime); } } if(Cflag) { for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); } else { if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); } } } *stop_flag=0; if((!distributed) || (distributed && master_iozone)) stop_monitor("Rewrite"); /**********************************************************/ /*************** End of rewrite throughput ****************/ /**********************************************************/ sync(); sleep(2); if(restf) sleep((int)rest_val); if(distributed && master_iozone) { stop_master_listen(master_listen_socket); cleanup_comm(); } next0: if(include_tflag) if(!(include_mask & (long long)READER_MASK)) goto next1; /**************************************************************/ /*** Reader throughput tests **********************************/ /**************************************************************/ if((!distributed) || (distributed && master_iozone)) start_monitor("Read"); toutputindex++; strcpy(&toutput[toutputindex][0],throughput_tests[2]); walltime = 0.0; cputime = 0.0; jstarttime=0; total_kilos=0; if(distributed) { use_thread=0; if(master_iozone) master_listen_socket=start_master_listen(); else become_client(); } if(!use_thread) { for(xx = 0; xx< num_child ; xx++){ chid=xx; childids[xx] = start_child_proc(THREAD_READ_TEST,numrecs64,reclen); if(childids[xx]==-1){ printf("\nFork failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)childids[xy],(long long)SIGTERM); } exit(30); } if(childids[xx]==0){ #ifdef _64BIT_ARCH_ thread_read_test((int)xx); #else thread_read_test((int)xx); #endif } } } #ifndef NO_THREADS else { for(xx = 0; xx< num_child ; xx++){ /* Create the children */ if(!barray[xx]) { barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+(2 * cache_size)),(int)0); if(barray[xx] == 0) { perror("Memory allocation failed:"); exit(26); } barray[xx] =(char *)(((long)barray[xx] + cache_size ) & ~(cache_size-1)); } #ifdef _64BIT_ARCH_ childids[xx] = mythread_create((void *)thread_read_test,(int)xx); #else childids[xx] = mythread_create((void *)thread_read_test,(int)xx); #endif if(childids[xx]==-1){ printf("\nThread create failed\n"); for(xy = 0; xy< xx ; xy++){ kill((pid_t)myid,(int)SIGTERM); } exit(31); } } } #endif if(myid == (long long)getpid()){ if(distributed && master_iozone) { start_master_listen_loop((int) num_child); } for(i=0;iflag==CHILD_STATE_HOLD) Poll((long long)1); } for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ if(delay_start!=0) Poll((long long)delay_start); if(distributed && master_iozone) tell_children_begin(i); } starttime1 = time_so_far(); goto jumpend4; } jumpend4: getout=0; if(myid == (long long)getpid()){ /* Parent here */ for( i = 0; i < num_child; i++){ child_stat = (struct child_stats *)&shmaddr[i]; if(distributed && master_iozone) { printf("\n\tTest running:"); wait_dist_join(); break; } else { if(use_thread) { thread_join(childids[i],(void *)&pstatus); } else { wait(0); } } if(!jstarttime) jstarttime = time_so_far(); } jtime = (time_so_far()-jstarttime)-time_res; if(jtime < (double).000001) { jtime=time_res; } } total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ if(total_time < (double).000001) { total_time=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } #ifdef JTIME total_time=total_time-jtime;/* Remove the join time */ if(!silent) printf("\nJoin time %10.2f\n",jtime); #endif total_kilos=0; ptotal=0; min_throughput=max_throughput=min_xfer=0; if(!silent) printf("\n"); for(xyz=0;xyzthroughput; ptotal+=child_stat->actual; if(!min_xfer) min_xfer=child_stat->actual; if(child_stat->actual < min_xfer) min_xfer=child_stat->actual; if(!min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput < min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput > max_throughput) max_throughput=child_stat->throughput; cputime += child_stat->cputime; /* Get the earliest start time and latest fini time to calc. elapsed time. */ if (child_stat->walltime < child_stat->cputime) child_stat->walltime = child_stat->cputime; if (child_stat->walltime > walltime) walltime = child_stat->walltime; } avg_throughput=total_kilos/num_child; if(cpuutilflag) { if (cputime < cputime_res) cputime = 0.0; } if(cpuutilflag) store_times (walltime, cputime); /* Must be Before store_dvalue(). */ store_dvalue(total_kilos); #ifdef NO_PRINT_LLD if(!silent) printf("\tChildren see throughput for %2ld readers \t\t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %2ld readers \t\t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #else if(!silent) printf("\tChildren see throughput for %2lld readers \t\t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %2lld readers \t\t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #endif if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); /* CPU% can be > 100.0 for multiple CPUs */ if(cpuutilflag) { if(walltime == 0.0) { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 0.0); } else { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 100.0 * cputime / walltime); } } if(Cflag) { for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); } else { if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); } } } if((!distributed) || (distributed && master_iozone)) stop_monitor("Read"); /**********************************************************/ /*************** End of readers throughput ****************/ /**********************************************************/ sync(); sleep(2); if(restf) sleep((int)rest_val); if(distributed && master_iozone) { stop_master_listen(master_listen_socket); cleanup_comm(); } /**************************************************************/ /*** ReReader throughput tests **********************************/ /**************************************************************/ toutputindex++; strcpy(&toutput[toutputindex][0],throughput_tests[3]); if(noretest) { store_dvalue( (double)0); goto next1; } if((!distributed) || (distributed && master_iozone)) start_monitor("Reread"); walltime = 0.0; cputime = 0.0; jstarttime=0; *stop_flag=0; total_kilos=0; /* Hooks to start the distributed Iozone client/server code */ if(distributed) { use_thread=0; /* Turn of any Posix threads */ if(master_iozone) master_listen_socket = start_master_listen(); else become_client(); } if(!use_thread) { for(xx = 0; xx< num_child ; xx++){ chid=xx; childids[xx] = start_child_proc(THREAD_REREAD_TEST, numrecs64,reclen); if(childids[xx]==-1){ printf("\nFork failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)childids[xy],(long long)SIGTERM); } exit(32); } if(childids[xx]==0){ #ifdef _64BIT_ARCH_ thread_rread_test((int)xx); #else thread_rread_test((int)xx); #endif } } } #ifndef NO_THREADS else { for(xx = 0; xx< num_child ; xx++){ /* Create the children */ chid=xx; if(!barray[xx]) { barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+(2 * cache_size)),(int)0); if(barray[xx] == 0) { perror("Memory allocation failed:"); exit(26); } barray[xx] =(char *)(((long)barray[xx] + cache_size ) & ~(cache_size-1)); } #ifdef _64BIT_ARCH_ childids[xx] = mythread_create((void *)thread_rread_test,(int)xx); #else childids[xx] = mythread_create((void *)thread_rread_test,(int)xx); #endif if(childids[xx]==-1){ printf("\nThread create failed\n"); for(xy = 0; xy< xx ; xy++){ kill((pid_t)myid,(int)SIGTERM); } exit(33); } } } #endif if(myid == (long long)getpid()){ if(distributed && master_iozone) { start_master_listen_loop((int) num_child); } for(i=0;iflag==CHILD_STATE_HOLD) Poll((long long)1); } for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ if(delay_start!=0) Poll((long long)delay_start); if(distributed && master_iozone) tell_children_begin(i); } starttime1 = time_so_far(); goto jumpend2; } jumpend2: getout=0; if(myid == (long long)getpid()){ /* Parent here */ for( i = 0; i < num_child; i++){ /* wait for children to stop */ child_stat = (struct child_stats *)&shmaddr[i]; if(distributed && master_iozone) { printf("\n\tTest running:"); wait_dist_join(); break; } else { if(use_thread) { thread_join(childids[i],(void *)&pstatus); } else { wait(0); } } if(!jstarttime) jstarttime = time_so_far(); } jtime = (time_so_far()-jstarttime)-time_res; if(jtime < (double).000001) { jtime=time_res; } } total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ if(total_time < (double).000001) { total_time=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } #ifdef JTIME total_time=total_time-jtime;/* Remove the join time */ if(!silent) printf("\nJoin time %10.2f\n",jtime); #endif min_throughput=max_throughput=min_xfer=0; total_kilos=0; ptotal=0; if(!silent) printf("\n"); for(xyz=0;xyzthroughput; ptotal+=child_stat->actual; if(!min_xfer) min_xfer=child_stat->actual; if(child_stat->actual < min_xfer) min_xfer=child_stat->actual; if(!min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput < min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput > max_throughput) max_throughput=child_stat->throughput; cputime += child_stat->cputime; /* Get the earliest start time and latest fini time to calc. elapsed time. */ if (child_stat->walltime < child_stat->cputime) child_stat->walltime = child_stat->cputime; if (child_stat->walltime > walltime) walltime = child_stat->walltime; } avg_throughput=total_kilos/num_child; if(cpuutilflag) { /* if (walltime < cputime_res) walltime = 0.0; */ if (cputime < cputime_res) cputime = 0.0; } if(cpuutilflag) store_times (walltime, cputime); /* Must be Before store_dvalue(). */ store_dvalue(total_kilos); #ifdef NO_PRINT_LLD if(!silent) printf("\tChildren see throughput for %ld re-readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %ld re-readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #else if(!silent) printf("\tChildren see throughput for %lld re-readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %lld re-readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #endif if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); /* CPU% can be > 100.0 for multiple CPUs */ if(cpuutilflag) { if(walltime == 0.0) { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 0.0); } else { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 100.0 * cputime / walltime); } } if(Cflag) { for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); } else { if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); } } } if((!distributed) || (distributed && master_iozone)) stop_monitor("Reread"); /**********************************************************/ /*************** End of re-readers throughput ****************/ /**********************************************************/ sync(); sleep(2); if(restf) sleep((int)rest_val); if(distributed && master_iozone) { stop_master_listen(master_listen_socket); cleanup_comm(); } next1: if(include_tflag) if(!(include_mask & (long long)REVERSE_MASK)) goto next2; sync(); sleep(2); /**************************************************************/ /*** Reverse reader throughput tests **************************/ /**************************************************************/ toutputindex++; strcpy(&toutput[toutputindex][0],throughput_tests[4]); if((!distributed) || (distributed && master_iozone)) start_monitor("Revread"); walltime = 0.0; cputime = 0.0; jstarttime=0; *stop_flag=0; total_kilos=0; /* Hooks to start the distributed Iozone client/server code */ if(distributed) { use_thread=0; /* Turn of any Posix threads */ if(master_iozone) master_listen_socket = start_master_listen(); else become_client(); } if(!use_thread) { for(xx = 0; xx< num_child ; xx++){ chid=xx; childids[xx] = start_child_proc(THREAD_REVERSE_READ_TEST,numrecs64,reclen); if(childids[xx]==-1){ printf("\nFork failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)childids[xy],(long long)SIGTERM); } exit(34); } if(childids[xx]==0){ #ifdef _64BIT_ARCH_ thread_reverse_read_test((int)xx); #else thread_reverse_read_test((int)xx); #endif } } } #ifndef NO_THREADS else { for(xx = 0; xx< num_child ; xx++){ /* Create the children */ chid=xx; if(!barray[xx]) { barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+(2 * cache_size)),(int)0); if(barray[xx] == 0) { perror("Memory allocation failed:"); exit(26); } barray[xx] =(char *)(((long)barray[xx] + cache_size ) & ~(cache_size-1)); } #ifdef _64BIT_ARCH_ childids[xx] = mythread_create((void *)thread_reverse_read_test,(int)xx); #else childids[xx] = mythread_create((void *)thread_reverse_read_test,(int)xx); #endif if(childids[xx]==-1){ printf("\nThread create failed\n"); for(xy = 0; xy< xx ; xy++){ kill((pid_t)myid,(int)SIGTERM); } exit(35); } } } #endif if(myid == (long long)getpid()){ if(distributed && master_iozone) { start_master_listen_loop((int) num_child); } for(i=0;iflag==CHILD_STATE_HOLD) Poll((long long)1); } for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ if(delay_start!=0) Poll((long long)delay_start); if(distributed && master_iozone) tell_children_begin(i); } starttime1 = time_so_far(); } getout=0; if(myid == (long long)getpid()){ /* Parent here */ for( i = 0; i < num_child; i++){ /* wait for children to stop */ child_stat = (struct child_stats *)&shmaddr[i]; if(distributed && master_iozone) { printf("\n\tTest running:"); wait_dist_join(); break; } else { if(use_thread) { thread_join(childids[i],(void *)&pstatus); } else { wait(0); } } if(!jstarttime) jstarttime = time_so_far(); } jtime = (time_so_far()-jstarttime)-time_res; if(jtime < (double).000001) { jtime=time_res; } } total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ if(total_time < (double).000001) { total_time=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } #ifdef JTIME total_time=total_time-jtime;/* Remove the join time */ if(!silent) printf("\nJoin time %10.2f\n",jtime); #endif total_kilos=0; ptotal=0; min_throughput=max_throughput=min_xfer=0; if(!silent) printf("\n"); for(xyz=0;xyzthroughput; ptotal+=child_stat->actual; if(!min_xfer) min_xfer=child_stat->actual; if(child_stat->actual < min_xfer) min_xfer=child_stat->actual; if(!min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput < min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput > max_throughput) max_throughput=child_stat->throughput; /* walltime += child_stat->walltime; */ cputime += child_stat->cputime; /* Get the earliest start time and latest fini time to calc. elapsed time. */ if (child_stat->walltime < child_stat->cputime) child_stat->walltime = child_stat->cputime; if (child_stat->walltime > walltime) walltime = child_stat->walltime; } avg_throughput=total_kilos/num_child; if(cpuutilflag) { /* if (walltime < cputime_res) walltime = 0.0; */ if (cputime < cputime_res) cputime = 0.0; } if(cpuutilflag) store_times (walltime, cputime); /* Must be Before store_dvalue(). */ store_dvalue(total_kilos); #ifdef NO_PRINT_LLD if(!silent) printf("\tChildren see throughput for %ld reverse readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %ld reverse readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #else if(!silent) printf("\tChildren see throughput for %lld reverse readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %lld reverse readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #endif if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); /* CPU% can be > 100.0 for multiple CPUs */ if(cpuutilflag) { if(walltime == 0.0) { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 0.0); } else { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 100.0 * cputime / walltime); } } if(Cflag) { for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); } else { if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); } } } if((!distributed) || (distributed && master_iozone)) stop_monitor("Revread"); sync(); sleep(2); if(restf) sleep((int)rest_val); if(distributed && master_iozone) { stop_master_listen(master_listen_socket); cleanup_comm(); } next2: if(include_tflag) if(!(include_mask & (long long)STRIDE_READ_MASK)) goto next3; /**************************************************************/ /*** stride reader throughput tests **************************/ /**************************************************************/ toutputindex++; strcpy(&toutput[toutputindex][0],throughput_tests[5]); if((!distributed) || (distributed && master_iozone)) start_monitor("Strideread"); walltime = 0.0; cputime = 0.0; jstarttime=0; sync(); sleep(2); *stop_flag=0; total_kilos=0; /* Hooks to start the distributed Iozone client/server code */ if(distributed) { use_thread=0; /* Turn of any Posix threads */ if(master_iozone) master_listen_socket = start_master_listen(); else become_client(); } if(!use_thread) { for(xx = 0; xx< num_child ; xx++){ chid=xx; childids[xx] = start_child_proc(THREAD_STRIDE_TEST,numrecs64,reclen); if(childids[xx]==-1){ printf("\nFork failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)childids[xy],(long long)SIGTERM); } exit(36); } if(childids[xx]==0){ #ifdef _64BIT_ARCH_ thread_stride_read_test((int)xx); #else thread_stride_read_test((int)xx); #endif } } } #ifndef NO_THREADS else { for(xx = 0; xx< num_child ; xx++){ /* Create the children */ chid=xx; if(!barray[xx]) { barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+(2 * cache_size)),(int)0); if(barray[xx] == 0) { perror("Memory allocation failed:"); exit(26); } barray[xx] =(char *)(((long)barray[xx] + cache_size ) & ~(cache_size-1)); } #ifdef _64BIT_ARCH_ childids[xx] = mythread_create((void *)thread_stride_read_test,(int)xx); #else childids[xx] = mythread_create((void *)thread_stride_read_test,(int)xx); #endif if(childids[xx]==-1){ printf("\nThread create failed\n"); for(xy = 0; xy< xx ; xy++){ kill((pid_t)myid,(int)SIGTERM); } exit(37); } } } #endif if(myid == (long long)getpid()){ if(distributed && master_iozone) { start_master_listen_loop((int) num_child); } for(i=0;iflag==CHILD_STATE_HOLD) Poll((long long)1); } for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ if(delay_start!=0) Poll((long long)delay_start); if(distributed && master_iozone) tell_children_begin(i); } starttime1 = time_so_far(); } getout=0; if(myid == (long long)getpid()){ /* Parent here */ for( i = 0; i < num_child; i++){ /* wait for children to stop */ child_stat = (struct child_stats *)&shmaddr[i]; if(distributed && master_iozone) { printf("\n\tTest running:"); wait_dist_join(); break; } else { if(use_thread) { thread_join(childids[i],(void *)&pstatus); } else { wait(0); } } if(!jstarttime) jstarttime = time_so_far(); } jtime = (time_so_far()-jstarttime)-time_res; if(jtime < (double).000001) { jtime=time_res; } } total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ if(total_time < (double).000001) { total_time=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } #ifdef JTIME total_time=total_time-jtime;/* Remove the join time */ if(!silent) printf("\nJoin time %10.2f\n",jtime); #endif total_kilos=0; ptotal=0; min_throughput=max_throughput=min_xfer=0; if(!silent) printf("\n"); for(xyz=0;xyzthroughput; ptotal+=child_stat->actual; if(!min_xfer) min_xfer=child_stat->actual; if(child_stat->actual < min_xfer) min_xfer=child_stat->actual; if(!min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput < min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput > max_throughput) max_throughput=child_stat->throughput; /* walltime += child_stat->walltime; */ cputime += child_stat->cputime; /* Get the biggest walltime */ if (child_stat->walltime < child_stat->cputime) child_stat->walltime = child_stat->cputime; if (child_stat->walltime > walltime) walltime = child_stat->walltime; } avg_throughput=total_kilos/num_child; if(cpuutilflag) { /* if (walltime < cputime_res) walltime = 0.0; */ if (cputime < cputime_res) cputime = 0.0; } if(cpuutilflag) store_times (walltime, cputime); /* Must be Before store_dvalue(). */ store_dvalue(total_kilos); #ifdef NO_PRINT_LLD if(!silent) printf("\tChildren see throughput for %ld stride readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %ld stride readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #else if(!silent) printf("\tChildren see throughput for %lld stride readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %lld stride readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #endif if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); /* CPU% can be > 100.0 for multiple CPUs */ if(cpuutilflag) { if(walltime == 0.0) { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 0.0); } else { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 100.0 * cputime / walltime); } } if(Cflag) { for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); } else { if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); } } } if((!distributed) || (distributed && master_iozone)) stop_monitor("Strideread"); sync(); sleep(2); if(restf) sleep((int)rest_val); if(distributed && master_iozone) { stop_master_listen(master_listen_socket); cleanup_comm(); } /**************************************************************/ /*** random reader throughput tests ***************************/ /**************************************************************/ next3: if(include_tflag) if(!(include_mask & (long long)RANDOM_RW_MASK)) goto next4; toutputindex++; strcpy(&toutput[toutputindex][0],throughput_tests[6]); if((!distributed) || (distributed && master_iozone)) start_monitor("Randread"); walltime = 0.0; cputime = 0.0; jstarttime=0; sync(); sleep(2); *stop_flag=0; total_kilos=0; /* Hooks to start the distributed Iozone client/server code */ if(distributed) { use_thread=0; /* Turn of any Posix threads */ if(master_iozone) master_listen_socket = start_master_listen(); else become_client(); } if(!use_thread) { for(xx = 0; xx< num_child ; xx++){ chid=xx; childids[xx] = start_child_proc(THREAD_RANDOM_READ_TEST,numrecs64,reclen); if(childids[xx]==-1){ printf("\nFork failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)childids[xy],(long long)SIGTERM); } exit(38); } if(childids[xx]==0){ #ifdef _64BIT_ARCH_ thread_ranread_test((int)xx); #else thread_ranread_test((int)xx); #endif } } } #ifndef NO_THREADS else { for(xx = 0; xx< num_child ; xx++){ /* Create the children */ chid=xx; if(!barray[xx]) { barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+(2 * cache_size)),(int)0); if(barray[xx] == 0) { perror("Memory allocation failed:"); exit(26); } barray[xx] =(char *)(((long)barray[xx] + cache_size ) & ~(cache_size-1)); } #ifdef _64BIT_ARCH_ childids[xx] = mythread_create((void *)thread_ranread_test,(int)xx); #else childids[xx] = mythread_create((void *)thread_ranread_test,(int)xx); #endif if(childids[xx]==-1){ printf("\nThread create failed\n"); for(xy = 0; xy< xx ; xy++){ kill((pid_t)myid,(int)SIGTERM); } exit(39); } } } #endif if(myid == (long long)getpid()){ if(distributed && master_iozone) { start_master_listen_loop((int) num_child); } for(i=0;iflag==CHILD_STATE_HOLD) Poll((long long)1); } for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ if(delay_start!=0) Poll((long long)delay_start); if(distributed && master_iozone) tell_children_begin(i); } starttime1 = time_so_far(); } getout=0; if(myid == (long long)getpid()){ /* Parent here */ for( i = 0; i < num_child; i++){ /* wait for children to stop */ child_stat = (struct child_stats *)&shmaddr[i]; if(distributed && master_iozone) { printf("\n\tTest running:"); wait_dist_join(); break; } else { if(use_thread) { thread_join(childids[i],(void *)&pstatus); } else { wait(0); } } if(!jstarttime) jstarttime = time_so_far(); } jtime = (time_so_far()-jstarttime)-time_res; if(jtime < (double).000001) { jtime=time_res; } } total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ if(total_time < (double).000001) { total_time=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } #ifdef JTIME total_time=total_time-jtime;/* Remove the join time */ if(!silent) printf("\nJoin time %10.2f\n",jtime); #endif total_kilos=0; ptotal=0; min_throughput=max_throughput=min_xfer=0; if(!silent) printf("\n"); for(xyz=0;xyzthroughput; ptotal+=child_stat->actual; if(!min_xfer) min_xfer=child_stat->actual; if(child_stat->actual < min_xfer) min_xfer=child_stat->actual; if(!min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput < min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput > max_throughput) max_throughput=child_stat->throughput; cputime += child_stat->cputime; /* Get the biggest walltime */ if (child_stat->walltime < child_stat->cputime) child_stat->walltime = child_stat->cputime; if (child_stat->walltime > walltime) walltime = child_stat->walltime; } avg_throughput=total_kilos/num_child; if(cpuutilflag) { if (cputime < cputime_res) cputime = 0.0; } if(cpuutilflag) store_times (walltime, cputime); /* Must be Before store_dvalue(). */ store_dvalue(total_kilos); #ifdef NO_PRINT_LLD if(!silent) printf("\tChildren see throughput for %ld random readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %ld random readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #else if(!silent) printf("\tChildren see throughput for %lld random readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %lld random readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #endif if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); /* CPU% can be > 100.0 for multiple CPUs */ if(cpuutilflag) { if(walltime == 0.0) { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 0.0); } else { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 100.0 * cputime / walltime); } } if(Cflag) { for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); } else { if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); } } } if((!distributed) || (distributed && master_iozone)) stop_monitor("Randread"); sync(); sleep(2); if(restf) sleep((int)rest_val); if(distributed && master_iozone) { stop_master_listen(master_listen_socket); cleanup_comm(); } /**************************************************************/ /*** mixed workload throughput tests ***************************/ /**************************************************************/ next4: if(include_tflag) if(!(include_mask & (long long)RANDOM_MIX_MASK)) goto next5; toutputindex++; strcpy(&toutput[toutputindex][0],throughput_tests[7]); if((!distributed) || (distributed && master_iozone)) start_monitor("Mixed"); walltime = 0.0; cputime = 0.0; jstarttime=0; sync(); sleep(2); *stop_flag=0; total_kilos=0; /* Hooks to start the distributed Iozone client/server code */ if(distributed) { use_thread=0; /* Turn of any Posix threads */ if(master_iozone) master_listen_socket = start_master_listen(); else become_client(); } if(!use_thread) { for(xx = 0; xx< num_child ; xx++){ chid=xx; childids[xx] = start_child_proc(THREAD_RANDOM_MIX_TEST,numrecs64,reclen); if(childids[xx]==-1){ printf("\nFork failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)childids[xy],(long long)SIGTERM); } exit(38); } if(childids[xx]==0){ #ifdef _64BIT_ARCH_ thread_mix_test((int)xx); #else thread_mix_test((int)xx); #endif } } } #ifndef NO_THREADS else { for(xx = 0; xx< num_child ; xx++){ /* Create the children */ chid=xx; if(!barray[xx]) { barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+(2 * cache_size)),(int)0); if(barray[xx] == 0) { perror("Memory allocation failed:"); exit(26); } barray[xx] =(char *)(((long)barray[xx] + cache_size ) & ~(cache_size-1)); } #ifdef _64BIT_ARCH_ childids[xx] = mythread_create((void *)thread_mix_test,(int)xx); #else childids[xx] = mythread_create((void *)thread_mix_test,(int)xx); #endif if(childids[xx]==-1){ printf("\nThread create failed\n"); for(xy = 0; xy< xx ; xy++){ kill((pid_t)myid,(int)SIGTERM); } exit(39); } } } #endif if(myid == (long long)getpid()){ if(distributed && master_iozone) { start_master_listen_loop((int) num_child); } for(i=0;iflag==CHILD_STATE_HOLD) Poll((long long)1); } for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ if(delay_start!=0) Poll((long long)delay_start); if(distributed && master_iozone) tell_children_begin(i); } starttime1 = time_so_far(); } getout=0; if(myid == (long long)getpid()){ /* Parent here */ for( i = 0; i < num_child; i++){ /* wait for children to stop */ child_stat = (struct child_stats *)&shmaddr[i]; if(distributed && master_iozone) { printf("\n\tTest running:"); wait_dist_join(); break; } else { if(use_thread) { thread_join(childids[i],(void *)&pstatus); } else { wait(0); } } if(!jstarttime) jstarttime = time_so_far(); } jtime = (time_so_far()-jstarttime)-time_res; if(jtime < (double).000001) { jtime=time_res; } } total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ if(total_time < (double).000001) { total_time=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } #ifdef JTIME total_time=total_time-jtime;/* Remove the join time */ if(!silent) printf("\nJoin time %10.2f\n",jtime); #endif total_kilos=0; ptotal=0; min_throughput=max_throughput=min_xfer=0; if(!silent) printf("\n"); for(xyz=0;xyzthroughput; ptotal+=child_stat->actual; if(!min_xfer) min_xfer=child_stat->actual; if(child_stat->actual < min_xfer) min_xfer=child_stat->actual; if(!min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput < min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput > max_throughput) max_throughput=child_stat->throughput; cputime += child_stat->cputime; /* Get the biggest walltime */ if (child_stat->walltime < child_stat->cputime) child_stat->walltime = child_stat->cputime; if (child_stat->walltime > walltime) walltime = child_stat->walltime; } avg_throughput=total_kilos/num_child; if(cpuutilflag) { if (cputime < cputime_res) cputime = 0.0; } if(cpuutilflag) store_times (walltime, cputime); /* Must be Before store_dvalue(). */ store_dvalue(total_kilos); #ifdef NO_PRINT_LLD if(!silent) printf("\tChildren see throughput for %ld mixed workload \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %ld mixed workload \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #else if(!silent) printf("\tChildren see throughput for %lld mixed workload \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %lld mixed workload \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #endif if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); /* CPU% can be > 100.0 for multiple CPUs */ if(cpuutilflag) { if(walltime == 0.0) { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 0.0); } else { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 100.0 * cputime / walltime); } } if(Cflag) { for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); } else { if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); } } } if((!distributed) || (distributed && master_iozone)) stop_monitor("Mixed"); sync(); sleep(2); if(restf) sleep((int)rest_val); if(distributed && master_iozone) { stop_master_listen(master_listen_socket); cleanup_comm(); } next5: /**************************************************************/ /*** random writer throughput tests **************************/ /**************************************************************/ if(include_tflag) if(!(include_mask & (long long)RANDOM_RW_MASK) || no_write) goto next6; toutputindex++; strcpy(&toutput[toutputindex][0],throughput_tests[8]); if((!distributed) || (distributed && master_iozone)) start_monitor("Randwrite"); walltime = 0.0; cputime = 0.0; jstarttime=0; sync(); sleep(2); *stop_flag=0; total_kilos=0; /* Hooks to start the distributed Iozone client/server code */ if(distributed) { use_thread=0; /* Turn of any Posix threads */ if(master_iozone) master_listen_socket = start_master_listen(); else become_client(); } if(!use_thread) { for(xx = 0; xx< num_child ; xx++){ chid=xx; childids[xx] = start_child_proc(THREAD_RANDOM_WRITE_TEST,numrecs64,reclen); if(childids[xx]==-1){ printf("\nFork failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)childids[xy],(long long)SIGTERM); } exit(38); } if(childids[xx]==0){ #ifdef _64BIT_ARCH_ thread_ranwrite_test((int)xx); #else thread_ranwrite_test((int)xx); #endif } } } #ifndef NO_THREADS else { for(xx = 0; xx< num_child ; xx++){ /* Create the children */ chid=xx; if(!barray[xx]) { barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+(2 * cache_size)),(int)0); if(barray[xx] == 0) { perror("Memory allocation failed:"); exit(26); } barray[xx] =(char *)(((long)barray[xx] + cache_size ) & ~(cache_size-1)); } #ifdef _64BIT_ARCH_ childids[xx] = mythread_create((void *)thread_ranwrite_test,(int)xx); #else childids[xx] = mythread_create((void *)thread_ranwrite_test,(int)xx); #endif if(childids[xx]==-1){ printf("\nThread create failed\n"); for(xy = 0; xy< xx ; xy++){ kill((pid_t)myid,(int)SIGTERM); } exit(39); } } } #endif if(myid == (long long)getpid()){ if(distributed && master_iozone) { start_master_listen_loop((int) num_child); } for(i=0;iflag==CHILD_STATE_HOLD) Poll((long long)1); } for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ if(delay_start!=0) Poll((long long)delay_start); if(distributed && master_iozone) tell_children_begin(i); } starttime1 = time_so_far(); } getout=0; if(myid == (long long)getpid()){ /* Parent here */ for( i = 0; i < num_child; i++){ /* wait for children to stop */ child_stat = (struct child_stats *)&shmaddr[i]; if(distributed && master_iozone) { printf("\n\tTest running:"); wait_dist_join(); break; } else { if(use_thread) { thread_join(childids[i],(void *)&pstatus); } else { wait(0); } } if(!jstarttime) jstarttime = time_so_far(); } jtime = (time_so_far()-jstarttime)-time_res; if(jtime < (double).000001) { jtime=time_res; } } total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ if(total_time < (double).000001) { total_time=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } #ifdef JTIME total_time=total_time-jtime;/* Remove the join time */ if(!silent) printf("\nJoin time %10.2f\n",jtime); #endif total_kilos=0; ptotal=0; min_throughput=max_throughput=min_xfer=0; if(!silent) printf("\n"); for(xyz=0;xyzthroughput; ptotal+=child_stat->actual; if(!min_xfer) min_xfer=child_stat->actual; if(child_stat->actual < min_xfer) min_xfer=child_stat->actual; if(!min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput < min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput > max_throughput) max_throughput=child_stat->throughput; cputime += child_stat->cputime; /* Get the biggest walltime */ if (child_stat->walltime < child_stat->cputime) child_stat->walltime = child_stat->cputime; if (child_stat->walltime > walltime) walltime = child_stat->walltime; } avg_throughput=total_kilos/num_child; if(cpuutilflag) { if (cputime < cputime_res) cputime = 0.0; } if(cpuutilflag) store_times (walltime, cputime); /* Must be Before store_dvalue(). */ store_dvalue(total_kilos); #ifdef NO_PRINT_LLD if(!silent) printf("\tChildren see throughput for %ld random writers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %ld random writers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #else if(!silent) printf("\tChildren see throughput for %lld random writers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %lld random writers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #endif if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); /* CPU% can be > 100.0 for multiple CPUs */ if(cpuutilflag) { if(walltime == 0.0) { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 0.0); } else { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 100.0 * cputime / walltime); } } if(Cflag) { for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); } else { if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); } } } if((!distributed) || (distributed && master_iozone)) stop_monitor("Randwrite"); sync(); sleep(2); if(restf) sleep((int)rest_val); if(distributed && master_iozone) { stop_master_listen(master_listen_socket); cleanup_comm(); } next6: /**************************************************************/ /*** Pwrite writer throughput tests **************************/ /**************************************************************/ #ifndef HAVE_PREAD goto next7; #else if(include_tflag) if(!(include_mask & (long long)PWRITER_MASK)) goto next7; toutputindex++; strcpy(&toutput[toutputindex][0],throughput_tests[9]); if((!distributed) || (distributed && master_iozone)) start_monitor("Pwrite"); walltime = 0.0; cputime = 0.0; jstarttime=0; sync(); sleep(2); *stop_flag=0; total_kilos=0; /* Hooks to start the distributed Iozone client/server code */ if(distributed) { use_thread=0; /* Turn of any Posix threads */ if(master_iozone) master_listen_socket = start_master_listen(); else become_client(); } if(!use_thread) { for(xx = 0; xx< num_child ; xx++){ chid=xx; childids[xx] = start_child_proc(THREAD_PWRITE_TEST,numrecs64,reclen); if(childids[xx]==-1){ printf("\nFork failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)childids[xy],(long long)SIGTERM); } exit(38); } if(childids[xx]==0){ #ifdef _64BIT_ARCH_ thread_pwrite_test((int)xx); #else thread_pwrite_test((int)xx); #endif } } } #ifndef NO_THREADS else { for(xx = 0; xx< num_child ; xx++){ /* Create the children */ chid=xx; if(!barray[xx]) { barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+(2 * cache_size)),(int)0); if(barray[xx] == 0) { perror("Memory allocation failed:"); exit(26); } barray[xx] =(char *)(((long)barray[xx] + cache_size ) & ~(cache_size-1)); } #ifdef _64BIT_ARCH_ childids[xx] = mythread_create((void *)thread_pwrite_test,(int)xx); #else childids[xx] = mythread_create((void *)thread_pwrite_test,(int)xx); #endif if(childids[xx]==-1){ printf("\nThread create failed\n"); for(xy = 0; xy< xx ; xy++){ kill((pid_t)myid,(int)SIGTERM); } exit(39); } } } #endif if(myid == (long long)getpid()){ if(distributed && master_iozone) { start_master_listen_loop((int) num_child); } for(i=0;iflag==CHILD_STATE_HOLD) Poll((long long)1); } for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ if(delay_start!=0) Poll((long long)delay_start); if(distributed && master_iozone) tell_children_begin(i); } starttime1 = time_so_far(); } getout=0; if(myid == (long long)getpid()){ /* Parent here */ for( i = 0; i < num_child; i++){ /* wait for children to stop */ child_stat = (struct child_stats *)&shmaddr[i]; if(distributed && master_iozone) { printf("\n\tTest running:"); wait_dist_join(); break; } else { if(use_thread) { thread_join(childids[i],(void *)&pstatus); } else { wait(0); } } if(!jstarttime) jstarttime = time_so_far(); } jtime = (time_so_far()-jstarttime)-time_res; if(jtime < (double).000001) { jtime=time_res; } } total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ if(total_time < (double).000001) { total_time=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } #ifdef JTIME total_time=total_time-jtime;/* Remove the join time */ if(!silent) printf("\nJoin time %10.2f\n",jtime); #endif total_kilos=0; ptotal=0; min_throughput=max_throughput=min_xfer=0; if(!silent) printf("\n"); for(xyz=0;xyzthroughput; ptotal+=child_stat->actual; if(!min_xfer) min_xfer=child_stat->actual; if(child_stat->actual < min_xfer) min_xfer=child_stat->actual; if(!min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput < min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput > max_throughput) max_throughput=child_stat->throughput; cputime += child_stat->cputime; /* Get the biggest walltime*/ if (child_stat->walltime < child_stat->cputime) child_stat->walltime = child_stat->cputime; if (child_stat->walltime > walltime) walltime = child_stat->walltime; } avg_throughput=total_kilos/num_child; if(cpuutilflag) { if (cputime < cputime_res) cputime = 0.0; } if(cpuutilflag) store_times (walltime, cputime); /* Must be Before store_dvalue(). */ store_dvalue(total_kilos); #ifdef NO_PRINT_LLD if(!silent) printf("\tChildren see throughput for %ld pwrite writers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %ld pwrite writers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #else if(!silent) printf("\tChildren see throughput for %lld pwrite writers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %lld pwrite writers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #endif if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); /* CPU% can be > 100.0 for multiple CPUs */ if(cpuutilflag) { if(walltime == 0.0) { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 0.0); } else { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 100.0 * cputime / walltime); } } if(Cflag) { for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); } else { if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); } } } if((!distributed) || (distributed && master_iozone)) stop_monitor("Pwrite"); sync(); sleep(2); if(restf) sleep((int)rest_val); if(distributed && master_iozone) { stop_master_listen(master_listen_socket); cleanup_comm(); } #endif /**************************************************************/ /*** Pread reader throughput tests **************************/ /**************************************************************/ next7: #ifndef HAVE_PREAD goto next8; #else if(include_tflag) if(!(include_mask & (long long)PREADER_MASK)) goto next8; toutputindex++; strcpy(&toutput[toutputindex][0],throughput_tests[10]); if((!distributed) || (distributed && master_iozone)) start_monitor("Pread"); walltime = 0.0; cputime = 0.0; jstarttime=0; sync(); sleep(2); *stop_flag=0; total_kilos=0; /* Hooks to start the distributed Iozone client/server code */ if(distributed) { use_thread=0; /* Turn of any Posix threads */ if(master_iozone) master_listen_socket = start_master_listen(); else become_client(); } if(!use_thread) { for(xx = 0; xx< num_child ; xx++){ chid=xx; childids[xx] = start_child_proc(THREAD_PREAD_TEST,numrecs64,reclen); if(childids[xx]==-1){ printf("\nFork failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)childids[xy],(long long)SIGTERM); } exit(38); } if(childids[xx]==0){ #ifdef _64BIT_ARCH_ thread_pread_test((int)xx); #else thread_pread_test((int)xx); #endif } } } #ifndef NO_THREADS else { for(xx = 0; xx< num_child ; xx++){ /* Create the children */ chid=xx; if(!barray[xx]) { barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+(2 * cache_size)),(int)0); if(barray[xx] == 0) { perror("Memory allocation failed:"); exit(26); } barray[xx] =(char *)(((long)barray[xx] + cache_size ) & ~(cache_size-1)); } #ifdef _64BIT_ARCH_ childids[xx] = mythread_create((void *)thread_pread_test,(int)xx); #else childids[xx] = mythread_create((void *)thread_pread_test,(int)xx); #endif if(childids[xx]==-1){ printf("\nThread create failed\n"); for(xy = 0; xy< xx ; xy++){ kill((pid_t)myid,(int)SIGTERM); } exit(39); } } } #endif if(myid == (long long)getpid()){ if(distributed && master_iozone) { start_master_listen_loop((int) num_child); } for(i=0;iflag==CHILD_STATE_HOLD) Poll((long long)1); } for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ if(delay_start!=0) Poll((long long)delay_start); if(distributed && master_iozone) tell_children_begin(i); } starttime1 = time_so_far(); } getout=0; if(myid == (long long)getpid()){ /* Parent here */ for( i = 0; i < num_child; i++){ /* wait for children to stop */ child_stat = (struct child_stats *)&shmaddr[i]; if(distributed && master_iozone) { printf("\n\tTest running:"); wait_dist_join(); break; } else { if(use_thread) { thread_join(childids[i],(void *)&pstatus); } else { wait(0); } } if(!jstarttime) jstarttime = time_so_far(); } jtime = (time_so_far()-jstarttime)-time_res; if(jtime < (double).000001) { jtime=time_res; } } total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ if(total_time < (double).000001) { total_time=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } #ifdef JTIME total_time=total_time-jtime;/* Remove the join time */ if(!silent) printf("\nJoin time %10.2f\n",jtime); #endif total_kilos=0; ptotal=0; min_throughput=max_throughput=min_xfer=0; if(!silent) printf("\n"); for(xyz=0;xyzthroughput; ptotal+=child_stat->actual; if(!min_xfer) min_xfer=child_stat->actual; if(child_stat->actual < min_xfer) min_xfer=child_stat->actual; if(!min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput < min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput > max_throughput) max_throughput=child_stat->throughput; cputime += child_stat->cputime; /* Get the biggest walltime*/ if (child_stat->walltime < child_stat->cputime) child_stat->walltime = child_stat->cputime; if (child_stat->walltime > walltime) walltime = child_stat->walltime; } avg_throughput=total_kilos/num_child; if(cpuutilflag) { if (cputime < cputime_res) cputime = 0.0; } if(cpuutilflag) store_times (walltime, cputime); /* Must be Before store_dvalue(). */ store_dvalue(total_kilos); #ifdef NO_PRINT_LLD if(!silent) printf("\tChildren see throughput for %ld pread readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %ld pread readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #else if(!silent) printf("\tChildren see throughput for %lld pread readers \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %lld pread readers \t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #endif if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); /* CPU% can be > 100.0 for multiple CPUs */ if(cpuutilflag) { if(walltime == 0.0) { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 0.0); } else { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 100.0 * cputime / walltime); } } if(Cflag) { for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); } else { if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); } } } if((!distributed) || (distributed && master_iozone)) stop_monitor("Pread"); sync(); sleep(2); if(restf) sleep((int)rest_val); if(distributed && master_iozone) { stop_master_listen(master_listen_socket); cleanup_comm(); } #endif next8: if(include_tflag) if(!(include_mask & (long long)FWRITER_MASK)) goto next9; /**************************************************************/ /*** fwriter throughput tests *********************************/ /**************************************************************/ if((!distributed) || (distributed && master_iozone)) start_monitor("Fwrite"); toutputindex++; strcpy(&toutput[toutputindex][0],throughput_tests[11]); walltime = 0.0; cputime = 0.0; jstarttime=0; total_kilos=0; if(distributed) { use_thread=0; if(master_iozone) master_listen_socket=start_master_listen(); else become_client(); } if(!use_thread) { for(xx = 0; xx< num_child ; xx++){ chid=xx; childids[xx] = start_child_proc(THREAD_FWRITE_TEST,numrecs64,reclen); if(childids[xx]==-1){ printf("\nFork failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)childids[xy],(long long)SIGTERM); } exit(30); } if(childids[xx]==0){ #ifdef _64BIT_ARCH_ thread_fwrite_test((int)xx); #else thread_fwrite_test((int)xx); #endif } } } #ifndef NO_THREADS else { for(xx = 0; xx< num_child ; xx++){ /* Create the children */ if(!barray[xx]) { barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+(2 * cache_size)),(int)0); if(barray[xx] == 0) { perror("Memory allocation failed:"); exit(26); } barray[xx] =(char *)(((long)barray[xx] + cache_size ) & ~(cache_size-1)); } #ifdef _64BIT_ARCH_ childids[xx] = mythread_create((void *)thread_fwrite_test,(int)xx); #else childids[xx] = mythread_create((void *)thread_fwrite_test,(int)xx); #endif if(childids[xx]==-1){ printf("\nThread create failed\n"); for(xy = 0; xy< xx ; xy++){ kill((pid_t)myid,(int)SIGTERM); } exit(31); } } } #endif if(myid == (long long)getpid()){ if(distributed && master_iozone) { start_master_listen_loop((int) num_child); } for(i=0;iflag==CHILD_STATE_HOLD) Poll((long long)1); } for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ if(delay_start!=0) Poll((long long)delay_start); if(distributed && master_iozone) tell_children_begin(i); } starttime1 = time_so_far(); goto jumpend1; } jumpend1: getout=0; if(myid == (long long)getpid()){ /* Parent here */ for( i = 0; i < num_child; i++){ child_stat = (struct child_stats *)&shmaddr[i]; if(distributed && master_iozone) { printf("\n\tTest running:"); wait_dist_join(); break; } else { if(use_thread) { thread_join(childids[i],(void *)&pstatus); } else { wait(0); } } if(!jstarttime) jstarttime = time_so_far(); } jtime = (time_so_far()-jstarttime)-time_res; if(jtime < (double).000001) { jtime=time_res; } } total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ if(total_time < (double).000001) { total_time=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } #ifdef JTIME total_time=total_time-jtime;/* Remove the join time */ if(!silent) printf("\nJoin time %10.2f\n",jtime); #endif total_kilos=0; ptotal=0; min_throughput=max_throughput=min_xfer=0; if(!silent) printf("\n"); for(xyz=0;xyzthroughput; ptotal+=child_stat->actual; if(!min_xfer) min_xfer=child_stat->actual; if(child_stat->actual < min_xfer) min_xfer=child_stat->actual; if(!min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput < min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput > max_throughput) max_throughput=child_stat->throughput; cputime += child_stat->cputime; /* Get the earliest start time and latest fini time to calc. elapsed time. */ if (child_stat->walltime < child_stat->cputime) child_stat->walltime = child_stat->cputime; if (child_stat->walltime > walltime) walltime = child_stat->walltime; } avg_throughput=total_kilos/num_child; if(cpuutilflag) { if (cputime < cputime_res) cputime = 0.0; } if(cpuutilflag) store_times (walltime, cputime); /* Must be Before store_dvalue(). */ store_dvalue(total_kilos); #ifdef NO_PRINT_LLD if(!silent) printf("\tChildren see throughput for %2ld fwriters \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %2ld fwriters \t\t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #else if(!silent) printf("\tChildren see throughput for %2lld fwriters \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %2lld fwriters \t\t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #endif if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); /* CPU% can be > 100.0 for multiple CPUs */ if(cpuutilflag) { if(walltime == 0.0) { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 0.0); } else { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 100.0 * cputime / walltime); } } if(Cflag) { for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); } else { if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); } } } if((!distributed) || (distributed && master_iozone)) stop_monitor("Fwrite"); /**********************************************************/ /*************** End of fwrite throughput ****************/ /**********************************************************/ sync(); sleep(2); if(restf) sleep((int)rest_val); if(distributed && master_iozone) { stop_master_listen(master_listen_socket); cleanup_comm(); } next9: if(include_tflag) if(!(include_mask & (long long)FREADER_MASK)) goto next10; /**************************************************************/ /*** freader throughput tests *********************************/ /**************************************************************/ if((!distributed) || (distributed && master_iozone)) start_monitor("Fread"); toutputindex++; strcpy(&toutput[toutputindex][0],throughput_tests[12]); walltime = 0.0; cputime = 0.0; jstarttime=0; total_kilos=0; if(distributed) { use_thread=0; if(master_iozone) master_listen_socket=start_master_listen(); else become_client(); } if(!use_thread) { for(xx = 0; xx< num_child ; xx++){ chid=xx; childids[xx] = start_child_proc(THREAD_FREAD_TEST,numrecs64,reclen); if(childids[xx]==-1){ printf("\nFork failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)childids[xy],(long long)SIGTERM); } exit(30); } if(childids[xx]==0){ #ifdef _64BIT_ARCH_ thread_fread_test((int)xx); #else thread_fread_test((int)xx); #endif } } } #ifndef NO_THREADS else { for(xx = 0; xx< num_child ; xx++){ /* Create the children */ if(!barray[xx]) { barray[xx]=(char *) alloc_mem((long long)(MAXBUFFERSIZE+(2 * cache_size)),(int)0); if(barray[xx] == 0) { perror("Memory allocation failed:"); exit(26); } barray[xx] =(char *)(((long)barray[xx] + cache_size ) & ~(cache_size-1)); } #ifdef _64BIT_ARCH_ childids[xx] = mythread_create((void *)thread_fread_test,(int)xx); #else childids[xx] = mythread_create((void *)thread_fread_test,(int)xx); #endif if(childids[xx]==-1){ printf("\nThread create failed\n"); for(xy = 0; xy< xx ; xy++){ kill((pid_t)myid,(int)SIGTERM); } exit(31); } } } #endif if(myid == (long long)getpid()){ if(distributed && master_iozone) { start_master_listen_loop((int) num_child); } for(i=0;iflag==CHILD_STATE_HOLD) Poll((long long)1); } for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ if(delay_start!=0) Poll((long long)delay_start); if(distributed && master_iozone) tell_children_begin(i); } starttime1 = time_so_far(); goto jumpend3; } jumpend3: getout=0; if(myid == (long long)getpid()){ /* Parent here */ for( i = 0; i < num_child; i++){ child_stat = (struct child_stats *)&shmaddr[i]; if(distributed && master_iozone) { printf("\n\tTest running:"); wait_dist_join(); break; } else { if(use_thread) { thread_join(childids[i],(void *)&pstatus); } else { wait(0); } } if(!jstarttime) jstarttime = time_so_far(); } jtime = (time_so_far()-jstarttime)-time_res; if(jtime < (double).000001) { jtime=time_res; } } total_time = (time_so_far() - starttime1)-time_res; /* Parents time */ if(total_time < (double).000001) { total_time=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } #ifdef JTIME total_time=total_time-jtime;/* Remove the join time */ if(!silent) printf("\nJoin time %10.2f\n",jtime); #endif total_kilos=0; ptotal=0; min_throughput=max_throughput=min_xfer=0; if(!silent) printf("\n"); for(xyz=0;xyzthroughput; ptotal+=child_stat->actual; if(!min_xfer) min_xfer=child_stat->actual; if(child_stat->actual < min_xfer) min_xfer=child_stat->actual; if(!min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput < min_throughput) min_throughput=child_stat->throughput; if(child_stat->throughput > max_throughput) max_throughput=child_stat->throughput; cputime += child_stat->cputime; /* Get the earliest start time and latest fini time to calc. elapsed time. */ if (child_stat->walltime < child_stat->cputime) child_stat->walltime = child_stat->cputime; if (child_stat->walltime > walltime) walltime = child_stat->walltime; } avg_throughput=total_kilos/num_child; if(cpuutilflag) { if (cputime < cputime_res) cputime = 0.0; } if(cpuutilflag) store_times (walltime, cputime); /* Must be Before store_dvalue(). */ store_dvalue(total_kilos); #ifdef NO_PRINT_LLD if(!silent) printf("\tChildren see throughput for %2ld freaders \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %2ld freaders \t\t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #else if(!silent) printf("\tChildren see throughput for %2lld freaders \t= %10.2f %s/sec\n", num_child, total_kilos,unit); if(!silent && !distributed) printf("\tParent sees throughput for %2lld freaders \t\t= %10.2f %s/sec\n", num_child, (double)(ptotal)/total_time,unit); #endif if(!silent) printf("\tMin throughput per %s \t\t\t= %10.2f %s/sec \n", port,min_throughput,unit); if(!silent) printf("\tMax throughput per %s \t\t\t= %10.2f %s/sec\n", port,max_throughput,unit); if(!silent) printf("\tAvg throughput per %s \t\t\t= %10.2f %s/sec\n", port,avg_throughput,unit); if(!silent) printf("\tMin xfer \t\t\t\t\t= %10.2f %s\n", min_xfer,unit); /* CPU% can be > 100.0 for multiple CPUs */ if(cpuutilflag) { if(walltime == 0.0) { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 0.0); } else { if(!silent) printf("\tCPU utilization: Wall time %8.3f CPU time %8.3f CPU utilization %6.2f %%\n\n", walltime, cputime, 100.0 * cputime / walltime); } } if(Cflag) { for(xyz=0;xyzactual, unit, child_stat->throughput, unit, child_stat->walltime, child_stat->cputime, cpu_util(child_stat->cputime, child_stat->walltime)); } else { if(!silent) printf("\tChild[%ld] xfer count = %10.2f %s, Throughput = %10.2f %s/sec\n", (long)xyz, child_stat->actual, unit, child_stat->throughput, unit); } } } if((!distributed) || (distributed && master_iozone)) stop_monitor("Fread"); /**********************************************************/ /*************** End of fread throughput ******************/ /**********************************************************/ sync(); sleep(2); if(restf) sleep((int)rest_val); if(distributed && master_iozone) { stop_master_listen(master_listen_socket); cleanup_comm(); } next10: sleep(2); /* You need this. If you stop and restart the master_listen it will fail on Linux */ if (!no_unlink) { /**********************************************************/ /* Cleanup all of the temporary files */ /* This is not really a test. It behaves like a test so */ /* it can unlink all of the same files that the other */ /* tests left hanging around. */ /**********************************************************/ /* Hooks to start the distributed Iozone client/server code */ if(distributed) { use_thread=0; /* Turn of any Posix threads */ if(master_iozone) master_listen_socket = start_master_listen(); else become_client(); } if(!use_thread) { for(xx = 0; xx< num_child ; xx++){ chid=xx; childids[xx] = start_child_proc(THREAD_CLEANUP_TEST,numrecs64,reclen); if(childids[xx]==-1){ printf("\nFork failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)childids[xy],(long long)SIGTERM); } exit(28); } if(childids[xx] == 0){ #ifdef _64BIT_ARCH_ thread_cleanup_test((int)xx); #else thread_cleanup_test((int)xx); #endif } } } #ifndef NO_THREADS else { for(xx = 0; xx< num_child ; xx++){ /* Create the children */ #ifdef _64BIT_ARCH_ childids[xx] = mythread_create((void *)thread_cleanup_test,(int)xx); #else childids[xx] = mythread_create((void *)thread_cleanup_test,(int)xx); #endif if(childids[xx]==-1){ printf("\nThread create failed\n"); for(xy = 0; xy< xx ; xy++){ Kill((long long)myid,(long long)SIGTERM); } exit(29); } } } #endif if((long long)myid == getpid()) { if(distributed && master_iozone) { start_master_listen_loop((int) num_child); } for(i=0;iflag==CHILD_STATE_HOLD) Poll((long long)1); } for(i=0;iflag = CHILD_STATE_BEGIN; /* tell children to go */ if(delay_start!=0) Poll((long long)delay_start); if(distributed && master_iozone) tell_children_begin(i); } } getout=0; if((long long)myid == getpid()){ /* Parent only here */ for( i = 0; i < num_child; i++){ child_stat=(struct child_stats *)&shmaddr[i]; if(distributed && master_iozone) { printf("\n\tTest cleanup:"); wait_dist_join(); break; } else { if(use_thread) { thread_join(childids[i],(void *)&pstatus); } else { wait(0); } } } } for(xyz=0;xyzflag = CHILD_STATE_HOLD; } sync(); sleep(2); if(distributed && master_iozone) { stop_master_listen(master_listen_socket); #ifdef Windows /* windows needs time before shutting down sockets */ sleep(1); #endif cleanup_comm(); } } #ifndef NO_THREADS /* Destroy the barrier */ pthread_barrier_destroy(barrier); #endif /********************************************************/ /* End of cleanup */ /********************************************************/ sync(); if(!silent) printf("\n"); if(!silent) printf("\n"); return; } /************************************************************************/ /* Time measurement routines. */ /************************************************************************/ #ifdef HAVE_ANSIC_C static double time_so_far(void) #else static double time_so_far() #endif { #ifdef Windows LARGE_INTEGER freq,counter; double wintime,bigcounter; struct timeval tp; /* For Windows the time_of_day() is useless. It increments in 55 milli * second increments. By using the Win32api one can get access to the * high performance measurement interfaces. With this one can get back * into the 8 to 9 microsecond resolution. */ if(pit_hostname[0]){ if (pit_gettimeofday(&tp, (struct timezone *) NULL, pit_hostname, pit_service) == -1) perror("pit_gettimeofday"); return ((double) (tp.tv_sec)) + (((double) tp.tv_usec) * 0.000001 ); } else { QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&counter); bigcounter=(double)counter.HighPart *(double)0xffffffff + (double)counter.LowPart; wintime = (double)(bigcounter/(double)freq.LowPart); return((double)wintime); } #else #if defined (OSFV4) || defined(OSFV3) || defined(OSFV5) struct timespec gp; if (getclock(TIMEOFDAY, (struct timespec *) &gp) == -1) perror("getclock"); return (( (double) (gp.tv_sec)) + ( ((float)(gp.tv_nsec)) * 0.000000001 )); #else struct timeval tp; if(pit_hostname[0]){ if (pit_gettimeofday(&tp, (struct timezone *) NULL, pit_hostname, pit_service) == -1) perror("pit_gettimeofday"); return ((double) (tp.tv_sec)) + (((double) tp.tv_usec) * 0.000001 ); } else { if (gettimeofday(&tp, (struct timezone *) NULL) == -1) perror("gettimeofday"); return ((double) (tp.tv_sec)) + (((double) tp.tv_usec) * 0.000001 ); } #endif #endif } /************************************************************************/ /* FETCHIT () */ /* */ /* Routine to make the on chip data cache hot for this buffer. The */ /* on chip cache may have been blown by other code in the application */ /* or in the OS. Remember, on some machines, the data cache is direct */ /* mapped and virtual indexed. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void fetchit(char *buffer,long long length) #else void fetchit(buffer,length) char *buffer; long long length; #endif { char *where; volatile long long x[4]; long long i; where=(char *)buffer; if(cache_line_size == 0) /* This shouldn't be needed */ cache_line_size=MY_CACHE_LINE_SIZE; for(i=0;i<(length/cache_line_size);i++) { x[(i & 3)]=*(where); where+=cache_line_size; } } /************************************************************************/ /* Verify that the buffer contains expected pattern */ /************************************************************************/ /* sverify == 0 means full check of pattern for every byte. */ /* severify == 1 means partial check of pattern for each page. */ /* sverify == 2 means no check, but partial touch for each page. */ /************************************************************************/ #ifdef HAVE_ANSIC_C long long verify_buffer(volatile char *buffer,long long length, off64_t recnum, long long recsize,unsigned long long patt, char sverify) #else long long verify_buffer(buffer,length, recnum, recsize,patt,sverify) char *buffer; long long length; off64_t recnum; long long recsize; unsigned long long patt; char sverify; #endif { volatile unsigned long long *where; volatile unsigned long long dummy; long *de_ibuf, *de_obuf; long long j,k; off64_t file_position=0; off64_t i; char *where2; char *pattern_ptr; long long mpattern,xx2; unsigned int seed; unsigned long x; unsigned long long value,value1; unsigned long long a= 0x01020304; unsigned long long b = 0x05060708; unsigned long long c= 0x01010101; unsigned long long d = 0x01010101; unsigned long long pattern_buf; int lite = 1; /* Only validate 1 long when running de-deup validation */ value = (a<<32) | b; value1 = (c<<32) | d; /* printf("Verify Sverify %d verify %d diag_v %d\n",sverify,verify,diag_v); */ x=0; xx2=chid; if(share_file) xx2=(long long)0; mpattern=patt; pattern_buf=patt; where=(unsigned long long *)buffer; if((sverify == 2) || async_flag) { for(i=0;i<(length);i+=page_size) { dummy = *where; where+=(page_size/sizeof(long long)); } return(0); } if(dedup_flag) { gen_new_buf((char *)dedup_ibuf,(char *)dedup_temp, (long)recnum, (int)length,(int)dedup, (int) dedup_interior, dedup_compress, 0); de_ibuf = (long *)buffer; de_obuf = (long *)dedup_temp; if(lite) /* short touch to reduce intrusion */ length = (long long) sizeof(long); for(i=0;i<(off64_t) (length/sizeof(long));i++) { if(de_ibuf[i]!= de_obuf[i]) { if(!silent) #ifdef NO_PRINT_LLD printf("\nDedup mis-compare at %ld\n", (long long)((recnum*recsize)+(i*sizeof(long))) ); #else printf("\nDedup mis-compare at %lld\n", (long long)((recnum*recsize)+(i*sizeof(long))) ); printf("Found %.lx Expecting %.lx \n",de_ibuf[i], de_obuf[i]); #endif return(1); } } return(0); } if(diag_v) { if(no_unlink) base_time=0; seed= (unsigned int)(base_time+xx2+recnum); srand(seed); mpattern=(long long)rand(); mpattern=(mpattern<<48) | (mpattern<<32) | (mpattern<<16) | mpattern; mpattern=mpattern+value; } /* printf("verify patt %llx CHid %d\n",mpattern,chid);*/ where=(unsigned long long *)buffer; if(!verify) printf("\nOOPS You have entered verify_buffer unexpectedly !!! \n"); if(sverify == 1) { for(i=0;i<(length);i+=page_size) { if((unsigned long long)(*where) != (unsigned long long)((pattern_buf<<32) | pattern_buf)) { file_position = (off64_t)( (recnum * recsize)+ i); printf("\n\n"); #ifdef NO_PRINT_LLD printf("Error in file: Found ?%lx? Expecting ?%lx? addr %lx\n",*where, (long long)((pattern_buf<<32)|pattern_buf),where); printf("Error in file: Position %ld \n",(long long)file_position); printf("Record # %ld Record size %ld kb \n",(long long)recnum,(long long)recsize/1024); printf("where %8.8lx loop %ld\n",where,i); #else printf("Error in file: Found ?%llx? Expecting ?%llx? addr %lx\n",(long long )(*where), (long long)((pattern_buf<<32)|pattern_buf),((long)where)); printf("Error in file: Position %lld \n",(long long)file_position); printf("Record # %lld Record size %lld kb \n",(long long)recnum,(long long)recsize/1024); printf("where %px loop %lld\n",where,(long long)i); #endif return(1); } where+=(page_size/sizeof(long long)); } } if(sverify == 0) { for(i=0;i<(length/cache_line_size);i++) { for(j=0;j<(long long)(cache_line_size/sizeof(long long));j++) { if(diag_v) { pattern_buf=mpattern; } else { pattern_buf= mpattern<<32 | mpattern; } pattern_ptr =(char *)&pattern_buf; if(*where != (unsigned long long)pattern_buf) { file_position = (off64_t)( (recnum * recsize))+ ((i*cache_line_size)+(j*sizeof(long long))); where2=(char *)where; for(k=0;k<(long long)(sizeof(long long));k++){ if(*where2 != *pattern_ptr) break; where2++; pattern_ptr++; } file_position+=k; printf("\n\n"); #ifdef NO_PRINT_LLD printf("Error in file: Position %ld %ld %ld \n",(long long)i,(long long)j,(long long)k); printf("Error in file: Position %ld \n",(long long)file_position); printf("Record # %ld Record size %ld kb \n",(long long)recnum,(long long)recsize/1024); #else printf("Error in file: Position %lld %lld %lld \n",(long long)i,(long long)j,(long long)k); printf("Error in file: Position %lld \n",(long long)file_position); printf("Record # %lld Record size %lld kb \n",(long long)recnum,(long long)recsize/1024); #endif printf("Found pattern: Char >>%c<< Expecting >>%c<<\n", *where2,*pattern_ptr); printf("Found pattern: Hex >>%x<< Expecting >>%x<<\n", *where2,*pattern_ptr); return(1); } where++; if(diag_v) mpattern=mpattern+value1; } } } return(0); } /************************************************************************/ /* Fill the buffer */ /************************************************************************/ #ifdef HAVE_ANSIC_C void fill_buffer(char *buffer,long long length,long long pattern,char sverify,long long recnum) #else void fill_buffer(buffer,length,pattern,sverify,recnum) char *buffer; long long length; long long pattern; long long recnum; char sverify; #endif { unsigned long long *where; long long i,j,xx2; long long mpattern; unsigned int seed; unsigned long x; unsigned long long value,value1; unsigned long long a = 0x01020304; unsigned long long b = 0x05060708; unsigned long long c = 0x01010101; unsigned long long d = 0x01010101; value = (a << 32) | b; value1 = (c << 32) | d; xx2=chid; if(share_file) xx2=(long long)0; x=0; mpattern=pattern; /* printf("Fill: Sverify %d verify %d diag_v %d\n",sverify,verify,diag_v);*/ if(dedup_flag) { gen_new_buf((char *)dedup_ibuf,(char *)buffer, (long)recnum, (int)length,(int)dedup, (int) dedup_interior, dedup_compress, 1); return; } if(diag_v) { /*if(client_iozone) base_time=0; */ if(no_unlink) base_time=0; seed= (unsigned int)(base_time+xx2+recnum); srand(seed); mpattern=(long long)rand(); mpattern=(mpattern<<48) | (mpattern<<32) | (mpattern<<16) | mpattern; mpattern=mpattern+value; } where=(unsigned long long *)buffer; if(sverify == 1) { for(i=0;i<(length);i+=page_size) { *where = (long long)((pattern<<32) | pattern); where+=(page_size/sizeof(long long)); /* printf("Filling page %lld \n",i/page_size);*/ } } else { for(i=0;i<(length/cache_line_size);i++) { for(j=0;j<(long long)((cache_line_size/sizeof(long long)));j++) { if(diag_v) { *where = (long long)(mpattern); mpattern=mpattern+value1; } else *where = (long long)((pattern<<32) | pattern); where++; } } } } /************************************************************************/ /* PURGEIT() */ /* */ /* Routine to make the on chip data cache cold for this buffer. */ /* Remember, on some machines, the data cache is direct mapped and */ /* virtual indexed. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void purgeit(char *buffer,long long reclen) #else void purgeit(buffer,reclen) char *buffer; long long reclen; #endif { char *where; long rsize; long tsize; VOLATILE long long x[200]; long i,cache_lines_per_rec; long cache_lines_per_cache; tsize = 200; cache_lines_per_rec = (long)(reclen/cache_line_size); cache_lines_per_cache = (long)(cache_size/cache_line_size); rsize = (long)l_min((long long)cache_lines_per_rec,(long long)cache_lines_per_cache); #ifdef _64BIT_ARCH_ where=(char *)pbuffer + ((unsigned long long)buffer & (cache_size-1)); #else where=(char *)pbuffer + ((long)buffer & ((long)cache_size-1)); #endif for(i=0;i<(rsize);i++) { x[i%tsize]=*(where); where+=cache_line_size; } } #ifdef HAVE_ANSIC_C void prepage(char *buffer,long long reclen) #else void prepage(buffer, reclen) char *buffer; long long reclen; #endif { char *where; long long i; where=(char *)buffer; for(i=0;i<(reclen/cache_line_size);i++) { *(where)=PATTERN; where+=cache_line_size; } } /************************************************************************/ /* write_perf_test () */ /* Write and re-write test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void write_perf_test(off64_t kilo64,long long reclen ,long long *data1,long long *data2) #else void write_perf_test(kilo64,reclen ,data1,data2) off64_t kilo64; long long reclen; long long *data1; long long *data2; #endif { double burst_sleep_time_till_now[2] = {0, 0}; long long cur_off; double starttime1; double writetime[2]; double walltime[2], cputime[2]; double qtime_start,qtime_stop; double hist_time; double compute_val = (double)0; #ifdef unix double qtime_u_start,qtime_u_stop; double qtime_s_start,qtime_s_stop; #endif long long i,j; off64_t numrecs64,traj_offset; off64_t lock_offset=0; long long Index = 0; int file_flags = 0; long long traj_size; unsigned long long writerate[2]; off64_t filebytes64; int ltest; char *maddr; char *wmaddr,*free_addr; char *pbuff; char *nbuff; int fd,wval; #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif int test_foo; #ifdef unix qtime_u_start=qtime_u_stop=0; qtime_s_start=qtime_s_stop=0; #endif nbuff=wmaddr=free_addr=0; traj_offset=0; test_foo=0; hist_time=qtime_start=qtime_stop=0; maddr=0; pbuff=mainbuffer; if(w_traj_flag) { filebytes64 = w_traj_fsize; numrecs64=w_traj_ops; } else { numrecs64 = (kilo64*1024)/reclen; filebytes64 = numrecs64*reclen; } if(Q_flag && (!wol_opened)) { wol_opened++; wqfd=fopen("wol.dat","a"); if(wqfd==0) { printf("Unable to open wol.dat\n"); exit(40); } fprintf(wqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); rwqfd=fopen("rwol.dat","a"); if(rwqfd==0) { printf("Unable to open rwol.dat\n"); exit(41); } fprintf(rwqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); } fd = 0; if(oflag) file_flags = O_RDWR|O_SYNC; else file_flags = O_RDWR; #if defined(O_DSYNC) if(odsync) file_flags |= O_DSYNC; #endif #if defined(_HPUX_SOURCE) || defined(linux) || defined(__FreeBSD__) || defined(__DragonFly__) if(read_sync) file_flags |=O_RSYNC|O_SYNC; #endif #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) file_flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) file_flags |=O_DIRECTIO; #endif #endif /* Sanity check */ /* Some filesystems do not behave correctly and fail * when this sequence is performned. This is a very * bad thing. It breaks many applications and lurks * around quietly. This code should never get * triggered, but in the case of running iozone on * an NFS client, the filesystem type on the server * that is being exported can cause this failure. * If this failure happens, then the NFS client is * going to going to have problems, but the acutal * problem is the filesystem on the NFS server. * It's not NFS, it's the local filesystem on the * NFS server that is not correctly permitting * the sequence to function. */ /* _SUA_ Services for Unix Applications, under Windows does not have a truncate, so this must be skipped */ #if !defined(_SUA_) if((fd = I_OPEN(filename, (int)O_CREAT|O_WRONLY,0))<0) { printf("\nCan not open temp file: %s\n", filename); perror("open"); exit(44); } if(!notruncate) { if(check_filename(filename)) { wval=ftruncate(fd,0); if(wval < 0) { printf("\n\nSanity check failed. Do not deploy this filesystem in a production environment !\n"); exit(44); } } close(fd); if(check_filename(filename)) unlink(filename); } /* Sanity check */ #endif if(noretest) ltest=1; else ltest=2; for( j=0; j (MAXBUFFERSIZE-reclen)) Index=0; pbuff = mbuffer + Index; if(diag_v) { if(verify || dedup_flag || dedup_iflag) fill_buffer(pbuff,reclen,(long long)pattern,sverify,(long long)i); } else { if(verify || dedup_flag || dedup_iflag) fill_buffer(pbuff,reclen,(long long)pattern,sverify,(long long)0); } } if(async_flag && no_copy_flag) { free_addr=nbuff=(char *)malloc((size_t)reclen+page_size); nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); if(verify || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,i); if(purge) purgeit(nbuff,reclen); } if(purge) purgeit(pbuff,reclen); if(Q_flag || hist_summary) { qtime_start=time_so_far(); } if(mmapflag) { wmaddr = &maddr[i*reclen]; fill_area((long long*)pbuff,(long long*)wmaddr,(long long)reclen); if(!mmapnsflag) { if(mmapasflag) msync(wmaddr,(size_t)reclen,MS_ASYNC); if(mmapssflag) msync(wmaddr,(size_t)reclen,MS_SYNC); } } else { if(async_flag) { #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif if(no_copy_flag) async_write_no_copy(gc, (long long)fd, nbuff, reclen, (i*reclen), depth,free_addr); else async_write(gc, (long long)fd, pbuff, reclen, (i*reclen), depth); #ifdef ASYNC_IO end_async(gc); gc=0; #endif } else { #if defined(Windows) if(unbuffered) { if((dedup_flag && sparse_mode ) && !(dedup_iflag || dedup_bflag) { zsize = (dedup * reclen )/100; I_LSEEK(hand,(zsize),SEEK_CUR); WriteFile(hand, pbuff+zsize, reclen - zsize,(LPDWORD)&wval, wval = zsize + wval; } else { WriteFile(hand, pbuff, reclen,(LPDWORD)&wval, 0); } } else { #endif if((dedup_flag && sparse_mode ) && !(dedup_iflag || dedup_bflag)) { zsize = (dedup * reclen )/100; I_LSEEK(fd,zsize,SEEK_CUR); wval = write(fd,pbuff+zsize,reclen - zsize); wval = zsize + wval; } else { wval=write(fd, pbuff, (size_t ) reclen); } if(wval != reclen) { #ifdef NO_PRINT_LLD printf("\nError writing block %ld, fd= %d\n", i, fd); #else printf("\nError writing block %lld, fd= %d\n", i, fd); #endif if(wval == -1) perror("write"); exit_code = 74; signal_handler(); } #if defined(Windows) } #endif /* The burst work does not work for async or memory * mapped IO */ if (wval != -1) update_burst_sleep(fd, wval, &burst_sleep_time_till_now[j]); } } if(hist_summary) { qtime_stop=time_so_far(); hist_time =(qtime_stop-qtime_start-time_res); hist_insert(hist_time); } if(Q_flag) { qtime_stop=time_so_far(); if(j==0) #ifdef NO_PRINT_LLD fprintf(wqfd,"%10.1ld %10.0f %10.1ld\n",(long long)(traj_offset)/1024,((qtime_stop-qtime_start-time_res))*1000000,(long long)reclen); else fprintf(rwqfd,"%10.1ld %10.0f %10.1ld\n",(long long)(traj_offset)/1024,((qtime_stop-qtime_start-time_res))*1000000,(long long)reclen); #else fprintf(wqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,((qtime_stop-qtime_start-time_res))*1000000,(long long)reclen); else fprintf(rwqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,((qtime_stop-qtime_start-time_res))*1000000,(long long)reclen); #endif } w_traj_ops_completed++; w_traj_bytes_completed+=reclen; if(rlocking) { mylockr((int) fd, (int) 0, (int)0, lock_offset, reclen); } } #ifdef unix if(Q_flag) { qtime_u_stop=utime_so_far(); qtime_s_stop=stime_so_far(); if(j==0) fprintf(wqfd,"\nSystem time %10.3f User time %10.3f Real %10.3f (seconds)\n", (qtime_s_stop-qtime_s_start)/sc_clk_tck, (qtime_u_stop-qtime_u_start)/sc_clk_tck, time_so_far()-starttime1); else fprintf(rwqfd,"\nSystem time %10.3f User time %10.3f Real %10.3f (seconds)\n", (qtime_s_stop-qtime_s_start)/sc_clk_tck, (qtime_u_stop-qtime_u_start)/sc_clk_tck, time_so_far()-starttime1); } #endif /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(include_flush) { if(mmapflag){ msync(maddr,(size_t)filebytes64,MS_SYNC); } else { wval=fsync(fd); if(wval==-1){ perror("fsync"); signal_handler(); } } } if(file_lock) if(mylockf((int) fd,(int)0,(int)0)) printf("Unlock failed %d\n",errno); if(include_close) { if(mmapflag) { mmap_end(maddr,(unsigned long long)filebytes64); } #if defined(Windows) if(unbuffered) CloseHandle(hand); else #endif wval=close(fd); if(wval==-1){ perror("close"); signal_handler(); } } if(inc_think) writetime[j] = ((time_so_far() - starttime1)-time_res - burst_sleep_time_till_now[j]); else writetime[j] = ((time_so_far() - starttime1)-time_res - burst_sleep_time_till_now[j]) -compute_val; if(writetime[j] < (double).000001) { writetime[j]=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(!include_close) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC);/* Clean up before read starts */ else { wval=fsync(fd); if(wval==-1){ perror("fsync"); signal_handler(); } } if(mmapflag) { mmap_end(maddr,(unsigned long long)filebytes64); } #if defined(Windows) if(unbuffered) CloseHandle(hand); else #endif wval=close(fd); if(wval==-1){ perror("close"); signal_handler(); } } if(cpuutilflag) { cputime[j] = cputime_so_far() - cputime[j]; if (cputime[j] < cputime_res) cputime[j] = 0.0; walltime[j] = time_so_far() - walltime[j]; if (walltime[j] < cputime[j]) walltime[j] = cputime[j]; } if(restf) sleep((int)rest_val); } if(OPS_flag || MS_flag){ filebytes64=w_traj_ops_completed; /*filebytes64=filebytes64/reclen;*/ }else filebytes64=w_traj_bytes_completed; for(j=0;j>= 10; } data1[0]=writerate[0]; if(noretest) { writerate[1]=(long long) 0; if(cpuutilflag) { walltime[1]=0.0; cputime[1]=0.0; } } /* Must save walltime & cputime before calling store_value() for each/any cell.*/ if(cpuutilflag) store_times(walltime[0], cputime[0]); store_value((off64_t)writerate[0]); if(cpuutilflag) store_times(walltime[1], cputime[1]); store_value((off64_t)writerate[1]); #ifdef NO_PRINT_LLD if(!silent) printf("%10ld",writerate[0]); if(!silent) printf("%10ld",writerate[1]); if(!silent) fflush(stdout); #else if(!silent) printf("%10lld",writerate[0]); if(!silent) printf("%10lld",writerate[1]); if(!silent) fflush(stdout); #endif } /************************************************************************/ /* fwrite_perf_test () */ /* fWrite and fre-write test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void fwrite_perf_test(off64_t kilo64,long long reclen ,long long *data1,long long *data2) #else void fwrite_perf_test(kilo64,reclen ,data1,data2) off64_t kilo64; long long reclen; long long *data1; long long *data2; #endif { double burst_sleep_time_till_now[2] = {0, 0}; double starttime1; double writetime[2]; double walltime[2], cputime[2]; double compute_val = (double)0; long long i,j; off64_t numrecs64; long long Index = 0; unsigned long long writerate[2]; off64_t filebytes64; FILE *stream = NULL; int fd; int wval; int ltest; char *how; char *stdio_buf; if(mmapflag || async_flag) return; numrecs64 = (kilo64*1024)/reclen; filebytes64 = numrecs64*reclen; stdio_buf=(char *)malloc((size_t)reclen); if(noretest) ltest=1; else ltest=2; for( j=0; j (MAXBUFFERSIZE-reclen)) Index=0; buffer = mbuffer + Index; } if((verify & diag_v) || dedup_flag || dedup_iflag) fill_buffer(buffer,reclen,(long long)pattern,sverify,i); if(purge) purgeit(buffer,reclen); if(fwrite(buffer, (size_t) reclen, 1, stream) != 1) { #ifdef NO_PRINT_LLD printf("\nError fwriting block %ld, fd= %d\n", i, fd); #else printf("\nError fwriting block %lld, fd= %d\n", i, fd); #endif perror("fwrite"); exit_code = 74; signal_handler(); } update_burst_sleep(fd, reclen, &burst_sleep_time_till_now[j]); } if(include_flush) { fflush(stream); wval=fsync(fd); if(wval==-1){ perror("fsync"); signal_handler(); } } if(include_close) { wval=fclose(stream); if(wval==-1){ perror("fclose"); signal_handler(); } } if(inc_think) writetime[j] = ((time_so_far() - starttime1)-time_res - burst_sleep_time_till_now[j]); else writetime[j] = ((time_so_far() - starttime1)-time_res - burst_sleep_time_till_now[j]) -compute_val; if(writetime[j] < (double).000001) { writetime[j]= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(!include_close) { wval=fflush(stream); if(wval==-1){ perror("fflush"); signal_handler(); } wval=fsync(fd); if(wval==-1){ perror("fsync"); signal_handler(); } wval=fclose(stream); if(wval==-1){ perror("fclose"); signal_handler(); } } if(cpuutilflag) { cputime[j] = cputime_so_far() - cputime[j]; if (cputime[j] < cputime_res) cputime[j] = 0.0; walltime[j] = time_so_far() - walltime[j]; if (walltime[j] < cputime[j]) walltime[j] = cputime[j]; } if(restf) sleep((int)(int)rest_val); } free(stdio_buf); if(OPS_flag || MS_flag){ filebytes64=filebytes64/reclen; } for(j=0;j>= 10; } /* Must save walltime & cputime before calling store_value() for each/any cell.*/ if(noretest) { writerate[1]=(long long)0; if(cpuutilflag) { walltime[1]=0.0; cputime[1]=0.0; } } if(cpuutilflag) store_times(walltime[0], cputime[0]); store_value((off64_t)writerate[0]); if(cpuutilflag) store_times(walltime[1], cputime[1]); store_value((off64_t)writerate[1]); data1[0]=writerate[0]; #ifdef NO_PRINT_LLD if(!silent) printf("%10ld",writerate[0]); if(!silent) printf("%10ld",writerate[1]); if(!silent) fflush(stdout); #else if(!silent) printf("%10lld",writerate[0]); if(!silent) printf("%10lld",writerate[1]); if(!silent) fflush(stdout); #endif } /************************************************************************/ /* fread_perf_test */ /* fRead and fre-read test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void fread_perf_test(off64_t kilo64,long long reclen,long long *data1,long long *data2) #else void fread_perf_test(kilo64,reclen,data1,data2) off64_t kilo64; long long reclen; long long *data1,*data2; #endif { double starttime2; double readtime[2]; double walltime[2], cputime[2]; double compute_val = (double)0; long long j; off64_t i,numrecs64; long long Index = 0; unsigned long long readrate[2]; off64_t filebytes64; FILE *stream = 0; char *stdio_buf; int fd,ltest; if(mmapflag || async_flag) return; numrecs64 = (kilo64*1024)/reclen; filebytes64 = numrecs64*reclen; stdio_buf=(char *)malloc((size_t)reclen); if(noretest) ltest=1; else ltest=2; for( j=0; j (MAXBUFFERSIZE-reclen)) Index=0; buffer = mbuffer + Index; } if(purge) purgeit(buffer,reclen); if(fread(buffer, (size_t) reclen,1, stream) != 1) { #ifdef _64BIT_ARCH_ #ifdef NO_PRINT_LLD printf("\nError freading block %lu %lx\n", (long long)i, (unsigned long long)buffer); #else printf("\nError freading block %llu %llx\n", (long long)i, (unsigned long long)buffer); #endif #else #ifdef NO_PRINT_LLD printf("\nError freading block %lu %lx\n", (long long)i, (long)buffer); #else printf("\nError freading block %llu %lx\n", (long long)i, (long)buffer); #endif #endif perror("read"); exit(54); } if(verify){ if(verify_buffer(buffer,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ exit(55); } } } if(include_flush) fflush(stream); if(include_close) { fclose(stream); } if(inc_think) readtime[j] = ((time_so_far() - starttime2)-time_res); else readtime[j] = ((time_so_far() - starttime2)-time_res) -compute_val; if(readtime[j] < (double).000001) { readtime[j]= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(!include_close) { fflush(stream); fclose(stream); } stream = NULL; if(cpuutilflag) { cputime[j] = cputime_so_far() - cputime[j]; if (cputime[j] < cputime_res) cputime[j] = 0.0; walltime[j] = time_so_far() - walltime[j]; if (walltime[j] < cputime[j]) walltime[j] = cputime[j]; } if(restf) sleep((int)rest_val); } free(stdio_buf); if(OPS_flag || MS_flag){ filebytes64=filebytes64/reclen; } for(j=0;j>= 10; } data1[0]=readrate[0]; data2[0]=1; if(noretest) { readrate[1]=(long long)0; if(cpuutilflag) { walltime[1]=0.0; cputime[1]=0.0; } } /* Must save walltime & cputime before calling store_value() for each/any cell.*/ if(cpuutilflag) store_times(walltime[0], cputime[0]); store_value((off64_t)readrate[0]); if(cpuutilflag) store_times(walltime[1], cputime[1]); store_value((off64_t)readrate[1]); #ifdef NO_PRINT_LLD if(!silent) printf("%10ld",readrate[0]); if(!silent) printf("%10ld",readrate[1]); if(!silent) fflush(stdout); #else if(!silent) printf("%10lld",readrate[0]); if(!silent) printf("%10lld",readrate[1]); if(!silent) fflush(stdout); #endif } /************************************************************************/ /* read_perf_test */ /* Read and re-fread test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void read_perf_test(off64_t kilo64,long long reclen,long long *data1,long long *data2) #else void read_perf_test(kilo64,reclen,data1,data2) off64_t kilo64; long long reclen; long long *data1,*data2; #endif { double starttime2; double compute_val = (double)0; double readtime[2]; double walltime[2], cputime[2]; #ifdef unix double qtime_u_start,qtime_u_stop; double qtime_s_start,qtime_s_stop; #endif long long j; long long traj_size; off64_t i,numrecs64,traj_offset; off64_t lock_offset=0; long long Index = 0; unsigned long long readrate[2]; off64_t filebytes64; volatile char *buffer1; char *nbuff; char *maddr; char *wmaddr; int fd,open_flags; int test_foo,ltest; long wval; double qtime_start,qtime_stop; double hist_time; #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif #ifdef unix qtime_u_start=qtime_u_stop=0; qtime_s_start=qtime_s_stop=0; #endif hist_time=qtime_start=qtime_stop=0; maddr=0; traj_offset=0; test_foo=0; numrecs64 = (kilo64*1024)/reclen; open_flags = O_RDONLY; #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) open_flags |=O_RSYNC|O_SYNC; #endif #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) open_flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) open_flags |=O_DIRECTIO; #endif #endif if(r_traj_flag) { numrecs64=r_traj_ops; filebytes64 = r_traj_fsize; } else filebytes64 = numrecs64*reclen; fd = 0; if(Q_flag && (!rol_opened)) { rol_opened++; rqfd=fopen("rol.dat","a"); if(rqfd==0) { printf("Unable to open rol.dat\n"); exit(56); } fprintf(rqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); rrqfd=fopen("rrol.dat","a"); if(rrqfd==0) { printf("Unable to open rrol.dat\n"); exit(57); } fprintf(rrqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); } /* * begin real testing */ if(noretest) ltest=1; else ltest=2; for( j=0; j (MAXBUFFERSIZE-reclen)) Index=0; nbuff = mbuffer + Index; } if(purge) purgeit(nbuff,reclen); if(Q_flag || hist_summary) qtime_start=time_so_far(); if(mmapflag) { wmaddr=&maddr[i*reclen]; fill_area((long long*)wmaddr,(long long*)nbuff,(long long)reclen); } else { if(async_flag) { #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif if(no_copy_flag) async_read_no_copy(gc, (long long)fd, (char **)&buffer1, (off64_t)(i*reclen), (long long)reclen, 1LL,(long long)(numrecs64*reclen),depth); else async_read(gc, (long long)fd, nbuff, (i*reclen),reclen, 1LL,(numrecs64*reclen),depth); } else { #if defined(Windows) if(unbuffered) { if((dedup_flag && sparse_mode ) && !(dedup_iflag || dedup_bflag)) { zsize = (dedup * reclen )/100; ReadFile(hand, nbuff, reclen-zsize,(LPDWORD)&wval, I_LSEEK(fd,zsize,SEEK_CUR); wval = zsize + wval; } else { ReadFile(hand, nbuff, reclen,(LPDWORD)&wval, 0); } } else #endif if((dedup_flag && sparse_mode ) && !(dedup_iflag || dedup_bflag)) { zsize = (dedup * reclen )/100; wval=read((int)fd, (void*)nbuff, (size_t) reclen-zsize); I_LSEEK(fd,zsize,SEEK_CUR); wval = zsize + wval; } else { wval=read((int)fd, (void*)nbuff, (size_t) reclen); } if(wval != reclen) { #ifdef _64BIT_ARCH_ #ifdef NO_PRINT_LLD printf("\nError reading block %ld %lx\n", (long)i, (unsigned long long)nbuff); #else printf("\nError reading block %lld %llx\n", (long long)i, (unsigned long long)nbuff); #endif #else #ifdef NO_PRINT_LLD printf("\nError reading block %ld %x\n", (long)i, (long)nbuff); #else printf("\nError reading block %lld %lx\n", (long long)i, (long)nbuff); #endif #endif perror("read"); exit(61); } } } if(verify) { if(async_flag && no_copy_flag) { if(verify_buffer(buffer1,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ exit(62); } } else { if(verify_buffer(nbuff,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ exit(63); } } } if(async_flag) { if(no_copy_flag) async_release(gc); end_async(gc); gc=0; } buffer1=0; if(hist_summary) { qtime_stop=time_so_far(); hist_time =(qtime_stop-qtime_start-time_res); hist_insert(hist_time); } if(Q_flag) { qtime_stop=time_so_far(); if(j==0) #ifdef NO_PRINT_LLD fprintf(rqfd,"%10.1ld %10.0f %10.1ld\n",(long)(traj_offset)/1024,(qtime_stop-qtime_start-time_res)*1000000,(long)reclen); else fprintf(rrqfd,"%10.1ld %10.0f %10.1ld\n",(long)(traj_offset)/1024,(qtime_stop-qtime_start-time_res)*1000000,(long)reclen); #else fprintf(rqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,(qtime_stop-qtime_start-time_res)*1000000,(long long)reclen); else fprintf(rrqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,(qtime_stop-qtime_start-time_res)*1000000,(long long)reclen); #endif } r_traj_ops_completed++; r_traj_bytes_completed+=reclen; } if(rlocking) { mylockr((int) fd, (int) 0, (int)1, lock_offset, reclen); } if(file_lock) if(mylockf((int) fd, (int) 0, (int)1)) printf("Read unlock failed. %d\n",errno); #ifdef unix if(Q_flag) { qtime_u_stop=utime_so_far(); qtime_s_stop=stime_so_far(); if(j==0) fprintf(rqfd,"\nSystem time %10.3f User time %10.3f Real %10.3f (seconds)\n", (qtime_s_stop-qtime_s_start)/sc_clk_tck, (qtime_u_stop-qtime_u_start)/sc_clk_tck, time_so_far()-starttime2); else fprintf(rrqfd,"\nSystem time %10.3f User time %10.3f Real %10.3f (seconds)\n", (qtime_s_stop-qtime_s_start)/sc_clk_tck, (qtime_u_stop-qtime_u_start)/sc_clk_tck, time_so_far()-starttime2); } #endif /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(include_flush) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC); else fsync(fd); } if(include_close) { if(mmapflag) { mmap_end(maddr,(unsigned long long)filebytes64); } #if defined(Windows) if(unbuffered) CloseHandle(hand); else #endif close(fd); } if(inc_think) readtime[j] = ((time_so_far() - starttime2)-time_res); else readtime[j] = ((time_so_far() - starttime2)-time_res)-compute_val; if(readtime[j] < (double).000001) { readtime[j]= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(!include_close) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC); else fsync(fd); if(mmapflag) { mmap_end(maddr,(unsigned long long)filebytes64); } #if defined(Windows) if(unbuffered) CloseHandle(hand); else #endif close(fd); } if(cpuutilflag) { cputime[j] = cputime_so_far() - cputime[j]; if (cputime[j] < cputime_res) cputime[j] = 0.0; walltime[j] = time_so_far() - walltime[j]; if (walltime[j] < cputime[j]) walltime[j] = cputime[j]; } if(restf) sleep((int)rest_val); } if(OPS_flag || MS_flag){ filebytes64=r_traj_ops_completed; /*filebytes64=filebytes64/reclen;*/ } else filebytes64=r_traj_bytes_completed; for(j=0;j>= 10; } data1[0]=readrate[0]; data2[0]=1; if(noretest) { readrate[1]=(long long)0; if(cpuutilflag) { walltime[1]=0.0; cputime[1]=0.0; } } /* Must save walltime & cputime before calling store_value() for each/any cell.*/ if(cpuutilflag) store_times(walltime[0], cputime[0]); store_value((off64_t)readrate[0]); if(cpuutilflag) store_times(walltime[1], cputime[1]); store_value((off64_t)readrate[1]); #ifdef NO_PRINT_LLD if(!silent) printf("%10ld",readrate[0]); if(!silent) printf("%10ld",readrate[1]); if(!silent) fflush(stdout); #else if(!silent) printf("%10lld",readrate[0]); if(!silent) printf("%10lld",readrate[1]); if(!silent) fflush(stdout); #endif } /************************************************************************/ /* random_perf_test */ /* Random read and write test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void random_perf_test(off64_t kilo64,long long reclen,long long *data1,long long *data2) #else void random_perf_test(kilo64,reclen,data1,data2) off64_t kilo64; long long reclen; long long *data1, *data2; #endif { double randreadtime[2]; double starttime2; double walltime[2], cputime[2]; double compute_val = (double)0; #if defined (bsd4_2) || defined(Windows) long long rand1,rand2,rand3; #endif unsigned long long big_rand; long long j; off64_t i,numrecs64; long long Index=0; double burst_sleep_time_till_now[2] = {0, 0}; int flags; unsigned long long randreadrate[2]; off64_t filebytes64; off64_t lock_offset=0; volatile char *buffer1; char *wmaddr,*nbuff; char *maddr,*free_addr; int fd,wval; long long *recnum= 0; #if defined(VXFS) || defined(solaris) int test_foo=0; #endif #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif #ifdef MERSENNE unsigned long long init[4]={0x12345ULL, 0x23456ULL, 0x34567ULL, 0x45678ULL}; unsigned long long length=4; #endif maddr=free_addr=0; numrecs64 = (kilo64*1024)/reclen; #ifdef MERSENNE init_by_array64(init, length); #else #ifdef bsd4_2 srand(0); #else #ifdef Windows srand(0); #else srand48(0); #endif #endif #endif recnum = (long long *)malloc(sizeof(*recnum)*numrecs64); if (recnum){ /* pre-compute random sequence based on Fischer-Yates (Knuth) card shuffle */ for(i = 0; i < numrecs64; i++){ recnum[i] = i; } for(i = numrecs64-1; i >= 0; i--) { long long tmp; #ifdef MERSENNE big_rand=genrand64_int64(); #else #ifdef bsd4_2 rand1=(long long)rand(); rand2=(long long)rand(); rand3=(long long)rand(); big_rand=(rand1<<32)|(rand2<<16)|(rand3); #else #ifdef Windows rand1=(long long)rand(); rand2=(long long)rand(); rand3=(long long)rand(); big_rand=(rand1<<32)|(rand2<<16)|(rand3); #else big_rand = lrand48(); #endif #endif #endif big_rand = big_rand % (i+1); tmp = recnum[i]; recnum[i] = recnum[big_rand]; recnum[big_rand] = tmp; } } else { fprintf(stderr,"Random uniqueness fallback.\n"); } flags = O_RDWR; #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) flags |=O_DIRECTIO; #endif #endif fd=0; if(oflag) flags |= O_SYNC; #if defined(O_DSYNC) if(odsync) flags |= O_DSYNC; #endif #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) flags |=O_RSYNC|O_SYNC; #endif filebytes64 = numrecs64*reclen; for( j=0; j<2; j++ ) { if(j==0) flags |=O_CREAT; if (no_write && (j == 1)) continue; if(cpuutilflag) { walltime[j] = time_so_far(); cputime[j] = cputime_so_far(); } if(Uflag) /* Unmount and re-mount the mountpoint */ { purge_buffer_cache(); } if((fd = I_OPEN(filename, ((int)flags),0640))<0){ printf("\nCan not open temporary file for read/write\n"); perror("open"); exit(66); } /* #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif */ #ifdef VXFS if(direct_flag) { ioctl(fd,VX_SETCACHE,VX_DIRECT); ioctl(fd,VX_GETCACHE,&test_foo); if(test_foo == 0) { if(!client_iozone) printf("\nVxFS advanced setcache feature not available.\n"); exit(3); } } #endif #if defined(solaris) if(direct_flag) { test_foo = directio(fd, DIRECTIO_ON); if(test_foo != 0) { if(!client_iozone) printf("\ndirectio not available.\n"); exit(3); } } #endif if(mmapflag) { maddr=(char *)initfile(fd,filebytes64,0,PROT_READ|PROT_WRITE); } nbuff=mainbuffer; if(fetchon) fetchit(nbuff,reclen); #ifdef MERSENNE init_by_array64(init, length); #else #ifdef bsd4_2 srand(0); #else #ifdef Windows srand(0); #else srand48(0); #endif #endif #endif compute_val=(double)0; starttime2 = time_so_far(); if ( j==0 ){ /* start read */ for(i=0; i (MAXBUFFERSIZE-reclen)) Index=0; nbuff = mbuffer + Index; } if(purge) purgeit(nbuff,reclen); if (recnum) { offset64 = reclen * (long long)recnum[i]; } else { #ifdef MERSENNE big_rand =genrand64_int64(); offset64 = reclen * (big_rand%numrecs64); #else #ifdef bsd4_2 rand1=(long long)rand(); rand2=(long long)rand(); rand3=(long long)rand(); big_rand=(rand1<<32)|(rand2<<16)|(rand3); offset64 = reclen * (big_rand%numrecs64); #else #ifdef Windows rand1=(long long)rand(); rand2=(long long)rand(); rand3=(long long)rand(); big_rand=(rand1<<32)|(rand2<<16)|(rand3); offset64 = reclen * (big_rand%numrecs64); #else offset64 = reclen * (lrand48()%numrecs64); #endif #endif #endif } if( !(h_flag || k_flag || mmapflag)) { if(I_LSEEK( fd, offset64, SEEK_SET )<0) { perror("lseek"); exit(68); }; } if(rlocking) { lock_offset=I_LSEEK(fd,0,SEEK_CUR); mylockr((int) fd, (int) 1, (int)1, lock_offset, reclen); } if(mmapflag) { wmaddr=&maddr[offset64]; fill_area((long long*)wmaddr,(long long*)nbuff,(long long)reclen); } else { if(async_flag) { #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif if(no_copy_flag) async_read_no_copy(gc, (long long)fd, (char **)&buffer1, offset64,reclen, 0LL,(numrecs64*reclen),depth); else async_read(gc, (long long)fd, nbuff, (offset64),reclen, 0LL,(numrecs64*reclen),0LL); } else { if(read(fd, (void *)nbuff, (size_t)reclen) != reclen) { #ifdef NO_PRINT_LLD printf("\nError reading block at %ld\n", (long)offset64); #else printf("\nError reading block at %lld\n", (long long)offset64); #endif perror("read"); exit(70); } } } if(verify){ if(async_flag && no_copy_flag) { if(verify_buffer(buffer1,reclen,(off64_t)offset64/reclen,reclen,(long long)pattern,sverify)){ exit(71); } } else { if(verify_buffer(nbuff,reclen,(off64_t)offset64/reclen,reclen,(long long)pattern,sverify)){ exit(72); } } } if(async_flag) { if(no_copy_flag) async_release(gc); end_async(gc); gc=0; } if(rlocking) { lock_offset=I_LSEEK(fd,0,SEEK_CUR); mylockr((int) fd, (int) 1, (int)1, lock_offset, reclen); } } } /* start write */ else { if(verify || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); for(i=0; i (MAXBUFFERSIZE-reclen)) Index=0; nbuff = mbuffer + Index; } if (recnum) { offset64 = reclen * (long long)recnum[i]; } else { #ifdef bsd4_2 rand1=(long long)rand(); rand2=(long long)rand(); rand3=(long long)rand(); big_rand=(rand1<<32)|(rand2<<16)|(rand3); offset64 = reclen * (big_rand%numrecs64); #else #ifdef Windows rand1=(long long)rand(); rand2=(long long)rand(); rand3=(long long)rand(); big_rand=(rand1<<32)|(rand2<<16)|(rand3); offset64 = reclen * (big_rand%numrecs64); #else offset64 = reclen * (lrand48()%numrecs64); #endif #endif } if(async_flag && no_copy_flag) { free_addr=nbuff=(char *)malloc((size_t)reclen+page_size); nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); if(verify || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,offset64/reclen); } if(purge) purgeit(nbuff,reclen); if((verify & diag_v) || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,offset64/reclen); if (!(h_flag || k_flag || mmapflag)) { I_LSEEK( fd, offset64, SEEK_SET ); } if(rlocking) { lock_offset=I_LSEEK(fd,0,SEEK_CUR); mylockr((int) fd, (int) 1, (int)0, lock_offset, reclen); } if(mmapflag) { wmaddr=&maddr[offset64]; fill_area((long long*)nbuff,(long long*)wmaddr,(long long)reclen); if(!mmapnsflag) { if(mmapasflag) msync(wmaddr,(size_t)reclen,MS_ASYNC); if(mmapssflag) msync(wmaddr,(size_t)reclen,MS_SYNC); } } else { if(async_flag) { #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif if(no_copy_flag) async_write_no_copy(gc, (long long)fd, nbuff, reclen, offset64, depth,free_addr); else async_write(gc, (long long)fd, nbuff, reclen, offset64, depth); #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif } else { wval=write(fd, nbuff,(size_t)reclen); if(wval != reclen) { #ifdef NO_PRINT_LLD printf("\nError writing block at %ld\n", (long)offset64); #else printf("\nError writing block at %lld\n", (long long)offset64); #endif if(wval==-1) perror("write"); exit_code = 74; signal_handler(); } if (wval != -1) update_burst_sleep(fd, wval, &burst_sleep_time_till_now[j]); } } if(rlocking) { mylockr((int) fd, (int) 0, (int)0, lock_offset, reclen); } } } /* end of modifications *kcollins:2-5-96 */ /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(include_flush) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC);/* Clean up before read starts running */ else { wval=fsync(fd); if(wval==-1){ perror("fsync"); signal_handler(); } } } if(include_close) { if(mmapflag) { mmap_end(maddr,(unsigned long long)filebytes64); } wval=close(fd); if(wval==-1){ perror("close"); signal_handler(); } } if(inc_think) randreadtime[j] = ((time_so_far() - starttime2)-time_res - burst_sleep_time_till_now[j]); else randreadtime[j] = ((time_so_far() - starttime2)-time_res - burst_sleep_time_till_now[j])- compute_val; if(randreadtime[j] < (double).000001) { randreadtime[j]=time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(!include_close) { if(mmapflag) { msync(maddr,(size_t)filebytes64,MS_SYNC);/* Clean up before read starts running */ } else { wval=fsync(fd); if(wval==-1){ perror("fsync"); signal_handler(); } } if(mmapflag) mmap_end(maddr,(unsigned long long)filebytes64); wval=close(fd); if(wval==-1){ perror("close"); signal_handler(); } } if(cpuutilflag) { cputime[j] = cputime_so_far() - cputime[j]; if (cputime[j] < cputime_res) cputime[j] = 0.0; walltime[j] = time_so_far() - walltime[j]; if (walltime[j] < cputime[j]) walltime[j] = cputime[j]; } if(restf) sleep((int)rest_val); } if(OPS_flag || MS_flag){ filebytes64=filebytes64/reclen; } for(j=0;j<2;j++) { if(no_write && (j==1)) { randreadrate[1] = 0.0; continue; } if(MS_flag) { randreadrate[j]=1000000.0*(randreadtime[j] / (double)filebytes64); continue; } else { randreadrate[j] = (unsigned long long) ((double) filebytes64 / randreadtime[j]); } if(!(OPS_flag || MS_flag)) randreadrate[j] >>= 10; } /* Must save walltime & cputime before calling store_value() for each/any cell.*/ if(cpuutilflag) store_times(walltime[0], cputime[0]); store_value((off64_t)randreadrate[0]); if(cpuutilflag) store_times(walltime[1], cputime[1]); store_value((off64_t)randreadrate[1]); #ifdef NO_PRINT_LLD if(!silent) printf("%10ld",(long)randreadrate[0]); if(!silent) printf("%10ld",(long)randreadrate[1]); if(!silent) fflush(stdout); #else if(!silent) printf("%10lld",(long long)randreadrate[0]); if(!silent) printf("%10lld",(long long)randreadrate[1]); if(!silent) fflush(stdout); #endif if(recnum) free(recnum); } /************************************************************************/ /* reverse_perf_test */ /* Reverse read test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void reverse_perf_test(off64_t kilo64,long long reclen,long long *data1,long long *data2) #else void reverse_perf_test(kilo64,reclen,data1,data2) off64_t kilo64; long long reclen; long long *data1,*data2; #endif { double revreadtime[2]; double starttime2; double walltime[2], cputime[2]; double compute_val = (double)0; long long j; off64_t i,numrecs64; long long Index = 0; unsigned long long revreadrate[2]; off64_t filebytes64; off64_t lock_offset=0; int fd,open_flags; char *maddr,*wmaddr; volatile char *buffer1; int ltest; char *nbuff; #if defined(VXFS) || defined(solaris) int test_foo=0; #endif #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif maddr=wmaddr=0; open_flags=O_RDONLY; #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) open_flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) open_flags |=O_DIRECTIO; #endif #endif #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) open_flags |=O_RSYNC|O_SYNC; #endif numrecs64 = (kilo64*1024)/reclen; filebytes64 = numrecs64*reclen; fd = 0; if(noretest) ltest=1; else ltest=2; for( j=0; j (MAXBUFFERSIZE-reclen)) Index=0; nbuff = mbuffer + Index; } if(purge) purgeit(nbuff,reclen); if(mmapflag) { wmaddr = &maddr[((numrecs64-1)-i)*reclen]; fill_area((long long*)wmaddr,(long long*)nbuff,(long long)reclen); } else if(async_flag) { #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif if(no_copy_flag) async_read_no_copy(gc, (long long)fd, (char **)&buffer1, ((((numrecs64-1)-i)*reclen)), reclen, -1LL,(numrecs64*reclen),depth); else async_read(gc, (long long)fd, nbuff, (((numrecs64-1)-i)*reclen), reclen,-1LL,(numrecs64*reclen),depth); }else { if(read((int)fd, (void*)nbuff, (size_t) reclen) != reclen) { #ifdef NO_PRINT_LLD printf("\nError reading block %ld\n", (long)i); #else printf("\nError reading block %lld\n", (long long)i); #endif perror("read"); exit(79); } } if(verify){ if(async_flag && no_copy_flag) { if(verify_buffer(buffer1,reclen,(off64_t)(numrecs64-1)-i,reclen,(long long)pattern,sverify)){ exit(80); } } else { if(verify_buffer(nbuff,reclen,(off64_t)(numrecs64-1)-i,reclen,(long long)pattern,sverify)){ exit(81); } } } if(async_flag) { if(no_copy_flag) async_release(gc); end_async(gc); gc=0; } if(rlocking) { mylockr((int) fd, (int) 0, (int)1, lock_offset, reclen); } if (!(h_flag || k_flag || mmapflag)) { I_LSEEK( fd, (off64_t)-2*reclen, SEEK_CUR ); } } /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(include_flush) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC); else fsync(fd); } if(include_close) { if(mmapflag) { mmap_end(maddr,(unsigned long long)filebytes64); } close(fd); } if(inc_think) revreadtime[j] = ((time_so_far() - starttime2)-time_res); else revreadtime[j] = ((time_so_far() - starttime2)-time_res) -compute_val; if(revreadtime[j] < (double).000001) { revreadtime[j]= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(!include_close) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC); else fsync(fd); if(mmapflag) { mmap_end(maddr,(unsigned long long)filebytes64); } close(fd); } if(cpuutilflag) { cputime[j] = cputime_so_far() - cputime[j]; if (cputime[j] < cputime_res) cputime[j] = 0.0; walltime[j] = time_so_far() - walltime[j]; if (walltime[j] < cputime[j]) walltime[j] = cputime[j]; } if(restf) sleep((int)rest_val); } if(OPS_flag || MS_flag){ filebytes64=filebytes64/reclen; } for(j=0;j>= 10; } /* Must save walltime & cputime before calling store_value() for each/any cell.*/ if(cpuutilflag) store_times(walltime[0], cputime[0]); store_value((off64_t)revreadrate[0]); #ifdef NO_PRINT_LLD if(!silent) printf("%10ld",(long)revreadrate[0]); #else if(!silent) printf("%10lld",(long long)revreadrate[0]); #endif if(!silent) fflush(stdout); } /************************************************************************/ /* rewriterec_perf_test */ /* Re-write the same record */ /************************************************************************/ #ifdef HAVE_ANSIC_C void rewriterec_perf_test(off64_t kilo64 ,long long reclen,long long *data1,long long *data2) #else void rewriterec_perf_test(kilo64 ,reclen,data1,data2) off64_t kilo64; long long reclen; long long *data1,*data2; #endif { double burst_sleep_time_till_now = 0; double writeintime; double starttime1; double walltime, cputime; double compute_val = (double)0; long long i; off64_t numrecs64; long long flags; long long Index=0; unsigned long long writeinrate; off64_t filebytes64; off64_t lock_offset=0; int fd,wval; char *maddr; char *wmaddr,*free_addr,*nbuff; #if defined(VXFS) || defined(solaris) int test_foo=0; #endif #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif walltime=cputime=0; maddr=wmaddr=free_addr=nbuff=0; numrecs64 = (kilo64*1024)/reclen; filebytes64 = numrecs64*reclen; /* flags = O_RDWR|O_CREAT|O_TRUNC;*/ flags = O_RDWR|O_CREAT; #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) flags |=O_DIRECTIO; #endif #endif if(oflag) flags |= O_SYNC; #if defined(O_DSYNC) if(odsync) flags |= O_DSYNC; #endif #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) flags |=O_RSYNC|O_SYNC; #endif /* if (!no_unlink) { if(check_filename(filename)) unlink(filename); } */ if(Uflag) /* Unmount and re-mount the mountpoint */ { purge_buffer_cache(); } if((fd = I_OPEN(filename, (int)flags,0640))<0) { printf("\nCan not open temporary file %s for write.\n",filename); perror("open"); exit(84); } #ifdef VXFS if(direct_flag) { ioctl(fd,VX_SETCACHE,VX_DIRECT); ioctl(fd,VX_GETCACHE,&test_foo); if(test_foo == 0) { if(!client_iozone) printf("\nVxFS advanced setcache feature not available.\n"); exit(3); } } #endif #if defined(solaris) if(direct_flag) { test_foo = directio(fd, DIRECTIO_ON); if(test_foo != 0) { if(!client_iozone) printf("\ndirectio not available.\n"); exit(3); } } #endif if(mmapflag) { maddr=(char *)initfile(fd,filebytes64,1,PROT_READ|PROT_WRITE); } /* #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif */ wval=fsync(fd); if(wval==-1){ perror("fsync"); signal_handler(); } nbuff=mainbuffer; mbuffer=mainbuffer; if(fetchon) fetchit(nbuff,reclen); /* wval=write(fd, nbuff, (size_t) reclen); if(wval != reclen) { #ifdef NO_PRINT_LLD printf("\nError writing block %ld, fd= %d\n", (long)0, fd); #else printf("\nError writing block %lld, fd= %d\n", (long long)0, fd); #endif if(wval==-1) perror("write"); exit_code = 74; signal_handler(); } */ if(verify || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); starttime1 = time_so_far(); if(cpuutilflag) { walltime = time_so_far(); cputime = cputime_so_far(); } for(i=0; i (MAXBUFFERSIZE-reclen)) Index=0; nbuff = mbuffer + Index; } if(async_flag && no_copy_flag) { free_addr=nbuff=(char *)malloc((size_t)reclen+page_size); nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); if(verify || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); } if((verify & diag_v) || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); if(purge) purgeit(nbuff,reclen); if(mmapflag) { wmaddr = &maddr[0]; fill_area((long long*)nbuff,(long long*)wmaddr,(long long)reclen); if(!mmapnsflag) { if(mmapasflag) msync(wmaddr,(size_t)reclen,MS_ASYNC); if(mmapssflag) msync(wmaddr,(size_t)reclen,MS_SYNC); } } else { if(async_flag) { #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif if(no_copy_flag) async_write_no_copy(gc, (long long)fd, nbuff, reclen, (i*reclen), depth,free_addr); else async_write(gc, (long long)fd, nbuff, reclen, (i*reclen), depth); #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif } else { wval=write(fd, nbuff, (size_t) reclen); if(wval != reclen) { #ifdef NO_PRINT_LLD printf("\nError writing block %ld, fd= %d\n", (long)i, fd); #else printf("\nError writing block %lld, fd= %d\n", (long long)i, fd); #endif if(wval==-1) perror("write"); exit_code = 74; signal_handler(); } if (wval != -1) update_burst_sleep(fd, wval, &burst_sleep_time_till_now); } } if(rlocking) { mylockr((int) fd, (int) 0, (int)0, lock_offset, reclen); } if (!(h_flag || k_flag || mmapflag)) { I_LSEEK(fd, (off64_t)0,SEEK_SET); } /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ } /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(include_flush) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC);/* Clean up before read starts running */ else { wval=fsync(fd); if(wval==-1){ perror("fsync"); signal_handler(); } } } if(include_close) { if(mmapflag) mmap_end(maddr,(unsigned long long)filebytes64); wval=close(fd); if(wval==-1){ perror("close"); signal_handler(); } } if(inc_think) writeintime = ((time_so_far() - starttime1)-time_res); else writeintime = ((time_so_far() - starttime1)-time_res)- compute_val; if(cpuutilflag) { cputime = cputime_so_far() - cputime; if (cputime < cputime_res) cputime = 0.0; walltime = time_so_far() - walltime; if (walltime < cputime) walltime = cputime; } writeintime -= burst_sleep_time_till_now; if(writeintime < (double).000001) { writeintime= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(!include_close) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC);/* Clean up before read starts running */ else { wval=fsync(fd); if(wval==-1){ perror("fsync"); signal_handler(); } } if(mmapflag) mmap_end(maddr,(unsigned long long)filebytes64); wval=close(fd); if(wval==-1){ perror("close"); signal_handler(); } } if(OPS_flag || MS_flag){ filebytes64=filebytes64/reclen; } if(MS_flag) { writeinrate=1000000.0*(writeintime / (double)filebytes64); } else { writeinrate = (unsigned long long) ((double) filebytes64 / writeintime); } if(!(OPS_flag || MS_flag)) writeinrate >>= 10; /* Must save walltime & cputime before calling store_value() for each/any cell.*/ if(cpuutilflag) store_times(walltime, cputime); store_value((off64_t)writeinrate); #ifdef NO_PRINT_LLD if(!silent) printf(" %10ld",(long)writeinrate); #else if(!silent) printf(" %10lld",(long long)writeinrate); #endif if(!silent) fflush(stdout); if(restf) sleep((int)rest_val); } /************************************************************************/ /* read_stride_perf_test */ /* Read with a constant stride test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void read_stride_perf_test(off64_t kilos64,long long reclen,long long *data1,long long *data2) #else void read_stride_perf_test(kilos64,reclen,data1,data2) off64_t kilos64; long long reclen; long long *data1, *data2; #endif { double strideintime; double starttime1; double compute_val = (double)0; double walltime, cputime; off64_t numrecs64,current_position; long long Index = 0; off64_t i,savepos64 = 0; unsigned long long strideinrate; off64_t filebytes64; off64_t lock_offset=0; long long uu; off64_t stripewrap=0; int fd,open_flags; volatile char *buffer1; char *nbuff; char *maddr; char *wmaddr; #if defined(VXFS) || defined(solaris) int test_foo=0; #endif #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif walltime=cputime=0; nbuff=maddr=wmaddr=0; open_flags=O_RDONLY; #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) open_flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) open_flags |=O_DIRECTIO; #endif #endif #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) open_flags |=O_RSYNC|O_SYNC; #endif next64 = (off64_t)0; numrecs64 = (kilos64*1024)/reclen; filebytes64 = numrecs64*reclen; if(Uflag) /* Unmount and re-mount the mountpoint */ { purge_buffer_cache(); } if((fd = I_OPEN(filename, (int)open_flags, 0640))<0) { printf("\nCan not open temporary file for read\n"); perror("open"); exit(86); } /* #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif */ #ifdef VXFS if(direct_flag) { ioctl(fd,VX_SETCACHE,VX_DIRECT); ioctl(fd,VX_GETCACHE,&test_foo); if(test_foo == 0) { if(!client_iozone) printf("\nVxFS advanced setcache feature not available.\n"); exit(3); } } #endif #if defined(solaris) if(direct_flag) { test_foo = directio(fd, DIRECTIO_ON); if(test_foo != 0) { if(!client_iozone) printf("\ndirectio not available.\n"); exit(3); } } #endif if(mmapflag) { maddr=(char *)initfile(fd,filebytes64,0,PROT_READ); } fsync(fd); current_position=0; nbuff=mainbuffer; mbuffer=mainbuffer; if(fetchon) fetchit(nbuff,reclen); starttime1 = time_so_far(); if(cpuutilflag) { walltime = time_so_far(); cputime = cputime_so_far(); } for(i=0; i (MAXBUFFERSIZE-reclen)) Index=0; nbuff = mbuffer + Index; } if(purge) purgeit(nbuff,reclen); if(verify) { savepos64=current_position/reclen; } /* printf("Read_Stride\n"); */ if(mmapflag) { wmaddr = &maddr[current_position]; fill_area((long long*)wmaddr,(long long*)nbuff,(long long)reclen); } else { if(async_flag) async_init(&gc,fd,direct_flag); if(async_flag) { if(no_copy_flag) async_read_no_copy(gc, (long long)fd, (char **)&buffer1, current_position, reclen, stride,(numrecs64*reclen),depth); else async_read(gc, (long long)fd, nbuff, current_position, reclen, stride,(numrecs64*reclen),depth); } else { if((uu=read((int)fd, (void*)nbuff, (size_t) reclen)) != reclen) { #ifdef NO_PRINT_LLD printf("\nError reading block %ld, fd= %d Filename %s Read returned %ld\n", (long)i, fd,filename,uu); printf("\nSeeked to %ld Reclen = %ld\n", (long)savepos64,(long)reclen); #else printf("\nError reading block %lld, fd= %d Filename %s Read returned %lld\n", (long long)i, fd,filename,(long long)uu); printf("\nSeeked to %lld Reclen = %lld\n", (long long)savepos64,(long long)reclen); #endif perror("read"); exit(88); } } } if(rlocking) { mylockr((int) fd, (int) 0, (int)1, lock_offset, reclen); } current_position+=reclen; if(verify) { if(async_flag && no_copy_flag) { if(verify_buffer(buffer1,reclen, (off64_t)savepos64 ,reclen,(long long)pattern,sverify)){ exit(89); } } else { if(verify_buffer(nbuff,reclen, (off64_t)savepos64 ,reclen,(long long)pattern,sverify)){ exit(90); } } } if(async_flag) { if(no_copy_flag) async_release(gc); end_async(gc); gc=0; } /* This is a bit tricky. The goal is to read with a stride through the file. The problem is that you need to touch all of the file blocks. So.. the first pass through you read with a constant stride. When you hit eof then add 1 to the beginning offset of the next time through the file. The rub here is that eventually adding 1 will cause the initial start location plus the STRIDE to be beyond eof. So... when this happens the initial offset for the next pass needs to be set back to 0. */ if(current_position + (stride * reclen) >= (numrecs64 * reclen)-reclen) { current_position=0; stripewrap++; if(numrecs64 <= stride) { current_position=0; } else { current_position = (off64_t)((stripewrap)%numrecs64)*reclen; } if (!(h_flag || k_flag || mmapflag)) { if(I_LSEEK(fd,current_position,SEEK_SET)<0) { perror("lseek"); exit(91); } } } else { current_position+=(stride*reclen)-reclen; if (!(h_flag || k_flag || mmapflag)) { if(I_LSEEK(fd,current_position,SEEK_SET)<0) { perror("lseek"); exit(93); }; } } } if(cpuutilflag) { cputime = cputime_so_far() - cputime; if (cputime < cputime_res) cputime = 0.0; walltime = time_so_far() - walltime; if (walltime < cputime) walltime = cputime; } /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(include_flush) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC); else fsync(fd); } if(include_close) { if(mmapflag) { mmap_end(maddr,(unsigned long long)filebytes64); } close(fd); } if(inc_think) strideintime = ((time_so_far() - starttime1)-time_res); else strideintime = ((time_so_far() - starttime1)-time_res) -compute_val; if(strideintime < (double).000001) { strideintime= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(!include_close) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC); else fsync(fd); if(mmapflag) { mmap_end(maddr,(unsigned long long)filebytes64); } close(fd); } if(OPS_flag || MS_flag){ filebytes64=filebytes64/reclen; } if(MS_flag) { strideinrate=1000000.0*(strideintime / (double)filebytes64); } else { strideinrate = (unsigned long long) ((double) filebytes64 / strideintime); } if(!(OPS_flag || MS_flag)) strideinrate >>= 10; /* Must save walltime & cputime before calling store_value() for each/any cell.*/ if(cpuutilflag) store_times(walltime, cputime); store_value((off64_t)strideinrate); #ifdef NO_PRINT_LLD if(!silent) printf(" %10ld",(long)strideinrate); #else if(!silent) printf(" %10lld",(long long)strideinrate); #endif if(!silent) fflush(stdout); if(restf) sleep((int)rest_val); } #ifdef HAVE_PREAD /************************************************************************/ /* pwrite_perf_test */ /* pwrite and re-write test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void pwrite_perf_test(off64_t kilos64,long long reclen,long long *data1,long long *data2) #else void pwrite_perf_test(kilos64,reclen,data1,data2) off64_t kilos64; long long reclen; long long *data1,*data2; #endif { double burst_sleep_time_till_now[2] = {0, 0}; double pwritetime[2]; double starttime1; double walltime[2], cputime[2]; double compute_val = (double)0; long long i,j; long long Index = 0; unsigned long long pwriterate[2]; off64_t filebytes64; long long flags_here = 0; int fd,ltest,wval; off64_t numrecs64,traj_offset; off64_t lock_offset=0; long long traj_size; #if defined(VXFS) || defined(solaris) int test_foo=0; #endif char *nbuff; traj_offset=0; nbuff=mainbuffer; if(w_traj_flag) { filebytes64 = w_traj_fsize; numrecs64=w_traj_ops; } else { numrecs64 = (kilos64*1024)/reclen; filebytes64 = numrecs64*reclen; } fd = 0; if(oflag){ flags_here = O_SYNC|O_RDWR; } else { flags_here = O_RDWR; } #if defined(O_DSYNC) if(odsync) flags_here |= O_DSYNC; #endif #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) flags_here |=O_RSYNC|O_SYNC; #endif #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) flags_here |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) flags_here |=O_DIRECTIO; #endif #endif if(noretest) ltest=1; else ltest=2; for( j=0; j (MAXBUFFERSIZE-reclen)) Index=0; nbuff = mbuffer + Index; } if((verify && diag_v) || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,i); if(purge) purgeit(nbuff,reclen); if((dedup_flag && sparse_mode ) && !(dedup_iflag || dedup_bflag)) { zsize = (dedup * reclen )/100; wval = I_PWRITE(fd, nbuff, reclen-zsize, traj_offset); wval = zsize + wval; } else { wval = I_PWRITE(fd, nbuff, reclen, traj_offset); } if(wval != reclen) { #ifdef NO_PRINT_LLD printf("\nError pwriting block %ld, fd= %d\n", (long)i, fd); #else printf("\nError pwriting block %lld, fd= %d\n", (long long)i, fd); #endif perror("pwrite"); exit_code = 74; signal_handler(); } else { update_burst_sleep(fd, reclen, &burst_sleep_time_till_now[j]); } if(rlocking) { mylockr((int) fd, (int) 0, (int)0, lock_offset, reclen); } } if(include_flush) { wval=fsync(fd); if(wval==-1){ perror("fsync"); signal_handler(); } } if(include_close) { wval=close(fd); if(wval==-1){ perror("close"); signal_handler(); } } if(inc_think) pwritetime[j] = ((time_so_far() - starttime1)-time_res - burst_sleep_time_till_now[j]); else pwritetime[j] = ((time_so_far() - starttime1)-time_res - burst_sleep_time_till_now[j]) -compute_val; if(pwritetime[j] < (double).000001) { pwritetime[j]= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(!include_close) { wval=fsync(fd); if(wval==-1){ perror("fsync"); signal_handler(); } wval=close(fd); if(wval==-1){ perror("close"); signal_handler(); } } if(cpuutilflag) { cputime[j] = cputime_so_far() - cputime[j]; if (cputime[j] < cputime_res) cputime[j] = 0.0; walltime[j] = time_so_far() - walltime[j]; if (walltime[j] < cputime[j]) walltime[j] = cputime[j]; } if(restf) sleep((int)rest_val); } if(OPS_flag || MS_flag){ filebytes64=filebytes64/reclen; } for(j=0;j>= 10; } /* Must save walltime & cputime before calling store_value() for each/any cell.*/ if(noretest) { pwriterate[1]=(long long)0; if(cpuutilflag) { walltime[1]=0.0; cputime[1]=0.0; } } if(cpuutilflag) store_times(walltime[0], cputime[0]); store_value((off64_t)pwriterate[0]); if(cpuutilflag) store_times(walltime[1], cputime[1]); store_value((off64_t)pwriterate[1]); #ifdef NO_PRINT_LLD if(!silent) printf("%10ld",(long)pwriterate[0]); if(!silent) printf("%10ld",(long)pwriterate[1]); if(!silent) fflush(stdout); #else if(!silent) printf("%10lld",(long long)pwriterate[0]); if(!silent) printf("%10lld",(long long)pwriterate[1]); if(!silent) fflush(stdout); #endif } /************************************************************************/ /* pread_perf_test */ /* pread and re-pread test */ /************************************************************************/ #ifdef HAVE_PREAD #ifdef HAVE_ANSIC_C void pread_perf_test(off64_t kilos64,long long reclen,long long *data1,long long *data2) #else void pread_perf_test(kilos64,reclen,data1,data2) off64_t kilos64; long long reclen; long long *data1, *data2; #endif { double starttime2; double preadtime[2]; double walltime[2], cputime[2]; double compute_val = (double)0; long long numrecs64,i; long long j; long long Index = 0; int wval; unsigned long long preadrate[2]; off64_t filebytes64; off64_t lock_offset=0; int fd,open_flags; int ltest; off64_t traj_offset; long long traj_size; #if defined(VXFS) || defined(solaris) int test_foo = 0; #endif char *nbuff; traj_offset=0; nbuff=mainbuffer; open_flags=O_RDONLY; #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) open_flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) open_flags |=O_DIRECTIO; #endif #endif #if defined(_HPUX_SOURCE) || defined(linux) || defined(__FreeBSD__) || defined(__DragonFly__) if(read_sync) open_flags |=O_RSYNC|O_SYNC; #endif if(r_traj_flag) { filebytes64 = r_traj_fsize; numrecs64=r_traj_ops; } else { numrecs64 = (kilos64*1024)/reclen; filebytes64 = numrecs64*reclen; } fd = 0; if(noretest) ltest=1; else ltest=2; for( j=0; j (MAXBUFFERSIZE-reclen)) Index=0; nbuff = mbuffer + Index; } if(purge) purgeit(nbuff,reclen); if((dedup_flag && sparse_mode ) && !(dedup_iflag || dedup_bflag)) { zsize = (dedup * reclen )/100; wval = I_PREAD(((int)fd), ((void*)nbuff), ((size_t) reclen-zsize),traj_offset ); wval = zsize + wval; } else { wval = I_PREAD(((int)fd), ((void*)nbuff), ((size_t) reclen),traj_offset ); } if(wval != reclen) { #ifdef NO_PRINT_LLD printf("\nError reading block %ld %lx\n", (long)i,(unsigned long)nbuff); #else printf("\nError reading block %lld %lx\n", (long long)i,(unsigned long)nbuff); #endif perror("pread"); exit(103); } if(verify){ if(verify_buffer(nbuff,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ exit(104); } } if(rlocking) { lock_offset=I_LSEEK(fd,0,SEEK_CUR); mylockr((int) fd, (int) 1, (int)1, lock_offset, reclen); } } if(include_flush) fsync(fd); if(include_close) close(fd); if(inc_think) preadtime[j] = ((time_so_far() - starttime2)-time_res); else preadtime[j] = ((time_so_far() - starttime2)-time_res) -compute_val; if(preadtime[j] < (double).000001) { preadtime[j]= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(!include_close) { fsync(fd); close(fd); } if(cpuutilflag) { cputime[j] = cputime_so_far() - cputime[j]; if (cputime[j] < cputime_res) cputime[j] = 0.0; walltime[j] = time_so_far() - walltime[j]; if (walltime[j] < cputime[j]) walltime[j] = cputime[j]; } if(restf) sleep((int)rest_val); } filebytes64 = numrecs64*reclen; if(OPS_flag || MS_flag){ filebytes64=filebytes64/reclen; } for(j=0;j>= 10; } if(noretest) { preadrate[1]=(long long)0; if(cpuutilflag) { walltime[1]=0.0; cputime[1]=0.0; } } /* Must save walltime & cputime before calling store_value() for each/any cell.*/ if(cpuutilflag) store_times(walltime[0], cputime[0]); store_value((off64_t)preadrate[0]); if(cpuutilflag) store_times(walltime[1], cputime[1]); store_value((off64_t)preadrate[1]); #ifdef NO_PRINT_LLD if(!silent) printf("%10ld",(long)preadrate[0]); if(!silent) printf("%10ld",(long)preadrate[1]); if(!silent) fflush(stdout); #else if(!silent) printf("%10lld",(long long)preadrate[0]); if(!silent) printf("%10lld",(long long)preadrate[1]); if(!silent) fflush(stdout); #endif } #endif #ifdef HAVE_PREADV /************************************************************************/ /* pwritev_perf_test */ /* pwritev and re-pwritev test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void pwritev_perf_test(off64_t kilos64,long long reclen,long long *data1,long long *data2) #else void pwritev_perf_test(kilos64,reclen,data1,data2) off64_t kilos64; long long reclen; long long *data1,*data2; #endif { int wval; double starttime1; double pwritevtime[2]; double walltime[2], cputime[2]; double compute_val = (double)0; long long list_off[PVECMAX]; long long numvecs,j,xx; unsigned long long pwritevrate[2]; off64_t filebytes64,i; off64_t numrecs64; int fd,ltest; #if defined(VXFS) || defined(solaris) int test_foo = 0; #endif long long flags_here; char *nbuff; #ifdef MERSENNE unsigned long long init[4]={0x12345ULL, 0x23456ULL, 0x34567ULL, 0x45678ULL}, length=4; #endif numrecs64 = (kilos64*1024)/reclen; filebytes64 = numrecs64*reclen; nbuff = mainbuffer; fd = 0; if(oflag) flags_here = O_SYNC|O_RDWR; else flags_here = O_RDWR; #if defined(O_DSYNC) if(odsync) flags_here |= O_DSYNC; #endif #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) flags_here |=O_RSYNC|O_SYNC; #endif #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) flags_here |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) flags_here |=O_DIRECTIO; #endif #endif if(noretest) ltest=1; else ltest=2; for( j=0; j>= 10; } if(noretest) { pwritevrate[1]=(long long)0; if(cpuutilflag) { walltime[1]=0.0; cputime[1]=0.0; } } /* Must save walltime & cputime before calling store_value() for each/any cell.*/ if(cpuutilflag) store_times(walltime[0], cputime[0]); store_value((off64_t)pwritevrate[0]); if(cpuutilflag) store_times(walltime[1], cputime[1]); store_value((off64_t)pwritevrate[1]); #ifdef NO_PRINT_LLD if(!silent) printf("%10ld",(long)pwritevrate[0]); if(!silent) printf("%10ld",(long)pwritevrate[1]); if(!silent) fflush(stdout); #else if(!silent) printf("%10lld",(long long)pwritevrate[0]); if(!silent) printf("%10lld",(long long)pwritevrate[1]); if(!silent) fflush(stdout); #endif } #endif #ifdef HAVE_PREADV /**************************************************************************/ /* create_list() */ /* Creates a list of PVECMAX entries that are unique (non over lapping ). */ /* Each of these offsets are then used in a vector (preadv/pwritev) */ /**************************************************************************/ #ifdef HAVE_ANSIC_C void create_list(long long *list_off, long long reclen, off64_t numrecs64) #else void create_list(list_off, reclen, numrecs64) long long *list_off; long long reclen; off64_t numrecs64; #endif { long long found,i,j; long long numvecs; unsigned long long big_rand = -1; #if defined (bsd4_2) || defined(Windows) long long rand1,rand2,rand3; #endif numvecs = PVECMAX; if(numrecs64< numvecs) numvecs = numrecs64; for(j=0;j>= 10; } if(noretest) { preadvrate[1]=(long long)0; if(cpuutilflag) { walltime[1]=0.0; cputime[1]=0.0; } } /* Must save walltime & cputime before calling store_value() for each/any cell.*/ if(cpuutilflag) store_times(walltime[0], cputime[0]); store_value((off64_t)preadvrate[0]); if(cpuutilflag) store_times(walltime[1], cputime[1]); store_value((off64_t)preadvrate[1]); #ifdef NO_PRINT_LLD if(!silent) printf("%10ld",(long)preadvrate[0]); if(!silent) printf("%10ld",(long)preadvrate[1]); if(!silent) printf("\n"); if(!silent) fflush(stdout); #else if(!silent) printf("%10lld",(long long)preadvrate[0]); if(!silent) printf("%10lld",(long long)preadvrate[1]); if(!silent) printf("\n"); if(!silent) fflush(stdout); #endif } #endif /************************************************************************/ /* print_header() */ /* Prints the header for the output from Iozone. */ /************************************************************************/ #endif #ifdef HAVE_ANSIC_C void print_header(void) #else void print_header() #endif { if(Eflag) { if(!silent) printf(CONTROL_STRING2, " ", " ", " ", " ", " ", " ", "random", /*kcollins:2-5-96*/ "random", /*kcollins:2-5-96*/ "bkwd", "record", "stride", " ", " ", " ", " " #ifdef HAVE_PREAD ," ", " ", " ", " " #ifdef HAVE_PREADV ," ", " ", " ", " " #endif #endif ); if(!silent) printf(CONTROL_STRING2, "kB", "reclen", "write", "rewrite", "read", "reread", "read", /*kcollins:2-5-96*/ "write", /*kcollins:2-5-96*/ "read", "rewrite", "read", "fwrite", "frewrite", "fread", "freread" #ifdef HAVE_PREAD ,"pwrite", "repwrite", "pread", "repread" #ifdef HAVE_PREADV ,"pwritev", "repwritev", "preadv", "repreadv" #endif #endif ); }else if(RWONLYflag){ /*kcollins 8-21-96*/ if(!silent) printf(CONTROL_STRING4, /*kcollins 8-21-96*/ " ", /*kcollins 8-21-96*/ " ", /*kcollins 8-21-96*/ " ", /*kcollins 8-21-96*/ " ", /*kcollins 8-21-96*/ " ", /*kcollins 8-21-96*/ " " /*kcollins 8-21-96*/ ); /*kcollins 8-21-96*/ if(!silent) printf(CONTROL_STRING4, /*kcollins 8-21-96*/ "kB", /*kcollins 8-21-96*/ "reclen", /*kcollins 8-21-96*/ "write", /*kcollins 8-21-96*/ "rewrite", /*kcollins 8-21-96*/ "read", /*kcollins 8-21-96*/ "reread" /*kcollins 8-21-96*/ ); /*kcollins 8-21-96*/ }else{ if(!(mmapflag || async_flag)) { if(!silent) printf(CONTROL_STRING3, " ", " ", " ", " ", " ", " ", "random", /*kcollins:2-5-96*/ "random", /*kcollins:2-5-96*/ "bkwd", "record", "stride", "", "", "", "" ); if(!silent) printf(CONTROL_STRING3, "kB", "reclen", "write", "rewrite", "read", "reread", "read", /*kcollins:2-5-96*/ "write", /*kcollins:2-5-96*/ "read", "rewrite", "read", "fwrite", "frewrite", "fread", "freread" ); }else { if(!silent) printf(CONTROL_STRING3, " ", " ", " ", " ", " ", " ", "random", /*kcollins:2-5-96*/ "random", /*kcollins:2-5-96*/ "bkwd", "record", "stride", "", "", "", "" ); if(!silent) printf(CONTROL_STRING3, "kB", "reclen", "write", "rewrite", "read", "reread", "read", /*kcollins:2-5-96*/ "write", /*kcollins:2-5-96*/ "read", "rewrite", "read", "", "", "", "" ); } } } /************************************************************************/ /* store_value() */ /* Stores a value in an in memory array. Used by the report function */ /* to re-organize the output for Excel */ /************************************************************************/ #ifdef HAVE_ANSIC_C void store_value(off64_t value) #else store_value(value) off64_t value; #endif { report_array[current_x][current_y]=value; current_x++; if(current_x > max_x) max_x=current_x; if(current_y > max_y) max_y=current_y; if(max_x >= MAX_X) { printf("\nMAX_X too small\n"); exit(117); } if(max_y >= MAX_Y) { printf("\nMAX_Y too small\n"); exit(118); } } /************************************************************************/ /* store_times() */ /* Stores runtime (walltime & cputime) in a memory array. */ /* Used by the report function to re-organize the output for Excel */ /* For now, must be called immediately before calling store_value() for */ /* each cell. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void store_times(double walltime, double cputime) #else store_times(walltime, cputime) double walltime, cputime; #endif { runtimes [current_x][current_y].walltime = walltime; runtimes [current_x][current_y].cputime = cputime; runtimes [current_x][current_y].cpuutil = cpu_util(cputime, walltime); } /************************************************************************/ /* dump_report() */ /* Dumps the Excel report on standard output. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void dump_report(long long who) #else dump_report(who) long long who; #endif { long long i; off64_t current_file_size; off64_t rec_size; if(bif_flag) bif_column++; if(!silent) printf(" "); /* * Need to reconstruct the record size list * as the crossover in -a changed the list. */ del_record_sizes(); init_record_sizes(orig_min_rec_size, orig_max_rec_size); for(rec_size=get_next_record_size(0); rec_size <= orig_max_rec_size; rec_size=get_next_record_size(rec_size)) { if (rec_size == 0) break; if(bif_flag) do_float(bif_fd,(double)(rec_size/1024),bif_row,bif_column++); #ifdef NO_PRINT_LLD if(!silent) printf(" %c%ld%c",'"',(long)(rec_size/1024),'"'); #else if(!silent) printf(" %c%lld%c",'"',(long long)(rec_size/1024),'"'); #endif } if(!silent) printf("\n"); if(bif_flag) { bif_column=0; bif_row++; } current_file_size = report_array[0][0]; if(bif_flag) { do_float(bif_fd,(double)(current_file_size),bif_row,bif_column++); } #ifdef NO_PRINT_LLD if(!silent) printf("%c%ld%c ",'"',(long)current_file_size,'"'); #else if(!silent) printf("%c%lld%c ",'"',(long long)current_file_size,'"'); #endif for(i=0;i<=max_y;i++){ if(report_array[0][i] != current_file_size){ if(!silent) printf("\n"); current_file_size = report_array[0][i]; if(bif_flag) { bif_row++; bif_column=0; do_float(bif_fd,(double)(current_file_size),bif_row,bif_column++); } #ifdef NO_PRINT_LLD if(!silent) printf("%c%ld%c ",'"',(long)current_file_size,'"'); #else if(!silent) printf("%c%lld%c ",'"',(long long)current_file_size,'"'); #endif } if(bif_flag) do_float(bif_fd,(double)(report_array[who][i]),bif_row,bif_column++); #ifdef NO_PRINT_LLD if(!silent) printf(" %ld ",(long)report_array[who][i]); #else if(!silent) printf(" %lld ",(long long)report_array[who][i]); #endif } if(bif_flag) { bif_row++; bif_column=0; } if(!silent) printf("\n"); } /************************************************************************/ /* Wrapper that dumps each of the collected data sets. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void dump_excel(void) #else void dump_excel() #endif { if(bif_flag) { bif_fd=create_xls(bif_filename); do_label(bif_fd,command_line,bif_row++,bif_column); do_label(bif_fd," ",bif_row++,bif_column); do_label(bif_fd,"The top row is records sizes, the left column is file sizes",bif_row++,bif_column); } if(!silent) printf("Excel output is below:\n"); if ((!include_tflag) || (include_mask & (long long)WRITER_MASK)) { if(bif_flag) do_label(bif_fd,"Writer Report",bif_row++,bif_column); if(!silent) printf("\n%cWriter report%c\n",'"','"'); dump_report(2); if(bif_flag) do_label(bif_fd,"Re-writer Report",bif_row++,bif_column); if(!silent) printf("\n%cRe-writer report%c\n",'"','"'); dump_report(3); } if ((!include_tflag) || (include_mask & (long long)READER_MASK)) { if(bif_flag) do_label(bif_fd,"Reader Report",bif_row++,bif_column); if(!silent) printf("\n%cReader report%c\n",'"','"'); dump_report(4); if(bif_flag) do_label(bif_fd,"Re-reader Report",bif_row++,bif_column); if(!silent) printf("\n%cRe-Reader report%c\n",'"','"'); dump_report(5); } if ((!include_tflag) || (include_mask & (long long)RANDOM_RW_MASK)) { if(bif_flag) do_label(bif_fd,"Random Read Report",bif_row++,bif_column); if(!silent) printf("\n%cRandom read report%c\n",'"','"'); dump_report(6); if(bif_flag) do_label(bif_fd,"Random Write Report",bif_row++,bif_column); if(!silent) printf("\n%cRandom write report%c\n",'"','"'); dump_report(7); } if ((!include_tflag) || (include_mask & (long long)REVERSE_MASK)) { if(bif_flag) do_label(bif_fd,"Backward Read Report",bif_row++,bif_column); if(!silent) printf("\n%cBackward read report%c\n",'"','"'); dump_report(8); } if ((!include_tflag) || (include_mask & (long long)REWRITE_REC_MASK)) { if(bif_flag) do_label(bif_fd,"Record Rewrite Report",bif_row++,bif_column); if(!silent) printf("\n%cRecord rewrite report%c\n",'"','"'); dump_report(9); } if ((!include_tflag) || (include_mask & (long long)STRIDE_READ_MASK)) { if(bif_flag) do_label(bif_fd,"Stride Read Report",bif_row++,bif_column); if(!silent) printf("\n%cStride read report%c\n",'"','"'); dump_report(10); } if ((!include_tflag && !h_flag && !k_flag) || (include_mask & (long long)FWRITER_MASK)) { if(bif_flag) do_label(bif_fd,"Fwrite Report",bif_row++,bif_column); if(!silent) printf("\n%cFwrite report%c\n",'"','"'); dump_report(11); if(bif_flag) do_label(bif_fd,"Re-fwrite Report",bif_row++,bif_column); if(!silent) printf("\n%cRe-Fwrite report%c\n",'"','"'); dump_report(12); } if ((!include_tflag && !h_flag && !k_flag) || (include_mask & (long long)FREADER_MASK)) { if(bif_flag) do_label(bif_fd,"Fread Report",bif_row++,bif_column); if(!silent) printf("\n%cFread report%c\n",'"','"'); dump_report(13); if(bif_flag) do_label(bif_fd,"Re-fread Report",bif_row++,bif_column); if(!silent) printf("\n%cRe-Fread report%c\n",'"','"'); dump_report(14); } #ifdef HAVE_PREAD if(Eflag) { if ((!include_tflag && !h_flag && !k_flag) || (include_mask & (long long)PWRITER_MASK)) { if(bif_flag) do_label(bif_fd,"Pwrite Report",bif_row++,bif_column); if(!silent) printf("\n%cPwrite report%c\n",'"','"'); dump_report(15); if(bif_flag) do_label(bif_fd,"Re-pwrite Report",bif_row++,bif_column); if(!silent) printf("\n%cRe-Pwrite report%c\n",'"','"'); dump_report(16); } if ((!include_tflag && !h_flag && !k_flag) || (include_mask & (long long)PREADER_MASK)) { if(bif_flag) do_label(bif_fd,"Pread Report",bif_row++,bif_column); if(!silent) printf("\n%cPread report%c\n",'"','"'); dump_report(17); if(bif_flag) do_label(bif_fd,"Re-pread Report",bif_row++,bif_column); if(!silent) printf("\n%cRe-Pread report%c\n",'"','"'); dump_report(18); } #ifdef HAVE_PREADV if ((!include_tflag && !h_flag && !k_flag) || (include_mask & (long long)PWRITEV_MASK)) { if(bif_flag) do_label(bif_fd,"Pwritev Report",bif_row++,bif_column); if(!silent) printf("\n%cPwritev report%c\n",'"','"'); dump_report(19); if(bif_flag) do_label(bif_fd,"Re-pwritev Report",bif_row++,bif_column); if(!silent) printf("\n%cRe-Pwritev report%c\n",'"','"'); dump_report(20); } if ((!include_tflag && !h_flag && !k_flag) || (include_mask & (long long)PREADV_MASK)) { if(bif_flag) do_label(bif_fd,"Preadv Report",bif_row++,bif_column); if(!silent) printf("\n%cPreadv report%c\n",'"','"'); dump_report(21); if(bif_flag) do_label(bif_fd,"Re-preadv Report",bif_row++,bif_column); if(!silent) printf("\n%cRe-Preadv report%c\n",'"','"'); dump_report(22); } #endif } #endif if (cpuutilflag) dump_cputimes(); if(bif_flag) close_xls(bif_fd); } /************************************************************************/ /* dump_times() */ /* Dumps the Excel CPU times report to stdout and to the bif file. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void dump_times(long long who) #else dump_times(who) long long who; #endif { long long i; off64_t current_file_size; off64_t rec_size; if (bif_flag) bif_column++; if(!silent) printf(" "); for (rec_size = get_next_record_size(0); rec_size <= orig_max_rec_size; rec_size = get_next_record_size(rec_size)) { if (rec_size == 0) break; if (bif_flag) do_float(bif_fd, (double)(rec_size/1024), bif_row, bif_column++); #ifdef NO_PRINT_LLD if(!silent) printf(" %c%ld%c",'"',(long)(rec_size/1024),'"'); #else if(!silent) printf(" %c%lld%c",'"',(long long)(rec_size/1024),'"'); #endif } if(!silent) printf("\n"); if (bif_flag) { bif_column=0; bif_row++; } current_file_size = report_array[0][0]; if (bif_flag) { do_float(bif_fd, (double)(current_file_size), bif_row, bif_column++); } #ifdef NO_PRINT_LLD if(!silent) printf("%c%ld%c ",'"',(long)current_file_size,'"'); #else if(!silent) printf("%c%lld%c ",'"',(long long)current_file_size,'"'); #endif for (i = 0; i <= max_y; i++) { if (report_array[0][i] != current_file_size) { if(!silent) printf("\n"); current_file_size = report_array[0][i]; if (bif_flag) { bif_row++; bif_column=0; do_float(bif_fd, (double)(current_file_size), bif_row, bif_column++); } #ifdef NO_PRINT_LLD if(!silent) printf("%c%ld%c ",'"',(long)current_file_size,'"'); #else if(!silent) printf("%c%lld%c ",'"',(long long)current_file_size,'"'); #endif } if (bif_flag) do_float(bif_fd, (double)(runtimes [who][i].cpuutil), bif_row, bif_column++); if(!silent) printf(" %6.2f", runtimes [who][i].cpuutil); } if(!silent) printf("\n"); if (bif_flag) { bif_row++; bif_column=0; } } /************************************************************************/ /* Wrapper that dumps each of the collected data sets. */ /* This one dumps only the collected CPU times. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void dump_cputimes(void) #else void dump_cputimes(void) #endif { bif_row++; bif_column = 0; if ((!include_tflag) || (include_mask & (long long)WRITER_MASK)) { if(bif_flag) do_label(bif_fd, "Writer CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cWriter CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(2); if(bif_flag) do_label(bif_fd, "Re-writer CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cRe-writer CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(3); } if ((!include_tflag) || (include_mask & (long long)READER_MASK)) { if(bif_flag) do_label(bif_fd, "Reader CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cReader CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(4); if(bif_flag) do_label(bif_fd, "Re-reader CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cRe-Reader CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(5); } if ((!include_tflag) || (include_mask & (long long)RANDOM_RW_MASK)) { if(bif_flag) do_label(bif_fd, "Random Read CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cRandom read CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(6); if(bif_flag) do_label(bif_fd, "Random Write CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cRandom write CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(7); } if ((!include_tflag) || (include_mask & (long long)REVERSE_MASK)) { if(bif_flag) do_label(bif_fd, "Backward Read CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cBackward read CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(8); } if ((!include_tflag) || (include_mask & (long long)REWRITE_REC_MASK)) { if(bif_flag) do_label(bif_fd, "Record Rewrite CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cRecord rewrite CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(9); } if ((!include_tflag) || (include_mask & (long long)STRIDE_READ_MASK)) { if(bif_flag) do_label(bif_fd, "Stride Read CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cStride read CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(10); } if ((!include_tflag) || (include_mask & (long long)FWRITER_MASK)) { if(bif_flag) do_label(bif_fd, "Fwrite CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cFwrite CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(11); if(bif_flag) do_label(bif_fd, "Re-fwrite CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cRe-Fwrite CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(12); } if ((!include_tflag) || (include_mask & (long long)FREADER_MASK)) { if(bif_flag) do_label(bif_fd, "Fread CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cFread CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(13); if(bif_flag) do_label(bif_fd, "Re-fread CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cRe-Fread CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(14); } #ifdef HAVE_PREAD if(Eflag) { if ((!include_tflag) || (include_mask & (long long)PWRITER_MASK)) { if(bif_flag) do_label(bif_fd, "Pwrite CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cPwrite CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(15); if(bif_flag) do_label(bif_fd, "Re-pwrite CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cRe-Pwrite CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(16); } if ((!include_tflag) || (include_mask & (long long)PREADER_MASK)) { if(bif_flag) do_label(bif_fd, "Pread CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cPread CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(17); if(bif_flag) do_label(bif_fd, "Re-pread CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cRe-Pread CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(18); } #ifdef HAVE_PREADV if ((!include_tflag) || (include_mask & (long long)PWRITEV_MASK)) { if(bif_flag) do_label(bif_fd, "Pwritev CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cPwritev CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(19); if(bif_flag) do_label(bif_fd, "Re-pwritev CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cRe-Pwritev CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(20); } if ((!include_tflag) || (include_mask & (long long)PREADV_MASK)) { if(bif_flag) do_label(bif_fd, "Preadv CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cPreadv CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(21); if(bif_flag) do_label(bif_fd, "Re-preadv CPU utilization report (Zero values should be ignored)", bif_row++, bif_column); if(!silent) printf("\n%cRe-Preadv CPU utilization report (Zero values should be ignored)%c\n",'"','"'); dump_times(22); } #endif } #endif } /************************************************************************/ /* Internal memory allocation mechanism. Uses shared memory or mmap */ /************************************************************************/ #ifdef HAVE_ANSIC_C char * alloc_mem(long long size, int shared_flag) #else char * alloc_mem(size,shared_flag) long long size; int shared_flag; #endif { long long size1; char *addr,*dumb; #ifdef SHARED_MEM int shmid; #endif int tfd; long long tmp; #if defined(solaris) char mmapFileName[]="mmap_tmp_XXXXXX"; #endif tmp = 0; dumb = (char *)0; tfd=0; size1=l_max(size,page_size); if(!distributed) { if(!trflag) { addr=(char *)malloc((size_t)size1); return(addr); } if(use_thread) { addr=(char *)malloc((size_t)size1); return(addr); } } if(!shared_flag) { addr=(char *)malloc((size_t)size1); return(addr); } #ifdef SHARED_MEM size1=l_max(size,page_size); size1=(size1 +page_size) & ~(page_size-1); shmid=(int)shmget((key_t)(IPC_PRIVATE), (size_t)size1 , (int)(IPC_CREAT|0666)); if(shmid < (int)0) { printf("\nUnable to get shared memory segment(shmget)\n"); #ifdef NO_PRINT_LLD printf("shmid = %d, size = %ld, size1 = %lu, Error %d\n",shmid,(long)size,(size_t)size1,errno); #else printf("shmid = %d, size = %lld, size1 = %lu, Error %d\n",shmid,(long long)size,(unsigned long)size1,errno); #endif exit(119); } /*addr = (char *)shmat(shmid, 0, SHM_W);*/ /* Some systems will not take the above but * will default to read/write if no flags * are provided. (AIX) * The POSIX standard states that if SHM_RDONLY * is not specified then it will be read/write. */ addr = (char *)shmat((int)shmid, 0, 0); #ifdef _64BIT_ARCH_ if((long long)addr == (long long)-1) #else if((long)addr == (long)-1) #endif { printf("\nUnable to get shared memory segment\n"); printf("..Error %d\n",errno); exit(120); } shmctl(shmid, IPC_RMID, 0); return(addr); #else size1=l_max(size,page_size); size1=(size1 +page_size) & ~(page_size-1); #if defined(bsd4_2) && !defined(IOZ_macosx) if((tfd = creat("mmap.tmp", 0666))<0) { printf("Unable to create tmp file\n"); exit(121); } addr=(char *)mmap(0,&size1,PROT_WRITE|PROT_READ, MAP_ANON|MAP_SHARED, tfd, 0); unlink("mmap.tmp"); #else #if defined(solaris) tfd=mkstemp(mmapFileName); if(tfd < 0) { printf("Unable to create tmp file\n"); exit(121); } dumb=(char *)malloc((size_t)size1); bzero(dumb,size1); write(tfd,dumb,size1); free(dumb); addr=(char *)mmap(0,(size_t)size1,PROT_WRITE|PROT_READ, MAP_SHARED, tfd, 0); unlink(mmapFileName); #else #if defined(SCO) || defined(SCO_Unixware_gcc) || defined(Windows) char mmapFileName[]="mmap_tmp_XXXXXX"; tfd=mkstemp(mmapFileName); if(tfd < 0) { printf("Unable to create tmp file\n"); exit(121); } dumb=(char *)malloc((size_t)size1); bzero(dumb,size1); write(tfd,dumb,size1); free(dumb); addr=(char *)mmap(0,(size_t)size1,PROT_WRITE|PROT_READ, MAP_SHARED, tfd, 0); unlink(mmapFileName); #else addr=(char *)mmap(0,(size_t)size1,PROT_WRITE|PROT_READ, MAP_ANONYMOUS|MAP_SHARED, -1, 0); #endif #endif #endif if((char *)addr == (char *)-1) { printf("\nUnable to get memory segment\n"); printf("Error %d\n",errno); exit(122); } if(debug1) printf("Got shared memory for size %lld\n",size1); return(addr); #endif } /************************************************************************/ /* Implementation of poll() function. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void Poll(long long time1) #else void Poll(time1) long long time1; #endif { struct timeval howlong; howlong.tv_sec=(int)(time1/100000); howlong.tv_usec=(int)(time1%100000); /* Get into u.s. */ select(0, 0, 0, 0, &howlong); } /************************************************************************/ /* Implementation of max() function. */ /************************************************************************/ #ifdef HAVE_ANSIC_C long long l_max(long long one,long long two) #else long long l_max(one,two) long long one,two; #endif { if(one > two) return(one); else return(two); } /************************************************************************/ /* Internal Kill. With stonewalling disabled, kill does nothing */ /************************************************************************/ #ifdef HAVE_ANSIC_C void Kill(long long pid,long long sig) #else void Kill(pid,sig) long long pid,sig; #endif { if(!xflag) { /*printf("Killing %d\n",pid);*/ kill((pid_t)pid,(int)sig); } } /************************************************************************/ /* Implementation of min() function. */ /************************************************************************/ #ifdef HAVE_ANSIC_C long long l_min(long long num1,long long num2) #else long long l_min(num1,num2) long long num1,num2; #endif { if(num1 >= num2) return num2; else return num1; } /************************************************************************/ /* Routine to call throughput tests many times. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void multi_throughput_test(long long mint,long long maxt) #else void multi_throughput_test(mint, maxt) long long mint, maxt; #endif { int *t_rangeptr, *t_rangecurs; int *saveptr = (int *)0; int tofree = 0; long long i; if(t_count == 0){ t_count = (int) maxt - mint + 1; t_rangeptr = (int *) malloc((size_t)sizeof(int)*t_count); saveptr = t_rangeptr; tofree = 1; t_rangecurs = t_rangeptr; for(i=mint; i<= maxt; i++) { *(t_rangecurs++) = i; } } else { t_rangeptr = &t_range[0]; } for(i=0; i < t_count; i++){ num_child = *(t_rangeptr++); current_client_number=0; /* Need to start with 1 */ throughput_test(); current_x=0; current_y++; } if(Rflag) dump_throughput(); if(tofree) free(saveptr); } /************************************************************************/ /* Routine to purge the buffer cache by unmounting drive. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void purge_buffer_cache() #else purge_buffer_cache() #endif { char command[1024]; int ret,i; strcpy(command,"umount "); strcat(command, mountname); /* umount might fail if the device is still busy, so retry unmounting several times with increasing delays */ for (i = 1; i < 200; ++i) { ret = system(command); if (ret == 0) break; sleep(i); /* seconds */ } strcpy(command,"mount "); strcat(command, mountname); /* mount might fail if the device is still busy, so retry mounting several times with increasing delays */ for (i = 1; i < 10; ++i) { ret = system(command); if (ret == 0) break; sleep(i); /* seconds */ } } /************************************************************************/ /* Thread write test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void * thread_write_test(int x) #else void * thread_write_test( x) #endif { struct child_stats *child_stat; double starttime1 = 0; double temp_time; double walltime, cputime; double compute_val = (double)0; float delay = (float)0; double thread_qtime_stop,thread_qtime_start; double hist_time; double desired_op_rate_time; double actual_rate; off64_t traj_offset; off64_t lock_offset=0; off64_t save_offset=0; long long flags,traj_size; long long w_traj_bytes_completed; long long w_traj_ops_completed; FILE *w_traj_fd; int fd; long long recs_per_buffer; long long stopped,i; off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; long long xx,xx2; char *dummyfile [MAXSTREAMS]; /* name of dummy file */ char *nbuff; char *maddr; char *wmaddr,*free_addr; char now_string[30]; int anwser,bind_cpu,wval; #if defined(VXFS) || defined(solaris) int test_foo = 0; #endif off64_t filebytes64; char tmpname[256]; FILE *thread_wqfd; FILE *thread_Lwqfd; #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif double burst_acc_time_sec = 0; if(compute_flag) delay=compute_time; nbuff=maddr=wmaddr=free_addr=0; hist_time=thread_qtime_stop=thread_qtime_start=0; thread_wqfd=w_traj_fd=thread_Lwqfd=(FILE *)0; traj_offset=walltime=cputime=0; anwser=bind_cpu=0; if(w_traj_flag) { filebytes64 = w_traj_fsize; numrecs64=w_traj_ops; } else { filebytes64 = numrecs64*reclen; } written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; w_traj_bytes_completed=w_traj_ops_completed=0; recs_per_buffer = cache_size/reclen ; #ifdef NO_THREADS xx=chid; #else if(use_thread) { xx = (long long)((long)x); } else { xx=chid; } #endif #ifndef NO_THREADS #if defined(_HPUX_SOURCE) || defined(linux) if(ioz_processor_bind) { bind_cpu=(begin_proc+(int)xx)%num_processors; #if defined(_HPUX_SOURCE) pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); #else cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(bind_cpu, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); #endif my_nap(40); /* Switch to new cpu */ } #endif #endif if(use_thread) nbuff=barray[xx]; else nbuff=buffer; if(debug1 ) { if(use_thread) #ifdef NO_PRINT_LLD printf("\nStarting child %ld\n",(long)xx); #else printf("\nStarting child %lld\n",(long long)xx); #endif else #ifdef NO_PRINT_LLD printf("\nStarting process %d slot %ld\n",getpid(),(long)xx); #else printf("\nStarting process %d slot %lld\n",getpid(),(long long)xx); #endif } dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); xx2=xx; if(share_file) xx2=(long long)0; if(mfflag) { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s",filearray[xx2]); #else sprintf(dummyfile[xx],"%s",filearray[xx2]); #endif } else { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],(long)xx2); #else sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],(long long)xx2); #endif } /*****************/ /* Children only */ /*******************************************************************/ /* Initial write throughput performance test. **********************/ /*******************************************************************/ #if defined(Windows) if(unbuffered) { hand=CreateFile(dummyfile[xx], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,OPEN_ALWAYS,FILE_FLAG_NO_BUFFERING| FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, NULL); CloseHandle(hand); } #endif if(oflag) flags=O_RDWR|O_SYNC|O_CREAT; else flags=O_RDWR|O_CREAT; if(del_flag && mix_test) flags |= O_TRUNC; #if defined(O_DSYNC) if(odsync) flags |= O_DSYNC; #endif #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) flags |=O_RSYNC|O_SYNC; #endif #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) flags |=O_DIRECTIO; #endif #endif #if defined(Windows) if(unbuffered) { hand=CreateFile(dummyfile[xx], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING| FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, NULL); } else { #endif if((fd = I_OPEN(dummyfile[xx], (int)flags,0640))<0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("\nCan not open temp file: %s\n", dummyfile[xx]); perror("open"); exit(125); } #if defined(Windows) } #endif #ifdef VXFS if(direct_flag) { ioctl(fd,VX_SETCACHE,VX_DIRECT); ioctl(fd,VX_GETCACHE,&test_foo); if(test_foo == 0) { if(!client_iozone) printf("\nVxFS advanced setcache feature not available.\n"); exit(3); } } #endif #if defined(solaris) if(direct_flag) { test_foo = directio(fd, DIRECTIO_ON); if(test_foo != 0) { if(!client_iozone) printf("\ndirectio not available.\n"); exit(3); } } #endif /* #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif */ if(mmapflag) { maddr=(char *)initfile(fd,(filebytes64),1,PROT_READ|PROT_WRITE); } if(reclen < cache_size ) { recs_per_buffer = cache_size/reclen ; nbuff=&nbuff[(xx%recs_per_buffer)*reclen]; } if(fetchon) /* Prefetch into processor cache */ fetchit(nbuff,reclen); if((verify && !no_copy_flag) || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); if(w_traj_flag) w_traj_fd=open_w_traj(); child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->throughput = 0; child_stat->actual = 0; child_stat->flag=CHILD_STATE_READY; /* Tell parent child is ready to go */ if(distributed && client_iozone) tell_master_ready(chid); if(distributed && client_iozone) { if(cdebug) { fprintf(newstdout,"Child %d waiting for go from master\n",(int)xx); fflush(newstdout); } wait_for_master_go(chid); if(cdebug) { fprintf(newstdout,"Child %d received go from master\n",(int)xx); fflush(newstdout); } } else { while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ Poll((long long)1); } written_so_far=0; child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->actual = 0; child_stat->throughput = 0; stopped=0; if(file_lock) if(mylockf((int) fd, (int) 1, (int)0) != 0) printf("File lock for write failed. %d\n",errno); if(Q_flag) { sprintf(tmpname,"Child_%d_wol.dat",(int)xx); thread_wqfd=fopen(tmpname,"a"); if(thread_wqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } fprintf(thread_wqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); } if(L_flag) { sprintf(tmpname,"Child_%d.log",(int)xx); thread_Lwqfd=fopen(tmpname,"a"); if(thread_Lwqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Write test start: ",now_string); } starttime1 = time_so_far(); if(cpuutilflag) { walltime = starttime1; cputime = cputime_so_far(); } if(w_traj_flag) rewind(w_traj_fd); for(i=0; ithroughput = (time_so_far() - starttime1)-time_res - burst_acc_time_sec; if(include_close) { if((fd = I_OPEN(dummyfile[xx], (int)flags,0))<0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("\nCan not open temp file: %s\n", dummyfile[xx]); perror("open"); exit(125); } I_LSEEK(fd,save_offset,SEEK_SET); } if(child_stat->throughput < (double).000001) { child_stat->throughput = time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*written_so_far=(written_so_far*1024)/reclen;*/ written_so_far=w_traj_ops_completed; } child_stat->throughput = (double)written_so_far/child_stat->throughput; child_stat->actual = (double)written_so_far; if(debug1) { printf("\n(%ld) Stopped by another\n", (long)xx); } stopped=1; } if(purge) purgeit(nbuff,reclen); if(Q_flag || hist_summary || op_rate_flag) { thread_qtime_start=time_so_far(); } again: if(mmapflag) { wmaddr = &maddr[i*reclen]; fill_area((long long*)nbuff,(long long*)wmaddr,(long long)reclen); /*printf("CHid: %lld Writing offset %lld for length of %lld\n",chid,i*reclen,reclen);*/ if(!mmapnsflag) { if(mmapasflag) msync(wmaddr,(size_t)reclen,MS_ASYNC); if(mmapssflag) msync(wmaddr,(size_t)reclen,MS_SYNC); } } else { if(async_flag) { #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif if(no_copy_flag) { free_addr=nbuff=(char *)malloc((size_t)reclen+page_size); nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); if(verify || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,i); async_write_no_copy(gc, (long long)fd, nbuff, reclen, (i*reclen), depth,free_addr); } else async_write(gc, (long long)fd, nbuff, reclen, (i*reclen), depth); } else { #if defined(Windows) if(unbuffered) { if((dedup_flag && sparse_mode ) && !(dedup_iflag || dedup_bflag)) { zsize = (dedup * reclen )/100; I_LSEEK(fd,zsize,SEEK_CUR); WriteFile(hand,nbuff+zsize,reclen-zsize, (LPDWORD)&wval,0); wval = zsize + wval; } else { WriteFile(hand,nbuff,reclen, (LPDWORD)&wval,0); } } else { #endif if((dedup_flag && sparse_mode ) && !(dedup_iflag || dedup_bflag)) { zsize = (dedup * reclen )/100; I_LSEEK(fd,zsize,SEEK_CUR); wval = write(fd,nbuff+zsize,reclen - zsize); wval = zsize + wval; } else { wval=write(fd, nbuff, (size_t) reclen); } #ifndef NO_THREADS count_burst(&burst_acc_time_sec, xx); #endif #if defined(Windows) } #endif if(wval != reclen) { if(*stop_flag && !stopped){ if(include_flush) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC); else fsync(fd); } temp_time = time_so_far(); child_stat->throughput = (temp_time - starttime1)-time_res - burst_acc_time_sec; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*written_so_far=(written_so_far*1024)/reclen;*/ written_so_far=w_traj_ops_completed; } child_stat->throughput = (double)written_so_far/child_stat->throughput; child_stat->actual = (double)written_so_far; if(debug1) { printf("\n(%ld) Stopped by another\n", (long)xx); } stopped=1; goto again; } /* Note: Writer must finish even though told to stop. Otherwise the readers will fail. The code will capture bytes transfered before told to stop but let the writer complete. */ #ifdef NO_PRINT_LLD printf("\nError writing block %ld, fd= %d\n", (long)i, fd); #else printf("\nError writing block %lld, fd= %d\n", (long long)i, fd); #endif if(wval==-1) perror("write"); if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(127); } } } if(hist_summary) { thread_qtime_stop=time_so_far(); hist_time =(thread_qtime_stop-thread_qtime_start); hist_insert(hist_time); } if(op_rate_flag) { thread_qtime_stop=time_so_far(); desired_op_rate_time = ((double)1.0/(double)op_rate); actual_rate = (double)(thread_qtime_stop-thread_qtime_start); /* printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, actual_rate, (desired_op_rate_time-actual_rate)); */ if( actual_rate < desired_op_rate_time) my_unap((unsigned long long)((desired_op_rate_time-actual_rate)*1000000.0 )); } if(Q_flag) { thread_qtime_stop=time_so_far(); #ifdef NO_PRINT_LLD fprintf(thread_wqfd,"%10.1ld %10.0f %10.1ld\n",(long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long)reclen); #else fprintf(thread_wqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long long)reclen); #endif } w_traj_ops_completed++; w_traj_bytes_completed+=reclen; written_so_far+=reclen/1024; if(*stop_flag) { written_so_far-=reclen/1024; w_traj_bytes_completed-=reclen; } if(rlocking) { mylockr((int) fd, (int) 0, (int)0, lock_offset, reclen); } #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif } if(file_lock) if(mylockf((int) fd, (int) 0, (int)0)) printf("Write unlock failed. %d\n",errno); /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(!xflag) { *stop_flag=1; if(distributed && client_iozone) send_stop(); } if(include_flush) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC); else fsync(fd); } if(include_close) { if(mmapflag) mmap_end(maddr,(unsigned long long)filebytes64); #if defined(Windows) if(unbuffered) CloseHandle(hand); else #endif close(fd); } if(!stopped){ temp_time = time_so_far(); if(inc_think) child_stat->throughput = ((temp_time - starttime1)-time_res - burst_acc_time_sec); else child_stat->throughput = ((temp_time - starttime1)-time_res - burst_acc_time_sec) -compute_val; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*written_so_far=(written_so_far*1024)/reclen;*/ written_so_far=w_traj_ops_completed; } child_stat->throughput = (double)written_so_far/child_stat->throughput; child_stat->actual = (double)written_so_far; } if(cdebug) { fprintf(newstdout,"Child %d: throughput %f actual %f \n",(int)chid, child_stat->throughput, child_stat->actual); fflush(newstdout); } if(cpuutilflag) { cputime = cputime_so_far() - cputime; if (cputime < cputime_res) cputime = 0.0; child_stat->cputime = cputime; walltime = time_so_far() - walltime; child_stat->walltime = walltime; } if(distributed && client_iozone) tell_master_stats(THREAD_WRITE_TEST, chid, child_stat->throughput, child_stat->actual, child_stat->cputime, child_stat->walltime, (char)*stop_flag, (long long)CHILD_STATE_HOLD); if (debug1) { #ifdef NO_PRINT_LLD printf(" child/slot: %ld, wall-cpu: %8.3f %8.3fC" " -> %6.2f%%\n", (long)xx, #else printf(" child/slot: %lld, wall-cpu: %8.3f %8.3fC" " -> %6.2f%%\n", (long long)xx, #endif walltime, cputime, cpu_util(cputime, walltime)); } child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ stopped=0; /*******************************************************************/ /* End write performance test. *************************************/ /*******************************************************************/ if(debug1) #ifdef NO_PRINT_LLD printf("\nChild finished %ld\n",(long)xx); #else printf("\nChild finished %lld\n",(long long)xx); #endif if(!include_close) { if(mmapflag) { msync(maddr,(size_t)numrecs64*reclen,MS_SYNC); /*Clean up before read starts running*/ mmap_end(maddr,(unsigned long long)numrecs64*reclen); }else fsync(fd); #if defined(Windows) if(unbuffered) CloseHandle(hand); else #endif close(fd); } if(Q_flag && (thread_wqfd !=0) ) fclose(thread_wqfd); free(dummyfile[xx]); if(w_traj_flag) fclose(w_traj_fd); if(L_flag) { get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Write test finished: ",now_string); fclose(thread_Lwqfd); } if(hist_summary) dump_hist("write",(int)xx); if(distributed && client_iozone) return(0); #ifdef NO_THREADS exit(0); #else if(use_thread) thread_exit(); else exit(0); #endif return(0); } #ifdef HAVE_PREAD /************************************************************************/ /* Thread pwrite test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void * thread_pwrite_test(int x) #else void * thread_pwrite_test( x) #endif { struct child_stats *child_stat; double starttime1 = 0; double temp_time; double walltime, cputime; double compute_val = (double)0; float delay = (float)0; double thread_qtime_stop,thread_qtime_start; double hist_time; double desired_op_rate_time; double actual_rate; off64_t traj_offset; off64_t lock_offset=0; long long flags,traj_size; long long w_traj_bytes_completed; long long w_traj_ops_completed; FILE *w_traj_fd; int fd; long long recs_per_buffer; long long stopped,i; off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; long long xx,xx2; char *dummyfile [MAXSTREAMS]; /* name of dummy file */ char *nbuff; char *maddr; char *wmaddr,*free_addr; char now_string[30]; int anwser,bind_cpu,wval; #if defined(VXFS) || defined(solaris) int test_foo = 0; #endif off64_t filebytes64; char tmpname[256]; FILE *thread_wqfd; FILE *thread_Lwqfd; #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif if(compute_flag) delay=compute_time; nbuff=maddr=wmaddr=free_addr=0; hist_time=thread_qtime_stop=thread_qtime_start=0; thread_wqfd=w_traj_fd=thread_Lwqfd=(FILE *)0; traj_offset=walltime=cputime=0; anwser=bind_cpu=0; if(w_traj_flag) { filebytes64 = w_traj_fsize; numrecs64=w_traj_ops; } else { filebytes64 = numrecs64*reclen; } written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; w_traj_bytes_completed=w_traj_ops_completed=0; recs_per_buffer = cache_size/reclen ; #ifdef NO_THREADS xx=chid; #else if(use_thread) { xx = (long long)((long)x); } else { xx=chid; } #endif #ifndef NO_THREADS #if defined( _HPUX_SOURCE ) || defined ( linux ) if(ioz_processor_bind) { bind_cpu=(begin_proc+(int)xx)%num_processors; #if defined( _HPUX_SOURCE ) pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); #else cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(bind_cpu, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); #endif my_nap(40); /* Switch to new cpu */ } #endif #endif if(use_thread) nbuff=barray[xx]; else nbuff=buffer; if(debug1 ) { if(use_thread) #ifdef NO_PRINT_LLD printf("\nStarting child %ld\n",(long)xx); #else printf("\nStarting child %lld\n",(long long)xx); #endif else #ifdef NO_PRINT_LLD printf("\nStarting process %d slot %ld\n",getpid(),(long)xx); #else printf("\nStarting process %d slot %lld\n",getpid(),(long long)xx); #endif } dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); xx2=xx; if(share_file) xx2=(long long)0; if(mfflag) { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s",filearray[xx2]); #else sprintf(dummyfile[xx],"%s",filearray[xx2]); #endif } else { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],(long)xx2); #else sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],(long long)xx2); #endif } /*****************/ /* Children only */ /*******************************************************************/ /* Initial pwrite throughput performance test. *********************/ /*******************************************************************/ if(!notruncate) { if((fd = I_CREAT(dummyfile[xx], 0640))<0) { client_error=errno; if(distributed && client_iozone) send_stop(); perror(dummyfile[xx]); exit(123); } close(fd); } if(oflag) flags=O_RDWR|O_SYNC|O_CREAT; else flags=O_RDWR|O_CREAT; #if defined(O_DSYNC) if(odsync) flags |= O_DSYNC; #endif #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) flags |=O_RSYNC|O_SYNC; #endif #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) flags |=O_DIRECTIO; #endif #endif if((fd = I_OPEN(dummyfile[xx], (int)flags,0640))<0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("\nCan not open temp file: %s\n", dummyfile[xx]); perror("open"); exit(125); } #ifdef VXFS if(direct_flag) { ioctl(fd,VX_SETCACHE,VX_DIRECT); ioctl(fd,VX_GETCACHE,&test_foo); if(test_foo == 0) { if(!client_iozone) printf("\nVxFS advanced setcache feature not available.\n"); exit(3); } } #endif #if defined(solaris) if(direct_flag) { test_foo = directio(fd, DIRECTIO_ON); if(test_foo != 0) { if(!client_iozone) printf("\ndirectio not available.\n"); exit(3); } } #endif /* #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif */ if(mmapflag) { maddr=(char *)initfile(fd,(filebytes64),1,PROT_READ|PROT_WRITE); } if(reclen < cache_size ) { recs_per_buffer = cache_size/reclen ; nbuff=&nbuff[(xx%recs_per_buffer)*reclen]; } if(fetchon) /* Prefetch into processor cache */ fetchit(nbuff,reclen); if((verify && !no_copy_flag) || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); if(w_traj_flag) w_traj_fd=open_w_traj(); child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->throughput = 0; child_stat->actual = 0; child_stat->flag=CHILD_STATE_READY; /* Tell parent child is ready to go */ if(distributed && client_iozone) tell_master_ready(chid); if(distributed && client_iozone) { if(cdebug) { fprintf(newstdout,"Child %d waiting for go from master\n",(int)xx); fflush(newstdout); } wait_for_master_go(chid); if(cdebug) { fprintf(newstdout,"Child %d received go from master\n",(int)xx); fflush(newstdout); } } else { while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ Poll((long long)1); } written_so_far=0; child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->actual = 0; child_stat->throughput = 0; stopped=0; if(file_lock) if(mylockf((int) fd, (int) 1, (int)0) != 0) printf("File lock for write failed. %d\n",errno); if(Q_flag) { sprintf(tmpname,"Child_%d_pwol.dat",(int)xx); thread_wqfd=fopen(tmpname,"a"); if(thread_wqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } fprintf(thread_wqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); } if(L_flag) { sprintf(tmpname,"Child_%d.log",(int)xx); thread_Lwqfd=fopen(tmpname,"a"); if(thread_Lwqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Pwrite test start: ",now_string); } starttime1 = time_so_far(); if(cpuutilflag) { walltime = starttime1; cputime = cputime_so_far(); } if(w_traj_flag) rewind(w_traj_fd); for(i=0; ithroughput = ((temp_time - starttime1)-time_res); else child_stat->throughput = ((temp_time - starttime1)-time_res) -compute_val; if(child_stat->throughput < (double).000001) { child_stat->throughput = time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*written_so_far=(written_so_far*1024)/reclen;*/ written_so_far=w_traj_ops_completed; } child_stat->throughput = (double)written_so_far/child_stat->throughput; child_stat->actual = (double)written_so_far; if(debug1) { printf("\n(%ld) Stopped by another\n", (long)xx); } stopped=1; } if(purge) purgeit(nbuff,reclen); if(Q_flag || hist_summary || op_rate_flag) { thread_qtime_start=time_so_far(); } again: if(mmapflag) { wmaddr = &maddr[traj_offset]; fill_area((long long*)nbuff,(long long*)wmaddr,(long long)reclen); /*printf("CHid: %lld Writing offset %lld for length of %lld\n",chid,i*reclen,reclen);*/ if(!mmapnsflag) { if(mmapasflag) msync(wmaddr,(size_t)reclen,MS_ASYNC); if(mmapssflag) msync(wmaddr,(size_t)reclen,MS_SYNC); } } else { if(async_flag) { #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif if(no_copy_flag) { free_addr=nbuff=(char *)malloc((size_t)reclen+page_size); nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); if(verify || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,i); async_write_no_copy(gc, (long long)fd, nbuff, reclen, (traj_offset), depth,free_addr); } else async_write(gc, (long long)fd, nbuff, reclen, (traj_offset), depth); } else { if((dedup_flag && sparse_mode ) && !(dedup_iflag || dedup_bflag)) { zsize = (dedup * reclen )/100; I_LSEEK(fd,zsize,SEEK_CUR); wval=I_PWRITE(fd, nbuff+zsize, reclen-zsize, traj_offset); wval = zsize + wval; } else { wval=I_PWRITE(fd, nbuff, reclen, traj_offset); } if(wval != reclen) { if(*stop_flag && !stopped){ if(include_flush) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC); else fsync(fd); } temp_time = time_so_far(); child_stat->throughput = (temp_time - starttime1)-time_res; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*written_so_far=(written_so_far*1024)/reclen;*/ written_so_far=w_traj_ops_completed; } child_stat->throughput = (double)written_so_far/child_stat->throughput; child_stat->actual = (double)written_so_far; if(debug1) { printf("\n(%ld) Stopped by another\n", (long)xx); } stopped=1; goto again; } /* Note: Writer must finish even though told to stop. Otherwise the readers will fail. The code will capture bytes transfered before told to stop but let the writer complete. */ #ifdef NO_PRINT_LLD printf("\nError pwriting block %ld, fd= %d\n", (long)i, fd); #else printf("\nError pwriting block %lld, fd= %d\n", (long long)i, fd); #endif if(wval==-1) perror("pwrite"); if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(127); } } } if(rlocking) { mylockr((int) fd, (int) 0, (int)0, lock_offset, reclen); } if(hist_summary) { thread_qtime_stop=time_so_far(); hist_time =(thread_qtime_stop-thread_qtime_start-time_res); hist_insert(hist_time); } if(op_rate_flag) { thread_qtime_stop=time_so_far(); desired_op_rate_time = ((double)1.0/(double)op_rate); actual_rate = (double)(thread_qtime_stop-thread_qtime_start); /* printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, actual_rate, (desired_op_rate_time-actual_rate)); */ if( actual_rate < desired_op_rate_time) my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); } if(Q_flag) { thread_qtime_stop=time_so_far(); #ifdef NO_PRINT_LLD fprintf(thread_wqfd,"%10.1ld %10.0f %10.1ld\n",(long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long)reclen); #else fprintf(thread_wqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long long)reclen); #endif } w_traj_ops_completed++; w_traj_bytes_completed+=reclen; written_so_far+=reclen/1024; if(*stop_flag) { written_so_far-=reclen/1024; w_traj_bytes_completed-=reclen; } #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif } if(file_lock) if(mylockf((int) fd, (int) 0, (int)0)) printf("Write unlock failed. %d\n",errno); /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(!xflag) { *stop_flag=1; if(distributed && client_iozone) send_stop(); } if(include_flush) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC); else fsync(fd); } if(include_close) { if(mmapflag) mmap_end(maddr,(unsigned long long)filebytes64); close(fd); } if(!stopped){ temp_time = time_so_far(); if(inc_think) child_stat->throughput = ((temp_time - starttime1)-time_res); else child_stat->throughput = ((temp_time - starttime1)-time_res) -compute_val; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*written_so_far=(written_so_far*1024)/reclen;*/ written_so_far=w_traj_ops_completed; } child_stat->throughput = (double)written_so_far/child_stat->throughput; child_stat->actual = (double)written_so_far; } if(cdebug) { fprintf(newstdout,"Child %d: throughput %f actual %f \n",(int)chid, child_stat->throughput, child_stat->actual); fflush(newstdout); } if(cpuutilflag) { cputime = cputime_so_far() - cputime; if (cputime < cputime_res) cputime = 0.0; child_stat->cputime = cputime; walltime = time_so_far() - walltime; child_stat->walltime = walltime; } if(distributed && client_iozone) tell_master_stats(THREAD_PWRITE_TEST, chid, child_stat->throughput, child_stat->actual, child_stat->cputime, child_stat->walltime, (char)*stop_flag, (long long)CHILD_STATE_HOLD); if (debug1) { #ifdef NO_PRINT_LLD printf(" child/slot: %ld, wall-cpu: %8.3f %8.3fC" " -> %6.2f%%\n",(long)xx, #else printf(" child/slot: %lld, wall-cpu: %8.3f %8.3fC" " -> %6.2f%%\n",(long long)xx, #endif walltime, cputime, cpu_util(cputime, walltime)); } child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ stopped=0; /*******************************************************************/ /* End pwrite performance test. *************************************/ /*******************************************************************/ if(debug1) #ifdef NO_PRINT_LLD printf("\nChild finished %ld\n",(long)xx); #else printf("\nChild finished %lld\n",(long long)xx); #endif if(!include_close) { if(mmapflag) { msync(maddr,(size_t)numrecs64*reclen,MS_SYNC); /*Clean up before read starts running*/ mmap_end(maddr,(unsigned long long)numrecs64*reclen); }else fsync(fd); close(fd); } if(Q_flag && (thread_wqfd !=0) ) fclose(thread_wqfd); free(dummyfile[xx]); if(w_traj_flag) fclose(w_traj_fd); if(L_flag) { get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Pwrite test finished: ",now_string); fclose(thread_Lwqfd); } if(hist_summary) dump_hist("Pwrite",(int)xx); if(distributed && client_iozone) return(0); #ifdef NO_THREADS exit(0); #else if(use_thread) thread_exit(); else exit(0); #endif return(0); } #endif /************************************************************************/ /* Thread re-write test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void * thread_rwrite_test(int x) #else void * thread_rwrite_test(x) #endif { /************************/ /* Children only here */ /************************/ struct child_stats *child_stat; long long xx,xx2; double compute_val = (double)0; double walltime, cputime; float delay = (float)0; double thread_qtime_stop,thread_qtime_start; double hist_time; double desired_op_rate_time; double actual_rate; off64_t traj_offset; off64_t lock_offset=0; long long w_traj_bytes_completed; long long w_traj_ops_completed; int fd; FILE *w_traj_fd; long long flags = 0; double starttime1 = 0; double temp_time; long long recs_per_buffer,traj_size; long long i; off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far=0; char *dummyfile [MAXSTREAMS]; /* name of dummy file */ char *nbuff; char *maddr,*free_addr; char *wmaddr; char now_string[30]; int anwser,bind_cpu,wval; FILE *thread_rwqfd,*thread_Lwqfd; char tmpname[256]; #if defined(VXFS) || defined(solaris) int test_foo = 0; #endif #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif double burst_acc_time_sec = 0; if(compute_flag) delay=compute_time; wmaddr=nbuff=maddr=free_addr=0; thread_rwqfd=w_traj_fd=thread_Lwqfd=(FILE *)0; hist_time=traj_offset=thread_qtime_stop=thread_qtime_start=0; walltime=cputime=0; anwser=bind_cpu=0; w_traj_bytes_completed=w_traj_ops_completed=0; written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; recs_per_buffer = cache_size/reclen ; if(w_traj_flag) { filebytes64 = w_traj_fsize; numrecs64=w_traj_ops; } else { filebytes64 = numrecs64*reclen; } #ifdef NO_THREADS xx=chid; #else if(use_thread) xx=(long long)((long)x); else { xx=chid; } #endif #ifndef NO_THREADS #if defined( _HPUX_SOURCE ) || defined ( linux ) if(ioz_processor_bind) { bind_cpu=(begin_proc+(int)xx)%num_processors; #if defined( _HPUX_SOURCE ) pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); #else cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(bind_cpu, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); #endif my_nap(40); /* Switch to new cpu */ } #endif #endif if(use_thread) nbuff=barray[xx]; else nbuff=buffer; child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->throughput = 0; child_stat->actual = 0; if(debug1) { if(use_thread) #ifdef NO_PRINT_LLD printf("\nStarting child %ld\n",(long)xx); #else printf("\nStarting child %lld\n",(long long)xx); #endif else #ifdef NO_PRINT_LLD printf("\nStarting process %d slot %ld\n",getpid(),(long)xx); #else printf("\nStarting process %d slot %lld\n",getpid(),(long long)xx); #endif } dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); xx2=xx; if(share_file) xx2=(long long)0; if(mfflag) { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s",filearray[xx2]); #else sprintf(dummyfile[xx],"%s",filearray[xx2]); #endif } else { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],(long)xx2); #else sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],(long long)xx2); #endif } flags = O_RDWR; if(oflag) flags|= O_SYNC; #if defined(O_DSYNC) if(odsync) flags|= O_DSYNC; #endif #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) flags |=O_RSYNC|O_SYNC; #endif #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) flags |=O_DIRECTIO; #endif #endif #if defined(Windows) if(unbuffered) { hand=CreateFile(dummyfile[xx], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,OPEN_ALWAYS,FILE_FLAG_NO_BUFFERING| FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, NULL); } else { #endif if((fd = I_OPEN(dummyfile[xx], (int)flags,0))<0) { client_error=errno; if(distributed && client_iozone) send_stop(); #ifdef NO_PRINT_LLD printf("\nChild %ld\n",(long)xx); #else printf("\nChild %lld\n",(long long)xx); #endif child_stat->flag = CHILD_STATE_HOLD; perror(dummyfile[xx]); exit(128); } #if defined(Windows) } #endif #ifdef VXFS if(direct_flag) { ioctl(fd,VX_SETCACHE,VX_DIRECT); ioctl(fd,VX_GETCACHE,&test_foo); if(test_foo == 0) { if(!client_iozone) printf("\nVxFS advanced setcache feature not available.\n"); exit(3); } } #endif #if defined(solaris) if(direct_flag) { test_foo = directio(fd, DIRECTIO_ON); if(test_foo != 0) { if(!client_iozone) printf("\ndirectio not available.\n"); exit(3); } } #endif /* #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif */ if(mmapflag) { maddr=(char *)initfile(fd,(numrecs64*reclen),1,PROT_READ|PROT_WRITE); } if(fetchon) fetchit(nbuff,reclen); if(w_traj_flag) w_traj_fd=open_w_traj(); if(Q_flag) { sprintf(tmpname,"Child_%d_rwol.dat",(int)xx); thread_rwqfd=fopen(tmpname,"a"); if(thread_rwqfd==0) { printf("Unable to open %s\n",tmpname); client_error=errno; if(distributed && client_iozone) send_stop(); exit(40); } fprintf(thread_rwqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); } if(L_flag) { sprintf(tmpname,"Child_%d.log",(int)xx); thread_Lwqfd=fopen(tmpname,"a"); if(thread_Lwqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Rewrite test start: ",now_string); } child_stat->flag = CHILD_STATE_READY; if(distributed && client_iozone) tell_master_ready(chid); if(distributed && client_iozone) { if(cdebug) { fprintf(newstdout,"Child %d waiting for go from master\n",(int)xx); fflush(newstdout); } wait_for_master_go(chid); if(cdebug) { fprintf(newstdout,"Child %d received go from master\n",(int)xx); fflush(newstdout); } } else { while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ Poll((long long)1); } starttime1 = time_so_far(); if(cpuutilflag) { walltime = starttime1; cputime = cputime_so_far(); } if(file_lock) if(mylockf((int) fd, (int) 1, (int)0) != 0) printf("File lock for write failed. %d\n",errno); if(cpuutilflag) { walltime = starttime1; cputime = cputime_so_far(); } if(w_traj_flag) rewind(w_traj_fd); if((verify && !no_copy_flag) || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); for(i=0; iflag = CHILD_STATE_HOLD; signal_handler(); } } } re_written_so_far+=reclen/1024; w_traj_ops_completed++; w_traj_bytes_completed+=reclen; if(*stop_flag) { re_written_so_far-=reclen/1024; w_traj_bytes_completed-=reclen; } if(hist_summary) { thread_qtime_stop=time_so_far(); hist_time =(thread_qtime_stop-thread_qtime_start-time_res); hist_insert(hist_time); } if(op_rate_flag) { thread_qtime_stop=time_so_far(); desired_op_rate_time = ((double)1.0/(double)op_rate); actual_rate = (double)(thread_qtime_stop-thread_qtime_start); /* printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, actual_rate, (desired_op_rate_time-actual_rate)); */ if( actual_rate < desired_op_rate_time) my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); } if(Q_flag) { thread_qtime_stop=time_so_far(); #ifdef NO_PRINT_LLD fprintf(thread_rwqfd,"%10.1ld %10.0f %10.1ld\n",(long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long)reclen); #else fprintf(thread_rwqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long long)reclen); #endif } if(rlocking) { mylockr((int) fd, (int) 0, (int)0, lock_offset, reclen); } #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif } if(file_lock) if(mylockf((int) fd, (int) 0, (int)0)) printf("Write unlock failed. %d\n",errno); /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(include_flush) { if(mmapflag) { msync(maddr,(size_t)(filebytes64),MS_SYNC); }else fsync(fd); } if(include_close) { if(mmapflag) { mmap_end(maddr,(unsigned long long)filebytes64); } #if defined(Windows) if(unbuffered) CloseHandle(hand); else #endif close(fd); } temp_time=time_so_far(); child_stat=(struct child_stats *)&shmaddr[xx]; if(inc_think) child_stat->throughput = ((temp_time - starttime1)-time_res - burst_acc_time_sec); else child_stat->throughput = ((temp_time - starttime1)-time_res - burst_acc_time_sec) -compute_val; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*re_written_so_far=(re_written_so_far*1024)/reclen;*/ re_written_so_far=w_traj_ops_completed; } child_stat->throughput = (double)re_written_so_far/child_stat->throughput; child_stat->actual = (double)re_written_so_far; if(!xflag) { *stop_flag=1; if(distributed && client_iozone) send_stop(); } if(cdebug) { fprintf(newstdout,"Child %d: throughput %f actual %f \n",(int)chid, child_stat->throughput, child_stat->actual); fflush(newstdout); } if(cpuutilflag) { cputime = cputime_so_far() - cputime; if (cputime < cputime_res) cputime = 0.0; child_stat->cputime = cputime; walltime = time_so_far() - walltime; child_stat->walltime = walltime; } if(distributed && client_iozone) tell_master_stats(THREAD_REWRITE_TEST, chid, child_stat->throughput, child_stat->actual, child_stat->cputime, child_stat->walltime, (char)*stop_flag, (long long)CHILD_STATE_HOLD); child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ if(!include_close) { if(mmapflag) { msync(maddr,(size_t)(filebytes64),MS_SYNC); mmap_end(maddr,(unsigned long long)filebytes64); } else fsync(fd); #if defined(Windows) if(unbuffered) CloseHandle(hand); else #endif close(fd); } free(dummyfile[xx]); if(Q_flag && (thread_rwqfd !=0) ) fclose(thread_rwqfd); if(w_traj_flag) fclose(w_traj_fd); if(debug1) #ifdef NO_PRINT_LLD printf("\nChild Stopping %ld\n",(long)xx); #else printf("\nChild Stopping %lld\n",(long long)xx); #endif if(L_flag) { get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Rewrite test finished: ",now_string); fclose(thread_Lwqfd); } if(hist_summary) dump_hist("Rewrite",(int)xx); if(distributed && client_iozone) return(0); #ifdef NO_THREADS exit(0); #else if(use_thread) thread_exit(); else exit(0); #endif return(0); } /************************************************************************/ /* Thread read test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void * thread_read_test(int x) #else void * thread_read_test(x) #endif { long long xx,xx2; struct child_stats *child_stat; double walltime, cputime; long long r_traj_bytes_completed; long long r_traj_ops_completed; int fd; FILE *r_traj_fd,*thread_rqfd; FILE *thread_Lwqfd; long long flags = 0; off64_t traj_offset; off64_t lock_offset=0; double starttime1 = 0; float delay = 0; double temp_time; double thread_qtime_start,thread_qtime_stop; double hist_time; double desired_op_rate_time; double actual_rate; double compute_val = (double)0; off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; long long recs_per_buffer,traj_size; off64_t i; char *dummyfile[MAXSTREAMS]; /* name of dummy file */ char *nbuff=0; char *maddr=0; char *wmaddr=0; char tmpname[256]; volatile char *buffer1; char now_string[30]; int anwser,bind_cpu; long wval; #if defined(VXFS) || defined(solaris) int test_foo = 0; #endif #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif if(compute_flag) delay=compute_time; thread_rqfd=thread_Lwqfd=r_traj_fd=(FILE *)0; hist_time=traj_offset=thread_qtime_stop=thread_qtime_start=0; walltime=cputime=0; anwser=bind_cpu=0; r_traj_bytes_completed=r_traj_ops_completed=0; written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; recs_per_buffer = cache_size/reclen ; if(r_traj_flag) { filebytes64 = r_traj_fsize; numrecs64=r_traj_ops; } else { filebytes64 = numrecs64*reclen; } #ifdef NO_THREADS xx=chid; #else if(use_thread) xx = (long long)((long)x); else { xx=chid; } #endif #ifndef NO_THREADS #if defined( _HPUX_SOURCE ) || defined ( linux ) if(ioz_processor_bind) { bind_cpu=(begin_proc+(int)xx)%num_processors; #if defined(_HPUX_SOURCE) pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); #else cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(bind_cpu, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); #endif my_nap(40); /* Switch to new cpu */ } #endif #endif if(use_thread) nbuff=barray[xx]; else nbuff=buffer; dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); xx2=xx; if(share_file) xx2=(long long)0; if(mfflag) { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s",filearray[xx2]); #else sprintf(dummyfile[xx],"%s",filearray[xx2]); #endif } else { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],(long)xx2); #else sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],(long long)xx2); #endif } if(oflag) flags=O_RDONLY|O_SYNC; else flags=O_RDONLY; #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) flags |=O_RSYNC|O_SYNC; #endif #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) flags |=O_DIRECTIO; #endif #endif #if defined(Windows) if(unbuffered) { hand=CreateFile(dummyfile[xx], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING| FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, NULL); SetFilePointer(hand,(LONG)0,0,FILE_BEGIN); } else { #endif if((fd = I_OPEN(dummyfile[xx], (int)flags,0))<0) { client_error=errno; if(distributed && client_iozone) send_stop(); perror(dummyfile[xx]); exit(130); } #if defined(Windows) } #endif /* #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif */ #ifdef VXFS if(direct_flag) { ioctl(fd,VX_SETCACHE,VX_DIRECT); ioctl(fd,VX_GETCACHE,&test_foo); if(test_foo == 0) { if(!client_iozone) printf("\nVxFS advanced setcache feature not available.\n"); exit(3); } } #endif #if defined(solaris) if(direct_flag) { test_foo = directio(fd, DIRECTIO_ON); if(test_foo != 0) { if(!client_iozone) printf("\ndirectio not available.\n"); exit(3); } } #endif if(mmapflag) { maddr=(char *)initfile(fd,(numrecs64*reclen),0,PROT_READ); } child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->throughput = 0; child_stat->actual = 0; if(debug1) { if(use_thread) #ifdef NO_PRINT_LLD printf("\nStarting child %ld\n",(long)xx); #else printf("\nStarting child %lld\n",(long long)xx); #endif else #ifdef NO_PRINT_LLD printf("\nStarting process %d slot %ld\n",getpid(),(long)xx); #else printf("\nStarting process %d slot %lld\n",getpid(),(long long)xx); #endif } /*****************/ /* Children only */ /*****************/ if(Q_flag) { sprintf(tmpname,"Child_%d_rol.dat",(int)xx); thread_rqfd=fopen(tmpname,"a"); if(thread_rqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } fprintf(thread_rqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); } if(L_flag) { sprintf(tmpname,"Child_%d.log",(int)xx); thread_Lwqfd=fopen(tmpname,"a"); if(thread_Lwqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Read test start: ",now_string); } if(r_traj_flag) r_traj_fd=open_r_traj(); if(fetchon) fetchit(nbuff,reclen); child_stat=(struct child_stats *)&shmaddr[xx]; child_stat->flag = CHILD_STATE_READY; if(distributed && client_iozone) { tell_master_ready(chid); wait_for_master_go(chid); } else { /* Wait for signal from parent */ while(child_stat->flag!=CHILD_STATE_BEGIN) Poll((long long)1); } if(file_lock) if(mylockf((int) fd, (int) 1, (int)1) != 0) printf("File lock for read failed. %d\n",errno); starttime1 = time_so_far(); if(cpuutilflag) { walltime = starttime1; cputime = cputime_so_far(); } if(r_traj_flag) rewind(r_traj_fd); for(i=0; iflag = CHILD_STATE_HOLD; exit(132); } } } if(verify){ if(async_flag && no_copy_flag) { if(verify_buffer(buffer1,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(133); } } else { if(verify_buffer(nbuff,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(134); } } } if(async_flag) { if(no_copy_flag) async_release(gc); end_async(gc); gc=0; } read_so_far+=reclen/1024; r_traj_bytes_completed+=reclen; r_traj_ops_completed++; if(*stop_flag) { read_so_far-=reclen/1024; r_traj_bytes_completed-=reclen; } if(hist_summary) { thread_qtime_stop=time_so_far(); hist_time =(thread_qtime_stop-thread_qtime_start-time_res); hist_insert(hist_time); } if(op_rate_flag) { thread_qtime_stop=time_so_far(); desired_op_rate_time = ((double)1.0/(double)op_rate); actual_rate = (double)(thread_qtime_stop-thread_qtime_start); /* printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, actual_rate, (desired_op_rate_time-actual_rate)); */ if( actual_rate < desired_op_rate_time) my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); } if(Q_flag) { thread_qtime_stop=time_so_far(); #ifdef NO_PRINT_LLD fprintf(thread_rqfd,"%10.1ld %10.0f %10.1ld\n",(long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long)reclen); #else fprintf(thread_rqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long long)reclen); #endif } if(rlocking) { mylockr((int) fd, (int) 0, (int)1, lock_offset, reclen); } #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif } if(file_lock) if(mylockf((int) fd, (int) 0, (int)1)) printf("Read unlock failed. %d\n",errno); /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(include_flush) { if(mmapflag) { msync(maddr,(size_t)(filebytes64),MS_SYNC); }else fsync(fd); } if(include_close) { if(mmapflag) { mmap_end(maddr,(unsigned long long)filebytes64); } #if defined(Windows) if(unbuffered) CloseHandle(hand); else #endif close(fd); } temp_time = time_so_far(); child_stat=(struct child_stats *)&shmaddr[xx]; if(inc_think) child_stat->throughput = ((temp_time - starttime1)-time_res); else child_stat->throughput = ((temp_time - starttime1)-time_res) -compute_val; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*read_so_far=(read_so_far*1024)/reclen;*/ read_so_far=r_traj_ops_completed; } child_stat->throughput = read_so_far/child_stat->throughput; child_stat->actual = read_so_far; if(!xflag) { *stop_flag=1; if(distributed && client_iozone) send_stop(); } if(cdebug) { fprintf(newstdout,"Child %d: throughput %f actual %f \n",(int)chid,child_stat->throughput, child_stat->actual); fflush(newstdout); } if(cpuutilflag) { cputime = cputime_so_far() - cputime; if (cputime < cputime_res) cputime = 0.0; child_stat->cputime = cputime; walltime = time_so_far() - walltime; child_stat->walltime = walltime; } if(distributed && client_iozone) tell_master_stats(THREAD_READ_TEST, chid, child_stat->throughput, child_stat->actual, child_stat->cputime, child_stat->walltime, (char)*stop_flag, (long long)CHILD_STATE_HOLD); child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ /*fsync(fd);*/ if(!include_close) { if(mmapflag) { msync(maddr,(size_t)(filebytes64),MS_SYNC); mmap_end(maddr,(unsigned long long)filebytes64); }else fsync(fd); #if defined(Windows) if(unbuffered) CloseHandle(hand); else #endif close(fd); } if(Q_flag && (thread_rqfd !=0) ) fclose(thread_rqfd); free(dummyfile[xx]); if(r_traj_flag) fclose(r_traj_fd); if(debug1) #ifdef NO_PRINT_LLD printf("\nChild finished %ld\n",(long)xx); #else printf("\nChild finished %lld\n",(long long)xx); #endif if(L_flag) { get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Read test finished: ",now_string); fclose(thread_Lwqfd); } if(hist_summary) dump_hist("Read",(int)xx); if(distributed && client_iozone) return(0); #ifdef NO_THREADS exit(0); #else if(use_thread) thread_exit(); else exit(0); #endif return(0); } #ifdef HAVE_PREAD /************************************************************************/ /* Thread pread test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void * thread_pread_test(int x) #else void * thread_pread_test(x) #endif { long long xx,xx2; struct child_stats *child_stat; double walltime, cputime; long long r_traj_bytes_completed; long long r_traj_ops_completed; int fd,wval; FILE *r_traj_fd,*thread_rqfd; FILE *thread_Lwqfd; long long flags = 0; off64_t traj_offset; off64_t lock_offset=0; double starttime1 = 0; float delay = 0; double temp_time; double thread_qtime_start,thread_qtime_stop; double hist_time; double desired_op_rate_time; double actual_rate; double compute_val = (double)0; off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; long long recs_per_buffer,traj_size; off64_t i; char *dummyfile[MAXSTREAMS]; /* name of dummy file */ char *nbuff=0; char *maddr=0; char *wmaddr=0; char tmpname[256]; char now_string[30]; volatile char *buffer1; int anwser,bind_cpu; #if defined(VXFS) || defined(solaris) int test_foo = 0; #endif #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif if(compute_flag) delay=compute_time; thread_rqfd=thread_Lwqfd=r_traj_fd=(FILE *)0; hist_time=traj_offset=thread_qtime_stop=thread_qtime_start=0; walltime=cputime=0; anwser=bind_cpu=0; r_traj_bytes_completed=r_traj_ops_completed=0; written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; recs_per_buffer = cache_size/reclen ; if(r_traj_flag) { filebytes64 = r_traj_fsize; numrecs64=r_traj_ops; } else { filebytes64 = numrecs64*reclen; } #ifdef NO_THREADS xx=chid; #else if(use_thread) xx = (long long)((long)x); else { xx=chid; } #endif #ifndef NO_THREADS #ifdef _HPUX_SOURCE if(ioz_processor_bind) { bind_cpu=(begin_proc+(int)xx)%num_processors; pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); my_nap(40); /* Switch to new cpu */ } #endif #endif if(use_thread) nbuff=barray[xx]; else nbuff=buffer; dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); xx2=xx; if(share_file) xx2=(long long)0; if(mfflag) { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s",filearray[xx2]); #else sprintf(dummyfile[xx],"%s",filearray[xx2]); #endif } else { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],(long)xx2); #else sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],(long long)xx2); #endif } if(oflag) flags=O_RDONLY|O_SYNC; else flags=O_RDONLY; #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) flags |=O_RSYNC|O_SYNC; #endif #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) flags |=O_DIRECTIO; #endif #endif if((fd = I_OPEN(dummyfile[xx], (int)flags,0))<0) { client_error=errno; if(distributed && client_iozone) send_stop(); perror(dummyfile[xx]); exit(130); } /* #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif */ #ifdef VXFS if(direct_flag) { ioctl(fd,VX_SETCACHE,VX_DIRECT); ioctl(fd,VX_GETCACHE,&test_foo); if(test_foo == 0) { if(!client_iozone) printf("\nVxFS advanced setcache feature not available.\n"); exit(3); } } #endif #if defined(solaris) if(direct_flag) { test_foo = directio(fd, DIRECTIO_ON); if(test_foo != 0) { if(!client_iozone) printf("\ndirectio not available.\n"); exit(3); } } #endif if(mmapflag) { maddr=(char *)initfile(fd,(numrecs64*reclen),0,PROT_READ); } child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->throughput = 0; child_stat->actual = 0; if(debug1) { if(use_thread) #ifdef NO_PRINT_LLD printf("\nStarting child %ld\n",(long)xx); #else printf("\nStarting child %lld\n",(long long)xx); #endif else #ifdef NO_PRINT_LLD printf("\nStarting process %d slot %ld\n",getpid(),(long)xx); #else printf("\nStarting process %d slot %lld\n",getpid(),(long long)xx); #endif } /*****************/ /* Children only */ /*****************/ if(Q_flag) { sprintf(tmpname,"Child_%d_prol.dat",(int)xx); thread_rqfd=fopen(tmpname,"a"); if(thread_rqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } fprintf(thread_rqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); } if(L_flag) { sprintf(tmpname,"Child_%d.log",(int)xx); thread_Lwqfd=fopen(tmpname,"a"); if(thread_Lwqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Pread test start: ",now_string); } if(r_traj_flag) r_traj_fd=open_r_traj(); if(fetchon) fetchit(nbuff,reclen); child_stat=(struct child_stats *)&shmaddr[xx]; child_stat->flag = CHILD_STATE_READY; if(distributed && client_iozone) { tell_master_ready(chid); wait_for_master_go(chid); } else { /* Wait for signal from parent */ while(child_stat->flag!=CHILD_STATE_BEGIN) Poll((long long)1); } if(file_lock) if(mylockf((int) fd, (int) 1, (int)1) != 0) printf("File lock for read failed. %d\n",errno); starttime1 = time_so_far(); if(cpuutilflag) { walltime = starttime1; cputime = cputime_so_far(); } if(r_traj_flag) rewind(r_traj_fd); for(i=0; iflag = CHILD_STATE_HOLD; exit(132); } } } if(verify){ if(async_flag && no_copy_flag) { if(verify_buffer(buffer1,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(133); } } else { if(verify_buffer(nbuff,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(134); } } } if(async_flag) { if(no_copy_flag) async_release(gc); end_async(gc); gc=0; } read_so_far+=reclen/1024; r_traj_bytes_completed+=reclen; r_traj_ops_completed++; if(*stop_flag) { read_so_far-=reclen/1024; r_traj_bytes_completed-=reclen; } if(hist_summary) { thread_qtime_stop=time_so_far(); hist_time =(thread_qtime_stop-thread_qtime_start-time_res); hist_insert(hist_time); } if(op_rate_flag) { thread_qtime_stop=time_so_far(); desired_op_rate_time = ((double)1.0/(double)op_rate); actual_rate = (double)(thread_qtime_stop-thread_qtime_start); /* printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, actual_rate, (desired_op_rate_time-actual_rate)); */ if( actual_rate < desired_op_rate_time) my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); } if(Q_flag) { thread_qtime_stop=time_so_far(); #ifdef NO_PRINT_LLD fprintf(thread_rqfd,"%10.1ld %10.0f %10.1ld\n",(long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long)reclen); #else fprintf(thread_rqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long long)reclen); #endif } if(rlocking) { mylockr((int) fd, (int) 0, (int)1, lock_offset, reclen); } } if(file_lock) if(mylockf((int) fd, (int) 0, (int)1)) printf("Read unlock failed. %d\n",errno); /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(include_flush) { if(mmapflag) { msync(maddr,(size_t)(filebytes64),MS_SYNC); }else fsync(fd); } if(include_close) { if(mmapflag) { mmap_end(maddr,(unsigned long long)filebytes64); } close(fd); } temp_time = time_so_far(); child_stat=(struct child_stats *)&shmaddr[xx]; if(inc_think) child_stat->throughput = ((temp_time - starttime1)-time_res); else child_stat->throughput = ((temp_time - starttime1)-time_res) -compute_val; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*read_so_far=(read_so_far*1024)/reclen;*/ read_so_far=r_traj_ops_completed; } child_stat->throughput = read_so_far/child_stat->throughput; child_stat->actual = read_so_far; if(!xflag) { *stop_flag=1; if(distributed && client_iozone) send_stop(); } if(cdebug) { fprintf(newstdout,"Child %d: throughput %f actual %f \n",(int)chid,child_stat->throughput, child_stat->actual); fflush(newstdout); } if(cpuutilflag) { cputime = cputime_so_far() - cputime; if (cputime < cputime_res) cputime = 0.0; child_stat->cputime = cputime; walltime = time_so_far() - walltime; child_stat->walltime = walltime; } if(distributed && client_iozone) tell_master_stats(THREAD_READ_TEST, chid, child_stat->throughput, child_stat->actual, child_stat->cputime, child_stat->walltime, (char)*stop_flag, (long long)CHILD_STATE_HOLD); child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ /*fsync(fd);*/ if(!include_close) { if(mmapflag) { msync(maddr,(size_t)(filebytes64),MS_SYNC); mmap_end(maddr,(unsigned long long)filebytes64); }else fsync(fd); close(fd); } if(Q_flag && (thread_rqfd !=0) ) fclose(thread_rqfd); free(dummyfile[xx]); if(r_traj_flag) fclose(r_traj_fd); if(debug1) #ifdef NO_PRINT_LLD printf("\nChild finished %ld\n",(long)xx); #else printf("\nChild finished %lld\n",(long long)xx); #endif if(L_flag) { get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Pread test finished: ", now_string); fclose(thread_Lwqfd); } if(hist_summary) dump_hist("Pread",(int)xx); if(distributed && client_iozone) return(0); #ifdef NO_THREADS exit(0); #else if(use_thread) thread_exit(); else exit(0); #endif return(0); } #endif /************************************************************************/ /* Thread re-read test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void * thread_rread_test(int x) #else void * thread_rread_test(x) #endif { long long xx,xx2; char *nbuff; struct child_stats *child_stat; int fd; FILE *r_traj_fd,*thread_rrqfd; FILE *thread_Lwqfd; long long r_traj_bytes_completed; double walltime, cputime; long long r_traj_ops_completed; off64_t traj_offset; off64_t lock_offset=0; long long flags = 0; double starttime1 = 0; float delay = 0; double temp_time; double thread_qtime_start,thread_qtime_stop; double hist_time; double desired_op_rate_time; double actual_rate; double compute_val = (double)0; long long recs_per_buffer,traj_size; off64_t i; off64_t written_so_far, read_so_far, re_written_so_far, re_read_so_far; char *dummyfile[MAXSTREAMS]; /* name of dummy file */ char *maddr=0; char *wmaddr=0; char now_string[30]; volatile char *buffer1; int anwser,bind_cpu; long wval; char tmpname[256]; #if defined(VXFS) || defined(solaris) int test_foo = 0; #endif #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif /*****************/ /* Children only */ /*****************/ if(compute_flag) delay=compute_time; hist_time=thread_qtime_stop=thread_qtime_start=0; thread_rrqfd=r_traj_fd=thread_Lwqfd=(FILE *)0; traj_offset=walltime=cputime=0; anwser=bind_cpu=0; r_traj_bytes_completed=r_traj_ops_completed=0; written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; recs_per_buffer = cache_size/reclen ; #ifdef NO_THREADS xx=chid; #else if(r_traj_flag) { filebytes64 = r_traj_fsize; numrecs64=r_traj_ops; } else { filebytes64 = numrecs64*reclen; } if(use_thread) xx = (long long)((long)x); else { xx=chid; } #endif #ifndef NO_THREADS #if defined( _HPUX_SOURCE ) || defined ( linux ) if(ioz_processor_bind) { bind_cpu=(begin_proc+(int)xx)%num_processors; #if defined(_HPUX_SOURCE) pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); #else cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(bind_cpu, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); #endif my_nap(40); /* Switch to new cpu */ } #endif #endif if(use_thread) nbuff=barray[xx]; else nbuff=buffer; if(debug1) { if(use_thread) #ifdef NO_PRINT_LLD printf("\nStarting child %ld\n",(long)xx); #else printf("\nStarting child %lld\n",(long long)xx); #endif else #ifdef NO_PRINT_LLD printf("\nStarting process %d slot %ld\n",getpid(),(long)xx); #else printf("\nStarting process %d slot %lld\n",getpid(),(long long)xx); #endif } dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); xx2=xx; if(share_file) xx2=(long long)0; if(mfflag) { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s",filearray[xx2]); #else sprintf(dummyfile[xx],"%s",filearray[xx2]); #endif } else { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],(long)xx2); #else sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],(long long)xx2); #endif } if(oflag) flags=O_RDONLY|O_SYNC; else flags=O_RDONLY; #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) flags |=O_RSYNC|O_SYNC; #endif #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) flags |=O_DIRECTIO; #endif #endif #if defined(Windows) if(unbuffered) { hand=CreateFile(dummyfile[xx], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING| FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, NULL); SetFilePointer(hand,(LONG)0,0,FILE_BEGIN); } else { #endif if((fd = I_OPEN(dummyfile[xx], ((int)flags),0))<0) { client_error=errno; if(distributed && client_iozone) send_stop(); perror(dummyfile[xx]); exit(135); } #if defined(Windows) } #endif /* #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif */ #ifdef VXFS if(direct_flag) { ioctl(fd,VX_SETCACHE,VX_DIRECT); ioctl(fd,VX_GETCACHE,&test_foo); if(test_foo == 0) { if(!client_iozone) printf("\nVxFS advanced setcache feature not available.\n"); exit(3); } } #endif #if defined(solaris) if(direct_flag) { test_foo = directio(fd, DIRECTIO_ON); if(test_foo != 0) { if(!client_iozone) printf("\ndirectio not available.\n"); exit(3); } } #endif if(mmapflag) { maddr=(char *)initfile(fd,(filebytes64),0,PROT_READ); } if(r_traj_flag) r_traj_fd=open_r_traj(); if(fetchon) fetchit(nbuff,reclen); if(Q_flag) { sprintf(tmpname,"Child_%d_rrol.dat",(int)xx); thread_rrqfd=fopen(tmpname,"a"); if(thread_rrqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } fprintf(thread_rrqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); } if(L_flag) { sprintf(tmpname,"Child_%d.log",(int)xx); thread_Lwqfd=fopen(tmpname,"a"); if(thread_Lwqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Reread test start: ",now_string); } child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->throughput = 0; child_stat->actual = 0; child_stat->flag = CHILD_STATE_READY; if(distributed && client_iozone) { tell_master_ready(chid); wait_for_master_go(chid); } else /* Wait for signal from parent */ while(child_stat->flag!=CHILD_STATE_BEGIN) Poll((long long)1); if(file_lock) if(mylockf((int) fd, (int) 1, (int)1) != 0) printf("File lock for read failed. %d\n",errno); starttime1 = time_so_far(); if(cpuutilflag) { walltime = starttime1; cputime = cputime_so_far(); } if(r_traj_flag) rewind(r_traj_fd); for(i=0; iflag = CHILD_STATE_HOLD; exit(137); } } } if(verify){ if(async_flag && no_copy_flag) { if(verify_buffer(buffer1,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(138); } } else { if(verify_buffer(nbuff,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(139); } } } if(async_flag) { if(no_copy_flag) async_release(gc); end_async(gc); gc=0; } re_read_so_far+=reclen/1024; r_traj_bytes_completed+=reclen; r_traj_ops_completed++; if(*stop_flag) { re_read_so_far-=reclen/1024; r_traj_bytes_completed-=reclen; } if(hist_summary) { thread_qtime_stop=time_so_far(); hist_time =(thread_qtime_stop-thread_qtime_start-time_res); hist_insert(hist_time); } if(op_rate_flag) { thread_qtime_stop=time_so_far(); desired_op_rate_time = ((double)1.0/(double)op_rate); actual_rate = (double)(thread_qtime_stop-thread_qtime_start); /* printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, actual_rate, (desired_op_rate_time-actual_rate)); */ if( actual_rate < desired_op_rate_time) my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); } if(Q_flag) { thread_qtime_stop=time_so_far(); #ifdef NO_PRINT_LLD fprintf(thread_rrqfd,"%10.1ld %10.0f %10.1ld\n",(long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long)reclen); #else fprintf(thread_rrqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long long)reclen); #endif } if(rlocking) { mylockr((int) fd, (int) 0, (int)1, lock_offset, reclen); } } if(file_lock) if(mylockf((int) fd, (int) 0, (int)1)) printf("Read unlock failed. %d\n",errno); /*fsync(fd);*/ /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(include_flush) { if(mmapflag) { msync(maddr,(size_t)(filebytes64),MS_SYNC); }else fsync(fd); } if(include_close) { if(mmapflag) { mmap_end(maddr,(unsigned long long)filebytes64); } #if defined(Windows) if(unbuffered) CloseHandle(hand); else #endif close(fd); } temp_time = time_so_far(); if(inc_think) child_stat->throughput = ((temp_time - starttime1)-time_res); else child_stat->throughput = ((temp_time - starttime1)-time_res) -compute_val; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*re_read_so_far=(re_read_so_far*1024)/reclen;*/ re_read_so_far=r_traj_ops_completed; } child_stat->throughput = re_read_so_far/child_stat->throughput; child_stat->actual = re_read_so_far; if(!xflag) { *stop_flag=1; if(distributed && client_iozone) send_stop(); } if(cpuutilflag) { cputime = cputime_so_far() - cputime; if (cputime < cputime_res) cputime = 0.0; child_stat->cputime = cputime; walltime = time_so_far() - walltime; child_stat->walltime = walltime; } if(distributed && client_iozone) { tell_master_stats(THREAD_REREAD_TEST,chid, child_stat->throughput, child_stat->actual, child_stat->cputime, child_stat->walltime, (char)*stop_flag, (long long)CHILD_STATE_HOLD); } child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ if(!include_close) { if(mmapflag) { msync(maddr,(size_t)(filebytes64),MS_SYNC); mmap_end(maddr,(unsigned long long)filebytes64); }else fsync(fd); #if defined(Windows) if(unbuffered) CloseHandle(hand); else #endif close(fd); } if(Q_flag && (thread_rrqfd !=0) ) fclose(thread_rrqfd); free(dummyfile[xx]); if(r_traj_flag) fclose(r_traj_fd); if(debug1) #ifdef NO_PRINT_LLD printf("\nChild finished %ld\n",xx); #else printf("\nChild finished %lld\n",xx); #endif if(L_flag) { get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Reread test finished: ",now_string); fclose(thread_Lwqfd); } if(hist_summary) dump_hist("Reread",(int)xx); if(distributed && client_iozone) return(0); #ifdef NO_THREADS exit(0); #else if(use_thread) thread_exit(); else exit(0); #endif return(0); } /************************************************************************/ /* Thread_reverse_perf_test */ /* Reverse read test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void * thread_reverse_read_test(int x) #else void * thread_reverse_read_test(x) #endif { long long xx,xx2; char *nbuff; struct child_stats *child_stat; int fd,wval; long long flags = 0; double walltime, cputime; double thread_qtime_stop,thread_qtime_start; double hist_time; double desired_op_rate_time; double actual_rate; double starttime2 = 0; float delay = 0; double temp_time; double compute_val = (double)0; long long recs_per_buffer; off64_t i,t_offset; off64_t lock_offset=0; off64_t current_position=0; off64_t written_so_far, reverse_read, re_read_so_far,read_so_far; char *dummyfile[MAXSTREAMS]; /* name of dummy file */ char *maddr=0; char *wmaddr=0; char now_string[30]; volatile char *buffer1; int anwser,bind_cpu; off64_t traj_offset; char tmpname[256]; FILE *thread_revqfd=0; FILE *thread_Lwqfd=0; #if defined(VXFS) || defined(solaris) int test_foo = 0; #endif #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif /*****************/ /* Children only */ /*****************/ if(compute_flag) delay=compute_time; hist_time=thread_qtime_stop=thread_qtime_start=0; traj_offset=walltime=cputime=0; anwser=bind_cpu=0; written_so_far=read_so_far=reverse_read=re_read_so_far=0; recs_per_buffer = cache_size/reclen ; #ifdef NO_THREADS xx=chid; #else if(use_thread) xx = (long long)((long)x); else { xx=chid; } #endif #ifndef NO_THREADS #if defined( _HPUX_SOURCE ) || defined ( linux ) if(ioz_processor_bind) { bind_cpu=(begin_proc+(int)xx)%num_processors; #if defined(_HPUX_SOURCE) pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); #else cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(bind_cpu, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); #endif my_nap(40); /* Switch to new cpu */ } #endif #endif if(use_thread) nbuff=barray[xx]; else nbuff=buffer; if(debug1) { if(use_thread) #ifdef NO_PRINT_LLD printf("\nStarting child %ld\n",xx); #else printf("\nStarting child %lld\n",xx); #endif else #ifdef NO_PRINT_LLD printf("\nStarting process %d slot %ld\n",getpid(),xx); #else printf("\nStarting process %d slot %lld\n",getpid(),xx); #endif } dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); xx2=xx; if(share_file) xx2=(long long)0; if(mfflag) { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s",filearray[xx2]); #else sprintf(dummyfile[xx],"%s",filearray[xx2]); #endif } else { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],xx2); #else sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],xx2); #endif } if(oflag) flags=O_RDONLY|O_SYNC; else flags=O_RDONLY; #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) flags |=O_RSYNC|O_SYNC; #endif #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) flags |=O_DIRECTIO; #endif #endif #if defined(Windows) if(unbuffered) { hand=CreateFile(dummyfile[xx], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING| FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, NULL); } #endif if((fd = I_OPEN(dummyfile[xx], ((int)flags),0))<0) { client_error=errno; if(distributed && client_iozone) send_stop(); perror(dummyfile[xx]); exit(140); } /* #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif */ #ifdef VXFS if(direct_flag) { ioctl(fd,VX_SETCACHE,VX_DIRECT); ioctl(fd,VX_GETCACHE,&test_foo); if(test_foo == 0) { if(!client_iozone) printf("\nVxFS advanced setcache feature not available.\n"); exit(3); } } #endif #if defined(solaris) if(direct_flag) { test_foo = directio(fd, DIRECTIO_ON); if(test_foo != 0) { if(!client_iozone) printf("\ndirectio not available.\n"); exit(3); } } #endif if(mmapflag) { maddr=(char *)initfile(fd,(numrecs64*reclen),0,PROT_READ); } if(fetchon) fetchit(nbuff,reclen); if(Q_flag) { sprintf(tmpname,"Child_%d_revol.dat",(int)xx); thread_revqfd=fopen(tmpname,"a"); if(thread_revqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } fprintf(thread_revqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); } if(L_flag) { sprintf(tmpname,"Child_%d.log",(int)xx); thread_Lwqfd=fopen(tmpname,"a"); if(thread_Lwqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Reverse read start: ",now_string); } child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->throughput = 0; child_stat->actual = 0; child_stat->flag = CHILD_STATE_READY; if(distributed && client_iozone) { tell_master_ready(chid); wait_for_master_go(chid); } else { while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ Poll((long long)1); } starttime2 = time_so_far(); if(cpuutilflag) { walltime = starttime2; cputime = cputime_so_far(); } t_offset = (off64_t)reclen; if (!(h_flag || k_flag || mmapflag)) { if(check_filename(dummyfile[xx])) { if((I_LSEEK( fd, -t_offset, SEEK_END ))<0) { client_error=errno; if(distributed && client_iozone) send_stop(); perror("lseek"); exit(142); } } else { if(I_LSEEK( fd, (numrecs64*reclen)-t_offset, SEEK_SET )<0) { client_error=errno; if(distributed && client_iozone) send_stop(); perror("lseek"); exit(77); } } } current_position=(reclen*numrecs64)-reclen; if(file_lock) if(mylockf((int) fd, (int) 1, (int)1)!=0) printf("File lock for read failed. %d\n",errno); for(i=0; iflag = CHILD_STATE_HOLD; exit(144); } } } if(verify){ if(async_flag && no_copy_flag) { if(verify_buffer(buffer1,reclen,(off64_t)(current_position/reclen),reclen,(long long)pattern,sverify)){ if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(145); } } else { if(verify_buffer(nbuff,reclen,(off64_t)(current_position/reclen),reclen,(long long)pattern,sverify)){ if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(146); } } } if(rlocking) { mylockr((int) fd, (int) 0, (int)1, lock_offset, reclen); } current_position+=reclen; if(async_flag) { if(no_copy_flag) async_release(gc); end_async(gc); gc=0; } t_offset = (off64_t)reclen*2; if (!(h_flag || k_flag || mmapflag)) { I_LSEEK( fd, -t_offset, SEEK_CUR ); } current_position-=(2 *reclen); reverse_read +=reclen/1024; if(*stop_flag) { reverse_read -=reclen/1024; } if(hist_summary) { thread_qtime_stop=time_so_far(); hist_time =(thread_qtime_stop-thread_qtime_start-time_res); hist_insert(hist_time); } if(op_rate_flag) { thread_qtime_stop=time_so_far(); desired_op_rate_time = ((double)1.0/(double)op_rate); actual_rate = (double)(thread_qtime_stop-thread_qtime_start); /* printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, actual_rate, (desired_op_rate_time-actual_rate)); */ if( actual_rate < desired_op_rate_time) my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); } if(Q_flag) { thread_qtime_stop=time_so_far(); #ifdef NO_PRINT_LLD fprintf(thread_revqfd,"%10.1ld %10.0f %10.1ld\n",(long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long)reclen); #else fprintf(thread_revqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long long)reclen); #endif } } if(file_lock) if(mylockf((int) fd,(int)0, (int)1)) printf("Read unlock failed %d\n",errno); /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(include_flush) { if(mmapflag) { msync(maddr,(size_t)(numrecs64*reclen),MS_SYNC); }else fsync(fd); } if(include_close) { if(mmapflag) { mmap_end(maddr,(unsigned long long)numrecs64*reclen); } close(fd); } temp_time = time_so_far(); if(inc_think) child_stat->throughput = ((temp_time - starttime2)-time_res); else child_stat->throughput = ((temp_time - starttime2)-time_res) -compute_val; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ reverse_read=(reverse_read*1024)/reclen; } child_stat->throughput = reverse_read/child_stat->throughput; child_stat->actual = reverse_read; if(!xflag) { *stop_flag=1; if(distributed && client_iozone) send_stop(); } if(cpuutilflag) { cputime = cputime_so_far() - cputime; if (cputime < cputime_res) cputime = 0.0; child_stat->cputime = cputime; walltime = time_so_far() - walltime; child_stat->walltime = walltime; } if(distributed && client_iozone) tell_master_stats(THREAD_REVERSE_READ_TEST, chid, child_stat->throughput, child_stat->actual, child_stat->cputime, child_stat->walltime, (char)*stop_flag, (long long)CHILD_STATE_HOLD); child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ if(!include_close) { if(mmapflag) { msync(maddr,(size_t)(numrecs64*reclen),MS_SYNC); mmap_end(maddr,(unsigned long long)numrecs64*reclen); }else fsync(fd); close(fd); } free(dummyfile[xx]); if(Q_flag && (thread_revqfd !=0) ) fclose(thread_revqfd); if(debug1) #ifdef NO_PRINT_LLD printf("\nChild finished %ld\n",(long)xx); #else printf("\nChild finished %lld\n",(long long)xx); #endif if(L_flag) { get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Reverse read finished: ", now_string); fclose(thread_Lwqfd); } if(hist_summary) dump_hist("Read Backwards",(int)xx); if(distributed && client_iozone) return(0); #ifdef NO_THREADS exit(0); #else if(use_thread) thread_exit(); else exit(0); #endif return(0); } /************************************************************************/ /* Thread_stride_read_test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void * thread_stride_read_test(int x) #else void * thread_stride_read_test(x) #endif { long long xx,xx2; char *nbuff=0; struct child_stats *child_stat; double walltime, cputime; int fd,wval; long long flags = 0; double thread_qtime_stop,thread_qtime_start; double hist_time; double desired_op_rate_time; double actual_rate; double starttime2 = 0; float delay = 0; double compute_val = (double)0; double temp_time; long long recs_per_buffer; off64_t i; off64_t lock_offset=0; off64_t savepos64=0; off64_t written_so_far, stride_read,re_read_so_far,read_so_far; off64_t stripewrap = 0; off64_t current_position = 0; char *dummyfile[MAXSTREAMS]; /* name of dummy file */ char *maddr=0; char *wmaddr=0; volatile char *buffer1; int anwser,bind_cpu; off64_t traj_offset; char tmpname[256]; char now_string[30]; FILE *thread_strqfd=0; FILE *thread_Lwqfd=0; #if defined(VXFS) || defined(solaris) int test_foo = 0; #endif #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif /*****************/ /* Children only */ /*****************/ if(compute_flag) delay=compute_time; hist_time=thread_qtime_stop=thread_qtime_start=0; traj_offset=walltime=cputime=0; anwser=bind_cpu=0; written_so_far=read_so_far=stride_read=re_read_so_far=0; recs_per_buffer = cache_size/reclen ; #ifdef NO_THREADS xx=chid; #else if(use_thread) xx = (long long)((long)x); else { xx=chid; } #endif #ifndef NO_THREADS #if defined( _HPUX_SOURCE ) || defined ( linux ) if(ioz_processor_bind) { bind_cpu=(begin_proc+(int)xx)%num_processors; #if defined(_HPUX_SOURCE) pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); #else cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(bind_cpu, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); #endif my_nap(40); /* Switch to new cpu */ } #endif #endif if(use_thread) nbuff=barray[xx]; else nbuff=buffer; if(debug1) { if(use_thread) #ifdef NO_PRINT_LLD printf("\nStarting child %ld\n",(long)xx); #else printf("\nStarting child %lld\n",(long long)xx); #endif else #ifdef NO_PRINT_LLD printf("\nStarting process %d slot %ld\n",getpid(),(long)xx); #else printf("\nStarting process %d slot %lld\n",getpid(),(long long)xx); #endif } dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); xx2=xx; if(share_file) xx2=(long long)0; if(mfflag) { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s",filearray[xx2]); #else sprintf(dummyfile[xx],"%s",filearray[xx2]); #endif } else { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],(long)xx2); #else sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],(long long)xx2); #endif } if(oflag) flags=O_RDONLY|O_SYNC; else flags=O_RDONLY; #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) flags |=O_RSYNC|O_SYNC; #endif #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) flags |=O_DIRECTIO; #endif #endif #if defined(Windows) if(unbuffered) { hand=CreateFile(dummyfile[xx], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING| FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, NULL); } #endif if((fd = I_OPEN(dummyfile[xx], ((int)flags),0))<0) { client_error=errno; if(distributed && client_iozone) send_stop(); perror(dummyfile[xx]); exit(147); } /* #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif */ #ifdef VXFS if(direct_flag) { ioctl(fd,VX_SETCACHE,VX_DIRECT); ioctl(fd,VX_GETCACHE,&test_foo); if(test_foo == 0) { if(!client_iozone) printf("\nVxFS advanced setcache feature not available.\n"); exit(3); } } #endif #if defined(solaris) if(direct_flag) { test_foo = directio(fd, DIRECTIO_ON); if(test_foo != 0) { if(!client_iozone) printf("\ndirectio not available.\n"); exit(3); } } #endif if(mmapflag) { maddr=(char *)initfile(fd,(numrecs64*reclen),0,PROT_READ); } if(fetchon) fetchit(nbuff,reclen); if(Q_flag) { sprintf(tmpname,"Child_%d_strol.dat",(int)xx); thread_strqfd=fopen(tmpname,"a"); if(thread_strqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } fprintf(thread_strqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); } if(L_flag) { sprintf(tmpname,"Child_%d.log",(int)xx); thread_Lwqfd=fopen(tmpname,"a"); if(thread_Lwqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Stride test start: ", now_string); } child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->throughput = 0; child_stat->actual = 0; child_stat->flag = CHILD_STATE_READY; if(distributed && client_iozone) { tell_master_ready(chid); wait_for_master_go(chid); } else /* wait for parent to say go */ while(child_stat->flag!=CHILD_STATE_BEGIN) Poll((long long)1); if(file_lock) if(mylockf((int) fd, (int) 1, (int)1)!=0) printf("File lock for write failed. %d\n",errno); starttime2 = time_so_far(); if(cpuutilflag) { walltime = starttime2; cputime = cputime_so_far(); } for(i=0; iflag = CHILD_STATE_HOLD; exit(149); } } } if(rlocking) { mylockr((int) fd, (int) 0, (int)1, lock_offset, reclen); } current_position+=reclen; if(verify){ if(async_flag && no_copy_flag) { if(verify_buffer(buffer1,reclen,(off64_t)savepos64,reclen,(long long)pattern,sverify)){ if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(150); } } else { if(verify_buffer(nbuff,reclen,(off64_t)savepos64,reclen,(long long)pattern,sverify)){ if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(151); } } } if(async_flag) { if(no_copy_flag) async_release(gc); end_async(gc); gc=0; } if(current_position + (stride * reclen) >= (numrecs64 * reclen)-reclen) { current_position=0; stripewrap++; if(numrecs64 <= stride) { current_position=0; } else { current_position = (off64_t)((stripewrap)%numrecs64)*reclen; } if (!(h_flag || k_flag || mmapflag)) { if(I_LSEEK(fd,current_position,SEEK_SET)<0) { client_error=errno; if(distributed && client_iozone) send_stop(); perror("lseek"); exit(152); } } } else { current_position+=(stride*reclen)-reclen; if (!(h_flag || k_flag || mmapflag)) { if(I_LSEEK(fd,current_position,SEEK_SET)<0) { client_error=errno; if(distributed && client_iozone) send_stop(); perror("lseek"); exit(154); }; } } stride_read +=reclen/1024; if(*stop_flag) { stride_read -=reclen/1024; } if(hist_summary) { thread_qtime_stop=time_so_far(); hist_time =(thread_qtime_stop-thread_qtime_start-time_res); hist_insert(hist_time); } if(op_rate_flag) { thread_qtime_stop=time_so_far(); desired_op_rate_time = ((double)1.0/(double)op_rate); actual_rate = (double)(thread_qtime_stop-thread_qtime_start); /* printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, actual_rate, (desired_op_rate_time-actual_rate)); */ if( actual_rate < desired_op_rate_time) my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); } if(Q_flag) { thread_qtime_stop=time_so_far(); #ifdef NO_PRINT_LLD fprintf(thread_strqfd,"%10.1ld %10.0f %10.1ld\n",(long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long)reclen); #else fprintf(thread_strqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long long)reclen); #endif } } if(file_lock) if(mylockf((int) fd,(int)0,(int)1)) printf("Read unlock failed %d\n",errno); /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(include_flush) { if(mmapflag) { msync(maddr,(size_t)(numrecs64*reclen),MS_SYNC); }else fsync(fd); } if(include_close) { if(mmapflag) { mmap_end(maddr,(unsigned long long)numrecs64*reclen); } close(fd); } temp_time = time_so_far(); if(inc_think) child_stat->throughput = ((temp_time - starttime2)-time_res); else child_stat->throughput = ((temp_time - starttime2)-time_res) -compute_val; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ stride_read=(stride_read*1024)/reclen; } child_stat->throughput = stride_read/child_stat->throughput; child_stat->actual = stride_read; if(!xflag) { *stop_flag=1; if(distributed && client_iozone) send_stop(); } if(cpuutilflag) { cputime = cputime_so_far() - cputime; if (cputime < cputime_res) cputime = 0.0; child_stat->cputime = cputime; walltime = time_so_far() - walltime; child_stat->walltime = walltime; } if(distributed && client_iozone) { tell_master_stats(THREAD_STRIDE_TEST,chid, child_stat->throughput, child_stat->actual, child_stat->cputime, child_stat->walltime, (char)*stop_flag, (long long)CHILD_STATE_HOLD); } child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ if(!include_close) { if(mmapflag) { msync(maddr,(size_t)(numrecs64*reclen),MS_SYNC); mmap_end(maddr,(unsigned long long)numrecs64*reclen); }else fsync(fd); close(fd); } if(Q_flag && (thread_strqfd !=0) ) fclose(thread_strqfd); free(dummyfile[xx]); if(debug1) #ifdef NO_PRINT_LLD printf("\nChild finished %ld\n",(long)xx); #else printf("\nChild finished %lld\n",(long long)xx); #endif if(L_flag) { get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Stride test finished: ", now_string); fclose(thread_Lwqfd); } if(hist_summary) dump_hist("Stride Read",(int)xx); if(distributed && client_iozone) return(0); #ifdef NO_THREADS exit(0); #else if(use_thread) thread_exit(); else exit(0); #endif return(0); } /************************************************************************/ /* Thread random test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void * thread_mix_test(int x) #else void * thread_mix_test(x) #endif { int selector; int num_readers; long xx; mix_test = 1; #ifdef NO_THREADS xx=chid; #else if(use_thread) { xx = (long)x; } else { xx=(long)chid; } #endif if(pct_read!=0) { num_readers = (pct_read * num_child)/100; if(xx < num_readers) selector=0; else selector=1; } else { if(Kplus_flag) { if(xx+1 <= Kplus_readers) selector=0; else selector=1; } else { /* Simple round robin */ selector= ((int)xx) % 2; } } if(selector==0) { if(seq_mix) thread_read_test((int)x); else thread_ranread_test((int)x); } else { if(seq_mix) thread_write_test((int)x); else thread_ranwrite_test((int)x); } return(0); } /************************************************************************/ /* Thread random read test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void * thread_ranread_test(int x) #else void * thread_ranread_test(x) void *x; #endif { long long xx,xx2; struct child_stats *child_stat; double walltime, cputime; int fd,wval; long long flags = 0; double thread_qtime_stop,thread_qtime_start; double hist_time; double desired_op_rate_time; double actual_rate; double starttime1 = 0; float delay = 0; double temp_time; double compute_val = (double)0; off64_t written_so_far, ranread_so_far, re_written_so_far,re_read_so_far; long long recs_per_buffer; off64_t current_offset=0; off64_t i; char *dummyfile[MAXSTREAMS]; /* name of dummy file */ char *nbuff=0; char *maddr=0; char *wmaddr=0; volatile char *buffer1; int anwser,bind_cpu; off64_t traj_offset; off64_t lock_offset=0; char tmpname[256]; char now_string[30]; FILE *thread_randrfd=0; FILE *thread_Lwqfd=0; long long *recnum=0; #if defined(VXFS) || defined(solaris) int test_foo = 0; #endif long long save_pos; #if defined (bsd4_2) || defined(Windows) long long rand1,rand2,rand3; #endif unsigned long long big_rand; #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif #ifdef MERSENNE unsigned long long init[4]={0x12345ULL, 0x23456ULL, 0x34567ULL, 0x45678ULL}, length=4; #endif #ifdef MERSENNE init_by_array64(init, length); #else #ifdef bsd4_2 srand(0); #else #ifdef Windows srand(0); #else srand48(0); #endif #endif #endif recnum = (long long *)malloc(sizeof(*recnum)*numrecs64); if (recnum){ /* pre-compute random sequence based on Fischer-Yates (Knuth) card shuffle */ for(i = 0; i < numrecs64; i++){ recnum[i] = i; } for(i = numrecs64-1; i >= 0; i--) { long long tmp = recnum[i]; #ifdef MERSENNE big_rand = genrand64_int64(); #else #ifdef bsd4_2 rand1=(long long)rand(); rand2=(long long)rand(); rand3=(long long)rand(); big_rand=(rand1<<32)|(rand2<<16)|(rand3); #else #ifdef Windows rand1=(long long)rand(); rand2=(long long)rand(); rand3=(long long)rand(); big_rand=(rand1<<32)|(rand2<<16)|(rand3); #else big_rand = lrand48(); #endif #endif #endif big_rand = big_rand % (i+1); tmp = recnum[i]; recnum[i] = recnum[big_rand]; recnum[big_rand] = tmp; } } else { fprintf(stderr,"Random uniqueness fallback.\n"); } if(compute_flag) delay=compute_time; hist_time=thread_qtime_stop=thread_qtime_start=0; traj_offset=walltime=cputime=0; anwser=bind_cpu=0; written_so_far=ranread_so_far=re_written_so_far=re_read_so_far=0; recs_per_buffer = cache_size/reclen ; #ifdef NO_THREADS xx=chid; #else if(use_thread) xx = (long long)((long)x); else { xx=chid; } #endif #ifndef NO_THREADS #if defined( _HPUX_SOURCE ) || defined ( linux ) if(ioz_processor_bind) { bind_cpu=(begin_proc+(int)xx)%num_processors; #if defined(_HPUX_SOURCE) pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); #else cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(bind_cpu, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); #endif my_nap(40); /* Switch to new cpu */ } #endif #endif if(use_thread) nbuff=barray[xx]; else nbuff=buffer; dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); xx2=xx; if(share_file) xx2=(long long)0; if(mfflag) { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s",filearray[xx2]); #else sprintf(dummyfile[xx],"%s",filearray[xx2]); #endif } else { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],(long)xx2); #else sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],(long long)xx2); #endif } if(oflag) { flags=O_RDONLY|O_SYNC; } else flags=O_RDONLY; #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) flags |=O_RSYNC|O_SYNC; #endif #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) flags |=O_DIRECTIO; #endif #endif #if defined(Windows) if(unbuffered) { hand=CreateFile(dummyfile[xx], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING| FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, NULL); } #endif if((fd = I_OPEN(dummyfile[xx], ((int)flags),0))<0) { client_error=errno; if(distributed && client_iozone) send_stop(); perror(dummyfile[xx]); exit(156); } /* #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif */ #ifdef VXFS if(direct_flag) { ioctl(fd,VX_SETCACHE,VX_DIRECT); ioctl(fd,VX_GETCACHE,&test_foo); if(test_foo == 0) { if(!client_iozone) printf("\nVxFS advanced setcache feature not available.\n"); exit(3); } } #endif #if defined(solaris) if(direct_flag) { test_foo = directio(fd, DIRECTIO_ON); if(test_foo != 0) { if(!client_iozone) printf("\ndirectio not available.\n"); exit(3); } } #endif if(mmapflag) { maddr=(char *)initfile(fd,(numrecs64*reclen),0,PROT_READ); } child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->throughput = 0; child_stat->actual = 0; if(debug1) { if(use_thread) #ifdef NO_PRINT_LLD printf("\nStarting child %ld\n",(long)xx); #else printf("\nStarting child %lld\n",(long long)xx); #endif else #ifdef NO_PRINT_LLD printf("\nStarting process %d slot %ld\n",getpid(),(long)xx); #else printf("\nStarting process %d slot %lld\n",getpid(),(long long)xx); #endif } /*****************/ /* Children only */ /*****************/ if(fetchon) fetchit(nbuff,reclen); if(Q_flag) { sprintf(tmpname,"Child_%d_randrol.dat",(int)xx); thread_randrfd=fopen(tmpname,"a"); if(thread_randrfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } fprintf(thread_randrfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); } if(L_flag) { sprintf(tmpname,"Child_%d.log",(int)xx); thread_Lwqfd=fopen(tmpname,"a"); if(thread_Lwqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Random read start: ", now_string); } child_stat=(struct child_stats *)&shmaddr[xx]; child_stat->flag = CHILD_STATE_READY; if(distributed && client_iozone) { tell_master_ready(chid); wait_for_master_go(chid); } else { while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ Poll((long long)1); } starttime1 = time_so_far(); if(cpuutilflag) { walltime = starttime1; cputime = cputime_so_far(); } #ifdef MERSENNE init_by_array64(init, length); #else #ifdef bsd4_2 srand(0); #else #ifdef Windows srand(0); #else srand48(0); #endif #endif #endif if(file_lock) if(mylockf((int) fd, (int) 1, (int)1)!=0) printf("File lock for read failed. %d\n",errno); for(i=0; iflag = CHILD_STATE_HOLD; exit(160); } } } if(rlocking) { mylockr((int) fd, (int) 0, (int)1, lock_offset, reclen); } save_pos=current_offset/reclen; current_offset+=reclen; if(verify){ if(async_flag && no_copy_flag) { if(verify_buffer(buffer1,reclen,(off64_t)save_pos,reclen,(long long)pattern,sverify)){ if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(161); } } else { if(verify_buffer(nbuff,reclen,(off64_t)save_pos,reclen,(long long)pattern,sverify)){ if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(162); } } } if(async_flag) { if(no_copy_flag) async_release(gc); end_async(gc); gc=0; } ranread_so_far+=reclen/1024; if(*stop_flag) { ranread_so_far-=reclen/1024; } if(hist_summary) { thread_qtime_stop=time_so_far(); hist_time =(thread_qtime_stop-thread_qtime_start-time_res); hist_insert(hist_time); } if(op_rate_flag) { thread_qtime_stop=time_so_far(); desired_op_rate_time = ((double)1.0/(double)op_rate); actual_rate = (double)(thread_qtime_stop-thread_qtime_start); /* printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, actual_rate, (desired_op_rate_time-actual_rate)); */ if( actual_rate < desired_op_rate_time) my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); } if(Q_flag) { thread_qtime_stop=time_so_far(); #ifdef NO_PRINT_LLD fprintf(thread_randrfd,"%10.1ld %10.0f %10.1ld\n",(long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long)reclen); #else fprintf(thread_randrfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long long)reclen); #endif } } if(file_lock) if(mylockf((int) fd,(int)0,(int)1)) printf("Read unlock failed %d\n",errno); /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(include_flush) { if(mmapflag) { msync(maddr,(size_t)(numrecs64*reclen),MS_SYNC); }else fsync(fd); } if(include_close) { if(mmapflag) { mmap_end(maddr,(unsigned long long)numrecs64*reclen); } close(fd); } temp_time = time_so_far(); child_stat=(struct child_stats *)&shmaddr[xx]; if(inc_think) child_stat->throughput = ((temp_time - starttime1)-time_res); else child_stat->throughput = ((temp_time - starttime1)-time_res) -compute_val; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ ranread_so_far=(ranread_so_far*1024)/reclen; } child_stat->throughput = ranread_so_far/child_stat->throughput; child_stat->actual = ranread_so_far; if(!xflag) { *stop_flag=1; if(distributed && client_iozone) send_stop(); } if(cdebug) { fprintf(newstdout,"Child %d: throughput %f actual %f \n",(int)chid,child_stat->throughput, child_stat->actual); fflush(newstdout); } if(cpuutilflag) { cputime = cputime_so_far() - cputime; if (cputime < cputime_res) cputime = 0.0; child_stat->cputime = cputime; walltime = time_so_far() - walltime; child_stat->walltime = walltime; } if(distributed && client_iozone) tell_master_stats(THREAD_RANDOM_READ_TEST, chid, child_stat->throughput, child_stat->actual, child_stat->cputime, child_stat->walltime, (char)*stop_flag, (long long)CHILD_STATE_HOLD); child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ if(!include_close) { if(mmapflag) { msync(maddr,(size_t)(numrecs64*reclen),MS_SYNC); mmap_end(maddr,(unsigned long long)numrecs64*reclen); }else fsync(fd); close(fd); } if(Q_flag && (thread_randrfd !=0) ) fclose(thread_randrfd); free(dummyfile[xx]); if(debug1) #ifdef NO_PRINT_LLD printf("\nChild finished %ld\n",(long)xx); #else printf("\nChild finished %lld\n",(long long)xx); #endif if(L_flag) { get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Random read finished: ",now_string); fclose(thread_Lwqfd); } if(recnum) free(recnum); if(hist_summary) dump_hist("Random Read",(int)xx); if(distributed && client_iozone) return(0); #ifdef NO_THREADS exit(0); #else if(use_thread) thread_exit(); else exit(0); #endif return(0); } /************************************************************************/ /* Thread random write test */ /************************************************************************/ #ifdef HAVE_ANSIC_C void * thread_ranwrite_test(int x) #else void * thread_ranwrite_test( x) #endif { struct child_stats *child_stat; double starttime1 = 0; double temp_time; double walltime, cputime; double compute_val = (double)0; float delay = (double)0; double thread_qtime_stop,thread_qtime_start; double hist_time; double desired_op_rate_time; double actual_rate; off64_t traj_offset; off64_t current_offset=0; long long flags; long long w_traj_bytes_completed; long long w_traj_ops_completed; int fd; long long recs_per_buffer; long long stopped,i; off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; long long xx,xx2; char *dummyfile [MAXSTREAMS]; /* name of dummy file */ char *nbuff=0; char *maddr=0; char *wmaddr=0; char *free_addr=0; int anwser,bind_cpu,wval; off64_t filebytes64; off64_t lock_offset=0; char tmpname[256]; char now_string[30]; FILE *thread_randwqfd=0; FILE *thread_Lwqfd=0; long long *recnum = 0; #if defined(VXFS) || defined(solaris) int test_foo = 0; #endif #if defined (bsd4_2) || defined(Windows) long long rand1,rand2,rand3; #endif unsigned long long big_rand; #ifdef ASYNC_IO struct cache *gc=0; #else long long *gc=0; #endif #ifdef MERSENNE unsigned long long init[4]={0x12345ULL, 0x23456ULL, 0x34567ULL, 0x45678ULL}, length=4; #endif double burst_acc_time_sec = 0; if(compute_flag) delay=compute_time; hist_time=thread_qtime_stop=thread_qtime_start=0; traj_offset=walltime=cputime=0; anwser=bind_cpu=0; filebytes64 = numrecs64*reclen; written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; w_traj_bytes_completed=w_traj_ops_completed=0; recs_per_buffer = cache_size/reclen ; #ifdef MERSENNE init_by_array64(init, length); #else #ifdef bsd4_2 srand(0); #else #ifdef Windows srand(0); #else srand48(0); #endif #endif #endif recnum = (long long *) malloc(sizeof(*recnum)*numrecs64); if (recnum){ /* pre-compute random sequence based on Fischer-Yates (Knuth) card shuffle */ for(i = 0; i < numrecs64; i++){ recnum[i] = i; } for(i = numrecs64-1; i >= 0; i--) { long long tmp = recnum[i]; #ifdef MERSENNE big_rand = genrand64_int64(); #else #ifdef bsd4_2 rand1=(long long)rand(); rand2=(long long)rand(); rand3=(long long)rand(); big_rand=(rand1<<32)|(rand2<<16)|(rand3); #else #ifdef Windows rand1=(long long)rand(); rand2=(long long)rand(); rand3=(long long)rand(); big_rand=(rand1<<32)|(rand2<<16)|(rand3); #else big_rand = lrand48(); #endif #endif #endif big_rand = big_rand % (i+1); tmp = recnum[i]; recnum[i] = recnum[big_rand]; recnum[big_rand] = tmp; } } else { fprintf(stderr,"Random uniqueness fallback.\n"); } #ifdef NO_THREADS xx=chid; #else if(use_thread) { xx = (long long)((long)x); } else { xx=chid; } #endif #ifndef NO_THREADS #if defined( _HPUX_SOURCE ) || defined ( linux ) if(ioz_processor_bind) { bind_cpu=(begin_proc+(int)xx)%num_processors; #if defined(_HPUX_SOURCE) pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); #else cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(bind_cpu, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpuset),&cpuset); #endif my_nap(40); /* Switch to new cpu */ } #endif #endif if(use_thread) nbuff=barray[xx]; else nbuff=buffer; if(debug1 ) { if(use_thread) #ifdef NO_PRINT_LLD printf("\nStarting child %ld\n",(long)xx); #else printf("\nStarting child %lld\n",(long long)xx); #endif else #ifdef NO_PRINT_LLD printf("\nStarting process %d slot %ld\n",getpid(),(long)xx); #else printf("\nStarting process %d slot %lld\n",getpid(),(long long)xx); #endif } dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); xx2=xx; if(share_file) xx2=(long long)0; if(mfflag) { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s",filearray[xx2]); #else sprintf(dummyfile[xx],"%s",filearray[xx2]); #endif } else { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],(long)xx2); #else sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],(long long)xx2); #endif } /*****************/ /* Children only */ /*******************************************************************/ /* Random write throughput performance test. **********************/ /*******************************************************************/ if(oflag) flags=O_RDWR|O_SYNC|O_CREAT; else flags=O_RDWR|O_CREAT; #if defined(O_DSYNC) if(odsync) flags |= O_DSYNC; #endif #if defined(_HPUX_SOURCE) || defined(linux) if(read_sync) flags |=O_RSYNC|O_SYNC; #endif #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) if(direct_flag) flags |=O_DIRECT; #endif #if defined(TRU64) if(direct_flag) flags |=O_DIRECTIO; #endif #endif #if defined(Windows) if(unbuffered) { hand=CreateFile(dummyfile[xx], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING| FILE_FLAG_WRITE_THROUGH|FILE_FLAG_POSIX_SEMANTICS, NULL); } #endif if((fd = I_OPEN(dummyfile[xx], ((int)flags),0640))<0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("\nCan not open temp file: %s\n", dummyfile[xx]); perror("open"); exit(125); } #ifdef VXFS if(direct_flag) { ioctl(fd,VX_SETCACHE,VX_DIRECT); ioctl(fd,VX_GETCACHE,&test_foo); if(test_foo == 0) { if(!client_iozone) printf("\nVxFS advanced setcache feature not available.\n"); exit(3); } } #endif #if defined(solaris) if(direct_flag) { test_foo = directio(fd, DIRECTIO_ON); if(test_foo != 0) { if(!client_iozone) printf("\ndirectio not available.\n"); exit(3); } } #endif /* #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif */ if(mmapflag) { maddr=(char *)initfile(fd,(filebytes64),1,PROT_READ|PROT_WRITE); } if(reclen < cache_size ) { recs_per_buffer = cache_size/reclen ; nbuff=&nbuff[(xx%recs_per_buffer)*reclen]; } if(fetchon) /* Prefetch into processor cache */ fetchit(nbuff,reclen); child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->throughput = 0; child_stat->actual = 0; child_stat->flag=CHILD_STATE_READY; /* Tell parent child is ready to go */ if(distributed && client_iozone) { tell_master_ready(chid); wait_for_master_go(chid); } else { while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ Poll((long long)1); } written_so_far=0; child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->actual = 0; child_stat->throughput = 0; stopped=0; if(file_lock) if(mylockf((int) fd, (int) 1, (int)0) != 0) printf("File lock for write failed. %d\n",errno); if(Q_flag) { sprintf(tmpname,"Child_%d_randwol.dat",(int)xx); thread_randwqfd=fopen(tmpname,"a"); if(thread_randwqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } fprintf(thread_randwqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); } if(L_flag) { sprintf(tmpname,"Child_%d.log",(int)xx); thread_Lwqfd=fopen(tmpname,"a"); if(thread_Lwqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Random write start: ", now_string); } if((verify && !no_copy_flag) || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)0); starttime1 = time_so_far(); if(cpuutilflag) { walltime = starttime1; cputime = cputime_so_far(); } for(i=0; ithroughput = (time_so_far() - starttime1)-time_res - burst_acc_time_sec; if(child_stat->throughput < (double).000001) { child_stat->throughput = time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*written_so_far=(written_so_far*1024)/reclen;*/ written_so_far=w_traj_ops_completed; } child_stat->throughput = (double)written_so_far/child_stat->throughput; child_stat->actual = (double)written_so_far; if(debug1) { printf("\n(%ld) Stopped by another\n", (long)xx); } stopped=1; } if(purge) purgeit(nbuff,reclen); if(Q_flag || hist_summary) { thread_qtime_start=time_so_far(); } again: if(mmapflag) { wmaddr = &maddr[current_offset]; fill_area((long long*)nbuff,(long long*)wmaddr,(long long)reclen); if(!mmapnsflag) { if(mmapasflag) msync(wmaddr,(size_t)reclen,MS_ASYNC); if(mmapssflag) msync(wmaddr,(size_t)reclen,MS_SYNC); } } else { if(async_flag) { #ifdef ASYNC_IO if(async_flag) async_init(&gc,fd,direct_flag); #endif if(no_copy_flag) { free_addr=nbuff=(char *)malloc((size_t)reclen+page_size); nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); if(verify || dedup_flag || dedup_iflag) fill_buffer(nbuff,reclen,(long long)pattern,sverify,(long long)(current_offset/reclen)); async_write_no_copy(gc, (long long)fd, nbuff, reclen, (current_offset), depth,free_addr); } else async_write(gc, (long long)fd, nbuff, reclen, current_offset, depth); } else { if((dedup_flag && sparse_mode ) && !(dedup_iflag || dedup_bflag)) { zsize = (dedup * reclen )/100; I_LSEEK(fd,zsize,SEEK_CUR); wval = write(fd,nbuff+zsize,reclen - zsize); wval = zsize + wval; } else { wval = write(fd, nbuff, (size_t) reclen); } #ifndef NO_THREADS count_burst(&burst_acc_time_sec, xx); #endif if(wval != reclen) { if(*stop_flag && !stopped){ if(include_flush) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC); else fsync(fd); } temp_time = time_so_far(); child_stat->throughput = (temp_time - starttime1)-time_res - burst_acc_time_sec; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*written_so_far=(written_so_far*1024)/reclen;*/ written_so_far=w_traj_ops_completed; } child_stat->throughput = (double)written_so_far/child_stat->throughput; child_stat->actual = (double)written_so_far; if(debug1) { printf("\n(%ld) Stopped by another\n", (long)xx); } stopped=1; goto again; } /* Note: Writer must finish even though told to stop. Otherwise the readers will fail. The code will capture bytes transfered before told to stop but let the writer complete. */ #ifdef NO_PRINT_LLD printf("\nError writing block %ld, fd= %d\n", (long)i, fd); #else printf("\nError writing block %lld, fd= %d\n", (long long)i, fd); #endif if(wval==-1) perror("write"); if (!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat->flag = CHILD_STATE_HOLD; exit(127); } } } if(rlocking) { mylockr((int) fd, (int) 0, (int)0, lock_offset, reclen); } if(hist_summary) { thread_qtime_stop=time_so_far(); hist_time =(thread_qtime_stop-thread_qtime_start-time_res); hist_insert(hist_time); } if(op_rate_flag) { thread_qtime_stop=time_so_far(); desired_op_rate_time = ((double)1.0/(double)op_rate); actual_rate = (double)(thread_qtime_stop-thread_qtime_start); /* printf("Desired rate %g Actual rate %g Nap %g microseconds\n",desired_op_rate_time, actual_rate, (desired_op_rate_time-actual_rate)); */ if( actual_rate < desired_op_rate_time) my_unap((unsigned long long) ((desired_op_rate_time-actual_rate)*1000000.0 )); } if(Q_flag) { thread_qtime_stop=time_so_far(); #ifdef NO_PRINT_LLD fprintf(thread_randwqfd,"%10.1ld %10.0f %10.1ld\n",(long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long)reclen); #else fprintf(thread_randwqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long long)reclen); #endif } w_traj_ops_completed++; w_traj_bytes_completed+=reclen; written_so_far+=reclen/1024; if(*stop_flag) { written_so_far-=reclen/1024; w_traj_bytes_completed-=reclen; } #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif } if(file_lock) if(mylockf((int) fd, (int) 0, (int)0)) printf("Write unlock failed. %d\n",errno); /* #ifdef ASYNC_IO if(async_flag) { end_async(gc); gc=0; } #endif */ if(!xflag) { *stop_flag=1; if(distributed && client_iozone) send_stop(); } if(include_flush) { if(mmapflag) msync(maddr,(size_t)filebytes64,MS_SYNC); else fsync(fd); } if(include_close) { if(mmapflag) mmap_end(maddr,(unsigned long long)filebytes64); close(fd); } if(!stopped){ temp_time = time_so_far(); if(inc_think) child_stat->throughput = ((temp_time - starttime1)-time_res - burst_acc_time_sec); else child_stat->throughput = ((temp_time - starttime1)-time_res - burst_acc_time_sec) -compute_val; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*written_so_far=(written_so_far*1024)/reclen;*/ written_so_far=w_traj_ops_completed; } child_stat->throughput = (double)written_so_far/child_stat->throughput; child_stat->actual = (double)written_so_far; } child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ if(cdebug) { fprintf(newstdout,"Child %d: throughput %f actual %f \n",(int)chid,child_stat->throughput, child_stat->actual); fflush(newstdout); } if(cpuutilflag) { cputime = cputime_so_far() - cputime; if (cputime < cputime_res) cputime = 0.0; child_stat->cputime = cputime; walltime = time_so_far() - walltime; child_stat->walltime = walltime; } if(distributed && client_iozone) tell_master_stats(THREAD_RANDOM_WRITE_TEST, chid, child_stat->throughput, child_stat->actual, child_stat->cputime, child_stat->walltime, (char)*stop_flag, (long long)CHILD_STATE_HOLD); stopped=0; /*******************************************************************/ /* End random write performance test. ******************************/ /*******************************************************************/ if(debug1) #ifdef NO_PRINT_LLD printf("\nChild finished %ld\n",(long)xx); #else printf("\nChild finished %lld\n",(long long)xx); #endif if(!include_close) { if(mmapflag) { msync(maddr,(size_t)numrecs64*reclen,MS_SYNC); /*Clean up before read starts running*/ mmap_end(maddr,(unsigned long long)numrecs64*reclen); }else fsync(fd); close(fd); } if(Q_flag && (thread_randwqfd !=0) ) fclose(thread_randwqfd); free(dummyfile[xx]); if(L_flag) { get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Random write finished: ", now_string); fclose(thread_Lwqfd); } if(recnum) free(recnum); if(hist_summary) dump_hist("Random Write",(int)xx); if(distributed && client_iozone) return(0); #ifdef NO_THREADS exit(0); #else if(use_thread) thread_exit(); else exit(0); #endif return(0); } /************************************************************************/ /* Thread cleanup test */ /* This is not a measurement. It is a mechanism to cleanup all of the */ /* temporary files that were being used. This becomes very important */ /* when testing multiple clients over a network :-) */ /************************************************************************/ #ifdef HAVE_ANSIC_C void * thread_cleanup_test(int x) #else void * thread_cleanup_test(x) #endif { long long xx; struct child_stats *child_stat; char *dummyfile[MAXSTREAMS]; /* name of dummy file */ #ifdef NO_THREADS xx=chid; #else if(use_thread) xx = (long long)((long)x); else { xx=chid; } #endif dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); if(mfflag) { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s",filearray[xx]); #else sprintf(dummyfile[xx],"%s",filearray[xx]); #endif } else { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx],(long)xx); #else sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx],(long long)xx); #endif } if(!no_unlink) { if(check_filename(dummyfile[xx])) unlink(dummyfile[xx]); } child_stat = (struct child_stats *)&shmaddr[xx]; /*****************/ /* Children only */ /*****************/ child_stat=(struct child_stats *)&shmaddr[xx]; child_stat->flag = CHILD_STATE_READY; if(distributed && client_iozone) { tell_master_ready(chid); wait_for_master_go(chid); } else { while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ Poll((long long)1); } *stop_flag=1; if(distributed && client_iozone) send_stop(); if(distributed && client_iozone) tell_master_stats(THREAD_CLEANUP_TEST, chid, child_stat->throughput, child_stat->actual, child_stat->cputime, child_stat->walltime, (char)*stop_flag, (long long)CHILD_STATE_HOLD); child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ free(dummyfile[xx]); if(distributed && client_iozone) return(0); #ifdef NO_THREADS exit(0); #else if(use_thread) thread_exit(); else exit(0); #endif return(0); } /************************************************************************/ /* mythread_create() Internal routine that calls pthread_create() */ /************************************************************************/ #ifndef NO_THREADS #ifdef HAVE_ANSIC_C long long mythread_create( void *(*func)(void *),int x) #else long long mythread_create( func,x) void *func; int x; #endif { pthread_t ts; pthread_attr_t attr; int xx; long long meme; void *myptr; char foo[10]; /* mythread_create( void *(*func)(void *),int x) */ /* DAMN COMPILERS !!! */ sprintf(foo,"%x",x); sscanf(foo,"%llx",&meme); sscanf(foo,"%p",&myptr); #ifdef OSFV3 xx=(int )pthread_create(&ts, pthread_attr_default, (void *)(func), myptr); #else pthread_attr_init(&attr); xx=(int )pthread_create((pthread_t *)&ts, (pthread_attr_t *) &attr, (void *(*)(void *))(func), myptr); #endif bcopy(&ts,&p_childids[meme],sizeof(pthread_t)); if(xx < (int)0) printf("Thread create failed. Returned %d Errno = %d\n",xx,errno); if(debug1 ) { printf("\nthread created has an id of %p\n",(void *)&ts); #ifdef NO_PRINT_LLD printf("meme %ld\n",(long)meme); #else printf("meme %lld\n",(long long)meme); #endif } return((long long)meme); } #else #ifdef HAVE_ANSIC_C long long mythread_create( void *(*func)(void *),int x) #else long long mythread_create( func, x) void *(*func)(void *); int x; #endif { printf("This version does not support threads\n"); return(-1); } #endif /************************************************************************/ /* thread_exit() Internal routine that calls pthread_exit() */ /************************************************************************/ #ifndef NO_THREADS #ifdef HAVE_ANSIC_C int thread_exit(void) #else int thread_exit() #endif { pthread_exit((void *)NULL); #if !defined(solaris) return(0); #endif } #else #ifdef HAVE_ANSIC_C int thread_exit(void) #else int thread_exit() #endif { printf("This version does not support threads\n"); return(-1); } #endif /************************************************************************/ /* mythread_self() Internal function that calls pthread_self() */ /************************************************************************/ #ifndef NO_THREADS #ifdef HAVE_ANSIC_C pthread_t mythread_self(void) #else pthread_t mythread_self() #endif { pthread_t xx; xx = pthread_self(); return(xx); } #else #ifdef HAVE_ANSIC_C int mythread_self(void) #else int mythread_self() #endif { printf("This version does not support threads\n"); return(-1); } #endif /************************************************************************/ /* Internal thread_join routine... calls pthread_join */ /************************************************************************/ #ifndef NO_THREADS #ifdef HAVE_ANSIC_C void * thread_join( long long tid, void *status) #else void * thread_join( tid, status) long long tid; void *status; #endif { int xx; pthread_t eek; pthread_attr_t foo; bcopy(&p_childids[tid],&eek,sizeof(pthread_t)); xx=pthread_join(eek,(void **)&foo); if(xx<0) printf("Thread join returned error %d\n",errno); return(0); } #else #ifdef HAVE_ANSIC_C void * thread_join( long long tid, void *status) #else void * thread_join( tid, status) long long tid; void *status; #endif { printf("This version does not support threads\n"); return((void *)-1); } #endif /************************************************************************/ /* Dump the CPU utilization data. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void dump_throughput_cpu(void) #else void dump_throughput_cpu() #endif { long long x,y,i,j; char *port; char *label; char print_str[300]; x=max_x; y=max_y; port = use_thread ? "threads" : "processes"; printf("\n\"CPU utilization report Y-axis is type of test X-axis is number of %s\"\n",port); if (bif_flag) { sprintf(print_str, "CPU utilization report Y-axis is type of test X-axis is number of %s", port); do_label(bif_fd, print_str, bif_row++, bif_column); } label = OPS_flag ? "ops/sec" : MS_flag ? "microseconds/op" : "kBytes/sec"; #ifdef NO_PRINT_LLD if(!silent) printf("\"Record size = %ld kBytes \"\n", (long)(reclen/1024)); #else if(!silent) printf("\"Record size = %lld kBytes \"\n", (long long)(reclen/1024)); #endif if(!silent) printf("\"Output is in CPU%%\"\n\n"); if (bif_flag) { #ifdef NO_PRINT_LLD sprintf(print_str, "Record size = %ld kBytes", (long)(reclen/1024)); #else sprintf(print_str, "Record size = %lld kBytes", (long long)(reclen/1024)); #endif do_label(bif_fd, print_str, bif_row++, bif_column); sprintf(print_str, "Output is in CPU%%"); do_label(bif_fd, print_str, bif_row++, bif_column); } for (i = 0; i < x; i++) { if(!silent) printf("\"%15s \"", throughput_tests[i]); if (bif_flag) { sprintf(print_str, "%15s ", throughput_tests[i]); do_label(bif_fd, print_str, bif_row, bif_column++); bif_column++; } for (j = 0; j <= y; j++) { if (bif_flag) do_float(bif_fd, runtimes[i][j].cpuutil, bif_row, bif_column++); if(!silent) printf(" %10.2f ", runtimes[i][j].cpuutil); } if(!silent) printf("\n\n"); if (bif_flag) { bif_column=0; bif_row++; } } } /************************************************************************/ /* Dump the throughput graphs */ /************************************************************************/ #ifdef HAVE_ANSIC_C void dump_throughput(void) #else void dump_throughput() #endif { long long x,y,i,j; char *port; char *label; char print_str[300]; x=max_x; y=max_y; if(use_thread) port="threads"; else port="processes"; if(!silent) printf("\n\"Throughput report Y-axis is type of test X-axis is number of %s\"\n",port); if(bif_flag) { bif_fd=create_xls(bif_filename); do_label(bif_fd,command_line,bif_row++,bif_column); sprintf(print_str,"Throughput report Y-axis is type of test X-axis is number of %s",port); do_label(bif_fd,print_str,bif_row++,bif_column); } if(OPS_flag) label="ops/sec"; else if(MS_flag) label="microseconds/op"; else label="kBytes/sec"; #ifdef NO_PRINT_LLD if(!silent) printf("\"Record size = %ld kBytes \"\n",(long)(reclen/1024)); #else if(!silent) printf("\"Record size = %lld kBytes \"\n",(long long)(reclen/1024)); #endif if(!silent) printf("\"Output is in %s\"\n\n",label); if(bif_flag) { #ifdef NO_PRINT_LLD sprintf(print_str,"Record size = %ld kBytes",(long)(reclen/1024)); #else sprintf(print_str,"Record size = %lld kBytes",(long long)(reclen/1024)); #endif do_label(bif_fd,print_str,bif_row++,bif_column); sprintf(print_str,"Output is in %s",label); do_label(bif_fd,print_str,bif_row++,bif_column); } for(i=0;i<=toutputindex;i++) { if(!silent) printf("\"%15s \"",toutput[i]); if(bif_flag) { sprintf(print_str,"%15s ",toutput[i]); do_label(bif_fd,print_str,bif_row,bif_column++); bif_column++; } for(j=0;j<=y;j++) { if(bif_flag) { do_float(bif_fd,(double)report_darray[i][j],bif_row,bif_column++); } if(!silent) printf(" %10.2f ",report_darray[i][j]); } if(!silent) printf("\n\n"); if(bif_flag) { bif_column=0; bif_row++; } } if (cpuutilflag) dump_throughput_cpu(); if(bif_flag) close_xls(bif_fd); } /************************************************************************/ /* store_dvalue() */ /* Stores a value in an in memory array. Used by the report function */ /* to re-organize the output for Excel */ /************************************************************************/ #ifdef HAVE_ANSIC_C void store_dvalue(double value) #else void store_dvalue(value) double value; #endif { report_darray[current_x][current_y]=value; current_x++; if(current_x > max_x) max_x=current_x; if(current_y > max_y) max_y=current_y; if(max_x >= MAX_X) { printf("\nMAX_X too small\n"); exit(163); } if(max_y >= MAXSTREAMS) { printf("\nMAXSTREAMS too small\n"); exit(164); } } /************************************************************************/ /* Initialize a file that will be used by mmap. */ /************************************************************************/ #ifdef HAVE_ANSIC_C char * initfile(int fd, off64_t filebytes,int flag,int prot) #else char * initfile(fd, filebytes,flag, prot) int fd; off64_t filebytes; int flag, prot; #endif { char *pa; int mflags=0; long long x; char *tmp,*stmp; int file_flags; long long recs; long long i; int dflag = 0; if(flag) { #ifdef _HPUX_SOURCE /* * Save time, just have the operating system prealloc * the file */ prealloc(fd,filebytes); #else /* * Allocate a temporary buffer to meet any alignment * contraints of any method. */ tmp=(char *)malloc((size_t)reclen * 2); stmp=tmp; /* * Align to a reclen boundary. */ tmp = (char *)((((long)tmp + (long)reclen))& ~(((long)reclen-1))); /* * Special case.. Open O_DIRECT, and going to be mmap() * Under Linux, one can not create a sparse file using * a file that is opened with O_DIRECT */ file_flags=fcntl(fd,F_GETFL); #if ! defined(DONT_HAVE_O_DIRECT) #if defined(linux) || defined(__AIX__) || defined(IRIX) || defined(IRIX64) || defined(Windows) || defined (__FreeBSD__) dflag = O_DIRECT; #endif #if defined(TRU64) if(direct_flag) dflag = O_DIRECTIO; #endif #endif if((file_flags & dflag) !=0) { recs=filebytes/reclen; for (i =0; i microsecs) break; } } /************************************************************************/ /* Function that establishes the resolution */ /* of the gettimeofday() function. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void get_resolution(void) #else void get_resolution() #endif { double starttime, finishtime, besttime = 0; long j,delay; int k; finishtime=time_so_far1(); /* Warm up the instruction cache */ starttime=time_so_far1(); /* Warm up the instruction cache */ delay=j=0; /* Warm up the data cache */ for(k=0;k<10;k++) { while(1) { starttime=time_so_far1(); for(j=0;j< delay;j++) ; finishtime=time_so_far1(); if(starttime==finishtime) delay++; else { if(k==0) besttime=(finishtime-starttime); if((finishtime-starttime) < besttime) besttime=(finishtime-starttime); break; } } } time_res=besttime/1000000.0; } /************************************************************************/ /* Function that establishes the resolution */ /* of the getrusage() function. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void get_rusage_resolution(void) #else void get_rusage_resolution() #endif { double starttime, finishtime; long j; finishtime=cputime_so_far(); /* Warm up the instruction cache */ starttime=cputime_so_far(); /* Warm up the instruction cache */ delay=j=0; /* Warm up the data cache */ while(1) { starttime=cputime_so_far(); for(j=0;j< delay;j++) ; finishtime=cputime_so_far(); if(starttime==finishtime) delay++; else break; } cputime_res = (finishtime-starttime); /* in seconds */ } /************************************************************************/ /* Time measurement routines. */ /* Return time in microseconds */ /************************************************************************/ #ifdef HAVE_ANSIC_C static double time_so_far1(void) #else static double time_so_far1() #endif { /* For Windows the time_of_day() is useless. It increments in 55 milli second increments. By using the Win32api one can get access to the high performance measurement interfaces. With this one can get back into the 8 to 9 microsecond resolution */ #ifdef Windows LARGE_INTEGER freq,counter; double wintime; double bigcounter; struct timeval tp; if(pit_hostname[0]){ pit_gettimeofday(&tp, (struct timezone *) NULL, pit_hostname, pit_service); return ((double) (tp.tv_sec)*1000000.0)+(((double)tp.tv_usec)); } else { QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&counter); bigcounter=(double)counter.HighPart *(double)0xffffffff + (double)counter.LowPart; wintime = (double)(bigcounter/(double)freq.LowPart); return((double)wintime*1000000.0); } #else #if defined (OSFV4) || defined(OSFV3) || defined(OSFV5) struct timespec gp; if (getclock(TIMEOFDAY, (struct timespec *) &gp) == -1) perror("getclock"); return (( (double) (gp.tv_sec)*1000000.0) + ( ((float)(gp.tv_nsec)) * 0.001 )); #else struct timeval tp; if(pit_hostname[0]){ if (pit_gettimeofday(&tp, (struct timezone *) NULL, pit_hostname, pit_service) == -1) perror("pit_gettimeofday"); return ((double) (tp.tv_sec)*1000000.0) + (((double) tp.tv_usec) ); } else { if (gettimeofday(&tp, (struct timezone *) NULL) == -1) perror("gettimeofday"); return ((double) (tp.tv_sec)*1000000.0) + (((double) tp.tv_usec) ); } #endif #endif } /************************************************************************/ /* Return the clocks per tick for the times() call. */ /************************************************************************/ #ifdef unix #ifdef HAVE_ANSIC_C static double clk_tck(void) /* Get the clocks per tick for times */ #else static double clk_tck() /* Get the clocks per tick for times */ #endif { return((double)sysconf(_SC_CLK_TCK)); } /************************************************************************/ /* Return the user time in tics as a double. */ /************************************************************************/ #ifdef HAVE_ANSIC_C static double utime_so_far(void) /* Return user time in ticks as double */ #else static double utime_so_far() #endif { struct tms tp; times(&tp); return ((double) (tp.tms_utime)); } /************************************************************************/ /* Return the system time in tics as a double. */ /************************************************************************/ #ifdef HAVE_ANSIC_C static double stime_so_far(void) /* Return system time in ticks as double */ #else static double stime_so_far() #endif { struct tms tp; times(&tp); return ((double) (tp.tms_stime)); } /************************************************************************/ /* Return the CPU (user + system) time in seconds as a double. */ /************************************************************************/ #ifdef HAVE_ANSIC_C static double cputime_so_far(void) /* Return CPU time in seconds as double */ #else static double cputime_so_far() #endif { #if 0 struct tms tp; times(&tp); return ((double) (tp.tms_utime + tp.tms_stime) / sc_clk_tck); #else struct rusage ru; if (getrusage (RUSAGE_SELF, &ru)) perror ("getrusage"); return ((double)(ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) + .000001 *(ru.ru_utime.tv_usec + ru.ru_stime.tv_usec)); #endif } #endif /************************************************************************/ /* Return the CPU utilization ((user + system) / walltime) as a percentage. */ /************************************************************************/ #ifdef HAVE_ANSIC_C static double cpu_util(double cputime, double walltime) #else static double cpu_util(cputime, walltime) double cputime, walltime; #endif { double cpu; if (walltime <= (double)0.0) { cpu = (double)0.0; return cpu; } if (cputime <= (double)0.0) cputime = 0.0; if (walltime <= (double)0.0) cpu = (double)100.0; else { cpu = (((double)100.0 * cputime) / walltime); /* if (cpu > (double)100.0) cpu = (double)99.99; */ } return cpu; } /************************************************************************/ /* This is a locking function that permits the writes and */ /* reads during the test to hold a file lock. Since each */ /* tmp file that Iozone creates is a private file, this seems */ /* like a no-op but it turns out that when using Iozone */ /* over NFS, life is very, very different. Some vendors */ /* read and write performance goes to zip when locks are held */ /* even if there is only one process using the file and having */ /* it locked. Some implementations of NFS transition from async */ /* to fully sync reads and writes if any locks are used. Euck... */ /************************************************************************/ #ifdef HAVE_ANSIC_C int mylockf(int fd, int op, int rdwr) #else int mylockf(fd, op, rdwr) int fd, op, rdwr; #endif { struct flock myflock; int ret; if(op==0) /* Generic unlock the whole file */ { myflock.l_type=F_UNLCK; myflock.l_whence=SEEK_SET; myflock.l_start=0; myflock.l_len=0; /* The whole file */ myflock.l_pid=getpid(); ret=fcntl(fd,F_SETLKW, &myflock); } else /* Generic lock the whole file */ { if(rdwr==0) myflock.l_type=F_WRLCK; /* Apply write lock */ else myflock.l_type=F_RDLCK; /* Apply read lock */ myflock.l_whence=SEEK_SET; myflock.l_start=0; myflock.l_len=0; /* The whole file */ myflock.l_pid=getpid(); ret=fcntl(fd,F_SETLKW, &myflock); } return(ret); } #ifdef HAVE_ANSIC_C int mylockr(int fd, int op, int rdwr, off64_t offset, off64_t size) #else int mylockr(fd, op, rdwr, offset, size) int fd, op, rdwr; off64_t offset; off64_t size; #endif { struct flock myflock; int ret; if(op==0) /* Generic unlock the whole file */ { /*printf("Child: %lld Unlock offset %lld size %lld\n",chid,offset,size);*/ myflock.l_type=F_UNLCK; myflock.l_whence=SEEK_SET; myflock.l_start=offset; myflock.l_len=size; /* The whole file */ myflock.l_pid=getpid(); ret=fcntl(fd,F_SETLKW, &myflock); } else /* Generic lock the range */ { if(rdwr==0) { myflock.l_type=F_WRLCK; /* Apply write lock */ /* printf("Write ");*/ } else { myflock.l_type=F_RDLCK; /* Apply read lock */ /* printf("Read ");*/ } /*printf("Child: %lld Lock offset %lld size %lld\n",chid, offset,size);*/ myflock.l_whence=SEEK_SET; myflock.l_start=offset; myflock.l_len=size; /* The whole file */ myflock.l_pid=getpid(); ret=fcntl(fd,F_SETLKW, &myflock); } return(ret); } /************************************************************************/ /* This function is used to simulate compute time that does */ /* not involve the I/O subsystem. */ /************************************************************************/ #ifdef HAVE_ANSIC_C float do_compute(float comp_delay) #else float do_compute(comp_delay) float comp_delay; #endif { double starttime,tmptime; if(comp_delay == (float)0.0) return(0.0); starttime=time_so_far(); while(1) { tmptime=time_so_far()-starttime; if(tmptime >= (double)comp_delay) return(tmptime); } } /************************************************************************/ /* This function is intended to cause an interruption */ /* in the read pattern. It will make a reader have */ /* jitter in its access behavior. */ /* When using direct I/O one must use a pagesize transfer. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void disrupt(int fd) #else void disrupt(fd) int fd; #endif { char *nbuff,*free_addr; off64_t current; free_addr=nbuff=(char *)malloc((size_t)page_size+page_size); nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); /* Save current position */ current = I_LSEEK(fd,0,SEEK_CUR); /* Move to beginning of file */ I_LSEEK(fd,0,SEEK_SET); /* Read a little of the file */ if(direct_flag) junk=read(fd,nbuff,page_size); else junk=read(fd,nbuff,1); /* Skip into the file */ I_LSEEK(fd,page_size,SEEK_SET); /* Read a little of the file */ if(direct_flag) junk=read(fd,nbuff,page_size); else junk=read(fd,nbuff,1); /* Restore current position in file, before disruption */ I_LSEEK(fd,current,SEEK_SET); free(free_addr); } #if defined(Windows) /************************************************************************/ /* This function is intended to cause an interruption */ /* in the read pattern. It will make a reader have */ /* jitter in its access behavior. */ /* When using direct I/O one must use a pagesize transfer. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void disruptw(HANDLE hand) #else void disruptw(HANDLE) int hand; #endif { char *nbuff,*free_addr; off64_t current; long retval; free_addr=nbuff=(char *)malloc((size_t)page_size+page_size); nbuff=(char *)(((long)nbuff+(long)page_size) & (long)~(page_size-1)); /* Save current position */ current=SetFilePointer(hand,(LONG)0,0,FILE_CURRENT); /* Move to beginning of file */ SetFilePointer(hand,(LONG)0,0,FILE_BEGIN); /* Read a little of the file */ ReadFile(hand, nbuff, reclen,(LPDWORD)&retval,0); /* Skip into the file */ SetFilePointer(hand,(LONG)page_size,0,FILE_BEGIN); /* Read a little of the file */ ReadFile(hand, nbuff, reclen,(LPDWORD)&retval,0); /* Restore current position in file, before disruption */ SetFilePointer(hand,(LONG)current,0,FILE_BEGIN); free(free_addr); } #endif /************************************************************************/ /* Read a telemetry file and return the the offset */ /* for the next operaton. Also, set the size */ /* in the variable given in the param list. */ /* which == 0 ... reader calling */ /* which == 1 ... writer calling */ /************************************************************************/ #ifdef HAVE_ANSIC_C long long get_traj(FILE *traj_fd, long long *traj_size, float *delay, long which) #else long long get_traj(traj_fd, traj_size, delay, which) FILE *traj_fd; long long *traj_size; float *delay; long which; #endif { long long traj_offset = 0; #ifdef NO_PRINT_LLD long tmp1 = 0; long tmp2 = 0; long tmp3 = 0; long tmp4 = 0; #else long long tmp1 = 0; long long tmp2 = 0; long long tmp3 = 0; long long tmp4 = 0; #endif int tmp = 0; int tokens; int ret=0; char *ret1,*where; char buf[200]; char sbuf[200]; int got_line; got_line=0; while(got_line==0) { tokens=0; ret1=fgets(buf,200,traj_fd); if(ret1==(char *)0) { printf("\n\n\tEarly end of telemetry file. Results not accurate.\n"); signal_handler(); } where=(char *)&buf[0]; strcpy(sbuf,buf); if((*where=='#') || (*where=='\n')) continue; tokens++; strtok(where," "); while( (char *)(strtok( (char *)0," ")) != (char *)0) { tokens++; } got_line=1; } if(tokens == 3) { #ifdef NO_PRINT_LLD ret=sscanf(sbuf,"%ld %ld %d\n",&tmp1,&tmp2,&tmp); traj_offset=(long long)tmp1; *traj_size=(long long)tmp2; #else ret=sscanf(sbuf,"%lld %lld %d\n",&tmp1,&tmp2,&tmp); traj_offset=(long long)tmp1; *traj_size=(long long)tmp2; #endif *delay= ((float)tmp/1000); } if(tokens == 2) { #ifdef NO_PRINT_LLD ret=sscanf(sbuf,"%ld %ld\n",&tmp3,&tmp4); traj_offset=(long long)tmp3; *traj_size=(long long)tmp4; #else ret=sscanf(sbuf,"%lld %lld\n",&tmp3,&tmp4); traj_offset=(long long)tmp3; *traj_size=(long long)tmp4; #endif *delay=compute_time; /*printf("\nReading %s trajectory with %d items\n",which?"write":"read",tokens);*/ } if((tokens != 2) && (tokens !=3)) { printf("\n\tInvalid entry in telemetry file. > %s <\n",sbuf); exit(178); } if(ret==EOF) { printf("\n\n\tEarly end of telemetry file. Results not accurate.\n"); signal_handler(); } #ifdef DEBUG #ifdef NO_PRINT_LLD if(!silent) printf("\nOffset %ld Size %ld Compute delay %f\n",(long)traj_offset, (long)(*traj_size),*delay); #else if(!silent) printf("\nOffset %lld Size %lld Compute delay %f\n",(long long)traj_offset, (long long)(*traj_size),*delay); #endif #endif return(traj_offset); } /************************************************************************/ /* Open the read telemetry file and return file pointer. */ /************************************************************************/ #ifdef HAVE_ANSIC_C FILE * open_r_traj(void) #else FILE * open_r_traj() #endif { FILE *fd; fd=fopen(read_traj_filename,"r"); if(fd == (FILE *)0) { printf("Unable to open read telemetry file \"%s\"\n", read_traj_filename); exit(174); } return(fd); } /************************************************************************/ /* Open the write telemetry file and return file pointer. */ /************************************************************************/ #ifdef HAVE_ANSIC_C FILE * open_w_traj(void) #else FILE * open_w_traj() #endif { FILE *fd; fd=fopen(write_traj_filename,"r"); if(fd == (FILE *)0) { printf("Unable to open write telemetry file \"%s\"\n", write_traj_filename); exit(175); } return(fd); } /************************************************************************/ /* r_traj_size(void) */ /* This function scans the read telemetry file */ /* and establishes the number of entries */ /* and the maximum file offset. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void r_traj_size(void) #else void r_traj_size() #endif { FILE *fd; int ret; long long traj_offset = 0; long long traj_size = 0; long long max_offset = 0; int tokens; int dummy; int lines; char buf[200]; char sbuf[200]; char *ret1,*where; lines=0; fd=fopen(read_traj_filename,"r"); if(fd == (FILE *)0) { printf("Unable to open read telemetry file \"%s\"\n", read_traj_filename); exit(174); } while(1) { tokens=0; ret1=fgets(buf,200,fd); if(ret1==(char *)0) break; where=(char *)&buf[0]; strcpy(sbuf,buf); lines++; if((*where=='#') || (*where=='\n')) continue; tokens++; strtok(where," "); while( (char *)(strtok( (char *)0," ")) != (char *)0) { tokens++; } if(tokens==1) { printf("\n\tInvalid read telemetry file entry. Line %d", lines); signal_handler(); } #ifdef DEBUG printf("Tokens = %d\n",tokens); #endif if(tokens==3) { #ifdef NO_PRINT_LLD ret=sscanf(sbuf,"%ld %ld %d\n",(long *)&traj_offset,(long *)&traj_size,&dummy); #else ret=sscanf(sbuf,"%lld %lld %d\n",(long long *)&traj_offset,(long long *)&traj_size,&dummy); #endif } if(tokens==2) { #ifdef NO_PRINT_LLD ret=sscanf(sbuf,"%ld %ld\n",(long *)&traj_offset,(long *)&traj_size); #else ret=sscanf(sbuf,"%lld %lld\n",(long long *)&traj_offset,(long long *)&traj_size); #endif } if((tokens != 2) && (tokens !=3)) { printf("\n\tInvalid read telemetry file. Line %d\n",lines); exit(178); } if(traj_offset + traj_size > max_offset) max_offset=traj_offset + traj_size; r_traj_ops++; } r_traj_fsize=max_offset; #ifdef DEBUG #ifdef NO_PRINT_LLD printf("File size of read %ld Item count %ld\n",(long)r_traj_fsize,(long)r_traj_ops); #else printf("File size of read %lld Item count %lld\n",(long long)r_traj_fsize,(long long)r_traj_ops); #endif #endif fclose(fd); } /************************************************************************/ /* w_traj_size(void) */ /* This function scans the write telemetry file */ /* and establishes the number of entries */ /* and the maximum file offset. */ /************************************************************************/ #ifdef HAVE_ANSIC_C long long w_traj_size(void) #else long long w_traj_size() #endif { FILE *fd; int ret; long long traj_offset = 0; long long traj_size = 0; long long max_offset = 0; int dummy; int tokens,lines; char *ret1; char buf[200]; char sbuf[200]; char *where; lines=0; fd=fopen(write_traj_filename,"r"); if(fd == (FILE *)0) { printf("Unable to open write telemetry file \"%s\"\n", write_traj_filename); exit(174); } while(1) { tokens=0; ret1=fgets(buf,200,fd); if(ret1==(char *)0) break; lines++; where=(char *)&buf[0]; strcpy(sbuf,buf); if((*where=='#') || (*where=='\n')) continue; tokens++; strtok(where," "); while( (char *)(strtok( (char *)0," ")) != (char *)0) { tokens++; } if(tokens==1) { printf("\n\tInvalid write telemetry file entry. Line %d\n", lines); signal_handler(); } if(tokens==3) { #ifdef NO_PRINT_LLD ret=sscanf(sbuf,"%ld %ld %d\n",(long *)&traj_offset,(long *)&traj_size,&dummy); #else ret=sscanf(sbuf,"%lld %lld %d",(long long *)&traj_offset,(long long *)&traj_size,&dummy); #endif } if(tokens==2) { #ifdef NO_PRINT_LLD ret=sscanf(sbuf,"%ld %ld\n",(long *)&traj_offset,(long *)&traj_size); #else ret=sscanf(sbuf,"%lld %lld\n",(long long *)&traj_offset,(long long *)&traj_size); #endif } if(tokens > 3) { printf("\n\tInvalid write telemetry file entry. Line %d\n", lines); exit(174); } if(traj_offset + traj_size > max_offset) max_offset=traj_offset + traj_size; w_traj_ops++; } w_traj_fsize=max_offset; #ifdef DEBUG #ifdef NO_PRINT_LLD printf("File size of write %ld Item count %ld\n",(long)w_traj_fsize,(long)w_traj_ops); #else printf("File size of write %lld Item count %lld\n",(long long)w_traj_fsize,(long long)w_traj_ops); #endif #endif fclose(fd); return(max_offset); } /************************************************************************/ /* Find which version of the telemetry file format is in use. */ /************************************************************************/ #ifdef HAVE_ANSIC_C void traj_vers(void) #else void traj_vers() #endif { FILE *fd; char *where; char buf[200]; int things; char *ret1; if(r_traj_flag) { things=0; fd=fopen(read_traj_filename,"r"); if(fd == (FILE *)0) { printf("Unable to open read telemetry file \"%s\"\n", read_traj_filename); exit(174); } loop1: ret1=fgets(buf,200,fd); if(ret1==(char *)0) { fclose(fd); return; } where=(char *)&buf[0]; if((*where=='#') || (*where=='\n')) goto loop1; things++; strtok(where," "); while( (char *)(strtok( (char *)0," ")) != (char *)0) { things++; } r_traj_items=things; #ifdef DEBUG printf("Found %d items in the read telemetry file\n",things); #endif } if(w_traj_flag) { things=0; fd=fopen(write_traj_filename,"r"); if(fd == (FILE *)0) { printf("Unable to open write telemetry file \"%s\"\n", write_traj_filename); exit(174); } loop2: ret1=fgets(buf,200,fd); if(ret1==(char *)0) { fclose(fd); return; } where=(char *)&buf[0]; if((*where=='#') || (*where=='\n')) goto loop2; things++; strtok(where," "); while( (char *)(strtok( (char *)0," ")) != (char *)0) { things++; } fclose(fd); w_traj_items=things; #ifdef DEBUG printf("Found %d items in the write telemetry file\n",things); #endif } } /********************************************************************/ /* */ /* Today this initializes the default set of file sizes for Iozone. */ /* in the future it may take input from the command line or */ /* from a file. */ /* */ /********************************************************************/ #ifdef HAVE_ANSIC_C void init_file_sizes( off64_t min_f_size, off64_t max_f_size) #else void init_file_sizes(min_f_size, max_f_size) off64_t min_f_size; off64_t max_f_size; #endif { off64_t kilosi; int x; if(s_count > 1) { for(x=0; x < s_count; x++) { kilosi=s_range[x]; add_file_size((off64_t)kilosi); } } else { for(kilosi=min_f_size;kilosi<=max_f_size;kilosi*=multiplier) { add_file_size((off64_t)kilosi); } } } /********************************************************************/ /* Used to constuct the list of file sizes to test. */ /********************************************************************/ #ifdef HAVE_ANSIC_C void add_file_size(off64_t size) #else void add_file_size(size) off64_t size; #endif { struct size_entry *size_listp; struct size_entry *nsize_list; size_listp=size_list; if(size_list) { if(size_listp->next) while(size_listp->next!=0) size_listp=size_listp->next; } nsize_list=(struct size_entry *)malloc(sizeof(struct size_entry)); if(nsize_list==0) { printf("Malloc failed in add_file_size\n"); exit(180); } nsize_list->next=0; nsize_list->size=size; if(size_list == 0) size_list=nsize_list; else size_listp->next=nsize_list; size_listp=size_list; } /********************************************************************/ /* Return the next file size to test. */ /********************************************************************/ #ifdef HAVE_ANSIC_C off64_t get_next_file_size(off64_t size) #else off64_t get_next_file_size(size) off64_t size; #endif { struct size_entry *size_listp; size_listp=size_list; for( ; size_listp ; size_listp=size_listp->next ) { if(size_listp->size > size) return(size_listp->size); } return((off64_t)0); } /**********************************************************************/ /* */ /* Today this initializes the default set of record sizes for Iozone. */ /* in the future it may take input from the command line or */ /* from a file. */ /* */ /**********************************************************************/ #ifdef HAVE_ANSIC_C void init_record_sizes( off64_t min_r_size, off64_t max_r_size) #else void init_record_sizes(min_r_size, max_r_size) off64_t min_r_size; off64_t max_r_size; #endif { int x; off64_t size; if(r_count > 1) { for(x=0; x < r_count; x++) { size=r_range[x]; add_record_size((off64_t)size); } } else { for(size=min_r_size;size<=max_r_size;size*=multiplier) { add_record_size((off64_t)size); } } } #ifdef HAVE_ANSIC_C void del_record_sizes(void) #else void del_record_sizes() #endif { struct size_entry *size_listp; struct size_entry *save_item; size_listp=rec_size_list; if(rec_size_list) { while(size_listp!=0) { save_item=size_listp->next; free(size_listp); size_listp=save_item; } } rec_size_list=0; } /********************************************************************/ /* Used to constuct the list of record sizes to test. */ /********************************************************************/ #ifdef HAVE_ANSIC_C void add_record_size(off64_t size) #else void add_record_size(size) off64_t size; #endif { struct size_entry *size_listp; struct size_entry *nsize_list; size_listp=rec_size_list; if(rec_size_list) { if(size_listp->next) while(size_listp->next!=0) size_listp=size_listp->next; } nsize_list=(struct size_entry *)malloc(sizeof(struct size_entry)); if(nsize_list==0) { printf("Malloc failed in add_file_size\n"); exit(180); } nsize_list->next=0; nsize_list->size=size; if(rec_size_list == 0) rec_size_list=nsize_list; else size_listp->next=nsize_list; size_listp=rec_size_list; } /********************************************************************/ /* Return the next record size to test. */ /********************************************************************/ #ifdef HAVE_ANSIC_C off64_t get_next_record_size(off64_t size) #else off64_t get_next_record_size(size) off64_t size; #endif { struct size_entry *size_listp; size_listp=rec_size_list; for( ; size_listp ; size_listp=size_listp->next ) { if(size_listp->size > size) return(size_listp->size); } return((off64_t)0); } /* * Socket based communication mechanism. * It's intended use is to be the communication mechanism * that will be used to get Iozone to run across * multiple clients. 1/11/2002 Don Capps * The communication model permits a master to send and receive * messages to and from clients, and for clients to be able to * send and receive messages to and from the master. */ /* * Interfaces are: Master: int start_master_listen(void) Called to create masters listening port. void master_listen(int sock, int size_of_message) Call when master wants to block and read a message. int start_master_send(char *child_host_name, int port) Call to start a send channel to a client. void master_send(int child_socket_val, char *host_name, char *send_buffer, int send_size) Call to send message to a client. void stop_master_listen(int master_socket_val) Call to release the masters listening port. void stop_master_send(int child_socket_val) Call to release the masters send port to a client. Clients: int start_child_listen(int size_of_message) Called to create clients listening port. void child_listen(int sock, int size_of_message) Call when client wants to block and read a message from the master. void child_send(int child_socket_val, char *controlling_host_name, char *send_buffer, int send_size) Call to send message to the master. void stop_child_listen(int child_socket_val) Call to release the clients listening port. void stop_child_send(int child_socket_val) Call to release the clients send port to the master. Messages are sent in command blocks. The structure is client_command for messages from the master to the client, and master_command for messages sent from a client to the master. */ /* * Allocate the master listening port that * all children will use to send messages to the master. */ #ifdef HAVE_ANSIC_C int start_master_listen(void) #else int start_master_listen() #endif { int s; int rc; int tmp_port; int sockerr; struct sockaddr_in addr; int recv_buf_size=65536*4; int optval=1; struct linger dummy={1,0}; s = socket(AF_INET, SOCK_STREAM, 0); if (s < 0) { perror("socket failed:"); exit(19); } sockerr = setsockopt (s, SOL_SOCKET, SO_RCVBUF, (char *) &recv_buf_size, sizeof(int)); if ( sockerr == -1 ) { perror("Error in setsockopt 1\n"); } sockerr = setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (char *) &optval, sizeof(int)); if ( sockerr == -1 ) { perror("Error in setsockopt 2\n"); } sockerr = setsockopt (s, SOL_SOCKET, SO_LINGER, (char *) &dummy, sizeof(struct linger)); if ( sockerr == -1 ) { perror("Error in setsockopt 2\n"); } tmp_port=HOST_LIST_PORT; bzero(&addr, sizeof(struct sockaddr_in)); addr.sin_port = htons(tmp_port); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; rc = -1; while (rc < 0) { rc = bind(s, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); if(rc < 0) { tmp_port++; addr.sin_port=htons(tmp_port); continue; } master_listen_port = ntohs(addr.sin_port); } if(rc < 0) { perror("bind failed\n"); exit(20); } if(mdebug) printf("Master listening on socket %d Port %d\n",s,tmp_port); return(s); } /* * Master listens for messages and blocks until * something arrives. */ struct sockaddr_in listener_sync_sock; #ifdef HAVE_ANSIC_C void master_listen(int sock, int size_of_message) #else void master_listen(sock, size_of_message) int sock, size_of_message; #endif { int tsize; int s; struct sockaddr_in *addr; unsigned int me; int ns,ret; struct master_neutral_command *mnc; mnc=(struct master_neutral_command *)&master_rcv_buf[0]; tsize = size_of_message; addr=&listener_sync_sock; s = sock; me=sizeof(struct sockaddr_in); if(mdebug) printf("Master in listening mode on socket %d\n",s); again: ret=listen(s,MAXSTREAMS); if(ret != 0) { perror("Master: listen returned error\n"); } if(mdebug) printf("Master in accepting connection\n"); #if defined(ANDROID) ns=accept((int)s,(struct sockaddr *)addr,(socklen_t *)&me); #else ns=accept(s,(void *)addr,&me); #endif if(ns < 0) { printf("Master socket %d\n",s); perror("Master: ***** accept returned error *****\n"); sleep(1); goto again; } if(mdebug) printf("Master in reading from connection\n"); ret=read(ns,mnc,tsize); if(ret < tsize) { printf("Master read failed. Ret %d Errno %d\n",ret,errno); } close(ns); } /* * Child sends message to master. */ #ifdef HAVE_ANSIC_C void child_send(char *controlling_host_name, struct master_command *send_buffer, int send_size) #else void child_send(controlling_host_name, send_buffer, send_size) char *controlling_host_name; struct master_command *send_buffer; int send_size; #endif { int rc,child_socket_val; struct hostent *he; int tmp_port; struct in_addr *ip; struct sockaddr_in cs_addr,cs_raddr; struct master_neutral_command outbuf; struct timespec req,rem; req.tv_sec = 0; req.tv_nsec = 10000000; rem.tv_sec = 0; rem.tv_nsec = 10000000; if(cdebug) { fprintf(newstdout,"Start_child_send: %s Size %d\n",controlling_host_name,send_size); fflush(newstdout); } he = gethostbyname(controlling_host_name); if (he == NULL) { exit(22); } ip = (struct in_addr *)he->h_addr_list[0]; over: cs_raddr.sin_family = AF_INET; cs_raddr.sin_port = htons(controlling_host_port); cs_raddr.sin_addr.s_addr = ip->s_addr; child_socket_val = socket(AF_INET, SOCK_STREAM, 0); if (child_socket_val < 0) { perror("Child: socket failed:"); exit(23); } bzero(&cs_addr, sizeof(struct sockaddr_in)); tmp_port= CHILD_ESEND_PORT; cs_addr.sin_port = htons(tmp_port); cs_addr.sin_family = AF_INET; cs_addr.sin_addr.s_addr = INADDR_ANY; rc = -1; while (rc < 0) { rc = bind(child_socket_val, (struct sockaddr *)&cs_addr, sizeof(struct sockaddr_in)); if(rc < 0) { tmp_port++; cs_addr.sin_port=htons(tmp_port); continue; } } if (rc < 0) { perror("Child: bind failed\n"); exit(24); } if(cdebug) { fprintf(newstdout,"Child sender bound to port %d Master port %d \n",tmp_port,HOST_LIST_PORT); fflush(newstdout); } again: nanosleep(&req,&rem); rc = connect(child_socket_val, (struct sockaddr *)&cs_raddr, sizeof(struct sockaddr_in)); if (rc < 0) { if((ecount++ < 200) && (errno != EISCONN)) { nanosleep(&req,&rem); /*sleep(1);*/ goto again; } if(cdebug) { fprintf(newstdout,"Child: connect failed. Errno %d \n",errno); fflush(newstdout); } close(child_socket_val); nanosleep(&req,&rem); /*sleep(1);*/ ecount=0; goto over; } ecount=0; if(cdebug) { fprintf(newstdout,"Child connected\n"); fflush(newstdout); } /* NOW send */ bzero(&outbuf, sizeof(struct master_neutral_command)); if(cdebug>=1) { fprintf(newstdout,"Child %d sending message to %s \n",(int)chid, controlling_host_name); fflush(newstdout); } /* * Convert internal commands to string format to neutral format for portability */ strcpy(outbuf.m_host_name,send_buffer->m_host_name); strcpy(outbuf.m_client_name,send_buffer->m_client_name); sprintf(outbuf.m_client_number,"%d",send_buffer->m_client_number); sprintf(outbuf.m_client_error,"%d",send_buffer->m_client_error); sprintf(outbuf.m_child_port,"%d",send_buffer->m_child_port); sprintf(outbuf.m_child_async_port,"%d",send_buffer->m_child_async_port); sprintf(outbuf.m_command,"%d",send_buffer->m_command); sprintf(outbuf.m_testnum,"%d",send_buffer->m_testnum); sprintf(outbuf.m_version,"%d",send_buffer->m_version); sprintf(outbuf.m_mygen,"%d",send_buffer->m_mygen); sprintf(outbuf.m_throughput,"%f",send_buffer->m_throughput); sprintf(outbuf.m_cputime,"%f", send_buffer->m_cputime); sprintf(outbuf.m_walltime,"%f",send_buffer->m_walltime); sprintf(outbuf.m_stop_flag,"%d",send_buffer->m_stop_flag); sprintf(outbuf.m_actual,"%f",send_buffer->m_actual); #ifdef NO_PRINT_LLD sprintf(outbuf.m_child_flag,"%ld",(long)(send_buffer->m_child_flag)); #else sprintf(outbuf.m_child_flag,"%lld",(long long)(send_buffer->m_child_flag)); #endif rc=write(child_socket_val,&outbuf,sizeof(struct master_neutral_command)); if (rc < 0) { perror("write failed\n"); exit(26); } close(child_socket_val); } /* * Master sending message to a child * There should be a unique child_socket_val for each * child. */ #ifdef HAVE_ANSIC_C void master_send(int child_socket_val, char *host_name, struct client_command *send_buffer, int send_size) #else void master_send(child_socket_val, host_name, send_buffer, send_size) int child_socket_val; char *host_name; struct client_command *send_buffer; int send_size; #endif { int rc; struct client_neutral_command outbuf; bzero(&outbuf,sizeof(struct client_neutral_command)); if(mdebug) { printf("Master_neutral_command size = %lu\n",(unsigned long)sizeof(struct master_neutral_command)); printf("Client_neutral_command size = %lu\n",(unsigned long)sizeof(struct client_neutral_command)); } /* * Convert internal commands to string format for neutral format/portability */ strcpy(outbuf.c_host_name,send_buffer->c_host_name); strcpy(outbuf.c_pit_hostname,send_buffer->c_pit_hostname); strcpy(outbuf.c_pit_service,send_buffer->c_pit_service); strcpy(outbuf.c_client_name,send_buffer->c_client_name); strcpy(outbuf.c_working_dir,send_buffer->c_working_dir); strcpy(outbuf.c_file_name,send_buffer->c_file_name); strcpy(outbuf.c_path_dir,send_buffer->c_path_dir); strcpy(outbuf.c_execute_name,send_buffer->c_execute_name); strcpy(outbuf.c_write_traj_filename,send_buffer->c_write_traj_filename); strcpy(outbuf.c_read_traj_filename,send_buffer->c_read_traj_filename); sprintf(outbuf.c_oflag,"%d",send_buffer->c_oflag); sprintf(outbuf.c_mfflag,"%d",send_buffer->c_mfflag); sprintf(outbuf.c_unbuffered,"%d",send_buffer->c_unbuffered); sprintf(outbuf.c_noretest,"%d",send_buffer->c_noretest); sprintf(outbuf.c_notruncate,"%d",send_buffer->c_notruncate); sprintf(outbuf.c_read_sync,"%d",send_buffer->c_read_sync); sprintf(outbuf.c_jflag,"%d",send_buffer->c_jflag); sprintf(outbuf.c_async_flag,"%d",send_buffer->c_async_flag); sprintf(outbuf.c_mmapflag,"%d",send_buffer->c_mmapflag); sprintf(outbuf.c_k_flag,"%d",send_buffer->c_k_flag); sprintf(outbuf.c_h_flag,"%d",send_buffer->c_h_flag); sprintf(outbuf.c_mflag,"%d",send_buffer->c_mflag); sprintf(outbuf.c_pflag,"%d",send_buffer->c_pflag); sprintf(outbuf.c_stride_flag,"%d",send_buffer->c_stride_flag); sprintf(outbuf.c_verify,"%d",send_buffer->c_verify); sprintf(outbuf.c_sverify,"%d",send_buffer->c_sverify); sprintf(outbuf.c_odsync,"%d",send_buffer->c_odsync); sprintf(outbuf.c_diag_v,"%d",send_buffer->c_diag_v); sprintf(outbuf.c_zero_pct,"%d",send_buffer->c_zero_pct); sprintf(outbuf.c_N_special,"%d",send_buffer->c_N_special); sprintf(outbuf.c_dedup_granule_size,"%d",send_buffer->c_dedup_granule_size); sprintf(outbuf.c_dedup,"%d",send_buffer->c_dedup); sprintf(outbuf.c_dedup_flag,"%d",send_buffer->c_dedup_flag); sprintf(outbuf.c_sparse_mode,"%d",send_buffer->c_sparse_mode); sprintf(outbuf.c_dedup_iflag,"%d",send_buffer->c_dedup_iflag); sprintf(outbuf.c_dedup_bflag,"%d",send_buffer->c_dedup_bflag); sprintf(outbuf.c_dedup_interior,"%d",send_buffer->c_dedup_interior); sprintf(outbuf.c_dedup_compress,"%d",send_buffer->c_dedup_compress); sprintf(outbuf.c_dedup_mseed,"%d",send_buffer->c_dedup_mseed); sprintf(outbuf.c_chid_skew,"%d",send_buffer->c_chid_skew); sprintf(outbuf.c_hist_summary,"%d",send_buffer->c_hist_summary); sprintf(outbuf.c_op_rate,"%d",send_buffer->c_op_rate); sprintf(outbuf.c_op_rate_flag,"%d",send_buffer->c_op_rate_flag); sprintf(outbuf.c_Q_flag,"%d",send_buffer->c_Q_flag); sprintf(outbuf.c_inc_think,"%d",send_buffer->c_inc_think); sprintf(outbuf.c_L_flag,"%d",send_buffer->c_L_flag); sprintf(outbuf.c_include_flush,"%d",send_buffer->c_include_flush); sprintf(outbuf.c_OPS_flag,"%d",send_buffer->c_OPS_flag); sprintf(outbuf.c_mmapnsflag,"%d",send_buffer->c_mmapnsflag); sprintf(outbuf.c_mmapssflag,"%d",send_buffer->c_mmapssflag); sprintf(outbuf.c_mmapasflag,"%d",send_buffer->c_mmapasflag); sprintf(outbuf.c_no_copy_flag,"%d",send_buffer->c_no_copy_flag); sprintf(outbuf.c_include_close,"%d",send_buffer->c_include_close); sprintf(outbuf.c_disrupt_flag,"%d",send_buffer->c_disrupt_flag); sprintf(outbuf.c_compute_flag,"%d",send_buffer->c_compute_flag); sprintf(outbuf.c_xflag,"%d",send_buffer->c_xflag); sprintf(outbuf.c_MS_flag,"%d",send_buffer->c_MS_flag); sprintf(outbuf.c_mmap_mix,"%d",send_buffer->c_mmap_mix); sprintf(outbuf.c_Kplus_flag,"%d",send_buffer->c_Kplus_flag); sprintf(outbuf.c_w_traj_flag,"%d",send_buffer->c_w_traj_flag); sprintf(outbuf.c_r_traj_flag,"%d",send_buffer->c_r_traj_flag); sprintf(outbuf.c_direct_flag,"%d",send_buffer->c_direct_flag); sprintf(outbuf.c_cpuutilflag,"%d",send_buffer->c_cpuutilflag); sprintf(outbuf.c_seq_mix,"%d",send_buffer->c_seq_mix); sprintf(outbuf.c_del_flag,"%d",send_buffer->c_del_flag); sprintf(outbuf.c_client_number,"%d",send_buffer->c_client_number); sprintf(outbuf.c_command,"%d",send_buffer->c_command); sprintf(outbuf.c_testnum,"%d",send_buffer->c_testnum); sprintf(outbuf.c_no_unlink,"%d",send_buffer->c_no_unlink); sprintf(outbuf.c_no_write,"%d",send_buffer->c_no_write); sprintf(outbuf.c_file_lock,"%d",send_buffer->c_file_lock); sprintf(outbuf.c_rec_lock,"%d",send_buffer->c_rec_lock); sprintf(outbuf.c_Kplus_readers,"%d",send_buffer->c_Kplus_readers); sprintf(outbuf.c_multiplier,"%d",send_buffer->c_multiplier); sprintf(outbuf.c_share_file,"%d",send_buffer->c_share_file); sprintf(outbuf.c_pattern,"%d",send_buffer->c_pattern); sprintf(outbuf.c_version,"%d",send_buffer->c_version); sprintf(outbuf.c_base_time,"%d",send_buffer->c_base_time); sprintf(outbuf.c_num_child,"%d",send_buffer->c_num_child); sprintf(outbuf.c_pct_read,"%d",send_buffer->c_pct_read); sprintf(outbuf.c_advise_op,"%d",send_buffer->c_advise_op); sprintf(outbuf.c_advise_flag,"%d",send_buffer->c_advise_flag); sprintf(outbuf.c_restf,"%d",send_buffer->c_restf); sprintf(outbuf.c_mygen,"%d",send_buffer->c_mygen); #ifdef NO_PRINT_LLD sprintf(outbuf.c_stride,"%ld"(long)(,send_buffer->c_stride)); sprintf(outbuf.c_rest_val,"%ld",(long)(send_buffer->c_rest_val)); sprintf(outbuf.c_delay,"%ld",(long)(send_buffer->c_delay)); sprintf(outbuf.c_purge,"%ld",(long)(send_buffer->c_purge)); sprintf(outbuf.c_fetchon,"%ld",(long)(send_buffer->c_fetchon)); sprintf(outbuf.c_numrecs64,"%ld",(long)(send_buffer->c_numrecs64)); sprintf(outbuf.c_reclen,"%ld",(long)(send_buffer->c_reclen)); sprintf(outbuf.c_child_flag,"%ld",(long)(send_buffer->c_child_flag)); sprintf(outbuf.c_delay_start,"%ld",(long)(send_buffer->c_delay_start)); sprintf(outbuf.c_depth,"%ld",(long)(send_buffer->c_depth)); #else sprintf(outbuf.c_delay,"%lld",(long long)(send_buffer->c_delay)); sprintf(outbuf.c_stride,"%lld",(long long)(send_buffer->c_stride)); sprintf(outbuf.c_rest_val,"%lld",(long long)(send_buffer->c_rest_val)); sprintf(outbuf.c_purge,"%lld",(long long)(send_buffer->c_purge)); sprintf(outbuf.c_fetchon,"%lld",(long long)(send_buffer->c_fetchon)); sprintf(outbuf.c_numrecs64,"%lld",(long long)(send_buffer->c_numrecs64)); sprintf(outbuf.c_reclen,"%lld",(long long)(send_buffer->c_reclen)); sprintf(outbuf.c_child_flag,"%lld",(long long)(send_buffer->c_child_flag)); sprintf(outbuf.c_delay_start,"%lld",(long long)(send_buffer->c_delay_start)); sprintf(outbuf.c_depth,"%lld",(long long)(send_buffer->c_depth)); #endif sprintf(outbuf.c_stop_flag,"%d",send_buffer->c_stop_flag); sprintf(outbuf.c_compute_time,"%f",send_buffer->c_compute_time); if(mdebug >= 1) printf("Master sending message to %s \n",host_name); /*rc = send(child_socket_val, (char *)&outbuf, sizeof(struct client_neutral_command), 0);*/ rc = write(child_socket_val, (char *)&outbuf, sizeof(struct client_neutral_command)); if (rc < 0) { perror("write failed\n"); exit(26); } } /* * Close the childs listening port for messages from the master. */ #ifdef HAVE_ANSIC_C void stop_child_listen(int child_socket_val) #else void stop_child_listen(child_socket_val) int child_socket_val; #endif { close(child_socket_val); } /* * Close the childs channel for sending messages to the master. */ #ifdef HAVE_ANSIC_C void O_stop_child_send(int child_socket_val) #else void O_stop_child_send(child_socket_val) int child_socket_val; #endif { close(child_socket_val); } /* * Close the masters listening channel for all clients messages. */ #ifdef HAVE_ANSIC_C void stop_master_listen(int master_socket_val) #else void stop_master_listen(master_socket_val) int master_socket_val; #endif { if(mdebug) printf("Stop master listen\n"); /* shutdown(master_socket_val,SHUT_RDWR); */ close(master_socket_val); master_socket_val = 0; } /* * Close the masters send channel a particular child. */ #ifdef HAVE_ANSIC_C void stop_master_send(int child_socket_val) #else void stop_master_send(child_socket_val) int child_socket_val; #endif { close(child_socket_val); } /* * Start the childs listening service for messages from the master. */ #ifdef HAVE_ANSIC_C int start_child_listen(int size_of_message) #else int start_child_listen(size_of_message) int size_of_message; #endif { int tsize; int s; int rc; int xx; int tmp_port; int sockerr; int recv_buf_size=65536; int optval=1; struct linger dummy={1,0}; xx = 0; tsize=size_of_message; /* Number of messages to receive */ s = socket(AF_INET, SOCK_STREAM, 0); if (s < 0) { perror("socket failed:"); exit(19); } sockerr = setsockopt (s, SOL_SOCKET, SO_RCVBUF, (char *) &recv_buf_size, sizeof(int)); if ( sockerr == -1 ) { perror("Error in setsockopt 3\n"); } sockerr = setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (char *) &optval, sizeof(int)); if ( sockerr == -1 ) { perror("Error in setsockopt 4\n"); } sockerr = setsockopt (s, SOL_SOCKET, SO_LINGER, (char *) &dummy, sizeof(struct linger)); if ( sockerr == -1 ) { perror("Error in setsockopt 4\n"); } bzero(&child_sync_sock, sizeof(struct sockaddr_in)); tmp_port=CHILD_LIST_PORT+chid; child_sync_sock.sin_port = htons(tmp_port); child_sync_sock.sin_family = AF_INET; child_sync_sock.sin_addr.s_addr = INADDR_ANY; rc = -1; while (rc < 0) { rc = bind(s, (struct sockaddr *)&child_sync_sock, sizeof(struct sockaddr_in)); if(rc < 0) { tmp_port++; child_sync_sock.sin_port=htons(tmp_port); continue; } } child_port = ntohs(child_sync_sock.sin_port); if(cdebug ==1) { fprintf(newstdout,"Child %d: Listen: Bound at port %d\n",(int)chid, tmp_port); fflush(newstdout); } if(rc < 0) { fprintf(newstdout,"Child bind failed. Errno %d\n",errno); fflush(newstdout); exit(20); } return(s); } #ifdef HAVE_ANSIC_C int child_attach(int s, int flag) #else int child_attach(s, flag) int s,flag; #endif { unsigned int me; int ns; struct sockaddr_in *addr; if(flag) { addr=&child_async_sock; if(cdebug) { fprintf(newstdout,"Child %d attach async\n",(int)chid); fflush(newstdout); } } else { addr=&child_sync_sock; if(cdebug) { fprintf(newstdout,"Child %d attach sync\n",(int)chid); fflush(newstdout); } } me=sizeof(struct sockaddr_in); if(cdebug) { printf("Child %d enters listen\n",(int)chid); fflush(stdout); } listen(s,10); if(cdebug) { fprintf(newstdout,"Child %d enters accept\n",(int)chid); fflush(newstdout); } #if defined(ANDROID) ns=accept((int)s,(struct sockaddr *)addr,(socklen_t *)&me); #else ns=accept(s,(void *)addr,&me); #endif if(cdebug) { fprintf(newstdout,"Child %d attached for receive. Sock %d %d\n", (int)chid, ns,errno); fflush(newstdout); } return(ns); } /* * The clients use this to block waiting for a message from * the master. */ #ifdef HAVE_ANSIC_C void child_listen(int sock, int size_of_message) #else void child_listen(sock, size_of_message) int sock, size_of_message; #endif { int tsize; int rcvd; int s; int rc; char *cnc; cnc = (char *)&child_rcv_buf[0]; bzero(cnc, sizeof(child_rcv_buf)); s = sock; tsize=size_of_message; /* Number of messages to receive */ rcvd = 0; while(rcvd < tsize) { if(cdebug ==1) { fprintf(newstdout,"Child %d In recieve \n",(int)chid); fflush(newstdout); } rc=read(s,cnc,size_of_message); if(rc < 0) { fprintf(newstdout,"Read failed. Errno %d \n",errno); fflush(newstdout); exit(21); } if(cdebug >= 1) { fprintf(newstdout,"Child %d: Got %d bytes\n",(int)chid, rc); fflush(newstdout); } rcvd+=rc; cnc+=rc; } if(cdebug >= 1) { fprintf(newstdout,"Child %d: return from listen\n",(int)chid); fflush(newstdout); } } /* * Start the childs async listening service for messages from the master. */ #ifdef HAVE_ANSIC_C int start_child_listen_async(int size_of_message) #else int start_child_listen_async(size_of_message) int size_of_message; #endif { int tsize; int s; int rc; int xx; int tmp_port; int sockerr; int recv_buf_size=65536; int optval=1; xx = 0; tsize=size_of_message; /* Number of messages to receive */ s = socket(AF_INET, SOCK_STREAM, 0); if (s < 0) { perror("socket failed:"); exit(19); } sockerr = setsockopt (s, SOL_SOCKET, SO_RCVBUF, (char *) &recv_buf_size, sizeof(int)); if ( sockerr == -1 ) { perror("Error in setsockopt 5\n"); } sockerr = setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (char *) &optval, sizeof(int)); if ( sockerr == -1 ) { perror("Error in setsockopt 6\n"); } bzero(&child_async_sock, sizeof(struct sockaddr_in)); tmp_port=CHILD_ALIST_PORT; child_async_sock.sin_port = htons(tmp_port); child_async_sock.sin_family = AF_INET; child_async_sock.sin_addr.s_addr = INADDR_ANY; rc = -1; while (rc < 0) { rc = bind(s, (struct sockaddr *)&child_async_sock, sizeof(struct sockaddr_in)); if(rc < 0) { tmp_port++; child_async_sock.sin_port=htons(tmp_port); continue; } } child_async_port = ntohs(child_async_sock.sin_port); if(cdebug ==1) { fprintf(newstdout,"Child %d: Async Listen: Bound at port %d\n", (int)chid,tmp_port); fflush(newstdout); } if(rc < 0) { fprintf(newstdout,"bind failed. Errno %d \n",errno); fflush(newstdout); exit(20); } return(s); } /* * The clients use this to block waiting for an async message from * the master. */ #ifdef HAVE_ANSIC_C void child_listen_async(int sock, int size_of_message) #else void child_listen_async(sock, size_of_message) int sock, size_of_message; #endif { int tsize; int rcvd; int s; int rc; char *cnc; cnc = &child_async_rcv_buf[0]; s = sock; tsize=size_of_message; /* Number of messages to receive */ rcvd = 0; while(rcvd < tsize) { if(cdebug ==1) { fprintf(newstdout,"Child %d In async recieve \n",(int)chid); fflush(newstdout); } rc=read(s,cnc,size_of_message); if(rc < 0) { fprintf(newstdout,"Read failed. Errno %d \n",errno); fflush(newstdout); exit(21); } /* Special case. If master gets final results, it can exit, and close the connection to the async child too quickly. When this happens the child gets a read() that returns 0. It just needs to exit here. */ if(rc==0) exit(0); if(cdebug >= 1) { fprintf(newstdout,"Child %d: Got %d bytes (async) \n",(int)chid,rc); fflush(newstdout); } rcvd+=rc; cnc+=rc; } if(cdebug >= 1) { fprintf(newstdout,"Child %d: return from async listen\n",(int)chid); fflush(newstdout); } } /* * Start the channel for the master to send a message to * a particular child on a particular port that the child * has created for the parent to use to communicate. */ #ifdef HAVE_ANSIC_C int start_master_send(char *child_host_name, int child_port, struct in_addr *my_s_addr) #else int start_master_send(child_host_name, child_port, my_s_addr) char *child_host_name; int child_port; struct in_addr *my_s_addr; #endif { int rc,master_socket_val; struct sockaddr_in addr,raddr; struct hostent *he; int port,tmp_port; int ecount = 0; struct in_addr *ip; struct timespec req,rem; req.tv_sec = 0; req.tv_nsec = 10000000; rem.tv_sec = 0; rem.tv_nsec = 10000000; he = gethostbyname(child_host_name); if (he == NULL) { printf("Master: Bad hostname >%s<\n",child_host_name); fflush(stdout); exit(22); } if(mdebug ==1) { printf("Master: start master send: %s\n", he->h_name); fflush(stdout); } ip = (struct in_addr *)he->h_addr_list[0]; #ifndef UWIN if(mdebug ==1) { printf("Master: child name: %s\n", (char *)inet_ntoa(*ip)); printf("Master: child Port: %d\n", child_port); fflush(stdout); } #endif port=child_port; my_s_addr->s_addr = ip->s_addr; /*port=CHILD_LIST_PORT;*/ raddr.sin_family = AF_INET; raddr.sin_port = htons(port); raddr.sin_addr.s_addr = ip->s_addr; master_socket_val = socket(AF_INET, SOCK_STREAM, 0); if (master_socket_val < 0) { perror("Master: socket failed:"); exit(23); } bzero(&addr, sizeof(struct sockaddr_in)); tmp_port=HOST_ESEND_PORT; addr.sin_port = htons(tmp_port); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; rc = -1; while (rc < 0) { rc = bind(master_socket_val, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); if(rc < 0) { tmp_port++; addr.sin_port=htons(tmp_port); continue; } } if(mdebug ==1) { printf("Master: Bound port\n"); fflush(stdout); } if (rc < 0) { perror("Master: bind failed for sync channel to child.\n"); exit(24); } nanosleep(&req,&rem); again: rc = connect(master_socket_val, (struct sockaddr *)&raddr, sizeof(struct sockaddr_in)); if (rc < 0) { if(ecount++ < 300) { nanosleep(&req,&rem); /*sleep(1);*/ goto again; } perror("Master: connect failed\n"); printf("Error %d\n",errno); exit(25); } if(mdebug ==1) { printf("Master Connected\n"); fflush(stdout); } return (master_socket_val); } /* * Start the channel for the master to send a message to * a particular child on a particular port that the child * has created for the parent to use to communicate. */ #ifdef HAVE_ANSIC_C int start_master_send_async(char *child_host_name, int child_port, struct in_addr my_s_addr) #else int start_master_send_async(child_host_name, child_port, my_s_addr) char *child_host_name; int child_port; struct in_addr my_s_addr; #endif { int rc,master_socket_val; struct sockaddr_in addr,raddr; int port,tmp_port; int ecount = 0; struct timespec req,rem; req.tv_sec = 0; req.tv_nsec = 10000000; rem.tv_sec = 0; rem.tv_nsec = 10000000; port=child_port; nanosleep(&req,&rem); over: raddr.sin_family = AF_INET; raddr.sin_port = htons(port); raddr.sin_addr.s_addr = my_s_addr.s_addr; master_socket_val = socket(AF_INET, SOCK_STREAM, 0); if (master_socket_val < 0) { perror("Master: async socket failed:"); exit(23); } bzero(&addr, sizeof(struct sockaddr_in)); tmp_port=HOST_ASEND_PORT; addr.sin_port = htons(tmp_port); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; rc = -1; while (rc < 0) { rc = bind(master_socket_val, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); if(rc < 0) { tmp_port++; addr.sin_port=htons(tmp_port); continue; } } if(mdebug ==1) { printf("Master: Bound async port\n"); fflush(stdout); } if (rc < 0) { perror("Master: bind async failed\n"); exit(24); } again: rc = connect(master_socket_val, (struct sockaddr *)&raddr, sizeof(struct sockaddr_in)); if (rc < 0) { if(ecount++ < 300) { /* Really need this sleep for Windows */ #if defined (Windows) sleep(1); #else nanosleep(&req,&rem); #endif goto again; } perror("Master: async connect failed\n"); close(master_socket_val); #if defined (Windows) sleep(1); #else nanosleep(&req,&rem); #endif /*sleep(1);*/ ecount=0; goto over; } if(mdebug ==1) { printf("Master async Connected\n"); fflush(stdout); } return (master_socket_val); } /* * If not "distributed" then call fork. The "distributed" * will start iozone on a remote node. */ #ifdef HAVE_ANSIC_C long long start_child_proc(int testnum,long long numrecs64, long long reclen) #else long long start_child_proc(testnum, numrecs64, reclen) int testnum; long long numrecs64, reclen; #endif { long long x; if(distributed && master_iozone) { x=(long long)pick_client(testnum,numrecs64, reclen); } else { x=(long long)fork(); } if(mdebug) printf("Starting proc %d\n",(int)x); return(x); } /* * This function picks a client from the list of clients and * starts it running on the remote machine. It also waits for * the remote process to join and then sends the client * the state information it needs to begin to run the * test. The client will initialize its state space, * begin the test and block as the barrier waiting * for the master to say go. */ #ifdef HAVE_ANSIC_C int pick_client(int testnum,long long numrecs64, long long reclen) #else int pick_client(testnum, numrecs64, reclen) int testnum; long long numrecs64, reclen; #endif { int x; int c_command,child_index; struct client_command cc; struct master_command mc; struct master_neutral_command *mnc; char command[512]; struct in_addr my_s_addr; char my_port_num[12]; bzero(&cc,sizeof(struct client_command)); for(x=0;x<512;x++) command[x]=0; current_client_number++; /* Need to start with 1 */ x=current_client_number; child_idents[x-1].state = C_STATE_ZERO; /* Step 1. Now start client going on remote node. */ find_remote_shell(remote_shell); sprintf(command,"%s ",remote_shell); strcat(command,child_idents[x-1].child_name); strcat(command," -n '"); strcat(command,child_idents[x-1].execute_path); strcat(command," -+s -t 1 -r 4 -s 4 -+c "); strcat(command,controlling_host_name); if (master_listen_port != HOST_LIST_PORT) { sprintf(my_port_num," -+i %d",master_listen_port); strcat(command,my_port_num); } strcat(command," '"); usleep(100000); /* Don't spawn rsh too fast... */ junk=system(command); /* system("remsh rsnperf '/home/capps/niozone/iozone -+s -t 1 -r 4 -s 8 -+c rsnperf'"); */ if(mdebug) printf("%s",command); /* Format example: */ /* */ /* system("remsh rsnperf '/home/capps/niozone/iozone */ /* -+s -t 1 -r 4 -s 8 -+c rsnperf'"); */ /* */ /* Step 2. Wait for join from new client. */ child_idents[x-1].state = C_STATE_WAIT_WHO; if(mdebug>=1) printf("\nMaster listening for child to send join message.\n"); master_listen(master_listen_socket,sizeof(struct master_neutral_command)); mnc = (struct master_neutral_command *)&master_rcv_buf[0]; /* * Convert from string format back to internal representation */ sscanf(mnc->m_child_port,"%d",&mc.m_child_port); sscanf(mnc->m_child_async_port,"%d",&mc.m_child_async_port); sscanf(mnc->m_command,"%d",&mc.m_command); sscanf(mnc->m_version,"%d",&mc.m_version); if(mc.m_version != proto_version) { printf("Client > %s < is not running the same version of Iozone !! C%d M%d\n", child_idents[x-1].child_name, mc.m_version, proto_version); } c_port = mc.m_child_port; a_port = mc.m_child_async_port; c_command = mc.m_command; if(mdebug>=1) { printf("Master back from listen child Joined.\n"); printf("Master: Command %d\n",c_command); } /* Step 3. Then start_master_send() for this client. */ if(mdebug>=1) printf("Starting master send channel\n"); master_send_sockets[x-1]= start_master_send(child_idents[x-1].child_name,c_port, &my_s_addr); if(mdebug>=1) printf("Starting master send async channel\n"); master_send_async_sockets[x-1]= start_master_send_async(child_idents[x-1].child_name,a_port, my_s_addr); child_idents[x-1].master_socket_num = master_send_sockets[x-1]; child_idents[x-1].master_async_socket_num = master_send_async_sockets[x-1]; child_idents[x-1].child_number = x-1; child_idents[x-1].child_port = c_port; child_idents[x-1].child_async_port = a_port; /* */ /* Step 4. Send message to client telling him his name, number, */ /* rsize, fsize, and test to run. */ strcpy(cc.c_host_name ,controlling_host_name); strcpy(cc.c_pit_hostname ,pit_hostname); strcpy(cc.c_pit_service ,pit_service); strcpy(cc.c_client_name ,child_idents[x-1].child_name); strcpy(cc.c_working_dir ,child_idents[x-1].workdir); strcpy(cc.c_file_name ,child_idents[x-1].file_name); strcpy(cc.c_write_traj_filename ,write_traj_filename); strcpy(cc.c_read_traj_filename ,read_traj_filename); cc.c_command = R_JOIN_ACK; cc.c_client_number = x-1; cc.c_testnum = testnum; cc.c_numrecs64 = numrecs64; cc.c_reclen = reclen; cc.c_oflag = oflag; cc.c_mfflag = mfflag; cc.c_unbuffered = unbuffered; cc.c_noretest = noretest; cc.c_notruncate = notruncate; cc.c_read_sync = read_sync; cc.c_jflag = jflag; cc.c_direct_flag = direct_flag; cc.c_cpuutilflag = cpuutilflag; cc.c_seq_mix = seq_mix; cc.c_del_flag = del_flag; cc.c_async_flag = async_flag; cc.c_k_flag = k_flag; cc.c_h_flag = h_flag; cc.c_mflag = mflag; cc.c_pflag = pflag; cc.c_stride_flag = stride_flag; cc.c_fetchon = fetchon; cc.c_verify = verify; cc.c_sverify = sverify; cc.c_odsync = odsync; cc.c_diag_v = diag_v; cc.c_zero_pct = zero_pct; cc.c_N_special = N_special; cc.c_dedup_granule_size = dedup_granule_size; cc.c_dedup_flag = dedup_flag; cc.c_sparse_mode = sparse_mode; cc.c_dedup_iflag = dedup_iflag; cc.c_dedup_bflag = dedup_bflag; cc.c_dedup = dedup; cc.c_dedup_interior = dedup_interior; cc.c_dedup_compress = dedup_compress; cc.c_dedup_mseed = dedup_mseed; cc.c_chid_skew = chid_skew; cc.c_hist_summary = hist_summary; cc.c_op_rate = op_rate; cc.c_op_rate_flag = op_rate_flag; cc.c_file_lock = file_lock; cc.c_rec_lock = rlocking; cc.c_Kplus_readers = Kplus_readers; cc.c_multiplier = multiplier; cc.c_share_file = share_file; cc.c_pattern = pattern; cc.c_version = proto_version; cc.c_base_time = base_time; cc.c_num_child = (int)num_child; cc.c_pct_read = pct_read; cc.c_advise_op = advise_op; cc.c_advise_flag = advise_flag; cc.c_restf = restf; cc.c_mygen = mygen; cc.c_Q_flag = Q_flag; cc.c_inc_think = inc_think; cc.c_L_flag = L_flag; cc.c_xflag = xflag; cc.c_w_traj_flag = w_traj_flag; cc.c_r_traj_flag = r_traj_flag; cc.c_include_flush = include_flush; cc.c_OPS_flag = OPS_flag; cc.c_purge = purge; cc.c_mmapflag = mmapflag; cc.c_mmapasflag = mmapasflag; cc.c_mmapnsflag = mmapnsflag; cc.c_mmapssflag = mmapssflag; cc.c_no_copy_flag = no_copy_flag; cc.c_no_unlink = no_unlink; cc.c_no_write = no_write; cc.c_include_close = include_close; cc.c_disrupt_flag = disrupt_flag; cc.c_compute_flag = compute_flag; cc.c_delay = delay; cc.c_stride = stride; cc.c_rest_val = rest_val; cc.c_delay_start = delay_start; cc.c_compute_time = compute_time; cc.c_depth = depth; cc.c_MS_flag = MS_flag; cc.c_mmap_mix = mmap_mix; cc.c_Kplus_flag = Kplus_flag; if(mdebug) printf("Master sending client who he is\n"); master_send(master_send_sockets[x-1],cc.c_client_name, &cc,sizeof(struct client_command)); child_idents[x-1].state = C_STATE_WAIT_BARRIER; /* */ /* Step 5. Wait until you receive message that the chile is at */ /* the barrier. */ if(mdebug>=1) printf("Master listening for child to send at barrier message.\n"); master_listen(master_listen_socket,sizeof(struct master_neutral_command)); mnc = (struct master_neutral_command *)&master_rcv_buf[0]; /* * Convert from string back to arch specific */ sscanf(mnc->m_client_number,"%d",&mc.m_client_number); #ifdef NO_PRINT_LLD sscanf(mnc->m_child_flag,"%ld",(long *)&mc.m_child_flag); #else sscanf(mnc->m_child_flag,"%lld",(long long *)&mc.m_child_flag); #endif child_index = mc.m_client_number; child_stat = (struct child_stats *)&shmaddr[child_index]; child_stat->flag = (long long)(mc.m_child_flag); if(mdebug>=1) printf("Master sees child %d at barrier message.\n",child_index); return(x); /* Tell code above that it is the parent returning */ } /****************************************************************************************/ /* This is the code that the client will use when it */ /* gets started via remote shell. It is activated by the -+c controller_name option. */ /* */ /* The steps to this process are: */ /* 1. Start client receive channel */ /* 2. Start client send channel */ /* 3. Send message to controller saying I'm joining. */ /* 4. Go into a loop and get all instructions from */ /* 5. Get state information from the master */ /* 6. Change to the working directory */ /* 7. Run the test */ /* 8. Release the listen and send sockets to the master */ /* */ /****************************************************************************************/ #ifdef HAVE_ANSIC_C void become_client(void) #else void become_client() #endif { int x,testnum; struct master_command mc; struct client_command cc; struct client_neutral_command *cnc; char client_name[100]; char *workdir; bzero(&mc,sizeof(struct master_command)); x=fork(); /* Become a daemon so that remote shell will return. */ if(x != 0) exit(0); /* * I am the child */ (void)gethostname(client_name,100); fflush(stdout); fflush(stderr); if(cdebug) { newstdin=freopen("/tmp/don_in","r+",stdin); newstdout=freopen("/tmp/don_out","a+",stdout); newstderr=freopen("/tmp/don_err","a+",stderr); } else { fclose(stdin); fclose(stdout); fclose(stderr); } if(cdebug>=1) { fprintf(newstdout,"My name = %s, Controller's name = %s\n",client_name, controlling_host_name); fflush(newstdout); } /* 1. Start client receive channel */ l_sock = start_child_listen(sizeof(struct client_neutral_command)); l_async_sock = start_child_listen_async(sizeof(struct client_neutral_command)); /* 2. Send message to controller saying I'm joining. */ strcpy(mc.m_host_name,controlling_host_name); strcpy(mc.m_client_name,client_name); mc.m_child_port = child_port; mc.m_child_async_port = child_async_port; mc.m_command = R_CHILD_JOIN; mc.m_version = proto_version; if(cdebug) { fprintf(newstdout,"Child %s sends JOIN to master %s Host Port %d\n", client_name,controlling_host_name,controlling_host_port); fflush(newstdout); } child_send(controlling_host_name,(struct master_command *)&mc, sizeof(struct master_command)); l_sock=child_attach(l_sock,0); l_async_sock=child_attach(l_async_sock,1); /* 4. Go into a loop and get all instructions from */ /* the controlling process. */ if(cdebug>=1) { fprintf(newstdout,"Child %s waiting for who am I\n",client_name); fflush(newstdout); } child_listen(l_sock,sizeof(struct client_neutral_command)); cnc = (struct client_neutral_command *)&child_rcv_buf; bzero(&cc, sizeof(struct client_command)); /* Convert from string format to arch format */ sscanf(cnc->c_command,"%d",&cc.c_command); sscanf(cnc->c_client_name,"%s",cc.c_client_name); sscanf(cnc->c_client_number,"%d",&cc.c_client_number); sscanf(cnc->c_host_name,"%s",cc.c_host_name); sscanf(cnc->c_pit_hostname,"%s",cc.c_pit_hostname); if(cc.c_command == R_TERMINATE || cc.c_command==R_DEATH) { if(cdebug) { fprintf(newstdout,"Child %d received terminate on sync channel !!\n",(int)chid); fflush(newstdout); } exit(1); } if(cdebug) { fprintf(newstdout,"Child sees: \n Client name %s \n Client_num # %d \n Host_name %s\n" ,cc.c_client_name,cc.c_client_number,cc.c_host_name); fflush(newstdout); } /* * Now import all of the values of the flags that the child on this * machine needs to be able to run the test requested. */ /* 5. Get state information from the master */ #ifdef NO_PRINT_LLD sscanf(cnc->c_numrecs64,"%ld",(long *)(&cc.c_numrecs64)); sscanf(cnc->c_reclen,"%ld",(long *)(&cc.c_reclen)); sscanf(cnc->c_fetchon,"%ld",(long *)(&cc.c_fetchon)); sscanf(cnc->c_purge,"%ld",(long *)(&cc.c_purge)); sscanf(cnc->c_delay,"%ld",(long *)(&cc.c_delay)); sscanf(cnc->c_stride,"%ld",(long *)(&cc.c_stride)); sscanf(cnc->c_rest_val,"%ld",(long *)(&cc.c_rest_val)); sscanf(cnc->c_delay_start,"%ld",(long *)(&cc.c_delay_start)); sscanf(cnc->c_depth,"%ld",(long *)(&cc.c_depth)); #else sscanf(cnc->c_numrecs64,"%lld",(long long *)(&cc.c_numrecs64)); sscanf(cnc->c_reclen,"%lld",(long long *)(&cc.c_reclen)); sscanf(cnc->c_fetchon,"%lld",(long long *)(&cc.c_fetchon)); sscanf(cnc->c_purge,"%lld",(long long *)(&cc.c_purge)); sscanf(cnc->c_delay,"%lld",(long long *)(&cc.c_delay)); sscanf(cnc->c_stride,"%lld",(long long *)(&cc.c_stride)); sscanf(cnc->c_rest_val,"%lld",(long long *)(&cc.c_rest_val)); sscanf(cnc->c_delay_start,"%lld",(long long *)(&cc.c_delay_start)); sscanf(cnc->c_depth,"%lld",(long long *)(&cc.c_depth)); #endif sscanf(cnc->c_pit_hostname,"%s",cc.c_pit_hostname); sscanf(cnc->c_pit_service,"%s",cc.c_pit_service); sscanf(cnc->c_testnum,"%d",&cc.c_testnum); sscanf(cnc->c_client_number,"%d",&cc.c_client_number); sscanf(cnc->c_working_dir,"%s",cc.c_working_dir); sscanf(cnc->c_file_name,"%s",cc.c_file_name); sscanf(cnc->c_write_traj_filename,"%s",cc.c_write_traj_filename); sscanf(cnc->c_read_traj_filename,"%s",cc.c_read_traj_filename); sscanf(cnc->c_noretest,"%d",&cc.c_noretest); sscanf(cnc->c_notruncate,"%d",&cc.c_notruncate); sscanf(cnc->c_read_sync,"%d",&cc.c_read_sync); sscanf(cnc->c_jflag,"%d",&cc.c_jflag); sscanf(cnc->c_direct_flag,"%d",&cc.c_direct_flag); sscanf(cnc->c_cpuutilflag,"%d",&cc.c_cpuutilflag); sscanf(cnc->c_seq_mix,"%d",&cc.c_seq_mix); sscanf(cnc->c_del_flag,"%d",&cc.c_del_flag); sscanf(cnc->c_async_flag,"%d",&cc.c_async_flag); sscanf(cnc->c_k_flag,"%d",&cc.c_k_flag); sscanf(cnc->c_h_flag,"%d",&cc.c_h_flag); sscanf(cnc->c_mflag,"%d",&cc.c_mflag); sscanf(cnc->c_pflag,"%d",&cc.c_pflag); sscanf(cnc->c_stride_flag,"%d",&cc.c_stride_flag); sscanf(cnc->c_verify,"%d",&cc.c_verify); sscanf(cnc->c_sverify,"%d",&cc.c_sverify); sscanf(cnc->c_odsync,"%d",&cc.c_odsync); sscanf(cnc->c_diag_v,"%d",&cc.c_diag_v); sscanf(cnc->c_zero_pct,"%d",&cc.c_zero_pct); sscanf(cnc->c_N_special,"%d",&cc.c_N_special); sscanf(cnc->c_dedup_granule_size,"%d",&cc.c_dedup_granule_size); sscanf(cnc->c_dedup_flag,"%d",&cc.c_dedup_flag); sscanf(cnc->c_sparse_mode,"%d",&cc.c_sparse_mode); sscanf(cnc->c_dedup_iflag,"%d",&cc.c_dedup_iflag); sscanf(cnc->c_dedup_bflag,"%d",&cc.c_dedup_bflag); sscanf(cnc->c_dedup,"%d",&cc.c_dedup); sscanf(cnc->c_dedup_interior,"%d",&cc.c_dedup_interior); sscanf(cnc->c_dedup_compress,"%d",&cc.c_dedup_compress); sscanf(cnc->c_dedup_mseed,"%d",&cc.c_dedup_mseed); sscanf(cnc->c_chid_skew,"%d",&cc.c_chid_skew); sscanf(cnc->c_hist_summary,"%d",&cc.c_hist_summary); sscanf(cnc->c_op_rate,"%d",&cc.c_op_rate); sscanf(cnc->c_op_rate_flag,"%d",&cc.c_op_rate_flag); sscanf(cnc->c_file_lock,"%d",&cc.c_file_lock); sscanf(cnc->c_rec_lock,"%d",&cc.c_rec_lock); sscanf(cnc->c_Kplus_readers,"%d",&cc.c_Kplus_readers); sscanf(cnc->c_multiplier,"%d",&cc.c_multiplier); sscanf(cnc->c_share_file,"%d",&cc.c_share_file); sscanf(cnc->c_pattern,"%d",&cc.c_pattern); sscanf(cnc->c_version,"%d",&cc.c_version); sscanf(cnc->c_base_time,"%d",&cc.c_base_time); sscanf(cnc->c_num_child,"%d",&cc.c_num_child); sscanf(cnc->c_pct_read,"%d",&cc.c_pct_read); sscanf(cnc->c_advise_op,"%d",&cc.c_advise_op); sscanf(cnc->c_advise_flag,"%d",&cc.c_advise_flag); sscanf(cnc->c_restf,"%d",&cc.c_restf); sscanf(cnc->c_mygen,"%d",&cc.c_mygen); sscanf(cnc->c_oflag,"%d",&cc.c_oflag); sscanf(cnc->c_mfflag,"%d",&cc.c_mfflag); sscanf(cnc->c_unbuffered,"%d",&cc.c_unbuffered); sscanf(cnc->c_Q_flag,"%d",&cc.c_Q_flag); sscanf(cnc->c_inc_think,"%d",&cc.c_inc_think); sscanf(cnc->c_L_flag,"%d",&cc.c_L_flag); sscanf(cnc->c_xflag,"%d",&cc.c_xflag); sscanf(cnc->c_include_flush,"%d",&cc.c_include_flush); sscanf(cnc->c_OPS_flag,"%d",&cc.c_OPS_flag); sscanf(cnc->c_mmapflag,"%d",&cc.c_mmapflag); sscanf(cnc->c_mmapasflag,"%d",&cc.c_mmapasflag); sscanf(cnc->c_mmapnsflag,"%d",&cc.c_mmapnsflag); sscanf(cnc->c_mmapssflag,"%d",&cc.c_mmapssflag); sscanf(cnc->c_no_copy_flag,"%d",&cc.c_no_copy_flag); sscanf(cnc->c_w_traj_flag,"%d",&cc.c_w_traj_flag); sscanf(cnc->c_r_traj_flag,"%d",&cc.c_r_traj_flag); sscanf(cnc->c_no_unlink,"%d",&cc.c_no_unlink); sscanf(cnc->c_no_write,"%d",&cc.c_no_write); sscanf(cnc->c_include_close,"%d",&cc.c_include_close); sscanf(cnc->c_disrupt_flag,"%d",&cc.c_disrupt_flag); sscanf(cnc->c_compute_flag,"%d",&cc.c_compute_flag); sscanf(cnc->c_MS_flag,"%d",&cc.c_MS_flag); sscanf(cnc->c_mmap_mix,"%d",&cc.c_mmap_mix); sscanf(cnc->c_Kplus_flag,"%d",&cc.c_Kplus_flag); sscanf(cnc->c_compute_time,"%f",&cc.c_compute_time); strcpy(write_traj_filename,cc.c_write_traj_filename); strcpy(read_traj_filename,cc.c_read_traj_filename); numrecs64 = cc.c_numrecs64; strcpy(pit_hostname,cc.c_pit_hostname); strcpy(pit_service,cc.c_pit_service); reclen = cc.c_reclen; testnum = cc.c_testnum; chid = cc.c_client_number; workdir=cc.c_working_dir; oflag = cc.c_oflag; /* Child's absolute filename to use is provided */ mfflag = cc.c_mfflag; if(mfflag) strcpy(filearray[chid],cc.c_file_name); if(cdebug) { fprintf(newstdout,"File name given %s\n",cc.c_file_name); fflush(newstdout); } unbuffered = cc.c_unbuffered; noretest = cc.c_noretest; notruncate = cc.c_notruncate; read_sync = cc.c_read_sync; jflag = cc.c_jflag; direct_flag = cc.c_direct_flag; cpuutilflag = cc.c_cpuutilflag; seq_mix = cc.c_seq_mix; del_flag = cc.c_del_flag; async_flag = cc.c_async_flag; k_flag = cc.c_k_flag; h_flag = cc.c_h_flag; mflag = cc.c_mflag; pflag = cc.c_pflag; stride_flag = cc.c_stride_flag; fetchon = cc.c_fetchon; verify = cc.c_verify; diag_v = cc.c_diag_v; zero_pct = cc.c_zero_pct; N_special = cc.c_N_special; dedup_granule_size = cc.c_dedup_granule_size; dedup = cc.c_dedup; sparse_mode = cc.c_sparse_mode; dedup_flag = cc.c_dedup_flag; dedup_iflag = cc.c_dedup_iflag; dedup_bflag = cc.c_dedup_bflag; dedup_interior = cc.c_dedup_interior; dedup_compress = cc.c_dedup_compress; dedup_mseed = cc.c_dedup_mseed; chid_skew = cc.c_chid_skew; hist_summary = cc.c_hist_summary; op_rate = cc.c_op_rate; op_rate_flag = cc.c_op_rate_flag; if(diag_v) sverify = 0; else sverify = cc.c_sverify; file_lock = cc.c_file_lock; rlocking = cc.c_rec_lock; Kplus_readers = cc.c_Kplus_readers; multiplier = cc.c_multiplier; share_file = cc.c_share_file; pattern = cc.c_pattern; /* proto_version = cc.c_version; Don't copy it back. */ base_time=cc.c_base_time; num_child=(long long)cc.c_num_child; pct_read=cc.c_pct_read; advise_op=cc.c_advise_op; advise_flag=cc.c_advise_flag; restf=cc.c_restf; mygen=cc.c_mygen; Q_flag = cc.c_Q_flag; inc_think = cc.c_inc_think; L_flag = cc.c_L_flag; xflag = cc.c_xflag; w_traj_flag = cc.c_w_traj_flag; r_traj_flag = cc.c_r_traj_flag; include_flush = cc.c_include_flush; OPS_flag = cc.c_OPS_flag; purge = cc.c_purge; mmapflag = cc.c_mmapflag; mmapasflag = cc.c_mmapasflag; mmapnsflag = cc.c_mmapnsflag; mmapssflag = cc.c_mmapssflag; no_copy_flag = cc.c_no_copy_flag; no_unlink = cc.c_no_unlink; no_write = cc.c_no_write; include_close = cc.c_include_close; disrupt_flag = cc.c_disrupt_flag; compute_flag = cc.c_compute_flag; MS_flag = cc.c_MS_flag; mmap_mix = cc.c_mmap_mix; Kplus_flag = cc.c_Kplus_flag; delay = cc.c_delay; stride = cc.c_stride; rest_val = cc.c_rest_val; depth = cc.c_depth; delay_start = cc.c_delay_start; compute_time = cc.c_compute_time; if(N_special) touch_dedup(buffer1, MAXBUFFERSIZE); if(cdebug) { fprintf(newstdout,"Child %d change directory to %s\n",(int)chid,workdir); fflush(newstdout); } if(purge) alloc_pbuf(); /* 6. Change to the working directory */ if(chdir(workdir)<0) client_error=errno; start_child_listen_loop(); /* The async channel listener */ /* Need to start this after getting into the correct directory */ if(w_traj_flag) w_traj_size(); if(r_traj_flag) r_traj_size(); get_resolution(); /* Get my clock resolution */ if(hist_summary) { printf("Child got HISTORY flag\n"); } /* 7. Run the test */ switch(testnum) { case THREAD_WRITE_TEST : if(cdebug>=1) { fprintf(newstdout,"Child %d running thread_write_test\n",(int)chid); fflush(newstdout); } thread_write_test(0); break; #ifdef HAVE_PREAD case THREAD_PWRITE_TEST : if(cdebug>=1) { fprintf(newstdout,"Child %d running thread_pwrite_test\n",(int)chid); fflush(newstdout); } thread_pwrite_test(0); break; #endif case THREAD_REWRITE_TEST : if(cdebug>=1) { fprintf(newstdout,"Child %d running thread_rewrite_test\n",(int)chid); fflush(newstdout); } thread_rwrite_test(0); break; case THREAD_READ_TEST : if(cdebug>=1) { fprintf(newstdout,"Child %d running thread_read_test\n",(int)chid); fflush(newstdout); } thread_read_test(0); break; #ifdef HAVE_PREAD case THREAD_PREAD_TEST : if(cdebug>=1) { fprintf(newstdout,"Child %d running thread_read_test\n",(int)chid); fflush(newstdout); } thread_pread_test(0); break; #endif case THREAD_REREAD_TEST : if(cdebug>=1) { fprintf(newstdout,"Child %d running thread_reread_test\n",(int)chid); fflush(newstdout); } thread_rread_test(0); break; case THREAD_STRIDE_TEST : if(cdebug>=1) { fprintf(newstdout,"Child %d running thread_stride_read_test\n",(int)chid); fflush(newstdout); } thread_stride_read_test(0); break; case THREAD_RANDOM_READ_TEST : if(cdebug>=1) { fprintf(newstdout,"Child %d running random read test\n",(int)chid); fflush(newstdout); } thread_ranread_test(0); break; case THREAD_RANDOM_WRITE_TEST : if(cdebug>=1) { fprintf(newstdout,"Child %d running random write test\n",(int)chid); fflush(newstdout); } thread_ranwrite_test(0); break; case THREAD_REVERSE_READ_TEST : if(cdebug>=1) { fprintf(newstdout,"Child %d running reverse read test\n",(int)chid); fflush(newstdout); } thread_reverse_read_test(0); break; case THREAD_RANDOM_MIX_TEST : if(cdebug>=1) { fprintf(newstdout,"Child %d running mixed workload test\n",(int)chid); fflush(newstdout); } thread_mix_test(0); break; case THREAD_FWRITE_TEST : if(cdebug>=1) { fprintf(newstdout,"Child %d running thread_fwrite_test\n",(int)chid); fflush(newstdout); } thread_fwrite_test(0); break; case THREAD_FREAD_TEST : if(cdebug>=1) { fprintf(newstdout,"Child %d running thread_fread_test\n",(int)chid); fflush(newstdout); } thread_fread_test(0); break; case THREAD_CLEANUP_TEST : if(cdebug>=1) { fprintf(newstdout,"Child %d running cleanup\n",(int)chid); fflush(newstdout); } thread_cleanup_test(0); break; }; if(cdebug>=1) { fprintf(newstdout,"Child %d finished running test.\n",(int)chid); fflush(newstdout); } /* 8. Release the listen and send sockets to the master */ stop_child_listen(l_sock); exit(0); } /* * Clients tell the master their statistics, set the stopped flag, and set shared memory * child_flag to tell the master they are finished. Also each client report all statistics. */ #ifdef HAVE_ANSIC_C void tell_master_stats(int testnum , long long chid, double throughput, double actual, float cpu_time, double wall_time, char stop_flag, long long child_flag) #else void tell_master_stats(testnum , chid, throughput, actual, cpu_time, wall_time, stop_flag, child_flag) int testnum; long long chid; double throughput, actual, wall_time; char stop_flag; float cpu_time; long long child_flag; #endif { struct master_command mc; bzero(&mc,sizeof(struct master_command)); mc.m_client_number = (int) chid; mc.m_client_error = (int) client_error; mc.m_throughput= throughput; mc.m_testnum = testnum; mc.m_actual = actual; mc.m_cputime = cpu_time; mc.m_walltime = wall_time; mc.m_stop_flag = stop_flag; mc.m_child_flag = child_flag; mc.m_command = R_STAT_DATA; mc.m_mygen = mygen; mc.m_version = proto_version; if(cdebug>=1) { fprintf(newstdout,"Child %d: Tell master stats and terminate\n",(int)chid); fflush(newstdout); } child_send(controlling_host_name,(struct master_command *)&mc, sizeof(struct master_command)); } /* * Stop the master listener loop service. * Currently this is not used. The master_join_count * variable is used to terminate the loop service. */ #ifdef HAVE_ANSIC_C void stop_master_listen_loop(void) #else void stop_master_listen_loop() #endif { if(mdebug>=1) printf("Stopping Master listen loop"); kill(master_listen_pid,SIGKILL); } /* * Clients tell the master that I am at the barrier and ready * for the message to start work. */ #ifdef HAVE_ANSIC_C void tell_master_ready(long long chid) #else void tell_master_ready(chid) long long chid; #endif { struct master_command mc; bzero(&mc,sizeof(struct master_command)); if(cdebug>=1) { fprintf(newstdout,"Child %d: Tell master to go\n",(int)chid); fflush(newstdout); } mc.m_command = R_FLAG_DATA; mc.m_mygen = mygen; mc.m_version = proto_version; mc.m_child_flag = CHILD_STATE_READY; mc.m_client_number = (int)chid; mc.m_client_error = client_error; child_send(controlling_host_name,(struct master_command *)&mc, sizeof(struct master_command)); } /* * Clients wait at a barrier for the master to tell them * to begin work. This is the function where they wait. */ #ifdef HAVE_ANSIC_C void wait_for_master_go(long long chid) #else void wait_for_master_go(chid) long long chid; #endif { struct client_neutral_command *cnc; struct client_command cc; bzero(&cc,sizeof(struct client_command)); child_listen(l_sock,sizeof(struct client_neutral_command)); cnc = (struct client_neutral_command *)child_rcv_buf; sscanf(cnc->c_command,"%d",&cc.c_command); if(cc.c_command == R_TERMINATE || cc.c_command==R_DEATH) { if(cdebug) { fprintf(newstdout,"Child %d received terminate on sync channel at barrier !!\n",(int)chid); fflush(newstdout); } exit(1); } if(cdebug>=1) { fprintf(newstdout,"Child %d return from wait_for_master_go\n",(int)chid); fflush(newstdout); } } /* * Create a master listener for receiving data from the * many children. As the children finish they will send * their statistics and terminate. When the master_join_count * goes to zero then it is time to stop this service. * When this service exits then the parent will know * that all of the children are done. */ #ifdef HAVE_ANSIC_C void start_master_listen_loop(int num) #else void start_master_listen_loop(num) int num; #endif { int i; struct child_stats *child_stat; struct master_neutral_command *mnc; struct master_command mc; int temp; struct timespec req,rem; req.tv_sec = 0; req.tv_nsec = 10000000; rem.tv_sec = 0; rem.tv_nsec = 10000000; master_join_count=num; master_listen_pid=fork(); if(master_listen_pid!=0) return; if(mdebug>=1) printf("Starting Master listen loop m %d c %d count %d\n",master_iozone, client_iozone,num); while(master_join_count) { master_listen(master_listen_socket,sizeof(struct master_neutral_command)); mnc=(struct master_neutral_command *)&master_rcv_buf[0]; /* * Convert from string format to arch format */ sscanf(mnc->m_command,"%d",&mc.m_command); sscanf(mnc->m_client_number,"%d",&mc.m_client_number); sscanf(mnc->m_client_error,"%d",&mc.m_client_error); sscanf(mnc->m_mygen,"%d",&mc.m_mygen); sscanf(mnc->m_version,"%d",&mc.m_version); if(mc.m_version != proto_version) { printf("Client # %d is not running the same version of Iozone !\n", mc.m_client_number); } if(mc.m_client_error != 0) { printf("\nClient # %d reporting an error %s !\n", mc.m_client_number,strerror(mc.m_client_error)); } #ifdef NO_PRINT_LLD sscanf(mnc->m_child_flag,"%ld",&mc.m_child_flag); #else sscanf(mnc->m_child_flag,"%lld",&mc.m_child_flag); #endif sscanf(mnc->m_actual,"%f",&mc.m_actual); sscanf(mnc->m_throughput,"%f",&mc.m_throughput); sscanf(mnc->m_cputime,"%f",&mc.m_cputime); sscanf(mnc->m_walltime,"%f",&mc.m_walltime); sscanf(mnc->m_stop_flag,"%d",&temp); mc.m_stop_flag = temp; switch(mc.m_command) { case R_STAT_DATA: if(mc.m_mygen != mygen) { /* * >>> You are NOT one of my children !!! <<< * Probably children left behind from another run !!! * Ignore their messages, and go on without them. */ printf("*** Unknown Iozone children responding !!! ***\n"); continue; } i = mc.m_client_number; if(mdebug) printf("loop: R_STAT_DATA for client %d\n",i); child_stat = (struct child_stats *)&shmaddr[i]; child_stat->flag = mc.m_child_flag; child_stat->actual = mc.m_actual; child_stat->throughput = mc.m_throughput; child_stat->cputime = mc.m_cputime; child_stat->walltime = mc.m_walltime; *stop_flag = mc.m_stop_flag; master_join_count--; break; case R_FLAG_DATA: if(mc.m_mygen != mygen) { /* You are NOT one of my children !!! */ printf("*** Unknown Iozone children responding !!! ***\n"); continue; } if(mdebug) printf("loop: R_FLAG_DATA: Client %d flag %d \n", (int)mc.m_client_number, (int)mc.m_child_flag); i = mc.m_client_number; child_stat = (struct child_stats *)&shmaddr[i]; child_stat->flag = (long long)(mc.m_child_flag); break; case R_STOP_FLAG: if(mc.m_mygen != mygen) { /* You are NOT one of my children !!! */ printf("*** Unknown Iozone children responding !!! ***\n"); continue; } if(mdebug) printf("Master loop: R_STOP_FLAG: Client %d STOP_FLAG \n", (int)mc.m_client_number); *stop_flag=1; distribute_stop(); break; } } /* Let the clients report results before exiting. Also, exiting too quickly can close the async socket to the child, and cause it to become ill. On Solaris, it gets stuck in a 0=read() loop. */ #if defined(Windows) sleep(1); #else nanosleep(&req,&rem); #endif exit(0); } /* * Create a client listener for receiving async data from the * the master. */ #ifdef HAVE_ANSIC_C void start_child_listen_loop(void) #else void start_child_listen_loop() #endif { int i; struct child_stats *child_stat; struct client_command cc; struct client_neutral_command *cnc; client_listen_pid=fork(); if(client_listen_pid!=0) return; if(cdebug>=1) { fprintf(newstdout,"Child %d starting client listen loop\n",(int)chid); fflush(newstdout); } while(1) { bzero(&cc,sizeof(struct client_command)); child_listen_async(l_async_sock,sizeof(struct client_neutral_command)); cnc=(struct client_neutral_command *)&child_async_rcv_buf; /* * Convert from string format to arch format */ sscanf(cnc->c_command,"%d",&cc.c_command); sscanf(cnc->c_client_number,"%d",&cc.c_client_number); sscanf(cnc->c_stop_flag,"%d",&cc.c_stop_flag); switch(cc.c_command) { case R_STOP_FLAG: i = cc.c_client_number; if(cdebug) { fprintf(newstdout,"child loop: R_STOP_FLAG for client %d\n",i); fflush(newstdout); } child_stat = (struct child_stats *)&shmaddr[i]; *stop_flag = cc.c_stop_flag; /* In shared memory with other copy */ sent_stop=1; break; case R_TERMINATE: if(cdebug) { fprintf(newstdout,"Child loop: R_TERMINATE: Client %d \n", (int)cc.c_client_number); fflush(newstdout); } sleep(2); /* Aync listener goes away */ stop_child_listen(l_async_sock); exit(0); case R_DEATH: if(cdebug) { fprintf(newstdout,"Child loop: R_DEATH: Client %d \n", (int)cc.c_client_number); fflush(newstdout); } i = cc.c_client_number; child_remove_files(i); sleep(2); /* Aync listener goes away */ stop_child_listen(l_async_sock); exit(0); } } } /* * The controlling process "master" tells the children to begin. */ #ifdef HAVE_ANSIC_C void tell_children_begin(long long childnum) #else void tell_children_begin(childnum) long long childnum; #endif { struct client_command cc; int x; bzero(&cc,sizeof(struct client_command)); x = (int) childnum; if(mdebug>=1) printf("Master: Tell child %d to begin\n",x); cc.c_zero_pct = zero_pct; cc.c_N_special = N_special; cc.c_dedup_granule_size = dedup_granule_size; cc.c_command = R_FLAG_DATA; cc.c_child_flag = CHILD_STATE_BEGIN; cc.c_client_number = (int)childnum; master_send(master_send_sockets[x],child_idents[x].child_name, &cc,sizeof(struct client_command)); } /* * The master waits here for all of the the children to terminate. * When the children are done the the master_join_count will be at zero * and the master_listen_loop will exit. This function waits for this to happen. */ #ifdef HAVE_ANSIC_C void wait_dist_join(void) #else void wait_dist_join() #endif { wait(0); if(mdebug) printf("Master: All children have finished. Sending terminate\n"); terminate_child_async(); /* All children are done, so terminate their async channel */ current_client_number=0; /* start again */ } /* * This function reads a file that contains client information. * The information is: * client name (DNS usable name) * client working directory (where to run the test) * client directory that contains the Iozone executable. * * If the first character in a line is a # then it is a comment. * The maximum number of clients is MAXSTREAMS. */ #ifdef HAVE_ANSIC_C int get_client_info(void) #else int get_client_info() #endif { FILE *fd; char *ret1; int count; char buffer[800]; count=0; fd=fopen(client_filename,"r"); if(fd == (FILE *)NULL) { printf("Unable to open client file \"%s\"\n", client_filename); exit(176); } while(1) { if (count > MAXSTREAMS) { printf("Too many lines in client file - max of %d supported\n", MAXSTREAMS); exit(7); } ret1=fgets(buffer,800,fd); if(ret1== (char *)NULL) break; count+=parse_client_line(buffer,count); } fclose(fd); return(count); } /* * This function parses a line from the client file. It is * looking for: * Client name (DNS usable) * Client working directory (where to run the test ) * Client path to Iozone executable. * * Lines that start with # are comments. */ #ifdef HAVE_ANSIC_C int parse_client_line(char *buffer,int line_num) #else int parse_client_line(buffer, line_num) char *buffer; int line_num; #endif { int num; /* Format is clientname, workdir, execute_path */ /* If column #1 contains a # symbol then skip this line */ if(buffer[0]=='#') return(0); num=sscanf(buffer,"%s %s %s %s\n", child_idents[line_num].child_name, child_idents[line_num].workdir, child_idents[line_num].execute_path, child_idents[line_num].file_name); if((num < 0) || ((num > 0) && (num !=3) && (num !=4))) { printf("Bad Client Identity at entry %d\n",line_num); printf("Client: -> %s Workdir: -> %s Execute_path: -> %s \n", child_idents[line_num].child_name, child_idents[line_num].workdir, child_idents[line_num].execute_path); exit(203); } if(num == 4) mfflag++; return(1); } /* * This is a mechanism that the child uses to remove all * of its temporary files. Only used at terminate time. */ #ifdef HAVE_ANSIC_C void child_remove_files(int i) #else void child_remove_files(i) int i; #endif { char *dummyfile[MAXSTREAMS]; /* name of dummy file */ dummyfile[i]=(char *)malloc((size_t)MAXNAMESIZE); if(mfflag) { sprintf(dummyfile[i],"%s",filearray[i]); } else { sprintf(dummyfile[i],"%s.DUMMY.%d",filearray[i],i); } if(cdebug) { fprintf(newstdout,"Child %d remove: %s \n",(int)chid, dummyfile[i]); fflush(newstdout); } if(check_filename(dummyfile[i])) unlink(dummyfile[i]); } /* * The master tells the child async listener that it is time * to terminate its services. */ #ifdef HAVE_ANSIC_C void terminate_child_async(void) #else void terminate_child_async() #endif { int i; struct client_command cc; bzero(&cc,sizeof(struct client_command)); cc.c_command = R_TERMINATE; for(i=0;i>>>> Client Network Speed check <<<<< *\n"); printf("***************************************************\n\n"); printf("Master: %s\n",sp_master_host); printf("Transfer size %d bytes \n",sp_msize); printf("Count %d\n",sp_count); printf("Total size %d kbytes \n\n", (sp_msize*sp_count)/1024); sp_once=1; } sp_dest=sp_remote_host; sleep(1); sp_do_master_t(); free(sp_buf); } } /* * Get results back from the client. */ #ifdef HAVE_ANSIC_C void sp_get_result(int port,int flag) #else void sp_get_result(port,flag) int port,flag; #endif { int tcfd; float throughput; int count; char mybuf[1024]; int sp_offset,xx; tcfd=sp_start_master_listen(port, 1024); sp_offset=0; while(sp_offset < 1024) { xx=read(tcfd,&mybuf[sp_offset],1024); sp_offset+=xx; } sscanf(mybuf,"%d %f",&count,&throughput); if(!flag) printf("%-20s received %10d kBytes @ %10.2f kBytes/sec \n", sp_remote_host,count,throughput); else printf("%-20s sent %10d kBytes @ %10.2f kBytes/sec \n", sp_remote_host,count,throughput); close(tcfd); } /* * Send results to the master. */ #ifdef HAVE_ANSIC_C void sp_send_result(int port, int count, float throughput) #else void sp_send_result(port, count, throughput) int port,count; float throughput; #endif { int msfd; char mybuf[1024]; sprintf(mybuf,"%d %f",count, throughput); msfd=sp_start_child_send(sp_dest, port, &sp_my_cs_addr); junk=write(msfd,mybuf,1024); if(cdebug) { fprintf(newstdout,"Sending result\n"); fflush(newstdout); } close(msfd); } /* * Start the channel for the master to send a message to * a child on a port that the child * has created for the parent to use to communicate. */ #ifdef HAVE_ANSIC_C int sp_start_master_send(char *sp_child_host_name, int sp_child_listen_port, struct in_addr *sp_my_ms_addr) #else int sp_start_master_send(sp_child_host_name, sp_child_listen_port, sp_my_ms_addr) char *sp_child_host_name; int sp_child_listen_port; struct in_addr *sp_my_ms_addr; #endif { int rc,master_socket_val; struct sockaddr_in addr,raddr; struct hostent *he; int port,tmp_port; int ecount=0; struct in_addr *ip; struct timespec req,rem; req.tv_sec = 0; req.tv_nsec = 10000000; rem.tv_sec = 0; rem.tv_nsec = 10000000; he = gethostbyname(sp_child_host_name); if (he == NULL) { printf("Master: Bad hostname >%s<\n",sp_child_host_name); fflush(stdout); exit(22); } if(mdebug ==1) { printf("Master: start master send: %s\n", he->h_name); fflush(stdout); } ip = (struct in_addr *)he->h_addr_list[0]; #ifndef UWIN if(mdebug ==1) { printf("Master: child name: %s\n", (char *)inet_ntoa(*ip)); printf("Master: child Port: %d\n", sp_child_listen_port); fflush(stdout); } #endif port=sp_child_listen_port; sp_my_ms_addr->s_addr = ip->s_addr; /*port=CHILD_LIST_PORT;*/ raddr.sin_family = AF_INET; raddr.sin_port = htons(port); raddr.sin_addr.s_addr = ip->s_addr; master_socket_val = socket(AF_INET, SOCK_STREAM, 0); if (master_socket_val < 0) { perror("Master: socket failed:"); exit(23); } bzero(&addr, sizeof(struct sockaddr_in)); tmp_port=sp_master_esend_port; addr.sin_port = htons(tmp_port); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; rc = -1; while (rc < 0) { rc = bind(master_socket_val, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); if(rc < 0) { tmp_port++; addr.sin_port=htons(tmp_port); continue; } } if(mdebug ==1) { printf("Master: Bound port\n"); fflush(stdout); } if (rc < 0) { perror("Master: bind failed for sync channel to child.\n"); exit(24); } #if defined(Windows) sleep(1); #else nanosleep(&req,&rem); #endif again: rc = connect(master_socket_val, (struct sockaddr *)&raddr, sizeof(struct sockaddr_in)); if (rc < 0) { if(ecount++ < 300) { #if defined(Windows) sleep(1); #else nanosleep(&req,&rem); #endif /*sleep(1);*/ goto again; } perror("Master: connect failed\n"); printf("Error %d\n",errno); exit(25); } if(mdebug ==1) { printf("Master Connected\n"); fflush(stdout); } return (master_socket_val); } /* * Start the childs listening service for messages from the master. */ #ifdef HAVE_ANSIC_C int sp_start_child_listen(int listen_port, int size_of_message) #else int sp_start_child_listen(listen_port, size_of_message) int listen_port; int size_of_message; #endif { int tsize; int s,ns; unsigned int me; int rc; int xx; int tmp_port; struct sockaddr_in *addr; int sockerr; int recv_buf_size=65536; int optval=1; xx = 0; me=sizeof(struct sockaddr_in); tsize=size_of_message; /* Number of messages to receive */ s = socket(AF_INET, SOCK_STREAM, 0); if (s < 0) { perror("socket failed:"); exit(19); } sockerr = setsockopt (s, SOL_SOCKET, SO_RCVBUF, (char *) &recv_buf_size, sizeof(int)); if ( sockerr == -1 ) { perror("Error in setsockopt 7\n"); } sockerr = setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (char *) &optval, sizeof(int)); if ( sockerr == -1 ) { perror("Error in setsockopt 8\n"); } bzero(&sp_child_sync_sock, sizeof(struct sockaddr_in)); tmp_port=sp_child_listen_port; sp_child_sync_sock.sin_port = htons(tmp_port); sp_child_sync_sock.sin_family = AF_INET; sp_child_sync_sock.sin_addr.s_addr = INADDR_ANY; rc = -1; while (rc < 0) { rc = bind(s, (struct sockaddr *)&sp_child_sync_sock, sizeof(struct sockaddr_in)); if(rc < 0) { tmp_port++; sp_child_sync_sock.sin_port=htons(tmp_port); continue; } } sp_child_listen_port = ntohs(sp_child_sync_sock.sin_port); if(cdebug ==1) { fprintf(newstdout,"Child: Listen: Bound at port %d\n", tmp_port); fflush(newstdout); } if(rc < 0) { if(cdebug ==1) { fprintf(newstdout,"bind failed. Errno %d\n", errno); fflush(newstdout); } exit(20); } addr=&sp_child_async_sock; listen(s,10); if(cdebug) { fprintf(newstdout,"Child enters accept\n"); fflush(newstdout); } #if defined(ANDROID) ns=accept((int)s,(struct sockaddr *)addr,(socklen_t *)&me); #else ns=accept(s,(void *)addr,&me); #endif if(cdebug) { fprintf(newstdout,"Child attached for receive. Sock %d %d\n", ns,errno); fflush(newstdout); } close(s); return(ns); } /* * The client runs this code */ #ifdef HAVE_ANSIC_C void sp_do_child_t(void) #else void sp_do_child_t() #endif { int i,y; int offset; int sp_tcount=0; /* child */ /* * Child reads from master */ sp_crfd=sp_start_child_listen(sp_child_listen_port, sp_msize); sp_start_time=time_so_far(); for(i=0;i%s<\n",sp_master_host_name); fflush(stdout); exit(22); } if(cdebug ==1) { fprintf(newstdout,"Child: start child send: %s\n", he->h_name); fprintf(newstdout,"To: %s at port %d\n",sp_master_host_name, sp_master_listen_port); fflush(newstdout); } ip = (struct in_addr *)he->h_addr_list[0]; port=sp_master_listen_port; sp_my_cs_addr->s_addr = ip->s_addr; raddr.sin_family = AF_INET; raddr.sin_port = htons(port); raddr.sin_addr.s_addr = ip->s_addr; sp_child_socket_val = socket(AF_INET, SOCK_STREAM, 0); if (sp_child_socket_val < 0) { perror("child: socket failed:"); exit(23); } bzero(&addr, sizeof(struct sockaddr_in)); tmp_port=sp_child_esend_port; addr.sin_port = htons(tmp_port); addr.sin_family = AF_INET; addr.sin_addr.s_addr = INADDR_ANY; rc = -1; while (rc < 0) { rc = bind(sp_child_socket_val, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); if(rc < 0) { tmp_port++; addr.sin_port=htons(tmp_port); continue; } } if(cdebug ==1) { fprintf(newstdout,"Child: Bound port %d\n",tmp_port); fflush(newstdout); } if (rc < 0) { perror("Child: bind failed for sync channel to child.\n"); exit(24); } #if defined(Windows) sleep(1); #else nanosleep(&req,&rem); #endif again: rc = connect(sp_child_socket_val, (struct sockaddr *)&raddr, sizeof(struct sockaddr_in)); if (rc < 0) { if(ecount++<300) { #if defined(Windows) sleep(1); #else nanosleep(&req,&rem); #endif goto again; } fprintf(newstdout,"child: connect failed. Errno %d \n",errno); fflush(newstdout); exit(25); } if(cdebug ==1) { fprintf(newstdout,"child Connected\n"); fflush(newstdout); } return (sp_child_socket_val); } #ifdef HAVE_ANSIC_C void do_speed_check(int client_flag) #else void do_speed_check(client_flag) int client_flag; #endif { int i; if(client_flag) { speed_main(" "," ",reclen,kilobytes64,client_flag); } else { printf("Checking %d clients\n",clients_found); for(i=0;i xor ops * Seed composed from: blocknumber (do not include childnum as you want duplicates) * size ... size of buffers. (in bytes) * percent. Percent of buffer to modify. * percent_interior. Percent of buffer that is dedupable within * and across files * percent_compress. Percent of buffer that is dedupable within * but not across files * * Returns 0 (zero) for success, and -1 (minus one) for failure. */ int special_gen_new_buf(char *ibuf, char *obuf, long seed, int size, int percent, int percent_interior, int percent_compress, int all) { register int *ip, *op; /* Register for speed */ register int iseed; /* Register for speed */ register int isize; /* Register for speed */ register int cseed; /* seed for dedupable for within & ! across */ register int x,w; /* Register for speed */ register int value; /* Register for speed */ register int interior_size; /* size of interior dedup region */ register int compress_size; /* size of compression dedup region */ int base = seed * reclen; if(ibuf == NULL) /* no input buf */ return(-1); if(obuf == NULL) /* no output buf */ return(-1); if((percent > 100) || (percent < 0)) /* percent check */ return(-1); if(size == 0) /* size check */ return(-1); srand(seed+1+(((int)numrecs64)*dedup_mseed)); /* set random seed */ iseed =rand(); isize = (size * percent)/100; /* percent that is dedupable */ interior_size = ((isize * percent_interior)/100);/* /sizeof(long) */ compress_size =((interior_size * percent_compress)/100); ip = (int *)ibuf; /* pointer to input buf */ op = (int *)obuf; /* pointer to output buf */ if(all == 0) /* Special case for verify only */ isize = sizeof(int); /* dedup region boundary */ /* [0,interior_size-compress_size) : dedupable within and across */ /* [interior_size-compress_size, interior_size) : dedupable within only */ /* [interior_size, isize] : dedupable across only */ /* [isize, size] : non-dedupable */ /* check whether each dedup region is starting a dedup unit */ /* printf("within&across@0 within@%08x across@%08x nondedup@%x\n", */ /* interior_size-compress_size,interior_size, isize); */ /* if ( (interior_size-compress_size) %dedup_granule != 0) */ /* printf("warning: dedup region(within only) is starting in the */ /* middle of a dedup unit\n"); */ /* if ( interior_size %dedup_granule_size != 0) */ /* printf("warning: dedup region(across only) is starting in the */ /* middle of a dedup unit\n"); */ /* if ( isize %dedup_granule_size != 0) */ /* printf("warning: nondedup region is starting in the middle of */ /* a unit\n"); */ /* interior_size = dedup_within + dedup_across */ /* /for(w=0;w>12); ip++; *op++=0xdead; ip++; x+=sizeof(int); blkidx[chid]++; } else { op++; ip++; } } if(all == 0) /* Special case for verify only */ return(0); /* make the rest of the buffer non-dedupable */ if(100-percent > 0) { srand(1+seed+((chid+1)*(int)numrecs64)*dedup_mseed); value=rand(); for( ; x>12); ip++; blkidx[chid]++; x+= sizeof(int); } else { ip++; op++; } } } return(0); } /* This is problematic as the zeros are not adjacent, which means that the * compression algorithm won't save any space as the dictionay index and count * would ocupy the same space as the original int of zero. */ #ifdef GOOFY int old_compressible_rand(void) { /* zero_pct:[0,100] */ int toss = ((((double)rand()/((double)MAX_RAND+(double)1))*100+1)); if (toss>zero_pct) { negatives++; return (long)(((double)rand()/((double)MAX_RAND+(double)1))*MAX_RAND)+1; /* [1,MAX_RAND]. avoid zeros because */ /* zeros are used for compressibility control */ } else { positives++; return 0; } } #endif /* * Compress 16 ints at a time so that there is sufficient compressible * content so as to permit compression algorithms to work. i.e. there * is sufficient compression to more than compensate for the dictionay * index and the reference count. */ void compressible_rand_16_int(int *L_ptr) { /* zero_pct:[0,100] */ int k,j; int toss = ((lrand48()>>3)%100)+1; if (toss>zero_pct) { /* Fill in 16 ints with data */ for(k=0;k<16;k++) { negatives++; L_ptr[k]=(int)rand(); } return; } else { /* Fill in 16 ints with repeating int so that compression * algorithms will see the savings and engage. Without having * a bunch of adjacent matches the compression will dis-engage. * This is a bit more work for the compression engine as it * will consume more dictionary entries. */ j=(int)rand(); for(k=0;k<16;k++) { positives++; L_ptr[k]=j; } return; } } /* * Used to touch all of the buffers so that the CPU data * cache is hot, and not part of the measurement. * This is for mixed mode of compression + dedup. */ void new_touch_dedup(char *i, int size) { register int x; register int *ip; int *L_ptr; ip = (int *)i; /* To make sure every fileset generates different dedup patterns */ srand(DEDUPSEED+dedup_mseed); L_ptr = ip; for(x=0;x<(int)(size/sizeof(int));x++) { L_ptr = ip; if ( zero_pct >= 0 ) { /* Have compressible_rand_16_int() fill in 16 ints at a * time so that we have adjacent zeros or adjacent random * numbers. * One needs to do this or the zeros won't compress as the * dictionary entry would take the same space as a single * int */ /* fill initial buffer with groups of 16 bytes of * compressible or non-compressible data */ if((x % 16) == 0) compressible_rand_16_int(L_ptr); } ip++; } } /* A C-program for MT19937-64 (2004/9/29 version). Coded by Takuji Nishimura and Makoto Matsumoto. This is a 64-bit version of Mersenne Twister pseudorandom number generator. Before using, initialize the state by using init_genrand64(seed) or init_by_array64(init_key, key_length). Copyright (C) 2004, Makoto Matsumoto and Takuji Nishimura, All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of its contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. References: T. Nishimura, ``Tables of 64-bit Mersenne Twisters'' ACM Transactions on Modeling and Computer Simulation 10. (2000) 348--357. M. Matsumoto and T. Nishimura, ``Mersenne Twister: a 623-dimensionally equidistributed uniform pseudorandom number generator'' ACM Transactions on Modeling and Computer Simulation 8. (Jan. 1998) 3--30. Any feedback is very welcome. http://www.math.hiroshima-u.ac.jp/~m-mat/MT/emt.html email: m-mat @ math.sci.hiroshima-u.ac.jp (remove spaces) */ #define NN 312 #define MM 156 #define MATRIX_A 0xB5026F5AA96619E9ULL #define UM 0xFFFFFFFF80000000ULL /* Most significant 33 bits */ #define LM 0x7FFFFFFFULL /* Least significant 31 bits */ /* The array for the state vector */ static unsigned long long mt[NN]; /* mti==NN+1 means mt[NN] is not initialized */ static int mti=NN+1; /* initializes mt[NN] with a seed */ void init_genrand64(unsigned long long seed) { mt[0] = seed; for (mti=1; mti> 62)) + mti); } /* initialize by an array with array-length */ /* init_key is the array for initializing keys */ /* key_length is its length */ void init_by_array64(unsigned long long init_key[], unsigned long long key_length) { unsigned long long i, j, k; init_genrand64(19650218ULL); i=1; j=0; k = (NN>key_length ? NN : key_length); for (; k; k--) { mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 62)) * 3935559000370003845ULL)) + init_key[j] + j; /* non linear */ i++; j++; if (i>=NN) { mt[0] = mt[NN-1]; i=1; } if (j>=key_length) j=0; } for (k=NN-1; k; k--) { mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 62)) * 2862933555777941757ULL)) - i; /* non linear */ i++; if (i>=NN) { mt[0] = mt[NN-1]; i=1; } } mt[0] = 1ULL << 63; /* MSB is 1; assuring non-zero initial array */ } /* generates a random number on [0, 2^64-1]-interval */ unsigned long long genrand64_int64(void) { int i; unsigned long long x; static unsigned long long mag01[2]={0ULL, MATRIX_A}; if (mti >= NN) { /* generate NN words at one time */ /* if init_genrand64() has not been called, */ /* a default initial seed is used */ if (mti == NN+1) init_genrand64(5489ULL); for (i=0;i>1) ^ mag01[(int)(x&1ULL)]; } for (;i>1) ^ mag01[(int)(x&1ULL)]; } x = (mt[NN-1]&UM)|(mt[0]&LM); mt[NN-1] = mt[MM-1] ^ (x>>1) ^ mag01[(int)(x&1ULL)]; mti = 0; } x = mt[mti++]; x ^= (x >> 29) & 0x5555555555555555ULL; x ^= (x << 17) & 0x71D67FFFEDA60000ULL; x ^= (x << 37) & 0xFFF7EEE000000000ULL; x ^= (x >> 43); return x; } /* generates a random number on [0, 2^63-1]-interval */ long long genrand64_int63(void) { return (long long)(genrand64_int64() >> 1); } /* generates a random number on [0,1]-real-interval */ double genrand64_real1(void) { return (genrand64_int64() >> 11) * (1.0/9007199254740991.0); } /* generates a random number on [0,1)-real-interval */ double genrand64_real2(void) { return (genrand64_int64() >> 11) * (1.0/9007199254740992.0); } /* generates a random number on (0,1)-real-interval */ double genrand64_real3(void) { return ((genrand64_int64() >> 12) + 0.5) * (1.0/4503599627370496.0); } #ifdef MT_TEST int main(void) { int i; unsigned long long init[4]={0x12345ULL, 0x23456ULL, 0x34567ULL, 0x45678ULL}, length=4; init_by_array64(init, length); printf("1000 outputs of genrand64_int64()\n"); for (i=0; i<1000; i++) { printf("%20llu ", genrand64_int64()); if (i%5==4) printf("\n"); } printf("\n1000 outputs of genrand64_real2()\n"); for (i=0; i<1000; i++) { printf("%10.8f ", genrand64_real2()); if (i%5==4) printf("\n"); } return 0; } #endif /*----------------------------------------------------------------------*/ /* */ /* The PIT Programmable Interdimensional Timer */ /* */ /* This is used to measure time, when you know something odd is going */ /* to be happening with your wrist watch. For example, you have entered */ /* a temporal distortion field where time its-self is not moving */ /* as it does in your normal universe. ( thing either intense */ /* gravitational fields bending space-time, or virtual machines playing */ /* with time ) */ /* So.. you need to measure time, but with respect to a normal */ /* space-time. So.. we deal with this by calling for time from another */ /* machine, but do so with a very similar interface to that of */ /* gettimeofday(). */ /* To activate this, one only needs to set an environmental variable. */ /* Example: setenv IOZ_PIT hostname_of_PIT_server */ /* The environmental variable tells this client where to go to get */ /* correct timeofday time stamps, with the usual gettimeofday() */ /* resolution. (microsecond resolution) */ /*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/ /* The PIT client: Adapted from source found on the web for someone's */ /* daytime client code. (Used in many examples for network programming */ /* Reads PIT info over a socket from a PIT server. */ /* The PIT server sends its raw microsecond version of gettimeofday */ /* The PIT client converts this back into timeval structure format. */ /* Written by: Don Capps. [ capps@iozone.org ] */ /*----------------------------------------------------------------------*/ /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< */ /* >>>> DON'T forget, you must put a definition for PIT <<<<<<<<<< */ /* >>>> in /etc/services <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< */ /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< */ #define DFLT_SERVICE "PIT" /* Default service name. */ #define INVALID_DESC -1 /* Invalid file (socket) descriptor. */ #define MAXBFRSIZE 256 /* Max bfr sz to read remote TOD. */ /* ** Type definitions (for convenience). */ #if defined(Windows) int my_false = 0; int my_true = 1; #else typedef enum { my_false = 0, my_true } boolean; #endif typedef struct sockaddr_in sockaddr_in_t; typedef struct sockaddr_in6 sockaddr_in6_t; /* * Routine to mimic gettimeofday() using a remote PIT server */ #if defined(_SUA_) struct timezone { int tz_minuteswest; int tz_dsttime; }; #endif int pit_gettimeofday( struct timeval *tp, struct timezone *foo, char *pit_hostname, char *pit_service) { int sckt; /* socket descriptor */ unsigned scopeId = 0; /* See if the interdimensional rift is active */ if(pit_hostname[0] == 0) { return gettimeofday(tp,foo); } if ( ( sckt = openSckt( pit_hostname, pit_service, scopeId ) ) == INVALID_DESC ) { fprintf( stderr, "Sorry... a connectionless socket could " "not be set up.\n"); return -1; } /* ** Get the remote PIT. */ pit( sckt ,tp ); close(sckt); return 0; } /* * Opens a socket for the PIT to use to get the time * from a remote time server ( A PIT server ) */ static int openSckt( const char *host, const char *service, unsigned int scopeId ) { struct addrinfo *ai; int aiErr; struct addrinfo *aiHead; struct addrinfo hints; sockaddr_in6_t *pSadrIn6; int sckt; /* * Initialize the 'hints' structure for getaddrinfo(3). */ memset( &hints, 0, sizeof( hints ) ); hints.ai_family = PF_UNSPEC; /* IPv4 or IPv6 records */ hints.ai_socktype = SOCK_STREAM; /* Connection oriented communication.*/ hints.ai_protocol = IPPROTO_TCP; /* TCP transport layer protocol only. */ /* ** Look up the host/service information. */ if ( ( aiErr = getaddrinfo( host, service, &hints, &aiHead ) ) != 0 ) { fprintf( stderr, "(line %d): ERROR - %s.\n", __LINE__, gai_strerror( aiErr ) ); return INVALID_DESC; } /* ** Go through the list and try to open a connection. Continue until either ** a connection is established or the entire list is exhausted. */ for ( ai = aiHead, sckt = INVALID_DESC; ( ai != NULL ) && ( sckt == INVALID_DESC ); ai = ai->ai_next ) { /* ** IPv6 kluge. Make sure the scope ID is set. */ if ( ai->ai_family == PF_INET6 ) { pSadrIn6 = (sockaddr_in6_t*) ai->ai_addr; if ( pSadrIn6->sin6_scope_id == 0 ) { pSadrIn6->sin6_scope_id = scopeId; } /* End IF the scope ID wasn't set. */ } /* End IPv6 kluge. */ /* ** Create a socket. */ sckt = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol ); if(sckt == -1) { sckt = INVALID_DESC; continue; /* Try the next address record in the list. */ } /* ** Set the target destination for the remote host on this socket. That ** is, this socket only communicates with the specified host. */ if (connect( sckt, ai->ai_addr, ai->ai_addrlen ) ) { (void) close( sckt ); /* Could use system call again here, but why? */ sckt = INVALID_DESC; continue; /* Try the next address record in the list. */ } } /* End FOR each address record returned by getaddrinfo(3). */ /* ** Clean up & return. */ freeaddrinfo( aiHead ); return sckt; } /* End openSckt() */ /* * Read the PIT, and convert this back into timeval * info, and store it in the timeval structure that was * passed in. */ static void pit( int sckt, struct timeval *tp) { char bfr[ MAXBFRSIZE+1 ]; int inBytes; long long value; /* ** Send a datagram to the server to wake it up. The content isn't ** important, but something must be sent to let it know we want the TOD. */ junk=write( sckt, "Are you there?", 14 ); /* ** Read the PIT from the remote host. */ inBytes = read( sckt, bfr, MAXBFRSIZE ); bfr[ inBytes ] = '\0'; /* Null-terminate the received string. */ /* * Convert result to timeval structure format */ sscanf(bfr,"%llu\n",&value); tp->tv_sec = (long)(value / 1000000); tp->tv_usec = (long)(value % 1000000); } /* sync does not exist in SUA */ #if defined(_SUA_) sync() { } #endif #define BUCKETS 40 long long buckets[BUCKETS]; long long bucket_val[BUCKETS] = { 20,40,60,80,100, 200,400,600,800,1000, 2000,4000,6000,8000,10000, 12000,14000,16000,18000,20000, 40000,60000,80000,100000, 200000,400000,600000,800000,1000000, 2000000,4000000,6000000,8000000,10000000, 20000000,30000000,60000000,90000000,120000000,120000001}; /* * Buckets: (Based on a Netapp internal consensus) * 0 1 2 3 4 * <=20us <=40us <=60us <=80us <=100us * * 5 6 7 8 9 * <=200us <=400us <=600us <=88us <=1ms * * 10 11 12 13 14 * <=2ms <=4ms <=6ms <=8ms <=10ms * * 15 16 17 18 19 * <=12ms <=14ms <=16ms <=18ms <=20ms * * 20 21 22 23 24 * <=20ms <=40ms <=60ms <=80ms <=100ms * * 25 26 27 28 29 * <=200ms <=400ms <=600ms <=800ms <=1s * * 30 31 32 33 34 * <=2s <=4s <=6s <=8s <=10s * * 35 36 37 38 39 * <=20s <=30s <=60 <=90s >90 */ /* fp=fopen("/tmp/iozone_latency_summary.txt","a"); dump_hist(fp); */ void hist_insert(double my_value) { int k; long long value; /* Convert to micro-seconds */ value = (long long)(my_value * 1000000); for(k=0;k bucket_val[k]) { buckets[k]++; break; } } } } void dump_hist(char *what,int id) { FILE *fp; char name[256]; sprintf(name,"%s_child_%d.txt","Iozone_histogram",id); fp = fopen(name,"a"); #ifndef NO_PRINT_LLD fprintf(fp,"Child: %d Op: %s\n",id,what); fprintf(fp,"Band 1: "); fprintf(fp," 20us:%-7.1lld ",buckets[0]); fprintf(fp," 40us:%-7.1lld ",buckets[1]); fprintf(fp," 60us:%-7.1lld ",buckets[2]); fprintf(fp," 80us:%-7.1lld ",buckets[3]); fprintf(fp,"100us:%-7.1lld \n",buckets[4]); fprintf(fp,"Band 2: "); fprintf(fp,"200us:%-7.1lld ",buckets[5]); fprintf(fp,"400us:%-7.1lld ",buckets[6]); fprintf(fp,"600us:%-7.1lld ",buckets[7]); fprintf(fp,"800us:%-7.1lld ",buckets[8]); fprintf(fp," 1ms:%-7.1lld \n",buckets[9]); fprintf(fp,"Band 3: "); fprintf(fp," 2ms:%-7.1lld ",buckets[10]); fprintf(fp," 4ms:%-7.1lld ",buckets[11]); fprintf(fp," 6ms:%-7.1lld ",buckets[12]); fprintf(fp," 8ms:%-7.1lld ",buckets[13]); fprintf(fp," 10ms:%-7.1lld \n",buckets[14]); fprintf(fp,"Band 4: "); fprintf(fp," 12ms:%-7.1lld ",buckets[15]); fprintf(fp," 14ms:%-7.1lld ",buckets[16]); fprintf(fp," 16ms:%-7.1lld ",buckets[17]); fprintf(fp," 18ms:%-7.1lld ",buckets[18]); fprintf(fp," 20ms:%-7.1lld \n",buckets[19]); fprintf(fp,"Band 5: "); fprintf(fp," 40ms:%-7.1lld ",buckets[20]); fprintf(fp," 60ms:%-7.1lld ",buckets[21]); fprintf(fp," 80ms:%-7.1lld ",buckets[22]); fprintf(fp,"100ms:%-7.1lld \n",buckets[23]); fprintf(fp,"Band 6: "); fprintf(fp,"200ms:%-7.1lld ",buckets[24]); fprintf(fp,"400ms:%-7.1lld ",buckets[25]); fprintf(fp,"600ms:%-7.1lld ",buckets[26]); fprintf(fp,"800ms:%-7.1lld ",buckets[27]); fprintf(fp," 1s:%-7.1lld \n",buckets[28]); fprintf(fp,"Band 7: "); fprintf(fp," 2s:%-7.1lld ",buckets[29]); fprintf(fp," 4s:%-7.1lld ",buckets[30]); fprintf(fp," 6s:%-7.1lld ",buckets[31]); fprintf(fp," 8s:%-7.1lld ",buckets[32]); fprintf(fp," 10s:%-7.1lld \n",buckets[33]); fprintf(fp,"Band 8: "); fprintf(fp," 20s:%-7.1lld ",buckets[34]); fprintf(fp," 40s:%-7.1lld ",buckets[35]); fprintf(fp," 60s:%-7.1lld ",buckets[36]); fprintf(fp," 80s:%-7.1lld ",buckets[37]); fprintf(fp," 120s:%-7.1lld \n",buckets[38]); fprintf(fp,"Band 9: "); fprintf(fp,"120+s:%-7.1lld \n\n",buckets[39]); #else fprintf(fp,"Child: %d Op: %s\n",id,what); fprintf(fp,"Band 1: "); fprintf(fp," 20us:%-7.1ld ",buckets[0]); fprintf(fp," 40us:%-7.1ld ",buckets[1]); fprintf(fp," 60us:%-7.1ld ",buckets[2]); fprintf(fp," 80us:%-7.1ld ",buckets[3]); fprintf(fp,"100us:%-7.1ld \n",buckets[4]); fprintf(fp,"Band 2: "); fprintf(fp,"200us:%-7.1ld ",buckets[5]); fprintf(fp,"400us:%-7.1ld ",buckets[6]); fprintf(fp,"600us:%-7.1ld ",buckets[7]); fprintf(fp,"800us:%-7.1ld ",buckets[8]); fprintf(fp," 1ms:%-7.1ld \n",buckets[9]); fprintf(fp,"Band 3: "); fprintf(fp," 2ms:%-7.1ld ",buckets[10]); fprintf(fp," 4ms:%-7.1ld ",buckets[11]); fprintf(fp," 6ms:%-7.1ld ",buckets[12]); fprintf(fp," 8ms:%-7.1ld ",buckets[13]); fprintf(fp," 10ms:%-7.1ld \n",buckets[14]); fprintf(fp,"Band 4: "); fprintf(fp," 12ms:%-7.1ld ",buckets[15]); fprintf(fp," 14ms:%-7.1ld ",buckets[16]); fprintf(fp," 16ms:%-7.1ld ",buckets[17]); fprintf(fp," 18ms:%-7.1ld ",buckets[18]); fprintf(fp," 20ms:%-7.1ld \n",buckets[19]); fprintf(fp,"Band 5: "); fprintf(fp," 40ms:%-7.1ld ",buckets[20]); fprintf(fp," 60ms:%-7.1ld ",buckets[21]); fprintf(fp," 80ms:%-7.1ld ",buckets[22]); fprintf(fp,"100ms:%-7.1ld \n",buckets[23]); fprintf(fp,"Band 6: "); fprintf(fp,"200ms:%-7.1ld ",buckets[24]); fprintf(fp,"400ms:%-7.1ld ",buckets[25]); fprintf(fp,"600ms:%-7.1ld ",buckets[26]); fprintf(fp,"800ms:%-7.1ld ",buckets[27]); fprintf(fp," 1s:%-7.1ld \n",buckets[28]); fprintf(fp,"Band 7: "); fprintf(fp," 2s:%-7.1ld ",buckets[29]); fprintf(fp," 4s:%-7.1ld ",buckets[30]); fprintf(fp," 6s:%-7.1ld ",buckets[31]); fprintf(fp," 8s:%-7.1ld ",buckets[32]); fprintf(fp," 10s:%-7.1ld \n",buckets[33]); fprintf(fp,"Band 8: "); fprintf(fp," 20s:%-7.1ld ",buckets[34]); fprintf(fp," 40s:%-7.1ld ",buckets[35]); fprintf(fp," 60s:%-7.1ld ",buckets[36]); fprintf(fp," 80s:%-7.1ld ",buckets[37]); fprintf(fp," 120s:%-7.1ld \n",buckets[38]); fprintf(fp,"Band 9: "); fprintf(fp,"120+s:%-7.1ld \n\n",buckets[39]); #endif fclose(fp); } #ifdef HAVE_ANSIC_C void * thread_fwrite_test(int x) #else void * thread_fwrite_test( x) #endif { struct child_stats *child_stat; double starttime1 = 0; double temp_time; double hist_time; double desired_op_rate_time; double actual_rate; double walltime, cputime; double compute_val = (double)0; float delay = (float)0; double thread_qtime_stop,thread_qtime_start; off64_t traj_offset; long long w_traj_bytes_completed; long long w_traj_ops_completed; FILE *w_traj_fd; int fd; long long recs_per_buffer; long long stopped,i; off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; long long xx,xx2; char *dummyfile [MAXSTREAMS]; /* name of dummy file */ char *nbuff; char *maddr; char *wmaddr,*free_addr; char now_string[30]; int anwser,bind_cpu,wval; #if defined(VXFS) || defined(solaris) int test_foo = 0; #endif off64_t filebytes64; char tmpname[256]; FILE *thread_wqfd; FILE *thread_Lwqfd; char *filename; char *stdio_buf; char *how; long long Index = 0; FILE *stream = NULL; int First_Run[MAXSTREAMS]; int kk; for(kk=0;kkthroughput = 0; child_stat->actual = 0; child_stat->flag=CHILD_STATE_READY; /* Tell parent child is ready to go */ if(distributed && client_iozone) tell_master_ready(chid); if(distributed && client_iozone) { if(cdebug) { printf("Child %d waiting for go from master\n",(int)xx); fflush(stdout); } wait_for_master_go(chid); if(cdebug) { printf("Child %d received go from master\n",(int)xx); fflush(stdout); } } else { while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ Poll((long long)1); } written_so_far=0; child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->actual = 0; child_stat->throughput = 0; stopped=0; if(Q_flag) { sprintf(tmpname,"Child_%d_fwol.dat",(int)xx); thread_wqfd=fopen(tmpname,"a"); if(thread_wqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } fprintf(thread_wqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); } if(L_flag) { sprintf(tmpname,"Child_%d.log",(int)xx); thread_Lwqfd=fopen(tmpname,"a"); if(thread_Lwqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","fwrite test start: ",now_string); } starttime1 = time_so_far(); if(cpuutilflag) { walltime = starttime1; cputime = cputime_so_far(); } /*******************************************************************/ for(i=0; i (MAXBUFFERSIZE-reclen)) Index=0; buffer = mbuffer + Index; } if((verify & diag_v) || dedup_flag || dedup_iflag) fill_buffer(buffer,reclen,(long long)pattern,sverify,i); if(purge) purgeit(buffer,reclen); if(Q_flag || hist_summary || op_rate_flag) { thread_qtime_start=time_so_far(); } if(fwrite(buffer, (size_t) reclen, 1, stream) != 1) { #ifdef NO_PRINT_LLD printf("\nError fwriting block %ld, fd= %d\n", i, fd); #else printf("\nError fwriting block %lld, fd= %d\n", i, fd); #endif perror("fwrite"); exit_code = 74; signal_handler(); } #ifndef NO_THREADS count_burst(&burst_acc_time_sec, xx); #endif if(hist_summary) { thread_qtime_stop=time_so_far(); hist_time =(thread_qtime_stop-thread_qtime_start); hist_insert(hist_time); } if(op_rate_flag) { thread_qtime_stop=time_so_far(); desired_op_rate_time = ((double)1.0/(double)op_rate); actual_rate = (double)(thread_qtime_stop-thread_qtime_start); if( actual_rate < desired_op_rate_time) my_unap((unsigned long long)((desired_op_rate_time-actual_rate)*1000000.0 )); } if(Q_flag) { thread_qtime_stop=time_so_far(); #ifdef NO_PRINT_LLD fprintf(thread_wqfd,"%10.1ld %10.0f %10.1ld\n",(long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long)reclen); #else fprintf(thread_wqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long long)reclen); #endif } w_traj_ops_completed++; w_traj_bytes_completed+=reclen; written_so_far+=reclen/1024; } if(include_flush) { fflush(stream); wval=fsync(fd); if(wval==-1){ perror("fsync"); signal_handler(); } } if(include_close) { wval=fclose(stream); if(wval==-1){ perror("fclose"); signal_handler(); } } /*******************************************************************/ if(!stopped){ temp_time = time_so_far(); if(inc_think) child_stat->throughput = ((temp_time - starttime1)-time_res - burst_acc_time_sec); else child_stat->throughput = ((temp_time - starttime1)-time_res - burst_acc_time_sec) -compute_val; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*written_so_far=(written_so_far*1024)/reclen;*/ written_so_far=w_traj_ops_completed; } child_stat->throughput = (double)written_so_far/child_stat->throughput; child_stat->actual = (double)written_so_far; } if(cdebug) { printf("Child %d: throughput %f actual %f \n",(int)chid, child_stat->throughput, child_stat->actual); fflush(stdout); } if(cpuutilflag) { cputime = cputime_so_far() - cputime; if (cputime < cputime_res) cputime = 0.0; child_stat->cputime = cputime; walltime = time_so_far() - walltime; child_stat->walltime = walltime; } if(distributed && client_iozone) tell_master_stats(THREAD_FWRITE_TEST, chid, child_stat->throughput, child_stat->actual, child_stat->cputime, child_stat->walltime, (char)*stop_flag, (long long)CHILD_STATE_HOLD); if (debug1) { #ifdef NO_PRINT_LLD printf(" child/slot: %ld, wall-cpu: %8.3f %8.3fC" " -> %6.2f%%\n", (long)xx, #else printf(" child/slot: %lld, wall-cpu: %8.3f %8.3fC" " -> %6.2f%%\n",(long long)xx, #endif walltime, cputime,cpu_util(cputime, walltime)); } child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ stopped=0; /*******************************************************************/ /* End fwrite performance test. *************************************/ /*******************************************************************/ if(debug1) #ifdef NO_PRINT_LLD printf("\nChild finished %ld\n",(long)xx); #else printf("\nChild finished %lld\n",(long long)xx); #endif if(Q_flag && (thread_wqfd !=0) ) fclose(thread_wqfd); free(dummyfile[xx]); if(w_traj_flag) fclose(w_traj_fd); if(L_flag) { get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Fwrite test finished: ",now_string); fclose(thread_Lwqfd); } /*******************************************************************/ if(!include_close) { wval=fflush(stream); if(wval==-1){ perror("fflush"); signal_handler(); } wval=fsync(fd); if(wval==-1){ perror("fsync"); signal_handler(); } wval=fclose(stream); if(wval==-1){ perror("fclose"); signal_handler(); } } if(restf) sleep((int)(int)rest_val); free(stdio_buf); if(OPS_flag || MS_flag){ filebytes64=filebytes64/reclen; } /*******************************************************************/ if(hist_summary) dump_hist("Fwrite",(int)xx); if(distributed && client_iozone) return(0); #ifdef NO_THREADS exit(0); #else if(use_thread) thread_exit(); else exit(0); #endif return(0); } #ifdef HAVE_ANSIC_C void * thread_fread_test(int x) #else void * thread_fread_test( x) #endif { struct child_stats *child_stat; double starttime1 = 0; double temp_time; double hist_time; double desired_op_rate_time; double actual_rate; double walltime, cputime; double compute_val = (double)0; float delay = (float)0; double thread_qtime_stop,thread_qtime_start; off64_t traj_offset; long long w_traj_bytes_completed; long long w_traj_ops_completed; FILE *w_traj_fd; int fd; long long recs_per_buffer; long long stopped,i; off64_t written_so_far, read_so_far, re_written_so_far,re_read_so_far; long long xx,xx2; char *dummyfile [MAXSTREAMS]; /* name of dummy file */ char *nbuff; char *maddr; char *wmaddr,*free_addr; char now_string[30]; int anwser,bind_cpu; #if defined(VXFS) || defined(solaris) int test_foo = 0; #endif off64_t filebytes64; char tmpname[256]; FILE *thread_wqfd; FILE *thread_Lwqfd; if(compute_flag) delay=compute_time; nbuff=maddr=wmaddr=free_addr=0; thread_qtime_stop=thread_qtime_start=0; thread_wqfd=w_traj_fd=thread_Lwqfd=(FILE *)0; traj_offset=walltime=cputime=0; anwser=bind_cpu=0; char *stdio_buf; long long Index = 0; FILE *stream = NULL; char *filename; if(w_traj_flag) { filebytes64 = w_traj_fsize; numrecs64=w_traj_ops; } else { filebytes64 = numrecs64*reclen; } written_so_far=read_so_far=re_written_so_far=re_read_so_far=0; w_traj_bytes_completed=w_traj_ops_completed=0; recs_per_buffer = cache_size/reclen ; #ifdef NO_THREADS xx=chid; #else if(use_thread) { xx = (long long)((long)x); } else { xx=chid; } #endif #ifndef NO_THREADS #ifdef _HPUX_SOURCE if(ioz_processor_bind) { bind_cpu=(begin_proc+(int)xx)%num_processors; pthread_processor_bind_np(PTHREAD_BIND_FORCED_NP, (pthread_spu_t *)&anwser, (pthread_spu_t)bind_cpu, pthread_self()); my_nap(40); /* Switch to new cpu */ } #endif #endif if(use_thread) nbuff=barray[xx]; else nbuff=buffer; if(debug1 ) { if(use_thread) #ifdef NO_PRINT_LLD printf("\nStarting child %ld\n",(long)xx); #else printf("\nStarting child %lld\n",(long long)xx); #endif else #ifdef NO_PRINT_LLD printf("\nStarting process %d slot %ld\n",getpid(),(long)xx); #else printf("\nStarting process %d slot %lld\n",getpid(),(long long)xx); #endif } dummyfile[xx]=(char *)malloc((size_t)MAXNAMESIZE); xx2=xx; if(share_file) xx2=(long long)0; if(mfflag) { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s",filearray[xx2]); #else sprintf(dummyfile[xx],"%s",filearray[xx2]); #endif } else { #ifdef NO_PRINT_LLD sprintf(dummyfile[xx],"%s.DUMMY.%ld",filearray[xx2],xx2); #else sprintf(dummyfile[xx],"%s.DUMMY.%lld",filearray[xx2],xx2); #endif } filename=dummyfile[xx]; if(mmapflag || async_flag) return(0); stdio_buf=(char *)malloc((size_t)reclen); if(Uflag) /* Unmount and re-mount the mountpoint */ { purge_buffer_cache(); } #ifdef IRIX64 if((stream=(FILE *)fopen(filename,"r")) == 0) { printf("\nCan not fdopen temp file: %s\n", filename); perror("fdopen"); exit(51); } #else if((stream=(FILE *)I_FOPEN(filename,"r")) == 0) { printf("\nCan not fdopen temp file: %s\n", filename); perror("fdopen"); exit(52); } #endif fd=I_OPEN(filename,O_RDONLY,0); fsync(fd); close(fd); if(direct_flag) setvbuf(stream,stdio_buf,_IONBF,reclen); else setvbuf(stream,stdio_buf,_IOFBF,reclen); if(use_thread) buffer=nbuff; else buffer=mainbuffer; if(fetchon) fetchit(buffer,reclen); compute_val=(double)0; /*******************************************************************/ /*******************************************************************/ child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->throughput = 0; child_stat->actual = 0; child_stat->flag=CHILD_STATE_READY; /* Tell parent child is ready to go */ if(distributed && client_iozone) tell_master_ready(chid); if(distributed && client_iozone) { if(cdebug) { printf("Child %d waiting for go from master\n",(int)xx); fflush(stdout); } wait_for_master_go(chid); if(cdebug) { printf("Child %d received go from master\n",(int)xx); fflush(stdout); } } else { while(child_stat->flag!=CHILD_STATE_BEGIN) /* Wait for signal from parent */ Poll((long long)1); } written_so_far=0; child_stat = (struct child_stats *)&shmaddr[xx]; child_stat->actual = 0; child_stat->throughput = 0; stopped=0; if(Q_flag) { sprintf(tmpname,"Child_%d_frol.dat",(int)xx); thread_wqfd=fopen(tmpname,"a"); if(thread_wqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } fprintf(thread_wqfd,"Offset in kBytes Latency in microseconds Transfer size in bytes\n"); } if(L_flag) { sprintf(tmpname,"Child_%d.log",(int)xx); thread_Lwqfd=fopen(tmpname,"a"); if(thread_Lwqfd==0) { client_error=errno; if(distributed && client_iozone) send_stop(); printf("Unable to open %s\n",tmpname); exit(40); } get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","fread test start: ",now_string); } starttime1 = time_so_far(); if(cpuutilflag) { walltime = starttime1; cputime = cputime_so_far(); } /*******************************************************************/ for(i=0; i (MAXBUFFERSIZE-reclen)) Index=0; buffer = mbuffer + Index; } if(purge) purgeit(buffer,reclen); if(Q_flag || hist_summary || op_rate_flag) { thread_qtime_start=time_so_far(); } if(fread(buffer, (size_t) reclen,1, stream) != 1) { #ifdef _64BIT_ARCH_ #ifdef NO_PRINT_LLD printf("\nError freading block %ld %x\n", (long)i, (unsigned long)buffer); #else printf("\nError freading block %lld %llx\n", (long long)i, (unsigned long long)buffer); #endif #else #ifdef NO_PRINT_LLD printf("\nError freading block %ld %lx\n", (long)i, (long)buffer); #else printf("\nError freading block %lld %lx\n", (long long)i, (long)buffer); #endif #endif perror("read"); exit(54); } if(verify){ if(verify_buffer(buffer,reclen,(off64_t)i,reclen,(long long)pattern,sverify)){ exit(55); } } if(hist_summary) { thread_qtime_stop=time_so_far(); hist_time =(thread_qtime_stop-thread_qtime_start); hist_insert(hist_time); } if(op_rate_flag) { thread_qtime_stop=time_so_far(); desired_op_rate_time = ((double)1.0/(double)op_rate); actual_rate = (double)(thread_qtime_stop-thread_qtime_start); if( actual_rate < desired_op_rate_time) my_unap((unsigned long long)((desired_op_rate_time-actual_rate)*1000000.0 )); } if(Q_flag) { thread_qtime_stop=time_so_far(); #ifdef NO_PRINT_LLD fprintf(thread_wqfd,"%10.1ld %10.0f %10.1ld\n",(long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long)reclen); #else fprintf(thread_wqfd,"%10.1lld %10.0f %10.1lld\n",(long long)(traj_offset)/1024,((thread_qtime_stop-thread_qtime_start-time_res))*1000000,(long long)reclen); #endif } w_traj_ops_completed++; w_traj_bytes_completed+=reclen; written_so_far+=reclen/1024; } if(include_flush) fflush(stream); if(include_close) { fclose(stream); } /*******************************************************************/ if(!stopped){ temp_time = time_so_far(); if(inc_think) child_stat->throughput = ((temp_time - starttime1)-time_res); else child_stat->throughput = ((temp_time - starttime1)-time_res) -compute_val; if(child_stat->throughput < (double).000001) { child_stat->throughput= time_res; if(rec_prob < reclen) rec_prob = reclen; res_prob=1; } if(OPS_flag){ /*written_so_far=(written_so_far*1024)/reclen;*/ written_so_far=w_traj_ops_completed; } child_stat->throughput = (double)written_so_far/child_stat->throughput; child_stat->actual = (double)written_so_far; } if(cdebug) { printf("Child %d: throughput %f actual %f \n",(int)chid, child_stat->throughput, child_stat->actual); fflush(stdout); } if(cpuutilflag) { cputime = cputime_so_far() - cputime; if (cputime < cputime_res) cputime = 0.0; child_stat->cputime = cputime; walltime = time_so_far() - walltime; child_stat->walltime = walltime; } if(distributed && client_iozone) tell_master_stats(THREAD_FREAD_TEST, chid, child_stat->throughput, child_stat->actual, child_stat->cputime, child_stat->walltime, (char)*stop_flag, (long long)CHILD_STATE_HOLD); if (debug1) { #ifdef NO_PRINT_LLD printf(" child/slot: %ld, wall-cpu: %8.3f %8.3fC" " -> %6.2f%%\n",(long)xx, #else printf(" child/slot: %lld, wall-cpu: %8.3f %8.3fC" " -> %6.2f%%\n",(long long)xx, #endif walltime, cputime,cpu_util(cputime, walltime)); } child_stat->flag = CHILD_STATE_HOLD; /* Tell parent I'm done */ stopped=0; /*******************************************************************/ /* End fead performance test. *************************************/ /*******************************************************************/ if(debug1) #ifdef NO_PRINT_LLD printf("\nChild finished %ld\n",(long)xx); #else printf("\nChild finished %lld\n",(long long)xx); #endif if(Q_flag && (thread_wqfd !=0) ) fclose(thread_wqfd); free(dummyfile[xx]); if(w_traj_flag) fclose(w_traj_fd); if(L_flag) { get_date(now_string); fprintf(thread_Lwqfd,"%-25s %s","Fread test finished: ",now_string); fclose(thread_Lwqfd); } /*******************************************************************/ if(!include_close) { fflush(stream); fclose(stream); } stream = NULL; if(restf) sleep((int)(int)rest_val); free(stdio_buf); if(OPS_flag || MS_flag){ filebytes64=filebytes64/reclen; } /*******************************************************************/ if(hist_summary) dump_hist("Fread",(int)xx); if(distributed && client_iozone) return(0); #ifdef NO_THREADS exit(0); #else if(use_thread) thread_exit(); else exit(0); #endif return(0); } static void update_burst_sleep(int fd, long long reclen, double *burst_sleep_time_till_now) { if (burst_size_kb_64 == -1 || burst_sleep_duration_msec == -1) return; written_this_burst += reclen; if (written_this_burst >= (burst_size_kb_64 * 1024)) { struct timespec req, rem; int err; double sleep_start_time; written_this_burst = 0; rem.tv_sec = burst_sleep_duration_msec/1000; rem.tv_nsec = (burst_sleep_duration_msec%1000)*1000000; fsync(fd); sleep_start_time = time_so_far(); do { req = rem; err = nanosleep(&req, &rem); } while ((err == -1) && (errno == EINTR)); *burst_sleep_time_till_now += (time_so_far() - sleep_start_time); } } #ifndef NO_THREADS static void count_burst(double* burst_acc_time_sec, long long stream_id) { double burst_start_time_sec; struct timespec req, rem; int err; if (burst_size_per_child == 0 || burst_sleep_duration_msec == -1) return; /* Burst mode is handled */ burst_written_so_far[stream_id] += reclen; /* Need to sleep to empty the burst buffer ? */ if (burst_size_per_child <= burst_written_so_far[stream_id]) { burst_written_so_far[stream_id] = 0; if (!direct_flag) { fsync(fd); } /* Wait for other threads*/ burst_start_time_sec = time_so_far(); pthread_barrier_wait(barrier); /* Sleep to empty the burst buffer*/ rem.tv_sec = burst_sleep_duration_msec/1000; rem.tv_nsec = (burst_sleep_duration_msec%1000)*1000000; do { req = rem; err = nanosleep(&req, &rem); } while ((err == -1) && (errno == EINTR)); *burst_acc_time_sec += time_so_far() - burst_start_time_sec; } } #endif #ifdef NO_FORK pid_t no_fork(void) { printf("Fork not supported\n"); return(-1); } #endif #ifdef NO_SOCKET int no_socket(int x, int y, int z) { printf("Socket() not supported\n"); return(-1); } int no_accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) { printf("Accept() not supported\n"); return(-1); } int no_bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen) { printf("Bind() not supported\n"); return(-1); } int no_connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen) { printf("Connect() not supported\n"); return(-1); } #endif #ifdef NO_SIGNAL int no_kill(pid_t pid, int sig) { printf("Kill() not supported\n"); return(-1); } #endif /* * * Used to touch all of the buffers so that the CPU data * * cache is hot, and not part of the measurement. * */ void touch_dedup(char *i, int size) { register int x; register int *ip; if(N_special) { /* printf("Size ========= %d\n",size);*/ new_touch_dedup(i, size); return; } ip = (int *)i; srand(DEDUPSEED); for(x=0;x<(int)(size/sizeof(int));x++) { *ip=rand(); /* fill initial buffer */ ip++; } } /* * As quickly as possible, generate a new buffer that * can not be easily compressed, or de-duped. Also * permit specified percentage of buffer to be updated. * * ibuf ... input buffer * obuf ... output buffer * seed ... Seed to use for srand, rand -> xor ops * Seed composed from: blocknumber (do not include childnum as you want duplicates) * size ... size of buffers. (in bytes) * percent. Percent of buffer to modify. * percent_interior. Percent of buffer that is dedupable within * and across files * percent_compress. Percent of buffer that is dedupable within * but not across files * * Returns 0 (zero) for success, and -1 (minus one) for failure. */ int gen_new_buf(char *ibuf, char *obuf, long seed, int size, int percent, int percent_interior, int percent_compress, int all) { register int *ip, *op; /* Register for speed */ register int iseed; /* Register for speed */ register int isize; /* Register for speed */ register int cseed; /* seed for dedupable for within & ! across */ register int x,w; /* Register for speed */ register int value; /* Register for speed */ register int interior_size; /* size of interior dedup region */ register int compress_size; /* size of compression dedup region */ int ret = 0; if(N_special) { ret = special_gen_new_buf(ibuf, obuf, seed, size, percent, percent_interior, percent_compress, all); /* printf("Pos: %d Neg: %d\n",positives, negatives);*/ return(ret); } if(ibuf == NULL) /* no input buf */ return(-1); if(obuf == NULL) /* no output buf */ return(-1); if((percent > 100) || (percent < 0)) /* percent check */ return(-1); if(size == 0) /* size check */ return(-1); srand(seed+1+(((int)numrecs64)*dedup_mseed)); /* set random seed */ iseed = rand(); /* generate random value */ isize = (size * percent)/100; /* percent that is dedupable */ interior_size = ((isize * percent_interior)/100);/* /sizeof(int) */ compress_size =((interior_size * percent_compress)/100); ip = (int *)ibuf; /* pointer to input buf */ op = (int *)obuf; /* pointer to output buf */ if(all == 0) /* Special case for verify only */ isize = sizeof(int); memset(op,0,size); /* interior_size = dedup_within + dedup_across */ for(w=0;w 0) { srand(1+seed+((chid+chid_skew+1)*(int)numrecs64)*dedup_mseed); value=rand(); /* printf("Non-dedup value %x seed %x\n",value,seed);*/ for( ; x, 2005-10-31 # # This script is based loosely on the Generate_Graph set # of scripts that come with iozone, but is a complete re-write # # The main reason to write this was the need to compare the behaviour of # two or more different setups, for tuning filesystems or # comparing different pieces of hardware. # # This script is in the public domain, too short and too trivial # to deserve a copyright. # # Simply run iozone like, for example, ./iozone -a -g 4G > config1.out (if your machine has 4GB) # and then run perl report.pl config1.out # or get another report from another box into config2.out and run # perl report.pl config1.out config2.out # the look in the report_* directory for .png # # If you don't like png or the graphic size, search for "set terminal" in this file and put whatever gnuplot # terminal you want. Note I've also noticed that gnuplot switched the set terminal png syntax # a while back, you might need "set terminal png small size 900,700" # @Reports=@ARGV; die "usage: $0 [...]\n" if not @Reports or grep (m|^-|, @Reports); die "report files must be in current directory" if grep (m|/|, @Reports); %columns=( 'write' =>3, 'read' =>5, 'rewrite' =>4, 'reread' =>6, 'randread' =>7, 'randwrite' =>8, 'bkwdread' =>9, 'recrewrite'=>10, 'strideread'=>11, 'fwrite' =>12, 'frewrite' =>13, 'fread' =>14, 'freread' =>15, ); # # create output directory. the name is the concatenation # of all report file names (minus the file extension, plus # prefix report_) # $outdir="report_".join("_",map{/([^\.]+)(\..*)?/ && $1}(@Reports)); print STDERR "Output directory: $outdir "; if ( -d $outdir ) { print STDERR "(removing old directory) "; system "rm -rf $outdir"; } mkdir $outdir or die "cannot make directory $outdir"; print STDERR "done.\nPreparing data files..."; foreach $report (@Reports) { open(I, $report) or die "cannot open $report for reading"; $report=~/^([^\.]+)/; $datafile="$1.dat"; push @datafiles, $datafile; open(O, ">$outdir/$datafile") or die "cannot open $outdir/$datafile for writing"; open(O2, ">$outdir/2d-$datafile") or die "cannot open $outdir/$datafile for writing"; while() { next unless ( /^[\s\d]+$/ ); @split = split(); next unless ( @split >= 8 ); print O; print O2 if $split[1] == 16384 or $split[0] == $split[1]; } close I, O, O2; } print STDERR "done.\nGenerating graphs:"; foreach $column (keys %columns) { print STDERR " $column"; open(G, ">$outdir/$column.do") or die "cannot open $outdir/$column.do for writing"; print G qq{ set title "Iozone performance: $column" set grid lt 2 lw 1 set surface set parametric set xtics set ytics set logscale x 2 set logscale y 2 set autoscale z #set xrange [2.**5:2.**24] set xlabel "File size in Kbytes" set ylabel "Record size in Kbytes" set zlabel "Kbytes/sec" set style data lines set dgrid3d 80,80,3 #set terminal png small picsize 900 700 set terminal png small size 900 700 set output "$column.png" }; print G "splot ". join(", ", map{qq{"$_" using 1:2:$columns{$column} title "$_"}}(@datafiles)); print G "\n"; close G; open(G, ">$outdir/2d-$column.do") or die "cannot open $outdir/$column.do for writing"; print G qq{ set title "Iozone performance: $column" #set terminal png small picsize 450 350 set terminal png small size 450 350 set logscale x set xlabel "File size in Kbytes" set ylabel "Kbytes/sec" set output "2d-$column.png" }; print G "plot ". join(", ", map{qq{"2d-$_" using 1:$columns{$column} title "$_" with lines}}(@datafiles)); print G "\n"; close G; if ( system("cd $outdir && gnuplot $column.do && gnuplot 2d-$column.do") ) { print STDERR "(failed) "; } else { print STDERR "(ok) "; } } print STDERR "done.\n"; iozone3_508/src/current/fileop.c0000755000000000000000000013671515051766073015463 0ustar rootroot/* * Author: Don Capps * 3/13/2006 * * Author: Don Capps (capps@iozone.org) * 7417 Crenshaw * Plano, TX 75025 * * Copyright 2006, 2007, 2008, 2009 Don Capps. * * License to freely use and distribute this software is hereby granted * by the author, subject to the condition that this copyright notice * remains intact. The author retains the exclusive right to publish * derivative works based on this work, including, but not limited to, * revised versions of this work", * * fileop [-f X ]|[-l # -u #] [-s Y] [-e] [-b] [-w] [-n] [-d ] [-t] [-v] [-h] -f # Force factor. X^3 files will be created and removed. -l # Lower limit on the value of the Force factor. -u # Upper limit on the value of the Force factor. -s # Optional. Sets filesize for the create/write. May use suffix 'K' or 'M'. -e Excel importable format. -b Output best case. -w Output worst case. -n Fill files with non-compressible data. -L Leave files behind. -d Specify starting directory. -U Mount point to remount between tests. -t Verbose output option. -v Version information. -h Help text. * * X is a force factor. The total number of files will * be X * X * X ( X ^ 3 ) * The structure of the file tree is: * X number of Level 1 directories, with X number of * level 2 directories, with X number of files in each * of the level 2 directories. * * Example: fileop 2 * * dir_1 dir_2 * / \ / \ * sdir_1 sdir_2 sdir_1 sdir_2 * / \ / \ / \ / \ * file_1 file_2 file_1 file_2 file_1 file_2 file_1 file_2 * * Each file will be created, and then 1 byte is written to the file. * */ #include #include #include #include #include #include #include #include #include #include #include #if defined(Windows) #include #endif #if !defined(PATH_MAX) #define PATH_MAX 255 #endif #if defined(_SUA_) extern char *optarg; extern char *opterr; int fsync(); int getopt(); #endif int junk, *junkp; int x,excel; int verbose = 0; int sz = 1; char *mbuffer; int incr = 1; #define _STAT_CREATE 0 #define _STAT_WRITE 1 #define _STAT_CLOSE 2 #define _STAT_LINK 3 #define _STAT_UNLINK 4 #define _STAT_DELETE 5 #define _STAT_STAT 6 #define _STAT_ACCESS 7 #define _STAT_CHMOD 8 #define _STAT_READDIR 9 #define _STAT_DIR_CREATE 10 #define _STAT_DIR_DELETE 11 #define _STAT_READ 12 #define _STAT_OPEN 13 #define _STAT_DIR_TRAVERSE 14 #define _NUM_STATS 15 struct stat_struct { double starttime; double endtime; double speed; double best; double worst; double dummy; double total_time; double dummy1; long long counter; } volatile stats[_NUM_STATS]; static double time_so_far(void); void dir_create(int); void dir_traverse(int); void dir_delete(int); void file_create(int); void file_stat(int); void file_access(int); void file_chmod(int); void file_readdir(int); void file_delete(int); void file_link(int); void file_unlink(int); void file_read(int); void splash(void); void usage(void); void clear_stats(); int validate(char *, int , char ); #define THISVERSION " $Revision: 1.63 $" /*#define NULL 0*/ char version[]=THISVERSION; char thedir[PATH_MAX]="."; /* Default is to use the current directory */ const char *mountname=NULL; /* Default is not to unmount anything between the tests */ int cret; int lower, upper,range; int i; int best, worst,nc,leave; int dirlen; /************************************************************************/ /* Routine to purge the buffer cache by unmounting drive. */ /************************************************************************/ void purge_buffer_cache() { if (!mountname) return; char cwd[PATH_MAX]; char command[1024]; int ret,i; junkp=(int *)getcwd(cwd, sizeof(cwd)); junk=chdir("/"); strcpy(command,"umount "); strcat(command, mountname); /* umount might fail if the device is still busy, so retry unmounting several times with increasing delays */ for (i = 1; i < 10; ++i) { ret = system(command); if (ret == 0) break; sleep(i); /* seconds */ } strcpy(command,"mount "); strcat(command, mountname); junk=system(command); junk=chdir(cwd); } int main(int argc, char **argv) { int *intptr; if(argc == 1) { usage(); exit(1); } while((cret = getopt(argc,argv,"hbLnwetvf:s:l:u:d:U:i: ")) != EOF){ switch(cret){ case 'h': usage(); exit(0); break; case 'd' : dirlen=strlen(optarg); if (optarg[dirlen-1]=='/') --dirlen; strncpy(thedir, optarg, dirlen); thedir[dirlen] = 0; break; case 'U': mountname = optarg; break; case 'i': /* Increment force by */ incr=atoi(optarg); if(incr < 0) incr=1; break; case 'f': /* Force factor */ x=atoi(optarg); if(x < 0) x=1; break; case 's': /* Size of files */ sz=atoi(optarg); if(optarg[strlen(optarg)-1]=='k' || optarg[strlen(optarg)-1]=='K'){ sz = (1024 * atoi(optarg)); } if(optarg[strlen(optarg)-1]=='m' || optarg[strlen(optarg)-1]=='M'){ sz = (1024 * 1024 * atoi(optarg)); } if(sz < 0) sz=1; break; case 'l': /* lower force value */ lower=atoi(optarg); range=1; if(lower < 0) lower=1; break; case 'v': /* version */ splash(); exit(0); break; case 'u': /* upper force value */ upper=atoi(optarg); range=1; if(upper < 0) upper=1; break; case 't': /* verbose */ verbose=1; break; case 'e': /* Excel */ excel=1; break; case 'b': /* Best */ best=1; break; case 'w': /* Worst */ worst=1; break; case 'L': /* Leave files behind */ leave=1; break; case 'n': /* non-compressible */ nc=1; break; } } mbuffer=(char *)malloc(sz); if(nc) { intptr = (int *)mbuffer; for(i=0;i stats[_STAT_DIR_CREATE].worst) stats[_STAT_DIR_CREATE].worst=stats[_STAT_DIR_CREATE].speed; junk=chdir(buf); for(j=0;j stats[_STAT_DIR_CREATE].worst) stats[_STAT_DIR_CREATE].worst=stats[_STAT_DIR_CREATE].speed; junk=chdir(buf); for(k=0;k stats[_STAT_DIR_CREATE].worst) stats[_STAT_DIR_CREATE].worst=stats[_STAT_DIR_CREATE].speed; junk=chdir(buf); junk=chdir(".."); } junk=chdir(".."); } junk=chdir(".."); } } void dir_traverse(int x) { int i,j,k; char buf[100]; double time1, time2; stats[_STAT_DIR_TRAVERSE].best=(double)99999.9; stats[_STAT_DIR_TRAVERSE].worst=(double)0.00000000; for(i=0;i stats[_STAT_DIR_TRAVERSE].worst) stats[_STAT_DIR_TRAVERSE].worst=stats[_STAT_DIR_TRAVERSE].speed; } stats[_STAT_DIR_TRAVERSE].starttime=time_so_far(); junk=chdir(".."); stats[_STAT_DIR_TRAVERSE].endtime=time_so_far(); stats[_STAT_DIR_TRAVERSE].speed=time2+stats[_STAT_DIR_TRAVERSE].endtime-stats[_STAT_DIR_TRAVERSE].starttime; if(stats[_STAT_DIR_TRAVERSE].speed < (double)0.0) stats[_STAT_DIR_TRAVERSE].speed=(double) 0.0; stats[_STAT_DIR_TRAVERSE].total_time+=stats[_STAT_DIR_TRAVERSE].speed; stats[_STAT_DIR_TRAVERSE].counter++; if(stats[_STAT_DIR_TRAVERSE].speed < stats[_STAT_DIR_TRAVERSE].best) stats[_STAT_DIR_TRAVERSE].best=stats[_STAT_DIR_TRAVERSE].speed; if(stats[_STAT_DIR_TRAVERSE].speed > stats[_STAT_DIR_TRAVERSE].worst) stats[_STAT_DIR_TRAVERSE].worst=stats[_STAT_DIR_TRAVERSE].speed; } stats[_STAT_DIR_TRAVERSE].starttime=time_so_far(); junk=chdir(".."); stats[_STAT_DIR_TRAVERSE].endtime=time_so_far(); stats[_STAT_DIR_TRAVERSE].speed=time1+stats[_STAT_DIR_TRAVERSE].endtime-stats[_STAT_DIR_TRAVERSE].starttime; if(stats[_STAT_DIR_TRAVERSE].speed < (double)0.0) stats[_STAT_DIR_TRAVERSE].speed=(double)0.0; stats[_STAT_DIR_TRAVERSE].total_time+=stats[_STAT_DIR_TRAVERSE].speed; stats[_STAT_DIR_TRAVERSE].counter++; if(stats[_STAT_DIR_TRAVERSE].speed < stats[_STAT_DIR_TRAVERSE].best) stats[_STAT_DIR_TRAVERSE].best=stats[_STAT_DIR_TRAVERSE].speed; if(stats[_STAT_DIR_TRAVERSE].speed > stats[_STAT_DIR_TRAVERSE].worst) stats[_STAT_DIR_TRAVERSE].worst=stats[_STAT_DIR_TRAVERSE].speed; } } void file_create(int x) { int i,j,k,m; int fd; int ret; char buf[100]; char value; int *intptr; stats[_STAT_CREATE].best=(double)999999.9; stats[_STAT_CREATE].worst=(double)0.0; stats[_STAT_WRITE].best=(double)999999.9; stats[_STAT_WRITE].worst=(double)0.0; stats[_STAT_CLOSE].best=(double)999999.9; stats[_STAT_CLOSE].worst=(double)0.0; for(i=0;i stats[_STAT_CREATE].worst) stats[_STAT_CREATE].worst=stats[_STAT_CREATE].speed; stats[_STAT_WRITE].starttime=time_so_far(); if(nc) { intptr = (int *)mbuffer; for(m=0;m stats[_STAT_WRITE].worst) stats[_STAT_WRITE].worst=stats[_STAT_WRITE].speed; fsync(fd); stats[_STAT_CLOSE].starttime=time_so_far(); close(fd); stats[_STAT_CLOSE].endtime=time_so_far(); stats[_STAT_CLOSE].speed=stats[_STAT_CLOSE].endtime-stats[_STAT_CLOSE].starttime; if(stats[_STAT_CLOSE].speed < (double)0.0) stats[_STAT_CLOSE].speed=(double)0.0; stats[_STAT_CLOSE].total_time+=stats[_STAT_CLOSE].speed; stats[_STAT_CLOSE].counter++; if(stats[_STAT_CLOSE].speed < stats[_STAT_CLOSE].best) stats[_STAT_CLOSE].best=stats[_STAT_CLOSE].speed; if(stats[_STAT_CLOSE].speed > stats[_STAT_CLOSE].worst) stats[_STAT_CLOSE].worst=stats[_STAT_CLOSE].speed; } junk=chdir(".."); } junk=chdir(".."); } } void file_stat(int x) { int i,j,k,y; char buf[100]; struct stat mystat; stats[_STAT_STAT].best=(double)99999.9; stats[_STAT_STAT].worst=(double)0.00000000; for(i=0;i stats[_STAT_STAT].worst) stats[_STAT_STAT].worst=stats[_STAT_STAT].speed; } junk=chdir(".."); } junk=chdir(".."); } } void file_access(int x) { int i,j,k,y; char buf[100]; stats[_STAT_ACCESS].best=(double)999999.9; stats[_STAT_ACCESS].worst=(double)0.0; for(i=0;i stats[_STAT_ACCESS].worst) stats[_STAT_ACCESS].worst=stats[_STAT_ACCESS].speed; } junk=chdir(".."); } junk=chdir(".."); } } void file_chmod(int x) { int i,j,k,y; char buf[100]; stats[_STAT_CHMOD].best=(double)999999.9; stats[_STAT_CHMOD].worst=(double)0.0; for(i=0;i stats[_STAT_CHMOD].worst) stats[_STAT_CHMOD].worst=stats[_STAT_CHMOD].speed; } junk=chdir(".."); } junk=chdir(".."); } } void file_readdir(int x) { int i,j,ret1; char buf[100]; DIR *dirbuf; struct dirent *y; stats[_STAT_READDIR].best=(double)999999.9; stats[_STAT_READDIR].worst=(double)0.0; for(i=0;i stats[_STAT_READDIR].worst) stats[_STAT_READDIR].worst=stats[_STAT_READDIR].speed; ret1=closedir(dirbuf); if(ret1 < 0) { printf("closedir failed\n"); exit(1); } junk=chdir(".."); } junk=chdir(".."); } } void file_link(int x) { int i,j,k,y; char buf[100]; char bufn[100]; stats[_STAT_LINK].best=(double)999999.9; stats[_STAT_LINK].worst=(double)0.0; for(i=0;i stats[_STAT_LINK].worst) stats[_STAT_LINK].worst=stats[_STAT_LINK].speed; } junk=chdir(".."); } junk=chdir(".."); } } void file_unlink(int x) { int i,j,k,y; char buf[100]; char bufn[100]; stats[_STAT_UNLINK].best=(double)999999.9; stats[_STAT_UNLINK].worst=(double)0.0; for(i=0;i stats[_STAT_UNLINK].worst) stats[_STAT_UNLINK].worst=stats[_STAT_UNLINK].speed; } junk=chdir(".."); } junk=chdir(".."); } } void dir_delete(int x) { int i,j,k; char buf[100]; stats[_STAT_DIR_DELETE].best=(double)99999.9; stats[_STAT_DIR_DELETE].worst=(double)0.00000000; for(i=0;i stats[_STAT_DIR_DELETE].worst) stats[_STAT_DIR_DELETE].worst=stats[_STAT_DIR_DELETE].speed; } junk=chdir(".."); sprintf(buf,"fileop_L1_%d_L2_%d",i,j); stats[_STAT_DIR_DELETE].starttime=time_so_far(); rmdir(buf); stats[_STAT_DIR_DELETE].endtime=time_so_far(); stats[_STAT_DIR_DELETE].speed=stats[_STAT_DIR_DELETE].endtime-stats[_STAT_DIR_DELETE].starttime; if(stats[_STAT_DIR_DELETE].speed < (double)0.0) stats[_STAT_DIR_DELETE].speed=(double)0.0; stats[_STAT_DIR_DELETE].total_time+=stats[_STAT_DIR_DELETE].speed; stats[_STAT_DIR_DELETE].counter++; if(stats[_STAT_DIR_DELETE].speed < stats[_STAT_DIR_DELETE].best) stats[_STAT_DIR_DELETE].best=stats[_STAT_DIR_DELETE].speed; if(stats[_STAT_DIR_DELETE].speed > stats[_STAT_DIR_DELETE].worst) stats[_STAT_DIR_DELETE].worst=stats[_STAT_DIR_DELETE].speed; } junk=chdir(".."); sprintf(buf,"fileop_L1_%d",i); stats[_STAT_DIR_DELETE].starttime=time_so_far(); rmdir(buf); stats[_STAT_DIR_DELETE].endtime=time_so_far(); stats[_STAT_DIR_DELETE].speed=stats[_STAT_DIR_DELETE].endtime-stats[_STAT_DIR_DELETE].starttime; if(stats[_STAT_DIR_DELETE].speed < (double)0.0) stats[_STAT_DIR_DELETE].speed=(double)0.0; stats[_STAT_DIR_DELETE].total_time+=stats[_STAT_DIR_DELETE].speed; stats[_STAT_DIR_DELETE].counter++; if(stats[_STAT_DIR_DELETE].speed < stats[_STAT_DIR_DELETE].best) stats[_STAT_DIR_DELETE].best=stats[_STAT_DIR_DELETE].speed; if(stats[_STAT_DIR_DELETE].speed > stats[_STAT_DIR_DELETE].worst) stats[_STAT_DIR_DELETE].worst=stats[_STAT_DIR_DELETE].speed; } } void file_delete(int x) { int i,j,k; char buf[100]; stats[_STAT_DELETE].best=(double)999999.9; stats[_STAT_DELETE].worst=(double)0.0; for(i=0;i stats[_STAT_DELETE].worst) stats[_STAT_DELETE].worst=stats[_STAT_DELETE].speed; } junk=chdir(".."); sprintf(buf,"fileop_L1_%d_L2_%d",i,j); rmdir(buf); } junk=chdir(".."); sprintf(buf,"fileop_L1_%d",i); rmdir(buf); } } void file_read(int x) { int i,j,k,y,fd; char buf[100]; char value = 0; stats[_STAT_READ].best=(double)99999.9; stats[_STAT_READ].worst=(double)0.00000000; stats[_STAT_OPEN].best=(double)99999.9; stats[_STAT_OPEN].worst=(double)0.00000000; for(i=0;i stats[_STAT_OPEN].worst) stats[_STAT_OPEN].worst=stats[_STAT_OPEN].speed; stats[_STAT_READ].starttime=time_so_far(); y=read(fd,mbuffer,sz); if(y < 0) { printf("Read failed\n"); exit(1); } if(!nc) { if(validate(mbuffer,sz, value) !=0) printf("Error: Data Mis-compare\n");; } stats[_STAT_READ].endtime=time_so_far(); close(fd); stats[_STAT_READ].speed=stats[_STAT_READ].endtime-stats[_STAT_READ].starttime; if(stats[_STAT_READ].speed < (double)0.0) stats[_STAT_READ].speed=(double)0.0; stats[_STAT_READ].total_time+=stats[_STAT_READ].speed; stats[_STAT_READ].counter++; if(stats[_STAT_READ].speed < stats[_STAT_READ].best) stats[_STAT_READ].best=stats[_STAT_READ].speed; if(stats[_STAT_READ].speed > stats[_STAT_READ].worst) stats[_STAT_READ].worst=stats[_STAT_READ].speed; } junk=chdir(".."); } junk=chdir(".."); } } /************************************************************************/ /* Time measurement routines. Thanks to Iozone :-) */ /************************************************************************/ #ifdef HAVE_ANSIC_C static double time_so_far(void) #else static double time_so_far() #endif { #ifdef Windows LARGE_INTEGER freq,counter; double wintime,bigcounter; /* For Windows the time_of_day() is useless. It increments in 55 milli second */ /* increments. By using the Win32api one can get access to the high performance */ /* measurement interfaces. With this one can get back into the 8 to 9 */ /* microsecond resolution. */ QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&counter); bigcounter=(double)counter.HighPart *(double)0xffffffff + (double)counter.LowPart; wintime = (double)(bigcounter/(double)freq.LowPart); return((double)wintime); #else #if defined (OSFV4) || defined(OSFV3) || defined(OSFV5) struct timespec gp; if (getclock(TIMEOFDAY, (struct timespec *) &gp) == -1) perror("getclock"); return (( (double) (gp.tv_sec)) + ( ((float)(gp.tv_nsec)) * 0.000000001 )); #else struct timeval tp; if (gettimeofday(&tp, (struct timezone *) NULL) == -1) perror("gettimeofday"); return ((double) (tp.tv_sec)) + (((double) tp.tv_usec) * 0.000001 ); #endif #endif } void splash(void) { printf("\n"); printf(" --------------------------------------\n"); printf(" | Fileop | \n"); printf(" | %s | \n",version); printf(" | | \n"); printf(" | by |\n"); printf(" | | \n"); printf(" | Don Capps |\n"); printf(" --------------------------------------\n"); printf("\n"); } void usage(void) { splash(); printf(" fileop [-f X ]|[-l # -u #] [-s Y] [-e] [-b] [-w] [-n] [-d ] [-t] [-v] [-h]\n"); printf("\n"); printf(" -f # Force factor. X^3 files will be created and removed.\n"); printf(" -l # Lower limit on the value of the Force factor.\n"); printf(" -u # Upper limit on the value of the Force factor.\n"); printf(" -s # Optional. Sets filesize for the create/write. May use suffix 'K' or 'M'.\n"); printf(" -e Excel importable format.\n"); printf(" -b Output best case results.\n"); printf(" -i # Increment force factor by this increment.\n"); printf(" -w Output worst case results.\n"); printf(" -n Fill files with non-compressible data.\n"); printf(" -L Leave files behind.\n"); printf(" -d Specify starting directory.\n"); printf(" -U Mount point to remount between tests.\n"); printf(" -t Verbose output option.\n"); printf(" -v Version information.\n"); printf(" -h Help text.\n"); printf("\n"); printf(" The structure of the file tree is:\n"); printf(" X number of Level 1 directories, with X number of\n"); printf(" level 2 directories, with X number of files in each\n"); printf(" of the level 2 directories.\n"); printf("\n"); printf(" Example: fileop 2\n"); printf("\n"); printf(" dir_1 dir_2\n"); printf(" / \\ / \\ \n"); printf(" sdir_1 sdir_2 sdir_1 sdir_2\n"); printf(" / \\ / \\ / \\ / \\ \n"); printf(" file_1 file_2 file_1 file_2 file_1 file_2 file_1 file_2\n"); printf("\n"); printf(" Each file will be created, and then Y bytes is written to the file.\n"); printf("\n"); } void clear_stats() { int i; for(i=0;i<_NUM_STATS;i++) memset((char *)&stats[i],0,sizeof(struct stat_struct)); } int validate(char *buffer, int size, char value) { register int i; register char *cp; register char v1; v1=value; cp = buffer; for(i=0;i /* errno declaration & error codes. */ #include /* getaddrinfo(3) et al. */ #include /* sockaddr_in & sockaddr_in6 definition. */ #include /* printf(3) et al. */ #include /* exit(2). */ #include /* String manipulation & memory functions. */ #if defined(_SUA_) #include /* poll(2) and related definitions. */ #else #include /* poll(2) and related definitions. */ #endif #include /* Socket functions (socket(2), bind(2), etc). */ #include /* time(2) & ctime(3). */ #include /* gettimeofday */ #include /* getopt(3), read(2), etc. */ /* Include for Cygnus development environment for Windows */ #if defined (Windows) #include int errno; #endif #if defined(_SUA_) extern char *optarg, *opterr; #endif /* ** Constants. ** ** Please remember to add PIT service to the /etc/services file. */ #define DFLT_SERVICE "PIT" /* Programmable Interdimensional Timer */ #define INVALID_DESC -1 /* Invalid file descriptor. */ #define MAXCONNQLEN 3 /* Max nbr of connection requests to queue. */ #define MAXTCPSCKTS 2 /* One TCP socket for IPv4 & one for IPv6. */ #define MAXUDPSCKTS 2 /* One UDP socket for IPv4 & one for IPv6. */ #define VALIDOPTS "vh:p:" /* Valid command options. */ /* ** Simple boolean type definition. */ int my_false = 0; int my_true = 1; /* ** Prototypes for internal helper functions. */ static int openSckt( const char *service, const char *protocol, int desc[ ], size_t *descSize ); static void pit( int tSckt[ ], size_t tScktSize, int uSckt[ ], size_t uScktSize ); /* ** Global data objects. */ static char hostBfr[ NI_MAXHOST ]; /* For use w/getnameinfo(3). */ static const char *pgmName; /* Program name w/o dir prefix. */ static char servBfr[ NI_MAXSERV ]; /* For use w/getnameinfo(3). */ static int verbose = 0; /* Verbose mode indication. */ struct timeval tm; /* Timeval structure, used with gettimeofday() */ char timeStr[40]; /* String for time in microseconds */ char service_name[20]; int need; /* ** Usage macro for command syntax violations. */ #define USAGE \ { \ fprintf( stderr, \ "Usage: %s [-v] -p service \n", \ pgmName ); \ exit( 127 ); \ } /* End USAGE macro. */ /* ** Macro to terminate the program if a system call error occurs. The system ** call must be one of the usual type that returns -1 on error. */ #define CHK(expr) \ do \ { \ if ( (expr) == -1 ) \ { \ fprintf( stderr, \ "%s (line %d): System call ERROR - %s.\n", \ pgmName, \ __LINE__, \ strerror( errno ) ); \ exit( 1 ); \ } /* End IF system call failed. */ \ } while ( my_false ) /****************************************************************************** * Function: main * * Description: * Set up a PIT server and handle network requests. This server * handles both TCP and UDP requests. * * Parameters: * The usual argc and argv parameters to a main() function. * * Return Value: * This is a daemon program and never returns. However, in the degenerate * case where no sockets are created, the function returns zero. ******************************************************************************/ int main( int argc, char *argv[ ] ) { int opt; int tSckt[ MAXTCPSCKTS ]; /* Array of TCP socket descriptors. */ size_t tScktSize = MAXTCPSCKTS; /* Size of uSckt (# of elements). */ int uSckt[ MAXUDPSCKTS ]; /* Array of UDP socket descriptors. */ size_t uScktSize = MAXUDPSCKTS; /* Size of uSckt (# of elements). */ strcpy(service_name,DFLT_SERVICE); /* ** Set the program name (w/o directory prefix). */ pgmName = strrchr( argv[ 0 ], '/' ); pgmName = pgmName == NULL ? argv[ 0 ] : pgmName + 1; /* ** Process command options. */ opterr = 0; /* Turns off "invalid option" error messages. */ while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) >= 0 ) { switch ( opt ) { case 'v': /* Verbose mode. */ { verbose = my_true; break; } case 'p': /* Get the port number */ { strcpy(service_name,optarg); need++; break; } default: { USAGE; } } /* End SWITCH on command option. */ } /* End WHILE processing options. */ if(need < 1) { USAGE; } /* ** Open both a TCP and UDP socket, for both IPv4 & IPv6, on which to receive ** service requests. */ if ( ( openSckt( service_name, "tcp", tSckt, &tScktSize ) < 0 ) || ( openSckt( service_name, "udp", uSckt, &uScktSize ) < 0 ) ) { exit( 1 ); } /* ** Run the Programmable Interdimensional Timer server. */ if ( ( tScktSize > 0 ) || ( uScktSize > 0 ) ) { pit( tSckt, /* pit() never returns. */ tScktSize, uSckt, uScktSize ); } /* ** Since pit() never returns, execution only gets here if no sockets were ** created. */ if ( verbose ) { fprintf( stderr, "%s: No sockets opened... terminating.\n", pgmName ); } return 0; } /* End main() */ /****************************************************************************** * Function: openSckt * * Description: * Open passive (server) sockets for the indicated inet service & protocol. * Notice in the last sentence that "sockets" is plural. During the interim * transition period while everyone is switching over to IPv6, the server * application has to open two sockets on which to listen for connections... * one for IPv4 traffic and one for IPv6 traffic. * * Parameters: * service - Pointer to a character string representing the well-known port * on which to listen (can be a service name or a decimal number). * protocol - Pointer to a character string representing the transport layer * protocol (only "tcp" or "udp" are valid). * desc - Pointer to an array into which the socket descriptors are * placed when opened. * descSize - This is a value-result parameter. On input, it contains the * max number of descriptors that can be put into 'desc' (i.e. the * number of elements in the array). Upon return, it will contain * the number of descriptors actually opened. Any unused slots in * 'desc' are set to INVALID_DESC. * * Return Value: * 0 on success, -1 on error. ******************************************************************************/ static int openSckt( const char *service, const char *protocol, int desc[ ], size_t *descSize ) { struct addrinfo *ai; int aiErr; struct addrinfo *aiHead; struct addrinfo hints = { .ai_flags = AI_PASSIVE, /* Server mode. */ .ai_family = PF_UNSPEC }; /* IPv4 or IPv6. */ size_t maxDescs = *descSize; /* ** Initialize output parameters. When the loop completes, *descSize is 0. */ while ( *descSize > 0 ) { desc[ --( *descSize ) ] = INVALID_DESC; } /* ** Check which protocol is selected (only TCP and UDP are valid). */ if ( strcmp( protocol, "tcp" ) == 0 ) /* TCP protocol. */ { hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; } else if ( strcmp( protocol, "udp" ) == 0 ) /* UDP protocol. */ { hints.ai_socktype = SOCK_DGRAM; hints.ai_protocol = IPPROTO_UDP; } else /* Invalid protocol. */ { fprintf( stderr, "%s (line %d): ERROR - Unknown transport " "layer protocol \"%s\".\n", pgmName, __LINE__, protocol ); return -1; } /* ** Look up the service's "well-known" port number. Notice that NULL is being ** passed for the 'node' parameter, and that the AI_PASSIVE flag is set in ** 'hints'. Thus, the program is requesting passive address information. ** The network address is initialized to :: (all zeros) for IPv6 records, or ** 0.0.0.0 for IPv4 records. */ if ( ( aiErr = getaddrinfo( NULL, service, &hints, &aiHead ) ) != 0 ) { fprintf( stderr, "%s (line %d): ERROR - %s.\n", pgmName, __LINE__, gai_strerror( aiErr ) ); return -1; } /* ** For each of the address records returned, attempt to set up a passive ** socket. */ for ( ai = aiHead; ( ai != NULL ) && ( *descSize < maxDescs ); ai = ai->ai_next ) { if ( verbose ) { /* ** Display the current address info. Start with the protocol- ** independent fields first. */ fprintf( stderr, "Setting up a passive socket based on the " "following address info:\n" " ai_flags = 0x%02X\n" " ai_family = %d (PF_INET = %d, PF_INET6 = %d)\n" " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n" " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n" " ai_addrlen = %d (sockaddr_in = %zu, " "sockaddr_in6 = %zu)\n", ai->ai_flags, ai->ai_family, PF_INET, PF_INET6, ai->ai_socktype, SOCK_STREAM, SOCK_DGRAM, ai->ai_protocol, IPPROTO_TCP, IPPROTO_UDP, ai->ai_addrlen, sizeof( struct sockaddr_in ), sizeof( struct sockaddr_in6 ) ); /* ** Now display the protocol-specific formatted socket address. Note ** that the program is requesting that getnameinfo(3) convert the ** host & service into numeric strings. */ getnameinfo( ai->ai_addr, ai->ai_addrlen, hostBfr, sizeof( hostBfr ), servBfr, sizeof( servBfr ), NI_NUMERICHOST | NI_NUMERICSERV ); switch ( ai->ai_family ) { case PF_INET: /* IPv4 address record. */ { struct sockaddr_in *p = (struct sockaddr_in*) ai->ai_addr; fprintf( stderr, " ai_addr = sin_family: %d (AF_INET = %d, " "AF_INET6 = %d)\n" " sin_addr: %s\n" " sin_port: %s\n", p->sin_family, AF_INET, AF_INET6, hostBfr, servBfr ); break; } /* End CASE of IPv4. */ case PF_INET6: /* IPv6 address record. */ { struct sockaddr_in6 *p = (struct sockaddr_in6*) ai->ai_addr; fprintf( stderr, " ai_addr = sin6_family: %d (AF_INET = %d, " "AF_INET6 = %d)\n" " sin6_addr: %s\n" " sin6_port: %s\n" " sin6_flowinfo: %d\n" " sin6_scope_id: %d\n", p->sin6_family, AF_INET, AF_INET6, hostBfr, servBfr, p->sin6_flowinfo, p->sin6_scope_id ); break; } /* End CASE of IPv6. */ default: /* Can never get here, but just for completeness. */ { fprintf( stderr, "%s (line %d): ERROR - Unknown protocol family (%d).\n", pgmName, __LINE__, ai->ai_family ); freeaddrinfo( aiHead ); return -1; } /* End DEFAULT case (unknown protocol family). */ } /* End SWITCH on protocol family. */ } /* End IF verbose mode. */ /* ** Create a socket using the info in the addrinfo structure. */ CHK( desc[ *descSize ] = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol ) ); /* ** Here is the code that prevents "IPv4 mapped addresses", as discussed ** in Section 22.1.3.1. If an IPv6 socket was just created, then set the ** IPV6_V6ONLY socket option. */ if ( ai->ai_family == PF_INET6 ) { #if defined( IPV6_V6ONLY ) /* ** Disable IPv4 mapped addresses. */ int v6Only = 1; CHK( setsockopt( desc[ *descSize ], IPPROTO_IPV6, IPV6_V6ONLY, &v6Only, sizeof( v6Only ) ) ); #else /* ** IPV6_V6ONLY is not defined, so the socket option can't be set and ** thus IPv4 mapped addresses can't be disabled. Print a warning ** message and close the socket. Design note: If the ** #if...#else...#endif construct were removed, then this program ** would not compile (because IPV6_V6ONLY isn't defined). That's an ** acceptable approach; IPv4 mapped addresses are certainly disabled ** if the program can't build! However, since this program is also ** designed to work for IPv4 sockets as well as IPv6, I decided to ** allow the program to compile when IPV6_V6ONLY is not defined, and ** turn it into a run-time warning rather than a compile-time error. ** IPv4 mapped addresses are still disabled because _all_ IPv6 traffic ** is disabled (all IPv6 sockets are closed here), but at least this ** way the server can still service IPv4 network traffic. */ fprintf( stderr, "%s (line %d): WARNING - Cannot set IPV6_V6ONLY socket " "option. Closing IPv6 %s socket.\n", pgmName, __LINE__, ai->ai_protocol == IPPROTO_TCP ? "TCP" : "UDP" ); CHK( close( desc[ *descSize ] ) ); continue; /* Go to top of FOR loop w/o updating *descSize! */ #endif /* IPV6_V6ONLY */ } /* End IF this is an IPv6 socket. */ /* ** Bind the socket. Again, the info from the addrinfo structure is used. */ CHK( bind( desc[ *descSize ], ai->ai_addr, ai->ai_addrlen ) ); /* ** If this is a TCP socket, put the socket into passive listening mode ** (listen is only valid on connection-oriented sockets). */ if ( ai->ai_socktype == SOCK_STREAM ) { CHK( listen( desc[ *descSize ], MAXCONNQLEN ) ); } /* ** Socket set up okay. Bump index to next descriptor array element. */ *descSize += 1; } /* End FOR each address info structure returned. */ /* ** Dummy check for unused address records. */ if ( verbose && ( ai != NULL ) ) { fprintf( stderr, "%s (line %d): WARNING - Some address records were " "not processed due to insufficient array space.\n", pgmName, __LINE__ ); } /* End IF verbose and some address records remain unprocessed. */ /* ** Clean up. */ freeaddrinfo( aiHead ); return 0; } /* End openSckt() */ /****************************************************************************** * Function: pit * * Description: * Listen on a set of sockets and send the current microsecond counter * that was produced by gettimeofday(), to any clients. This function * never returns. * * Parameters: * tSckt - Array of TCP socket descriptors on which to listen. * tScktSize - Size of the tSckt array (nbr of elements). * uSckt - Array of UDP socket descriptors on which to listen. * uScktSize - Size of the uSckt array (nbr of elements). * * Return Value: None. ******************************************************************************/ static void pit( int tSckt[ ], size_t tScktSize, int uSckt[ ], size_t uScktSize ) { char bfr[ 256 ]; ssize_t count; struct pollfd *desc; size_t descSize = tScktSize + uScktSize; int idx; int newSckt; struct sockaddr *sadr; socklen_t sadrLen; struct sockaddr_storage sockStor; int status; size_t timeLen; time_t timeVal; ssize_t wBytes; unsigned long long secs; int ret; /* ** Allocate memory for the poll(2) array. */ desc = malloc( descSize * sizeof( struct pollfd ) ); if ( desc == NULL ) { fprintf( stderr, "%s (line %d): ERROR - %s.\n", pgmName, __LINE__, strerror( ENOMEM ) ); exit( 1 ); } /* ** Initialize the poll(2) array. */ for ( idx = 0; idx < descSize; idx++ ) { desc[ idx ].fd = idx < tScktSize ? tSckt[ idx ] : uSckt[ idx - tScktSize ]; desc[ idx ].events = POLLIN; desc[ idx ].revents = 0; } /* ** Main PIT server loop. Handles both TCP & UDP requests. This is ** an interative server, and all requests are handled directly within the ** main loop. */ while ( my_true ) /* Do forever. */ { /* ** Wait for activity on one of the sockets. The DO..WHILE construct is ** used to restart the system call in the event the process is ** interrupted by a signal. */ do { status = poll( desc, descSize, -1 /* Wait indefinitely for input. */ ); } while ( ( status < 0 ) && ( errno == EINTR ) ); CHK( status ); /* Check for a bona fide system call error. */ /* ** Get the current time. */ #if defined(Windows) LARGE_INTEGER freq,counter; double wintime,bigcounter; /* For Windows the time_of_day() is useless. It increments in 55 milli * second increments. By using the Win32api one can get access to the * high performance measurement interfaces. With this one can get back * into the 8 to 9 microsecond resolution. */ QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&counter); bigcounter=(double)counter.HighPart *(double)0xffffffff + (double)counter.LowPart; wintime = (double)(bigcounter/(double)freq.LowPart); secs = (long long)(wintime * 1000000); #else ret = gettimeofday( &tm,0 ); secs = ((unsigned long long)tm.tv_sec * 1000000) + (unsigned long long)tm.tv_usec; #endif ret = sprintf(timeStr,"%llu",secs); timeLen = strlen( timeStr ); /* ** Process sockets with input available. */ for ( idx = 0; idx < descSize; idx++ ) { switch ( desc[ idx ].revents ) { case 0: /* No activity on this socket; try the next. */ continue; case POLLIN: /* Network activity. Go process it. */ break; default: /* Invalid poll events. */ { fprintf( stderr, "%s (line %d): ERROR - Invalid poll event (0x%02X).\n", pgmName, __LINE__, desc[ idx ].revents ); exit( 1 ); } } /* End SWITCH on returned poll events. */ /* ** Determine if this is a TCP request or UDP request. */ if ( idx < tScktSize ) { /* ** TCP connection requested. Accept it. Notice the use of ** the sockaddr_storage data type. */ sadrLen = sizeof( sockStor ); sadr = (struct sockaddr*) &sockStor; CHK( newSckt = accept( desc[ idx ].fd, sadr, &sadrLen ) ); CHK( shutdown( newSckt, /* Server never recv's anything. */ SHUT_RD ) ); if ( verbose ) { /* ** Display the socket address of the remote client. Begin with ** the address-independent fields. */ fprintf( stderr, "Sockaddr info for new TCP client:\n" " sa_family = %d (AF_INET = %d, AF_INET6 = %d)\n" " addr len = %d (sockaddr_in = %zu, " "sockaddr_in6 = %zu)\n", sadr->sa_family, AF_INET, AF_INET6, sadrLen, sizeof( struct sockaddr_in ), sizeof( struct sockaddr_in6 ) ); /* ** Display the address-specific fields. */ getnameinfo( sadr, sadrLen, hostBfr, sizeof( hostBfr ), servBfr, sizeof( servBfr ), NI_NUMERICHOST | NI_NUMERICSERV ); /* ** Notice that we're switching on an address family now, not a ** protocol family. */ switch ( sadr->sa_family ) { case AF_INET: /* IPv4 address. */ { struct sockaddr_in *p = (struct sockaddr_in*) sadr; fprintf( stderr, " sin_addr = sin_family: %d\n" " sin_addr: %s\n" " sin_port: %s\n", p->sin_family, hostBfr, servBfr ); break; } /* End CASE of IPv4. */ case AF_INET6: /* IPv6 address. */ { struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr; fprintf( stderr, " sin6_addr = sin6_family: %d\n" " sin6_addr: %s\n" " sin6_port: %s\n" " sin6_flowinfo: %d\n" " sin6_scope_id: %d\n", p->sin6_family, hostBfr, servBfr, p->sin6_flowinfo, p->sin6_scope_id ); break; } /* End CASE of IPv6. */ default: /* Can never get here, but for completeness. */ { fprintf( stderr, "%s (line %d): ERROR - Unknown address " "family (%d).\n", pgmName, __LINE__, sadr->sa_family ); break; } /* End DEFAULT case (unknown address family). */ } /* End SWITCH on address family. */ } /* End IF verbose mode. */ /* ** Send the PIT to the client. */ wBytes = timeLen; while ( wBytes > 0 ) { do { count = write( newSckt, timeStr, wBytes ); } while ( ( count < 0 ) && ( errno == EINTR ) ); CHK( count ); /* Check for an error. */ wBytes -= count; } /* End WHILE there is data to send. */ CHK( close( newSckt ) ); } /* End IF this was a TCP connection request. */ else { /* ** This is a UDP socket, and a datagram is available. The funny ** thing about UDP requests is that this server doesn't require any ** client input; but it can't send the PIT unless it knows a client ** wants the data, and the only way that can occur with UDP is if ** the server receives a datagram from the client. Thus, the ** server must receive _something_, but the content of the datagram ** is irrelevant. Read in the datagram. Again note the use of ** sockaddr_storage to receive the address. */ sadrLen = sizeof( sockStor ); sadr = (struct sockaddr*) &sockStor; CHK( count = recvfrom( desc[ idx ].fd, bfr, sizeof( bfr ), 0, sadr, &sadrLen ) ); /* ** Display whatever was received on stdout. */ if ( verbose ) { ssize_t rBytes = count; fprintf( stderr, "%s: UDP datagram received (%zd bytes).\n", pgmName, count ); while ( count > 0 ) { fputc( bfr[ rBytes - count-- ], stdout ); } if ( bfr[ rBytes-1 ] != '\n' ) fputc( '\n', stdout ); /* Newline also flushes stdout. */ /* ** Display the socket address of the remote client. Address- ** independent fields first. */ fprintf( stderr, "Remote client's sockaddr info:\n" " sa_family = %d (AF_INET = %d, AF_INET6 = %d)\n" " addr len = %d (sockaddr_in = %zu, " "sockaddr_in6 = %zu)\n", sadr->sa_family, AF_INET, AF_INET6, sadrLen, sizeof( struct sockaddr_in ), sizeof( struct sockaddr_in6 ) ); /* ** Display the address-specific information. */ getnameinfo( sadr, sadrLen, hostBfr, sizeof( hostBfr ), servBfr, sizeof( servBfr ), NI_NUMERICHOST | NI_NUMERICSERV ); switch ( sadr->sa_family ) { case AF_INET: /* IPv4 address. */ { struct sockaddr_in *p = (struct sockaddr_in*) sadr; fprintf( stderr, " sin_addr = sin_family: %d\n" " sin_addr: %s\n" " sin_port: %s\n", p->sin_family, hostBfr, servBfr ); break; } /* End CASE of IPv4 address. */ case AF_INET6: /* IPv6 address. */ { struct sockaddr_in6 *p = (struct sockaddr_in6*) sadr; fprintf( stderr, " sin6_addr = sin6_family: %d\n" " sin6_addr: %s\n" " sin6_port: %s\n" " sin6_flowinfo: %d\n" " sin6_scope_id: %d\n", p->sin6_family, hostBfr, servBfr, p->sin6_flowinfo, p->sin6_scope_id ); break; } /* End CASE of IPv6 address. */ default: /* Can never get here, but for completeness. */ { fprintf( stderr, "%s (line %d): ERROR - Unknown address " "family (%d).\n", pgmName, __LINE__, sadr->sa_family ); break; } /* End DEFAULT case (unknown address family). */ } /* End SWITCH on address family. */ } /* End IF verbose mode. */ /* ** Send the PIT to the client. */ wBytes = timeLen; while ( wBytes > 0 ) { do { count = sendto( desc[ idx ].fd, timeStr, wBytes, 0, sadr, /* Address & address length */ sadrLen ); /* received in recvfrom(). */ } while ( ( count < 0 ) && ( errno == EINTR ) ); CHK( count ); /* Check for a bona fide error. */ wBytes -= count; } /* End WHILE there is data to send. */ } /* End ELSE a UDP datagram is available. */ desc[ idx ].revents = 0; /* Clear the returned poll events. */ } /* End FOR each socket descriptor. */ } /* End WHILE forever. */ } /* End pit() */ iozone3_508/docs/iozone.10000755000000000000000000004207215051766073014075 0ustar rootroot.TH IOZONE 1 .SH NAME Iozone \- Filesystem Benchmark .SH SYNOPSIS .B Iozone .nh [\fB\-a|\-A\fP] [\fB\-s\fP \fIfilesize_Kb\fP] [\fB\-r\fP \fIrecord_size_Kb\fP] [\fB\-f\fP \fI[path]filename\fP] [\fB\-i\fP \fItest\fP] [\fB\-E\fP] [\fB\-p\fP] [\fB\-m\fP] [\fB\-M\fP] [\fB\-t\fP \fIchildren\fP] [\fB\-h\fP] [\fB\-o\fP] [\fB\-l\fP \fImin_number_procs\fP] [\fB\-u\fP \fImax_number_procs\fP] [\fB\-v\fP] [\fB\-R\fP] [\fB\-x\fP] [\fB\-d\fP \fImicroseconds\fP] [\fB\-F\fP \fIpath1 path2...\fP] [\fB\-V\fP \fIpattern \fP] [\fB\-j\fP \fIstride\fP] [\fB\-T\fP] [\fB\-C\fP] [\fB\-B\fP] [\fB\-D\fP] [\fB\-G\fP] [\fB\-I\fP] [\fB\-H\fP \fIdepth\fP] [\fB\-k\fP \fIdepth\fP] [\fB\-U\fP \fImount_point\fP] [\fB\-S\fP \fIcache_size\fP] [\fB\-O\fP] [\fB\-L\fP \fIline_size\fP] [\fB\-K\fP] [\fB\-N\fP] [\fB\-Q\fP] [\fB\-P\fP \fIstart_cpu\fP] [\fB\-c\fP] [\fB\-e\fP] [\fB\-b\fP \fIExcel.xls\fP] [\fB\-J\fP \fImilliseconds\fP] [\fB\-X\fP \fI[path]filename\fP] [\fB\-Y\fP \fI[path]filename\fP] [\fB\-w\fP] [\fB\-W\fP] [\fB\-z\fP] [\fB\-Z\fP] [\fB\-n\fP \fImin_filesize_Kb\fP] [\fB\-g\fP \fImax_filesize_Kb\fP] [\fB\-y\fP \fImin_recordsize_Kb\fP] [\fB\-q\fP \fImax_recordsize_Kb\fP] [\fB\-+d\fP] [\fB\-+u\fP] [\fB\-+m\fP \fIclient_filename\fP] [\fB\-+n\fP] [\fB\-+N\fP] [\fB\-+p\fP \fIpercent_read\fP] [\fB\-+r\fP] [\fB\-+t\fP] [\fB\-+l\fP] [\fB\-+L\fP] [\fB\-+D\fP] [\fB\-+A\fP \fImadvise_selector\fP] [\fB\-+h\fP \fIhostname\fP] [\fB\-+T\fP] [\fB\-+w\fP \fIPercent de-dupable.\fP] .hy .SH DESCRIPTION .B Iozone is a filesystem benchmark tool. The benchmark generates and measures a variety of file operations. .B Iozone has been ported to many machines and runs under many operating systems. This document will cover the many different types of operations that are tested as well as coverage of all of the command line options. .PP .B Iozone is useful for determining a broad filesystem analysis of a vendor's computer platform. The benchmark tests file I/O performance for the following operations. .PP Read, write, re-read, re-write, read backwards, read strided, fread, fwrite, random read/write, pread/pwrite variants .PP While computers are typically purchased with an application in mind it is also likely that over time the application mix will change. Many vendors have enhanced their operating systems to perform well for some frequently used applications. Although this accelerates the I/O for those few applications it is also likely that the system may not perform well for other applications that were not targeted by the operating system. An example of this type of enhancement is: Database. Many operating systems have tested and tuned the filesystem so it works well with databases. While the database users are happy, the other users may not be so happy as the entire system may be giving all of the system resources to the database users at the expense of all other users. As time rolls on the system administrator may decide that a few more office automation tasks could be shifted to this machine. The load may now shift from a random reader application (database) to a sequential reader. The users may discover that the machine is very slow when running this new application and become dissatisfied with the decision to purchase this platform. By using .B Iozone to get a broad filesystem performance coverage the buyer is much more likely to see any hot or cold spots and pick a platform and operating system that is more well balanced. .SH OPTIONS .TP .BI \-a Used to select full automatic mode. Produces output that covers all tested file operations for record sizes of 4k to 16M for file sizes of 64k to 512M. .TP .BI \-A This version of automatic mode provides more coverage but consumes a bunch of time. The .BI \-a option will automatically stop using transfer sizes less than 64k once the file size is 32M or larger. This saves time. The .BI \-A option tells .B Iozone that you are willing to wait and want dense coverage for small transfers even when the file size is very large. .BI NOTE: This option is deprecated in .BI Iozone version 3.61. Use .BI \-az\ \-i\ 0\ \-i\ 1 instead. .TP .BI \-b\ filename Used to specify a filename that will be used for output of an Excel compatible file that contains the results. .TP .BI \-B Use mmap() files. This causes all of the temporary files being measured to be created and accessed with the mmap() interface. Some applications prefer to treat files as arrays of memory. These applications mmap() the file and then just access the array with loads and stores to perform file I/O. .TP .BI \-c Include close() in the timing calculations. This is useful only if you suspect that close() is broken in the operating system currently under test. It can be useful for NFS Version 3 testing as well to help identify if the nfs3_commit is working well. .TP .BI \-C Show bytes transferred by each child in throughput testing. Useful if your operating system has any starvation problems in file I/O or in process management. .TP .BI \-d\ # Microsecond delay out of barrier. During the throughput tests all threads or processes are forced to a barrier before beginning the test. Normally, all of the threads or processes are released at the same moment. This option allows one to delay a specified time in microseconds between releasing each of the processes or threads. .TP .BI \-D Use msync(MS_ASYNC) on mmap files. This tells the operating system that all the data in the mmap space needs to be written to disk asynchronously. .TP .BI \-e Include flush (fsync,fflush) in the timing calculations .TP .BI \-E Used to select the extension tests. Only available on some platforms. Uses pread interfaces. .TP .BI \-f\ filename Used to specify the filename for the temporary file under test. This is useful when the unmount option is used. When testing with unmount between tests it is necessary for the temporary file under test to be in a directory that can be unmounted. It is not possible to unmount the current working directory as the process .B Iozone is running in this directory. .TP .BI \-F\ filename\ filename\ filename\ ? Specify each of the temporary file names to be used in the throughput testing. The number of names should be equal to the number of processes or threads that are specified. .TP .BI \-g\ # Set maximum file size (in Kbytes) for auto mode. One may also specify .BI \-g\ #k (size in Kbytes) or .BI \-g\ #m (size in Mbytes) or .BI \-g\ #g (size in Gbytes). See .BI \-n for minimum file size. .TP .BI \-G Use msync(MS_SYNC) on mmap files. This tells the operating system that all the data in the mmap space needs to be written to disk synchronously. .TP .BI \-h Displays help screen. .TP .BI \-H\ # Use POSIX async I/O with\ # async operations. .B Iozone will use POSIX async I/O with a bcopy from the async buffers back into the applications buffer. Some versions of MSC NASTRAN perform I/O this way. This technique is used by applications so that the async I/O may be performed in a library and requires no changes to the applications internal model. .TP .BI \-i\ # Used to specify which tests to run. (0=write/rewrite, 1=read/re-read, 2=random-read/write, 3=Read-backwards, 4=Re-write-record, 5=stride-read, 6=fwrite/re-fwrite, 7=fread/Re-fread, 8=mixed workload, 9=pwrite/Re-pwrite, 10=pread/Re-pread, 11=pwritev/Re-pwritev, 12=preadv/Re-preadv). One will always need to specify 0 so that any of the following tests will have a file to measure. .BI -i\ #\ -i\ #\ -i\ # is also supported so that one may select more than one test. .TP .BI \-I Use DIRECT IO if possible for all file operations. Tells the filesystem that all operations to the file are to bypass the buffer cache and go directly to disk. (not available on all platforms) .TP .BI \-j\ # Set stride of file accesses to (# * record size). The stride read test will read records at this stride. .TP .BI \-J\ # Millisecond delay before each I/O operation. This simulates the cpu compute cycle of an application that precedes an I/O operation. One may also use .BI \-X or .BI \-Y to control the compute cycle on a per I/O operation basis. .TP .BI \-k\ # Use POSIX async I/O (no bcopy) with\ # async operations. .B Iozone will use POSIX async I/O and will not perform any extra bcopys. The buffers used by .B Iozone will be handed to the async I/O system call directly. .TP .BI \-K Inject some random accesses in the testing. .TP .BI \-l\ # Set the lower limit on number of processes to run. When running throughput tests this option allows the user to specify the least number of processes or threads to start. This option should be used in conjunction with the .BI \-u option. .TP .BI \-L\ # Set processor cache line size to value (in bytes). Tells .B Iozone the processor cache line size. This is used internally to help speed up the test. .TP .BI \-m Tells .B Iozone to use multiple buffers internally. Some applications read into a single buffer over and over. Others have an array of buffers. This option allows both types of applications to be simulated. .B Iozone\'s default behavior is to re-use internal buffers. This option allows one to override the default and to use multiple internal buffers. .TP .BI \-M \.B Iozone will call uname() and will put the string in the output file. .TP .BI \-n\ # Set minimum file size (in Kbytes) for auto mode. One may also specify .BI \-n\ #k (size in Kbytes) or .BI \-n\ #m (size in Mbytes) or .BI \-n\ #g (size in Gbytes). See .BI \-g for maximum file size. .TP .BI \-N Report results in microseconds per operation. .TP .BI \-o Writes are synchronously written to disk. (O_SYNC). .B Iozone will open the files with the O_SYNC flag. This forces all writes to the file to go completely to disk before returning to the benchmark. .TP .BI \-O Give results in operations per second. .TP .BI \-p This purges the processor cache before each file operation. .B Iozone will allocate another internal buffer that is aligned to the same processor cache boundary and is of a size that matches the processor cache. It will zero fill this alternate buffer before beginning each test. This will purge the processor cache and allow one to see the memory subsystem without the acceleration due to the processor cache. .TP .BI \-P\ # Bind processes/threads to processors, starting with this cpu\ #. Only available on some platforms. The first sub process or thread will begin on the specified processor. Future processes or threads will be placed on the next processor. Once the total number of cpus is exceeded then future processes or threads will be placed in a round robin fashion. .TP .BI \-q\ # Set maximum record size (in Kbytes) for auto mode. One may also specify .BI \-q\ #k (size in Kbytes) or .BI \-q\ #m (size in Mbytes) or .BI \-q\ #g (size in Gbytes). See .BI \-y for minimum record size. .TP .BI \-Q Create offset/latency files. .B Iozone will create latency versus offset data files that can be imported with a graphics package and plotted. This is useful for finding if certain offsets have very high latencies. Such as the point where UFS will allocate its first indirect block. One can see from the data the impacts of the extent allocations for extent based filesystems with this option. .TP .BI \-r\ # Used to specify the record size, in Kbytes, to test. One may also specify .BI \-r\ #k (size in Kbytes) or .BI \-r\ #m (size in Mbytes) or .BI \-r\ #g (size in Gbytes). .TP .BI \-R Generate Excel report. .B Iozone will generate an Excel compatible report to standard out. This file may be imported with Microsoft Excel (space delimited) and used to create a graph of the filesystem performance. Note: The 3D graphs are column oriented. You will need to select this when graphing as the default in Excel is row oriented data. .TP .BI \-s\ # Used to specify the size, in Kbytes, of the file to test. One may also specify .BI \-s\ #k (size in Kbytes) or .BI \-s\ #m (size in Mbytes) or .BI \-s\ #g (size in Gbytes). .TP .BI \-S\ # Set processor cache size to value (in Kbytes). This tells .B Iozone the size of the processor cache. It is used internally for buffer alignment and for the purge functionality. .TP .BI \-t\ # Run .B Iozone in a throughput mode. This option allows the user to specify how many threads or processes to have active during the measurement. .TP .BI \-T Use POSIX pthreads for throughput tests. Available on platforms that have POSIX threads. .TP .BI \-u\ # Set the upper limit on number of processes to run. When running throughput tests this option allows the user to specify the greatest number of processes or threads to start. This option should be used in conjunction with the .BI \-l option. .TP .BI \-U\ mountpoint Mount point to unmount and remount between tests. .B Iozone will unmount and remount this mount point before beginning each test. This guarantees that the buffer cache does not contain any of the file under test. .TP .BI \-v Display the version of .B Iozone. .TP .BI \-V\ # Specify a pattern that is to be written to the temporary file and validated for accuracy in each of the read tests. .TP .BI \-w Do not unlink temporary files when finished using them. .TP .BI \-W Lock file when reading or writing. .TP .BI \-x Turn off stone-walling. Stonewalling is a technique used internally to .B Iozone. It is used during the throughput tests. The code starts all threads or processes and then stops them on a barrier. Once they are all ready to start then they are all released at the same time. The moment that any of the threads or processes finish their work then the entire test is terminated and throughput is calculated on the total I/O that was completed up to this point. This ensures that the entire measurement was taken while all of the processes or threads were running in parallel. This flag allows one to turn off the stonewalling and see what happens. .TP .BI \-X\ filename Used to specify a filename that will be used for the write telemetry information. The file contains lines with offset, size, delay_in_milliseconds. Each of these lines are used to perform an I/O operation. This is used when an application's specific I/O operations are known, and one wishes to benchmark the system with this specific application file behavior. .TP .BI \-y\ # Set minimum record size (in Kbytes) for auto mode. One may also specify .BI \-y\ #k (size in Kbytes) or .BI \-y\ #m (size in Mbytes) or .BI \-y\ #g (size in Gbytes). See .BI \-q for maximum record size. .TP .BI \-Y\ filename Used to specify a filename that will be used for the read telemetry information. The file contains lines with offset, size, delay_in_milliseconds. Each of these lines are used to perform an I/O operation. This is used when an application's specific I/O operations are known, and one wishes to benchmark the system with this specific application file behavior. .TP .BI \-z Used in conjunction with .BI \-a to test all possible record sizes. Normally .BI Iozone omits testing of small record sizes for very large files when used in full automatic mode. This option forces .BI Iozone to include the small record sizes in the automatic tests also. .TP .BI \-Z Enable mixing of mmap I/O and file I/O. .TP .BI \-+m\ filename Used to specify a filename that will be used to specify the clients in a distributed measurement. The file contains one line for each client. The fields are space delimited. Field 1 is the client name. Field 2 is the working directory, on the client, where Iozone will run. Field 3 is the path to the executable Iozone on the client. .TP .BI \-+n No retests selected. Used to prevent retests from running. .TP .BI \-+N No truncating or deleting of previous test file before the sequential write test. Useful only after -w is used in previous command to leave the test file in place for reuse. This flag is of limited use, when a single retest is not enough, or to easily control when sequential write retests occur without file truncation or deletion. .TP .BI \-+u Used to enable CPU statistics collection. .TP .BI \-+d Diagnostic mode to troubleshoot a broken file I/O subsystem. .TP .BI \-+p\ percentage_reads Used to set the percentage of threads/processes that will perform read testing in the mixed workload test case. .TP .BI \-+r Enable O_RSYNC | O_SYNC on all testing. .TP .BI \-+l Enable byte range locking. .TP .BI \-+L Enable byte range locking & shared file mode. .TP .BI \-+D Enable O_DSYNC on all testing. .TP .BI \-+t Enable network performance test. Use with -+m .TP .BI \-+A # Enable madvise behavior. 0 = normal, 1=random, 2=sequential, 3=dontneed, 4=willneed .TP .BI \-+B Enable sequential mixed workload testing. .TP .BI \-+T Enable time stamps logging. .TP .BI \-+h Manually set hostname. .TP .BI \-+w # Percentage of data to be de-dupable between files. .SH AUTHOR Original Author: William D. Norcott. wnorcott@us.oracle.com Features & extensions: Don Capps capps@iozone.org iozone3_508/src/current/Android.mk0000755000000000000000000000045215051766073015736 0ustar rootrootLOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_CFLAGS:= -O3 -Dunix -DANDROID -DHAVE_ANSIC_C -DHAVE_PREAD -DNAME='"linux-arm"' -DLINUX_ARM -Dlinux -lrt -lpthread LOCAL_SRC_FILES:= iozone.c libbif.c LOCAL_MODULE:= iozone LOCAL_CFLAGS +=-Wno-unused-parameter include $(BUILD_EXECUTABLE) iozone3_508/src/current/Android_Readme.md0000755000000000000000000000541015051766073017203 0ustar rootroot# compiling iozone Assuming you have compiler toolchain installed, just type `make` to get a list of targets then to generate for your iozone for your `` simply type: `make ` **Android specifics** building iozone for Android means doing a cross compilation There is two options then. * cross compiling using Android NDK * cross compiling from android source tree. Due to the disk space required to get an android source tree, this option is valuable only if you are already working with android source tree. **_cross-compiling using Android NDK_** The prerequiste is to download SDK and NDK. SDK cannot easilly dissociated from Android Studio those days. Follow the following steps to get SDK and NDK and cross compile iozone. 1. Prerequesite : Ubuntu LTS release 16.04 or 18.04 or Mac OS 2. Download Android Studio for your platform from https://developer.android.com/studio/ 3. Extract the archive to some place, e.g. your home directory 4. Start android studio 1. on linux: Android Studio needs to be started from a terminal so open a Terminal 2. in terminal type `/android-studio/bin/studio.sh` 3. on Mac OS Android Studio can be launch from lauchpad. if you wish to start it from terminal type `open -a Android\ Studio` 5. keep all the defaults proposed Android Studio. 6. Wait for the download to be ready 7. Download the NDK 1. Select Configure in Android Studio Splash Screen 2. Select SDK Manager 3. Go to system settings Android SDK on the left 4. Select tab SDK Tools 5. Select NDK and apply to install NDK 8. Set NDK environment variable to the ndk-bundle directory 1. e.g. `export NDK=/home/parallels/Android/Sdk/ndk-bundle/` 9. download and extract iozone archive 1. you can opt for extacting only source directory. 1. `mkdir iozone` 2. `cd iozone` 3. `tar -xvf /iozoneX_XXX.tgz -C ./iozone --strip-components 3` 2. or extracting the full archive 1. `tar xvf iozoneX_XXX.tgz` 2. `cd iozoneX_XXX/src/current` 10. build iozone 1. `make android` This will generate 4 version of iozone for different architecture: arm7, arm64, x86, x86_64 2. push the iozone excutable to your Android target e.g. `adb push libs/arm64-v8a/iozone /data/iozone` **_cross-compiling iozone within android source tree_** The Prerequisite is to have an Android source tree availavle. If you do not have it, download it android from Google 1. `cd ` 2. `source ./build/envsetup.sh` 3. `lunch ` 4. `cd /external` 5. `mkdir iozone` 6. `curl http://www.iozone.org/src/current/iozoneX_XXX.tar -o iozoneX_XXX.tar` # assuming this version no proxy, etc` 7. `tar -xvf ./iozoneX_XXX.tar -C ./iozone --strip-components 3` 8. `cd iozone` 9. `mm` iozone3_508/src/current/Application.mk0000755000000000000000000000021215051766073016613 0ustar rootrootAPP_ABI := armeabi-v7a arm64-v8a x86 x86_64 APP_PLATFORM :=android-24 # mininum Android API level for appropriate multithreading support iozone3_508/src/current/makefile0000555000000000000000000016112715051766073015532 0ustar rootroot# # Version $Revision: 1.158 $ # # The makefile for building all versions of iozone for all supported # platforms # # Supports: hpux, hpux_no_ansi, hpux-10.1, hpux_no_ansi-10.1, # sppux, sppux-10.1, ghpux, sppux, # convex, FreeBSD, OpenBSD, OSFV3, OSFV4, OSFV5, SCO # SCO_Unixware_gcc,NetBSD,TRU64, Mac OS X CC = cc C89 = c89 GCC = gcc CCS = /usr/ccs/bin/cc NACC = /opt/ansic/bin/cc CFLAGS ?= S10GCCFLAGS = -m64 S10CCFLAGS = -m64 FLAG64BIT = -m64 NDK_ENV_VAR := $(shell echo $$NDK) NDKBUILD := $(shell which ndk-build) # If your Linux kernel supports preadv and pwritev system calls # and you want iozone to use them, add -DHAVE_PREADV -DHAVE_PWRITEV # to CFLAGS all: @echo "" @echo "You must specify the target. " @echo " -> AIX (32bit) <-" @echo " -> AIX-LF (32bit) <-" @echo " -> AIX64 (32bit) <-" @echo " -> AIX64-LF (32bit) <-" @echo " -> android (arm/x86 32/64bit) <-" @echo " -> bsdi (32bit) <-" @echo " -> convex (32bit) <-" @echo " -> CrayX1 (32bit) <-" @echo " -> dragonfly (32bit) <-" @echo " -> freebsd (32bit) <-" @echo " -> freebsd64 (64bit) <-" @echo " -> generic (32bit) <-" @echo " -> ghpux (32bit) <-" @echo " -> hpuxs-11.0 (simple) (32bit) <-" @echo " -> hpux-11.0w (64bit) <-" @echo " -> hpuxs-11.0w (64bit) <-" @echo " -> hpux-11.0 (32bit) <-" @echo " -> hpux-10.1 (32bit) <-" @echo " -> hpux-10.20 (32bit) <-" @echo " -> hpux (32bit) <-" @echo " -> hpux_no_ansi (32bit) <-" @echo " -> hpux_no_ansi-10.1 (32bit) <-" @echo " -> IRIX (32bit) <-" @echo " -> IRIX64 (64bit) <-" @echo " -> linux (32bit) <-" @echo " -> linux-arm (32bit) <-" @echo " -> linux-AMD64 (64bit) <-" @echo " -> linux-ia64 (64bit) <-" @echo " -> linux-powerpc (32bit) <-" @echo " -> linux-powerpc64 (64bit) <-" @echo " -> linux-sparc (32bit) <-" @echo " -> macosx (32/64bit)<-" @echo " -> netbsd (32bit) <-" @echo " -> netbsd-AMD64 (64bit) <-" @echo " -> openbsd (32bit) <-" @echo " -> openbsd-threads (32bit) <-" @echo " -> OSFV3 (64bit) <-" @echo " -> OSFV4 (64bit) <-" @echo " -> OSFV5 (64bit) <-" @echo " -> linux-S390 (32bit) <-" @echo " -> linux-S390X (64bit) <-" @echo " -> SCO (32bit) <-" @echo " -> SCO_Unixware_gcc (32bit) <-" @echo " -> Solaris (32bit) <-" @echo " -> Solaris-2.6 (32bit) <-" @echo " -> Solaris7gcc (32bit) <-" @echo " -> Solaris8-64 (64bit) <-" @echo " -> Solaris8-64-VXFS (64bit) <-" @echo " -> Solaris10 (32bit) <-" @echo " -> Solaris10cc (64bit) <-" @echo " -> Solaris10gcc (32bit) <-" @echo " -> Solaris10gcc-64 (64bit) <-" @echo " -> sppux (32bit) <-" @echo " -> sppux-10.1 (32bit) <-" @echo " -> sppux_no_ansi-10.1 (32bit) <-" @echo " -> SUA (32bit) <-" @echo " -> TRU64 (64bit) <-" @echo " -> UWIN (32bit) <-" @echo " -> Windows (95/98/NT) (32bit) <-" @echo "" clean: rm -f *.o iozone fileop pit_server rpm: cp ../../iozone*.tar /home/capps/rpmbuild/SOURCES/ rpmbuild -ba --buildroot /home/capps/rpmbuild/BUILDROOT spec.in # # Turn on the optimizer, largefiles, Posix async I/O and threads. # hpux-11.0: iozone_hpux-11.0.o libasync.o libbif.o $(CC) +O3 +Oparallel $(LDFLAGS) iozone_hpux-11.0.o libasync.o \ libbif.o -lpthread -lrt -o iozone # # Turn on wide-mode, the optimizer, largefiles, Posix async I/O and threads. # hpux-11.0w: iozone_hpux-11.0w.o libasyncw.o libbif.o $(CC) +DD64 +O3 $(LDFLAGS) iozone_hpux-11.0w.o libasyncw.o \ libbif.o -lpthread -lrt -o iozone # # Simple build with largefiles, Posix threads and Posix async I/O # hpuxs-11.0: iozone_hpuxs-11.0.o libasync.o libbif.o fileop_hpuxs-11.0.o pit_server.o $(CC) -O $(LDFLAGS) iozone_hpuxs-11.0.o \ libasync.o libbif.o -lpthread -lrt -o iozone $(CC) -O $(LDFLAGS) fileop_hpuxs-11.0.o -o fileop $(CC) -O $(LDFLAGS) pit_server.o -o pit_server # # Simple build with wide-mode, largefiles, Posix threads and Posix async I/O # hpuxs-11.0w: iozone_hpuxs-11.0w.o libasyncw.o libbif.o $(CC) -O +DD64 $(LDFLAGS) iozone_hpuxs-11.0w.o \ libasyncw.o libbif.o -lpthread -lrt -o iozone # # Simple 10.1 build with no threads, no largefiles, no async I/O # hpux-10.1: iozone_hpux-10.1.o libbif.o $(C89) +e -O $(LDFLAGS) iozone_hpux-10.1.o libbif.o -o iozone hpux-10.20: iozone_hpux-10.20.o libbif.o $(C89) +e -O $(LDFLAGS) iozone_hpux-10.20.o libbif.o -o iozone # # Simple generic HP build with no threads, no largefiles, no async I/O # hpux: iozone_hpux.o $(C89) +e -O $(LDFLAGS) iozone_hpux.o libbif.o -o iozone # # GNU HP build with no threads, no largefiles, no async I/O # ghpux: iozone_ghpux.o libbif.o $(GCC) -O $(LDFLAGS) iozone_ghpux.o libbif.o -static -o iozone # # GNU Generic build with no threads, no largefiles, no async I/O # generic: iozone_generic.o libbif.o $(CC) -O $(LDFLAGS) iozone_generic.o libbif.o -o iozone # # No ansii 'C' compiler HP build with no threads, no largefiles, no async I/O # hpux_no_ansi-10.1: iozone_hpux_no-10.1.o libbif.o $(NACC) -O $(LDFLAGS) iozone_hpux_no-10.1.o libbif.o -o iozone # # No ansii 'C' compiler HP build with no threads, no largefiles, no async I/O # hpux_no_ansi: iozone_hpux_no.o libbif.o $(C89) -O $(LDFLAGS) iozone_hpux_no.o libbif.o -o iozone # # GNU 'C' compiler Linux build with threads, largefiles, async I/O # linux: iozone_linux.o libasync.o libbif.o fileop_linux.o pit_server.o $(CC) -O3 $(CFLAGS) iozone_linux.o libasync.o libbif.o -lpthread \ -lrt -o iozone $(CC) -O3 $(CFLAGS) -Dlinux fileop_linux.o -o fileop $(CC) -O3 $(CFLAGS) -Dlinux pit_server.o -o pit_server # # GNU 'C' compiler Linux build for powerpc chip with threads, largefiles, async I/O # linux-powerpc: iozone_linux-powerpc.o libbif.o libasync.o fileop_linux-ppc.o pit_server.o $(CC) -O3 $(LDFLAGS) iozone_linux-powerpc.o libasync.o \ libbif.o -lpthread -lrt -o iozone $(CC) -O3 -Dlinux fileop_linux-ppc.o -o fileop $(CC) -O3 -Dlinux pit_server.o -o pit_server # # GNU 'C' compiler Linux build for sparc chip with threads, largefiles, async I/O # linux-sparc: iozone_linux-sparc.o libbif.o libasync.o fileop_linux.o pit_server.o $(CC) -O3 $(LDFLAGS) iozone_linux-sparc.o libasync.o libbif.o \ -lpthread -lrt -o iozone $(CC) -O3 -Dlinux fileop_linux.o -o fileop $(CC) -O3 -Dlinux pit_server.o -o pit_server # # GNU 'C' compiler Linux build with threads, largefiles, async I/O # linux-ia64: iozone_linux-ia64.o libbif.o libasync.o fileop_linux-ia64.o pit_server.o $(CC) -O3 $(LDFLAGS) iozone_linux-ia64.o libbif.o libasync.o \ -lrt -lpthread -o iozone $(CC) -O3 -Dlinux fileop_linux-ia64.o -o fileop $(CC) -O3 -Dlinux pit_server.o -o pit_server # # GNU 'C' compiler Linux build for powerpc chip with threads, largefiles, async I/O # linux-powerpc64: iozone_linux-powerpc64.o libbif.o libasync.o fileop_linux-ppc64.o pit_server-linux-powerpc64.o $(CC) -O3 -Dunix -DHAVE_ANSIC_C -DSHARED_MEM -DASYNC_IO \ -D_LARGEFILE64_SOURCE -Dlinux \ iozone_linux-powerpc64.o libasync.o libbif.o -lpthread \ -lrt $(FLAG64BIT) -o iozone $(CC) -O3 -Dlinux fileop_linux-ppc64.o $(FLAG64BIT) -o fileop $(CC) -O3 -Dlinux pit_server-linux-powerpc64.o $(FLAG64BIT) -o pit_server # # GNU 'C' compiler Linux build with threads, largefiles, async I/O # linux-arm: iozone_linux-arm.o libbif.o libasync.o fileop_linux-arm.o pit_server.o $(CC) -O3 $(LDFLAGS) iozone_linux-arm.o libbif.o libasync.o \ -lrt -lpthread -o iozone $(CC) -O3 -Dlinux fileop_linux-arm.o -o fileop $(CC) -O3 -Dlinux pit_server.o -o pit_server # # GNU 'C' or Clang compiler Linux build with threads, largefiles, async I/O # android: iozone.c makefile Android.mk Application.mk libbif.c ifeq ($(NDK_ENV_VAR)$(NDKBUILD),) $(warning Your NDK environment is not set) $(warning Either add to your path ndk-bundle or define NDK environement variable) $(warning ndk-bundle is likely located within you android sdk e.g. <...>/Android/sdk/ndk-bundle ) $(error e.g. export NDK='/home/me/Android/Sdk/ndk-bundle') endif mkdir -p jni ln -sf ../Android.mk ./jni/Android.mk ln -sf ../Application.mk ./jni/Application.mk ln -sf ../iozone.c ./jni/iozone.c ln -sf ../libbif.c ./jni/libbif.c ifeq ($(NDKBUILD),) ifneq ($(NDK_ENV_VAR),) ${NDK}/ndk-build endif else ${NDKBUILD} endif # # GNU 'C' compiler Linux build with threads, largefiles, async I/O # linux-AMD64: iozone_linux-AMD64.o libbif.o libasync.o fileop_linux-AMD64.o pit_server.o $(CC) -O3 $(LDFLAGS) iozone_linux-AMD64.o libbif.o libasync.o \ -lrt -lpthread -o iozone $(CC) -O3 -Dlinux fileop_linux-AMD64.o -o fileop $(CC) -O3 -Dlinux pit_server.o -o pit_server # # GNU 'C' compiler Linux build with S/390, threads, largfiles, async I/O # linux-S390: iozone_linux-s390.o libbif.o libasync.o fileop_linux-s390.o pit_server.o $(CC) -O2 $(LDFLAGS) -lpthread -lrt iozone_linux-s390.o \ libbif.o libasync.o -o iozone $(CC) -O3 -Dlinux fileop_linux-s390.o -o fileop $(CC) -O3 -Dlinux pit_server.o -o pit_server # # GNU 'C' compiler Linux build with S/390, threads, largfiles, async I/O # linux-S390X: iozone_linux-s390x.o libbif.o libasync.o fileop_linux-s390x.o pit_server.o $(CC) -O2 $(LDFLAGS) -lpthread -lrt iozone_linux-s390x.o \ libbif.o libasync.o -o iozone $(CC) -O3 -Dlinux fileop_linux-s390x.o -o fileop $(CC) -O3 -Dlinux pit_server.o -o pit_server # # AIX # I would have built with ASYNC_IO but the AIX machine does not have # POSIX 1003.1b compliant async I/O header files. Has threads, no # largefile support. # AIX: iozone_AIX.o libbif.o fileop_AIX.o $(CC) -O $(LDFLAGS) iozone_AIX.o libbif.o \ -lpthreads -o iozone $(CC) -O -Dlinux fileop_AIX.o -o fileop # # AIX-LF # I would have built with ASYNC_IO but the AIX machine does not have # POSIX 1003.1b compliant async I/O header files. Has threads, and # largefile support. # AIX-LF: iozone_AIX-LF.o libbif.o fileop_AIX-LF.o pit_server.o $(CC) -O $(LDFLAGS) iozone_AIX-LF.o libbif.o \ -lpthreads -o iozone $(CC) -O fileop_AIX-LF.o -o fileop $(CC) -O pit_server.o -o pit_server # AIX64 # This version uses the 64 bit interfaces and is compiled as 64 bit code. # Has threads, async I/O but no largefile support. # AIX64: iozone_AIX64.o libbif.o fileop_AIX64.o libasync.o pit_server.o $(GCC) -maix64 -O3 $(LDFLAGS) iozone_AIX64.o libasync.o \ libbif.o -lpthreads -o iozone $(GCC) -maix64 -O3 $(LDFLAGS) -Dlinux fileop_AIX64.o -o fileop $(GCC) -maix32 -O3 $(LDFLAGS) pit_server.o -o pit_server # # AIX64-LF # This version uses the 64 bit interfaces and is compiled as 64 bit code. # Has threads, async I/O and largefile support. # AIX64-LF: iozone_AIX64-LF.o libbif.o fileop_AIX64-LF.o libasync.o pit_server.o $(GCC) -maix64 -O3 $(LDFLAGS) iozone_AIX64-LF.o libasync.o \ libbif.o -lpthreads -o iozone $(GCC) -maix64 -O3 $(LDFLAGS) -Dlinux fileop_AIX64-LF.o -o fileop $(GCC) -maix32 -O3 $(LDFLAGS) pit_server.o -o pit_server # # IRIX 32 bit build with threads, largefiles, async I/O # This would like to be in 64 bit mode but it hangs whenever in 64 bit mode. # This version uses the 64 bit interfaces but is compiled as 32 bit code # IRIX64: iozone_IRIX64.o libasyncw.o libbif.o $(CC) -32 -O $(LDFLAGS) iozone_IRIX64.o libbif.o \ -lpthread libasyncw.o -o iozone # # IRIX 32 bit build with threads, No largefiles, and async I/O # This version uses the 32 bit interfaces and is compiled as 32 bit code # IRIX: iozone_IRIX.o libasync.o libbif.o $(CC) -O -32 $(LDFLAGS) iozone_IRIX.o libbif.o -lpthread \ libasync.o -o iozone # # CrayX1: 32 bit build with threads, No largefiles, and async I/O # This version uses the 32 bit interfaces and is compiled as 32 bit code # CrayX1: iozone_CrayX1.o libasync.o libbif.o $(CC) -O $(LDFLAGS) iozone_CrayX1.o libbif.o \ -lpthread libasyncw.o -o iozone # # SPP-UX 32 bit build with threads, No largefiles, and No async I/O, # pread extensions # For older SPP-UX machines with 9.05 compatibility # sppux: iozone_sppux.o libbif.o $(NACC) -O $(LDFLAGS) iozone_sppux.o libbif.o \ -Wl,+parallel -lcnx_syscall -lpthread -lail -o iozone # # SPP-UX 32 bit build with threads, No largefiles, and No async I/O, pread # extensions # For Newer SPP-UX machines with 10.01 compatibility # sppux-10.1: iozone_sppux-10.1.o libbif.o $(NACC) -O $(LDFLAGS) iozone_sppux-10.1.o libbif.o \ -lcnx_syscall -Wl,+parallel -lpthread -lail -o iozone # # SPP-UX 32 bit build with threads, No largefiles, and No async I/O, pread # extensions # For Newer SPP-UX machines with 10.01 compatibility, and no ansi 'C' compiler. # sppux_no_ansi-10.1: iozone_sppux_no-10.1.o libbif.o $(CCS) -O $(LDFLAGS) iozone_sppux_no-10.1.o libbif.o \ -Wl,+parallel -lcnx_syscall \ -lpthread -lail -o iozone # # Convex 'C' series 32 bit build with No threads, No largefiles, and No async I/O # convex: iozone_convex.o libbif.o $(CC) -O $(LDFLAGS)iozone_convex.o libbif.o -o iozone # # Solaris 32 bit build with threads, largefiles, and async I/O # Solaris: iozone_solaris.o libasync.o libbif.o fileop_Solaris.o pit_server.o $(CC) -O $(LDFLAGS) iozone_solaris.o libasync.o libbif.o \ -lthread -lpthread -lposix4 -lnsl -laio -lsocket \ -o iozone $(CC) -O fileop_Solaris.o -o fileop $(CC) -O pit_server.o -lthread -lpthread -lposix4 -lnsl -laio \ -lsocket -o pit_server # # Solaris 32 bit build with threads, largefiles, and async I/O # Solaris7gcc: iozone_solaris7gcc.o libasync7.o libbif7.o $(GCC) -O $(LDFLAGS) iozone_solaris7gcc.o libasync7.o libbif7.o \ -lthread -lpthread -lposix4 -lnsl -laio \ -lsocket -o iozone # # Solaris 32 bit build with threads, largefiles, and async I/O # Solaris10: iozone_solaris10.o libasync10.o libbif10.o fileop_Solaris10.o pit_server.o $(CC) -O $(LDFLAGS) iozone_solaris10.o libasync10.o libbif10.o \ -lthread -lpthread -lposix4 -lnsl -laio \ -lsocket -o iozone $(CC) -O fileop_Solaris10.o -o fileop $(CC) -O pit_server.o -lthread -lpthread -lposix4 -lnsl -laio \ -lsocket -o pit_server # # Solaris 32 bit build with threads, largefiles, and async I/O # Solaris10cc: iozone_solaris10cc.o libasync10cc.o libbif10cc.o fileop_Solaris10cc.o pit_server.o $(CC) -O $(LDFLAGS) iozone_solaris10cc.o libasync10cc.o libbif10cc.o \ -lthread -lpthread -lposix4 -lnsl -laio \ -lsocket -o iozone $(CC) -O fileop_Solaris10cc.o -o fileop $(CC) -O pit_server.o -lthread -lpthread -lposix4 -lnsl -laio \ -lsocket -o pit_server # # Solaris 32 bit build with threads, largefiles, and async I/O # Solaris10gcc: iozone_solaris10gcc.o libasync10.o libbif10.o fileop_Solaris10gcc.o pit_server_solaris10gcc.o $(GCC) -O $(LDFLAGS) iozone_solaris10gcc.o libasync10.o libbif10.o \ -lthread -lpthread -lposix4 -lnsl -laio \ -lsocket -o iozone $(GCC) -O fileop_Solaris10gcc.o -o fileop $(GCC) -O pit_server_solaris10gcc.o -lthread -lpthread -lposix4 -lnsl -laio \ -lsocket -o pit_server # # Solaris 64 bit build with threads, largefiles, and async I/O # Solaris10gcc-64: iozone_solaris10gcc-64.o libasync10-64.o libbif10-64.o fileop_Solaris10gcc-64.o pit_server_solaris10gcc-64.o $(GCC) -O $(LDFLAGS) $(S10GCCFLAGS) iozone_solaris10gcc-64.o libasync10-64.o libbif10-64.o \ -lthread -lpthread -lposix4 -lnsl -laio \ -lsocket -o iozone $(GCC) -O $(S10GCCFLAGS) fileop_Solaris10gcc-64.o -o fileop $(GCC) -O $(S10GCCFLAGS) pit_server_solaris10gcc-64.o -lthread -lpthread -lposix4 \ -lnsl -laio -lsocket -o pit_server # # Solaris 64 bit build with threads, largefiles, and async I/O # Solaris10cc-64: iozone_solaris10cc-64.o libasync10-64.o libbif10-64.o fileop_Solaris10cc-64.o pit_server.o $(CC) -O $(LDFLAGS) $(S10CCFLAGS) iozone_solaris10cc-64.o libasync10-64.o libbif10-64.o \ -lthread -lpthread -lposix4 -lnsl -laio \ -lsocket -o iozone $(CC) -O $(S10CCFLAGS) fileop_Solaris10cc-64.o -o fileop $(CC) -O $(S10CCFLAGS) pit_server.o -lthread -lpthread -lposix4 \ -lnsl -laio -lsocket -o pit_server # # Solaris 2.6 (32 bit) build with no threads, no largefiles, and no async I/O # Solaris-2.6: iozone_solaris-2.6.o libbif.o $(CC) -O $(LDFLAGS) iozone_solaris-2.6.o libbif.o \ -lnsl -laio -lsocket -o iozone # # Solaris 64 bit build with threads, largefiles, and async I/O # Solaris8-64: iozone_solaris8-64.o libasync.o libbif.o $(CC) $(LDFLAGS) -fast -xtarget=generic64 -v iozone_solaris8-64.o \ libasync.o libbif.o -lthread -lpthread -lposix4 -lnsl -laio \ -lsocket -o iozone # # Solaris 64 bit build with threads, largefiles, async I/O, and Vxfs # Solaris8-64-VXFS: iozone_solaris8-64-VXFS.o libasync.o libbif.o $(CC) $(LDFLAGS) -fast -xtarget=generic64 -v -I/opt/VRTSvxfs/include/ iozone_solaris8-64-VXFS.o libasync.o libbif.o \ -lthread -lpthread -lposix4 -lnsl -laio \ -lsocket -o iozone # # Windows build requires Cygwin development environment. You # can get this from www.cygwin.com # No largefiles, No async I/O # Windows: iozone_windows.o libbif.o fileop_windows.o pit_server_win.o $(GCC) -O $(LDFLAGS) iozone_windows.o libbif.o -o iozone $(GCC) -O $(LDFLAGS) fileop_windows.o -o fileop $(GCC) -O $(LDFLAGS) pit_server_win.o -o pit_server # # Windows build requires SUA development environment. You # can get this from Microsoft # No largefiles, No async I/O # SUA: iozone_sua.o libbif.o fileop_sua.o pit_server_sua.o $(GCC) -O $(LDFLAGS) iozone_sua.o libbif.o -o iozone $(GCC) -O $(LDFLAGS) fileop_sua.o -o fileop $(GCC) -O $(LDFLAGS) pit_server_sua.o -o pit_server # # Uwin build requires UWIN development environment. # No threads, No largefiles, No async I/O # UWIN: iozone_uwin.o libbif.o $(GCC) -O $(LDFLAGS) iozone_uwin.o libbif.o -o iozone # # GNU C compiler BSD/OS build with threads, largefiles, no async I/O # bsdi: iozone_bsdi.o libbif.o fileop_bsdi.o pit_server.o $(CC) -O $(LDFLAGS) iozone_bsdi.o libbif.o -o iozone $(CC) -O fileop_bsdi.o -o fileop $(CC) -O pit_server.o -o pit_server # # GNU C compiler FreeBSD build with no threads, no largefiles, no async I/O # freebsd: iozone_freebsd.o libbif.o fileop_freebsd.o libasync.o pit_server.o $(CC) $(LDFLAGS) iozone_freebsd.o libbif.o -lpthread libasync.o \ -o iozone $(CC) -O fileop_freebsd.o -o fileop $(CC) -O pit_server.o -o pit_server freebsd64: iozone_freebsd64.o libbif.o fileop_freebsd64.o libasync.o pit_server.o $(CC) $(LDFLAGS) iozone_freebsd64.o libbif.o -lpthread libasync.o \ -o iozone $(CC) -O fileop_freebsd64.o -o fileop $(CC) -O pit_server.o -o pit_server # # GNU C compiler DragonFly build with no threads, no largefiles # dragonfly: iozone_dragonfly.o libbif.o fileop_dragonfly.o pit_server.o $(CC) $(LDFLAGS) iozone_dragonfly.o libbif.o -o iozone $(CC) -O fileop_dragonfly.o -o fileop $(CC) -O pit_server.o -o pit_server # # GNU C or Clang compiler MacosX build with no threads, no largefiles, no async I/O # macosx: iozone_macosx.o fileop_macosx.o pit_server.o $(CC) -O3 $(LDFLAGS) iozone_macosx.o libbif.o -o iozone $(CC) -O3 $(LDFLAGS) fileop_macosx.o -o fileop $(CC) -O3 $(LDFLAGS) pit_server.o -o pit_server # # # GNU C compiler OpenBSD build with no threads, no largefiles, no async I/O # openbsd: iozone_openbsd.o libbif.o fileop_openbsd.o pit_server.o $(CC) -O $(LDFLAGS) iozone_openbsd.o libbif.o -o iozone $(CC) -O fileop_openbsd.o -o fileop $(CC) -O pit_server.o -o pit_server # # GNU C compiler OpenBSD build with threads, no largefiles, no async I/O # openbsd-threads: iozone_openbsd-threads.o libbif.o $(CC) -O $(LDFLAGS) -pthread iozone_openbsd-threads.o \ libbif.o -o iozone # # GNU C compiler OSFV3 build # Has threads and async I/O but no largefiles. # OSFV3: iozone_OSFV3.o libbif.o libasync.o $(CC) -O $(LDFLAGS) iozone_OSFV3.o libbif.o \ -lpthreads libasync.o -laio -o iozone # # GNU C compiler OSFV4 build # Has threads and async I/O but no largefiles. # OSFV4: iozone_OSFV4.o libbif.o libasync.o $(CC) -O $(LDFLAGS) iozone_OSFV4.o libbif.o -lpthread \ libasync.o -laio -o iozone # # GNU C compiler OSFV5 build # Has threads and async I/O but no largefiles. # OSFV5: iozone_OSFV5.o libbif.o libasync.o $(CC) -O $(LDFLAGS) iozone_OSFV5.o libbif.o -lpthread \ libasync.o -laio -o iozone # # GNU C compiler TRU64 build # Has threads and async I/O but no largefiles. # TRU64: iozone_TRU64.o libbif.o libasync.o $(CC) -O $(LDFLAGS) iozone_TRU64.o libbif.o -lpthread \ libasync.o -laio -o iozone # # GNU Generic build with no threads, no largefiles, no async I/O # for SCO # Note: Be sure you have the latest patches for SCO's Openserver # or you will get warnings about timer problems. # SCO: iozone_SCO.o libbif.o $(GCC) -O $(LDFLAGS) iozone_SCO.o -lsocket -s libbif.o -o iozone # # GNU build with threads, largefiles, async I/O # for SCO Unixware 5 7.1.1 i386 x86at SCO UNIX SVR5 # Note: Be sure you have the latest patches for SCO's Openserver # or you will get warnings about timer problems. # SCO_Unixware_gcc: iozone_SCO_Unixware_gcc.o libbif.o libasync.o $(GCC) -O $(LDFLAGS) iozone_SCO_Unixware_gcc.o libbif.o libasync.o \ -lsocket -lthread -o iozone # # GNU C compiler NetBSD build with threads, no largefiles, no async I/O # netbsd: iozone_netbsd.o libbif.o libasync.o fileop_netbsd.o pit_server.o $(CC) -O $(LDFLAGS) iozone_netbsd.o libbif.o libasync.o \ -lrt -lpthread -o iozone $(CC) -O fileop_netbsd.o -o fileop $(CC) -O pit_server.o -o pit_server # # GNU C compiler NetBSD/amd64 build with threads, no largefiles, async I/O # netbsd-AMD64: iozone_netbsd-AMD64.o libbif.o libasync.o fileop_netbsd-AMD64.o pit_server.o $(CC) -O $(LDFLAGS) iozone_netbsd-AMD64.o libbif.o libasync.o \ -lrt -lpthread -o iozone $(CC) -O fileop_netbsd-AMD64.o -o fileop $(CC) -O pit_server.o -o pit_server # # # # Now for the machine specific stuff # iozone_hpux.o: iozone.c libbif.c @echo "" @echo "Building iozone for HP-UX (9.05)" @echo "" $(C89) +e -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS \ -DNAME='"hpux"' $(CFLAGS) iozone.c -o iozone_hpux.o $(C89) +e -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS \ $(CFLAGS) libbif.c -o libbif.o iozone_hpux-11.0.o: iozone.c libasync.c libbif.c @echo "" @echo "Building iozone for HP-UX (11.0)" @echo "" $(CC) -c +O3 +Oparallel -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ -DNAME='"hpux-11.0"' -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) \ iozone.c -o iozone_hpux-11.0.o $(CC) -c +O3 +Oparallel -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) libasync.c -o libasync.o $(CC) -c +O3 +Oparallel -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) libbif.c -o libbif.o iozone_hpux-11.0w.o: iozone.c libasync.c libbif.c @echo "" @echo "Building iozone for HP-UX (11.0w)" @echo "" $(CC) -c +DD64 +O3 -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ -DNAME='"hpux-11.0w"' -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) iozone.c \ -o iozone_hpux-11.0w.o $(CC) -c +DD64 +O3 -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) libasync.c -o libasyncw.o $(CC) -c +DD64 +O3 -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) libbif.c -o libbif.o iozone_hpuxs-11.0.o: iozone.c libasync.c libbif.c @echo "" @echo "Building simple iozone for HP-UX (11.0)" @echo "" $(CC) -c -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE -DHAVE_ANSIC_C \ -DNAME='"hpuxs-11.0"' -DASYNC_IO -DVXFS -DHAVE_PREAD $(CFLAGS) iozone.c \ -o iozone_hpuxs-11.0.o $(CC) -c -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE -DHAVE_ANSIC_C \ -DASYNC_IO -DVXFS $(CFLAGS) libasync.c -o libasync.o $(CC) -c -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE -DHAVE_ANSIC_C \ -DASYNC_IO -DVXFS $(CFLAGS) libbif.c -o libbif.o fileop_hpuxs-11.0.o: fileop.c @echo "" @echo "Building simple fileop for HP-UX (11.0)" @echo "" $(CC) -c $(CFLAGS) fileop.c -o fileop_hpuxs-11.0.o pit_server_solaris10gcc-64.o: pit_server.c @echo "" @echo "Building the pit_server" @echo "" $(GCC) -c $(CFLAGS) $(S10GCCFLAGS) pit_server.c -o pit_server_solaris10gcc-64.o pit_server.o: pit_server.c @echo "" @echo "Building the pit_server" @echo "" $(CC) -c $(CFLAGS) pit_server.c -o pit_server.o pit_server-linux-powerpc64.o: pit_server.c @echo "" @echo "Building the pit_server" @echo "" $(CC) -c $(CFLAGS) $(FLAG64BIT) pit_server.c -o pit_server-linux-powerpc64.o pit_server_solaris10gcc.o: pit_server.c @echo "" @echo "Building the pit_server" @echo "" $(GCC) -c $(CFLAGS) pit_server.c -o pit_server_solaris10gcc.o pit_server_win.o: pit_server.c @echo "" @echo "Building the pit_server for Windows" @echo "" $(GCC) -c $(CFLAGS) -DWindows pit_server.c -o pit_server_win.o pit_server_sua.o: pit_server.c @echo "" @echo "Building the pit_server for Windows SUA" @echo "" $(GCC) -c $(CFLAGS) -D_SUA_ pit_server.c -o pit_server_sua.o iozone_hpuxs-11.0w.o: iozone.c libasync.c libbif.c @echo "" @echo "Building simple iozone for HP-UX (11.0w)" @echo "" $(CC) -c +DD64 -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ -DNAME='"hpuxs-11.0w"' -DHAVE_ANSIC_C -DASYNC_IO -DVXFS \ -DHAVE_PREAD $(CFLAGS) iozone.c -o iozone_hpuxs-11.0w.o $(CC) -c +DD64 -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) libasync.c -o libasyncw.o $(CC) -c +DD64 -Dunix -D_LARGEFILE64_SOURCE -D_HPUX_SOURCE \ -DHAVE_ANSIC_C -DASYNC_IO -DVXFS $(CFLAGS) libbif.c -o libbif.o iozone_hpux-10.1.o: iozone.c libbif.c @echo "" @echo "Building iozone for HP-UX (10.1)" @echo "" $(C89) +e -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS \ -DNAME='"hpux-10.1"' $(CFLAGS) iozone.c -o iozone_hpux-10.1.o $(C89) +e -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS \ $(CFLAGS) libbif.c -o libbif.o iozone_hpux-10.20.o: iozone.c libbif.c @echo "" @echo "Building iozone for HP-UX (10.20)" @echo "" $(C89) +e -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS \ -DNAME='"hpux-10.20"' $(CFLAGS) iozone.c -o iozone_hpux-10.20.o $(C89) +e -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS \ $(CFLAGS) libbif.c -o libbif.o iozone_ghpux.o: iozone.c libbif.c @echo "" @echo "Building iozone for GCC HP-UX (9.05) " @echo "" $(GCC) -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS $(CFLAGS) iozone.c \ -DNAME='"h=ghpux"' -o iozone_ghpux.o $(GCC) -c -O -Dunix -D_HPUX_SOURCE -DHAVE_ANSIC_C -DNO_THREADS \ $(CFLAGS) libbif.c -o libbif.o iozone_generic.o: iozone.c libbif.c @echo "" @echo "Building iozone Generic " @echo "" $(CC) -c -O -Dgeneric -Dunix -DHAVE_ANSIC_C -DNO_THREADS \ -DNAME='"Generic"' $(CFLAGS) iozone.c -o iozone_generic.o $(CC) -c -O -Dgeneric -Dunix -DHAVE_ANSIC_C -DNO_THREADS \ $(CFLAGS) libbif.c -o libbif.o iozone_hpux_no.o: iozone.c libbif.c @echo "" @echo "Building iozone for HP-UX (9.05) without ansi compiler" @echo "" $(NACC) -c -O -Dunix -D_HPUX_SOURCE -DNO_THREADS iozone.c \ -DNAME='"hpux_no_ansi"' -o iozone_hpux_no.o $(NACC) -c -O -Dunix -D_HPUX_SOURCE -DNO_THREADS \ libbif.c -o libbif.o iozone_hpux_no-10.1.o: iozone.c @echo "" @echo "Building iozone for HP-UX (10.1) without ansi compiler" @echo "" $(NACC) -c -O -Dunix -D_HPUX_SOURCE -DNO_THREADS iozone.c \ -DNAME='"hpux_no_ansi_10.1"' -o iozone_hpux_no-10.1.o $(NACC) -c -O -Dunix -D_HPUX_SOURCE -DNO_THREADS \ libbif.c -o libbif.o iozone_linux-powerpc.o: iozone.c libbif.c libasync.c @echo "" @echo "Building iozone for Linux PowerPC" @echo "" $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DDONT_HAVE_O_DIRECT \ -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ -DNAME='"linux-powerpc"' -o iozone_linux-powerpc.o $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ -DSHARED_MEM -Dlinux $(CFLAGS) libbif.c -o libbif.o $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o iozone_linux-powerpc64.o: iozone.c libbif.c libasync.c @echo "" @echo "Building iozone for Linux PowerPC64" @echo "" $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DNAME='"linux-powerpc64"' \ -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ $(FLAG64BIT) -o iozone_linux-powerpc64.o $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ -DSHARED_MEM -Dlinux $(CFLAGS) libbif.c $(FLAG64BIT) -o libbif.o $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c $(FLAG64BIT) -o libasync.o iozone_linux-sparc.o: iozone.c libbif.c libasync.c @echo "" @echo "Building iozone for Linux Sparc" @echo "" $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DDONT_HAVE_O_DIRECT \ -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ -DNAME='"linux-sparc"' -o iozone_linux-sparc.o $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ -DSHARED_MEM -Dlinux $(CFLAGS) libbif.c -o libbif.o $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o iozone_linux.o: iozone.c libbif.c libasync.c @echo "" @echo "Building iozone for Linux" @echo "" $(CC) -Wmissing-prototypes -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DHAVE_PREAD \ -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ -DNAME='"linux"' -o iozone_linux.o $(CC) -Wmissing-prototypes -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ -DSHARED_MEM -Dlinux $(CFLAGS) libbif.c -o libbif.o $(CC) -Wmissing-prototypes -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o fileop_AIX.o: fileop.c @echo "" @echo "Building fileop for AIX" @echo "" $(CC) -c -O $(CFLAGS) fileop.c -o fileop_AIX.o fileop_AIX-LF.o: fileop.c @echo "" @echo "Building fileop for AIX-LF" @echo "" $(CC) -c -O $(CFLAGS) fileop.c -o fileop_AIX-LF.o fileop_AIX64.o: fileop.c @echo "" @echo "Building fileop for AIX64" @echo "" $(GCC) -maix64 -c -O3 $(CFLAGS) fileop.c -o fileop_AIX64.o fileop_AIX64-LF.o: fileop.c @echo "" @echo "Building fileop for AIX64-LF" @echo "" $(GCC) -maix64 -c -O3 $(CFLAGS) fileop.c -o fileop_AIX64-LF.o fileop_bsdi.o: fileop.c @echo "" @echo "Building fileop for BSDi" @echo "" $(CC) -c -O $(CFLAGS) fileop.c -o fileop_bsdi.o fileop_freebsd.o: fileop.c @echo "" @echo "Building fileop for FreeBSD" @echo "" $(CC) -c -O $(CFLAGS) fileop.c -o fileop_freebsd.o fileop_freebsd64.o: fileop.c @echo "" @echo "Building fileop for FreeBSD64" @echo "" $(CC) -c -O $(CFLAGS) fileop.c -o fileop_freebsd64.o fileop_dragonfly.o: fileop.c @echo "" @echo "Building fileop for DragonFly" @echo "" $(CC) -c -O $(CFLAGS) fileop.c -o fileop_dragonfly.o fileop_netbsd.o: fileop.c @echo "" @echo "Building fileop for NetBSD" @echo "" $(CC) -c -O $(CFLAGS) fileop.c -o fileop_netbsd.o fileop_netbsd-AMD64.o: fileop.c @echo "" @echo "Building fileop for NetBSD/AMD64" @echo "" $(CC) -c -O $(CFLAGS) fileop.c -o fileop_netbsd-AMD64.o fileop_Solaris.o: fileop.c @echo "" @echo "Building fileop for Solaris" @echo "" $(CC) -c -O $(CFLAGS) fileop.c -o fileop_Solaris.o fileop_Solaris10.o: fileop.c @echo "" @echo "Building fileop for Solaris10" @echo "" $(CC) -c -O $(CFLAGS) fileop.c -o fileop_Solaris10.o fileop_Solaris10cc.o: fileop.c @echo "" @echo "Building fileop for Solaris10cc" @echo "" $(CC) -c -O $(CFLAGS) fileop.c -o fileop_Solaris10cc.o fileop_Solaris10gcc.o: fileop.c @echo "" @echo "Building fileop for Solaris10gcc" @echo "" $(GCC) -c -O $(CFLAGS) fileop.c -o fileop_Solaris10gcc.o fileop_Solaris10gcc-64.o: fileop.c @echo "" @echo "Building fileop for Solaris10gcc-64" @echo "" $(GCC) -c -O $(CFLAGS) $(S10GCCFLAGS) fileop.c -o fileop_Solaris10gcc-64.o fileop_Solaris10cc-64.o: fileop.c @echo "" @echo "Building fileop for Solaris10cc-64" @echo "" $(CC) -c -O $(CFLAGS) $(S10CCFLAGS) fileop.c -o fileop_Solaris10cc-64.o fileop_linux.o: fileop.c @echo "" @echo "Building fileop for Linux" @echo "" $(CC) -c -O3 $(CFLAGS) fileop.c -o fileop_linux.o fileop_openbsd.o: fileop.c @echo "" @echo "Building fileop for OpenBSD" @echo "" $(CC) -c -O $(CFLAGS) fileop.c -o fileop_openbsd.o fileop_macosx.o: fileop.c @echo "" @echo "Building fileop for MAC OS X" @echo "" $(CC) -c -O3 -DIOZ_macosx $(CFLAGS) fileop.c -o fileop_macosx.o fileop_linux-ia64.o: fileop.c @echo "" @echo "Building fileop for Linux-ia64" @echo "" $(CC) -c -O3 $(CFLAGS) fileop.c -o fileop_linux-ia64.o fileop_linux-ppc.o: fileop.c @echo "" @echo "Building fileop for Linux-powerpc" @echo "" $(CC) -c -O3 $(CFLAGS) fileop.c -o fileop_linux-ppc.o fileop_linux-ppc64.o: fileop.c @echo "" @echo "Building fileop for Linux-powerpc64" @echo "" $(CC) -c -O3 $(CFLAGS) $(FLAG64BIT) fileop.c -o fileop_linux-ppc64.o fileop_linux-AMD64.o: fileop.c @echo "" @echo "Building fileop for Linux-AMD64" @echo "" $(CC) -c -O3 $(CFLAGS) fileop.c -o fileop_linux-AMD64.o fileop_linux-arm.o: fileop.c @echo "" @echo "Building fileop for Linux-arm" @echo "" $(GCC) -c -O3 $(CFLAGS) fileop.c -o fileop_linux-arm.o fileop_android.o: fileop.c @echo "" @echo "Building fileop for Android" @echo "" $(GCC) -c -O3 $(CFLAGS) $(ANDROID_CFLAGS) fileop.c -o fileop_android.o fileop_linux-s390.o: fileop.c @echo "" @echo "Building fileop for Linux-S390" @echo "" $(GCC) -c -O3 $(CFLAGS) fileop.c -o fileop_linux-s390.o fileop_linux-s390x.o: fileop.c @echo "" @echo "Building fileop for Linux-s390x" @echo "" $(GCC) -c -O3 $(CFLAGS) fileop.c -o fileop_linux-s390x.o fileop_windows.o: fileop.c @echo "" @echo "Building fileop for Windows" @echo "" $(GCC) -c -O3 $(CFLAGS) -DWindows fileop.c -o fileop_windows.o fileop_sua.o: fileop.c @echo "" @echo "Building fileop for Windows SUA" @echo "" $(GCC) -c -O3 $(CFLAGS) -D_SUA_ fileop.c -o fileop_sua.o iozone_linux-ia64.o: iozone.c libbif.c libasync.c @echo "" @echo "Building iozone for Linux-ia64" @echo "" $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DNAME='"linux-ia64"' \ -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ -o iozone_linux-ia64.o $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ -DSHARED_MEM -Dlinux $(CFLAGS) libbif.c -o libbif.o $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o iozone_linux-arm.o: iozone.c libbif.c libasync.c @echo "" @echo "Building iozone for Linux-arm" @echo "" $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DHAVE_PREAD \ -DNAME='"linux-arm"' -DLINUX_ARM -DSHARED_MEM \ -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ -o iozone_linux-arm.o $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ -DSHARED_MEM -Dlinux $(CFLAGS) libbif.c -o libbif.o $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o iozone_android.o: iozone.c libbif.c libasync.c @echo "" @echo "Building iozone for Android" @echo "" $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DHAVE_PREAD \ -DNAME='"android"' -DLINUX_ARM -DANDROID -DSHARED_MEM \ -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) $(ANDROID_CFLAGS) iozone.c \ -o iozone_android.o $(CC) -c -O3 -Dunix -DANDROID -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ -DSHARED_MEM -Dlinux $(CFLAGS) $(ANDROID_CFLAGS) libbif.c -o libbif.o $(CC) -c -O3 -Dunix -Dlinux -DANDROID -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE $(CFLAGS) $(ANDROID_CFLAGS) libasync.c -o libasync.o iozone_linux-AMD64.o: iozone.c libbif.c libasync.c @echo "" @echo "Building iozone for Linux-AMD64" @echo "" $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DNAME='"linux-AMD64"' \ -D__AMD64__ -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE \ -DHAVE_PREAD $(CFLAGS) iozone.c -o iozone_linux-AMD64.o $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ -DSHARED_MEM -Dlinux $(CFLAGS) libbif.c -o libbif.o $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o iozone_linux-s390.o: iozone.c libbif.c libasync.c @echo "" @echo "Building iozone for Linux-s390" @echo "" $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DHAVE_PREAD \ -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ -DNAME='"linux-s390"' -o iozone_linux-s390.o $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DSHARED_MEM -Dlinux \ -D_LARGEFILE64_SOURCE $(CFLAGS) libbif.c -o libbif.o $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o iozone_linux-s390x.o: iozone.c libbif.c libasync.c @echo "" @echo "Building iozone for Linux-s390x" @echo "" $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DHAVE_PREAD \ -DSHARED_MEM -Dlinux -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ -DNAME='"linux-s390x"' -o iozone_linux-s390x.o $(CC) -c -O3 -Dunix -DHAVE_ANSIC_C -DSHARED_MEM -Dlinux \ -D_LARGEFILE64_SOURCE $(CFLAGS) libbif.c -o libbif.o $(CC) -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o iozone_AIX.o: iozone.c libbif.c @echo "" @echo "Building iozone for AIX" @echo "" $(CC) -c -O -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ -DNAME='"AIX"' -DSHARED_MEM $(CFLAGS) iozone.c -o iozone_AIX.o $(CC) -c -O -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o iozone_AIX-LF.o: iozone.c libbif.c @echo "" @echo "Building iozone for AIX with Large files" @echo "" $(CC) -c -O -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ -DSHARED_MEM -D_LARGEFILE64_SOURCE -D_LARGE_FILES \ -DNAME='"AIX-LF"' $(CFLAGS) iozone.c -o iozone_AIX-LF.o $(CC) -c -O -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ -DSHARED_MEM -D_LARGEFILE64_SOURCE -D_LARGE_FILES \ $(CFLAGS) libbif.c -o libbif.o iozone_AIX64.o: iozone.c libbif.c libasync.c @echo "" @echo "Building iozone for AIX64" @echo "" $(GCC) -maix64 -c -O3 -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ -DASYNC_IO -DNAME='"AIX64"' -DSHARED_MEM \ $(CFLAGS) iozone.c -o iozone_AIX64.o $(GCC) -maix64 -c -O3 -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ -DASYNC_IO -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o $(GCC) -maix64 -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ $(CFLAGS) libasync.c -o libasync.o iozone_AIX64-LF.o: iozone.c libbif.c libasync.c @echo "" @echo "Building iozone for AIX64 with Large files" @echo "" $(GCC) -maix64 -c -O3 -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ -DASYNC_IO -DNAME='"AIX64-LF"' -DSHARED_MEM \ -D_LARGEFILE64_SOURCE -D_LARGE_FILES \ $(CFLAGS) iozone.c -o iozone_AIX64-LF.o $(GCC) -maix64 -c -O3 -D__AIX__ -D_NO_PROTO -Dunix -DHAVE_ANSIC_C \ -DASYNC_IO -DSHARED_MEM -D_LARGEFILE64_SOURCE -D_LARGE_FILES \ $(CFLAGS) libbif.c -o libbif.o $(GCC) -maix64 -c -O3 -Dunix -Dlinux -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE -D_LARGE_FILES \ $(CFLAGS) libasync.c -o libasync.o iozone_solaris.o: iozone.c libasync.c libbif.c @echo "" @echo "Building iozone for Solaris" @echo "" $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ -DNAME='"Solaris"' $(CFLAGS) iozone.c -o iozone_solaris.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ $(CFLAGS) libasync.c -o libasync.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ $(CFLAGS) libbif.c -o libbif.o iozone_solaris7gcc.o: iozone.c libasync.c libbif.c @echo "" @echo "Building iozone for Solaris7gcc" @echo "" $(GCC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ -DNAME='"Solaris7gcc"' $(CFLAGS) libasync.c -o libasync7.o $(GCC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ $(CFLAGS) libbif.c -o libbif7.o $(GCC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ -DNAME='"Solaris7gcc"' $(CFLAGS) iozone.c -o iozone_solaris7gcc.o iozone_solaris10.o: iozone.c libbif.c @echo "" @echo "Building iozone for Solaris10" @echo "" $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ $(CFLAGS) libbif.c -o libbif10.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ -DNAME='"Solaris10"' $(CFLAGS) libasync.c -o libasync10.o $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO -Dstudio11 \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ -DNAME='"Solaris10"' $(CFLAGS) iozone.c -o iozone_solaris10.o iozone_solaris10cc.o: iozone.c libbif.c @echo "" @echo "Building iozone for Solaris10cc" @echo "" $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ $(CFLAGS) libbif.c -o libbif10cc.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ -DNAME='"Solaris10"' $(CFLAGS) libasync.c -o libasync10cc.o $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO -Dstudio11 \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ -DNAME='"Solaris10"' $(CFLAGS) iozone.c -o iozone_solaris10cc.o iozone_solaris10gcc.o: iozone.c libbif.c @echo "" @echo "Building iozone for Solaris10gcc" @echo "" $(GCC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ $(CFLAGS) libbif.c -o libbif10.o $(GCC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ -DNAME='"Solaris10gcc"' $(CFLAGS) libasync.c -o libasync10.o $(GCC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ -DNAME='"Solaris10gcc"' $(CFLAGS) iozone.c -o iozone_solaris10gcc.o iozone_solaris10gcc-64.o: iozone.c libbif.c @echo "" @echo "Building iozone for Solaris10gcc-64" @echo "" $(GCC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ $(CFLAGS) $(S10GCCFLAGS) libbif.c -o libbif10-64.o $(GCC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ -DNAME='"Solaris10gcc-64"' $(CFLAGS) $(S10GCCFLAGS) libasync.c -o libasync10-64.o $(GCC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ -DNAME='"Solaris10gcc-64"' $(CFLAGS) $(S10GCCFLAGS) iozone.c -o iozone_solaris10gcc-64.o iozone_solaris10cc-64.o: iozone.c libbif.c @echo "" @echo "Building iozone for Solaris10cc-64" @echo "" $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ $(CFLAGS) $(S10CCFLAGS) libbif.c -o libbif10-64.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D__LP64__ \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ -DNAME='"Solaris10cc-64"' $(CFLAGS) $(S10CCFLAGS) libasync.c -o libasync10-64.o $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO -Dstudio11 \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Dsolaris \ -DNAME='"Solaris10cc-64"' $(CFLAGS) $(S10CCFLAGS) iozone.c -o iozone_solaris10cc-64.o # # -DSHARED_MEM -Dsolaris libasync.c -o libasync.o # -DSHARED_MEM -Dsolaris iozone.c -o iozone_solaris.o # iozone_solaris-2.6.o: iozone.c libbif.c @echo "" @echo "Building iozone for Solaris-2.6" @echo "" $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DNO_THREADS \ -DNAME='"Solaris-2.6"' -Dsolaris $(CFLAGS) iozone.c -o iozone_solaris-2.6.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C \ -Dsolaris $(CFLAGS) libbif.c -o libbif.o iozone_solaris8-64.o: iozone.c libasync.c libbif.c @echo "" @echo "Building iozone for Solaris8-64" @echo "" $(CC) -fast -xtarget=generic64 -v -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ -D__LP64__ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ -DNAME='"Solaris8-64"' -Dsolaris -DHAVE_PREAD \ $(CFLAGS) iozone.c -o iozone_solaris8-64.o $(CC) -fast -xtarget=generic64 -v -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ -D__LP64__ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ -Dsolaris -DHAVE_PREAD $(CFLAGS) libasync.c -o libasync.o $(CC) -fast -xtarget=generic64 -v -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ -D__LP64__ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ -Dsolaris -DHAVE_PREAD $(CFLAGS) libbif.c -o libbif.o iozone_solaris8-64-VXFS.o: iozone.c libasync.c libbif.c @echo "" @echo "Building iozone for Solaris8-64-VXFS" @echo "" $(CC) -fast -xtarget=generic64 -v -c -I/opt/VRTSvxfs/include/ -Dunix \ -DVXFS -DHAVE_ANSIC_C -DASYNC_IO \ -D__LP64__ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ -DNAME='"Solaris8-64"' -Dsolaris -DHAVE_PREAD \ $(CFLAGS) iozone.c -o iozone_solaris8-64-VXFS.o $(CC) -fast -xtarget=generic64 -v -c -I/opt/VRTSvxfs/include/ -Dunix \ -DVXFS -DHAVE_ANSIC_C -DASYNC_IO \ -D__LP64__ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ -Dsolaris -DHAVE_PREAD $(CFLAGS) libasync.c -o libasync.o $(CC) -fast -xtarget=generic64 -v -c -I/opt/VRTSvxfs/include/ -Dunix \ -DVXFS -DHAVE_ANSIC_C -DASYNC_IO \ -D__LP64__ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ -Dsolaris -DHAVE_PREAD $(CFLAGS) libbif.c -o libbif.o iozone_windows.o: iozone.c libasync.c libbif.c fileop.c @echo "" @echo "Building iozone for Windows (No async I/O)" @echo "" $(GCC) -c -O -Dunix -DHAVE_ANSIC_C -DNO_MADVISE \ -DWindows $(CFLAGS) iozone.c \ -o iozone_windows.o $(GCC) -c -O -Dunix -DHAVE_ANSIC_C -DNO_MADVISE \ -DWindows $(CFLAGS) libbif.c -o libbif.o # -D_SUA_ $(CFLAGS) -DDONT_HAVE_O_DIRECT iozone.c \ iozone_sua.o: iozone.c libasync.c libbif.c fileop.c @echo "" @echo "Building iozone for Windows SUA (No async I/O)" @echo "" $(GCC) -c -O -Dunix -DHAVE_ANSIC_C -D_XOPEN_SOURCE -DNO_MADVISE \ -D_SUA_ $(CFLAGS) iozone.c \ -DNAME='"Windows SUA"' -o iozone_sua.o $(GCC) -c -O -Dunix -D_SUA_ -D_XOPEN_SOURCE -DHAVE_ANSIC_C \ -DNO_MADVISE $(CFLAGS) libbif.c -o libbif.o iozone_uwin.o: iozone.c libbif.c @echo "" @echo "Building iozone for UWIN (No threads, No async I/O)" @echo "" $(GCC) -c -O -DUWIN -Dunix -DHAVE_ANSIC_C -DNO_THREADS -DNO_MADVISE \ -DNAME='"UWIN"' -DSHARED_MEM -DWindows $(CFLAGS) iozone.c -o iozone_uwin.o $(GCC) -c -O -DUWIN -Dunix -DHAVE_ANSIC_C -DNO_THREADS -DNO_MADVISE \ -DSHARED_MEM -DWindows $(CFLAGS) libbif.c -o libbif.o iozone_IRIX64.o: iozone.c libasync.c libbif.c @echo "" @echo "Building iozone for IRIX64" @echo "" $(CC) -32 -O -c -Dunix -DHAVE_ANSIC_C -D_LARGEFILE64_SOURCE -DASYNC_IO \ -DNAME='"IRIX64"' -DIRIX64 -DSHARED_MEM $(CFLAGS) iozone.c -o iozone_IRIX64.o $(CC) -32 -O -c -Dunix -DHAVE_ANSIC_C -D_LARGEFILE64_SOURCE -DASYNC_IO \ -DIRIX64 -DSHARED_MEM $(CFLAGS) libasync.c -o libasyncw.o $(CC) -32 -O -c -Dunix -DHAVE_ANSIC_C -D_LARGEFILE64_SOURCE -DASYNC_IO \ -DIRIX64 -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o iozone_IRIX.o: iozone.c libasync.c libbif.c @echo "" @echo "Building iozone for IRIX" @echo "" $(CC) -O -32 -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ -DNAME='"IRIX"' -DIRIX -DSHARED_MEM $(CFLAGS) iozone.c -o iozone_IRIX.o $(CC) -O -32 -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ -DIRIX -DSHARED_MEM $(CFLAGS) libasync.c -o libasync.o $(CC) -O -32 -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ -DIRIX -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o iozone_CrayX1.o: iozone.c libasync.c libbif.c @echo "" @echo "Building iozone for CrayX1" @echo "" $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ -DNAME='"CrayX1"' -DIRIX64 -DSHARED_MEM -D__CrayX1__ \ $(CFLAGS) iozone.c -o iozone_CrayX1.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ -DIRIX64 -DSHARED_MEM -D__CrayX1__ \ $(CFLAGS) libasync.c -o libasyncw.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -D_LARGEFILE64_SOURCE \ -DIRIX64 -DSHARED_MEM -D__CrayX1__ $(CFLAGS) libbif.c \ -o libbif.o iozone_sppux.o: iozone.c libbif.c @echo "" @echo "Building iozone for SPP-UX using Convex compiler" @echo "" $(NACC) -c -O -Dunix -D_HPUX_SOURCE -D__convex_spp \ -DNAME='"sppux"' -Wl,+parallel -DHAVE_ANSIC_C -DHAVE_PREAD \ -DHAVE_PREADV $(CFLAGS) iozone.c -o iozone_sppux.o $(NACC) -O -Dunix -D_HPUX_SOURCE -D__convex_spp \ -Wl,+parallel -DHAVE_ANSIC_C -DHAVE_PREAD -DHAVE_PREADV \ $(CFLAGS) libbif.c -o libbif.o iozone_sppux-10.1.o: iozone.c libbif.c @echo "" @echo "Building iozone for SPP-UX using HP ansic compiler" @echo "" $(NACC) -c -O -Dunix -D_HPUX_SOURCE -D__convex_spp \ -DHAVE_ANSIC_C -DHAVE_PREAD -DHAVE_PREADV $(CFLAGS) iozone.c \ -DNAME='"sppux-10.1"' -Wl,+parallel -o iozone_sppux-10.1.o $(NACC) -c -O -Dunix -D_HPUX_SOURCE -D__convex_spp \ -DHAVE_ANSIC_C -DHAVE_PREAD -DHAVE_PREADV \ $(CFLAGS) libbif.c -Wl,+parallel -o libbif.o iozone_sppux_no-10.1.o: iozone.c libbif.c @echo "" @echo "Building iozone for SPP-UX no ANSI c compiler" @echo "" $(CCS) -c -O -Dunix -D_HPUX_SOURCE -D__convex_spp \ -DNAME='"sppux_no_ansi_10.1"' -Wl,+parallel -DHAVE_PREAD \ -DHAVE_PREADV $(CFLAGS) iozone.c -o iozone_sppux_no-10.1.o $(CCS) -c -O -Dunix -D_HPUX_SOURCE -D__convex_spp \ -Wl,+parallel -DHAVE_PREAD -DHAVE_PREADV $(CFLAGS) \ libbif.c -o libbif.o iozone_convex.o: iozone.c libbif.c @echo "" @echo "Building iozone for Convex 'C' series" @echo "" $(CC) -c -O -Dunix -DNO_THREADS -Dbsd4_2 $(CFLAGS) iozone.c \ -DNAME='"Convex"' -o iozone_convex.o $(CC) -c -O -Dunix -DNO_THREADS -Dbsd4_2 \ $(CFLAGS) libbif.c -o libbif.o iozone_bsdi.o: iozone.c libbif.c @echo "" @echo "Build iozone for BSD/OS" @echo "" $(CC) -c -O -Dunix -Dbsd4_4 -DHAVE_ANSIC_C \ -DNAME='"bsdi"' $(CFLAGS) iozone.c -o iozone_bsdi.o $(CC) -c -O -Dunix -Dbsd4_4 -DHAVE_ANSIC_C \ $(CFLAGS) libbif.c -o libbif.o iozone_freebsd.o: iozone.c libbif.c libasync.c @echo "" @echo "Build iozone for FreeBSD" @echo "" $(CC) -c ${CFLAGS} -DFreeBSD -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DASYNC_IO \ -DHAVE_PREAD -DNAME='"freebsd"' -DSHARED_MEM \ $(CFLAGS) iozone.c -o iozone_freebsd.o $(CC) -c ${CFLAGS} -DFreeBSD -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DASYNC_IO \ -DSHARED_MEM -DHAVE_PREAD $(CFLAGS) libbif.c \ -o libbif.o $(CC) -c ${CFLAGS} -DFreeBSD -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DASYNC_IO \ -DSHARED_MEM -DHAVE_PREAD $(CFLAGS) libasync.c \ -o libasync.o iozone_freebsd64.o: iozone.c libbif.c libasync.c @echo "" @echo "Build iozone for FreeBSD64" @echo "" $(CC) -c ${CFLAGS} -DFreeBSD -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DASYNC_IO \ -DHAVE_PREAD -DNAME='"freebsd"' -DSHARED_MEM \ $(CFLAGS) iozone.c -o iozone_freebsd64.o $(CC) -c ${CFLAGS} -DFreeBSD -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DASYNC_IO \ -DSHARED_MEM -DHAVE_PREAD $(CFLAGS) libbif.c \ -o libbif.o $(CC) -c ${CFLAGS} -DFreeBSD -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DASYNC_IO \ -DSHARED_MEM -DHAVE_PREAD $(CFLAGS) libasync.c \ -o libasync.o iozone_dragonfly.o: iozone.c libbif.c @echo "" @echo "Build iozone for DragonFly" @echo "" $(CC) -c ${CFLAGS} -D__DragonFly__ -Dunix -DHAVE_ANSIC_C -DNO_THREADS \ -DNAME='"dragonfly"' -DSHARED_MEM -DHAVE_PREAD -DHAVE_PREADV \ $(CFLAGS) iozone.c -o iozone_dragonfly.o $(CC) -c ${CFLAGS} -D__DragonFly__ -Dunix -DHAVE_ANSIC_C -DNO_THREADS \ -DSHARED_MEM -DHAVE_PREAD -DHAVE_PREADV $(CFLAGS) libbif.c \ -o libbif.o iozone_macosx.o: iozone.c libbif.c @echo "" @echo "Build iozone for MacOSX" @echo "" $(CC) -c -O3 -Dunix -Dbsd4_2 -DIOZ_macosx -DHAVE_ANSIC_C -DNO_THREADS \ -DNAME='"macosx"' -DSHARED_MEM $(CFLAGS) iozone.c -o iozone_macosx.o $(CC) -c -O3 -Dunix -Dbsd4_2 -DIOZ_macosx -DHAVE_ANSIC_C -DNO_THREADS \ -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o iozone_openbsd.o: iozone.c libbif.c @echo "" @echo "Build iozone for OpenBSD" @echo "" $(CC) -c -O -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DNO_THREADS \ -DNAME='"openbsd"' -DSHARED_MEM $(CFLAGS) iozone.c -o iozone_openbsd.o $(CC) -c -O -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DNO_THREADS \ -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o iozone_openbsd-threads.o: iozone.c libbif.c @echo "" @echo "Build iozone for OpenBSD with threads" @echo "" $(CC) -c -O -pthread -Dunix -Dbsd4_4 -DHAVE_ANSIC_C \ -DNAME='"openbsd-threads"' $(CFLAGS) iozone.c \ -o iozone_openbsd-threads.o $(CC) -c -O -pthread -Dunix -Dbsd4_4 -DHAVE_ANSIC_C \ $(CFLAGS) libbif.c -o libbif.o iozone_OSFV3.o: iozone.c libbif.c @echo "" @echo "Build iozone for OSFV3" @echo "" $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV3 \ -DNAME='"OSFV3"' -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) iozone.c \ -o iozone_OSFV3.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV3 \ -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libbif.c -o libbif.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV3 \ -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libasync.c -o libasync.o iozone_OSFV4.o: iozone.c libbif.c @echo "" @echo "Build iozone for OSFV4" @echo "" $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV4 \ -DNAME='"OSFV4"' -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) iozone.c \ -o iozone_OSFV4.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV4 \ -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libbif.c -o libbif.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV4 \ -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libasync.c -o libasync.o iozone_OSFV5.o: iozone.c libbif.c @echo "" @echo "Build iozone for OSFV5" @echo "" $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV5 \ -DNAME='"OSFV5"' -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) iozone.c \ -o iozone_OSFV5.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV5 \ -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libbif.c -o libbif.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV5 \ -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libasync.c -o libasync.o iozone_TRU64.o: iozone.c libbif.c @echo "" @echo "Build iozone for TRU64" @echo "" $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV5 -DTRU64 -DHAVE_PREAD \ -DNAME='"TRU64"' -DNO_PRINT_LLD -DOSF_64 -pthread $(CFLAGS) iozone.c \ -o iozone_TRU64.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV5 -DHAVE_PREAD \ -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libbif.c -o libbif.o $(CC) -O -c -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DOSFV5 -DHAVE_PREAD \ -DNO_PRINT_LLD -DOSF_64 $(CFLAGS) libasync.c -o libasync.o iozone_SCO.o: iozone.c libbif.c @echo "" @echo "Building iozone SCO " @echo "" $(GCC) -c -O -DSCO -Dunix -DHAVE_ANSIC_C -DNO_THREADS -DNO_MADVISE \ -DNAME='"SCO"' $(CFLAGS) iozone.c -o iozone_SCO.o $(GCC) -c -O -DSCO -Dunix -DHAVE_ANSIC_C -DNO_THREADS -DNO_MADVISE \ $(CFLAGS) libbif.c -o libbif.o iozone_SCO_Unixware_gcc.o: iozone.c libbif.c libasync.c @echo "" @echo "Building iozone SCO_Unixware_gcc " @echo "" $(GCC) -c -O -DSCO_Unixware_gcc -Dunix -DHAVE_ANSIC_C \ -DASYNC_IO -D_LARGEFILE64_SOURCE $(CFLAGS) iozone.c \ -DNAME='"SCO_Unixware_gcc"' -o iozone_SCO_Unixware_gcc.o $(GCC) -c -O -DSCO_Unixware_gcc -Dunix -DHAVE_ANSIC_C \ -DASYNC_IO -D_LARGEFILE64_SOURCE $(CFLAGS) libbif.c -o libbif.o $(GCC) -c -O -DSCO_Unixware_gcc -Dunix -DHAVE_ANSIC_C \ -DASYNC_IO -D_LARGEFILE64_SOURCE $(CFLAGS) libasync.c -o libasync.o iozone_netbsd.o: iozone.c libbif.c @echo "" @echo "Building iozone NetBSD " @echo "" $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DNAME='"netbsd"' \ -DSHARED_MEM \ -DHAVE_PREAD $(CFLAGS) iozone.c -o iozone_netbsd.o $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ $(CFLAGS) libasync.c -o libasync.o iozone_netbsd-AMD64.o: iozone.c libbif.c libasync.c @echo "" @echo "Building iozone for NetBSD/amd64" @echo "" $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO -DNAME='"netbsd-AMD64"' \ -D__AMD64__ -DSHARED_MEM \ -DHAVE_PREAD $(CFLAGS) iozone.c -o iozone_netbsd-AMD64.o $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o $(CC) -c -O -Dunix -DHAVE_ANSIC_C -DASYNC_IO \ $(CFLAGS) libasync.c -o libasync.o $(CC) -c -O -Dunix -Dbsd4_4 -DHAVE_ANSIC_C -DNO_THREADS \ -DSHARED_MEM $(CFLAGS) libbif.c -o libbif.o iozone3_508/src/current/libasync.c0000555000000000000000000011066315051766073016001 0ustar rootroot/* * Library for Posix async read operations with hints. * Author: Don Capps * Company: Iozone * Date: 4/24/1998 * * Two models are supported. First model is a replacement for read() where the async * operations are performed and the requested data is bcopy()-ed back into the users * buffer. The second model is a new version of read() where the caller does not * supply the address of the buffer but instead is returned an address to the * location of the data. The second model eliminates a bcopy from the path. * * To use model #1: * 1. Call async_init(&pointer_on_stack,fd,direct_flag); * The fd is the file descriptor for the async operations. * The direct_flag sets VX_DIRECT * * 2. Call async_read(gc, fd, ubuffer, offset, size, stride, max, depth) * Where: * gc ............ is the pointer on the stack * fd ............ is the file descriptor * ubuffer ....... is the address of the user buffer. * offset ........ is the offset in the file to begin reading * size .......... is the size of the transfer. * stride ........ is the distance, in size units, to space the async reads. * max ........... is the max size of the file to be read. * depth ......... is the number of async operations to perform. * * 3. Call end_async(gc) when finished. * Where: * gc ............ is the pointer on the stack. * * To use model #2: * 1. Call async_init(&pointer_on_stack,fd,direct_flag); * The fd is the file descriptor for the async operations. * The direct_flag sets VX_DIRECT * 2. Call async_read(gc, fd, &ubuffer, offset, size, stride, max, depth) * Where: * gc ............ is the pointer on the stack * fd ............ is the file descriptor * ubuffer ....... is the address of a pointer that will be filled in * by the async library. * offset ........ is the offset in the file to begin reading * size .......... is the size of the transfer. * stride ........ is the distance, in size units, to space the async reads. * max ........... is the max size of the file to be read. * depth ......... is the number of async operations to perform. * * 3. Call async_release(gc) when finished with the data that was returned. * This allows the async library to reuse the memory that was filled in * and returned to the user. * * 4. Call end_async(gc) when finished. * Where: * gc ............ is the pointer on the stack. * * To use model #1: (WRITES) * 1. Call async_init(&pointer_on_stack,fd,direct_flag); * The fd is the file descriptor for the async operations. * * 2. Call async_write(gc, fd, ubuffer, size, offset, depth) * Where: * gc ............ is the pointer on the stack * fd ............ is the file descriptor * ubuffer ....... is the address of the user buffer. * size .......... is the size of the transfer. * offset ........ is the offset in the file to begin reading * depth ......... is the number of async operations to perform. * * 4. Call end_async(gc) when finished. * Where: * gc ............ is the pointer on the stack. * * Notes: * The intended use is to replace calls to read() with calls to * async_read() and allow the user to make suggestions on * what kind of async read-ahead would be nice to have. * The first transfer requested is guarenteed to be complete * before returning to the caller. The async operations will * be started and will also be guarenteed to have completed * if the next call specifies its first request to be one * that was previously performed with an async operation. * * The async_read_no_copy() function allows the async operations * to return the data to the user and not have to perform * a bcopy of the data back into the user specified buffer * location. This model is faster but assumes that the user * application has been modified to work with this model. * * The async_write() is intended to enhance the performance of * initial writes to a file. This is the slowest case in the write * path as it must perform meta-data allocations and wait. */ #include #include #if defined(_LARGEFILE64_SOURCE) && !defined(__LP64__) # define aio_error aio_error64 # define aio_return aio_return64 # define aio_read aio_read64 # define aio_cancel aio_cancel64 # define aio_write aio_write64 #endif #if defined(solaris) || defined(linux) || defined(SCO_Unixware_gcc) || defined(__NetBSD__) #else #include #endif #include #include #ifndef bsd4_4 #include #endif #ifdef VXFS #include #endif #if defined(OSFV5) || defined(linux) #include #endif #if defined(linux) #include #include #include #endif #if (defined(solaris) && defined(__LP64__)) || defined(__s390x__) || defined(__FreeBSD__) || defined(__NetBSD__) /* If we are building for 64-bit Solaris, all functions that return pointers * must be declared before they are used; otherwise the compiler will assume * that they return ints and the top 32 bits of the pointer will be lost, * causing segmentation faults. The following includes take care of this. * It should be safe to add these for all other OSs too, but we're only * doing it for Solaris now in case another OS turns out to be a special case. */ #include #include #include /* For the BSD string functions */ #endif void mbcopy(const char *source, char *dest, size_t len); #if !defined(solaris) && !defined(off64_t) && !defined(_OFF64_T) && !defined(__off64_t_defined) && !defined(SCO_Unixware_gcc) # if defined(bsd4_4) typedef off_t off64_t; # else typedef long long off64_t; # endif #endif #if defined(OSFV5) #include #endif extern long long page_size; extern int one; /* * Internal cache entrys. Each entry on the global * cache, pointed to by async_init(gc) will be of * this structure type. */ static const char version[] = "Libasync Version $Revision: 3.53 $"; struct cache_ent { #if defined(_LARGEFILE64_SOURCE) && defined(__CrayX1__) aiocb64_t myaiocb; /* For use in large file mode */ #elif defined(_LARGEFILE64_SOURCE) && !defined(__LP64__) struct aiocb64 myaiocb; /* For use in large file mode */ #else struct aiocb myaiocb; #endif long long fd; /* File descriptor */ long long size; /* Size of the transfer */ struct cache_ent *forward; /* link to next element on cache list */ struct cache_ent *back; /* link to previous element on the cache list */ long long direct; /* flag to indicate if the buffer should be */ /* de-allocated by library */ char *real_address; /* Real address to free */ volatile void *oldbuf; /* Used for firewall to prevent in flight */ /* accidents */ int oldfd; /* Used for firewall to prevent in flight */ /* accidents */ size_t oldsize; /* Used for firewall to prevent in flight */ /* accidents */ off64_t offset; }; /* * Head of the cache list */ struct cache { struct cache_ent *head; /* Head of cache list */ struct cache_ent *tail; /* tail of cache list */ struct cache_ent *inuse_head; /* head of in-use list */ long long count; /* How many elements on the cache list */ struct cache_ent *w_head; /* Head of cache list */ struct cache_ent *w_tail; /* tail of cache list */ long long w_count; /* How many elements on the write list */ }; long long max_depth; extern int errno; /* static struct cache_ent *alloc_cache(); static struct cache_ent *incache(); */ #ifdef HAVE_ANSIC_C void async_init(struct cache **,int, int); int async_suspend(struct cache_ent *); void end_async(struct cache *); void takeoff_cache(struct cache *, struct cache_ent *); void del_cache(struct cache *); void putoninuse(struct cache *,struct cache_ent *); void takeoffinuse(struct cache *); struct cache_ent * allocate_write_buffer( struct cache *, long long , long long ,long long, long long, long long, long long, char *, char *); void async_put_on_write_queue(struct cache *, struct cache_ent *); void async_write_finish(struct cache *); void async_wait_for_write(struct cache *); int async_read(struct cache *, long long , char *, off64_t, long long, long long, off64_t, long long); struct cache_ent * alloc_cache(struct cache *gc,long long fd,off64_t offset,long long size,long long op); struct cache_ent * incache(struct cache *, long long, off64_t, long long); int async_read_no_copy(struct cache *, long long, char **, off64_t, long long, long long, off64_t, long long); void async_release(struct cache *gc); size_t async_write(struct cache *,long long, char *, long long, off64_t, long long); size_t async_write_no_copy(struct cache *gc,long long fd,char *buffer,long long size,long long offset,long long depth,char *free_addr); #else void async_init(); void end_async(); int async_suspend(); int async_read(); void async_release(); struct cache_ent *allocate_write_buffer(); size_t async_write(); void async_wait_for_write(); void async_put_on_write_queue(); void async_write_finish(); struct cache_ent * alloc_cache(); #endif /* On Solaris _LP64 will be defined by if we're compiling * as a 64-bit binary. Make sure that __LP64__ gets defined in this case, * too -- it should be defined on the compiler command line, but let's * not rely on this. */ #if defined(_LP64) #if !defined(__LP64__) #define __LP64__ #endif #endif /***********************************************/ /* Initialization routine to setup the library */ /***********************************************/ #ifdef HAVE_ANSIC_C void async_init(struct cache **gc,int fd,int flag) #else void async_init(gc,fd,flag) struct cache **gc; int fd; int flag; #endif { #ifdef VXFS if(flag) ioctl(fd,VX_SETCACHE,VX_DIRECT); #endif if(*gc) { printf("Warning calling async_init two times ?\n"); return; } *gc=(struct cache *)malloc((size_t)sizeof(struct cache)); if(*gc == 0) { printf("Malloc failed\n"); exit(174); } bzero(*gc,sizeof(struct cache)); #if defined(__AIX__) || defined(SCO_Unixware_gcc) max_depth=500; #else max_depth=sysconf(_SC_AIO_MAX); if(max_depth < 0) max_depth = 500; #endif } /***********************************************/ /* Tear down routine to shutdown the library */ /***********************************************/ #ifdef HAVE_ANSIC_C void end_async(struct cache *mygc) #else void end_async(mygc) struct cache *mygc; #endif { del_cache(mygc); if(mygc && (mygc->w_head !=NULL)) async_write_finish(mygc); if(mygc != NULL) free((void *)mygc); mygc = NULL; } /***********************************************/ /* Wait for a request to finish */ /***********************************************/ #ifdef HAVE_ANSIC_C int async_suspend(struct cache_ent *ce) #else int async_suspend(ce) struct cache_ent *ce; #endif { #ifdef _LARGEFILE64_SOURCE #ifdef __LP64__ const struct aiocb * const cblist[1] = {&ce->myaiocb}; #else const struct aiocb64 * const cblist[1] = {&ce->myaiocb}; #endif #else const struct aiocb * const cblist[1] = {&ce->myaiocb}; #endif #ifdef _LARGEFILE64_SOURCE #ifdef __LP64__ return aio_suspend(cblist, 1, NULL); #else return aio_suspend64(cblist, 1, NULL); #endif #else return aio_suspend(cblist, 1, NULL); #endif } /************************************************************************* * This routine is a generic async reader assist funtion. It takes * the same calling parameters as read() but also extends the * interface to include: * stride ..... For the async reads, what is the distance, in size units, * to space the reads. Note: Stride of 0 indicates that * you do not want any read-ahead. * max ..... What is the maximum file offset for this operation. * depth ..... How much read-ahead do you want. * * The calls to this will guarentee to complete the read() operation * before returning to the caller. The completion may occur in two * ways. First the operation may be completed by calling aio_read() * and then waiting for it to complete. Second the operation may be * completed by copying the data from a cache of previously completed * async operations. * In the event the read to be satisfied is not in the cache then a * series of async operations will be scheduled and then the first * async read will be completed. In the event that the read() can be * satisfied from the cache then the data is copied back to the * user buffer and a series of async reads will be initiated. If a * read is issued and the cache contains data and the read can not * be satisfied from the cache, then the cache is discarded, and * a new cache is constructed. * Note: All operations are aio_read(). The series will be issued * as asyncs in the order requested. After all are in flight * then the code will wait for the manditory first read. *************************************************************************/ #ifdef HAVE_ANSIC_C int async_read(struct cache *gc, long long fd, char *ubuffer, off64_t offset, long long size, long long stride, off64_t max, long long depth) #else int async_read(gc, fd, ubuffer, offset, size, stride, max, depth) struct cache *gc; long long fd; char *ubuffer; off64_t offset; long long size; long long stride; off64_t max; long long depth; #endif { off64_t a_offset,r_offset; long long a_size; struct cache_ent *ce,*first_ce=0; long long i; ssize_t retval=0; ssize_t ret; long long start = 0; long long del_read=0; a_offset=offset; a_size = size; /* * Check to see if it can be completed from the cache */ if((ce=(struct cache_ent *)incache(gc,fd,offset,size))) { while((ret=aio_error(&ce->myaiocb))== EINPROGRESS) { async_suspend(ce); } if(ret) { printf("aio_error 1: ret %zd %d\n",ret,errno); } retval=aio_return(&ce->myaiocb); if(retval > 0) { mbcopy((char *)ce->myaiocb.aio_buf,(char *)ubuffer,(size_t)retval); } #if defined(DEBUG) if(retval < ce->myaiocb.aio_nbytes) { printf("aio_return error1: ret %zd %d\n",retval,errno); printf("aio_return error1: fd %d offset %lld buffer %p size %zd Opcode %d\n", ce->myaiocb.aio_fildes, (long long)ce->myaiocb.aio_offset, ce->myaiocb.aio_buf, ce->myaiocb.aio_nbytes, ce->myaiocb.aio_lio_opcode ); } #endif ce->direct=0; takeoff_cache(gc,ce); }else { /* * Clear the cache and issue the first request async() */ del_cache(gc); del_read++; first_ce=alloc_cache((struct cache *)gc,(long long)fd,(off64_t)offset,(long long)size,(long long)LIO_READ); again: ret=aio_read(&first_ce->myaiocb); if(ret!=0) { if(errno==EAGAIN) goto again; #if defined(DEBUG) else printf("error returned from aio_read(). Ret %zd errno %d\n",ret,errno); #endif } } if(stride==0) /* User does not want read-ahead */ goto out; if(a_offset<0) /* Before beginning of file */ goto out; if(a_offset+size>max) /* After end of file */ goto out; if(depth >=(max_depth-1)) depth=max_depth-1; if(depth==0) goto out; if(gc->count > 1) start=depth-1; for(i=start;i max) continue; if((ce=incache(gc,fd,r_offset,a_size))) continue; ce=alloc_cache((struct cache *)gc,(long long)fd,(off64_t)r_offset,(long long)a_size,(long long)LIO_READ); ret=aio_read(&ce->myaiocb); if(ret!=0) { takeoff_cache(gc,ce); break; } } out: if(del_read) /* Wait for the first read to complete */ { while((ret=aio_error(&first_ce->myaiocb))== EINPROGRESS) { async_suspend(first_ce); } if(ret) printf("aio_error 2: ret %zd %d\n",ret,errno); retval=aio_return(&first_ce->myaiocb); #if defined(DEBUG) if(retval < first_ce->myaiocb.aio_nbytes) { printf("aio_return error2: ret %zd %d\n",retval,errno); printf("aio_return error2: fd %d offset %lld buffer %p size %zd Opcode %d\n", first_ce->myaiocb.aio_fildes, (long long)first_ce->myaiocb.aio_offset, first_ce->myaiocb.aio_buf, first_ce->myaiocb.aio_nbytes, first_ce->myaiocb.aio_lio_opcode ); } #endif if(retval > 0) { mbcopy((char *)first_ce->myaiocb.aio_buf,(char *)ubuffer,(size_t)retval); } first_ce->direct=0; takeoff_cache(gc,first_ce); } return((int)retval); } /************************************************************************ * This routine allocates a cache_entry. It contains the * aiocb block as well as linkage for use in the cache mechanism. * The space allocated here will be released after the cache entry * has been consumed. The routine takeoff_cache() will be called * after the data has been copied to user buffer or when the * cache is purged. The routine takeoff_cache() will also release * all memory associated with this cache entry. ************************************************************************/ #ifdef HAVE_ANSIC_C struct cache_ent * alloc_cache(struct cache *gc,long long fd,off64_t offset,long long size,long long op) #else struct cache_ent * alloc_cache(gc,fd,offset,size,op) struct cache *gc; long long fd,size,op; off64_t offset; #endif { struct cache_ent *ce; intptr_t temp; ce=(struct cache_ent *)malloc((size_t)sizeof(struct cache_ent)); if(ce == (struct cache_ent *)0) { printf("Malloc failed\n"); exit(175); } bzero(ce,sizeof(struct cache_ent)); ce->myaiocb.aio_fildes=(int)fd; ce->myaiocb.aio_offset=(off64_t)offset; ce->real_address = malloc((size_t)(size+page_size)); if(ce->real_address == NULL) { printf("Malloc failure in alloc_cache\n"); exit(1); } /*printf("\nAllocate buffer2 %p Size %lld \n",ce->real_address,size+page_size);*/ temp = (intptr_t)ce->real_address; temp = (temp+(page_size-1)) & ~(page_size-1); ce->myaiocb.aio_buf=(volatile void *)temp; if(ce->myaiocb.aio_buf == NULL) { printf("Malloc failed\n"); exit(176); } /*bzero(ce->myaiocb.aio_buf,(size_t)size);*/ ce->myaiocb.aio_reqprio=0; ce->myaiocb.aio_nbytes=(size_t)size; ce->myaiocb.aio_sigevent.sigev_notify=SIGEV_NONE; ce->myaiocb.aio_lio_opcode=(int)op; ce->fd=(int)fd; ce->forward=0; ce->back=gc->tail; if(gc->tail) gc->tail->forward = ce; gc->tail= ce; if(!gc->head) gc->head=ce; gc->count++; /* printf("Added to global cache\n");*/ return(ce); } /************************************************************************ * This routine checks to see if the requested data is in the * cache. *************************************************************************/ #ifdef HAVE_ANSIC_C struct cache_ent * incache(struct cache *gc, long long fd, off64_t offset, long long size) #else struct cache_ent * incache(gc,fd,offset,size) struct cache *gc; long long fd,size; off64_t offset; #endif { struct cache_ent *move; if(gc->head==0) { return(0); } move=gc->head; while(move) { if((move->fd == fd) && (move->myaiocb.aio_offset==(off64_t)offset) && ((size_t)size==move->myaiocb.aio_nbytes)) { return(move); } move=move->forward; } return(0); } /************************************************************************ * This routine removes a specific cache entry from the cache, and * releases all memory associated witht the cache entry (if not direct). *************************************************************************/ void takeoff_cache(struct cache *gc, struct cache_ent *ce) { struct cache_ent *move; long long found; move=gc->head; if(move==ce) /* Head of list */ { gc->head=ce->forward; if(gc->head) gc->head->back=0; else gc->tail = 0; if(!ce->direct) { if(ce->real_address != NULL) free((void *)(ce->real_address)); ce->real_address = NULL; if(ce != NULL) free((void *)ce); ce = NULL; } gc->count--; return; } found=0; while(move) { if(move==ce) { if(move->forward) { move->forward->back=move->back; } if(move->back) { move->back->forward=move->forward; } found=1; break; } else { move=move->forward; } } if(gc->head == ce) gc->tail = ce; if(!found) printf("Internal Error in takeoff cache\n"); move=gc->head; if(!ce->direct) { if(ce->real_address != NULL) free((void *)(ce->real_address)); ce->real_address = NULL; if(ce != NULL) free((void *)ce); ce = NULL; } gc->count--; } /************************************************************************ * This routine is used to purge the entire cache. This is called when * the cache contains data but the incomming read was not able to * be satisfied from the cache. This indicates that the previous * async read-ahead was not correct and a new pattern is emerging. ************************************************************************/ #ifdef HAVE_ANSIC_C void del_cache(struct cache *gc) #else void del_cache(gc) struct cache *gc; #endif { struct cache_ent *ce; ssize_t ret; ce=gc->head; while(1) { ce=gc->head; if(ce==0) return; /*printf("Cancel I/O Offset: %lld\n",ce->myaiocb.aio_offset);*/ while((ret = aio_cancel(0,&ce->myaiocb))==AIO_NOTCANCELED) ; while((ret=aio_error(&ce->myaiocb))== EINPROGRESS) { async_suspend(ce); } ret = aio_return(&ce->myaiocb); if(ret < 0) printf("Aio return in del_cache failed. %ld %d\n",ret,errno); /*printf("Cancel: %ld\n",ret);*/ ce->direct=0; takeoff_cache(gc,ce); /* remove from cache */ } } /************************************************************************ * Like its sister async_read() this function performs async I/O for * all buffers but it differs in that it expects the caller to * request a pointer to the data to be returned instead of handing * the function a location to put the data. This will allow the * async I/O to be performed and does not require any bcopy to be * done to put the data back into the location specified by the caller. ************************************************************************/ #ifdef HAVE_ANSIC_C int async_read_no_copy(struct cache *gc, long long fd, char **ubuffer, off64_t offset, long long size, long long stride, off64_t max, long long depth) #else int async_read_no_copy(gc, fd, ubuffer, offset, size, stride, max, depth) struct cache *gc; long long fd; char **ubuffer; off64_t offset; long long size; long long stride; off64_t max; long long depth; #endif { off64_t a_offset,r_offset; long long a_size; struct cache_ent *ce,*first_ce=0; long long i; ssize_t retval=0; ssize_t ret; long long del_read=0; long long start=0; a_offset=offset; a_size = size; if((a_offset + size) >= max) { stride = 0LL; offset = a_offset = r_offset = 0LL; } if(stride < 0) stride = 0; /* * Check to see if it can be completed from the cache */ if((ce=(struct cache_ent *)incache(gc,fd,offset,size))) { while((ret=aio_error(&ce->myaiocb))== EINPROGRESS) { async_suspend(ce); ret = 0; } if(ret) { printf("aio_error 3: ret %zd %d\n",ret,errno); printf("It changed in flight\n"); } #if defined(DEBUG) printf("aio_error debug: fd %d offset %lld buffer %p size %zd Opcode %d\n", ce->myaiocb.aio_fildes, (long long)ce->myaiocb.aio_offset, ce->myaiocb.aio_buf, ce->myaiocb.aio_nbytes, ce->myaiocb.aio_lio_opcode ); #endif retval=aio_return(&ce->myaiocb); if(retval >= 0) { *ubuffer= (char *)ce->myaiocb.aio_buf; } if(ce->myaiocb.aio_buf == NULL) { printf("Stuffing a null in users buffer.\n"); exit(1); } else *ubuffer= (char *)ce->myaiocb.aio_buf; #if defined(DEBUG) /* Sometimes this returns a zero, on a perfectly good offset and size !!! Needs work !!!*/ if(retval < ce->myaiocb.aio_nbytes) { printf("aio_return error4: ret %zd %d\n",retval,errno); printf("aio_return error4: fd %d offset %lld buffer %p Nbytes %zd Opcode %d\n", ce->myaiocb.aio_fildes, (long long)ce->myaiocb.aio_offset, ce->myaiocb.aio_buf, ce->myaiocb.aio_nbytes, ce->myaiocb.aio_lio_opcode ); } #endif ce->direct=1; takeoff_cache(gc,ce); /* do not delete buffer*/ putoninuse(gc,ce); }else { /* * Clear the cache and issue the first request async() */ del_cache(gc); del_read++; /* printf("\nIssue first read Offset %lld\n",offset);*/ first_ce=alloc_cache(gc,fd,offset,size,(long long)LIO_READ); /* allocate buffer */ again2: first_ce->oldbuf=first_ce->myaiocb.aio_buf; first_ce->oldfd=first_ce->myaiocb.aio_fildes; first_ce->oldsize=first_ce->myaiocb.aio_nbytes; first_ce->offset =first_ce->myaiocb.aio_offset; ret=aio_read(&first_ce->myaiocb); if(ret!=0) { if(errno==EAGAIN) goto again2; #if defined(DEBUG) else printf("error returned from aio_read(). Ret %zd errno %d\n",ret,errno); #endif } } if(stride==0) /* User does not want read-ahead */ goto out; if(a_offset<0) /* Before beginning of file */ { a_offset = r_offset = 0LL; goto out; } if(a_offset+size >= max) /* After end of file */ { offset = a_offset = r_offset = 0LL; stride = 0; first_ce->myaiocb.aio_offset=(off64_t)offset; goto out; /*goto again2;*/ } if(depth >=(max_depth-1)) depth=max_depth-1; if(depth==0) { offset = a_offset = r_offset = 0LL; goto out; } /*printf("\n Depth %lld ",depth);*/ if(gc->count > 1) start=depth-1; here: for(i=start;i= max) { offset = a_offset = r_offset = 0LL; depth--; /* printf("Reduce depth %lld\n",depth);*/ if(depth < 1) /* reduce depth first to see if it can stay below eof */ depth = 1; if((depth == 1) && (stride > 0)) stride--; /* Reduce stride, as depth has been depleted */ if(stride < 0) stride = 0; goto here; } if((ce=incache(gc,fd,r_offset,a_size))) { continue; } /* printf("\nIra offset %lld CD %lld",r_offset,i);*/ ce=alloc_cache(gc,fd,r_offset,a_size,(long long)LIO_READ); ce->oldbuf=ce->myaiocb.aio_buf; ce->oldfd=ce->myaiocb.aio_fildes; ce->offset=ce->myaiocb.aio_offset; ce->oldsize=ce->myaiocb.aio_nbytes; ret=aio_read(&ce->myaiocb); if(ret!=0) { takeoff_cache(gc,ce); break; } } out: if(del_read) /* Wait for the first read to complete */ { while((ret=aio_error(&first_ce->myaiocb))== EINPROGRESS) { async_suspend(first_ce); ret = 0; } /*printf("Wait for first read to complete\n");*/ #if defined(DEBUG) if(ret) printf("aio_error 4: ret %zd %d\n",ret,errno); if(first_ce->oldbuf != first_ce->myaiocb.aio_buf || first_ce->oldfd != first_ce->myaiocb.aio_fildes || first_ce->oldsize != first_ce->myaiocb.aio_nbytes) printf("It changed in flight2\n"); #endif retval=aio_return(&first_ce->myaiocb); /* if(retval > 0) printf("First read complete\n"); */ #if defined(DEBUG) if(retval == 0) { printf("Aio_return came back with a zero \n"); } #endif #if defined(DEBUG) if(retval < first_ce->myaiocb.aio_nbytes) { printf("aio_return error5: ret %zd %d\n",retval,errno); printf("aio_return error5: fd %d offset %lld buffer %p size %zd Opcode %d\n", first_ce->myaiocb.aio_fildes, (long long)first_ce->myaiocb.aio_offset, first_ce->myaiocb.aio_buf, first_ce->myaiocb.aio_nbytes, first_ce->myaiocb.aio_lio_opcode ); } #endif if(retval >= 0) { *ubuffer= (char *)first_ce->myaiocb.aio_buf; } if(first_ce->myaiocb.aio_buf == NULL) { printf("Stuffing2 error\n"); exit(1); } else *ubuffer= (char *)first_ce->myaiocb.aio_buf; first_ce->direct=1; /* do not delete the buffer */ takeoff_cache(gc,first_ce); putoninuse(gc,first_ce); } /*printf(" RT ");*/ return((int)retval); } /************************************************************************ * The caller is now finished with the data that was provided so * the library is now free to return the memory to the pool for later * reuse. ************************************************************************/ #ifdef HAVE_ANSIC_C void async_release(struct cache *gc) #else void async_release(gc) struct cache *gc; #endif { takeoffinuse(gc); } /************************************************************************ * Put the buffer on the inuse list. When the user is finished with * the buffer it will call back into async_release and the items on the * inuse list will be deallocated. ************************************************************************/ #ifdef HAVE_ANSIC_C void putoninuse(struct cache *gc,struct cache_ent *entry) #else void putoninuse(gc,entry) struct cache *gc; struct cache_ent *entry; #endif { if(gc->inuse_head) entry->forward=gc->inuse_head; else entry->forward=0; gc->inuse_head=entry; } /************************************************************************ * This is called when the application is finished with the data that * was provided. The memory may now be returned to the pool. ************************************************************************/ #ifdef HAVE_ANSIC_C void takeoffinuse(struct cache *gc) #else void takeoffinuse(gc) struct cache *gc; #endif { struct cache_ent *ce; if(gc->inuse_head==0) printf("Takeoffinuse error\n"); ce=gc->inuse_head; gc->inuse_head=gc->inuse_head->forward; if(gc->inuse_head !=0) printf("Error in take off inuse\n"); if(ce->real_address != NULL) free((void*)(ce->real_address)); ce->real_address = NULL; if(ce != NULL) free(ce); ce = NULL; } /************************************************************************* * This routine is a generic async writer assist funtion. It takes * the same calling parameters as write() but also extends the * interface to include: * * offset ..... offset in the file. * depth ..... How much read-ahead do you want. * *************************************************************************/ #ifdef HAVE_ANSIC_C size_t async_write(struct cache *gc,long long fd,char *buffer,long long size,off64_t offset,long long depth) #else size_t async_write(gc,fd,buffer,size,offset,depth) struct cache *gc; long long fd,size; char *buffer; off64_t offset; long long depth; #endif { struct cache_ent *ce; size_t ret; ce=allocate_write_buffer(gc,fd,offset,size,(long long)LIO_WRITE,depth,0LL,(char *)0,(char *)0); ce->direct=0; /* not direct. Lib supplies buffer and must free it */ mbcopy((char *)buffer,(char *)(ce->myaiocb.aio_buf),(size_t)size); async_put_on_write_queue(gc,ce); /* printf("asw: fd %d offset %lld, size %zd\n",ce->myaiocb.aio_fildes, ce->myaiocb.aio_offset, ce->myaiocb.aio_nbytes); */ again: ret=aio_write(&ce->myaiocb); if(ret==-1) { if(errno==EAGAIN) { async_wait_for_write(gc); printf("Again 1\n"); goto again; } if(errno==0) { /* Compensate for bug in async library */ async_wait_for_write(gc); printf("Again 2\n"); goto again; } else { printf("Error in aio_write: ret %zd errno %d count %lld\n",ret,errno,gc->w_count); /* printf("aio_write_no_copy: fd %d buffer %x offset %lld size %zd\n", ce->myaiocb.aio_fildes, ce->myaiocb.aio_buf, ce->myaiocb.aio_offset, ce->myaiocb.aio_nbytes); */ exit(177); } } return((ssize_t)size); } /************************************************************************* * Allocate a write aiocb and write buffer of the size specified. Also * put some extra buffer padding so that VX_DIRECT can do its job when * needed. *************************************************************************/ #ifdef HAVE_ANSIC_C struct cache_ent * allocate_write_buffer( struct cache *gc, long long fd, long long offset, long long size,long long op, long long w_depth, long long direct, char *buffer, char *free_addr) #else struct cache_ent * allocate_write_buffer(gc,fd,offset,size,op,w_depth,direct,buffer,free_addr) struct cache *gc; long long fd,size,op; off64_t offset; long long w_depth; long long direct; char *buffer,*free_addr; #endif { struct cache_ent *ce; intptr_t temp; if(fd==0LL) { printf("Setting up write buffer insane\n"); exit(178); } if(gc->w_count > w_depth) async_wait_for_write(gc); ce=(struct cache_ent *)malloc((size_t)sizeof(struct cache_ent)); if(ce == (struct cache_ent *)0) { printf("Malloc failed 1\n"); exit(179); } bzero(ce,sizeof(struct cache_ent)); ce->myaiocb.aio_fildes=(int)fd; ce->myaiocb.aio_offset=(off_t)offset; if(!direct) { ce->real_address = malloc((size_t)(size+page_size)); if(ce->real_address == (void *)NULL) { printf("Malloc failure in alloc_write_buffer\n"); exit(1); } temp = (intptr_t)ce->real_address; temp = (temp+(page_size-1)) & ~(page_size-1); ce->myaiocb.aio_buf=(volatile void *)temp; } else { ce->myaiocb.aio_buf=(volatile void *)buffer; ce->real_address=(char *)free_addr; } if(ce->myaiocb.aio_buf == 0) { printf("Malloc failed 2\n"); exit(180); } ce->myaiocb.aio_reqprio=0; ce->myaiocb.aio_nbytes=(size_t)size; ce->myaiocb.aio_sigevent.sigev_notify=SIGEV_NONE; ce->myaiocb.aio_lio_opcode=(int)op; ce->fd=(int)fd; return(ce); } /************************************************************************* * Put it on the outbound queue. *************************************************************************/ #ifdef HAVE_ANSIC_C void async_put_on_write_queue(struct cache *gc,struct cache_ent *ce) #else void async_put_on_write_queue(gc,ce) struct cache *gc; struct cache_ent *ce; #endif { ce->forward=0; ce->back=gc->w_tail; if(gc->w_tail) gc->w_tail->forward = ce; gc->w_tail= ce; if(!gc->w_head) gc->w_head=ce; gc->w_count++; return; } /************************************************************************* * Cleanup all outstanding writes *************************************************************************/ #ifdef HAVE_ANSIC_C void async_write_finish(struct cache *gc) #else void async_write_finish(gc) struct cache *gc; #endif { while(gc->w_head) { async_wait_for_write(gc); } } /************************************************************************* * Wait for an I/O to finish *************************************************************************/ #ifdef HAVE_ANSIC_C void async_wait_for_write(struct cache *gc) #else void async_wait_for_write(gc) struct cache *gc; #endif { struct cache_ent *ce; size_t ret; int retval; if(gc->w_head==0) return; ce=gc->w_head; if(ce == NULL) return; gc->w_head=ce->forward; gc->w_count--; ce->forward=NULL; if(ce==gc->w_tail) gc->w_tail=0; /*printf("Wait for buffer %x offset %lld size %zd to finish\n", ce->myaiocb.aio_buf, ce->myaiocb.aio_offset, ce->myaiocb.aio_nbytes); printf("write count %lld \n",gc->w_count); */ while((ret=aio_error(&ce->myaiocb))== EINPROGRESS) { async_suspend(ce); } #if defined(DEBUG) if(ret) { printf("aio_error 5: ret %zd %d\n",ret,errno); printf("fd %d offset %lld size %zd\n", ce->myaiocb.aio_fildes, (long long)ce->myaiocb.aio_offset, ce->myaiocb.aio_nbytes); exit(181); } #endif retval=aio_return(&ce->myaiocb); #if defined(DEBUG) if(retval < 0) { printf("aio_return return error: %d\n",errno); } #endif if(!ce->direct) { if(ce->real_address != NULL) free((void *)(ce->real_address)); /* Causes crash. */ ce->real_address=NULL; if(ce != NULL) free((void *)ce); ce=NULL; } } /************************************************************************* * This routine is a generic async writer assist funtion. It takes * the same calling parameters as write() but also extends the * interface to include: * * offset ..... offset in the file. * depth ..... How much read-ahead do you want. * free_addr .. address of memory to free after write is completed. * *************************************************************************/ #ifdef HAVE_ANSIC_C size_t async_write_no_copy(struct cache *gc,long long fd,char *buffer,long long size,long long offset,long long depth,char *free_addr) #else size_t async_write_no_copy(gc,fd,buffer,size,offset,depth,free_addr) struct cache *gc; long long fd,size; char *buffer; long long offset; long long depth; char *free_addr; #endif { struct cache_ent *ce; size_t ret; long long direct = 1; ce=allocate_write_buffer(gc,fd,offset,size,(long long)LIO_WRITE,depth,direct,buffer,free_addr); ce->direct=0; /* have library de-allocate the buffer */ async_put_on_write_queue(gc,ce); /* printf("awnc: fd %d offset %lld, size %zd\n",ce->myaiocb.aio_fildes, ce->myaiocb.aio_offset, ce->myaiocb.aio_nbytes); */ again2: ret=aio_write(&ce->myaiocb); if(ret==-1) { if(errno==EAGAIN) { async_wait_for_write(gc); printf("Again2 1\n"); goto again2; } if(errno==0) { /* Compensate for bug in async library */ async_wait_for_write(gc); printf("Again2 2\n"); goto again2; } else { #if defined(DEBUG) printf("Error in aio_write: ret %zd errno %d\n",ret,errno); printf("aio_write_no_copy: fd %d buffer %p offset %lld size %zd\n", ce->myaiocb.aio_fildes, ce->myaiocb.aio_buf, (long long)ce->myaiocb.aio_offset, ce->myaiocb.aio_nbytes); exit(182); #endif } } else { return((ssize_t)size); } return((ssize_t)size); } void mbcopy(const char *source, char *dest, size_t len) { int i; for(i=0;i #endif #include #include #include #if defined(__AIX__) || defined(__FreeBSD__) || defined(__DragonFly__) #include #else #include #endif #if defined(OSV5) || defined(linux) || defined (__FreeBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__APPLE__) || defined(__DragonFly__) || defined(__NetBSD__) #include #endif #if defined(linux) || defined(__DragonFly__) || defined(IOZ_macosx) || defined(__NetBSD__) || defined(Windows) #include #include #endif #if (defined(solaris) && defined( __LP64__ )) || defined(__s390x__) || defined(__FreeBSD__) /* If we are building for 64-bit Solaris, all functions that return pointers * must be declared before they are used; otherwise the compiler will assume * that they return ints and the top 32 bits of the pointer will be lost, * causing segmentation faults. The following includes take care of this. * It should be safe to add these for all other OSs too, but we're only * doing it for Solaris now in case another OS turns out to be a special case. */ #include #include #include #include #include #endif /* Little Endian */ #define ENDIAN_1 1 /* Big Endian */ #define ENDIAN_2 2 /* Middle Endian */ #define ENDIAN_3 3 /* Middle Endian */ #define ENDIAN_4 4 int junk1, *junkp; #ifdef HAVE_ANSIC_C /************************************************************************/ /* Here is the API... Enjoy */ /************************************************************************/ /* Create worksheet */ int create_xls(char *); /* Args: Filename */ /* */ /* Close worksheet */ void close_xls(int); /* Args: file descriptor */ /* */ /* Put a 16 bit integer in worksheet */ void do_int(int,int,int,int); /* Args: file descriptor, */ /* value, */ /* row, */ /* column */ /* Put a double in 8 byte float */ void do_float(int,double,int,int); /* Args: file descriptor, */ /* value, */ /* row, */ /* column */ /* Put a string in worksheet */ void do_label(int,char *,int,int); /* Args: file descriptor, */ /* string, */ /* row, */ /* column */ /************************************************************************/ char libbif_version[] = "Libbif Version $Revision: 3.33 $"; #endif #define BOF 0x9 #define INTEGER 0x2 #define FLOAT 0x3 #define LABEL 0x4 #define EXCEL_VERS 0x2 #define WORKSHEET 0x10 struct bof_record{ /* Beginning of file */ char hi_opcode; char lo_opcode; char hi_length; char lo_length; char hi_version; /* Excel version */ char lo_version; char hi_filetype; char lo_filetype; }; struct int_record { char hi_opcode; /* Type 2 of record */ char lo_opcode; char hi_length; char lo_length; char hi_row; char lo_row; char hi_column; char lo_column; char rgbhi; char rgbmed; char rgblo; char hi_data; char lo_data; }; struct label_record { char hi_opcode; /* Type 4 of record */ char lo_opcode; char hi_length; char lo_length; char hi_row; char lo_row; char hi_column; char lo_column; char rgbhi; char rgbmed; char rgblo; char string_length; char str_array[256]; }; struct float_record { /* Type 3 record */ char hi_opcode; char lo_opcode; char hi_length; char lo_length; char hi_row; char lo_row; char hi_column; char lo_column; char rgbhi; char rgbmed; char rgblo; double data; }; #ifdef HAVE_ANSIC_C void close_xls(int); int create_xls(char *); void do_header(int); void do_int(int, int, int, int); void do_float(int, double, int, int); void do_label(int, char *, int, int ); void do_eof(int) ; int endian(void); #else void close_xls(); int create_xls(); void do_header(); void do_int(); void do_float(); void do_label(); void do_eof(); int endian(); #endif /* * Write the EOF and close the file */ #ifdef HAVE_ANSIC_C void close_xls(int fd) { #else void close_xls(fd) int fd; { #endif do_eof(fd); close(fd); } /* * Create xls worksheet. Create file and put the BOF record in it. */ #ifdef HAVE_ANSIC_C int create_xls(char *name) { #else create_xls(name) char *name; { #endif int fd; unlink(name); #ifdef Windows fd=open(name,O_BINARY|O_CREAT|O_RDWR,0666); #else fd=open(name,O_CREAT|O_RDWR,0666); #endif if(fd<0) { printf("Error opening file %s\n",name); exit(-1); } do_header(fd); return(fd); } #ifdef HAVE_ANSIC_C void do_header(int fd) /* Stick the BOF at the beginning of the file */ { #else void do_header(fd) int fd; { #endif struct bof_record bof; bof.hi_opcode=BOF; bof.lo_opcode = 0x0; bof.hi_length=0x4; bof.lo_length=0x0; bof.hi_version=EXCEL_VERS; bof.lo_version=0x0; bof.hi_filetype=WORKSHEET; bof.lo_filetype=0x0; junk1=write(fd,&bof,sizeof(struct bof_record)); } /* * Put an integer (16 bit) in the worksheet */ #ifdef HAVE_ANSIC_C void do_int(int fd,int val, int row, int column) { #else void do_int(fd,val,row,column) int fd,val,row,column; { #endif struct int_record intrec; short s_row,s_column; s_row=(short)row; s_column=(short)column; intrec.hi_opcode=INTEGER; intrec.lo_opcode=0x00; intrec.hi_length=0x09; intrec.lo_length=0x00; intrec.rgbhi=0x0; intrec.rgbmed=0x0; intrec.rgblo=0x0; intrec.hi_row=(char)s_row&0xff; intrec.lo_row=(char)(s_row>>8)&0xff; intrec.hi_column=(char)(s_column&0xff); intrec.lo_column=(char)(s_column>>8)&0xff; intrec.hi_data=(val & 0xff); intrec.lo_data=(val & 0xff00)>>8; junk1=write(fd,&intrec,13); } /* Note: This routine converts Big Endian to Little Endian * and writes the record out. */ /* * Put a double in the worksheet as 8 byte float in IEEE format. */ #ifdef HAVE_ANSIC_C void do_float(int fd, double value, int row, int column) { #else void do_float(fd, value, row, column) int fd; double value; int row,column; { #endif struct float_record floatrec; short s_row,s_column; unsigned char *sptr,*dptr; s_row=(short)row; s_column=(short)column; floatrec.hi_opcode=FLOAT; floatrec.lo_opcode=0x00; floatrec.hi_length=0xf; floatrec.lo_length=0x00; floatrec.rgbhi=0x0; floatrec.rgbmed=0x0; floatrec.rgblo=0x0; floatrec.hi_row=(char)(s_row&0xff); floatrec.lo_row=(char)((s_row>>8)&0xff); floatrec.hi_column=(char)(s_column&0xff); floatrec.lo_column=(char)((s_column>>8)&0xff); sptr =(unsigned char *) &value; dptr =(unsigned char *) &floatrec.data; if(endian()==ENDIAN_2) /* Big Endian */ { dptr[0]=sptr[7]; /* Convert to Little Endian */ dptr[1]=sptr[6]; dptr[2]=sptr[5]; dptr[3]=sptr[4]; dptr[4]=sptr[3]; dptr[5]=sptr[2]; dptr[6]=sptr[1]; dptr[7]=sptr[0]; } if(endian()==ENDIAN_3) /* Middle Endian */ { dptr[0]=sptr[4]; /* 16 bit swapped ARM */ dptr[1]=sptr[5]; dptr[2]=sptr[6]; dptr[3]=sptr[7]; dptr[4]=sptr[0]; dptr[5]=sptr[1]; dptr[6]=sptr[2]; dptr[7]=sptr[3]; } if(endian()==ENDIAN_1) /* Little Endian */ { dptr[0]=sptr[0]; /* Do not convert to Little Endian */ dptr[1]=sptr[1]; dptr[2]=sptr[2]; dptr[3]=sptr[3]; dptr[4]=sptr[4]; dptr[5]=sptr[5]; dptr[6]=sptr[6]; dptr[7]=sptr[7]; } if(endian()==-1) /* Unsupported architecture */ { dptr[0]=0; dptr[1]=0; dptr[2]=0; dptr[3]=0; dptr[4]=0; dptr[5]=0; dptr[6]=0; dptr[7]=0; printf("Excel output not supported on this architecture.\n"); } junk1=write(fd,&floatrec,11); /* Don't write floatrec. Padding problems */ junk1=write(fd,&floatrec.data,8); /* Write value seperately */ } /* * Put a string as a label in the worksheet. */ #ifdef HAVE_ANSIC_C void do_label(int fd, char *string, int row, int column) { #else void do_label(fd, string, row, column) int fd; char *string; int row,column; { #endif struct label_record labelrec; short s_row,s_column; int i; for(i=0;i<255;i++) labelrec.str_array[i]=0; s_row=(short)row; s_column=(short)column; i=strlen(string); labelrec.hi_opcode=LABEL; labelrec.lo_opcode=0x00; labelrec.hi_length=0x08; /* 264 total bytes */ labelrec.lo_length=0x01; labelrec.rgblo=0x0; labelrec.rgbmed=0x0; labelrec.rgbhi=0x0; labelrec.hi_row=(char)(s_row&0xff); labelrec.lo_row=(char)((s_row>>8)&0xff); labelrec.hi_column=(char)(s_column&0xff); labelrec.lo_column=(char)((s_column>>8)&0xff); labelrec.string_length=i; if(i > 255) /* If too long then terminate it early */ string[254]=0; i=strlen(string); strcpy(labelrec.str_array,string); junk1=write(fd,&labelrec,sizeof(struct label_record)); } /* * Write the EOF in the file */ #ifdef HAVE_ANSIC_C void do_eof(int fd) { #else void do_eof(fd) int fd; { #endif char buf[]={0x0a,0x00,0x00,0x00}; junk1=write(fd,buf,4); } /* * Routine to determine the Endian-ness of the system. This * is needed for Iozone to convert doubles (floats) into * Little-endian format. This is needed for Excel to be * able to interpret the file */ int endian(void) { long long foo = 0x0102030405060708LL; long foo1 = 0x012345678; unsigned char *c,c1,c2,c3,c4,c5,c6,c7,c8; c=(unsigned char *)&foo; c1=*c++; c2=*c++; c3=*c++; c4=*c++; c5=*c++; c6=*c++; c7=*c++; c8=*c; /*--------------------------------------------------------------*/ /* printf("%x %x %x %x %x %x %x %x\n",c1,c2,c3,c4,c5,c6,c7,c8); */ /*--------------------------------------------------------------*/ /* Little Endian format ? ( Intel ) */ if( (c1==0x08) && (c2==0x07) && (c3==0x06) && (c4==0x05) && (c5==0x04) && (c6==0x03) && (c7==0x02) && (c8==0x01) ) return(ENDIAN_1); /* Big Endian format ? ( Sparc, Risc... */ if( (c1==0x01) && (c2==0x02) && (c3==0x03) && (c4==0x04) && (c5==0x05) && (c6==0x06) && (c7==0x07) && (c8==0x08) ) return(ENDIAN_2); /* Middle Endian format ? ( ARM ... ) */ if( (c1==0x04) && (c2==0x03) && (c3==0x02) && (c4==0x01) && (c5==0x08) && (c6==0x07) && (c7==0x06) && (c8==0x05) ) return(ENDIAN_3); c=(unsigned char *)&foo1; c1=*c++; c2=*c++; c3=*c++; c4=*c++; /* Another middle endian format ? ( PDP-11 ... ) */ if( (c1==0x34) && (c2==0x12) && (c3==0x78) && (c4==0x56)) return(ENDIAN_4); return(-1); } iozone3_508/src/current/gnuplot.dem0000755000000000000000000000313415051766073016204 0ustar rootroot# # $Id: Plot of latency versus offset in a file # # Requires data file "wol.dat" from this directory, # so change current working directory to this directory before running. # set title "File system write latency " set autoscale x set xtics set xlabel "Offset in file (KB)" set ylabel "Latency in Microseconds" plot 'wol.dat' using 1:2 title "Latency Plot" with lines pause -1 "Hit return to continue" # # $Id: Plot of latency versus offset in a file # # Requires data file "rwol.dat" from this directory, # so change current working directory to this directory before running. # set title "File system re-write latency " set autoscale x set xtics set xlabel "Offset in file (KB)" set ylabel "Latency in Microseconds" plot 'rwol.dat' using 1:2 title "Latency Plot" with lines pause -1 "Hit return to continue" # # $Id: Plot of latency versus offset in a file # # Requires data file "rol.dat" from this directory, # so change current working directory to this directory before running. # set title "File system read latency " set autoscale x set xtics set xlabel "Offset in file (KB)" set ylabel "Latency in Microseconds" plot 'rol.dat' using 1:2 title "Latency Plot" with lines pause -1 "Hit return to continue" # # $Id: Plot of latency versus offset in a file # # Requires data file "rrol.dat" from this directory, # so change current working directory to this directory before running. # set title "File system re-read latency " set autoscale x set xtics set xlabel "Offset in file (KB)" set ylabel "Latency in Microseconds" plot 'rrol.dat' using 1:2 title "Latency Plot" with lines pause -1 "Hit return to continue" iozone3_508/src/current/gengnuplot.sh0000755000000000000000000000522315051766073016544 0ustar rootroot#!/bin/sh # # Copyright (c) 2001 Yves Rougy Yves@Rougy.net # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You 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 cp $1 iozone_gen_out file_name=iozone_gen_out #set -x write_gnuplot_file() { echo \#test : $query case $query in (write) awk '$1 ~ /^[0-9]+/ { print $1 " " $2 " " $3 }' < $file_name ;; (rewrite) awk '$1 ~ /^[0-9]+/ { print $1 " " $2 " " $4 }' < $file_name ;; (read) awk '$1 ~ /^[0-9]+/ { print $1 " " $2 " " $5 }' < $file_name ;; (reread) awk '$1 ~ /^[0-9]+/ { print $1 " " $2 " " $6 }' < $file_name ;; (randread) awk '$1 ~ /^[0-9]+/ { print $1 " " $2 " " $7 }' < $file_name ;; (randwrite) awk '$1 ~ /^[0-9]+/ { print $1 " " $2 " " $8 }' < $file_name ;; (bkwdread) awk '$1 ~ /^[0-9]+/ { print $1 " " $2 " " $9 }' < $file_name ;; (recrewrite) awk '$1 ~ /^[0-9]+/ { print $1 " " $2 " " $10 }' < $file_name ;; (strideread) awk '$1 ~ /^[0-9]+/ { print $1 " " $2 " " $11 }' < $file_name ;; (fwrite) awk '$1 ~ /^[0-9]+/ { print $1 " " $2 " " $12 }' < $file_name ;; (frewrite) awk '$1 ~ /^[0-9]+/ { print $1 " " $2 " " $13 }' < $file_name ;; (fread) awk '$1 ~ /^[0-9]+/ { print $1 " " $2 " " $14 }' < $file_name ;; (freread) awk '$1 ~ /^[0-9]+/ { print $1 " " $2 " " $15 }' < $file_name ;; (*) echo "Usage : gengnuplot.sh " >> /dev/stderr ; echo "filename is the output of iozone -a" >> /dev/stderr ; echo "test is one of write rewrite read reread randread randwrite bkwdread recrewrite strideread fwrite frewrite fread freread" >> /dev/stderr ;; esac } #filename=$1 filename=iozone_gen_out query=$2 if (! [ -e $query ] ) ; then mkdir $query; fi if ( [ $# -eq 2 ] ) ; then write_gnuplot_file > $query/`basename $file_name.gnuplot` else echo "Usage : gengnuplot.sh " 2>&1 echo "filename is the output of iozone -a" 2>&1 echo "test is one of write rewrite read reread randread randwrite bkwdread recrewrite strideread fwrite frewrite fread freread" 2>&1 fi iozone3_508/src/current/Generate_Graphs0000755000000000000000000000137715051766073017015 0ustar rootroot# # This script will create the Iozone graphs using # gnuplot. # # # # ------------------------------------------------ # YOU MUST PROVIDE A FILE NAME FOR IT TO PROCESS. # This filename is the name of the file where you # sent Iozone's output. # ------------------------------------------------ # Generate data base for all of the operation types. ./gengnuplot.sh $1 write ./gengnuplot.sh $1 rewrite ./gengnuplot.sh $1 read ./gengnuplot.sh $1 reread ./gengnuplot.sh $1 randread ./gengnuplot.sh $1 randwrite ./gengnuplot.sh $1 bkwdread ./gengnuplot.sh $1 recrewrite ./gengnuplot.sh $1 strideread ./gengnuplot.sh $1 fwrite ./gengnuplot.sh $1 frewrite ./gengnuplot.sh $1 fread ./gengnuplot.sh $1 freread # Produce graphs and postscript results. gnuplot gnu3d.dem iozone3_508/src/current/iozone_visualizer.pl0000755000000000000000000002074715051766073020153 0ustar rootroot#!/usr/bin/env perl use warnings; use strict; # arguments: one of more report files # # Christian Mautner , 2005-10-31 # Marc Schoechlin , 2007-12-02 # Pär Karlsson , 2012-07-24 # # This script is just a hack :-) # # This script is based loosely on the Generate_Graph set # of scripts that come with iozone, but is a complete re-write # # The main reason to write this was the need to compare the behaviour of # two or more different setups, for tuning filesystems or # comparing different pieces of hardware. # # This has been updated (2012) to take the new gnuplot 4 syntax into account, # and some general perl cleanups, despite its "hack" status. # It also requires some perl libraries to funktion, specifically # Readonly and List::MoreUtils which are not included in the standard # perl in most distributions. # # This script is in the public domain, too short and too trivial # to deserve a copyright. # # Simply run iozone like, for example, ./iozone -a -g 4G > config1.out (if your machine has 4GB) # # and then run perl report.pl config1.out # or get another report from another box into config2.out and run # perl report.pl config1.out config2.out # the look in the report_* directory for .png # # If you don't like png or the graphic size, search for "set terminal" in this file and put whatever gnuplot # terminal you want. Note I've also noticed that gnuplot switched the set terminal png syntax # a while back, you might need "set terminal png small size 900,700" use Carp; use English qw(-no_match_vars); use Getopt::Long; use List::MoreUtils qw(any); use Readonly; Readonly my $EMPTY => q{}; Readonly my $SPACE => q{ }; my $column; my %columns; my $datafile; my @datafiles; my $outdir; my $report; my $nooffset = 0; my @reports; my @split; my $size3d; my $size2d; # evaluate options GetOptions( '3d=s' => \$size3d, '2d=s' => \$size2d, 'nooffset' => \$nooffset ); if ( not defined $size3d ) { $size3d = '1280,960'; } if ( not defined $size2d ) { $size2d = '1024,768'; } my $xoffset = 'offset -7'; my $yoffset = 'offset -3'; if ( $nooffset == 1 ) { $xoffset = $EMPTY; $yoffset = $EMPTY; } print <<"_TEXT_"; iozone_visualizer.pl : this script is distributed as public domain Christian Mautner , 2005-10-31 Marc Schoechlin , 2007-12-02 Pär Karlsson , 2012-07-24 _TEXT_ @reports = @ARGV; if ( not @reports or any { m/^-/msx } @reports ) { print "usage: $PROGRAM_NAME --3d=x,y -2d=x,y [...]"; exit; } if ( any { m{/}msx } @reports ) { croak 'report files must be in current directory'; } print "Configured xtics-offset '$xoffset', configured ytics-offset '$yoffset' (disable with --nooffset)\n"; print 'Size 3d graphs : ' . $size3d . " (modify with '--3d=x,y')\n"; print 'Size 2d graphs : ' . $size2d . " (modify with '--2d=x,y')\n"; #KB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread %columns = ( 'KB' => 1, 'reclen' => 2, 'write' => 3, 'rewrite' => 4, 'read' => 5, 'reread' => 6, 'randread' => 7, 'randwrite' => 8, 'bkwdread' => 9, 'recrewrite' => 10, 'strideread' => 11, 'fwrite' => 12, 'frewrite' => 13, 'fread' => 14, 'freread' => 15, ); # # create output directory. the name is the concatenation # of all report file names (minus the file extension, plus # prefix report_) # $outdir = 'report_' . join q{_}, map { m/([^.]+)([.].*)?/msx && $1 } (@reports); print {*STDERR} "Output directory: $outdir "; if ( -d $outdir ) { print {*STDERR} '(removing old directory) '; system "rm -rf $outdir"; } mkdir $outdir or croak "cannot make directory $outdir"; print {*STDERR} "done.\nPreparing data files..."; for my $report (@reports) { open my $fhr, '<', $report or croak "cannot open $report for reading"; $report =~ m/^([^\.]+)/msx; $datafile = "$1.dat"; push @datafiles, $datafile; open my $fho3, '>', "$outdir/$datafile" or croak "cannot open $outdir/$datafile for writing"; open my $fho2, '>', "$outdir/2d-$datafile" or croak "cannot open $outdir/$datafile for writing"; my @sorted = sort { $columns{$a} <=> $columns{$b} } keys %columns; print {$fho3} '# ' . join ($SPACE, @sorted) . "\n"; print {$fho2} '# ' . join ($SPACE, @sorted) . "\n"; my $old_x = 0; while (<$fhr>) { my $line = $_; if ( not $line =~ m/^[\s\d]+$/msx ) { next; } @split = split(); if ( @split != 15 ) { next; } if ( $old_x != $split[0] ) { print {$fho3} "\n"; } $old_x = $split[0]; print {$fho3} $line; if ( $split[1] == 16384 or $split[0] == $split[1] ) { print {$fho2} $line; } } close $fhr or carp $ERRNO; close $fho3 or carp $ERRNO; close $fho2 or carp $ERRNO; } print {*STDERR} "done.\nGenerating graphs:"; open my $fhtml, '>', "$outdir/index.html" or carp "cannot open $outdir/index.html for writing"; print {$fhtml} <<'_HTML_'; IOZone Statistics

IOZone Statistics

\n"; # Generate 3D plots for my $column ( keys %columns ) { if ( $column =~ m/KB|reclen/msx ) { next; } print {*STDERR} " $column"; open my $fhg, '>', "$outdir/$column.do" or croak "cannot open $outdir/$column.do for writing"; print {$fhg} <<"_GNUPLOT_"; set title "Iozone performance: $column" set grid lt 2 lw 1 set surface set xtics $xoffset set ytics $yoffset set logscale x 2 set logscale y 2 set autoscale z set xlabel "File size in Kbytes" set ylabel "Record size in Kbytes" set zlabel "Kb/s" set style data lines set dgrid3d 80,80,3 set terminal png small size $size3d nocrop set output "$column.png" _GNUPLOT_ # original term above: print {$fhtml} <<"_HTML_"; _HTML_ print {$fhg} 'splot ' . join q{, }, map { qq{"$_" using 1:2:$columns{$column} title "$_"} } @datafiles; print {$fhg} "\n"; close $fhg or carp $ERRNO; open $fhg, '>', "$outdir/2d-$column.do" or croak "cannot open $outdir/$column.do for writing"; print {$fhg} <<"_GNUPLOT_"; set title "Iozone performance: $column" #set terminal png small picsize 450 350 set terminal png medium size $size2d nocrop set logscale x set xlabel "File size in Kbytes" set ylabel "Kbytes/sec" set output "2d-$column.png" _GNUPLOT_ print {$fhtml} <<"_HTML_"; _HTML_ print {$fhg} 'plot ' . join q{, }, map { qq{"2d-$_" using 1:$columns{$column} title "$_" with lines} } (@datafiles); print {$fhg} "\n"; close $fhg or carp $ERRNO; if ( system "cd $outdir && gnuplot $column.do && gnuplot 2d-$column.do" ) { print {*STDERR} '(failed) '; } else { print {*STDERR} '(ok) '; } } print {$fhtml} <<'_HTML_';
_HTML_ # Generate Menu print {$fhtml} <<'_HTML_'; ## Overview
    _HTML_ for my $column ( keys %columns ) { if ( $column =~ m/KB|reclen/msx ) { next; } print {$fhtml} '
  • ' . uc($column) . ' : ' . '3d\n" . '2d
  • \n"; } print {$fhtml} "

3d-$column

[top]
3d-$column

2d-$column

[top]
2d-$column
_HTML_ print {*STDERR} "done.\n"; iozone3_508/src/current/gnu3d.dem0000755000000000000000000000531215051766073015534 0ustar rootroot# # $Id: 3D plot of performance # # Processes files that were created by Generate_Graphs # and displays the results. Also, saves a postscript copy. # # Don Capps dirs = "write rewrite read reread randread randwrite bkwdread recrewrite strideread fwrite frewrite fread freread" titles = "Write ReWrite Read Reread Random_read Random_write Read_Backwards Record_rewrite Stride_read Fwrite Frewrite Fread Freread" file(n) = sprintf("%s/iozone_gen_out.gnuplot", word(dirs,n)) outfile(n) = sprintf("%s/%s.ps", word(dirs,n), word(dirs,n)) title(n) = word(titles,n) set title "Iozone performance" set grid lt 2 lw 1 set surface set parametric set xtics set ytics set logscale x 2 set logscale y 2 set xlabel "File size in 2^n KBytes" set ylabel "Record size in 2^n Kbytes" set zlabel "Kbytes/sec" set style data lines set dgrid3d 80,80,3 i = 1 set terminal x11 set output splot file(i) title title(i) pause -1 "Hit return to continue" set terminal postscript color set output outfile(i) replot i = 2 set terminal x11 set output replot pause -1 "Hit return to continue" set terminal postscript color set output outfile(i) replot i = 3 set terminal x11 set output replot pause -1 "Hit return to continue" set terminal postscript color set output outfile(i) replot i = 4 set terminal x11 set output replot pause -1 "Hit return to continue" set terminal postscript color set output outfile(i) replot i = 5 set terminal x11 set output replot pause -1 "Hit return to continue" set terminal postscript color set output outfile(i) replot i = 6 set terminal x11 set output replot pause -1 "Hit return to continue" set terminal postscript color set output outfile(i) replot i = 7 set terminal x11 set output replot pause -1 "Hit return to continue" set terminal postscript color set output outfile(i) replot i = 8 set terminal x11 set output replot pause -1 "Hit return to continue" set terminal postscript color set output outfile(i) replot i = 9 set terminal x11 set output replot pause -1 "Hit return to continue" set terminal postscript color set output outfile(i) replot i = 10 set terminal x11 set output replot pause -1 "Hit return to continue" set terminal postscript color set output outfile(i) replot i = 11 set terminal x11 set output replot pause -1 "Hit return to continue" set terminal postscript color set output outfile(i) replot i = 12 set terminal x11 set output replot pause -1 "Hit return to continue" set terminal postscript color set output outfile(i) replot i = 13 set terminal x11 set output replot pause -1 "Hit return to continue" set terminal postscript color set output outfile(i) replot iozone3_508/src/current/Gnuplot.txt0000755000000000000000000000135415051766073016220 0ustar rootrootThe script Generate_Graphs will create the 3D surface plots and display them. It will also produce postscript outputs for each test and leave them in their respective sub-directory. It processes the output from an Iozone run. The output from Iozone that it is expecting is the text output from the iozone default behavior. (iozone -a, or iozone -az) How to produce graphs: Generate_Graphs iozone.out The gen_graphs script will: 1. Create the databases for each type of operation and then processes them with Gnuplot. 2. It will display each result on the X11 screen, and also save a copy in postscript in the test sub-directory. Thanks to Yves Rougy for providing the nifty scripts to help with the plots. iozone3_508/src/current/gnuplotps.dem0000755000000000000000000000322515051766073016550 0ustar rootroot# # $Id: Plot of latency versus offset in a file # # Requires data file "wol.dat" from this directory, # so change current working directory to this directory before running. # set title "File system write latency " set terminal postscript set output "gnu_wol.ps" set autoscale x set xtics set xlabel "Offset in file (KB)" set ylabel "Latency in Microseconds" plot 'wol.dat' using 1:2 title "Latency Plot" with lines # # $Id: Plot of latency versus offset in a file # # Requires data file "rwol.dat" from this directory, # so change current working directory to this directory before running. # set title "File system re-write latency " set terminal postscript set output "gnu_rwol.ps" set autoscale x set xtics set xlabel "Offset in file (KB)" set ylabel "Latency in Microseconds" plot 'rwol.dat' using 1:2 title "Latency Plot" with lines # # $Id: Plot of latency versus offset in a file # # Requires data file "rol.dat" from this directory, # so change current working directory to this directory before running. # set title "File system read latency " set autoscale x set xtics set xlabel "Offset in file (KB)" set ylabel "Latency in Microseconds" set terminal postscript set output "gnu_rol.ps" plot 'rol.dat' using 1:2 title "Latency Plot" with lines # # $Id: Plot of latency versus offset in a file # # Requires data file "rrol.dat" from this directory, # so change current working directory to this directory before running. # set title "File system re-read latency " set terminal postscript set output "gnu_rrol.ps" set autoscale x set xtics set xlabel "Offset in file (KB)" set ylabel "Latency in Microseconds" plot 'rrol.dat' using 1:2 title "Latency Plot" with lines iozone3_508/src/current/read_telemetry0000755000000000000000000000112215051766073016750 0ustar rootroot# # # The format is: # # All fields are space delimited. # A # symbol in column 1 indicates a comment. # First field: Byte offset within the file. # Second field: Size in bytes of the I/O operation. # Third field: Number of milliseconds to delay before I/O operation. # # This is an example of sequential 64k reader with 2 milliseconds # before each read. # 0 65536 2 65536 65536 2 131072 65536 2 196608 65536 2 262144 65536 2 327680 65536 2 393216 65536 2 458752 65536 2 524288 65536 2 589824 65536 2 655360 65536 2 720896 65536 2 786432 65536 2 851968 65536 2 917504 65536 2 983040 65536 2 iozone3_508/src/current/write_telemetry0000755000000000000000000000112315051766073017170 0ustar rootroot# # # The format is: # # All fields are space delimited. # A # symbol in column 1 indicates a comment. # First field: Byte offset within the file. # Second field: Size in bytes of the I/O operation. # Third field: Number of milliseconds to delay before I/O operation. # # This is an example of sequential 64k writer with 2 milliseconds # before each write. # 0 65536 2 65536 65536 2 131072 65536 2 196608 65536 2 262144 65536 2 327680 65536 2 393216 65536 2 458752 65536 2 524288 65536 2 589824 65536 2 655360 65536 2 720896 65536 2 786432 65536 2 851968 65536 2 917504 65536 2 983040 65536 2 iozone3_508/src/current/client_list0000755000000000000000000000243315051766073016262 0ustar rootroot# # Lines that start with # in column 0 are comments. # # There are now two formats supported. # Format: 3 fields, space delimited. # Format: 4 fields, space delimited. # # Format: 3 fields, space delimited. # client_name working_dir_on_client path_to_iozone_on_client # Format: 4 fields, space delimited. # client_name working_dir_on_client path_to_iozone_on_client path_to_testfile # # Example: With two clients (format 3 fields) # # client1 /home/user/tmp /home/user/tmp/iozone # client2 /home/user/tmp /home/user/tmp/iozone # # # Example: With two copies of Iozone on each of the two clients # (format 3 fields) # # client1 /home/user/tmp /home/user/tmp/iozone # client1 /home/user/tmp /home/user/tmp/iozone # client2 /home/user/tmp /home/user/tmp/iozone # client2 /home/user/tmp /home/user/tmp/iozone # # Example: With two clients (format 4 fields) # client1 /home/user/tmp /home/user/tmp/iozone /tmp/foo1 # client2 /home/user/tmp /home/user/tmp/iozone /tmp/foo2 # # Example: With two copies of Iozone on each of the two clients # (format 4 fields) # client1 /home/user/tmp /home/user/tmp/iozone /tmp/foo1 # client1 /home/user/tmp /home/user/tmp/iozone /tmp/foo2 # client2 /home/user/tmp /home/user/tmp/iozone /tmp/foo3 # client2 /home/user/tmp /home/user/tmp/iozone /tmp/foo4 iozone3_508/src/current/spec.in0000555000000000000000000000562215051766073015311 0ustar rootrootSummary: Iozone Filesystem Benchmark Name: iozone Version: 3 Release: 508 License: Freeware Group: Applications/Engineering Source: %{name}%{version}_%{release}.tar Buildroot: /var/tmp/%{name}-buildroot %description IOzone is a filesystem benchmark tool. The benchmark generates and measures a variety of file operations. Iozone has been ported to many machines and runs under many operating systems. Iozone is useful for performing a broad filesystem analysis of a vendors computer platform. The benchmark tests file I/O performance for the following operations: Read, write, re-read, re-write, read backwards, read strided, fread, fwrite, random read, pread ,mmap, aio_read, aio_write. %global debug_package %{nil} ## ## PREP ## %prep ## ## SETUP and PATCH ## %setup -n iozone3_508/src/current ## ## BUILD ## ## ## BUILD ## %build %ifarch %{ix86} make linux %else %ifarch x86_64 make linux-AMD64 %else %ifarch ia64 make linux-ia64 %else %ifarch ppc make linux-powerpc %else %ifarch ppc64 make linux-powerpc64 %else %ifarch s390 make linux-S390 %else %ifarch s390x make linux-S390X %else %ifarch %(arm) make linux-arm %else echo "No idea how to build for your arch..." exit 1 %endif %endif %endif %endif %endif %endif %endif %endif ## ## INSTALL ## %install mkdir -p $RPM_BUILD_ROOT/opt/iozone/bin cp $RPM_BUILD_DIR/iozone3_508/src/current/iozone $RPM_BUILD_ROOT/opt/iozone/bin/ cp $RPM_BUILD_DIR/iozone3_508/src/current/fileop $RPM_BUILD_ROOT/opt/iozone/bin/ cp $RPM_BUILD_DIR/iozone3_508/src/current/pit_server $RPM_BUILD_ROOT/opt/iozone/bin/ cp $RPM_BUILD_DIR/iozone3_508/src/current/Generate_Graphs $RPM_BUILD_ROOT/opt/iozone/bin/ cp $RPM_BUILD_DIR/iozone3_508/src/current/gengnuplot.sh $RPM_BUILD_ROOT/opt/iozone/bin/ cp $RPM_BUILD_DIR/iozone3_508/src/current/gnu3d.dem $RPM_BUILD_ROOT/opt/iozone/bin/ mkdir -p $RPM_BUILD_ROOT/opt/iozone/docs cp $RPM_BUILD_DIR/iozone3_508/docs/IOzone_msword_98.pdf $RPM_BUILD_ROOT/opt/iozone/docs/ cp $RPM_BUILD_DIR/iozone3_508/docs/Run_rules.doc $RPM_BUILD_ROOT/opt/iozone/docs/ cp $RPM_BUILD_DIR/iozone3_508/docs/IOzone_msword_98.doc $RPM_BUILD_ROOT/opt/iozone/docs/ cp $RPM_BUILD_DIR/iozone3_508/docs/Iozone_ps.gz $RPM_BUILD_ROOT/opt/iozone/docs/ cp $RPM_BUILD_DIR/iozone3_508/src/current/Gnuplot.txt $RPM_BUILD_ROOT/opt/iozone/docs/ mkdir -p $RPM_BUILD_ROOT/opt/iozone/man/man1 cp $RPM_BUILD_DIR/iozone3_508/docs/iozone.1 $RPM_BUILD_ROOT/opt/iozone/man/man1/ ## ## FILES ## %files %attr(755,root,root) /opt/ ## ## CLEAN ## %clean rm -rf $RPM_BUILD_ROOT iozone3_508/docs/IOzone_msword_98.pdf0000755000000000000000000105233115051766073016321 0ustar rootroot%PDF-1.2 %Çì�¢ 5 0 obj <> stream xœí]Ûrݶ}×Wœ·žÓ‰h‚ H0oušÌ¸“&mª™¶“t2ºYR-Û²c9nþ¢ý™þ^Á °7€‚<:VÒi“‡0<$ˆËÞk¯}ôfS¢Ú”ý¿öâüåÑðÿ›·WGoŽt!û†üúüåæéÉÑ“oÚMUe½9y~$в¬d=ü,6B×…ݦ-EÑÔbsòòèÛí³Ý±(TÝ”Õöu©EWwÛŸvm¡;Õx7_íêB¨Z©íåN]%”ÞnvÇeÑ•�lõö‹]YÔ¢6÷·7;Y˜w„ÜÞº«ñ¥R«íæÁF7¦ýí?†6U¥ùÍwì�ãº(•éõöåNÈBšÑLߥ(ÛíSó¨Ö•ªYó¯Æ.ë¶Ùž»›×t“Z:u?¿¥ix1�XTæK;ùÝ0¥]Ñ54£Ó„js·ëĦѭùy˜PóÊÉß�„(Ìüytòëa‚e¡ZUm¿6#lÝOÛOýZÕIÓñ×ýuS•�éykfC×m?p÷€oUÔRÔfZM'«V 3[f-k)öëéðNS–ºewŸïtQ›�µìí[we¾#ª¢Õæã?ìŽÛ¢i[¡Íªôýh[ɾó½óÒ4n­ìƒgÓxô4ˆ±C¯\“çôúµ{tlȬ�7Š·ãÜ™î›U±ïÓ—¨K¯]CtEƒ,Æ7*7/U×Éí‰é‡®¦3ݰm_FS8<º`Hîn8¦~rü1õ2U‰¦e/H'F ½Ñ™^ÕªTÛ+Þ-;e¯`_§‰Jzß'Hw~¿CÙ†x váÃúEãâ­žz_p¢tïÚb‹¹ª7ìö{×XBJnà€ß™¾hêD�7l@¶Y’Rös¨A}ó·ðC°Í;(*m%fX£¦løôùÍ®RÆ ”¢õ¸6ÒÖ€:}›c„K €öÄ¥k¸.£°&a­¢·î€z³U÷ É5t,u 1è×—;c9Û²­úa�ÂÙGTì*§ ƒUb¯¸O{g‡s3I¡LèpJbÍG6<ÉæƒtŽ:[¿w?¿r¨$ëÊÊØÅŒäò@!9wªÓ½â‰®­–ë•dø†5RHéU @×·I�cãÆÞöt ]"³BÝ„ËpÄ››”{fRì,C“@Ã`+óãnxP6Nk5áW�.tåc†•ŽçÞCxxëéßuðŽP¨Y)eôa‚摨Îs!Âñ„ŒÙÞ7�Ž&µo‹�Ãê2õ‹0z=mpü_¬¯™‚ÇRÏD�^ÆXîI�Óh˜ )­�„™‡ßÂð‡‡ wÊé+É~e^ò(ë-°á ægŠ+&Mïû9Z6­”íÁUŽnføïb0ã(‰-1bt�ÈfvØ‘ÙE&kƒŒBXQaÍßÞCç’1¤€Ù”ª(+í¡C¦;º$5¾‰H€GqB>Õ«ä&ºÍäN�½‡“ªygïè3[¹çˆ Ü$#¹€Ô �ëe„ !õê½iU¨ŽÓDÂ{†[…Ö;íØž¡þÒ NsرœÖïGF�7“x¨%¾f3§%þ(§�…aš?P¯,ˆ@ srDUØôÿ‹.—€§¡Zˆ¤„,Þ=`5ij?@ïÓRúvÌÍjBò#ÁÅŒ/=ðÈÔ$¦Î 8,p¶uM�H«º=C%—Èd¾ÃXc¹X6†Ôóuè‰{t �µuÅ�.Ër¼•²2c—Jª„†Ã3 ¶¹“L)aÇQ£ˆ~°Qý8ÁFSTZYظ!¡Í¸9¤ŽÍbêXÇÍà±íóñü¼˜B¡O¾é\ðTª¢­ô´à›¾óeÝt*Œ&M_'Äù˜ãwªÐí84{qÃÖ µó–QçÓt…¬ëf¶ù=ÇAkÀâK; œô ךìzèjÓÕìQú&µN²ò ÐT?GùWFqÚ8áyô±ý 箿‡y _®Î ˆOvŸƒ—-{8JjÉMê$6q¹‰;e*wˆ³ô!ñ }ß`nho ¦ž Qô¬CK�±Sô’3vo¾U—™ãÁªÜÔ“}¡·÷Q(Ò×÷ð‹¨%´Èš"T wc—Do¿ßc&°Ä„ßáÝ‚ú÷þœBD™À±KêÆîp/æ?¿ò2nÇÈjüyw¬Š¦êS�HJs“е âXkhhÚÕÉ¥äf#aPÉKœûBÄÆñSK:ÑèXïülÖ|d?¡ ¢�]í‰;dsQ‰î˜T�1ìªPc –EßOM`.‚¦òÆE]¼ŽÆQq�ÃÍò‘ÊÁŸ³™3æBÒ³a⃅_ü‘¿€ôº¥¹�R6’¸"�©8›]/DŽÃ�CØF·EUwVL®Äšd×™æ<:e@ÂbMì’”2Tàñ-ÞÂ\ˆJó¢äKù€œôPC”D�!˜Ãò53vEø”{Ñ3Û�ß÷(Ñv­J4æ%ŠìkžTÌ%Ä ÷ ‹{ ~Ÿ·²ûyOBgÚÓ¥“T«ÇA³k¶Wæš]›MH@ÀZ31Aö;)4V ȃ)ƒÈÍW¾=�ój½l8?ù[œ2R¹6*ä0~ÈBI÷-åCÞ`åqP�ˆÇ-  쓉 ólÊ=e«ý€È”�Ÿµ�æ\H™ TÄ(ô †ôqšR¶×lc¬ƒÔš¿d‡6û|r€[#0µ�làpuV¯“Uò ¬&ãŠÂ|ý¾†çÃblŒ§cáƒ_b€Cʽ€IÆáºuôÑ-øâ ì^´o`2]YèÚÞ©G²¬*§ÎµŠààá‡ü¦5 ÕÁAÚù&®8tØßÓ‰ÿÉîÚµÁ9öø•Dôv¿ÒÅÐ t d1Q©Á+Þ l‹wOK¢ÛK •¬}Cµ0³GÊ,sàšZyŽþ±l� ‡5ŽÉ<#È×8¤å#Xº™ˆÀ*Ð%gŒYCƒµ8�±ŠOŽÈÔJ;dBµ�”ã¿rWa†_Bø©³Hßý¼}¤ïm×1>• .3…*ÙÜ@†BG¹ Ù|"$ÄzP°i¦()„Ÿ¥�À|BxÒɉ Š…B³¨Ó§ìÉ”ta–ØÊÙo½�#Ðo~×Ë|0VäŒ{\8<ù´]]‡ HèÓ~÷l6+x@÷Ìâ"�¬ó|ØÊ/GsD.RÜÆŠG‚‰{"¸(Çö Äê–¬et56A�z:~¨MéxŸ_Z9‹‹¡Âˆ¶RV ¸Wc7% 4ï4Šk;²Klù/ Ú®Sqr",³©…c6‰ªzwi3×ù&÷$‚;,ôiÍaÇ ?‘sìÓYŽˆä幦_9´ž'N4¥ gè‹áYÒƒ©,~p;2L> E"øèóš~7žH^e�å-Ót\c¥X=!ò¡ðv‹¥0±×BáÈÏ<_™[»˜†Ä|šð,›dóÖö™Ý\è+zÛ f|Å™ícì�«ˆá‰ÞšŽ¡ä²¨dC¥@ mþL‘pèã„°ÛÓ?HØ®`j#žÁ¦–J2[ÅX0(›ÂÌî±É„šÌ€�ÉÇGjٚ府¼-#�•uø3˜î: 1J÷l*ÁšBÚfÙùÝîY–ƒ¹”¹È;,©|x �Ü/ŸÇ!X½�ÅLד+â¢Òó`INà\ªsØí £@ aJ³ðS"µ3�V�—H�Ó‘ýœ uIïFPî.'¯ 7ÉËÇ2W*n=» š\•Æa+WÁ–A¨›wÐ6�|ä<+œ•KæŸmœ%ÓÒµzê J1¢s†Ts;AL�ày5ž['ÏÛgÛü„<)]&!­á„@潤»{ Ú8B2”k[N÷&ì®x&�-ávÔ¢~¢€ê׌ôŽZ‘Úï¹nv¯Z×:\qÀ-�Ô“© 4Aüj©üh1•‚ƒ|“$8¤?Péégß4PœJ˜Û*’@ËDUF\c7�¿nUŠïáùMšf?Þ3.ô/¢XgR†ï¶ÔÛ9¦¢Ç¦øÝ‘•y%ÅÛ«pûoܸîm(WSp…(Ù!ÄÀSùIójnù³ÔŽ?/ x�_gÜC ý,h‰°qÏ §åKB+³³9o÷Õ÷9Y€³MM%6à®C[试¢a‘Ÿ!ZÓ¶,{R>QÑ�>;(¢O¸I²¿wSìkFÞdï1Jx–Áf”c2˜³œü¤ö-['E/vÜÌUƒ‰¯ô¬po=‡Ü^+´¯Ã¢F˜-53tm$bî¾ôg�Ÿ¡%êÿS`’ƒ¿s`ðr—a?©WW…ÛfË-±×yÄšý!î,K«zÞ.Zoã½tl©0-ÙCj¾è›à[î]pƒ4Š|Y”JµƒÎ»GqJíÓi"µ­Ë2]�`óÿ ÖÛO�¬Ýu¡êNM¸;zUuÙ¹jB—-ùj×�¼RRlÿ4ö¶¬xYú3ù§Ó»ÏvÇM!ê®éO/‰JÏ9Ú¬�;1È›–cÑ�ÒýòUEUdjþ°;Öæå¸'ç/è@ŽD蚬Xj wö‡==B´�5%¿´MÕ‰P¤ ÒÉÂÁ´�qÊãOÈWôñLÙù)'01Qÿ™§ã@hBÊÁ�^\a‘rÒaMh 㽩`è‚cvã *Lº“…Žvy Õtå³(Ñ…øÈò"ëÿ/È£›�»À�ðÓ«‚üqíÄãYÑ5r9²Öª?ÒÇ¢áBU|¾+¦S°¾öE?'Žú!ËŽ‘YBU2‹�‘ÆÙ·åû9С!óGа%^¾MòНïä2bV£Ã8 3{À|ì+:m>¼B‚dÑ—Ÿ?÷åÎ4Ñö!ìCå`É-Tûº&¿»víS´1QÆþ(:ܸþÔÓ•q� Ï@¸E‚g38žVç¢ËUùP^ßcN7ãÔNÂyé[NåWœèùÐåy|'‰8Jk€ôiEéÓ\%*Oë¦*¹ý½:¸Þ,NúB¾ÁO0ˆ­Âü±«0DÍPEúö©´ÆÑ5ïlË~Pu'ÌÌ%kÕ—^¹ì›�mœ ÉžÁà�h¶º†�¥?GƒYŒæ•±He×|$¯àÁ„6cÜRµ8“CpR Ÿffi[C"ÆÒI%ÉÂ}†�…JÍ £qð¸&Ô©Z€½¹r|pU§̻1xcñZSX�Šä¦>p|oacg¥ÐIŒ´,�¢Û¦'_Ñ“ŸÙ“ß3c9úóU=xg¥,oYP¢¼šUã6Q �fŸ9‘9[®ÆÞbKý…Š'ØBÛ¼)ÈyGiöù ~=ŸRþƒ’=ˆÿ]€__¹{W�šŒa^;q_÷£”RêÊa."‡61ãcriÔB÷9­md(ÿ“{æ5)•UÃ¥uÕyàäÓA€Æ¸z#¼)8*ÄÕ±¿å%ùkÎAÑ‹~Å\à‚ùæ þR’‘)>õ–*‚Çù"W+3bWF…OûŠÉ¬É#Û`« úc½³Ç ÷Z5o\ò˜oRŸ3 }UO«jæ¯YÌò/èù+^V�(æ✦‚¼JÒÖš}·OâkÍ£‚ÛìA&9z²Ï*ülsO¿?þìã¿ë +¾b!ŸB\>ã0G›íÇ|d§Ïy�žKýË�f&¤áü—BÇÏ)¾Ï�÷¾®ÉM�!Ÿo|¢f:w¥Y�SvX'ò1±°VBðë»÷øÓŠ{å?på*ü��,“™ÁåÜ W½LÅt•.DçQªÚkU2q8þ ‚¹I«ûà}ø››é Ï%Û\få‚6‰Î&”Q@‘½½´Ðïg‰…âó“£?šÿ…^U*endstream endobj 6 0 obj 4650 endobj 18 0 obj <> stream xœÕ\Ûrݶ}×Wœ·žÓ‰hàÕ�é¸gÒ¤uõÒq:]bYµ-)²”Øþ‹¦�üJ¯I`o y|œ¤ö E .{¯½öçûMY¹)Í{qþæhø{swyôýQW(óo¸Á¯Ïßl>?9zôL¨M_ôÍæäÅ‘(ÊRŽOÅFȺèû~ÓŠ²��Øœ¼9ÚþwwòOÓ¤rMª¢®úÚ´9¹8ÚnÆç-õ¨ŠªìÅøøùör×¢n[µ½ÞWE×Ènûàîݺ{¯w¢¨e[‹í�»wïî»cYTJTÛ ÷ô»Ý±�EÛ•ÍöÍN–E[¶RǾHWßlwǪ¨Ûªj¶owU¡*¥ší)jŽÆ£¿£Ÿ6eÙµ¦SQU-z=1ûêµ›Nzb]ßE3÷l‡e½}±ë =IJÝ^¹ÇÔ8…žšì{µýf§;¨‹º¯ÍŒÿqò…¿½Ç¢-úºk7f®²vì·±£ôÞ¸%z6ûìò‚½íЦkZ±do§NùÖæg8³µv—öÚZêé¥û6›üí [·k~Ó}éŽî”ݾ‡Ã¢¥e»äM–MÑu••Ž›`_Mê“î�ã¡Ðúܲ%=Ö€TõÂûú Øš{Ð=Íi�”ºq¥©5lŽ|aùÒ“Ð †·ÂLúñ]´¡æÝ;;éí{·&¿^®ÒÂD7Úo¶”L-°?í@ÍâžîÆóŽؼÊXô…h;•x#}¢oõh++¼÷¬¨ê‡J«Ÿ¤&‡ÕwÄ»X/Íöb‰\%±16ç–­ç>»Âìe�÷Øwe„¿Êé°X@ncû‘ÛQDõJee$·$y±mŠº“‡DØg»ºèZóñ@;E»A¶Ê'Éb&´¿ç�E`ù„_¿xœæ¼u¦ý¥�zL�1,€eë�•FpÖž¿yØSBÂߥo…ëbúbdáí$¸Z^=1r9tÚu ¹l‹N»@”Ë?8¹„<Ž(æ%äiHí$Õö]ÀnŒhäDóK �ô” �žr¡ÿȉyRë¶ŠíSÚ>zþ�õŠä/!_4B3jÄç—èàŠI]ÌpÙ‹gLÙFÎ\µêc�Š€k0>ÎxqcÌÕâ¬7®7îŸiHâ:ýùåÑÉïŸoO¬/›–€[ˆ�¹�YfGæ…íþ«Ø‘Ó¨ôÇ+ðí—3ûenégšÈr›ñfù©c=¨Ík \d ®œ:Òî#¢ÁÆ�Í)œ65§�½Ý·EÓ¶"áo¦57|äÕÞ Ç óŽ ¤¬ÈSƾæ GƒE×Ä®$1‚‡/²�ÿewÜi@®Ý™ïp¥~Å!Ï’�Àén´d¦´Ò0T{ ­" A�¿‡sy‰ÔÀƒ"Û) ž¿0®»âq+�ªÊº,ÊR Hb÷†�ä¹7´\­†ï€�Å—|ô¬Aô<”Mß‚bØA½S›÷@mÀ¤uBN¡fy>oF��«3™@"þœ<š üäö0´lfI�[Xúñ÷�麭dåÅmì}$Áùêæô�#kn²ß¿š·ô4H_ðH³@šáò�~ý�,_YFZ¢™ë�QÔ;Œœ‡(ŠôñÞ ý_#kuK@4-¿¨U½ÂK¡$Ë5±ȦîìëA€»®û²ÍDÀ3åQEfV6¥ÊÏ#\ꦬb›U÷]ƒ™Á•ktï®ø7¹E°ÒÂ-Âræ…ÑÄì<üæ˜"_j(‰õ'‰¾G>lÊ®†Ì„€MùWœ@Æ!/>°s(�ž‘}Ç´è ¢Ž´49>‰ =Ù¾�ÍNÚ3rºº�­ˆ9Ýžj”€BKo&ßWZH|Ë<¢Jbç1Xúq;È "‚canÉýK¯¤ÏegàîAö¹oÐs˜’j¸È¼wL9ˆ��©�þç%ð|n9ÊGL¬ØŽÐH¡@ò¼Ô»Ÿ¸dÜ SI«¼�…/Ží¡ Jæù]1C…ÃÎ ¡õ˜Y3Áá`b…`�7ä¿Ë¤ãÑ3!(´¦%¥v`ò3ssÇW)ת+ w²`FìÜãéq0 4RJÊ:�·�áñ;Jû*˦**�êzS%6µ’…,‡ò¨çÛÏu¯EÕHcFjývßUFyšBŠ~ÀXQˆª•†sÚÇÓ‹Ò¬c©åN5J-›^¤&f=[}Í_¼s­éñ5zñ©Y:QVmźüàZÓ=j Gv;>VU¯÷EOVÕmß°WO]Goé‹°§qè])ÆÇúÍšµ¾¿S÷rjSu&§´êw•ñ×ÝcjM/Þ¹{ôâ5ê¾9ͬ†®u°oo>cóVpdGLƒJÖ½e—#]<ö3z|:§«Óìdßšh’æ®°ÞöC�' ì‘[Ë+šx4]Óè�í-ámhú²nùî² ¿Þ”†ÀØÎ5 è+•ê]ÂbZÂc¡¡›å+†¿¾4ý.`HC«^�ÕÐ'.ÿ6ÂxW tf >Ò„¶MÚ·¬°‰Wm Ç‘ÏÊCíÀŠÜy®¨*ʺ.�\ÒU¥6ߤǗ€o>¹Ö”3eûa€ø8N€²Ô¥($-´3ÔPZN´Í]“´á96k°–ÎПˆò)eã%VPä ój?@�3>‘­™’:È=¹GrÇLDq±Gƒ+Ý@dÕQÝ͈w²ÕÊíò58À�mP0A ÛÁ  Ûql7ŒmX ™†Åi“Þñ­@¤Ù%J6¬V(¡»úÒ9? :«iO‘¿Ë4`Y,ÂÏnR®ÒIsŠØWiö¨4�­°Î$ˆ>^2ïÓÍ jÉ‚tÏÂTÜdŠ·)*ý˜‡„Hë“û0�}еÊÔä·q ÎÒ‹zN¾¤ï ßÒNì‰y³¬ºJ2(;ñ‚ûqs�NüÜÎ9¬^ø…u— ˰Óvø«¾¨µßŠ‹´íKÏ‚¬»œÚó‚!öœ…—Ö—]¯�-¡ò™D!Π"JS©–¬QÌ2>¶ ¹`ÉNîOFb^,(8Z–ßž‰ÄœQT…½‹õÅ´èPí^?[r×v¶èxÚ©¤�æ—«@ØLÝ�j¾LfÝX@á…G¿:~œ«š>Óà™AO‹ÈØk+ó äh±â¯Ów'ò‹~¯jêïŒCb¢}Ð/ÅfYðÒ èѪ¢q%yÿI Hää£a´×(<Ì0 Åáã`Ù|qTij”èïaѪ#*(�•ªiˆÞèÛäñ�ë>[¡ø)ñº¢‰¸ÖÚì£ø-L/Q“Úõ.Ü•ˆñgóA=°J3´3×Ï{ Ùr¦bñÊzLá@¹Ÿš ãTX3ÆÚt½ÓWH˯]”ø�Õ6¹báUåò+Îþ%0{Ýï¢âTÁ7‹J¯èžÖà@^­ÃzjƒÛXî†ç᣹N OìÄKäL›Í ÔêU͉€WlëžO[Rˉ˜u•ƒð9õôWÕ€™þàÆ äì]îãSNë³’Ã?‡—}» ÄÁÞFåþý¡3‰ÁŇ�RÅ?;9›*Øt‡tJ‰ð'{œ*Q2MZ¦×A)Õèg Q„;û)Ðoi(‚*´$ö���GÒ qJÔ–0¬´[žŒÑƒõ”:q9®aU³,ðݼv7/Ý•e“€p$Aö¯ N€º^Ûóo§€¯¢Ò3¢“ ‰2t’>m\’»Õ4ù׬Î:>%‘ŠdYv¾æ].j½ŠSržj r®ó~?*Œf�Qa2> stream xœí]Ûvܶ}×Wè­3kE4I€·¾%mVoIWš(+MK¶UËŠãȉÝÏhûÁÉΰq!gF’›ØÏ� lœ}nøá´,ªú´ÿêO_�Lÿ?}óü䇓¾ãŸé þùé«ÓOÎOž|Ù�ÅОž?;©Š²¬ç«ÓªnŠaN»jüº:=u²9ÝžÿSÝQUæ–3¡®ª:qz¦.ëÔW—'ßü~[ªÏ}Õô›«í™úÜ ¢‘›gÛ3Q4]So®·UÑÔ]Smn·¢(õ‡}w®û~{&‹¾­{}GYo~ÜÊBH!Zõ^gu!E%Ùu»§Iɾ£/_˜væwl˲ïð¥üz(»`þ²uÿ?Îÿ|R�¯}zþÙ8b¿±‡¸*ª–ý†R�d9â7Ûº¨‡VnÞ°§{ƒ4¿ž”r|,P-‹¡¬;ÝÚoÍ�ÔCút¾=«dQ¶]£†¥+ª¦ë{è;ókhtØU㲩†Í«m­.-;{Ì/ÔuÑõå8�g]Ñv]ÕoÞšy“š ôVÔ�+j~¾P͓ؼ6‚ÂÛd�z¶í õoÙ1™b?SWØëßš‡>e�úò5½Uý(=Ve³ùy;µ:HþÔyNú¡ßõtüt­î) 9Tãóu“ÏÍ›°'^X/2JL]–E#-%·hÐ~žWs?T¼-zgz§ó‰w¹ ›ØýßlÏš¢­†¡ÁSu›î€ù:ðÚzüØ æ¿5kž.µD.{¢ÌôÜñ'Ù•½×¡V­Ç��4C¯ïn˱CuSŽ ‰t¿3µ1na³ü35Œ^ë{ðëwpéÓï.ˆ�1 õô 3>‹P®o€´¹½˜n¢—‹�ýj¦]iè‹Nš æ'x×¾C¢ ."�v–Ë-ÚŒ™D‡à”‰‡Y;×`* F$p›]ù2)[´Iäƒ,M {*ïß^¢²7†©=, Ée]›½¡UW5Z\.iÞæÞ4]ÕpyæßÚ%˦¨ÛÎB¨¸vqã-`FO™.yÁ>cU-Ȱè,3¤æ@iãóþ<Ô(iG}ÑömꇖAC‹Ã(tôþÇ÷ùÓÏOwR§4daôVŒŒxˆÍ@I½°þþÆsA�áÎú[›{íñŠü .Ýg� ݆„˜”ÚÇàÈ««¶è{!lÄY±Ó\RS×.ŽÀpÂÄN»SXzY´´`d¹%ì˜ûÕÁE= jŠfh:½ÿ´MY0ÕƒñX‚wFÛÊG“×P’â\blÁ_%ã›ú Ú[maEìÚ¼÷î®J—üvúÁ®}¥þý}|ïK ÞÓCkq†Ũ«AK@£™AºËk¸Ú™þâÕ´•Zûºâì}…©Ã‹thÉ�ÏÂxfA:@ÈÌÐÄB:~�çÞДÖá–yþ¤+÷}¡.Ѳ‚ÁÜÆ"1”…RŸ,,â* äd.š/妯Lé6´nWê6Z qÅdžŸÙÛ°GŸ¼=Ͷ>ŵ$8®w»s_õ䃽‰Ð�|íÏc8¤\šÏQa–*Yt Р—éÅvŸÀËíoØÒšWèY¶ÐfÎ~Žñïé‚~¿V'fx,Û:c�YÔ¸´-¬1Ö�¦‡ØH/âº|„çÝJ±õÁ˜æÂFÄi€J‰!Ð#ƒj:Ûvs¶ÝA–úQH ²vòGckÙᑞÀÔ¬ç®ðîOßæ£ŒeCÒÒð6¡SÅ-@h­SöfG¶x7ês”ÙhHr“¢nØ×dRä§…4ž ׃öS|9™‡;YKãìiÛ^I˜�Ÿ·£|Õ�¨Vú2DWÔ‚ WÜ—1M?Tâ1y0ôý!†¥OªÉ>Ð#z< ýü ³êkËAÝ•�µš¡üúПÔ}±in#Üõ¯aŒóZÓ0ÉwÌúãsø;¤~Çü-µj Y9—�e4ÿݘO¼ßžÖ4^À%ßbó�j¿VmGÖjoQ{'Óžã¼3á¿Z3§zl76Ó6lÝEw§Ú=­J¨ý¹é±õ@?Þ Ïæ“r“äùò�ýMQŠJ/tDÒ“|>¥,L„¯Æ^ !zÿ§ñÕPöù´]p9®�®j�Ý#®¤,—‰¹ÍáyÄEÜA��ÄšÅE)¤¯diüÈ‹!z5¤ec¡aC�SêdñØZm¹­ïï;EÊ×ssÏüë� p!D‹8ºeÜ_ޝ:!±¼Ýi!J%­z-myj´¾“5Þ5Å_„© |�ç5G�:f…¦BîhÆ™!ZG›)®l9Ó0¸ëëå¶iZ/ª.*9Äâ î�; Ÿ’½?%ü é�6þ)h¹ˆy—H>Â�yåÊ¢ÈÞòYù�w-ùÉõ3­ãpô”»”Z%ÜÃìþ’û¬$�³¯[kЍW•lÇb;z¨á‡OÕ�¾Ö°{J;ãd#�ÎÖ}k„OÚzˆ�†Ò*¼aöçáŽ-eÓ¨‰/ïƒêÝz8`„aØD=ëÃDñ]ÞÞ²o-Í8äpßéÃá=‹|]¿,Í�¡fã³ ¢˜êž�RrhñúBŽ0? �茅ŽÃYš:&ÂÏ‘¶zëŽã$¸�ŽÜ$,ñ~ ;¨÷˜ÝÃèÁ¤µ‚} ÛàßgD�&¼åxCÁó+-ù¡™dÑ•CK{DÜÖ2+JµÕô» Oupä�o;ëm€²l`áÀ>„7®,ÍŽ1ŠÜζÏÅv“½£}�œ+WqØ=AUÒgü¬«Á�Ñub„úÞ·1¦€�A z^¨è%Ç…’hÁr#uÌ^£e˜ru®6¢>¬6\hajÉ1Ïñ>†"D”—vi>1ÓŽzk%µPÖ±¬¶s7êÇÁ²&�y^xŽÞb’õ�ÈÕ=°¬}|¢ËŠë _Z�ø4ðÙžqƒ•´¡Hà­ Ûô‚ã›ÒÜ—d^fŒÉáAÃP4MEæî àÚù%í´« ,ê–E#Óú\Íëß…ÂÆ�–Ã"bâñ2ØŸýüŒÛ´õM±L Ý?é &O°ïf!„í’fQB¬HS¶xÞƒ µC�m"U•õªNH‡È‰¶óí1©À`öz¤á ÊØþÀP“Ÿœ}Ѹ÷;rUÖ¼0ǘJÖL6-�µ×ÖÂv(¹¹WWÊ\Ô©…bó ïxR¨Æ–gøú j¢$;•Ÿ³`bÒ` E3Ëœâd!•ê+£Õ¦þ‹nffº',¯ö¯Qdêd’t$­/ ¨pã+:Õ'¥Læ¿Ã㟲RèaÂý�E´Ý‘“�’Š^//ŒP Ü@Zuð%`–A¤ö”˜ÉnÌà¦{Ò^‡§ؘ^[P”'ü¶ È#ÎÊÑN3Ê ØÜ¬;èt2Δ¢y@¶g¡�Vƒ¨·ƒ9?8õÿŸ�=dx*3~?(ós1�Š•½<<c0pÝ‚µ~åbGáb$Ó|_@T dàÜ#¼è%Å+ÉîÚõ•²q°ˆ­r„‡¿EÃ6!Qz\ô ÜŸâ]1ÆÞšIg­xÌ5©(ŒÔ­pÑÖ·üÐ"yMÃ!ˆg‰âðÐ@u™Xl¹㺫Éä¥ s3qlâ6ß#²˜Ø�P·Œe-‹°Ú}®Õ�N´¾:°ŽË¥`ãL†ÃáÜ@5g2]û Î ËK°Ï†Hœ¹é* #/ 1=,�s.�jñühhV[’#t,_wzň9¨UфꆥârH›òé]¥ëËM,îøTn·Î?W?«/¥Rœh¡¿Û6eé’¶¦U=*ûc’6Ÿsݜ⃒¶µò8è?T‘+QZIìZÉòGî—BÊna݇tá‰NYA9õн¨CÆhŽ4¨†•hnÛ?š`y¦5a}�MiÚ6:‘ž~$Ò8ÔIÎÈlX sÆÅ¨±¶¨Ô�)Ã…óÆyñu ²+&|€z¶Ö�¢ûàX—ëùS“0ç ð莿{#Žv!°YN8œ¤)­ri¡Uóž£ÍÒðµŒØ`�+Z±YWJ~ÙCz¼Üê:ùl¦NÕ;Q$+^‚(º¢ÿéÐÉ=�‘ÛÊÉSqè]Ò8þ|ÒÈìœ Öx(·ßc£ŠäîÓ#é¢É·¾GßøÎ²7²Ò‚ ©çyþŒ�}Ê îlÊè’°AJn8¢Õ„’¹jD ¸k~­ÎJvy¯mºÍsÚ^ëT¦AȘó¯L#ªpkå½’Ù½c�ò k¾½ÛV‡øï$Ó!e~¶<ªWèë}t Þû–q"ÊCñ7å·ÎŒ³Ìª‘›Ð–EMc-g2}:~,e/ë Éïgš>1 $â Ãä'Zy‚µE›U"ÿûÑ’ÊøWÖöv¡Ñôl§}a`Èv­Ùu • ;ª”›ãàafÎ3IM©_: -⌲%SM…¾ñ©6+ªÐ¥S·–™=C Ý�Å-⢿ƒ�—‹O{sbŽ–ÛOž�Üéê¤TS£íjßz�,O˜à›öz0t$*ÂhTi¡FCbàÝßÅÂ{%û؇�Æcççãýj}HYc-:0 ©Z8ŽLµ M Ç-#©´«EØòÄ4ðšcËA@;]•tq%¤H™(¤[e+Ýu~,Í ;²ãæ!ŽõúÆýb Ô$¡Í÷|²=kÇ¢mËüö± US”]cÕ¼àCƆ9v\Ôºœ®.D%I™X� ãʇå?¸ß;åî°8ê� ¾üàª�ZL‘©nu/“º•ÚR´äi£¨Š¦GR茾ª]ýRISïÔÑÂq挽ƣ°È~†ÏtÁ<ÅJ@ cò8c‡g·£ôÝlÿCJ_"ÙÑ5UwÃji°ä„¥>ø5oÒ�>šøŠ¢¦rÙ,(¥÷\¬¾ú5Ø'oÀ6÷褷Ì|–<‰éÒ+¬÷&JèWÛ³^í’�’¦ßmõL»nØ_ÉÓƒ·(*f–t¼Y’§#´:?cÛŸÐ)°‚"$\ú[ƒh¹EŽcÒ;£·^ tbZij]E,Åa‹þ=,œ6sÜ7F•ƒVªŠ*°¿-âžqíüÎQ¥Ji¥´%=’¡"ÌÙ;¯N”¥Ñq‰¡U›0«Ö‹¸õ &»K–¡¾4oºuGá6ˆíá)?,Ž1‡›Åš \óÁ È�V cI±A—=ì¹v#\Û\ ½­þíÆðâ?Ðyº(_–>Ž3 ¤i0Ê‚†)z‚¼™9\3G,óÛ-�gà°­m}¬µ-2Ù#!̵~[kwé„.Õ�—/;49ù€øÃßgÕBÓë£;^1ì6t¤ÕUKñÑI7H£!TûÇ”lÇ4¥²Ý¤ªu… q™§'…�ÑHîKŸÅE²ªh3j6ƒ8„�Ÿ_ಌFˆ,#n órkõWn—m�|ñ£@uO.Ù¤‚Ì|*\¶Ï4M`¼µù{/̶ ð‚¡š]ã2cŸŽB®®à¥!´ %áÃt;à(òD�ìEG6…l|¶i–Ž Œùà0ñDEHëÆ5åãÉö+â†çˆÓ�0ÆŒ,À¹Ä? Vß‘I?ÇÞ—�‡‘äëÍî ÿ-˜&ø¤á}ڮP\fcßÿQA,[ ô¯†ù•ÙØàT«´Y�ªŽé’²³#%°‰œfµ&è?;ûÎY`‘£Ý“O‰•ËVç^Ù®Å�î>E(²DkÒ5Ý”ë^=8tzO8}ºµ)#:AÎ×2³a6~På @@„„xPüŽxXñP×€�hx—Lk„оê+gXÕ âˆY“cE�úQ¿˜¤²æ="`ç¨$kmï{Î, òÈ‹*޹5—ì9"t줂²Sö@Vo‘gðØKcìÀ6[÷•Àµáˆˆž_„µ^-ŒJ�÷á*£¢¹Ö&ãl7ŽÑd±ýšt#j4Vr™b…ÝÕ¾oÝèe�ÅCoëN�¬•äsms ô’„k{ �ÖùJ½4 â¹²ëEÊ$�G¿òü‚€‡‡Û�ÑÅúP*ëZikÓÍôT7Ì;ˆk’×Ñ×ä�ñl xñ°B*þ­ëQP?X‡,Ù‡‘‡r£Rg00ÿ RÅ! �š†s‡Â!¾…lÙéç}2C2]ð3ŇnŒŸfñhq(¶Î@—o0¨UO>–^x2_šJ ¨¦gF[a¨¶°´:tìt‘]¥ôSx¤_{(W}­Š¸(�>umÂ!VƒÃ7Âö¸šn |¹žS/IÁÂm[AS£Õö‹ŽwÈ9öWÛò3º¼„³Þ>{&s 銻h¾`Rtâ ÏuUí๩ªSäÕ¤£�‚Ò Aãgº1'OÂ; W^wЖµr`Ž–Ù‡Ö¸`ìz©Rbö¨/ 4°P"C(µd ;5;cÝõ–ËÝC%=E²±æ×VÅDÑ‹pj:aѪê;hgî·¶Ö÷Ÿ<ŒÙr¡jôe(6RQ�òÊ"ÞyÒŽÖª7¤àƒçQGÙîÇÓ‰§I� …ÏCº¬ý܃:pD‘Žýê:+´Õ·‰LÞB(sÃ`Ç€#+1ý9D¢/Ó‹õ}⦔ÂÂ%;¾^¡B‚ý‹@1¤»*Š}IÇEa¶­y—ù,3׊Ê\0×*ö½’—¿Êïn"­*£(Û^N›�× �ûµ@[jS{àm§¦†Kß4¾ábe…43H¥L[XX9_öU¸®¤U‹RzqÆU+˜±Ñ—²`²d²º�ùøGZrÙ�ÝK£Hpd5�ŒÍ dQF­Ô(¡Ezß2|¶q«1v\E€KÇZâ�u6¢展¦Ô¬+»ö§ç'Sÿuzöendstream endobj 23 0 obj 5447 endobj 26 0 obj <> stream xœí]Ùr·}çWð)áM™ãÙ¿))§JI¼Äæƒ]vÊ%Q¥h£Q¶òùâ` Ài3÷RÔB»Ê5æ�Á`€Æéåt¿çYQçã¿úâüùÑôÿǯ.Ž~=ê³jügú¿>~ü糣Ͽ뎇lh�ÏYž—ó�Åq¯þ: ÅqWŒ.ŽÏžýtòý®Êò¦éÚ“‡»Ó<ëš¡jjëúé®ËЦ¯»“ãÝi™ÕUQŸ”»Ó:ëÛ2oOrÿ²gwþ}§j»º¬OßîŠ!+º¾:y½+²¦ìšb|eQf]¯ÚùϮΪºªZÖν©Gmž÷ÝÉ‹©G]W�<o|µ;­²¦«kýIóC—æVþWÞ,õ…£¿=vžoÔ5»‘šÇMZj~g}¥�ʦFËa¨–ö§Ë35>u–·ƒê‰¾óÉÔh?ôÞ�M�ðž\˜‡ø_©zýñî_g;*ó&«ëN ÎÙ%&OÔÛó¬ v¼W±?¿¦ÇhÎi¨èõç4ûsSMW4ÕÉ3sƒð.j‹®è!«ýÀœÛ÷¾4-ñA1¯¿é1ß7`ª¨y6û¬ýG»^�|›wÑ;ob øì�rR uÖ ¥–=áu3�H›·�5£ó{Ú¼VÏ—M>ÑØÌi�çYY Ç§ÅøûÜØcƒ<÷½1å(E+QcBUY�Ñôeu|Œ>ŒîTÃ^4Y34'WfέA›¿¶b¿ ðƒ0�7…Æwù‰y)ÝÉߤ¾¿h³¾¯&©U˜Q7ÅpòÛ®Tíç}³ÌïŒIº%)~ëÁu^•ê’d–‰ßCŒi˜>ÝÊ‘n;u{ßj±=®í‰9í²¶ë ¢ì+¨c|@¦qÍ ø°:`²�Öïâ•Y=4ŒBS쵂ð]aN4ýLs‹�ý1”Bvjt?‹=æ.ÈñVö}áY´Ö’œE¦Ê†¦Ö"Ã;›iIÖ¨vZ EVÔ}5> –R]—ft,cÙìFl€°/†-WA ~9~ ÐZÏÕÔ¶}ÛüiI¹°Ð¯ÔúÕgþÂ/|(¬Ò˜=–h%èk=+Ôµ¶‘šÖØH1uÍ@åù®T=É»jkÞÏyІ¶±þúÂñ€…D·¾Eëü5|ë¹5R>PÐðüJÚæ œ“×`xÙÏøSá”ÑÏÀÃ×J ÅM=½#Ôó_ÒræÆÇ2ßM¹€eSU|åÓÏ˼·�ý ÉœOÐzœiLYbëG«|d¤�‘€,x ÔÓB1H×p¨Z¯¢u·P­õ­ÇtOs»`‹Å;«„�ýé'ã•u ³V ²eOvœsïz¯¯ŸÚj[a©¸_?v0€Y®…Š­5<«ÏÀX+]‹³õ³–BG¬0H`I�E!ç})õ‰Ö6,Dá4Aò¤TûªAæFÔEàÆ!4DfFÍ‹ˆ_Iƒ¾šDs~2_­yÕ³åËŠm Ã`^”w¦Sß6dYS¿£U‘®Š™ÕÿÛnzœ‰­rh]“}trg±j†É²´”Ë"ܼ�µ -1Z·¤gdl—]ä´À�m}†ö½Ü·ÐWÿ3âg-O,÷[K'µ�•]²¦Hݰ‰W„c�¾µžÝÔ“Ïnv\F±©4’Ð Ã÷©iý3¸\  Äy‚3¶DG¨#—$ïNLÂG,4ÐÏGcInŽ!„;xL"Ö(v pð«.Éq–%Ùy±ëa�}}ÍMû·}ý[(Z¾ ÊËr› »2B9í ÷cÃ*õËÙ¿ÇÿþñèóïŠÂÐ U“ Eg$õ¯ã§äu;Œ€9>]6Õ´ª�øó‹"�X×õøfÎd”}Vu�þ‚ù†CÖ(ô¯|[Ì6u°q‹œPÁ¥×P…çø),‚d¢³GÞ+•/D‰59Ô>”Ûl¡’nÒ�r„ðéÑâ�YQ1ÒÂ…•VRèH=¤w*îWš[‘µsMŽ£¤%ŒužÆþ øê~HÅ‹òk j„Gæås ÙÑËfŒ(²ÿ�Åû>¡›Þ –eµÍøwË0Úàe¥ø`®jGfOÊÜè?[“㳑/�‹AÞ5Šóa …íc<æ%M2£/ãP±Ì¤„¬zµ8ÙL™Õ¿b™JᶨóC´¦(ͱ‘L,A–·:ažeeuuöfjåüõµÝ‹(hàY¾ãÌ¢Éx‚+Õ5©CY±þAý9­^(£9Å¡#l¦E&ï3YΙƒµ° y•µ�Ñ;Šö³éPî•BËÒ%�· rž8ËÊÕÁ#–>o!dÿ< òœé ¦Èº`ù‹ËÀØÃ[wõÿÜ’$���’Ç�ÆE9tÒU×J+ �’ÅÆÙ3Y€ö_ÓsbêŽ;1Ú")N›½A"ÿ‚Ibû­Y—ÃBnС³'D.„ ´”ÀY?‡ŠñäcúDU.Á¸9b¬�¦ÊŠ¢Ü7¸ã3ö„3±„=?&bÉðüÈВŦH8Í«-ËæFfü¼›C«ûÒã1Ü…²Á=·É±‰ê&¾òéý1_‹7¥}ö"4Æ`¹ÛÛäAÈù|œøªªz”và’ts#©jPέe²ñrŒdÑîÀÁ‰b /F‚X|Š�ØÔ+ŸšÒÒ²5õJÐŽ{SVU—•jŠ? Ê*Ý÷¿é¦9+)3qVDÛhΪlP¡M” ?(i5y iåÄ(ªÖŸÐÑ:mÕ©ïZ�¨¾e­>eÖ !5oÕ–F¬ G¢¡…ïd—��rýnÉ2!Üã@ÖûÊ•ñŠ—‰¼ªlV¹ZŒ+lš^ÝV,¦ãrfóÔ’Ü»”™z剩ké³>·0¿ÑB¥”*»¤Xö·Ðòò)2Û*–4u€!³'óý¥È†ò ™ß:dă6Š˜µÏ7&ÜÓ¶R³Ñíày‹+ çü ™yÞ�bͲþnN·,Y²ZÒ–lWµNžjc€Ç—�–—È—U#_–ß_f=ôóe ¬n鲃Ðe34Ý获tÙ-]vK—ÉtÙ\÷iÓev�ë–.»1ºÌ‹eÏâòñsc‚o“èÍñQüÝ©…²?÷l1z|É[K»yŽ.¬:Dl|B“¾ËúÚ˜7×%gk�ºíÄ�íI ��U:»íã@®xÈâÛ!msÙâK|  -2,¼@$Ú!ÇP‰¹.C…µ…÷‡Ñdþ¡¿”Z�Z­ÙÌ¢Uú{çÀû?fîÏé‚ ¼ÇòÊ›¦õJÓÔšË Èóéøhx¾ä<¤÷¶6-âá5‡Êü·”§©ÿ§ˆª^¯¥D¦O·.Ϩ–šÐ$~OáË žr˜ˆiøˆ?”ŠFʶÊz3}Ó7I£÷¬ÐüIïí Õg_øÉ4ûÒ{]-èœCO5ÛÓT ±Ã—®- õœ¸cn¸£÷šËÓsµŽÊÃ[–n¨{óÁ]ô‹6ôó eoŒ~ì±›zÜÏ·7qò©+¹¥õ>ZoßõIìãI˜ ‚VÐßû²y(Æf–—d›‘èÆØ¼`¬ÿš¸¼dXƒãRyüMÚj­h_‘Í\^=nÎ0t—WU™77ÁTœÄc¿û±üüÀãQWgÉkGÏYGkbññUŠÂ½�7#¦ÀãéAMv]×ÀÙ»¦ñ¸i1Qz¬áʰ¿ec— Dh<Õ@9´ÛaÜÆ@\d'q׳œÓ‘/cžÄ¾.4"]Y„môAÀbã¾�@h¸fˆoÖYv£F±Óóº]']}Cg›®‹²ûÖ°p�Ÿ× Q§"CøÐ�/‹ÌêgP#n�XÜ 9‰c°Êa=‹Orw}dŠù}1ª-�#˜¼:8Õ 7fñMDdn¿Eí ìˆHÕ¦8`'˜=Ý–wpüà}³Q_vÈõ¡0rM.Ì•¸ƒ°�I~N€˜›}ï c¿„0 ¹ëRñ=‹Ú®ÀYòò«Ã¿>v&xÚ$Â"3t!²ÅêÖæ xzle8‹Y™ ƒa:Wp‡h½2€Iü øèlr®CLA†CŠ“Âõ�nÆD�x#¦èÃyö©¾z ì™-F¤¶f1¨ŸHíd9ݨp •.[,(@ë‹m皺ǎå!:4äq· ÆìÊ�ïÔñ¬‹+=~@ËÂ(p´ÕR‰—D±ãü°™±&�ŒMÞ^;Œpoô}uqÀZbh0 �Y´H%�hëôŒ:oütvÁòôWÍ=K��”è­ÑÜÙ(hC ; ÃµÑ|‰v@*Øð#оï (€"¢SOlÇ+bóNaëÉÍáâà'¦Ÿ¦5as†Ö±@·€"e‚¡"×ó÷ëDã"ˆémêÚ?½Ë+ZŒ®ËC mÐè9Ye>dMÑû¹"4ÓFú�By�>CÙ¦�I,�=�¯ŠÙlò\ÓƒJ«vír”n¯ÜË�6‡ya*!êb15-©u#Æ|j%fCe§–23Ä+T”aIæ$YU"—yºV>Þü . öª-Ê^šîx+‹]a4ÔväPFBØÒ ΰÀpi ´µ8 Æb}þxÃ+È\e‹´õYÓa[Q©ÂC¡FÉnM4[±„):bû|9Ç+·³Ûlº˜wâ£N/€IžçÜÊ÷†gúÅvËN []­t^@gÖå”­âQS­ Ïä¤ÝÊ µÜ ÖÇx“±c»JÀ›¿cb».ÖøéŸÏÀbó–o×­bED¨Ux1.*ósuʺTsY‹íÖ(r0,f·êáæÊ,®¸|!d8-…Xa¿Ï.õþô!ì}+±yŽô¥Ì§ª™³•nP$ê']ÀKñ^ëUFñ›l1CqÛ:üße]Y² xD¦,³¢¶ŽC ®È/§ŠÂiIùä�bTŽ-(^ñ)dY1ã¥@I¤Œø„¤gŒ ¨~Ká½ÇD:vBóšý ›d»›}QÒŒˆ<‘U‡K{!A <}L’�¬(¢¬·†“Œ­ªé=[p2`, Yï>ÐÓæjdÿ¸[Y!».FŠª”⸄oÓt|~YáãïÉZG\¸TÂ<”]´Ò¨÷ÒÏÇóëÞ˜ôýÙЮ´“«J2|R6«rÉÅ5i£’¾üŒR£ZûΜÖh^–ÆïS¨Q\HT›@WãÄyOÐ6Œ¸¡ì΃U2¥ŸæÒ5Sl�íªâ—ëq_]r|‡"Ò$4o™ù£}—s(‘wÍ3œWêºÞ­¨¨†·E +*ôJ¿ƒ’©iLc+õô WJ•�·œ¬Ë”Pl»O–ÌœÝPkM�6ñ¡Â%è«$xŒ3x´ãQE!Sp�ê¹Q¬"DJÂo)êÞÊ+�"¼ýR94YQ+ö£üvŽNÔ]¯[µù¬»&ÆýƒE&§»dHù¥óÖáâ ˜fÏ|Õ‘:}ןð>r¶+iÚ»|õ[ 21á ¸æPì'8ˆDÔAŽ¥½i‘àSr}”"0xEŒ´VDª]Ã�‚—`BÞŠ²+)±‚$Ð`'%"Ï{u8Ë»½Å­wÈ÷XEÓé3nO–C¾Çê¸ÖŠý|9>7ïmò»qL†‰1óÛ†ha2•cú>©½î~¡Ñ9ä LŸØIèJ˜÷¸·3Æa_ÖȸqÀ!z §ý—˜¢zÖyòÖÉË~ÉÒÆÉ¬Ðc–I].Þ7M°–R*"q ñ\j¤Šèƒuåc7sØñj§QÛa’׸6ä·J‘ ÌM´j­^½Aï.ú©È*ò&R¶ždˆ¤mŸYR#^~!èc„T”@(¸,wTíyvôOõïÿmðendstream endobj 27 0 obj 5381 endobj 30 0 obj <> stream xœå]IwݶÞëWèœ,úØö18{Óm“¸q+MSÇÇG–lI±-O’‡üŒ.ú{ À½ >$ß«6Ma‰éâŽß½€Þf©�‡Y÷¯~8yuÐÿÿỳƒ·Mšwÿô?ðç“W‡·�¾ü¡>lÓ¶:³Ðëš¶MÛŒS랆Ʋmó‘Wº/9û™g¥gpê“H�ö$Z%œÍ(I�ø@÷ºÇ¬h Ù ‡éê„=ŸOv²oÇy]?ÑJhúœÕU7•âÆÍ¿I&¦|Ð÷�6ðµ¡×Ô9õãîÆ„ pHÞê“”F"Òr*±ý¼„;rj:ˆï­~}E�ž›æ‘éãåóMŒíÍÀ%JË6“äL©fkÆ]�•z}nöxT3µ(»ÅÉ2Sê_tƒlóŽ¥­Á_©n«¦4äÔÓ%©¢k£¿ø¤–R-Õõ¨3ÇÎïwêñwG¿´ù‘¬‘‹÷vuä-®9Œs5ùoŒØ¦h‰G¤ë·†´Ö»Êê¨eÞûûd«Ì]]‹†}ʧÇ?~b¦úmOŸº�\w=&±³&ÝÿØ4lÒïЗìGc­ØÇ§†lO€ˆÏ]UÓ´‚­Šñîãž[dV*þ«�~„k…Rði¨c(‚¤Q}§Ü}Hj‡¯Ž˜ªógdZ7Y5ŠPUÛ¼ðxêK(InÕËÖ?6õ-`3nþ0Ãé�¡÷óg´@•2¾ó½YÁ¡Ç6]"­Ìû¯’žÄKFúÍ;’6à°Ù¿¥k)õ4‡‘²0�›âmVõ·nŠJ¯…¿]¯G5ã¶Ô’A“…n v ÛsŠäsùŒuéY�ûùÂßèµÓ¨iŒ¸Œë�ŠËKäaÒÞ ù 3äñè'hR\œ>ŒlO€3Æ^ÓúN ÔÎgìkǵÉÔѧ٫Ô�o|•~†ø°„õzû!Ô^ c?~HJ5“¶X2æ§êîYlyÐr7j=ÁŽùÓØnCŸ‚ö 4íŸA 2¥ÝJHˈ‰y�µ¶ ±d“Ù(ü¸`SÿAÞˆoòÜ3­+höÙFyt£vâ‹JhV„Óú•2 "h|6æPݶ«ÑCUiTç8“¨êd8Å|Ut§“±zž-×mnª3¿Ñ]ò‹ç7úËšF_Ó—óý²Þ"ªC_4Æ×/PàºnÌ�gKnÍõ¾´V¬=*2—¯�™¹dH�á}dP¨1 Ói ÀSåö‡@ËqŇap¤³(ì›Ï_Öpò·K™÷÷{ÿ·CèË—´]hC|¤˜*.qšÏw4`Ê#¼!êiS¾ÇÁÞ>Â^=àYŒSˆr­ Cö®…–¹°{Å.4Ù¦‹½äâ»5þ}Ò#ð¥XäXþ=Ù6i[•¥ˆÞcløéƒ'ÐÝEÐé‚ù�øC{� : K7ƒÈ ÆCŒ6˜ˆh¹Œ"ò¢ð é׈w�ò&(õñ¿w­õÜÿI,¾RÔ¤ŒNúÇ›þ3t\¢(Øü9­Rñ´g» êº3ÜyP~J¶eZI5Y¨l‡¼¬f?'¢MEݬҶëAWŸý¼5üÄo´d®¶°ÿEï€//�‚?t½ö¡²Ž=ÃIî·šßH z—jÃqÌÒÀ§ê¼›ÍÛ‡í¯úÀàžž®'ÑH7jp*v÷¸Óiê.Ú©w}o�u{ƒ%Ƙ'ÖCÁHT ¸ôœîʦlŒÇ&», –8lÕfeU¼'ˆ!/›•âï¶é@zdL¾`K�€2ïN€õ®®º$b—?¤ÿ)‘©l˪‹ÉúX®î‰:W9–|”<À£“×€¯X‘È9¬1ù ›ß�¿Áu¨®~™p„S‚Bmþ¤ËhZP‚2VžŒ©U‹`²TŒ ªv”RšÇNWM*«¬my…�LKÓÅPà¢S·½†ÀÞVÂÉq?8¡êæÑm ?§í#UÞ¦™Q‘ «²±ÂK0 êB•耡†q2!b1 „ŠOAÈáS^°xÁ_Íc—²ð·ƒ?¦Ø'6²J(˜› VOòŠæôa‚5 % ŒpMÇSÙæÚ©žpÃ~mà`iÉÔG¨²Ü+DJyãÈŸAÙýª û aø•kMÕ$ò²á&0Ke®¦ÕZ6Ð)æ2ëšwWNU—#Έí‘[Œî¢™–Y3ãDí ív·kºGRÇ&¤õ§» �£9yôÔbÔñ�z.Óšœï3ØŠ Æà`dn™Ž>aö.¬ØQÑDu=Òžžcî/¹_¡;�T¥ “e<ŒÙ¡'INAòHsä@ù´÷@–Ù ý<ÄhÒ¬nÌöý‡Åî@SdeÕZa– xBµ¸¶ yD[ ¯çA™7çŲþ¹e¶Î‚ÉBh:¢kBüË5"¨í�µO¸Êö”\¤’9uÄŸé^dzµ™TÖì…âElV°ÊÛÂå¬yÙé0kŒ˜Ò>D&õ  ¥Ç¹;SIïD¢°NU,ñIT–:þ ½åž +a@î'ô”It=Y%l4ة鋴Π‡dZw=Œƒ ]„*pý¨'݆”´.UŸ(jåÏÒUÔÀ¥Sn¢-pXWžšðk|üƒžÞ[I+Ýþkäú,/`ijk‘$Å�‚�—àw¤t·”¼A’þ1�åÝ# “BÌÓ¶´ý��ºlØ>0¢ÅáHP©Âš>Øù¶;·¼Xdšüh¦*‹|T3VÔ3�À2®ÆŽó"˜‹ÜXg³}G‹4 >Œ¸U¥7eÜï:¨ÒB)5bjKeAó«¡__.Z<¦6RTøí `͘àAZyùiÌÿ@‡ŸÍ¢F˜ñÒ©­·´ýVoi–¨zÐQ-ÏóF*“¢ ï™§[‰zçÝT.D3-sëdk…%ÝÑåŸå”ÄêùfpØìzBnŸæk1F2Ã<“7ÇœòˆzM%6ÓxýkVóèÓÔ>ÇEéÇ¢–-Š0íØ ôéS¢#&–¡� ¶I™eS¡(Ôƒ,ˆ�˜Åvñ<§Cæmž×Ê™ËwAòž‚´™£Ký‡ô(ëvlEÉ&UW…C«Z}Ö6öyxEQTT¸ùX xÎø¶ )Ã�"ýútÂhÃñ|äzŒÇ⨸£2‚:&nð* ì=;ÑM…2'¦ÎZ�°áàÁLº`Nì|-‹ÁŽÓêCÂ;%Áì#` ‡7™¿7MæG3€3†Ç²1©MiƒýÒuT+UâQ0·�¸Rý7¯En§ š¼Éê…ér E×Á3ä‰Ú¿lˆ`¿$gXQæË�…Ü!ŸÏq�ã€|­ËÝÎÆ›£n¸eÏÜrFt@Áº°Ÿ¹Æ"µëÍòŠ2è«ãózÜj[‘u+Ó}¸ í o�ˆ:‘‘ÐOߣüfÛ±�{Ûgu¥/(ØêÍàAQÆÚwJ$^y1£‚Æ�8ná^€‚rÙaT¶W<&‚ÚMóx�Åè):â5ã€"{|Èk¼Ü4§‡Íð’ÑÍ#ã¡Ñé|EÆ£­ÕÑoIö""‡Љ Ùªr†h"2ú›#F¹Håë^ÆMä²ï±%nºä‰Ò\f›YL­¸gîçÜ`v/˜ äìêæç,S²f©ÍæŒðÆï×ñã\´Ä˼ÒGusvÌ9BÌ•u¦7øäk Ë:r®”3þoÖ†fÑÃ×0˜APEÀ°GëŒ9º@%Z@‚¯P Õ’EËûæ¶ \~ 7<ñ¥ù”3uîrrï¶[ŒÖœ8ÁT­Ef“ÒcÅBø°œŸ¦Õ^ƒ=Ž'S^‚-Ú7€!,„3ÇÜ»ë¸6Öm§�Ðm¬X‡Tœ (ÖžáÏÐmŽ®~›ŸŽÜ®Æ_0J¡ø‘c–ZEâÍ@¡¸7°¼d²ÂjÞ'}\bšsuKÀpz -«|ÙÜü2’hI6RÔkÅÙÒ‰µPœa£¹Vêèå†Ïè­pòe7aÝ©|Ûö¸<ò¬]PÆŸ½�üê!µáÙVÜ{¯„r‹&|å`$’®$aý _°ñÕg¬³¡Xõ0[åvì<°uEñ‹©èV²�Äp1eäÂÔ±Äüw”¦¢Ë|¦^ô_²›q–%Þ\�3o®0£Ó·óï³›kôüÑd—Í—%K¨0) gTÂ^]è.Xû:\¤{°( R¢ã¿!ê÷k-*ª9�žz"ªÒnãË Ãýõõ1FÕG0 ãO ;�Ûü¸žª£®Ã¢æÆê»ÂeÊy¡zÙÁk¾³ú´É<í±uuô,Z=ý–ô84)áÀg¯=3ñfïüéµÑŠ^´ì»RÑåO)E8[ˆ„Ñ>Ẋgf jËÊ�Â'˜ò@þH)6�%”}Lm²ô!Þó�q6þÏ›Ê=žº ¹mL€Š¦uƒ´k8­ý,Ûª¾õ´ÈQ/¦æÑ<<Ñ>¼Q,©‡Š"— fɈ0ž(2,‰ëÐDLé¾}OÃÇœ· pËœé‚ë7 …»…×¼X}ÁûhèÒù+n3CY¦uÞìR„þˆÄ¨àIé‡bøCTÄÓ]Sgƒhбk^ôƒwÒì±gˆÏ ‹u!ªLž%¡‹ãÃPZœs �Þ]’¨À£.ܪÔ?8­7÷Ú\VžËÚ=ñgYãÈ!¿Xx NŸS¹®X"âjÄëø"ÇŠ±VÛ£²Z”J û´ãÒa;¹]ŽDܾI/¿#V]g¯ÜõÁ]?”b÷ŠSÉ3ŽÌê³G¸«³‰{lCZ—ìíòãë x�7‹uCNpîE_)K#ù>Ùc€˜žôá Ë*�|¿iùóNÄôÝÿ¯"v—+OcœbÃØSLA`P)�mï _É ¢e3SüwüË/ViÃÚ$ÏžŽæÅDÊùûYnAãTÞx�öP RµÞå÷a„<ºi¾í3¯ÙC‹³òEóSCÄn[¤¨/ztFèå$ñº™ˆà¾=?f=)Md µg¶"óUˆ®ÐY¢]æàâúœÛíJ`L ïôáÇV­T],Ï'å) ×ð]â0«5R­”Z]Ü;:ø^ýû_ \`Üendstream endobj 31 0 obj 4366 endobj 34 0 obj <> stream xœÅ\KwܶÞëWÌ9Yt&'CH‚‹.ÚÔi“¦q›*mr’žK–l%¶üˆäÄÙ÷|÷‚ø@€3’�,2‰÷}|÷»|½) QmÊþ_ûãüÅÉðÿ›7OO^ŸèBöÿ à¿Ï_lþxzòàëvÓ]³9½<EYVãC±U]t]·iEÿg±9}qòýöf'Šºjk±}¶k Q·­Ü^ìöeÑ6e©Ûíf·ªPµè¶/vºhtÓ öë1{õÕn¯ ÝTºoTJ µýy§ ©¤lØSÞæœýž ;ô ší5œÿýÄuMÃÑh…/ÁÏÜß"«þe×ÿUëNlßìö²¨[¥šíÕЩîôÔ½ÿ‹wEÓ­ºN²WçsÓ‚hZÚO¨G³©¢*Z]6æÍ}[4m+ôö�{•¦qNoÒ‘³¥½Üýçô‹“J”…¬#8§OŒ˜Psšð­ûñ¹é½,TgîÝNt…hµÜÓv–µ™rßû¾RMQµr³ýúú1Ì“Ó�ð á¤×È«P•^j›q"ûq¢ue6¹ï‰K{kVU•Ý8籿ÊH¼‘¢¡ 1uñ9­ÕÛwdÏ�ÄПÄäd’£Kê”7óÙìôúÆ?lÍÕEÝÕ¦]˜NÊ6vŒ¶G>áOÐ4¨'{&Íè‡5§Ù]¹õx²lO”d9jAB±¿"1!cÂþH#=EÒÎÿ88¹~&å´hzÌÝ ‚$ººhk+ïW\AESh-¹ÙÝ«•è©ù¢<÷«3mªˆ@? ÚüW¶Br�. -uÙŽ]é±�oÕªŠ\l!sí"î‡Dû"bÄ©W4Ò’„ôo^Щýê^½�ƒ^ݺKšÛ_BÜlÚnn€Ñ-Hø˜>Ú ÇP{ M 6Õo]#.�$|X`Ég=‡.g3 tkt<¾#äh¥LàI5# ýŠÍÄ-zœjÝŠšk<™#šÉgöh¤Ô–CþËèÌ&Ê<ÝEĊ̵eè�åz&™óíŒyæa&y\º¬t㦔ýªŽq˜—�}iжTuËí‹ß_QýM"t9Ç?½a“p½“EY×e5H»§Ê,°R½ö+¥æ³‘M!»¦²£1 6í�4§";í9ó{5}¯ Ó?Tµï‰mÎ\ëÇ!­Nâl’šÈ.[ëqÍ­‡ý£ÙdÓiÙVñîÔZýõ ×~�æbwRJ<èc_àNZÀ1ßßPް°*«¢ìê¹,™Ö·cp—Ú“ˆîÒ Ø€�s)›Žm*‚ùÐöÀÇÕ1°§ÀA!¶7¿ì†6�2SC;ñŸ5PÓŽ“�Ê .'õ¸eÞÉþ"éa.é¸1„9HÊH‰é½\ @ïyoU)²ñÀö®Kêüß»}mÌ¡9„Èö$BÇvI£éðØY¤ûžeØNã®* 'ý3™äЮåôê8á®RsJ ´ŒšK[çŸÐB8éˆ’Ú Ã4F ÞC�‘°‘ 6ÞÃÓ¦¾P‡Ö_gÿèºr|#òxG˜ü`qPnPÈcÝ=$x¢¬ÓÚôCÔ ñF¼Æl>qÂc`a hí|+2�aïñ~Qo“›ÅÏ·µî4§žÞä¢CÓ`ò‘øÈøÄóB¨axúÓ ©�d˜ƒ´�£ºeÄä/�¶8Ê%\6E£”Õû¸ë"ésù…¿±ö‘%­$ê ¾!\¹f‡šK<Â7#;½Äáß›œÎqï&®oªc¨„ÏU©j]ÉA%$èøû7Ù”2ƒîOé°{ÓZË '½Ôö;Q–å|�…Y³P]c†ÑF¤j�ù§ò ŒYÓI(#èvˆÕ¿„ 48Å.@Cab{šiŸC‹é8ÔÚo­ãD2Ñ& ŒVð@ÏæÑóÁ({H†–z…0H+¢:¾L; <Ÿ­I Á-ÃDVð!ZaÔ.‘dO‰c±e%J _”éN� äçä£É^§º$¤sûñHA˜Æ‹%‘Í U�9&@Æ�e J¡n ?ùÏm~ÞhPæCHÝxRÄÊÓЬ²!f2 œ^¨Œ£�M¦¨rÝšŸwº‚– ô@•B#�BJO�°~4ì�®Ä4ŽçãYŠØ¦wÉŸ‡tØ,Š!�ÈÎî×èòÔÒ‚C—ФP£ß"òî—A„¨ ñ²¥¬ÏyŠwÀS`Íš:¬bÍ9(ÏFÙî½yzŒy(Ï œË(€_öø»…ª‚FÍðÏ¡ˆ¤(m7ÁȾاSANvY�'x”ÀM•¹öüÀÿÖÿÝô¤TÅþ¿n{èoßMIw)¶_Ñ ?ÝÕ…n‡^aK„è§ù›6RJ]eV·å�ÅöÝYRËøs0�Hó|PÇ“)ƒó16OR0ñ”ØüϰfS6-ÎJ@9B‰Ž „zҮɶYòLÑ-=Œ\!eÇ{¡uÓ¤Ãì(••‰toæÖdo�ƒÌÕpõ�*Bò¼ÇòÎʼPê:¬îìû¼a¿¬ëüÕ�+j#5�¡ñƒ´8Íãù3+VGc#¬dd¦ÑÇ`¥g�«Ò=älwU¢èD]wáñ'r(cË«”ìSf�u! ÂJM-kÅ96�É´¥Ý_a«¹ö².œƒ>pÿ’â¬�Á­Ãsj®ŠÎ¬À¶w-Ž˜vî﻽6�+£�¨ù~ÆKÏ©ýcîeê€ ðÀ�ñ#o¨ cpŒçªz¢òØÎ ó^]6±�­‹²ÒJúáÝÑ œy"ÖMypdVRHç.ø*\è�·ðÀ—s…ÐY£Šìˆ³žD±vç?Ô.ˆâð<‚!;ª@µÓ‹i0Ká =y5,°—Î'[ÓcÌJSûhá :$[ˆL&Üì;)FïO‘Ò!\qÆÆ£É#Ô@òBS¦_¸êy‘³$:‚~¹è¢‹pƒ»¹·ôU>Vy3Q̦©ê²«èA\‚÷žÝj€N”QÌØì°Ÿ¤Â´�ËU“ÆÔ¼…›É¤w^…>·�1 ›Ã$ú±±3KŸîöM�öyÞ¸ÿ\SYŒüäRmèÙÖÛ¯] ÍÞü ùÙ¤ëH•{‡ú�áyÙëCéh¥Eüî9(÷ñ9Ê?ÛVˆ�&¿—ËÕ°«ÃwóŽÒVKa¹û³ßQ‡1*Üñ¦c-²€¤pÄÇ—ä¥×p#Ç9^�7�J¯»*¸©6©DÛFÀ($~‘ëMåiîL³SEøË oˆHú¿RØE­ÏÀ,rÊÉAñ *Äõ$©lV²”#»*Œ=>wiÜR9¸9-”ßLŽ~ƒ¼uY ÌÝ{AG˜H�E¯í„×BٞŠù¥owoê_–U5µoJ²ûûJ ãÓ� îI!x¢©U$rX†µ÷$�lš÷w©ð. S‚8¡�DyJ¬¶wv›#ÀÉå†haÔ‡QOŠ”®×ßëèÓ¯6èMÜFg´Òƒˆ1²Ïa�ì"Àhuzª¨E”ÿ'p‚O½k´6ß¾3ó6/«®›Õ]Óh#ý ŒL÷‹'\¥&Ì;Cž‚G=^wÏðmÿÚã®(OŒÇ®‘`jfƤъrbZû†ÓшgF?Ýj'…SéØmØSïnô˜„ûþ S¸0ñ…%®†‹A).xøóÔñ‘:1RIm!AMIgzì°‰¯ÒrêF�Ù%°–Kí˜>L±Ã„¹dŸÚÈ’ÔW;ð ŠM§|I ©£U7Þ :³è’ÝÛéOŒë¸¾K;ÆÂô0ÓOÕ$Ta‚”¶ƒ3b%~ÙI8_zìèsû5o¤ä4åàÊØúB“p¨(áU­é üUÁnX§Ö%Ü©.žÛ(B4Z®ÊxxဩÕbÿŸ±Ë=fîa=SØ·.@zàPÿ|™},¿·¡ÿx.,ô?Pzh¹¼ Ý> ‰î¤M0ž~ü=§–s/8ûõüÂ=}‘†ƒDBÖŽ¼¦bàÃD&V¸ÊÙH÷ÇXù6}‘ºKpÍÞøùkºî‰ø+„ g^"uŽß¿t(Ưæ}¹ÅË‚å=�_ÁÙ€tB-¸6’u» »¬0‚$h/nmyP¸lîÄ/ëð+ ­(p¸±G›Sse3[žl3ÔsÚªC‹[«:Ì¢G²ÐR…o.Šôó p�ûy×ßÓndç:ZäèòŒÇŠŒ{„f†%KñH�ü¬Æ[bÙÒõ≺¿k÷¡ÓËb}òbúŠ}ê¦tÿVs õ÷9øžÐÒ¿)fÞuõCÙÏ!Ác%V,+AÈûaÿf©�Q%.K-2MÎMô‰h®!¬îÅ*‹`È!õìÌi}�šJDXê›]pé\~C%ÉÚæ# u—¾$¸ ù$\ù{«|Ú„Z>í(÷œ*,uÿq¹Ì•p(.È�ßÎ^Wcs`‰L¨¹±´$î3ÐV"‡Gù°ìÚÜU—±SÿKÖ�_ØÐý“PÿP™ð�Õ. Íã#!ú¼×<§=]ÑHíi�ds~™Ùü‹| +¥+&wå㢗M¦§lDœ}æ r¨4‘i8ÒCX‘ Î×8üq¾Æž›˜–¨U5.±ÿ‰R±Ç_î i+Áåâš™ ÛdNÎÅ8™œÜ•lŠNÖa= 1ët™yž• /ål *;Ãß÷„ìV #XUiÌùµí1pòG÷+•IV…¨ìí€)“ÜH¦ªºµ÷ƒ(ŠžBJ8õ9æåÓZ‡—€±×Êk¼±ï¤}<—À��%þù›ãsW0¦#¹Œ]ë ùG?q:z:ݪTa1KòðÊäXÐS­:SãvE¤¡�B€ }ä¡_©=þ¸“Ð ñ†l¸?Ñ0NI—Ò6‰õQTšB‰Ù¥CK[ùI1Ù×%jâÓ� ô®ÍÎÈ,cú¾`»ëîox×´ÍyºBç�åZs›™è Ì¥[…X«ô)#¿éß„ó¨î ýmã»ýOP°ÛëêícTò‹‹üfËï,|$n¿±Aˆ\ Ë&ó¿c00„L§îÁWá§ò‘%Ac/HJXšŸ°gSµ@ÿMêe±É1SwÎtÞ_I_”y_$geD³ˆÙ ÀÏèúé|"tý·è㵬õò­3ŒÃá·®�Æ®ØîØÐßåJ’”˜I˜I1þ5˜Dóõ_ > 60e¬!¾A‘C²Ï,ù�~Z²œSèZ΀è~xzòóïÿ´¯Wendstream endobj 35 0 obj 3962 endobj 38 0 obj <> stream xœå\[sܶ~ׯØ?t9ÓE€àå5™¶Ó&uÒT�¶ãt:‰$ËNdY±¥´ÎÏè/.H.xˆÉ¥wj?xÍ œëw.À�»\HµËÛ¿îÇÅ›³îÿ»w×g?žÕB·º ü÷śݧçgŸ|]íÑ”»ó—gRä¹êoÊ]m¯6�ÜU²½,wçoÎö»ìü{û†”Ã+ÊY(¹;ا*{åòìÅþ�´0•Qû²œÿÁûD-*ÝÔ�ý‚}�'L7^ÿYŸ^o¿VKÃ_?Qª*7ÝTÝOá/Yn§SªØ¿Ï ¡ ­ËýUvh¯æy]ÙWJZû¯²CmG7F·þœi‘“«ýïûÕE¹ÿݧ÷¿e£¾Ï•(«JÖûY%¤©*½¿~]À °|’IaTåO…žüfO�Ò¨o³C!êRÕìÉï†kü›ôäÝðëC&!«Zï¿Éht;’,Dar³ÿW&•¨ê¦Ø¿îfW7õþÞÞÎEÑÈrÿj˜Ç.S&oE¥ç9cª4¥(ê8OsUº¿ýâ¸Õ4ú4Òv# s1xGKæ»VJk¦¡è«$[‚¾É>oY+�0�aoÿ Bcޤ”ؠ죒Mèüb/<€Y†ÐM3P�ºnä” t÷—1 É㎭•šƒ,íJòºÓ増‡ùêÁgAô¼äêÑG6Gjæµ±ôìEY©ØŽN¿hp¤o÷๤œ½ÌjaÿÍ9÷ß rò&Sö¥¼Rþº:ÌKFGÒ[zðŠü÷0]’到3.,1su༣z^6ÌTDä�>OÂKäzÙ‰ˆÊ­tåÊY‹‘�T¤9±Ñ†Ñ±B\Žì(›’iê2 ¸ÓpGÓ T<´´%)!)ÑÜ“¢P9’”¸–ð(zª.�;ö´ lTÏ#R“) x*_êLŸ$ƒ&Í´ê�Ʋ.+®ð|"|þÓæ„Hüz¸Ëô““ç:¦rÁ$˜‚„éÈmD#+Íø±Ä}€8û˜ÔEá¡°\h3|ÉÁ°ß寠qží‹�Œ,'–Y¹”¥¨k­™Å/ùßšÒ 8(–Ø‹Èï+,Õì§ÿ°]—À2²5�½ qÍ€SbÜ"¦y<ä¨B¡)Z¦Jï{kni«‹ÁšsÜ5L”æAK ]%”iæ zYŒý&ôRÈÜ.vm´RˆÆÅS»z£ËÒÓZWPîIÚæ[R²9L€�& MÐë„�Èø‘ÉB“D�Ù]ºH™†Æ-˜ãÜH`·ï¸Ô†N:®¡Nÿ0L€úwŽÝm6�àË<àÔƒiA‡qjñ׬ ríø>ßC»û&qÄãM™—Õ‰ÆÒö D¯Ü‘D>˜³€lF ¶¼ùÛöZo€ë¼¨ ½ôtçè¡ß{¦LÏ�Ø?���§¥.6¯©7N£&ÀiZ*„š„œ-Žs¸R¡_Ò‡ ˆ^â•n HD€#ª[ ¦äÍf ^Cs»ŒÆiè㛢V0•4 ý[ô±ˆR-Ž‘• È 8ÖíƒßbÓóJ®Ô#�ñ‚“žiÛ«7}µŸS­¤gݤðãËÏÚa§¾4‚mß¡ yã0Ÿžü~°6à.ŽL¦Sf‘xw0H:—™Šh²¶ßm§zàþ1LSÛ˜¿” '——ôÚjU�P•:%<û"3¢®|Ay–™<¢¶JUS{p´´F¯0U7´,—ÂÑ Ö„Ñš ²ùõù�éD*¸¤w~Ž, ùhh â9:=¤| ¯pôôå;ÂÖÂlá•€›ÊF‹ZN5È_ÁÅÜD-ófù³v¬ ŽýžFn»O�*¸#̃¸y‰Azk$».€-÷šŽáÜk:®W&pÂ­Š à:}w+׆³EŒ7·\ùÜú9"wª‹ìpì7f$ ~7�Œ0¤N&fx`5•·MÊY:ÜbÈlÃDcŸRª, ™ÆRj=Ê4ÖºÎ+éåP˜@bÚßLŠßFf(@ͫʵORNÁGr1¯�xÝ@-@@“Z@‰*¢DДÔ)J#Þ&|a,ÍÍÌ•DÂ-o�Žª&êÊS)á ˆyP²ÂdCN«ãÄM:óèú†DT)rÔÓ°!Ig¢ÈmôäçnãT¹CIÆŸ >—fˆ—/†—èuVqJ¥lcZE>ÅÍ„ÏÏ*ÂY #Á7.ŒÀ¬M"çÁ�g’Ù}FE ‹VœºBºl‘psw“»£ ï‚‘�Þ0ûÞxJ¤ãƒ9Á0q£ˆ<v²§ J›ôœaMól¥kÅ ðÜl ΆN9ÛT>%´s:ávÓ…I²&È0lˆ8þ3p,Q1ä/›™v�Úwx¥º ÜÛ¯†|¨ÑC>Û*¤U8lJ¨oÄ­9$p³Í�¯Ê\[¤éŸŠ6f{Õu &ÒòBæt É¥#ON Ü>²{ð4(¾ÀÇÃR;Ö°u‘× m®> 愺&:¨Ô¨«*¬ÀCÀ8#|qBÈ )¹�ç%Š"¬½…ZÂØ?©—³ÑËrÅÔ•PM±&Vn¿jì¤þ†ÊJ”Mî§w¥�Éͱ)ÂEÊ›u¬�Ú(C•F}O »¥¨”Ή‰7ŽíxštÔÜ~a¸oàm·o€¶Ý1sóÓ\¥Œ0!�rÜŒÆ6PÂ¬îÆ­/£¼»ã�úY>:Îõîösúùo, ‘…—sx=E?çµ"ù�ðîéRýü dŒü# íË»âfd– \òó=Öo„RCãý50�‘.¸!"¹3Ùåý‹°º·½YŒ¥0A¢JY„º‘'hÒÞ^� 78?RóÈÐß -ËŽ‘ë6\arDœ+…hë-qì�ŽF 7!2+7l|¹ÉÎ$2@SUµIL<”Í@ñDîuÑž©å%•%Øw5úöJ$,dZ)ÝM·nö"€Ò`+|Jç0º\CéYÙÃÿ?×a¹¹u�õ>à y �~èº^â*¹¦õyqk®ê&²Ïø´ˆ�ô_.ûÐ$5±ÈáÕ/êH˜®uÇ-PPêê¹ÅJÔ�Ѹ]Õ´1À¶œ;�);…�.9šë„$¡†˜Ó�lè3’ |˜‘Ym{ØkQG ¶í„Ky¯ðJ4N.„ éKZ;’Îo¢Í£�ƒgº‹Í1ëPóøŒÙ‡' \¨•ÐJÄúÑ 8J·ñ$d0½ ¬íƒ™®v‡Ç�1œb€t$õýQX $„~kU‡%tlÉ-3÷Gäo„r�/°¹Â�otةĭg=‚#t‡ Ü80%AÚ>ëì›Q~3,4‰ÒF%‡›î �¼cÂéçÍ9•ׯOL®ÐtÐé-k:Ö>6@r"F~”ÓŠ¾ B�ýD­ô¼C\^ìŸ1އ:H!›JÞ~ÙO³CigÔ”¸ES�~4 ~…”æ¤Ýþi1}lá£Û¿†©”Ug ¤³ñ³kw®­²”wF`ëôA&œfTÄw½ëRè¦T3ßĹ)V4&Ú¤j7,2ÅžÐç÷É]-HÞÁÂnäˆ0çÏ"Y4ç‰ -òBzžmtÀ.bîi�ã=.3 §Øò£Ö/t0"J+%Pãh8äâ#\rJŠ4*�bjbK~BX—õ‚ [vOlO%ŸdÓ<6=¿šn„QÕVÄñ;cŸÁÃl0¬Ë&"«m]õúíÔ¶©”õ‹‰ÂôFKœ9EâsêØ‹ƒ;t î/.Óž;íÁBÛ»?4^Ç>»ÒH Ô=F;µôÏv~²óúR'µéÞÇ£0–ÖÑU —yÑs£Kìs#A‡íùFÂ1ž‰—`—éÁL‹÷$AÒâ'5lÇÓ,Ãl\,;�<.õ1­1mÑ=Jé’Jä@E·ACƒ�H$Îà@D�ÄìðÞ³ž¥Â[­áÖ¼#žåǰéËÊ ÊÿÍùÙŸìßÿ‘Æ}]endstream endobj 39 0 obj 3409 endobj 42 0 obj <> stream xœí]ےܶ}߯˜*¿ÌTe`‚ H0oI¬¸rqK«\*ÎÃjµ«][Ú•Ö»–äÉ÷¼¡ÄArFrâβGœ!6úrút~»É„Ì7Yógøpþú¤ýûæîåÉÛ#TóO{�>½ùõéÉçO¤ÜÔ¢.7§—'RdYÞ}+7Rj!ëzSÉLT¥Üœ¾>ùÇv¿Û+¡+�oßî”È´Îòíf·ÏE¡d±ýl·/„)s¥ìÅžþÞŽ^Ñàv{ãf/¥ÈÍæô…î©äb·o“e¦ÚÞï¤Ðy¥e3´,D¡e½}½Ëí²*ßžÙ‹¹¨LVnßï*!uU©íµ½˜‰¢Vö‡F”¦¬äö¡ŸŽa×h²wÝ«Eé=üœ}¾u°¿pi¬ïw…P…R¥�Ç0÷Ù@üt×7[•î»qïÄÞþ»æ~cj¹}n¯–Â+ä;Y YÕ‹ÌÔÆ{Më›=ª›@^[Y]Z¹….5~UöË36,É•{Ë¥ÒÎ:ÓlÍèkŸ© 'uš“Û%6•UÄVOØD“$HR¡|ÛßÒ²3�!¡E^ïU¯J²d¼­z{}ý¾×¥k'ªKð‡`­­ÔÓa†¹ïÅÑØŽ5¡V&{fÊÍö»�ÖåØsi¥a­ÛðX)ש5™¢§Êý·�&WE^Liró¤ Z³)En�ho®³@”•}ŽªÜ‹'¥8¼Áë�õ‡e¦L7®õ”2�i)je†‘}Aî+QV•4L¦%Ù*ýx,Êö믚»¬{(ŠÜæðÛ•n!.Nzm.R#ìmf†HÛÑI3_ît–Í,T†Lß—¨}[Uªú¨ýr‰›�VÎÀ£íó¼Ú¾ccÄÅTüó玔¸�YíÛaþå$ú…ÝL—ÀÐ;ß_f‘0‡‚Òô‰1ZcÎ(0 g‰åÃrÐͱ`>¬ÌâX>òêiÕ»Ú®iVº5î\ùiûÅé·#gΑPUzFc�Õ×áJ벊¢[Ân@;¥kY)Nýf§m”hæ7gp±'�‘¦\¢Ø€µâs÷é•ûÄ¢0~:éÀ9Øa¹DÈé“&*Üí4Ðïh zá¡ÞDáÆ¸ßíÚ)×SœWàÓ5®¡³×lìÏÙxôÿ¶F¥d-…r>c±ØÛñ€2°3·ÁQך ›@"]c²êĪkS.W¯‘ Ɉ±¨Î°¨è±hµ gwÓðWN$�zO,ö?ûñó1¢Ì-øÜL¿”r§9øGB¥Ðûõ6Xù.íE€ä­Ã~·ËíÅÌhfn÷î‰WÀBC©7W)°yðŸÒ”¯X<y_•fô7P¸Ø¿ƒ¿x™J$ðjÁèAs eº 6eÒÃîãi»$YYâiFâ2i“¨¬²€­LÿÐ�ýàFôŒo83Nú¥çÔÛž…,tI×XÀ­“àÀ B‹áÑà¼ÀÎ{8Aˆ™™ h P¤÷xAZ9ªÂaŠ~¹µ{NÇÍ{gfÆ)÷íåÆÃMW˜‘è‘í{ŽA^è%ËÑ$r‚Ò(š]![å³›íå#.ùZ”mÜ#‹!äp5vûSЀ=þYoð¥( gð¿u2yÊ1„Wœr' ‹qí÷ʆ"èébÁ. a®�‹„‹ƒ8B"0£¥ynKÇ>ü�4<ßwù�è––e��‰J™¢Âë˜=ƒÇØ L‹pç!é©d <ú´»>þð}tüÁ˜â#؃ ÍD©“çUÜC“n…ù¿÷À‡ø(žPFç ìÔ�â“�¡¹/1âkpW«TeVVúχüí–¼}ó}‡–�=b§EÀ³Ó6¨#û>0Hå.B‰˜öË w½h×”C�Þ‹›ÙÈ}K÷"\Mëôf$eŸõA¹²üJ5¼ƒÒÂ1Q’$×B¹Œp$wGRYäYÍ9<¡Ûñºï?ë¾§ÛµÈrS¨�%Û4�©•›}!tQkŸwyFŽxžFù^j\[ðI·¹¥…f$¯´à—9–9ÞŸª8ö ˜õ$XÛC‹cø¡‘ÚVø5tà\¬k9èNêïZeÒ^j Xé’ÖðËÀË·PíÓW´„‘ ½d"%­;¨–©¢–½EæÀŠ�QÔ‚õÙDQËYqfòU­Lš”`b‚\R×Òv™þakJª³J[ kOìf(L©çCa«Ì,Þ“”š,ŽçOPÙJ+mP@n~š‰\Yí¨½0ü%Y!f·#)õ’ªÈ£æSV”6Ã|©‹‹±ÛY¦#ë<ªÖŽô‘н&â ˜nyìiÈëÌú'�dË9^4¶*]Fd :sÑx¢"£ë²48�ÅÙ!ËéHrˆˆ¼á!j1z{Qµ 5â1щø�3¼†0Q¢‡>w½ˆÖn^£Œ`\BÔ-)‡ãT-^ôJÒ3z…c 3Ñö—¥…˜Ñä"…˜…Ù¥°�r‡œ‚‰$V¨v½g4ö9s=ãhÓlLĤx§Y×R–5Ì`hý�bS¥šØè¦«+©Uªh)½L3‰娥åHuUE/Í•�ÙÏ~í¸™Ï ùÖt @òÆw™£Âê.ÅéQ„ëÙkØíŠk%a¥þDÙ%ªCòÛ‰¬ù戊(7þ„7Õèý#éÂõŽæU˜OÌ_�'@ÃÞˆP×P¤¨ð³¤àûw$ ¬ëºO†[0H;Àñ¨ÜP+T¿ Üd±wÖòí>�ææï×m3ž¸Ê‹!+;®¶qµºo’˜êg˜Ç×ÁŽ~@N†=©Ó“óº]¤F6]ò><â_÷$™±É¡«ZBƒÇÕ¥®-EâxrDÛ„‚Nw�TY5®ô�Tù{@}K£ŠêãSßJÔ:«åÏœú(­4_íÜcP…KÉê#TÃò\ªÐ �I7Î߀œæÍ§SÅ#‘åFz=é¸$zT²Ü­@LS§ÙòNž¶�4W.å¸<ü¿½$"E¢€ì¿1æ¢6•LîVø¤n”%_Áê®'ÉM&ÊšâÇ„<çPävê•.ôÏŽ"×Öez~Í»,Æ�ÿiøMÓYÊ£þîö½e^õó\°I3Hz!©ƒ†$Däpáž”Xc ¿žôkœÛ4v¡ËȎ‡�7….®{¯)’­k7îHu)T…úŒðóQN =Å1¶f„SI⟕Þåˆ=_ŸÆŒ&·$œ3îòʵs]°«Xa+ßé‡+l9‘ï˜î@ZJ�Æ`fÚ™ln"L¬á0hØé ëù›êž26ŽGæ™Ä®¤¼/™™½5ð‹°féÈD&zå"RèRû÷Úeý«Z­IvD�&7sxžEÜçísœrö¼•Ù]$D!ƘŸçîÈü�Ö¸{÷‰ƒX„´ !­J{á_ ¥í¼ðÿÄm*|o~Ô"ô¼ :Öô&øÐ}’Î�aÐ-\·ÂVGX/\t¶AgçïãfÜ„™ÖϤ·ðšÇìZç¥Åx#ñbv�;rdzׄ˜ùµ®#´­�C!èe<¡4#iÙV{z¢» ëÌ÷ˆÆ7sC[Z «Û‘ÎMwîÂ(tD¤�¿Ÿ‹›îgBÊóÛN7“£½Àq…Ð8£Ã)‰6žCS¾tÉr’·Š­:3½â$‹ô@#|[§ÙEÖðû‡„£Ó kµÿU•ôÒÎLe²j!³LÚóçÝÞØÑµU.¶'†òVšþFß#3@5åƒ�p6(L<ýÄ&´ï y+Ô‚³ˆŒGá€mJVgåÊ�^<¨!â’¹Ó­R�õXí©]®™uh+..Ú\Ž…Üî9e¢çÛ3æïObƒÇ“N*Ðõ6ÿŸÐõqÍu¡Š;ß#ªoÑìî(qŸšè’åR¢kî3‹´L6‡Ð“(óD}e¼ ,œeÄ<†™ÑEÔö€ÛÜpšà>>ʘïxî7¼¾·YÉ� ‘a´££ÿºkÇŽï/|˜Çž¦â”yÎÞã÷^ ˆ8¿Y#½û½[N%² 瑜àawû™PsüÅÊ6�Ð`�NÀ‚ã”Ëçä>Kr:Ø"³¬Ï0²[;lT®ª3Õ¼)D!h=íµ”úéÝVЧ=BÐ^î,S�â°]Ъ9 î†[ðÀT: @>Æ&Td-^vä}䵜êG‡¥éjHz ÂÄ­‹ôÓoQ� wŒ.`�&�Š@J¹Ì…Åä&=®rTœ ÂRÈŒõs‰*ú[”b8®m%¤}6½¿ BÚR)òfòYÌ�¾²ºLàÆ!×{’Øwq|"I5ºE…} Em�«í!½Pt.2“å~æýȦP%áxºS÷F"duo@ø@hiúq³*!ñc ѱ¸ñGGñ“gkdª±¦^ˆRí èÄ‹©`CŠšÜ5€­- ñ\QËJç5ä`Ÿ3‚ÝÞ"„(dâ1Q ›¡èñP ‚]��S»"mч˜Â!Vë©236I–áx‹�â%À x¯ÙyW fyçL¥lkózêÃä&nœ¼£›I¿"0:6<{è%ÖRbkº$ž]]YA?´›hT=¸…Ú¥DRfnŠÆ�énE¹É§ !>/)Yd%M ²UØXÍæ=΢2e«¶m"—‰Ë°‰Ô:õÂâÈޱù� ~Îÿ.á *^ —>æ»GGîÖ?ÿä×¹©Xœ5�7.™ëY> 3Œ‘ …»~ìú(ÇĽãÅþ©;0,À"¿â¡5Ôt«Þ€�Œ’‘ï&½&ÌgJ̰þ(ðªF{r'�~äìÚIo™8÷™]D|mÒ ú>(R]GéÂryåâ>þqgõ®Ê¥'ÏE½N‘;„ ^ÂÀF™êò<åËëxß› û®ƒÆ4'NÕ,³bJ£Åd-|tzòµýóo…Ë¡2endstream endobj 43 0 obj 3864 endobj 46 0 obj <> stream xœí]Y“ܶ~ß_1U~È0öÐoæ-®r¥;v%YW.çaµºl­n­"éo$•ßrH À×ÈÙ•íª•4â�£Ñ÷×_îŠ\•»bú«\>=;þ÷êÑÙ˳>¯¦?Ç ü÷åÓÝçgŸÿ¹Û ùÐîΞ©¼(Êù¦Ú©²É‡aØujº¬vçOÏö»ìüÇñ ¥Ì+Uä]×”»ÃøX7^ºöÏý!;Ty3^Ýÿ5+órhëñÍ�ÿÁXöó‹_gãÝ®júýóìPç}[öûËì0>ÙEßíŸd]®š®«ÆöªÎëF û‡YŸ×u[tû2•7eרý•ùõ`|°Ì»¾h÷¯³:¯êªjùÛÿÎŽ·ûýcÓ6{åï°ÌëJÕûWóìÆ.§'ÍØ.Øïûfô4¤gæÚ#Ð(Í—5o ³ï}3ÝWMÞ ÍÒv?ôû7æ]CýåKƒE³,ÈHûzwþõ´²¿Zµ°ï¼õìó²-F~)æGijsOeÞ¨ºTÖrŸ‡S´]³¿6cdóGÔ'BѺÓ/zŽû�Y‚ñ]Õæ}_U¬i³Ú¥žÞÔµa ¾¬W€¿~È&JÕoÒ"¸¡‚YË¿dU^4ÍØ¡5´eZ`df8C Æ3-öÕ2 ÕF8`&P9Œã¥-ÁзyGì2±gþKêc0êꥹ{Íæyd�¢ÉË¢gü£Y•ž¤�>€ÒgGÃxCTâïCŽ‹Òù}¦†\u}…©ó ê÷ÔÝÿÀzØ`¼ßtªÑütl 7KH_ékÓé úÞ É9wÙõ<‘vò™ �¿v®:èÕŸÔètŽ,@ÒñØ!çÊI¸Ð“¯,Zk¹¿fBª'@3¢¶QмÐmºfi‚åÓ±^B&¡Eðß:®’;¦‰.0ë¿IW\»11›§Õ—j�Õ„#x>[¬¡É+celc©Ÿ|�Œ)ö(øX¨W,Qº�ÌB‘! 'ùâÒL^„)æ-„ÓãÓ¬Ç^t¥Mf_ÅÍÂ=ó–À^žn 2«6ö€¥åŽêaYu®¾Í¦nºº¬Ù@¥¥ « F’÷Àåf„Û�ù kýH­¸\scÏŵ6’$ʾa”8¿v_ÁsÐl&S8QÍŠBåU Åøº´+L" Úa‹6¶æže þX�4<0}=Ýã¶o;e½…] m’Ù"iËMƒaöÕ¡¯ÙâdAþ—~ nøkF5×™«['kB# b#GAÄD‡ÐYoòBAárûcš9d›ÕBþëìÐåm×)®5ôƒéžš‘ðÈvs$¬lâ,ñÜã¬Ú|¨;­Ò-ptÀìY¬Y Þä&©�Ê2^�-®>n“HªÅOXÁ¥èEŸÂî“UÙ·$ÒóZæô„ @®§`†‚^ËÁ÷#äáÿ\xì�cƒoâ’utí°Lˆ”´õÊŒp �/‰èà³xóssöÇú~P¸'Iµ³öIÄQ¶ƒ/�h'Bò ©Klõ8ÚÏH¼;ú0 €h‘[ê†ZÄ}-ɼƒñH×P?2-ÃÑž)XÕHÒCa?–—°ùņZRÑ”ÏÓ¿dGT'ò°ceól”Nз“<§eÖ”62'I à:þ蓨ô…ò1`A,RÛò(Å»$‘‹2ŽðÅÂ)é¦ù†œ¥¶âÎRÀoÀvgÑ_ !¹)P†=q Ì3¨p`fÙn½Z\¸9â›0Z$!"ŒE×~l7]Mν…­>q£eÈµÔ X'6^f¨ ⎞m±íðväâ ¤yÒ�—’RŒ]_/F¼È˺$‰ö¿ 1 �4K2 âú©Gë=Z8 åŠ3ÙÂ�’|¼€lÀ 4K<»rY¶ãä˜Xî}\·lr×ùèßß(÷ÆÅÃÉðu]'ˆæ3ƒ€]XžÚh+ËÚ‚äÒpãïh_ëhêXòGYS‹¼¯J„?Äœ7CÐß­Qµ¾¿ÏÉé¹—ÓŽK»’›@{숋�#S†‹ÿg(úYÞ¦jz_Ô“ô¿mà°�æAmh³¬¬aªùÝi}/N²çŽ^�³V®s;z�»¼V'úVOC_E”ò¦ÐWí§ýÑ×°Ÿ‡«n6¢®¨d£®€×�>Š�s(&OM„lÞ@^£Æ_‹Ò8hÛQWRÀulîj¬êÒ'ÄO‚µ~d =µNkÄíÍÍ`­MÛÜa­wXë­c­+pk­Ô "Bt‡µÞa­wXëOŒµzz÷¬µj6)‘;°õl½[ïÀVžÐvº;´u=ÚÚlü‹A[ocõ³'c¬ú`ŸRv2È*:„'¡¬ „‰¦rý�£ÍÈ@H…lÆXCGLYß9œg±÷qéYÀ¶v³€¬aßÈ. ”ê Ã51vûÑ%´µìrƒ1fуÙ9A¦™e!C>mNk+€I\€£íª¾è&ÀâFW [½b£$ÚŒNw I¸ {|[àÇM™K‰ýóÂ`ଔ™ Δ á¶Ñ5;Òqä—*¨èá[#Ž\/¾ÛmúÕ ½ñ-Ùa U1¡sÊ2šá¸–õ‹]’MçÝzmExKg(x+¸¤”¼÷—aœ&8lØý xB^ ]>ÛTØy(U?…[Ô9ý¦03ùÔEÖx0Öb%—P\â‹V,,q¢¡KRR!“�³$ÂÓ—Ì}æ®4ƒ ¦¥ÂóSRñsÌ�r µÍ5åÒqHüd‚²ÓÎÇm*»¬hzuCÂîm&•Z�pCƒuÙj=!ɧ~=A<7˜Aoúè ûAZË´žÓ&Ø~6Ýþžc9þ[ujQ©s‹SqËÑÙäû—ÓŠº >�ÉõëX*•D•Ñ �‘W«ªêKA.Ü“q&iHOé­ÈÐlÚÜ;Â�”=-<<*»Ï‡n¨j¡\ãÓ S}¯Ù¾,EB�ƒ¯J 7táY°pƒ�ñç»m>l èÚ=Ç@†~Ôš®ý¥ø–ÜcPC@ò�ØØäÇ`ÜSkBtøRÕ=SÜ¡aDJÖäw.�9UÒ9±(ýßô¥ïML�rOX`ØþÃ%uO‘�y˜#G§„à„”pFub îøÝ^ŠQ:ãËfø þ äj0;3Nˆñ ;ýÔ¶Åü÷u™<–ò¦rÁ€œ–x>›[.^Òꊽ+—é%#è´»�vz÷B¸?{ |é%IUAÖAÀäúЃ¦{Ÿû€#;g8°¤™l-bNï®Ý2�G¢½™£@_ÆO…Tüv¤h n´D!*Ri>À†Œðãac4¦�WÈü ÔzúBÃ(%$º‘ÄÏÚcÈMî4&{Qœg“#òŒ áÄáÓVÑC·oÍòãMæcÅŠžZÄç1G¡u�‹Üž{ßÍN³U�î»èÝaf”m_ Áj½�ê:ÓàM+Vz RÁl²g“@+? Û¤rx†ë’©žÈäªÑÙ¥rYY$_°9Ûé“%,`œ1Ä;Ø<'V¬¤ød->À8–Å„1³­ï 7¾«œÑ¹%hr„3s W'·«$¶äNUþ·òN× R²xS.Æš¡‹eÃĬ’|/ÎmÏúu=Lôá9~ßò;¹IÐËÍMB²âÄÁ¶(¼VÇdéKŸ`!Þ˜›b}r”çïC`§ðÅ)màÇæØš ^壒½ÙaJÎÇëóèëÆls„[Â#µ×y>)ÅLé?Øa¥¦HNþk›9÷[‹UŸW� ƒ™e›U/Ô~š5yQÕõQŒûñ�zЧÇÄ0§osB™�bÇ>Ðýp½ŸVpÛÄ5‰¡Ü˜tèÒ*tmÝÎeít�6Ö­óÞqES$»\ž¤C@jôúþ+þ|'üb¡ð_håÚ89Óɾ2f}žˆLÖB³T0*všËIBw²‘²Áe3ÒNJ³J:p¢Š¾JJ»ò„|\¡øÀë•'Zœ}@;6�[³ª39Ó™\¡€¨‡hi”ÔÆó Ž&} )­—€R1x–f-~ZÊwDáöü¨Ý�슥J¿£ a¯^Iš}ä6D�Xåñ…Û�ùB¸ëÚb¼Ùú|¹f“’×­[[¹Þ®û ãk¿ß>°ÂH¡øW–ÕD€UE>QÇ,µdvãÅvw�ˆÆ´(WˆÀ6’:ÒÀLU+:Ì#à{WPî0M+ÚÒ ç3½˜¸�¥iÇ­´!‡H24yÓž6 sáù éÐ’€òúÇ8ˆ(¯&.kôÚDË.ñfåó§Ó(_žŸýiüû"~zëendstream endobj 47 0 obj 4241 endobj 50 0 obj <> stream xœÅY[oä4~Ÿ_1oL´�k'¾"ñÀ¢E¡-”á±m§ÝvÙ¶ÛvÛ¢ò뱓Øç89žÌ¬ ´/™Ø>>×ï\r»äL4KþãÃæjÑý^Þ�/n–µá¯{�Ÿ7WË—ëÅá±Y:æôrýn!çM¿(–¢QÌ9·4"¼ËõÕâ·Õ_•h˜±vuQÕ’YÝØÕYUwï¸^]W† eL»ZVuÃd+äêmUsf4çÖ ·Ÿ*ÉZÙ¶zõ¾L5F :’c'¹ ¶~mÐÎ4–¼Bs™n•ª÷UÍu0-4³Ö¯?¤—÷é̲jÀœ¤Ž^R‹°Þ»Ê»Ê297(òæâ"qÿ�„ÿØœÀ¥Q’¶%lKø…åSÒSiA ·O¸gu.ꢬWÛ ÿû �ÙB$Ю-sƵ²Ó­–½nëžSÕ¬^TŠñVÊa«–�#¢ú1‘ÆöD^.¸ÔN!Ö°2OFÑ\¶Û7ž k»{.”ßúKvÙH´óa ¹².‰w禎軫®cP ·ºªO‰›m¤ÍË2 Ž Ð«uÆDF—Mtú?š}aJ�”©¼FæV ´É¯ü\…>�ãï ©¸�¨Õ¢û¾€ŸÑ‚»3TH°�d²ñÀ!SÞJdV=z"ògáZÈ6X”à5 ×~¿Œ9ù‘ôŒËIÚÓHÔ)fŽ9�½Œ¬ZÖ�V¹v™ú)–g$Jˤ`úSJ�ùd|È=dò¼&­ˆ¶"wÀ¦oH—Ù�:%ý°P¡ÚQ&�¶Å™ô„ÊP ͇B4 Q‡)v�(˜®Aþ ž�zˆ@å2Ä‹a "4ÒÜ� =`ê† �Á"…­7U˸R¼ARtªã¬P%”ˆÑCÛ)›•V0ˆûe©R�#¬m5÷õ%§ËŒÿs’‹®4¨âéb‹‡�Ï*3ÊÉç3÷‚ÏŽ´èseâUîžÑ ÚaŠÎ›í¡UÒ„<ÑëdG#¬“�îâúÎÌ;²M~œµ1ñÊYCƒ²2xÈfW~U[m¦‰NcËpz „*oˆþù.‰ Kk²ÔFM[>jü@g¶£ªÃ%pÝQꜣ�æ“p:?ˆ¤ÆÙ+¶VשÝ7Y½Á1:ÌDLLŇ#7`(ª@ÿ¬’ŽžQn‚ȧÔ–,”ŠBk�`§Ïî� œñ!p‰bo§héêC¾~[DÚˇ”÷‚Sù•õŸ“’ð¶ç®§5Ýᡟ½ÃA… äáãÔ™B"ý6¾b½¨‡ÝËsË—{?Äw&PyÝmµÖ wj'±a �LÌrh¤!Á¤ò ëGÀÈ^àš�ltÍ›èí�Ýœí~�ÉÎùÚ¿ÐMÓ@UÂ1Ò†ˆÚüÙR5í³%š–_¢TÊ€cЈr�ynN nS€4²gª“ü/ºšÎÙÐSøóm+ÕÖáÌnîôu "ùè]Ó,F?�Äô†.=©I 'ë«p¦ÔÍ}ÁNFq ÂwCÎÄ7NŠÈ2Æ’E$ý%¥!ï¢õ4ÿê ðhì=ò¯ç·I•9b°%IJN‡p]ص‰èÐCZAß?ÄÝa_Œö¹~ðÂÆj(4z¥àêõÛ”g†ðÔ¦I»W�“¦ x×á2õ%‘º�þDA×Ó1RÏG¤ P0?ÄËFŸ1AЩ„³¼©ÈÊcüm'÷™BÉ=Wƒ°a¸† –z‚Ÿ¿¤JÈ/½6¬ïÜÒÜéÕzñ“ÿÿòãy endstream endobj 51 0 obj 1522 endobj 54 0 obj <> stream xœ­XÙr7}Ÿ¯˜·Ü¡ê ukÏ[ÈVd‡ÜT¨<`ccƒ1Ù¾>­]3£¹6 ¨g$u·úôQë¾9¹ÿ›§WCøÿxórx;X&üŸ´ãÓ«ñÑaxø`tÌéñp>ããWsÎ�83ÆÃÕ°§ÃïÃ^Ð0bÜ0…ãáÅðl÷ë„ �Òfw1 Æ•2z÷|ÚKf5r½»�ö‚)£�¶Ø#“äîtÚÓÎÊ %ËT»{—óvæãI2!…Ð ö®`ga͹5³ñ§Ñ¦´––ývøfHî~çãø„"75p` ý—Ãg»Ã´ɸ6Šb1 ”•yãèluâ|²LJ%ÄîºÆz9y;FA3¢Ï ™µ4ó¯ i&·j÷Š@Τ´·cŒØ½,£jåyÔM JÎãΓA7Ó½"GµÕº«dc¶1ÐÚ}StQFï:i¹-!_”-Û}ê÷1³TàèH™¡<�Ý7Rt®=+šv ÓÝ‚½ÍÖÞX7·ü¢DØ;BJ˜Pš $°¾ÙvvØH{qƒ%F®S=·K�g›&Oþmü»nŠ¥l³W�ú¾L­ž¼9úu¼ç¹æ†8›?_¶g—è”`5ôX}_†'ÃÛQ(gƒÂ $Q1’JÐá(@iÆÁK×çt¾_\ûÉwj—éK—Bðµ: c™ÁVº¤ð§äƽó Œ`‘_ü_õº)’•S‹:§V«#”¯rQÒ‘‰þAev\NÊÌšã?�ÐÁ¯¿qª6G´µúºWíä*yg[4‘_ügÇÀX±Rx.qSá6Ê«7õ¤Vj¥ýyõª’}® ¡þ¹aB‹\ÿ‡Ð†Ûâ›®åJ©Úz¶¶êçü‡ÖËú ÊÏ I™ÖÂ�ZQÑÆgгÝçÄ3”Tt? ¥q–ž:¿dlô8xe Ý…ÐAY¦¹Ï}Å.&:=‰"ÔqÂÆ‰Ž‘t¾zH³Á„âÜ;&­´¾Nµ9*¾òÓ’ºá­Xala*Á´) <%†®¡€pÌtrˆ q‰éäVˆ(ˆHH¢ÙÂdKD®�DT# ¢‚™ùæD$/ç.ÅA˜¼®¥9Ê® –7å=‚ùú‘ˆ$E$ØJ¤Gž+Ü¢•Ô‚e6Ô$7™¯t¸é�å£͆ Òû€(� ÝŒhô¤÷'(HÈc‚„ÿ¥Ç#NæÄVDb "sLZE×NA Ù²Ë9uU”BTAô|ÎYãÉ#Lå! ÒŠäNd�"eIîôšVÙ FâX*¤‰VÛ_?­Zyù•6Ñê1ÝE–.0ßrÓFÕ- õÜD@‹Úµ õ¦¡F%XGy® ¯*ÿ®&Ç!üüB m‘#õ!~G5#eK»b:2Õ’? ïnÞõO}”'œcå—æ–úÁ ¥çܧ Ú‰Ö‡wåtj4kkø]·+øw à´³¤Ž^D´ébM)A ‹ÂTAÈ!ÒÇÚÄ<:b¾B0!j…àjUT²%“­Šà á Á¢V«JMQI¥šæ2Ç¡RÎ.=Rë^ j1–ò&km/°ýõãÔ” JMµ…¼Jõá~×"4Šž+"4}ž®ž@™!Ô|Ö²ˆùFÌó‹"ÿ@dÍ—�‹*Ìl%–ÈKž ÿwp/endstream endobj 55 0 obj 1746 endobj 60 0 obj <> stream xœ­WMS7½Ï¯ÐqÆU#«¥Ö×ÕI*WìÄÎæDå@`' Øbçß§¥Ñ×ÎÌ.&Uâ©»ÕÓzý$}b‚ƒd"üæÁÙu÷‰)í]üO¢fÑsï%¡ÊsÁäå{#Ù÷·Ý».:³»ËîSç¸ ?hÇg×ìÕ†\,£8†m.:àBÈi˜–À­ö %rã€m®»ž ›¿º•àÖx6z¶9ïNúÍ0ra¬î¯ËA;´ývEðWÉm”`Yæï†QqmµìOË�ÈÜéR$kUã=Y!œíÿ,–·eôOñÙ6–ÕÿÃ\K«¡ÿ< W¨”ifÏKœ5»šÙ®ÌR> ¹uÂôÿà9X§ÈyÁÑ«þ¦¤sYœ§å¤§éûçêѼsÈëAÒ¼°²É§­ÊY3žâ;¿·( wN©þbpÑÛΧm!¼ì 1®‹íÂ`Z¬Mâ|øcóº“Âp�†¸Iò¡dsS2¿œíqÌàtQ‚×lk¤]mëNðêÓ¸¿BPç<4|©ª1Û .w£Ù¸`\7îô±Â¯9ˆ_·¶)vÍúP†•«ut»ªYêìÀ¶ø£ùÖâíµij¡›6hÈ÷e Yq@v�+à ù¹Ì•ØÇ†%sЂŽÔ͵שÙHr—Z�jAˆ2¢�\yd#„„2ïf½ct)°¨¢aU¤û¶Ã‹6Õï¨ó{Ú”X Ïg} •ü¡xÕ*6´^S¬oW�ÏÃh¹±q¶7T«¼•’‡šþï–/6x®©åT9"üãlºY5ø:+þ¬»æê¦×[r[ÄI:� ×lÞÚ&U÷ÛÃJ>õöZ�–úø<µ�ªÑÁ«ãŸ™É K>Äùz(>”QÎ:ÚîïüÓ„!WêÑ�lý÷ÄBÝË'Þ´LÍ«îõ/–õô=°üSo 1€,Ú$eÑ&ýé"fzS‡oB FÓ¼FC�ÔŠ˜¾S…L¨Ðu'•·‘Fd\ *!¸@ìÂËO­± ‚ Ä$DÌãíÌ+å¼ë®:‰�VC›¿C»„¸yŽÄ¸ˆ\4£Ÿ0^ðaÒ£$ýM;2ûέƒ´–)ˆZ 9]Óîñn‘s<ΓjÀüIŽÐçãœ^Z“�†L´wÝfuÐ_endstream endobj 61 0 obj 1560 endobj 66 0 obj <> stream xœ•WKoÜ8 ¾ûWèh/`Uïǵèí¢(綇ÝI2iw&™$ÍÝ__ù!‘¶éL’¹(’Hñññ#}Ç—Љþ—»cuÇ´�aøO9!˜7‘Ǩ˜6Bp!û+¯>¹ÀÞÜV«A˜Ýï«»*pÝÿ x½;²×]ñ,éq¬»ª$B�‡’Y%¹·‘Ò¶dݱªYÓ}¯Z£÷.²6²îbÚ”’[ź÷U÷ÇçºkZi¸pÞÖ×�çÒãë˦½BmMi7Zšz_Îï›Vsë­ªÿF7OMkxp*Lš¼×Hz¼™‚|ýO¹y[Vÿ™Kt“ æ+cý³Qéªv¦ê¡1\­zj‡Î'S�q3½XÅ�¦ˆ·rvã¢X†l˜ —Z׿¹ôû˜“–ÛhëÇâÍMÑsSö¾¥{‚›¨ÑÞ~3Óñ;°"õ?²ò–ÐNÅOØúØî‚ów˜ ‘nŠBˆ!Y÷µû«R½'Â$|%à|FÉ=”‹‹‡²ÑXSQ¯OàòÒêUöù”©¸Â!§féX¿t�½_K#ˆ3‚†cää“ÌØ†ITœvóÃB”Êsfœ…³m0ÒóùÐ3f\ŠÂ/ˆ¼<”v”¾’ Áñ ˜ˆF|9a–à’‰íÄô¤£åQÅ=-Ûóöu©Ü)”CMwO "'ÄÍóæÜ«~šf^øé4k.ë$R\ñ¦7H,eÞDÇéñØ�¸¸ü4éOi>7bdpnà=oî6¢qöËèa"¨˜üÝâþš[1PÄ%ù¬8�óøŸ]õ1ý~xžrMendstream endobj 67 0 obj 1025 endobj 72 0 obj <> stream xœÍ[Ír·¾ïSÌ-»®,<øŽVâ$VÅ.Ka*U)RŠ–¤DQr¢ñó˜Ð�AÏÌ.Ÿb¼Ä˜ºû믘]ϸèúø/ÿ8¿Þ|è¤önøKh§;«<ó^tRqÍz»|ûܪî�·›g›apwwµù°qLÆÿ†üûüº{r‡taÓ�]n8ë{1>ä�œYí;Õ{æÂôg×›m·;û×f¯dϬñÝÞwg©‘s¦Ewö×øçïâ_*þqöÍ‹íÙnÏë�ÕÛ7;˸vÊn_ïö}œ]jìS’«íUy~·ÛK¦­Û—¨çûÝ^1g„K3Y+Ñè±§é{g·¯JÏÛòësóõ„ñwŠI%¥A³‡ÑÜ0ç¤Üþ²ã‚YçP?˜Y°ŸsëC»¢Ž»ë¼ ;¹ç=SžçQÚr-齄Q_æåÎðÁ‚/ÊP×É?”¾ŸH››*9 ö¸r¯oé9hÌ�Tõ¹Ø“¢ù³Û{4=áwÚ%C Ðf’w˜>;ó¨ÒóÁh¸·Ì÷:M­s¡û€]<öÛ+îÃÕí&ÅÞÙÂËÂ"È€¯€¯­Aø/ 3žÃQ#àÄk Ѽ”�-¹%l’´�ÚP ¬!ÕRrÐ� ~{ ©`'n‹Uø5ð¦i¤ˆ¾1+EF"°à»dJáÁãÀŽ3b†—‚CVQ ¿èŽ4éâHmI‡¾’{Ž”„¥;Ps�'¾œN5tÅ­´¯~öÊ)±ý÷*“2à.>Ù×ì-°±ÓH:Lõš kïÑvØÿ¥¡u±´)ý˜Ì%$•­¥LIZQ�Í9BxÀ�0»ÁÄ!÷|›V+I2Ash� HG·�ú�gÚy.[îß rRLÍý©Ì}ƒEœ…{@Mä ãŒÊ Ãð*ßa§oƒVû£‘÷"+"ýüpÉ]%ݯ±�óô’ͳ½'ðÄ»%vŽvÝ(>G‚èÍÚB@] W:â?x£2|W¨!)ê雳.i"GŽ9�d͘õްG¬q¬l�aÙ<{Kø¯ò¿Šõwh–·ìcGØ”?¯pˆO ˜4½C¼ºã¨s{~ÚÅI]ˆ3¤cÆË+2�ã0Šä�³së&NI`ô ~VÆ�ÏO!h”_�öE%l3< ô@Õ#CÍí2fŸ�”¾Jð‘Å×I˜‘½™õ JÆ üÝÑ„*y“>„­  …WËtä3™Ï#µµéeà‚÷s¦¡O*D!<�H “b¦×fÞË]¹Q«Dab’Ü?z 4�ÔåE¼üå×�»¨ªžóí“ÝÞy9¯Ü˜®Ý¬Ø>tÅx�yT¯Kï–{í�-@ꉦñ_QbZƒÓÓ‹'™cègžá«h­‘†‡:<Ñ——˜Q>�OG'p?$¤ÌH›íäŠL_ø æ›‚S3åÄûRœB£¦è¥ƒ;û ½.€nQPuB²HA]`D€ð Y8ÅêÁÍçë-5î<Ô“–+cSOŠoúÓ'�ñH˜?�À=©1÷e;W  ÈLÙ£à¡Ìý¼0üð`B�Éfª[ØæÀ�k4üU`&}O’"ÌLQ)1"šBàh>Dè  Lðò+"FΘØñå镵AãjBBާN_Ũ—í„+œ NˆáÀº*†VPém�*­f¿‡žØÕk$³á÷˜BªQš :£+z…KIí¯”6tkHø8yþµpÆ´P§{’…÷ ÈJi3Z­½OÊ­53…ThZ óË` Ú¨KtYJêœ�‚±UP¡j-¨#  Ý})£s/ =:Yù€g‚ó–’x.Æa[½×è1=p™-­·§=^ÍÕ’ˆ´uþn¥HAs¡v¥G˜Ð‚U®cÊùÍ1ÉÐæzábSÄ�è4“ÍS�k˜’,h¢"\¹®l˹3ð‡œý¥Ëô߃P…:ÿ•~ÖV(ؘaB‹ÇívPùE€(>y*®Ô7 ȃ…9#§ØÙ  Û#n§ÅeÉ óÊ�…~þiSLÝ‹UqH½@¿Å#דÆUxžg»óî¿Æw'H�Ò£Såâµ…¢5Õ£â`.Î3áqQeÙ&›‚Øt÷ÈÒ—3LH^aYªNù„I�R_`ÀY$>S¬.;d¤ ÁGeX:ÖrÎé™g A_}…)×w3eùu~ÙœLNø-®U*èàø�Ý^3#B�«^¥:˜c½ãu}£®íœr²I�€Yp.(n§Ý]j×üµŽ__ü[!\\ìÚ!ÅcÂûˆbšõp�aè#Õ: ªíâVWPõÈ,TÑÂEŸ,E¦¥öÓX…<3©[›.Ò`F1+üüó1Ž=ž.Õ9èõ4uŽ”jg€ú.ß±€›u¤¡àÛapÏäÈ«P7ö¤‹žñ 𛕋žÔÉò‘ùó�¥\3WÇÖƒÝïIhÆwEˆÌp¥VD]}9P‹{Gªµ:=Ä››€Iâ¼pÐE]D!¿Er’ǶMñiªgN3ñ!èP– 5=U\«^¤ú{�´6À… `5ÛŠeب»æa;ÑO¨3OËT-÷¢JZôÁ U›&OùÒÓ RèJd�ŸíÅ èf� —rMòfûò}®ãKi§Ým¦+Æíý¹õ_N½á†Ä)ÙÓ#æ.ÁN3n‘Óÿ›¤Ð•}û<ÄÿüሷÁ.tJ«·Oã!ø»Ǥë-'²î¿TWHÚ Ûl ]ÑÛ zgˆk�ÝƒŠæ¯a7W!V°t Ê hÔ·Pí"õÃÏ!E,sp‹«÷ðmÍk£¦¾ö0lÍꇂՉdJù¦‰ÖgiÐD{cÜvO]cEiÂÚõ3ˆ¬—Tº:cÁ«’g’£l×4›À¿q¹„6Íd‰¼'$Wx©mç˜, Úà Gh\õ±Å¢è”jóÉÕ)HOz9_•ømË¥3Yn>˜¦¤“­¦FÄb áÑÔ¾?Û<Ûð.þ»»ÚHÞ;æ}§µrñëE ×}w÷zsùÍÆ0¡»_6®û1Œxš¾f|þç¥Q;å›GÎCs¯à£ÇüÕcṪ0V0.†¯_lÿ°‹ü4ÀáÏ!\)ë�5Û¿ç¶.î®ÚÞìB®„€=µu1¬[åãÖãvøhfï™rÊEìÐLõzü²( � ï£Õ¨7xƒÃù´CÃW¡×!…ZB̈-‡ØÂ§-ܧÑ´¨f”[»ìø.ÍK‹Ÿ¶pžäñM‹�Že>lÞ„·ÉQÓB‰´áÒ:FÝc‰\šû Ìi7~ë­ŒµÀ¶ðôq ‰óÑ�‚Á�~ŒÆÈ!wÒE5F%«±øM)4GD öãÇ�Aß‚óÜò �»ø %Æôi0+Å.Ÿ{¢A1$z9”€Á 帗Á¸x¶’À¾B‹ônba‹|ÓbJ‹K-ÅJò<ãÆл²vyô²±Å4-¾´p,á¡‘y´žÆõÙJ¤võû…ì“DZ4V:˜Pt’†ž>Ž•¨à@Ü„­)Vò$šAï„ËÊ�˜P€ð@㎀”ÿ 8’R¥̆fü å3Œ„Ù´ðÔb›?e3ÔHÉÓ»LiQM‹N-º´˜Ô"šQ`ha+Æ·‡1£¡)_àÈ8?¶x• íÙæ¿Â½*¹endstream endobj 73 0 obj 2966 endobj 80 0 obj <> stream xœÍ]K—å´Þß_qÏÉ"}9´±ž––�B$ �“d1ôkz¦‡¡HþFòƒ#Ù’ª$•,ßî{BÂ"wdË֣ꫯrÿ°Æ÷£ÿ/þ¸|µ›ÿ½{»ûagáÿ77àß—¯ö]ì>x6íí`õþâfdžqäËE¶7®ÕZ¶Ÿ˜ofû‹W»³ýáâ»�`bPîþÏü¿»s—%þ‡âþ_ï}}vq8grõ¤Î^¦�)#§³ëÃù8LÊ %]�s>HÁäÙmºþöpî?)~öÝùæp.£¹ Oš&�z/wêq4ÓÙ·éÎûôë§ÔçÝ ý_ü°'ÅÎ~<ÈAH!tã鯉·ãgþ’®»^Œ“õÙ«ƒ´ÑCÓ¸s—ÇAÚ8$åZÑ3aì7®³”zœ#‚Ö°rîælHøæ»y¢ÆšÐ�[7€çÓ §‰™³˜ØdZˆ‡ÔçššÒ~Þd©Fuöóa¾lã‚ú>ažL»�ûÇÅŸv|´ƒ™&'bW»¯óqÄWºÙ3=#zQ½us¯—ðØœŷټWc�¨©fO�[q[lþüþœÌs=â=ƒm&Ÿs‚uúWcÇðâ/´<0e˜ÅP÷ŠÆüǃ¿Á˜e}âž6–õƒ¾^ѨùÖËÆ|–ŽÒÐtabÊ?xíºJ®FGþÚ¹tË %ÛŸØñw<$]ÌÁH×As’2Ò8µº2¥BvonÈ9w·Žotx™{—¦Ò{–3Z ²YEÙX¶Íò³«$O™o¯�7ts9‚B„h•Z„‰Y;$ä)g€€A`¬”<˜…þò�3E®´ŸÛᤫ“án¢äG9PñWÇšKxrëö4,?r1c¿ÆJEÊ.ØóÜvÆM£žÔtzV‰ ¹S`,4ÊŸ€ÕÊD¢„+5yÀ\E¸�å ?iTƒ0 ’Ë Ë(0¬“µˆÛäÔgŸÉÉÏzìˆ"½8 ¨Ä2ýIr¦/�AwSx· 0 ôƒ^jܲKÀ 7ãgY%Ïuo³AoøÖ`çŸg™B:”e¼¤ŸWTxÂ*¯›Ú›¿̓&.ƒEªi¹ënÔ@ñðâÕçbwˆ+=%Ò}¹í6+Áͤq‘¼É‰~¢Dâ4±?^“ïÉ•ï‡�‰®‡íZ‚—ô¬ÉPÍ=ÅK³¸:w�2�Ãöì®;T«nu/¼Þ‡ÐS÷¬#Ù°ú®]¶¨‹ËæÐc4QXH�«žUeÎ)a—²"©Äpàä©É,<Å låJ,vP‘hÃÞ÷ •e¥$~QYXA lr®¯°ªfÜÌ:!Nœ®”Øà•o( �…¡ƒ¡ßhDú= 8¸; $Ç'3:Ñm›.E»{ÄW³U‰Pô”.Éñ¡1Å€Ë#ù­• î]B}MÚ�ãBÄ}*BxyÍhPA™�Ii.Ћw°–/Õ+Ã$Fγ°Ìo)®Zù-áq%Ú("Eüÿ†èQÔ%–|šù†23VmhKúVƒ"`—ÖM”gb�ïìðø^*?‹™ ÍÛ]zK5ܽ!T6¼<—lšÐIÊ eÊɤ:"0&,„QžŒ‘/Ï¢d–ªÍ;ƒ@SàÔ¬­€P J$¥PÒ¹åýeé§ý &yTêˆbÐwŠ>•ÉœVÀk÷t±çq£@·Ïæê_8ó!ð Ðe’¡rÜt2‹Êqƒ5¤ÝÛ,±%ŽŠÚ’ñTÚG ªvʬ;ÍásJÐð‚_SÛM£ M/j¤¹" eÑ:z½9ÓÜÆÏ’f�ç¨oçú@ç$ccÁ›ŸŸícc]¥¶‘6â?œ«As7”Ƭ~Ý&Ó.¸#ãçi«¾„)™Ç¡‹p6ºš^ÈÝÃl8ÑŠ®H|JÑXl(Û6ËN gEfG*•ƒ¥¿› e°`•OÝÖµ3“f8&\¦�J6AC ]\Cg)›^Ø<Þ±Ö+ÒQ0A§‰ŠP•JÎCºÏj0S¾1ð˜móÂö>~6P¿�£Q'yx©‰ É5…ó…´¿f ³¸­°‰H�Fx[ì¿ �Î\wL±á�ºñˆ,;ÍÌ“ê§ä7d¯(€Yό҃ìµkâ@rAÚ|ZD… –¥ K·xð†rõè"À‡zù(Œby†ÎŠÓÁµKˆ§€ÍûäW/ù¤Ô‹½�üê† ¤Ôb�^9wÂ]ëHŠ�D„BäõÌ^C 6é=™nD$ãB=•8Å: vj;Ó0çO‹Ò®WÛгƋKòÎUÔ�6˜CwˆñfÏíã´º¿tÉ8YãÞ·T Åv/a`ò Z*ójˆ×)”S`“õÁ?�aÓÖó ©ò ä[¨¨f*L‡ yêâxÄÜݘˆ0TÎàñ‹ÑFGœ2«¡¥Qþê£�†µ¸&€|Û“È_M4¢êq}a�TħЗ³©jžÉ$÷uC‘6—ð ¼Øº¥ªž;4ë8R–k{]UZe«KvM�Ó¤âÁ�GuMÜ&Ã…qTX(\íÿ±áY2f5«:ÖJpð`�Á™)/�¤OlüÔB±8Ð ´ • ==–.ºq”3Ù­¯\óLZ™ºÛ"4cùq³¤Ó6qB/É[·0�ÕÚÇ.Éë �jD©4<"ÐN¦Gû òS!Ö�œG©"ôÈ·­ÄVW)]/Û*Ž�(AÄ£÷âg5j¿%ŒS ©êiòh•´Ìy´ŠOz„‰¥�ÆŸO­M@Qi†"Ïdl`BfgCq%‚dµÏVÔ™»6oÈ™Ñwé*¥ ¢�ŒÂÚ6òf+÷ݤ [¼Tf.ÈRiË;=h|¤«B â(Ø–TWKùòÄ_,0aÜvb(HÜ/by\\«ãKVô[sK;Í�#«ÛhÀZB°ëêv|R² › S¥.0:ÚO}JZ¢ŽÂÕµ™¡fÒˆa‚£Ï=ªâ`uÓ]±x Å*`s.`jcœ˜ÆÁŽ'΢…â:ƪÅÌcù̓r ˜­à�F§T¿‘_Ä�IÁ°´jéù£‹·s ^¿ŠÈF«.·êë„f=kÚP4¤!Ð+lT¡Ç²KGäúNX…{d=zEÜ�ü~j—9F¡$‹êf>Ø5”{‘E Of/õG¬2FÑ(�è,E›ÌÉÁÆØäu¦ÿ(—s5±ý$—³þ€A“ën\Öœ÷ÇŠ«dQQ3ÇåßAØ©[ór\<^Xÿ±·ücN±ü —U´Ë¯Žæ^[yUnš©]qò¨\¿«”ë÷÷ଗlç�@Á¯cEG5ª�ªok‰i3Æõ×ãuªETÊÖ'ïH2AÒéâ/xg‹ÈÕ¬!k{Û,•z$öžä›'Ÿ •Ã�”…ù”@× ½I1P¬–4ïºÊ Ÿ_*?þˆv�¯çu“÷@qÈs):›HªÌî•øv²Ï¤œð|EÚPÚ…F­³}õ‹¾\ä~�ó$BÑŸÓ¤%µ[µöMÜ�Å¢j9XÆ���ÊÕ<¢ü´ ]4•Ëy™YØ<§Fyȶ´ÇZu¼ Âǰ¿ ¡5BZg«o½w:ûˆ*dvbXa‚/ö”Ž«‡£.kãA»0`!êß]Aå¬4 ÑÌ�TæáÃYŒ&³ëm†ÓúôJܵ~�KEÎz±ýÆ÷"¼ÀhÚr.6’·ã£Ý�<×½;K\ž ã„�×G€³3Ì­ìJñrÚÔÂŒóóDu@®"ôÙŽlÔ‹llDyÚy…‘”ó¤… '€4"y‹á«¬<>.:ïøuX'–óÏAZZ¸Ò£¾Ø}¹ûa/œŸÿ —ší'§aÖò½˜£Ìÿ¡¡ž¾ÿý½»™íýoowB)ÛÜ×ßå¿oÄÔ¸{½»yo§Ý–ïÞ™ýç®ÇŸÂ*zöÉZ¯¯ŽùsFÎgvý%ü=£ø�¤�ƒÖý¿qZ<ÿA#ÿ©XoæÊõâbB7Fã+ݹ1�lÖ©Øxç·Ðr.üqSëÞŸPŸ¤�ü'ác#óN÷¨æd«_íyQa�F!üŒ•œ„Ÿ±žð:­\=Ízˆ‰Í롵€õø]\�¿:�‘“5“>û[lÛ{9e’�Ì“.6Ãå2G…Ú^¤Å¼Nm°@×Ù4cɹ¤‘Æë€䨌A]à�^‚ùòà´�n…dX!æWè•sA|A«Ûb«gù¼s-Ú„�Zth1e‹ë[¦Ð—÷.Þ¥S‹¬ZThQ©Eã=¼«Æ|·{áÞ6ÿ­-÷6Åã<–½—VÂC‹ Ͼ©NñåöB�ÚWO«XÚM6 ÒG^VFÃ��ùEi€MF;âð––_GиÍM)VP‡ ÒœÏÛaXØX®™­ZLh‘UËTõ²A@”ZD†+–ZlÙ¢YhË9•½¤N‚ævi~Ûd§0eDh1å%�‚Ç$¦4kç÷Éцq»–Eõ:T-"µðÐ"S‹Ê[â¸ÅTÎÖW�¦–1´ÀlMhQù:Æ1Ïówp¶ŒzJóXúIÆ“‚²eE3•¢MójqÿP²­\=�¢ù¥�-˜BŠöÅŒÎZ°h¸ÄüÕO/ä^"f[ެÙ"ùÎçѰ‰ùo¾±ÁH&¢ÆJ¦‚JÎw¢NWž‹Z!s»&Æyu…3À×õYÖ’™ÐŒ±Ôd‚�eË8•½Æ°—î]‹”˜‡®EW-*´LE‹ÇÔ’�ÙK 3*¼ŸÛ0;R’Fä®’ç8Ì"$$%%+WO$%6H ›<Ço-—ŠçøÆÀsäL5Sk@×ÉFžãù ÍŽ�bypÌrYm½¬¶Ó6tÛŠˆ<è¶•,µˆÐ2¦z™ª%õ1 ‚Š{íÞnC‹J-:´¤^a„*¡_1æ5øbÄ݈Dœ‡ cŒf�óiÁ ¨‘Þ§£>8pãŽHÆ=y˜["’»SÝV-"ºGVó‡¹MÕüUsþ¶X# úàÄ&ÌVÇy¨Ñó—&hOúðåî¿•° ƒendstream endobj 81 0 obj 4884 endobj 86 0 obj <> stream xœ}N» 1ì÷+¦S›\^—ì¶¢�Íùƒ!Hîÿ “œ¢6î6ób˜­Œ…nÿK¦Î±Þ¨+×® ßxÉ8&æQ�®d”Öv3 ¸ª"Ñ4Ù eÚã�îTùh‘.�îÈé ØÿÐøqω&*p£p¯µ>ÔFߪ-œóQÕæ:w˜™qzü Gi3ø–-<Ñ»�1Óendstream endobj 87 0 obj 148 endobj 93 0 obj <> stream xœ}޽Â0 „w?ÅmÀ’æ?öŠ`ci•7¨R„Ú÷HRþ&ìÅßùtºZ Ýö}Ì…:c½ÑB¬\›.üÞsÁ1Ó0%ˆ’ˆ|%£´¶ÛÓ€«*b�L“ r¡=ùNNGÅùÒx×1ÙVwøÒ9ÓH \î±ÖÇšè[´…óÞ©š\드ÌÌ©Öà—9n摞¼c1Òendstream endobj 94 0 obj 150 endobj 100 0 obj <> stream xœÝ]Ûn$·}×W òÏžv³ïô“Ç$6²F¬¤]I^­$oöþ!ùÞ�ÝMV‘<¼ÌH¶�x_ZÝ=l^ªN�º�þySW¢ÙÔúŸ¹8y2ÿ½yuyòóÉTµú¿ù¿>¹ùãéÉgOÆ�¬ä°9}~"ªºn–‡b3©»RŠÍ(ôm±9}yòãöÛݾ­ú±o¶·»±ýÔ�ÛÍnßT]+ºíë�¨úfìÅöÊ>}¶Û×ÕØË¶ïØ›¯l;æù0LÛýnªºn¨Gó\ý±¾0Ôõ4nŸ²ë‹Ý¾«¦¡™X³7¶üMê–jK4Õ8ÕÃÚÿql·çtóÃNÈJŒS«Û]ÕõBn/훬W¼ý{Û“+û*õéÎ>¥Oò1ћ瑑ނVù»7||°Öñ5°ºê¤Ð£uÛm¤l·ÿÙuUÛµ­;ña‡ç—_ScW»�þùDÈ©êk-B§J\"? ;?Éi{m¯ž9ƒ7Ó÷Ú>‡Ý½¦¾�ht€Ï¿•X­uð¦?ôêÒX?оÅý¥ARÏ�ÇvþªÏÏ¿ÛéžL“ÛovûIém¯–ý‡][Õ}_7üտӫϰ(ð¹3½RÒ*†jšÚw µS[ÑMöütÖ›z�ë¤(¹ŒÍß++1CãIÌ2�,·Ÿî"5CÛ­ëÜËIÏaÓ×§t›ûVªo7Ãf/ô¸––}lX éµ§;Ë]·sv÷ÚÇ‘QÊ`µrFT/¯õGirëÂÖÚ,­Þ�§AºyŽÙ¦•”À§ÀÕü~�@õ%\í«×pthQ§BD÷T«hgH¯ûí»ÝŒøR£ó"„}5X|cNàä[›ù‹—ð;½·ŠýÜZ¹˜¸àµ½£7ØFˆ21È£N¼�ÓNÓáXßf: M.œ¢×„ÂÉFpA–ïvZñ›^õî �$±µc3ü–}k‘Y5McD…½¹Jo?é)›Ña\M÷Pc «ô}á`ÕÙ:õà€£¢ªUm„nyºÍé_NÔŸŸ(~'<¡†¨�þáÇí“Å@¨FÔrÏs3ê52WY³Ÿ¥7o«¢ùü|�™i¢^éáÙn�¼WÍdzE sÑ“¾uÈØ*mÒʈúèNEÍ‹«NVóôbïÇjG�‰¡£/úiJ×]D�i¿~“㔾]òÁ8lˆË'dÊu`ÁLM@(à€ç'T1£þD<¢vrÑ:åƒL@é\šl:�× š Æ÷�?²Ï>§Ë;ÒköÂË]£~W��ƒÀåÈQë¢ÅЂ`ÛÐȧD_õ²gCaøþ°‹7\§Ì‹Ž)6ñ šªrSg÷Å,)�ú³Wˆè¤û®šÌ¡›.ZwµzGºh�Ü^Ì1ã ¸ÊF-Áh›í{;¯„o/Õ:Ó0 5(3kt*:Q2L=Ù�|oA¿ú1)Ç1¨`‹æL Aw£z_O½Ó=3Ê0›g9‡� SOüÊfƃ;[k¨D-�Òo.3 …U<âj†ÀóÍ3xxÆ”8DFºÊ÷4áYN„{ƒÝÉo9æ2¤&2ä“9®oÐtÐZ"?áÝ“¶žD!§/À�Ø'‘¼kWø=ËÃÖÔêg�•“32&‹È õÊEÑ4ÈL¨ß°»O$s¢˜öééî--™D""ÆP,ŒPœzqÛÄÊ8vìKáÂ,È¥ \g$ò@�0ôýŠô/S앱ï¯í�%N¡i’†ÐŒŠ¡ÐŽª&};ºxÆÈ’ÀÁÑ�Òv´„e- ŒbÇâØ:Bf¬\?Y^ˆmÝ4Ì>ÈZYWbjf ë|úÅ|BºÉ™â÷ô£+º$ø"ÖÜ0Bâñ’<Æ�I éF½² ˜�iÐã ïÖ8‹‡:y|§Lˆ°ë‹] — Õñ n¸%¤.9·6Û[H¸#N%\P‡uD½‡3C6àõgPZ+¥Ü¾m:‹áþJ*�•"…(ºÍÒP^…ÃŽ7£úæ42¼FÏ�’w•�ާ¶HWo=ÆaÞsòÓo½$>î„yŽÍ¿=ˆ!3¸@ñÞ.„°W ÀÄ¿êÆUÏ»®Qpa$⃠‰¾õrù¦PpäÆ'ôuç(0ÓzHp.Ó€á‘U8-B8URX!¤®dü0R�°*nÅ H­D+¤àE—W8tÆÈŒ¹DøˆÑŸS/@1p†u+[¿Á°ð3¶ö&³9NÈÕŒ&,)Ê%R*A+u=YoF§5—ŸOÂxÅ{#&Npì‘__v gã=F„#©+«öT÷_�©Fy8âÔËë ¿ ž8_sEÍPJí‹LŒ‹å'$ëÆ=0�ê’£ŸP”oV ¶4ƒÓ#H.8 £`$Ö”°§÷`æ?¥½vKŠ Ÿ£åboõAÑÑ\ź+›ÓÅê¥_YL3°M××þ`Ke�@›¹É«jÏ#Ƈh©sPyÿy}ó-wýlX4$Ÿôô,Æå!l»6‹-ž±N�Wä+[þÉ᱉úȦ�ÝÆ´4$Ì-Q~72'¤×Hæ‹•#³ë-q—J¿–»·‚ò¸‘¯B¡˜¸éÞ•‡j,XÒ$âpá^Â?ìêa ÊiÌb…BæžÌ"Ûã&üBtÆéÔ ¦—-˜v#&+XË×å@¶}ϵ•l޹ h†¤•}G£\)ŒAF&8í’Áúß÷iëY–¯Õ¾¡OM5 »}Ç­ÈF¥^†V»ýÃÀí«zrúSÚ¿¤$Ê…tº Àѱ¾%6ûà i8½Ç3%‘!ìqeu7Áè§W ñw)Žójռܩ¹êvÚU_è›õØ'ÓæU˜­î=SKÎö­'b¸¢½‘Æ+ì;l”–�'Æ(u¿„MÂ>Ê_ Å£«¯õUÝ JœIƒb‰ $F‡áˆx‡’%Î@${~¨B7sŸ|ÊlO¦ü &òN Wd¤Ö|ßY7­ëÂ]‚ôɲ=±éŠV‘/N‡¤Ôk°;=mÌØ RAãÌîÁÁ[º‰#’�<ÊoÄ»å3½: ˆµ,Y89>CûàQÖ�×8F7võPÉÎ-2;ÛÜ:’p;‰&ÖúÞ>ÎGqØC;Jï#ƒ-·+E��öÐt@ÉÊòÇH� É„QG³s \Wò£mšl¬ Mô‡…컫}™º&n_ Ý °4© œa´í/a@CMî¤/ »d£W¡=aøëD‚Я⒪?Êm�2�žiñ:ÍNïpñl³lJ¦ÊÈv²‚²„(Féäúó©4¡”>×îÎ’KHˆÂ¼#?‰}pG�áÃá9 ‹9äiò–ŽoÓ/¼¨öŠ‘wŒd…a jgíƒh[‡Â¯ 3ºðÐÍö_[v “¸•ƒÝ*qíñá#³Ï×%Ûzð8áìZbÚÀ!C‡.¦ÀoÆàš>š&±û#¬~@…3>MR)#&!óÔXt�P‰6—8ð矴0¶�UŸ‰ì `'UÅK”²g½`O0šDÍnHH6›®-Ž«†{ÚA�8üHɘRå4ÓÄ~·Ø5…úÿØíûjh”à¸5‰a„/`T�ÊÚ±k‘…âdj’D�ûP_U—�Âhê)$"л;€?òÛï­ˆC³�ÂfñüŸ¹dó›¯GX€¾Ÿ…ïÒ@îAùF Y„Îzϼ¸¨Ä3T•”'Pà9w©�®ÂcFáC„‡üó«8€!É%ã©Ðé %v÷ÛƒYÈ{ ÓôaÒ0œLàI©°‹è+L¼uò5ÙOÅ éB‚ålC¨G¹ƒðøó¨�Hx}ʾR…›3?…8pÜî^w¶¦áÙ!d(ÜĆ�´G4 Î_IÉšb¾°ÅÍ5 ÍFº¬ Qv?;�¨§($×n³�·í,7§óÛ¿ÀÓ=AñfŸÕ¯>{L æT¬¸W€?…?ûɪ|§¹‹x<›J‡"ˆ!ƒE Ÿô’®m 7#¬„:D¿#ØÊ�Š„1âÕ·ì“Rɘêò@ÓóUì”Eh[�Þ}ì²ì#ü±HâOl.}ðËu÷AQíëC‡+ƒÜåQào¤ššÑˆŒÃ¼‚ô–¡ò‘¡G²`áfPK8�úàQ¾™%ë>"°gر£¢åÛÈI{¤“‰) ‰HDsÒõ5dÕ¨¬òfÚQWb–©Y”’ˆy0iá?ÀµÀN.b0Ñø‘ΈD™6\sΓc‰0oâ=zó{°Üì'´N÷aÊOZ ¦kÞøöÐt!Ql)pÂ’­( ÔW;Å’Ù±ÖIN°ôP _>t™à„ˆU‘ÐaKø@btìRäØ9x´Úcq‘�ú•Ï»HԹƪù8[ƒ…™šÖ9"?J¶Ý)[?l¿vO@ݦ«G¿‚û´éxVª,â…¤¼@ƒØ\ÁžWpy?ç´s¯P›ì’JqXCŸÙÎÑ+4z7�x욎߭¸éÑ1·‰“ßXVUUÀ¬òÁ/"¢:°M é¥ùž–UWSö˯Pö†„‡Ë|iâ#~–ÐU[È>?:¿šGÑáB^TÒ sžÔâŸh¡�=fgÔÃNbMc¤+Ô:¿ÒÑâqñ ëZªv˜zÞ XØ ×ÙþB?í'Q�a�jÛTr²ALáá7cT'®�Öm™ ‡fÇÑÚFP¿±€ÁÍ öªi/NzÀCƒÄ¥Iá »ä,d%¸?|‰;ÎÌî…¯æÍ&�l”AW®Ýð%Oúšv¬ä"‡æ ”Ø¡éÖ¿PÝìZÙyÿC†#*P"¢8 m7U²)Ú³=ù›ú÷?üÇ3�endstream endobj 101 0 obj 4165 endobj 4 0 obj <> /Contents 5 0 R >> endobj 17 0 obj <> /Contents 18 0 R >> endobj 21 0 obj <> /Contents 22 0 R >> endobj 25 0 obj <> /Contents 26 0 R >> endobj 29 0 obj <> /Contents 30 0 R >> endobj 33 0 obj <> /Contents 34 0 R >> endobj 37 0 obj <> /Contents 38 0 R >> endobj 41 0 obj <> /Contents 42 0 R >> endobj 45 0 obj <> /Contents 46 0 R >> endobj 49 0 obj <> /Contents 50 0 R >> endobj 53 0 obj <> /Contents 54 0 R >> endobj 59 0 obj <> /Contents 60 0 R >> endobj 65 0 obj <> /Contents 66 0 R >> endobj 71 0 obj <> /Contents 72 0 R >> endobj 79 0 obj <> /Contents 80 0 R >> endobj 85 0 obj <> /Contents 86 0 R >> endobj 92 0 obj <> /Contents 93 0 R >> endobj 99 0 obj <> /Contents 100 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R 17 0 R 21 0 R 25 0 R 29 0 R 33 0 R 37 0 R 41 0 R 45 0 R 49 0 R 53 0 R 59 0 R 65 0 R 71 0 R 79 0 R 85 0 R 92 0 R 99 0 R ] /Count 18 >> endobj 1 0 obj <> endobj 16 0 obj <> endobj 20 0 obj <> endobj 24 0 obj <> endobj 28 0 obj <> endobj 32 0 obj <> endobj 36 0 obj <> endobj 40 0 obj <> endobj 44 0 obj <> endobj 48 0 obj <> endobj 52 0 obj <> endobj 57 0 obj <> endobj 56 0 obj <>/Length 35486>>stream xœì�Û�ì8r¦QïòFýÞÇ€µCc†8fÌ ;ξ·ÜX7z«ŠU,$.�@\p!ÿO£Ó™L €de’_ðíï¿ÿ,Él, l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ l¬ lÀåíí-ßèt 9Ûy€ŠßŒ°°U—Ü ýœr°­Ž—cL`«.E¥sò<Ø*€Ø*€ lÀx`«.°Uã�­¸pÆ­s•òIZ½ºJÖzRœ+VŒÖá½sûŠxœ mÌ]�ƒ<`w`«.‰›ÒòÊyµ-µØ“®¶Š"({/M‹ÍKßñ–éýÃé^mÏÀvÀV\˜ÉQBù…5uéE–ÙjsPD×* |×çÇ¡KÀÀV\zý’oœšº½Ñ8£o˜ïÂÄVùªJ€-€­¸Ð)ÆÚxPzpªŸ­Öz²š­ vHÓVkïv¶ à"V¨¸p±¼wn•®›oc«âÒ•[€Ý�­¸Ø:âÃmÕ|0ñî`k`«.°UØ*Œ¶ àb8Q½Y·Ë8Å“™˜Ý#.Ùw½Ç`d«‚7û[pizaTµ)YœÂµžÔÚåôD`«MSØ*½dï¨Ëû`}`«.ükè¹oåÔêæm¡jîXk¥i«INâV<Ë*/üPy÷òÈ8ζ¶ Øä à9ÀVû[€ç[ìlžl°°Ux°UÀ~ÀVà9ÀVÀºÀVÀºÀVÀºÀVÀºÀVÀºÀVÀºÀVÀºÀVÀºÀVÀºÀVÀºÀVÀºÀVÀºÀVÀºÀVÀºÀVÀºÀVÀºÀVÀºÀVxÿüç?‰Wÿû¿ÿ{XO€.`«Ü�¢˜þúõë|ðû÷ïëñÅûÆfX-€)ÀVØZL‹mµÉ{•ã8šÅ`´Ì�­°´˜¾?àäGƒÂV9ñ‘£`l€ådL±UN--€.`«ÌÄ*cº‘­rjaÔ€ Ø*ƒp͘ÞÌV1êÀl{1í8ت²Œnl½SØêRµŒ–¶ —š˜: hWaتØV9a´0Ø*º2¦°Õ}kV„Ñ€°Uðt“Ÿò°ÕMk ®£°Uð øbº‚€v†­na«œŠ0ZH€­‚{¢Ì˜®  ]…a««I§kE-àQÀVÁÈÝ4²œÒ¯0luGét­£ÜØ*Ø qÒt§ô+ []ÜçV¬Õ…Ѷ¶ ÖÅꮤ‚òÛ†­näŽëØ*-`:°U°®w%”ß®0lu#wÜËV9ua´W`«`4&kìت´$lõ�W¨ £ˆ�­GüÖØ÷.¿]aØêFîøL[å£�­¯±ï]~»Â°Õ�ܶª©£à�ÀVA71œ¢`«šÂÍ’×èø$~‰ÓÄúÞ¹‘;ÂV½«Ãh¸°U.ooo×ãk§ Û8‹1ËEɪÀV‰’ùßèz5Ï­6ÿ g•Žs#w„­®PF ÀFÀVY¼d¼£Î§Ã6z½«W1 ž‚*°Õ¸X²…¨•Ûª >³9Øê"7­;½:Œ€E€­J(JäF¶Ú›1…­.U¸è¦ü°[­õ„èRÞ¨U[¶µRqÓº[T‡Ñ0ت„�lU?ù)ÀV§Î7«ÏµÕ¨ØŸßÏ-?htIÐVÖô6î[}Hõ -J`«\#J‹;mº­2ÅtMõT¹Ÿ­òÝTÓ'[�<õäí[Uÿζ¿t&¥f7rGØêCªwE€Ñ@[•�KäµÅÕVã X×ün¦‚¬©ž‚*»Ûjþ÷ʃð#O´ÕÌSC$©¹­æ%_úVl‹£³¹#lõ!ÕÍ#ÀhÁc�­J œrpnõ½À‚9¦ÊF¶*Nš.n«%O=‰%•Öê Á‡‡.@ÜH:w4έus5[壷¶*¡©§ÉSتG•em•Nšš{p-YCo«uI½xã�X%>ÛÆl�ÎÊZ\ªâ¦uw¯¾l-ØØ*‹šDCâ§°U�*‹Ø*í¦~Ýèm7.&¶ÕЧV¬ô¯è£ûGsH@sÀG.®(ÐYتwÝÝ«o!¯�­rÉíÏG‘æÛ½ï[u*_+\tÄaYÛ×>$C¹Ÿ©­ÆžZÒÓ¿G’>gíûl{+ av¶ú�ê·‰>?Þ°U0ØêÞÀV�Ê×Ô¤¦°Ãlõ³cù,ûË\ÛÎÔk«%O-4Èëþ—ËvëZ¶Ú¬È×YØêCªß&B€­‚ÙÀV÷¶jU¾˜4õ艸ðkJ5&ñ¿ÆG‚o«lOå�¸¬½°N·UNyâUf~w;ãÜZ7W0Å"Ø*˜ luo`«²òM7™.å.¥T/ÊkšÖZáØª©§æðÞÊV銜ÔìŽÆ¹µn®`Š+D°U0ØêÞÀV™%“-ÍŠëØê÷Cjú|íÒ|±!ÂVK+üÓM à/ÅúÃïßÿ·Yféô«ÈÑYóFçÖݽúm"Ø*˜ luo`«ùƼ䕞ôËÝv©s§d³r�|a-ÚêO½"ÇK±ªZ‰-véô«¨ÔYq»~uw¯~›¶ f[Ý›'ÛjèLšîe«¿¨Kÿ9�øã[è©WüÚ,18‰Ø˜Õ¤Ó£b`¸l¨}`«�`«`6°Õ½YÖVµšå‰¼©G—fÙjOJõ¢}ƒÓ«ÑËV‡{j rÀní¶¿ I§·5zdg·ÖÍLq…¶ f[Ý›1¶*«¥¬ÂÉ›.’.í*L—©jàÙÞW’õ�ãøïü%gO½âϳi®™jÝH:gå8¯º�ÝZ7W0Å"Ø*˜ luoîa«â¤é޶Jþõ5 W;1M–»únÈ/»I´Þõª¸­Æwd#éœn«œ’t�1Ç«Eªß&B€­‚ÙÀV÷fG[%’¦®öÙ[~|áÏKóâIHLÕ{¹•ÀëôüÂÚ±`чt¿ÑéÕ�¤s}[mÖíÕYØê l̶º7[ c/ënªoåv¶ú«²øà]èç{mÈ2¬l•ïÓAw‚Â>4üÔíXq£º´Î½M„[³�­nÏ:­Š§™uì³·üàÂYb5ẔxÜ'A²j?]Áe=©Ö"Ò«Iç.ÆiU7¯¾Wjö6l̶º=³lµ™4�Á}’­^ÔR�MÓåhî:¶j_¾&¬IçŽÆ9Ø{uÖ¶uó&¢ [7¶º=Ãl5ÙÂIµÂV™…ýL®_͵[°vuVã\©¬dQX7’Î�s®®q~f'$©\¤fT,l•Ë»^�¯�6l#Ý1s),Чdp'–k«çÒ§‚lb¨dFù£?W¶UfEnpØê^u§T7ÌÎ®àš°Up`«,Þ�0ÞQçÓa›}ÓH!SL¨§ Ê=lµ?±š�¬B¥_IÀkéSŸº}‘saÝH:w4Ή¶êÔ4_gWpMØ*¸°U ûÚj~œeÖ…­ú–&VšÓ°jµت>`mäC¾‘ŽðA–ØÞF:w4ÎûÙ*§"]`¯ìl€­‚€­JØÅVknº¦z ªìh«¥3™Õ||A„1·BµŠÆœöVÚø2F"Émï"�;玺iR�ˆ°Wv6ÀVÁÀV;¸F”ž;m5[åçM×TOA•-l5ù»üþ\ƒ6>Ùª¡ªê;ã-Y–Sªú5$`#éÜÑa«²ŠÄ«®ÉZ‹°U0ت„Y¹ÕxVŽëÕ¥5«,h«œß ¯…­V�²µU}ÌãÄ/Äo9ãû‚ë÷hVÅÖ�^Ý/?5kÒ‡[ [•°ËH€kª§ Êt[å糋‘WM¬ŠcºÆÑG+¬~ðû÷ÿMþÐü´lÕµÑÝ«OŒÐ¥³`«`:°U °ÕEª ¶UÂM‘×N¬ŠÃ:1‰V]«‹¸ÓU‚É%ZØêª¯¡Wga«`:°U7^Ájë*Þ¶šl!êJm5A¼‚• â޶jîôa½àüž¹˜›”�UwkÝ\Ö5DH>ÉÇqÀVÁ\`«\uw€]ª–/z†&KþøÏqülz|þï�,©¸Êø¤ïÈž¼lìVå�Ÿï¤ì¬º[ëæ¾®i! · ¶º=°UAyNÞT�.åþøOn«×ã*Vk£ÂV«Û»FX9Óea«U¿M„[ [ÝØ*§X²…YËÑVkªJÓ(Æÿ.w™Ÿßm¨†Åé[ý€)¬ÃNŸ—�åm[ëæ ¦¸B„[ [ÝØjq{üT–šZÑV’Š? ’…™ªƒ5yhn »‚ª6#^åëx‡+Vä¸,lu|õÛD°U°°Õí�­òS§+ØjªªÁÎV‰bÄ  ™›�.×E;ë"¶Ú¬B¼ÊÿÐÂV!ÀVÁÀV·çi¶ÊwSe—V·UãŒl©˜²­Æ`Ü1gùº…u [¥+zçe·ÖÍLq…¶ ¶º=÷¶UÚMe¹Ø‰… ªÆÚªw—_¾»ÞÙÙ|5Öjª·ˆt:UÔçe·ÖÍLq…¶ ¶º=7³Õd ᶺ¸tŠ+ŠªEøy\¾c*sÊ©@¥õW~gÎ]¤SS‘¨ë�—ݽúm"Ø*XØêöìk«Å³�Ÿ}ö–7/Ò¹—­ÒÕ —M ÃVM"Ø*XØêöL±UNê¶¿:_UõÕùAf�UÜ�ãØE:ïd«tyâÕÇÉ[F°U°°Õí`«7Õ·"¨[T·+ÎîªÚYý7iHE`«Sª÷ºì ¦¸B„[ [íàÝ ¯Ç×~¶‘è•­Ýt€z ªla«UU Ëϲ—…¼Ê�SÀžê½Â []°ºm^VÐ�e#Ø*XØ*—w)Œ÷ÕùtØFºc)dæMa«â°Uƒ˜S¢¹ +lu»ê2—]Á5a«àÀV…lj«L7­ÕuUÉMŒ·UJUÃÀ5¡†e.Í’1ÜVOšÎú+›ŒØ¶ºfu�¼loü"Ø*Xت�-lµæ¦²ãlµY¸|ÒÒ'V×Y¾´P07Ôw‘˜yk`Õ„õ볬7ÏÕÁVÇWôaẠØ*'°U!—DæcLÛjøV~ÞtŒ­ ª,UžS˜N•­’X5‰ÀŒ)xS±½™0{PA"¬?ž2[ •w�mÔüÎÔTœXw÷êÌ´Ë]j–Ù‡f ª`:°U ±ªέÆrœ°ZâSPe©òÅÂ5=­ÖÛꚪZ ËGáURs“³íØŒh?cO­Ecf—+þÊDöå7§i÷6Õ­"¯r‚ÃVÁ=€­vëã #Â27ÐWYª|ñ<ÁOW7T5ìo«yäfC¹™õFôJ� `ÑA‰8‚¯…Å”«>”$¿¿›ó¶äÛT�ã²°Up`«}4Ÿ°UM•éåÅù¤$òûÓãýüHÿà8КöV‹,°1q®‘Ù%ºbÒ×÷{mž™|ýe8®ºG[·ÖÍõmµY—x•¶ V¶ÚA.ްUÛ*ãËz*6pÆDJ$–¶1ÊeéšÃ²éqè-š>0´ukÝÜÝVé|—…­‚€­rÉŒÖfY9m¤û¶ z ª (Ÿl±:Ñ&¹«ã{û‘”£Å®XxÙaI|Y–”NÇ z>,‘œ¼ïTÐ)‚tLBM‰öÕÍ•]Ó»z|¨<޶ ¦[½°U¢@²E|q¿Y8|»é‘Kê7évŽß,xe¼ØD’d ¼>ÓÝë}ï®oV�9nVoVaOªôÖŠ«k>iŸˆ/Päl]}…úäVÁÀVïÀcm5¯B\Ùï�ß[øø~|Ôm5¼–ù*ÆI.jRe#mÕÃ/ùoað°‡À~§z �‰·�ð[tÇæ˜­«ß '°U°°Õ;ðX[íM�:Ùj¯ª&Å~ÊÇ®@dòÂIêB–ÒëÒPNð1¶*KyêGtU&SéàJJÙÖ.`«°UN`«wà9¶š§N]Ó¥ÍÂñ€“ƒ�X-nÿüÏñõ¯þùH[�÷mî“ovÌ;%âÿUÆ�}9+l¶ À lõÜÆVó*ô•ýÞ&l Ç)Õ‹Ca«×«då#}¼©ÀÉ*U†�yS‹ØÜÂ5ìr ëT¿AN`«``«wà6¶Ú{e¿· Ã\¯XU›ÅŽèÅW[Ñ�Ÿ+«ª¸nÑÑW~³¶}£‡ˆµŠ[F¦Þa«»uà¶ V¶zöµUå•ýÞ^™ϯþ_¶Ú*©B¾Ü�J9\ÒÊt’XÕ¤±›[œˆû5Êù&nm«+¸&lÜØêØÈVm¯ì{—/öÿ¨—?Ô¶z�‰UÇkœd{½ZåõÒö#úwæ5èDƒno«†ƒ_¯ÿy“µòûû�_Hù)óý¥ÛZ7WpMØ*¸ °Õ;°²­&[l¯ì{—ÏÑõÂÇÔÄj!ô©•$¶5AKý’Þ–JI;n£ªq(ïÁ•A œƒ@í%׃ÃRÕ‰`«` `«w`[è© •aåã´ª»Ä*?T³•+š-;¦YÓ´QÝ>±êj½~{¯ù7yÏϘæÅ™—°ê 5KU_$B€­‚5€­Þ�‰¶J_Ù�Á`«Ä@Õ˜c±Üê=vâx…ꊣm±ËÆzE´C™ä� m²’ï´V2&SX{¿­Ä«iƒ­žÀVÁ ÀVïÀ0[Í7ÒAn`«ÁÎAé’Ç«_2£ñ›8¢m#OŒ‡"bvµudO�x;ßê¶H¬Æ/…žw'nèްúbïè‚Lq…¶ Ö¶zül•N�Zµ¢©âm«¯ä¡¶UA(A„#ú·7¦¬b-šI¨$ÎýkEÚDìaÆ'ŒQUÛæxAÛ*]¬ör«¶ Ö¶ÚÇ»^�¯]7l#Ñ++)$ôt€z ªìe«µbñvf(MgŽè_“€½X,Ʊ Þ Ux)Ù¥T•Mß(;BSX'^‹�GiF^Á5a«à6ÀV;x—Âxw�O‡m¤;&“ÂüXLÄyš­þþTÕƒQ’YŒY’MáˆþÕGëÂ*f-ŽI|A�By±ùMQÕ«p�ö¼³Û´°N·Uº@í¥³â ® [·¶*§h–ñKtÉ)¶ª¹²ÿ4[6 ÙÈ�¦ïOh9kW(~‹&1é8úV4ŽÚŽešÜDUÕÔU±ý…lU]Y·ö’÷!×?òÇDÝø¥C�›xmñz’+lÕ/_da«LˆAz€ ¡:°ÕòÏb,?Âý[ëLPô‡ßAdóPÇkØXXa«Ó# ±Ê¶ª¶úz…Uü›Û»qÌì)ÿTÕ ²Õä¥èñ׿G´¥X­¶��>BàuUyn�ðj„&1›AŽì]±V^ß“Y¼i¿Ø¿- `«&`«|`«J`«�à�¶Ê¿¸Ï�oe«I±èñ׿Åjµí|<"èc†ÒGð X udzûÐŒÐm"GÅVÃëvØê:`«|`«J`«�à ¶ZÔSÃ.]ª&ÊTÕ¤üY¥VíX@æòú˜†qL‚ä1‹�{ƒÙN̼"]˜ŽÙ-KDÖs�6Ÿ¼ôKôí~‰[…­Ž¶ª¶úni«œì©‡­&VóòGeõ c ™+FЇ]*³¼Ùh¤Y%¯È§ØD3TíÕ£þÀ�£ÇVç°ÂV§G€­òØê°)ÚÍyÛ+ô¶úÖœh%kâzÌ©»…­Æªš½ôó€ŽjÈ+;ëydqÌb™#zp¼>µm�¨?8¢tùfgè8ŽV¯Š¯þš§›+˜â `«|zmuØò—Í51é lõ¬i«œ*¿²eÿ\…¸V~À0€bÅbœŽÐ¯µd9”Á•Õ ƒÆ<ȧޭMËb•8²htäüÕbØêô°U>Ì{¤×¤k¢­ÒodXO`«�`#[¥¯ï{§o'Ú*]+~U¦°‡sòR_S×6ˆG@q«˜„ªEð‹¿J´D·…­šD€­ò)ÙjîWUé‚­ÂVÁʶšli¦Z×·Õ^zmµV §E Ƕª�àSĤu«Pt„#ú×6òU€(ö+»ù\Líë[5‰[å#³Õ+{Ýlh–­&=)¾;Ø*в”­rfGYõʤ|¬ª¡%Ž—½†ƤƒäÑ8ÑžXW4ŒàPǪ&¡8Žè_Û°Y’ Y+˜âtá°Õnœ[½¶ÀV�–¹¶Jèé¬\iWy×aa†­ÖúPÚþó ÙN«Z¶œbj‚˜tÀ*?ÈýköhÙj `UZìt×ÔG€­f/[%2©„DÂV�–Á¶ÊÏž®o«]‰UMUµjTÄöͶڒW×u (ŽcÕ“P‚Gô¯2ìE#Ê÷ +qdàˆìt×ÔG€­f/[e¾Ž_ÂVAÞ¶*¾¸3[õH¬ÊÂNŒÐÛÖ-‰ðº�¶êJ�®È {£ËÚ*]«¸] ¶ú(zmud•–ÂZfIØ*èÀÜV‹z:`bÖâ¶Ú GUMÝÂVóíÑc¢:TÕ7”&Èý+ŽyDÿ#èV[Õ?ÍK¶:˜’­¨•‰-vÌÆ¤óI�¼ÿùvÛžÀV�¡ÿêI =/iøñJÚÕ{ä¯ÖÊü÷³ÕDUƒÝEù8šwbUÄJ@Å%�ï®U×5‰cÕ“Pú!sÖÞ˜ÏVÏ’Ìïû0Õ»ñ4¯[í¡y…ÐÀV-i汃ç:tÇ™liFx¸­r¼30 ±ª2ÝVØHŸªzcǪ&¡ôâPWÀ®˜GO-f†uzbòÓ¼lµتت#ÛÙªxøéUýN¶j’X}½œ�Ö½«­ò«ŒïX�QFö‰U« Ê€WNÝcˆí¹Êâ.Ó¼lµتت#ùÔ¹ÚðäY¶JèéõTY>Þ9§Ót¥ “Å2|Î$È�m•°´¥�”%^íéÀB¶ª�`óªB×�_ò¸dX]Áp\lu0°U%°UG´U~ö¶úëÏ?^ø%L»GRãÂcluV„f­ÞšU´¢ÑŠâؼ“8&A’€¡?æU<êÕã?Áûcú‹¿©­Õk"Kdpa«#�­*�­zQ\“lŒ­Ö&ϵ¥ÆTPþëQñ“_wÖ+ùÊlèÞ‰UfÅ-«â8¯òĬ¸PbÕ*H0ôÇ<^+òÿF¿~ÿª¾t;[%JÖ^‚­Ž¶ª¶êBs}²EF<ÊVe˼$V/ÞmõÜÏooÉ)³Wtž`«ÍºKÙª­ªæ£ÇDÝ…lU¡3ô‡=¢*G�­†º°>ÇV‰Ä«Ìà°U>°U%°U{š™N½˜ÂV•Uj#"ÎÂeU ‘­†aˆlUY_Ý)'£œmùú× y»P&Aò€‚°q•£ÇVÏ¿EQXW�Å•;ÀW[å[U[5¦±C‘[ÕUÑ4‘'Pk…‰ÕxKé²o~ùÝm•®îçÁ£É~ºÔ_’õ¶z•/ ë\Yœ.»âÉQ¶Ê¶ª¶jIíîq�}ï°B•®òµj3>×VwöU£lµaz¯<¢™û7'Ú‘=öÀ:H-foð¸bèü®…аÂV1Ëj0°U%°ÕGp[¥«õ´[pkŸù¢­^ÛÙÚú4U­AbÕªõÔµœÃ'±* U°Õãåñ?Ö +l¶:�­z\€•]ª]¡'°ÕGp3[�Ÿ6«÷Ùjm~U¨� ¾#™¹v�ha«ühbV5 ŸÛËmäk%Å$™=¹ÞHò¦4» ¶j!ÀV{èµU�É-²i0‹ô¶ú¶¶Õ|vªãPW[[MJ~òL[MB-¢ª¶ÑV¶Uº ùªGÅV�´X¹5+[�Ó«°U}¨jÌeÑkÒ5ÑVé lõlg«Äõ}߉Yœµ«8Û+oÿì( [Í"›tib(¿¶>NPÐÀ‘Ùj-x³?ùÓΞ| +l¶:˜‚­~\ðxå8`«µžÀVÁú¶Ê¿¾ïg«Ý‰Ub{-HD+§5ß`l³˜q@~äÜP�hª�²{+Øê }è Ò›‹=J™Ô®~ÚêUýhÝš•¶`«�˜Øj(�ìc«W»~�ÂVÁжÚ;üTÖJWyÇaÅò¥+AÊìcm‘Äj�ŽLçP‹™?Y¦ÖðÝ=ÇV›Õ›/õ6‘—×ìíëq_Ö&°Õ[íDc«±ª"·Zîlõ6ô «‡­æ×÷dpW±UfaRa{YÍVC”-nÏ3»$ÐÖE4Ѫ«Å!N·Õ+½*VØj€­v"¶Õ¸âÈ OçÓZ`«À‹)¶ÚL ®c«”ª†�¶Z,ÍЪ�¤k·²­2 µ«K5î�Ó«]­$Udý¼$5vV�°®`Š+D€­v!³UŽÀ!·`«wb€­çå¥dUV±Õ^v[gºK%a“]u9µšM,¢‰«%De«¡þñh^#šnŠ+D€­v!°ÕÜϦØêÈ„.l8ÚªxjW+â*œòK'V5\q2—œ}´ŠÜ[·è%H¬zÇ¡N±Õ$¥š¼D_º�_J¸GØj[-_ô/¾ô–ͲrÚ˜t~L£DO`«OÁÐV =õTêÚDÃV‹,•XÄi �]ÐV•š^ß °UA4Á¯Ž\1ejͺCZ,Ÿ\¶:˜æv@[5f…Ÿ µŽ‰%�Ÿ=…­ªJjªXµ[gºé]ÊÜYç¾�5ãp¶UNj–)¬�1@ÿ‚øÁ?Ý5a«ƒ�­*�­Z²ÈðŽZßz%ïz̯¸£­JT5ì�[UÉ«“.Û‹@ŒLtêŠ0×ðžœX´¥±U~Ýs£áhû¢Å¾×]Á5a«ƒ�­*�­:RܹËÚjž@]A%4±\bU\Ë6ˆ“ŽW†ÒrÌÃ$·Ûª‰ûεÕ­—í!¶Z«^Üî}ä4�[í¶ª¶êÈâ¶Ú¼¾¿‚Jz7±bbÕ*¾&ˆ·ª_ú¦fær©0]U C� h®ví¾„Sñçqô;Êp¼3B—ÅÂV·¶ª¶êÈ‚¶Úu}ºJhâg‡L™³ï|/[MŠ‘Øú¥ØYe†Wö$)kÚj3Ú ¶šJjBýbÔ`S´šÚ¥éC­°U>°U%°U/UÍ_5_–¬Ö«ÕTRPŶüŸþ:¤ûŒþäó­ ì–n—p!¾(Ìyɤ|ˆ´øª[Sg¿> ʼn6ÆVk¾6¶¾ã‹Øj-Bí%þ˜ZØêH`«J`«.ЪšXaÜjÎímõRÕ„w-¢"Þ~€U c6ë2ü•#7ÅŠµÂ|ßJ"ÓÒÜÜ"ë�­ªr¶ÕB±æG±>`[%dº¸=.¯ï@€­v[U[µ§©ªµ§°Õ‘åß·—/Òªœ«šŠVAO¬ò«�(“¬übI[Q«ÅÜ4±*h±ËVÛnÊù8mk«D•âvqO`«]ÀV•ÀV�á¨j¾¶: |r°ªjx@nõ¶Ú RÑY*!—•! ®õ+Õ0q_M¨+Èâ¶Z«r$#PO®ÉRÄ”>Ž­¾—)67µÕZu±ÅÂV»€­*�­Z’=Í2ߘ^ðîá¶JÌ*+˜o«w�bµÂÈ£9^ôÕ|eî–Ó:G¬™qôýéŠfh«ÿÉÿ¬ô߶ʹgJËba«]ÀV•ÀVŸÂsl51ÔbùEUÕ*þ jhsî>9åµx)ùÛk/‹â¸£­­; ŽcÛ+ÛF«¶Z™Ñ¯µÕPÖ鮩� ©~`�〭òØê:·Æ\¡'°Õ§pc[ýE.Ë´ÕUÍ“j½9=Ómõ!ÃÕCôy (‡p ‡lꇄŠf«?�_RØ*fY §×V=† Ê.ÒØêS¸™­—ø9ñk«$”¯ ÃVÇœ¾Oâ '¿þ¶É3¯¯Ä¹Ï#M»R­†¶Úª·Ý4—L Nå_èg–y=xNwM}Øêx˜ MÖ¤«èsµÈ®Ó``«À—Ým•N vÅgªj‘Ÿ#ŒÓWcº™ÁV9¡Bÿí$2 6m¦Z§$VeMÇãtÓÄ6ñ´l¶:–ܽެÌ[…­‚mµ˜@Õ�Ûja}úÕÄNd5[�¾Cl£‘÷8l…íõÂZä]lµãº¿‡­†a½�kÂVÇch«W^öš±=ÞVCiŒ)l°‹­6/ñ+mU™X-_ò­aL_ím@À ‰LÀ+ìÃhœ!•¯§ÉfSåg à”yõzQÜuÉæŸ¶ [‹ÆVAŒç$ ·Zë r«À…•m5~Ú¬¾”­^Û?¸Æ2¶F1¾ H ÑLOdÚÆœ¾O CÉêV>?b˼R­«µò©¡ÆÌµÕð#¬ÓeqzN`«]ˆm5®8rÂÓù´æ‹°UàÅR¶*„*èU\^£ª¡u‚+HóŠdo•f@تG}(«n¼®ŸuÑ+‹âºÅhâ9þ”¡Æ4mµk÷ÂVa«c‘Ù*GàÆäV§÷¶úæÚ*¡§úq¨üò‰ÕøUr]£O8W�•_ºtÊ*àjªªŒfk«Åí$¹¡«Ø^Ö§‚+³¡Ãl5| ëtYœÞ�Øj[Íýl–­®ÐØêSo«Í¨²VÄ彫¹­‹¥ä1'lÕ5Úô·S×YŽ­ê×x™,ÕûFˆò²U`«  ª½äîU,_j/¾”ÏmrÚHtuJO`«Oa˜­^�™uo`«Ϭúƒì«7Ý¥lcN×;ÃhÞ‰Ue(ÆèØš¿ÖTµ°1¹ô°�­~·[…­öBËh[} N¶ú+»—´·O±U'U­5Ѻ¢[?1/e«ú€°ÕéqH‹M¤zڼРømGЇjƒ­~[í¶ª¶ú m•H XF@VÞ)±*›ŽÌl¢™K¢te5[]MV{;ú¿NŽyv“Ye¤­†ê×�\‚­>تت=ÃsÐcMò^‰=’?…¶ê¿+ÎËù”â–¶ºHbÕ°' Æ £~­`«õÜj~¡é$/ [} °U%°UcF.‡ÆŸ.úmU05¬j«NΓlt2™®°¬L�Õù^ЕÁ¬‚˜D[Ð2Ÿl«ÌZÙï¿¿?§‡‰�¥°Õ§[U[õe[ aM u€z ªŒ·UŽªÖŠišDfž°Ç ëŠw« úh *¦aœa»ÅêW¿J$©Éf¥nÖ^â„…­îlU lÕ—Åm•¾Ä[UŽ Ø*3¸ì|]fº&®¦eÊh«½Ø*§ÊÛy—Ëò+bÛ£�`œá°Õ�­*�­ú² ­ò/ñßÃV=r«¶ªÊ¬nb´Ìº�Y\âlÁ*ˆI´5-Ó*Î�lõe2@£A™ðÉLÑv8lu<°U%°UG®�;宵^-5UPezn•™jÇ—fS —M˜˜Œ„­Ž‰s[­_ñ_ÄV‹øóºÌû[í¶ª¶êE¼g—Ê­òß‚80`Ž?³ðŸ¿þ w¹U s*ÕHS4<_›Ô¥£}iÀßÑ}í9-ÝÉV »±Ún‰'! bN·ÕodQeÂ:à:~3 [lU lÕÎína«Ê›˜n«},uíÁ²«e•ÑV{;q¶³Õú˜T~ÔemµV«¸]ÖØj/°U%°U{ò} [µm…_å:@›¨ä:yMÛÑëH]•&äpeË´Š3ÝV9ÑØcR»B.åA6"¶Ú‹ÀVé%Õ“ë·yIõÛWXE¶jL>`ôºšlqÚH÷í ¶j|¡2ô;ÿt<þ*|^Ks-t[%"¼|«âAñFó~X\Ù2­â,k«õËý°Uº@qûU ¶ÚK¯­r¦¦øMŒiödÊlØêS¸«­ÖÖáʇô:뚉ÕZ]f¨Øôb•Î:k\%•— ³ßØR–é4ˆvŒ­ÒU’ߦŸèašØÂV‰Šçƒã8`«]0gBפk¢­{R,[6ôÚjXrŽàÝ öÏ?ã;CçTŸÕ«yõf/ˆ,¤GZt|„gX×*gTnP¯£nÕ™aAº†ÀžVø›)Æc«ä<ª)¶zuŠ›îšúØj?[å_”÷¶Õ|#l8²‚­ÊÆ¡ò›8U5ô (’T'œu[  ®SÍ ¢ ˜úë"ïj_[e N…­ë@€­öÓÌ’žÄ—Úk/åãÂV‰®ÆCWm%z[}³lU?•_ÞÉV¿øÌó2Šñ ¶ZIÖulj[M*jåuµý2ÌV³dªáÀfyØjØj/´l�&°Õ1ÌV“-Êq¨üò—ª�­rêט"!š8V騥lj[¥³€ü]º)Wp»/—÷°«Ýô’\ék¶:¦¶ÚlU lõA¸ÚªxjW+tyßÄ*£p®°N^­B‰#¨'¸XuÆ#ˆILÍ¥Šæ½­l«¤¡ò™e«ç;à*a«¶ª¶ú ÌmÕdª J±¼Ubµ·:]˜ð×鶪ìÀ")L� &1=þ¾ªÞ¹k�*~Ó5¶ [ÝتØêƒ0±UóA¨‚*®¶Ú[WP>ߨüžÍÒ©|¯2Ú‚¶:8oݪ# ;¦7õûæòoC¿ô°UN£Eˆ±õ°Õ[U[u„˜8f*_Þ™Gv]å”­Z5T»Ã–þTêQ1�& ·_eÀçUœþTµádË[ÛêϯµïHñq)Á>�Ÿ°Õg[U[õâôȉ7~(v©k*ÀõØj¾U•bÆ7Ypj/[%Ê·›ŒµD¥³®™XÇœn«D�‚Èš(^i¼‚þ:{Wùa¶úõi%ŸØj‘šÂrz™k«PU°U%°Ur›ÜÂVsC ž‚*´­®3hÕµ.ñ*ó[ë‘Î;+lÕ5÷ZvógcP‚ë`Úé¶{ê×–[ ­áUô„ØêvÀV•ÀVÙÂVéê¶:+±ªiK©Ôt¨ÄeM¦ÄT['/ÿZÍžÄ$æR¶*ˆPÍ¿V’´“ëööÍÖV™U^®d_[½­ÖŠåÅIA`«`«J`«Ž4ǭβUþU~تmy}EA¨¢¼Ž'ÊLµ.;hUs)U5 ’�_¿¥­&ƒSËe:ˆeq…�¶*¶ª¶êÈÜÜjíÆnÁy!ëÁ¶š¨jx˜­ âp2¯ÑØÁm%Ã)ˆIØ[Új3Ô˜ñÓ#mõJ¦r~ޱÕbõÁ lUlU lÕ‘-FÐlg«[¨ª²®Iœøüš¿êqŸ°š“)cÂV­bö¶²Õä¢ÿâ¶Z+–o4H`«"¶:l¡æâBt�Duœz[u¶êTå*¿ibUY×$NïM .â�˜Xæ‚:§[ »HÌ¥ludgv �”/NåÛj`ëÄQ§& lUD¯­s†¦Hp®âÜ[u¶êT¶ªŒã±� §³sŠW°UÛnÀV{ËˢуSoc«Å……­ `Õ«�Ä‹ç÷Y"[½ÍYVNé.iæ3-Rå×÷= ˆù¹½È€®?ÅʵúV¨Åñ8VaÐjW¨½l5¶¾Œ6 lg«µ2ùÆ«lU@ÁJcPö²Õ$l˜[­±£­nÑ�æ¸Ø—å�¤�‚­ºa†ZßVsCe~†Ÿf«µŠçƒã8`«½ÀV•=�­>‹Ým5ÿÅ?kŠ•¦¹{Øêô»¼„­.Й5m•Ρ2?ÆÍqÞÉ�ÈoJþD[½@nU€ÆV U-Fö³ÕâøFØ*°gG[ýUºÃÖç³#ú—µÐ Ás­Zu`ØpÎAƒV�"t…ZÇV ¯ò3‹ñÓ«°Õg"¶UZU‹‘M®çSŽ>ÂV�=»Øjn¨¥W�×Í_OÇŒãÜ×V§»23Îi®ç��bÅëà„Īk~¨El5ô`«`«d¶ÚTÕÚSóÜ*1çÄ{LlõY¬l«´¡&å3U=9¾ÿ÷�ùKYŤ®>ÎR¶Ê¿Wñnü4ɨ0�j°ÕÞPÓmµWUƒ�­RXa«ÏD`«U-F6·UæðØ*0c5[åjVë(½r¼nÿxlr*2©¢¬x›È‚\©V}OèQ³ †i¿.–ÀŒ6×V?¶÷‚­ €­ hæ&OâëûùKÅ�IábÁF¢«„.ûõ¶ú,Ø*§Ö%©×8TU�·§èçfí+‹ËZe–?XÍ®£ÛºÆ!Œ;»”­v- å��®ä¤:æø§u­—°U�AËh[}m•H£:Ûj‘—’°Õ)A4qâQ­ª^ûÆqVت¸Ñ®ZIáäê?lu@تتØê³l«Ì ý=+Xý&s¨ÅíM¾j¹Žs5©kç¶zU¢ÌàIäŸÌníJô2ì‚ô†f«µ»O-b«¡.¬°Õg[U[}cÆ­^�ÙÊ·Õ_u%=D¶zD¶úßÄœž˜}muË\-HoØbªu)[�•èõ¶Õš¤þ€­úG€­ €­*¹‰­ž#só1¹I±®A»·¤×VCÿmúÎÙýNL&VƒÞV³í)š«�sí–¶Ò«Lƒ ßΊašv™S¸oì‡ÇD«Þ2çg£8 jºkÂV§ð@ß°åþ¶šÌ5ã/ˆpK mÕj*¿¼Cbµ·b¡ä°{ ˜Ä™Þ� a’­Æ8y¹B­èlõÚ~Áÿ­¸Œ­ïÿSsVˆ[ð@ß°å¹¶úÌ�ŽÞV“éüœ*½MTÊü˜Xíª˜F ¯ ßÀV§¿‹<‚ùx½ñÔÖÉrZÊ#ˆ ”ÒV“ëa²ËæÚê÷ßýˆþ}aºkÂV§ðLå0䆶z=fÚj×¢_ô²dÅŽ5«»®”–÷G35ðµ>¶ú‹4Ëcž­_}ÁdA l5‰° ­%‹Û¯ïîR‰ÕÞh²¬.<–>Õä·ûùß#ÚVÈ­ëv-Š[Ýت’»Ùj®­1Å{'Rs9�›½Š[Ì;0àžiq�žùL_x uí*ßJ¬†ÅlµX>E9~÷)V&q’k¯†ÂÚÍpHC‚ìé¨Û™gI—rècXSU‹ N9É"¿¼yžz½Z,ð²qâ¨Ó®,l ¨ª f.©vŸh«ôÖ“›Øê²ÀV5U¾U5ÀVûãü°]ãi�mMˆuïZ_Ód,¦¦–¸:½Al«Åsë¬7>ÌV³ÅS�V¤b™�-ýõÿ�? »rØ Vœ�t|تŒÒÉ:/[…­N¶ª©òi«ù† Ç&ƒV•u5Aªåg-ƒåÄ)=)(< Ëh[ý ’oô^Ïk5[ÍfP+[-’+¬ÓÀSöâÖ)W-ت ت²'°U_Ä£”‰þìb«§ª¾â?�ãG½ê�Ī¢b9”¡~ùÅq²UÁœ›æEdoÕ³ªnmº­ úÀ˜A¶ha½T5.�ø«ÕÈWqõKa�〭 ÐØêUwº­ªêÔ=nÇ`«7c/[=ÀVgt -¹×pM|�å]Ó¶ uSÉClõ5—|�eÍÐÕšŒÒi×¼ü‰X:•g‘[•!¶Õ)Wh¯,XÓ½»G·þó*lõfìb«qbõóßÖ«°Õ!­§Õ§§'Úª`É*[©õ¨nm#[�.÷¼/H³X­@ÚÇPijÉWØê,d¶Ê¸1¹Õ¦ª:u¯Ù±¯Wa«7c}[=¯7Å3¾ò4À§·¼Uue»Ê8­[H«gŒl rx}?â¥úaØ×»J[-]î?ÆØª^Rk\òJ{a«³Øjîg³l•¹¶ ÌXÓV“»\‰Õðm«çKQ.áˆ\�™ª˜TW¶«Œ3¬õ¯WÏÉò×VÃI™qül5.`«e²hçƒkuÍúYÊÎhêzÛjërÿ1ÄVÃa…­® 1‰%¦8#%~iüì—bOFvïz ¶ú Ö±ÕÄPã*ñˆÕâ‘=Jµ› PÖÕ™Ûz *úe@W¸$ÝU«k\Áù ö3@ï¬7°UÓ©Ìbµ×ö¯WÍ�õº []Z¶@Øê³˜n«—¤ækþ�[j‰ÕœRªµÉñÈĪUL‚äqÊ1õ=œ)) Éà†ì=²¯_—wN-¡8rø©¸®íä¶ÒúS4Ç([ gzõ<|Y9kr Š8bÃVg[U[}½Âª·Õ$�JW¹«¡e«!Õzr�];i«s[Çù)çɺ¦7yLðoF(dH¥4«ó£9U7üKõ«jð·Õø¥#ݤtÖä8 []تØêãc«ñSNõ³~bõ$/#J¸ò9`« Äy©Kè�àZ¼Ubµ3Nô³Ù·b~À}mõómnc„šeˆÇõjñ¨%sÖâ1¶º °U%°ÕÇáj«µ ýÌVº«t™RÂõPË–8‚¾iMœ¹­{‰ãäÑŽR±b„2ƒ×FMfJuõAÐNªuG[}M©n#ÚébīۉŸâœ#§ luM`«J`«�ÃÜVó ý²t쵺깅9 €œqûV&ǃmÕ$È”8]-qy:“j¾¾iPÌ‹ØÑÜ^¶ZºôL²U¢ÀÑ<¸u%Y‰ °Õ�­*�­>[¥‡¢ŠðU•Yæµü?³³ÈQ*XãØSU­:`dJœ®�Lz¼”Î6šxu‚PM1¥3½ƒ†É!ªÇJCW?¶$£KéëBâßê°Õ5�­*�­>�­2/ô ˆñˆÕà`«µKfd¥#{zJµW4‰3·õEâð K~l1W:Ûhú; h‘5éŒ`/éEyMùf±b��-L[½ „гrê6糊�­Ê€­*�­ú¹‰™ëº¾Å¦5K÷3«ÈF\O=r«½Ô]öèŒtÀV­ãôa–¯;WU«!ºËÀøÎððJlTh�•´{$Üûð•;+óØ[] تت#§GÖî qÝøaÀ~“Ö»–îÒ)SüòIb5XÛj¼Ð•XpãÅ ¢Í£ê[µŽ#©R+sˆ—Ðb21±š‡ ê[aÚj=�z,o«_Åj3«zGÞçÊK”‡­®lU lÕ‹¢M^/…%mµx¡Ì�WeY‡®b—³Z­¸æzìo«&AæÆáT)–É7¦eæÞæT_Ý<šÞV×ú�…mõƒæ¬ÿþ‘÷v [] تت/ùþM,sº­6/ôËŽnüZ®‰Õ›ü¯¿Â¿ÿÈ_2Y,&më‡#zp¤E…ÈB™tÀ$Èô8ÍZŵZÇë_9eñÕø½£‰—`¯í¬g«_Û‰ùO²ôêul�­î‹ØVó³üõxØxÂa�=�­ú²¦­ÆO9£\m5I¬;[ýRÕ‹wg}}ªœ¤Õhú‡ƒ_±Î�aê8ÍZy¢ 'ZÛ» ¬6 HWÔúäàÕ8&Ùj­äѼ­‰ÀVãñK½óJ ³1°U2[MÆzCÓ"†5J÷¶êKmw�±ÕDL/¼ïeů•,\솤ª2[ ª?@¾~°#°Uuœf­¼@­Š¬I„É­Ž´Õþ‰S1ÍÂ]ѺÊ'%?sÖ3é²UÙüª¤ºÉò‚ °U̳3}–Ÿb«Å7[½smµÖ¥¥lU|iŒ(VPÕP²Õs#ãúšíh×—~¶9¾ÿ=úÛ—Õºq¢bþRWa GÐ{¥Òf(Yò8Ä:µß�×Wk¿ì È/|DßÊÂmTù¶ZÜX›ʽ ôÍû8™/{m§ƒÐÀVeNÖÅ•FJ]`«ÍŽÁVµ$Ÿ³äÕñŸ³Ðo«Ám¢Õ¯ÿù�<»©·Õ²ª†Š­~¿duß,}­˜„z©hxù^tÔ¤K‡ÿÀ•fy}À¯§½7MU]-VüyÒ<ˆ�(l5çò×ã8`«ö²UVÿa«À•ålõ¤' Y¸v‰¯ÞV¿K6'ù¶ÏWs:aÌÎ8Ä­¯d™Vqжié;`íŠPˆ#[öµf«™›–}íU]µš…{ûp¼~ÊG$s[mVùøócj«È­ÊØÚVó�°UàÎ ¶šªê‰h=©—9U†¶õ§c¬Ñ¢BXõs¼J {ðÂk$ÍãäAŽÈùèø&0ŒFG ‚×–}�µ•­§W&µš…{ûp\US�8z'`}ü‡X4šÆÁV¡ªbr÷*kš¢ÇÐAz¬â„’œq‚vÀ$š>B1ŽIXA�®*œÂy™Ÿ§¶ë=s 4¦lv …ç[]تØêãf«çƒüR”j0qQ~#[ Â)e|Ì«²ê¥Í‡8àwue„b´cO[UV§Céƒ "tUá>’bšéSü’ݳ©8 ð]HÀV'[U[}~¶š,(] K¬2 ïe«�+¬ûÚj1”îF²ÁÓV/²S¦T§Céƒ "ôVi–ÿxÕü—¡áÐÕ¾UMºŠØêBÀV•ÀV‡¹­Ó¨åq«J[¥g;ÝÑV×´êª2ö¢¶±¸]Ì…åD6ì€>”>J\¡· ]þã%�Q7&¶*_  ¶º!°U%°ÕÇab«ÉhTV•šª2±šï/^ÀCs[Â*N¬‹;¾üZ«UñPt§Šó€­*bšW!Êüiþc–øz¤ùÝ[Ý ØªØêãÐØjm4*Qåg‹&±j˜75´Õï¹_)�KÀ𠤻Ê'[†ÝCk@œ+”z8AÂÁŽs¬4 À$G\¡·J±üÇ–®›9_ ²UÍ"~±ïÂס¶:تت;ÓoD‘÷§ë€ÕL£Öj½ü¦'«œÕ �àJ[� õïã(–}«l'¬Î˜—,vé½3Ç ™ëAVÕ¼c–MY½Ê$~oMù¯ù‚wüpÞ¶Ú˜ûï<Ñ ¶:تت/§GN¿ÉoÒ¥®)SËN©×[Ð̾º´R°,k!¢f¨5Þe‘S¥è”œgœe$ìyâXÃBÑw7hÝÖëàµ<ÉVMšDèªr\å{×7-be«µ2°ÕÇ[U[u¤h“ÍÞ¶êÂZK£*mU˜XÜ%õ\æ“KÝ^2�ù21µ«ù¯òÇ”Î~ÅÜ)9·N�ß&ÑйÆÜ•`—PWÀÏÿ¼âÇc­Z5!ˆÀ¯òUÌv,�“­¾xªþ¸[Ý ±­®syvnO`«î¬o«ÍѨ£m•sõ¿b™´æ×èù*ém«!Vúbb–ÓPW’uÙA«&¡â˜Ÿÿ=xÅ�;Ú*Gß„ B³Ê׫ÌIT]s[-Ï©‚­>™­®syvzO`«î¬i«ñSÁ”©&?³ÞU5h¯¿çh2¯¹ ¼s˜­†ú} ¯Ó^1 fÈA‘'Øê·Oü“]ãXÆV•Õ™¡ô­"U>¶÷K�h«ÿqº¦[Ý "1CŸâ‹ç÷ Ñì lõ¿TÎíÞàb¯z'Z©lµçÀ*“Âp[}/| e|:¬Í ’5Äð0[=¾·õâÇíš´"ˆ�Wùz*Û=xÉUj�ª“Pý [�HéÔ|d¥ZFgÙj³'°Õ;ÐüxM ÐDl«_÷Ye®?Õ?‡)fM[íª{•¼„’㩲Vè$뚊éd«É–¬Ô=8²WÅ(£)«3Cé[D8’ZÊê`[ýY J¦¤°Õ›bh«Wj@«õ°žÀVÝÉw1çOr[=•èã CU5žzr'[ ßÂÚ›—í*I뚊ik«ük¾¥Í‡ºý¶Z)ÿ�áx•a¶š^ú_ÁV³�U°ÕYXÙjÈ�"·`«&4÷ø�m5œÖÕš/¥WÕp;[ÓJmTÀšŠ9ÅV‹åÉ,‡c‡)VV q"|è½ûÔ"¶Z¢Ú\IÚoèêëÒ(ï_óäö.1]Çvت�‘~Ž˜¤o'ö¤ö4ÝK°U=ù£˜+žlÑo¤»äm«~—ûÿ§ZH}õ?ÆU ïj«×–®Å³øÌõKÛPœÅ*¥-ùF>Êê]¡ômÑ>^r]ÏßÕV…S©èWÅéÕlý¾“ØVó#y®°ÄѶ*f/[m¾Ø*Á0[¥F|¦T5~–[Õ¤–™‹gõò[¥+V^9Ѿ+Šëö†Ò·•GøyªÏëÛÚ*³|{Uh«I�9…•y$'ü¶*¶ªì lõ‰xÛêObõ{BO~�ìºD[Õ7Á�@”‰§vÝãÚ½a�7òj±GO€cC[ý 2X.mþ$S™ÃFý†®2$õ¢ËVs.=޶*£d«h[M*Z]‰e^ž�ÛØêc«ùøÈxþlÕ° ~„fÁ]¯ÖßEl5Ùòýð`8ö±Õ¯º~·¥c«…dêD[ýCÕuÐÓØêr«b8SJlõ‰¸Új’X}i÷L²FÓª¶°Ue'÷²Õwþ÷ÿ˜��`«½¡ ×cì dÍ}U¤ê—²UêŠÿ[}ë[ÝتØêc«å¦_¯°U«V˜ø� ê ëm†¶Þ*ðz|ÿ{˜ô„ª«Å�’Ê1жó¢d¶JMŸ:QÚ*ý*{úTï­ò`«³€­*�­>?[%«Å�V¶*¸e”Spqõ¥lõ*¬Q4تm(õ²Y9‡…­¾¼d²ÚÄE¬XÓ§NØ*oúT×Mì`«³€­*�­>‘¶ZhôóX [uj…AðÞÅ–¶ ­jLqº­æÕG-ûKËÛ.w*¨be«}Ó§‚¿­:ÜÄ.ÀVç[U[}"N¶J�X­Í 0Ö•m•az+o¯Û›whr[]GU›züõà/Ú1fï ¶ÕŽ{P%p¦CImÕ|\lu.°U%°Õ'Òk«�'¬tb¶*.{¤òš`>nøzü_ïÿñï÷ÿ{eµyô¬c«2ó˶ßÿÙÆζ¦ôyŒ­JîAÕURf«=·Mi«PU °U%°Õ'âa«MU •ëx[í-?ÅVkK¤`XÅÏ ¸Yä&qÓ×½Þl€&H¾‘N=ÞólU~ª®’R[å¯NÕ{(ƒ­Î¶ª¶úD mõZ5º¶¨J²êêÍlµvõ\МÀ#s-/V¢KRÓÏóë÷ü�„xHå=«V­›„šµ4Á=lõEÓ•“ý™%{ DYUØêÍ€­*�­>½­^’zn¬%V9ëUmg«]WÏk'�dD{/&nâ§!úL±ˆä)#ÀVW¶UNùörT1ãmµ4÷ßcI>ØêD`«J`«ODl«‰¤^çW1—Vu²Uz¬§ÀVõWÏcœ<²ÁÆV{}Ÿÿ‘Ýbt΄­luî»ÐÄ,Ù¶åûTõÄjYö]©òW`«7¶ª¶:‚uîó{æ³.C •úÅÄ*iUs[=µ’ëIt¦Ö„Fò†yä°VÖÐ^�‡&e81% [ÝÔV»¥º³ˆ9› ¶z3ĶZ«oãsM¶êι÷ã?Fò÷~걑îR󘕤Q‰YVybµ÷Š¿Õ4¦ÜSsjÉΓbݽƦ› lÕ—üo°¸­Ö®õ×l5O¬ r¨[-&AùÖ%mÛy¤k+�#¬z[-üVXÛÕh`«ú¦GÚªvQª®òb[ýöTúÐ[½Db2¦y~�«³Õ¦ÉÔÞ#lu3·Õæµþ`g«ÅIôüIHùô¦ÞᤰU“†ÊÂêd«ñÓO8N³ˆ#®3 @j‹%WãS»>“N¶Ú9› ¶z'òÓtþ ÿ 70dçýaþ[½?kÚj-�Z¤h«MUÍ¥³9‰¾X¬ l•Ä£•‚°zÛj¼ý¿lëýlÕÛ·ø3‡O9áIP˜o«¢ÙT« ]…­j¸¥­^â=�­Ž`®­Ö®8èo¾šØ*í¦„'�ÑAqyØj3H*¬¶¶Êt‚Ol§g™D¸AOÖ´Õ¾ITmU:8ÕÃVƒBXa«¬l5—ÔY¶²a¬°ÕíY3·Úõr[}ß’¤QÅž[5i…į•ao«qሉ÷°�3wøìR¶ZH¦Î²ÕfIÆ=T7º [Õ°—­&IÓ¼'Sòn°Uwîg«ÿóëÞí$^4Jccãmµ« l•äKX‡ `ð×ýç%7SÖyµ [ ÄÊ© Ú*oUn«ù0þ¹¶ªÁÄVó+¥#ý¶zni«áÓNÎÃ1ó6¡D1�EÉêÂV=ZáÞ; ¯=©­VæfÅ4ï�´Bbu…ž ^ìªÂº]êR¶úšO]ÄVã››¼Ik³lOjgت«Üj¾¶`«Vä;ýz\üÍdµ‘î’xÜꩪ¶jÚÖ[5i‚ŽÓ¾k€¤=ëdm<#^ ¶jÒ�Þ9þ?O¬{ª)œMùgÞ…YFo«Å»¥Ðÿš¿ÂV5#°Õ0Êæš lõ¡˜Øj` �kÎï¶:À#Ǵ½ÓU_{"[Õ8®é½ l•]]x÷©é¶ª»+•Gz•¾StSXN=޶*¦yÍÐÀVŠØVªÊ)yo[m�­ÖóL¬vµž)lï‚ â^¬0|Öõ-'N]NáÄÔÍ£jè²UZR/zmõ¹U °U%°Õ‡[…­z4ĺ/k_Këü8<]'±ª åd«ª‰S½…mc––ú/2ÀV™’z[lU lõ¡ÈlU¦ªœÂ°UØj¥¥y¹UAÓ¥õ³Ö±ÕÁ3¥ˆêí%ýW¶Õ(Ÿª–Ê)Ð|5|Ï�ê: ÃV[U[}(J[5_ß¶êí‘cZ‰·Û«LåH^W 0ÝV¹÷� «ÚjvÝ¢­&Ó§`«‹[U[}([•ùUÄ.[e†jö!~*ûu‘l7Ö‰#l­Wa®»Ûj‡¤^,e«õ‹þ&¶Ú,SœAU¼CF, lU lõ¡ÀV7²ÕØ#ÍïÂpÿëõËþGi�•ægàg–ÕO�±¶úï?Î7òÕMë~9ÚNs]ÁVÕ_$Õ5Gîg«Šû¦–aΠòN¯ÂV5ÀV•ÀVJ¯­ŠÇðkÁVó�çƒØ#‰ìʯŸ™¤Ò6'í°f%©~Å)ì.“› È`OÖ!n4:}ŠUWõr&Õ{D‡í"Vv3¨LÊÔ’© °Õ•�­*�­>™­º ¥·tŠëš$>»l•>^Ó›ÚËK}Òå©y»ÅêÅíra•&V �Î:~ðk%áºHb•ŽÐ^Ï[eß1õÂ{è*SUlum`«J`«¥ËV•ªÊ¬»—­6ŸIŽ­*=R�ø³¢­VTõ¥�í¬s§jYßž ˜Úê‹›žØÎšTQÈ’©‹Øêy§@� A°ÕÁÀV•ÀVÊlõ’?å0/Yâ31×b�W�¤_²j…Øî;Yª¥ª/=9i^ _ga�3Biy,>úa?OÆÌ{c«•‘©ÓmU6嶺,°U%°Õ‡Â·Õ1ª*n‚°ÀK_j)Ï®ŽiŸyÖ3ŸÒäí‘cZYßV_ºŒÖû$0´Õ|û+´ŒÊlU;Sêb)[�v�øv©]%»Ê/ýÃVwGl«IÅ·èlrm÷ØØìIq»_O`«s˜ø�» ómU9ÍÈu>S¯J^âX»¾VÌzr"7Û%"ÜÞVƒLXÙ ¢;¡¼—R ?U­Ž ~m\âW¾�þQÈSn”z2ÅVÏœµáj¸]…­j�ÙêyZ�Ïò‰¹¾?õØØìIq»kO`«˜ø�‹ 4�SçªUúñy„Ú5zþ9Ùb’ſt2‘<ØjèVgU QoÓ<ëú‰Uf݈ò­¤\GGL·U¶ª†I¶ª_’ÙÏV¡ªJˆiLóäžÇ DO`«wfe[}7Ôëñyó*[[M} w†lb“^VLŠi‚ÀV ´ÕëéÇ”—¼_û6ÓV“81#/è‹ëÚjÿLÿÀÖ¥lµ·$lu[-]Ò©™"s˜<ä/%`«wcA[½$5Þh¢ªáõb}Ce^ñVIتy+Í&ª È®Å+T5+ÔºÔËR¶:=Îx[UÌôç¶ZN5Ho '+`«c�­*{[�Ã[6ÆtŠ­%õ"¾U/²‹õ�‚­òC­`«g™âìri2aæ÷w±qÖÁ—΄ÚÅVÕ3ýù…5Åâ UMË„­n�¹­ŽqDú-$€­Þ�ñ¹Õ·JB‹8TqTµv¥>H/Ö¶Ufu+É›ë‘cZÛjNr·É|á¡1 ÇμÖ Šij€­¶îAµˆ­“©°Õ{ck«ñF'£8Ÿrô¶z[ �Ûªrš—em•_Q¶ô&�ò YÖ““É,�ÓŠÕ(ÌóÁ{¨Y* [mÓšÝxËè6l«²Éþü’&Sþe‡Çfaút[U"³Õ·¯“Ú�Ì%¾øþÔcã‚=�­ÎaâÏ£¸³lµy�¾ëp¬I|zž�[M‚œ`«ú&â—ÜW]5½?ª Š²¤f²?¿¤`0@q*•¹°ÂV½!“1´ÃͲÕbÉfØêöLüy”tƒ·ØwC©ÁôÙ5«½ØŠë¬êíÜhb+æÉBت²‰ðº3ímÕyâTWyqIýd~I«)ÿ°Õí(œ£‹*¦X 2P`«�ƒøí’<o«§¤†Ïc“UnU³$SŒŸUÀVMZÙñ�Üã/2ÚViÔëØ*gÕ,[=è×�æøUo`«ÊžÀV'° ­Æ’—éÖbúSv�ž©¶°ÕuZÁá7aÛÊ [ÕÍîÿê�›­ò 7W¤º˜e«²•›eÅp/«1ÜØV¯í°Õ»qýaΧþ̵n\�kG«ÜVk—ã¿ß‹ÍY¶ºc+æMä14áÑÊ ¶ÄÂZʤnj«üE©. 5´YŒ?åßÊV™ª`«jö²ÕÄOŠ­�éÝúÏ«°UÞJsë¼ÿÌÅž4�SWÎõ¢ëü [åDÛÎ�ja«ü&l[ÑÚê¿©›Jè©he«q>•Ÿ1åVó›òO/ÏÇTÕ[U³—­rÞB­?N=�­N`î..ñUÍ Us>æÔp¾‡­2òˆŸ‡½�­Ž™È²¿Q±Ì€á§âŠJ[-&S'Új^R<å_i«]ª`«jîg«Ly…­n lÕª.l•ÙЕ„­6k¥æ"CaܨHX‡ÙªÉL~a�­*§üklª:æOÚV“Š±Åšo¤ßBÞÿkL£SO`«ØÈVƒNXa«œh°UfN­ô6Ñ«’صOÂùà_ÿùã=ÿøßÇeº>¥ybõ ¶ÚœD5ÝVÏÊ)ÿb[Mæ`ŠÕ8'e@[�ÃÄŸGq\mU)·´Õ<ྒ2Úô�ð›8…�PÉÀ¶É¼Ñ$r�¢¼ÒŸÞ8ø{u+ac«ü*üT³luü$ª¼LžUÍ''äçتتØês�­6C­�ÉÛ¥•EÞˆ>ñY4Ëó�¡MÆÉŒÌi®H¢×smUP‘9Óÿ]Íœ²*)˜DÅ¡×V™ýý lU lU lõ¹ÀV›¡`«üV˜¯ë±•J&‘õ‰Ïüê¹X%‹}ˆÑDNZ)†Ê·ßÉVódê‚¶šNõË›ÒÅzǪ^¼ŸŽã€­*�­*�­>¦­©°zÛ*F”Ú¶¢TIδ![• I%à$>ó«çzŠÖhœˆvW[­�L]ÊVk“¨¦Øjà�O­�ܪتØêsYÜV›`«V­Ð*Éüð§ ÕèUIfX~‹1†*V²Õ`'¬Sl•žAµˆ­“ýÃX[ýƒq °U=°U%°Õç[mF[ÄV�. 3��0ך­šØä,•´õÈZ̶J(ìv¶z=¦Åqº­žšéºøÑPß�á°Õ¹ÀV•ÀVŸ lµmº­z\@רdb®¹­Ú^@3T¶ÊgÀ²Íå¨b&Ú*�O�áϲâ§W›9TØêt`«J`«Ï…o«A$¬{Ùj1 GâÓ0ëy2q,f¾ñ* [åãj«‚™þÁayÔfáËSm5´XìÅ=´a«s�­*�­>Øj3`séÍ ^È}ß èáÕ‡<$/{[5oâf¶šäS—µÕ$Ÿjž4Í7Š�¶:تØês¹½­*³žù–8àÊYÏ0ÄÀlu™&ºl5,»FŽZ%>yu50ت¸ §VØÄ ¶z=nZã\[e®KuBÛj2µëÒluwˆleÌtGÌKÂVÁñ�˜Áþ¦­^’zÓäVùNI¬‘ǹp�X=Ý*6jeß7r�}Õû.L„U<Ë*°¥:™²4•r²>M*ŠZ{)¶zòtñfl‹8"l¤,h«‰¤ÆÛ{mU™øÌz¾œº‚U˜4´©�åa÷ý‹ÜÒVC§°Ê¥ ÃmU6ÙŸH�6e‘–W¥kêe¶ª§×VCéb)lµú*lÕ•äÏ6×Vk’ÓVóŸôØ;Ø*³¡M ,ëÝʾŽ•mõºî/[”ª«¼²¤l²ÿé©ô‘³w’@²¶º;È­ÊzÂ,[õe®­†×ŸnœÃYl«ùEùà0âó~¶†HÞ˜V¿‘{4áÔÊ‚¶šKêÅ‚¶JL¢j.8å=MªkØ€yë¶jÁ²¶zi@Í`«O'—T×?ÿ›ô&(1ñA³y.„­rÚW�Æ4`«ýñé&®6~¶j;Í¿«¼ ¤l²?ÓSOl/å÷Ê+lu–µÕfoa«Og°­ÖúÐk«Ì³¬áù¸j…•¾•}õ(Žì?ÜÎV9YÏë1¿3œ�îù_ÿú:,üãoJa}«T·�æßUž¿&Àõ¸w²—§ž¸°U[U[}4›Úªët“è¡ÿzWð&ƒUÒOòÂ-T2øï¨çØjs²ÓV{oI¥7WØ*€­*�­>š»Úª&ñi¾ôf±i׬gÜî•„­2›Xð-ld«çÎ’þ´Ëöª›~u}Ø*€­*�­>[íîÉ,̱U“Ägq:'&“aYÏ[ílbëuo[å,žzAت@UƒÅêú°U °U�{[6ox9¥Q°ÕG£±ÕPÍÞáž½)ϼ ¥P&ðÎw^�zëјVÐÄ"Mhœ~eaÕ¬K•l Òá§úÕõa« ×V“òçS��Óe[}4²{Y…ïgómUáÜV=„òêÀîî2¬4±TAz»„mU³.U¾J@P̔ү®1@—Í«ÃVMÈ¥­X,ÎGæ[­¾ [uezÊ�i«ñ7^ð…c«âážtÊS“Ù®÷uç[}^Aa“ÞñW³UýºTɪÎ_×Sl5‰ “WØê È¥­x¶Z¶:�>´­Æ™Ôk ÓVmŸqÊ3 ñÈ1­ÀVŸÓD€­2jé×¥JJ^U'Ú*Q½˜Ù°Ud¶z¥ŸÎí !OxÁVÁ KÙêy Í_ÊçÆæ÷m?qšÞž?6¶úÀ&‚¿Jh‚ÿå’Eô…šn«úu©’’ÉÕÿ5m5)?MŽ´°ÕÝØjÈ ·Z}¶:Œl5O¦&+¹x«$luÍV ’ë4AÇ?_=>É_�h«Ìùþ½÷SMbëÛj^+~ [ÝåH?CˆÓ·°UÐf¢­6%õ¢�[ÍN�°U~+°U~+as•d6QÌ}*ã_žZ¬um׫ÀVùë§ž0×ü?i^êbnj3dæ:嶺ËÚ*ÝIØ*xáú3¸~,Þ*“ž‘¶Fyd¸—ä kÅ/~XF%õMñs§Lü²Ù·<>í©1ïe†Ùª`Qª��FÍ ÐDZÝm5OÇOýÞ{€­[­5ʶ:Ÿ7ç(ÝtïQ¬™^…­.ÒDÜÐ škت2÷Y¬Âtʸ@-N|ý�3>`0€fQªø©ìÂú�l5/?5`«F0“Gµ2±$˜oLú9¾Q°ÕÉ4³¡°Õ<2lµ·¡4&©dybî3.YlúúP1c&ÅülµvÑŸc«§§&o'¿2Þd_[TWŽÈëÂVõˆsŠà¶:“1yxº¶¶zƒ¥a”J�¼1­¬ÐD¢h¹« T2T$µ†Sî3ñÔfÓ²°N¹Uzm«—§Ò{€i®�²Õ<ÂõX ¶jlU luù…€kèj²E¿‘èlµØPp¾îi«âÜ'ÑGû8IФ Y†Ò0÷I˜7¿?Åê5ù³º*žé]ôozj‘š¼>ÜVãÉñKœÈ°U`«J`«�Fo«áUXa«]­,e«—JÚ^C�ƒ×,J| =tf=‹ë7å*É x‰Ï¼Ç­’Êišˆ¬±ÕëZÿ…l%ÿðúöõ;á’3Øjí¥øi±lÕتØê£ÙÑV×%©oe[%Vâäô°™ø êܧxþPSz×Й‘›uk�­<5o"ùçï]³ U×ÿ‹x%[O-"ðfëæ€IZqÉøéY ¶jlU lõéô ëD[ =rL+ü&ü®¡ÆJœt»ÄˆO~â“N»ŠçuI}=Ùî”û´µ4z'äÛ™¶Zœ5%¶Õàé©tÌc^§W×D8÷ÏûÞƒ­ê�­*�­>ØêÄVø“Üi™ëm¥W%ˆU øWÒ™ÚÇ¿�ݶI.‘~.U| lK&ë½KPÅl5_6Õp÷öîÂ\·¶U½ì"·jlU lõéèm5DÂú@[õÈz¶P6ÓŸ2• äÉ>ÑåÞħRûj>çwÙ#ýÉé­¬]Í~¨ +ó¾S½«ýç¿LdÝä“ËëÖº []تØêÓ¹·­:©dpÎz†O¥;à} ½Ë¨Ì…ÒÃ#óht+½�Šw³ÊŒìi«É¬)«›£Æ%¯‰ÎO‰*¿Xd^¯º°U[U[}:·´ÕÄùò³—L%óÈS²žDdúÛKQ�M"mÙfæB§ô05ß ¦~Œ@ l[=³ª½Á9²îá©ÅÈ]ò [¶ª¶útfÙª,ëÙ´Õf±ø­’Áb8füT–õTê!UNgz�ŠCÑeæªÜÄŽu)«]ý^Qæ©'®¶šà÷éJb6#7Ͷ lU lõé˜Øjø>dÏ�6Ø'­Úi>(VßäKI^†#^æ¶Çl]¿öWV woõæûUþà´ë¹ScêÞ¶j¢ª'沞GÔÍå¶ ‚ÎVãºÞ÷òˆßuÓ¢°Õ§£´Õëñyd_yÚPhII¯Drb2)ê…“B…ìdl(UÌÓ|o‹¶¾.ûC š Þæ0_ç´÷öP¤W›¶j¥ª|Y'Š " øõ lˆmõT½ëV—®÷f÷ˆß{Cxb?ÀV�ÌVó*5[í½†Nœà•Ó†øåén$Û�D‡nZ™+k]#Ö´[8íäbL}+üý0Ëדv‹_:§ôj²^•Æ×ÚlÔï“#˜­5×V¡ªVäÒV,–K×D[­õ¶ &Ðe«DÉÄV½×ÝìòTå¨x‚ׇ­5T;¹jš“í‡)Ê.ûC â7mU D£{å·ò†¬s«‚±ªN™Ç$ÿ�N¸ä¶z¶šKê[ ¯³£0nxab«â£q¸™#1i¥«Ã]ç9ó]ád�ŘæÖ.8Á3mÆé#ççRô®·Û»4šتfiÕZ·•;œùyëmÔé§Ë…øö°ÕEXÖVãL*fY�q(mU9{4fX‚¤\¬PzÅi&l\URŸ*FfFX»áïŠ$¦ù~.†5ÙáJe§··Wm•ÓaåW[ö7šû¥Î_âË+luzm5Ÿ†5@a«`2[5”Ô‹š7*3³uWÅi¶® ^Œ¬lZ¹Cj'xýïf£†ñ™»‚peäÞv•ff2 KUÅbM‹ÛõkØê ˆsŠà¶z7d¶šl¹ó%@�æOMgÒ4'ë0§uo•¤[WF^ÍÚ‰F(»­Huí æ'Mi«ydÂVͱ²vNXf-ºQWkOè�­[µ¶ª¶z7ô¶š¼z=®îwñ'~‡­î�¼õþD´n™_‹nÝ|oغ#ÑýŽ­+w­ì2ampÕVþéú£[}äòF]=•¼)¯°U+`«J`«7¤kŒÿ+ôfqãDš¢óéýIsJh¶î­’tëÊà]bÑ%�Ú“>[ùz¹« ]Ë[Ùƒô„­}žû':0ìÛmÛŠ¬ÛEs…­Z[U[}:‚¯�‡¶2¯]g5Cs"âø�ÉYÔŸ•èìx^oöY¼ÏMöFñཟ¯¶ZSÕ®>{¢¼Ÿ¸›ïêZ‡ ¿à&}>å¶jlU lõéÈlµ6·±÷(é$O~gôZXCeçDœPm÷‰ŸAæ1=Î낽ÁÜçc¬Ý6~Þg�­ÃU5½ÿ5OÂÊ+¿ÃÓ¿àqXh€ °U%°UÐ ñ¡aš«FR逶a‹1›¶*6oeB¥Øºù®®5dÛŠì¼Î·|}?óv]婨bþX¼h™[uúÔyÍ9AÙž7ü‚מú}ð &ÀV•ÀVA7Ìo]Ñ\=¬Dp“†zûÌï€ÇI}˜¸ûY»¬n^«&”¶øípfŸehïÖdÕ*�ý|õ*”:¯lQÖmΞw=âíêã—£b°'•ÀVA7Ê¡®#Oçšó™‰JÖ:0@ž.uÈ[Wïò!f¼OêìÝÄ$4{£ù®ùÌ´Õ3«:F¡jaÅ­~ð’=ï*îWpÛÝ{ê Ë ìI%°UÐ�ì[ß;îÚ¨<wUgº‹‰¤j: ŒÏ9�?JÜóøú¶ø}îm×vohü©ËVó°†%Ø'œÝîýÁ£·(ƒ;Y{~`‡cY�=©¶ Qü¨u™«¡GOfcr!D¬‚3ËsZwÚ'®âÞüœèÅ]ÖgºÝ?zK^ i«EOmv ÷ƒªÜ'¹Ày{jso‹›¾:ßÕŸf£G}*Ë ìI%°U0Î} ®ÇŃû€ùxsÒtÀDß qWF¦[ôwÁç„©æ;D �šVèæŠMÓ¶úÇ÷·UÐmÎ_Üé+oe�µÈÌ€‚ϼ~‡Uú1Д#论›Ö(³?…Wñ1Vt}W܉ ”Ns͉ß�çòžjØ«’wÀiWñMÚ2‘§\X/Iýûï¿ÂÇ÷ô“¯IüÔõ³MÛª¬Qe‡›}ðþ²ã,?†^[-Þ–Òcc­õP™iç×( l B<Úõzlu¼¾âÐeÁ Þ*dg¬*ir"Oê ”îÀ€âŸöe»¶òtÙê_g¯¿®—ôªJ7mû}çDìùK¯­¨Ùªy˜ò?b�òzHlµú*>ÇOÆö@¦œ›ì¦g‰ €nÚ)Âï€2²Ÿ»›t8éÀ€½]{Ëzqüøá4m¾OâP±§žÚj±çzyÕì�fëc>�¶_üØSO`«ÃÈ¥í_ÿù_I™üï¿W°Õ¤0l,DíwÞÉÄ�ñuº7âL!c’Ÿ?üÎ[ÅžÏ2§® Ø't4‘ùâÎï€É¡?æ{ûø˜|“Jꉉªv}1»>ö®âÎ샦¡bpÍ'?÷ÔØê0`«t£M`«à‹8óm™þàôa…éYæ­0{.0WWw· ^l‹ØíâF5Ÿº~;ÄêGK3~1«Jt†\ù÷*>ù•'6Šƒó£ñ�?¦ü/€ÆVGŠcÞl¬1ZeVºúð6izV°³ñé¶Ù�MÝ�/|‚>ØîÂV͉{nh®ÉÞ>JéÕ<±Êï€Ç‡Ð[ÜÙmý'ßdŸwÂQI©^¬p�b[M†Ã™‹ãÛÏÔɲ¤ÂVÁº$ß¹=²ã§&ç0™61›æïŠ¢”çvî®ì6Ý¿}âê¬ÍωXžjÇÄV›cj»Ý{‡7?‡úàüòÌÖ�öÉ�sajúAþ!Èl•V=sqÌÇ~ж ªl} Ë¿!×ãÁÉ�æÙë®ÚTl´ËÝ=zÛÛA+Ͷ4¤Þºœ�ODØj­u¢bšûDðÙãgF :ã÷!Ì-ÌE`«E›&ŽÈ­0â“Í7W¾�1!lÕŽ6‰ÛÝÚÝ�Oè>h‚ó ó;`µOj¶Ôü\ÂÚ;¹*‰o¸çû„ߺӇÐプǯ]5s!(1ñŸ¯øÒîP|Ÿu°)Ì#uÍ\ýœ©Ö°!~ÏçNÛÝ2Ý݃Z ô¿gèx»;Ñtü’à^Íž‹÷¼É>©½}×/~Ÿ¿ÿù‘é<œX¯ Ø�J`«àž ÊÑM³Ñ']”ÚÄq&qpNÓÉùÛVˆ»\œÙ­qý“Ä$ÞlþR—­ ö sÏ�qw'U¥;¯éÀñšR½Psà`«J`«`ÍK ¶M*Úš«Ø™œä€ß~7Ä ƒ+íÁD¯k}ðs¦¼­ÚMäf´äÍž¶ÊQU«=SÛÛc>‡]?Zñ™å9¨yê‰ìø¶äR†7»Q lŒ¦¹Ǥ~Uû 1WåY–ÎxɺÔÕô)+µ>h"ó£uuÀIkÌwÑJÓVÅú®ñ~ºi?›tÝóœnk:`²[Š =õDs8]m)Àݨ¶ F³�­&¯^�›9ºL/æ)º•b|¥:èOÞM}÷vwº&ñ™…™°¦Ú{÷öÔæ_Ü*8¿§N»å 8æ8¹ÎR†7`…³ÛÖÀVÁh¶¶Õ¤äù v 7ç >]˜Â g":`<‰Y n¢ï²ºÍ¸~é¦M"3?T½0Ü-Åxëûø¥©V8,ßìF%°U0ÂPWø>ï5=+XHƒþü:Å™âÝbnN‚nwÙó¦úGnþÑM"wU¤;àªïÞ;ÿˆ¦ü¯pœ½à¯¦¶ &Ð\jn"ûNÏ ¤@…·s&z·(;`å4µ¿ÅgJôݰ9fç?lwKÒ×}J�7üùt|§T¯-®Þ_ýwšûL`«J`«Ø`8=ËÄ#›©/oa¢û ÞU…Ó¿Ýb¾jñ9/ë€xç4›ði¤; o‚ó¹t ÷Ô?ïY|˜ÖÖ`*�­`ƒáô,ósê€svhu^)L&{†Î~�ɽٚ««¾‹›à4ÝÕqsô'ßäã$ÞùDÝš§žÀVw;P lÓ³B–óÎ0%ço[áGã÷AܼúV< ÞUß ›h¶[Û¢�ߌ)ÞÿV{¦ö“Éoi*تØ�J`«`4w½]Šf-î?-ð°¥f𮠵Ǯú^Ta«{ûÏOû9íoƒŒcÒmiÚïfüÄc lÕåüÝbÝb��+[˜~àóè€rzV°6W�-1“R;æ;›=×÷ÁOâ] >iÂüoÁï<_ÜeñeðóiüêT9˜eåDï_¶ùk¡XÀc#¿Ï®ÀVÁ†} ÖOåwfhM´¥b»Lƒïm¼ÊVŠñ•P~fš­{K¼ëþ¿<õ|ª¼Õú²Ç’‹`±˜8· []¥£ˆy[ûÎלÃÐõ¸™tU%�ø�áysm©Ù‡aOwê NafÌ÷LÒúO­½e“O�0ãcu¹U'ò?Ê¿þ•îÒüCþG„­®ÒQ”¼­zçkÙ¹$Œº@|ƒ|çŽ�×wÃ0ëJš1ùN�†8ý÷¡è©'smãVý€­*�­‚gñ¶Þ�¯5ç§ë±_ÊsÇ|g1iËjßÛ ›4ßD+´)jZïÎÛ'<õ¶zW\m5žü[à>lô%dÖ54W�êM÷¤Þ>èZYâénøe=] ¾™.Ùۺឩývj~ÓMl5�ÞÉ ²²¸ìˆ‰­³-Í¿l0z†–,9·i¾Ó[•ŠÁ9å™Ýð–H~OÄM8|3>§n³õãA|~¼Ï§Í‰;œµÂK‰ËŽ8åVéb°Uv"ùéym¿ÁÇ»yyèzLŸ‰·ÎwòUIÜ ýþ™%ñqðDÈ “ˆ2ƒçT´ýd[÷û�p…Í=`Yj?€·èüÊxØj¾¶ À®ÜûÚV×5¾ëq®,›æ;�ïí†Çþ#ñqüb+J�7Ù3Ä®pýd6[· .¸/¦˜[Ýýwò³O±X­ q -)S¬¥Ü¸°Ups¦Øê°l®ì-xOÏ -ÕPZ‚U>²©Jú&ˆvý$>ˆúÏG*íYÐVí-›|®è¤—9µ]o»7¾5—$Gæ[7g¼­ŽlQ?CËÖ\]%)¸yRsG‰ç4ѤöØÏ#¯ø~YOÎ[Ð|ŽÊTª‘¶¤Âzï+QsÁT[7Çä .nqå#~qÌÓõ¸W\%É*>§u'Uêí¿@˜¤<xª_Äû‡Ù�bJõ¶úp°•ÀVÁýÑO•ímn‹#þF3´<âçÁ�TÉÛã­š ›Î›˜âñ²O…áþ)îÚSO`«;P lcÆgse,>C+Žï—Þ«Ò"ÉN~gÄ Õ‚›üœHþ¸‚êtx|XfLgmÒ ¿{»»v;P l{gse,>C«ßÊ\•31ÙI7j¼+àt•O:0æ§ÔFKS1ÙâØµ#µ øÀVx"«ÍÐ ý#3WWOê팸9ºQ¥…+û¿”Ê;å¶ý’Žâ€MðX`«tC¬«w›/”í ­`a0As]¸Ù eüÌeW7œvÎt•OšÓ‹¸áÒTt¾M¼òÿ%î>âtó„™ V3´‚�$/ ›·’4ç”줛à×%º18ÙIôDßóó&èC’R½P~©Ï/‹þ([Oqº�­&%¯ÇÅ,×HIÚ+ÙÙÛ?ÚõxØŸ i«ú´º ó�RóÔ“/uì¬mÕ0× ÀHnrf`$KÙê€5e»jÅOÇK’U²S™¬í’$×|0½Å¤ fXÙŸÆp;@{ê‰áWìú‚LÌ­Þæ5xøÔÐM|Êi«#ó"&W?Oöº"ln�„$¹z*m«Ê¦•ýçôdŒÊO9NŸeaÛ��,r’LÉ€s€Õ8o’ôóµ}–$M×#~7ôñ9‘Å=`ócþ÷[š €ƒï*û¡çM­Wbsu½"<@�òVlÍUó˜=lóNmÅ—þÇ|wjk†X ‡]ðë€9ø  Áõ ÔÛ‡¿ÅœýÀ4×1W„ýšŒ· é†íþ)öd˜§¶j%ôƒ¿­†÷ŽÂ)ðd`«t³ÔÝ ×L®hÎÄc$)îa®‚·ÀD.¢òúÎäžz2ÞVã-‚Öw€9ø Ð�íè–X-¨îw-˜#‚š>˜¨d-×8>Ùéd®Ç'‚ZÌÎÔ<õdŠ­^•s­pÀ�tºñ8ñ›¾ß8ÅÛÿµÑêZ°,3ÇJ.’ì4é†Õ^":sdw¥J˜e«¡”%D>Üé‹@�[�áƒß¨«Ý¹#\©ý¸ËŒÓÕ� [!švMv*Ç-0뎱ù°ŒÆ‡ ̲€ >èHp=ñ½ë„æÛá›ë07rj% IvÞÀæã&îô]Ø*1qÂ`zïÍs=ÎmÉÕ�Šñm‡uö\sÜ¿?ÊæL¾ µÕ‚ç.éÀ“¹Õ€{3kBÞºþÎo«·âõxŒ§ÒN6wXg³'Ç'š&ºú@ôD߄ըÛû*[Ý.€‡ƒo ;1eB°>…w5'®îg®|•˜«S²3éɰ‹òN6W¯ �‘[`Aðm´l«JŠ|Ï&z¤JtcÊп1N6—÷øå[`Aðm`'f��ÛÝV㗮ǂñ Vn7>Ó*oÁ0ÓYk¢«.§'Ŕꅡ­ò“/ˆfØO¾-lÃÄ3ß^‹g1»´Ú­_½[iWš«á(ØZOhOµÂö7!fY g¹Ó  ÆÜ<ÍF']ñ=-O.=à©®™ÎZ+üŠÌž ú?l€ÀVØ\Ud¢¿|=ž8¬SŸé”UìêÉ€1 Wð1Ÿðü2Âõ_1f�3Û°`nõ®�¥nýVÍtúµÇ|ÿ‹½†hððÝ`'V›eu×ó÷²·~ ³3�q+æãòVÆÒÌ× ^½åwîy¦ز×,+=[Üú5;ÌSéž(»QœJµ©­Škbð-´�­Ò…¯Ç¹´Ý)ÓÉ +îIÑSOFÚêù ¿‰«æk÷ûŽ0|…m´U×v·¾õkpÈtŠƒ0{BxêÉø�Y¬­S:¸À×€m˜;®89zÌ)|ü׿¯¤Ï¶æ:2ÓiØóbOšž °Uvâ± žSþ6š M,„¤ñ¿‘™N×Üð|ÁµU«ÿÈpcðÝ`3&^y/nÙ™ØYÿ{÷¶Ý& D”Oï§÷Á«, d[—±÷“Kc›<9Ò<:T¿ûkŸ‘Î¥ê-©JÞ½îöÎï‹¢"Lz|ö€{¡nL°›PSÅ»¿öélýFËÿ—þ«œÆÞMjì*«!‘è÷WîÖ[ z ÕrÒ*<�3ͽÍç­J«=Õêj™KÞH´íl¿n¬>ouà¹øqÿÑå|˜i®OZÝrV·ö{WË_Þñ!c«U¼Ý½º½Žx:��Ý*€>B×Yæp1 úØ*==g•UÞ¼ÛÝû¥·ÀÙì�ÈÈHY¡¹žiUr�Ò𴺤Àûèø”÷¸xMi¨NY¡¹‹ž[_¯²Zþÿ-딞O„´šÔ×Ç笷€£}æ¶±ÉK„è¯zÒQè�è."Wÿ±Õ!g¿VåøT 7ý�us‘Vo/"ud7 œ´ $p¶Zè!g‡«•z'>ŒÒ*´“¾@´6wÌ*!­Þº˜òT8AÿåØêdw ŽÛ 7žíÄ—¾@O0ö òÜ1«„´zëb9éÖíýå$øž=þhrÿvKöΣ¤/Àô†§œgÏ ?_¿H¢F`%.8?j~²”¥Õ·Ï-ì»bl•tÒ`zÃÓêÙuÎXg]´^šîI­ï4i#°ÕÓê–´ÊÃI«@tÒjÇœ‘hlun·—æ�ÿ<>÷£/;n”V™•D7ü òqÖÇCJè.y(ã4J«æ­Â"­)Œ½‚spWìå"Jn•¬²ZÎÿ"ú´'Àñ¹z�‘´ p#fZ ²åλRKSæF‰œVsq¸€/(7¶×Ü£¥Õá;ð©t; §jÑŹ‚¼›*úœVI«@ä^Fu°H™r»ú^+€Q”9€1WYé`<„´ p#fZí¼ÿSà±T€‘Ój –s¡LXgêŠÜÁª˹€8T€Rc;Xõg9�ê�è ô–scI«÷vSW×í�Khœ6^ݨ>7B­²’�§Qõn„J«O£ÎÜ�VRgn\$ÔÎiõlʬРLL�¸w¶¿sT šzRàr8FÒu‹´ LL�Èám$}m”V�‰)p9œEÒã]Rf"­¤qXs`V qI«i¹,@OÒ*@nR<“�ƒ´ <“�ƒ´ <“�ƒ{YϤÀ¤á°�I«Ä%­¤qÖµÊL`b @æ­ϤÀäpŒ¤ëi˜˜�ÃÛHúÚ(­Sàr8‹¤¯É¬Š90+i �‹Àª˜³RàˆKZ .i€¸¤Uâ’VˆKZ .i€¸¤Uâ’VˆKZ .i€¸¤Uâ’VˆKZ .i€¸¤Uâ’VˆKZ .i€¸¤Uâ’VˆKZ .i€¸¤Uâ’VˆKZ .i€¸þ¹T Ê endstream endobj 58 0 obj <> endobj 63 0 obj <> endobj 62 0 obj <>/Length 35858>>stream xœì½Û™ä8’n‹| F�]ïl F€n1ÚGŒnF‚-@Ô{�G‚~¯™Ì@"p5Ø0�ÿªïË"é0N§—AðÛ_ýpÉ7Ø*p lø¶ ü[~�­¿ÀV€_`«À/°UàØ*ð lø¶ ü[~�­¿ÀV€_`«À/°UàØ*ð lø¶ ü[~�­¿ÀV€_`«À/°UàØ*ð lø¶ ü[~�­¿ÀV€_`«À/°UnÈ·oßÊ�οìWŸWv2ÝKÎw<Ø*7¤4¿õ.8Ëâúß!.`«Ü�ªŠ9÷3Ø*€*°UnlÕ[sØÀV¸!°UoÍ`[à†PÆ­NÝcÔ¹m«SO5[`ªd«'ÕÎWk›ªá£q{¬ªó.(7Æw5þªnl€’¹i_^)YƾƵê)_mõª|µÕz[Uäí“¡Å–%«ï«ó–ûû‡Ò=ú§ g[à†“šukU(©§_XÛ/Pí<ÏV‡ƒ+¦fc »>½ž~I8Ø*7dÖ ‰¶ÊpµVyIìlm”ÎóÒÏËl•®ªýÂp"°UnH?5ØÇɳÕa=ÕAœ¶Úê‰7[eì�¡­¶Þ;ÜØ*7D2Pµ:Š€˜[mUÕµi—[ös‹­²wÈTnnl€"q;b…Ãz$×îuß‘[UÌÐywp'`«ÜØêlça«àØ*7dhQ³ŠC×5v¦Œ“}3±{�KöSï1(Ù*ã Àm€­pC†~6+¯D] ±p«­þSz°ÕáþaØjÿðÞ‘ð§8¶ À ¡_ûŽôÿ {Õz²—Ê2e�¡­vJ¶zBÆ�Ö@IÜNÙjõ]ĶèU•Ý+kÆvÀ�€­ùBx,°UÀÀVà±ÀV[€Ç[l lp°Ux,°UàØ*ð lø¶ ü[~�­¿ÀV€_`«À/°UàØ*ð lø¶ ü[~�­¿ÀV€_`«À/°UàØ*€Êÿ÷—ÿñ�¬ï €ç[Ô)ÝôíííZxO—«á°X*ÀVßé¸iIj«�2Õí°XSÀVxÕ úCûL¡ØjZsj®°XSÀV¸9Ĥiæ”}$¶Ú©³º ¶ À­˜º ŸÛk«­X,<Ø*§2¼ ?¥‰nmµÓ‡r#îl€3`$Mïm«ÕòHÄÀý€­àŽVÒ”ípê…ÝÚj X,œ l€ÍГ¦°Uõ&`±àØ*Kaß`« ›€Å€`«XA™ÖÔN(M+¿½­¶€ÅÀz`«èÀKšÂVUBÖØj'€°U8´ÜÔ�PšV[¥€D,¨[`ÀÔsJý¥iå°UI,¦€­ðÉ]PÁ“PšV[µ�Å@Ø*x4C7µÖ&تJˆCõT �Ål<…© úiØj lÕC,ð`«àžT“¦µé8[½$õõƒkË0Êán¿YHU ‡Âζ îq°©Cmrn«ån¼Ê¤¹Õê®N«r¸ÛoB‰B"p.°Up¼ ú±˜7mre«åÆVøp$@ëUb`«S!쨋œl¸¦Ÿ4uè4Ùj+oJah«­n�Øá'ë9Ä"  ðl8bvö(‡NãÖV‡n:U9ÛV[ªMë§4qï�•Q°XÀz`«`’ úiyoNãÄVyÓ�¶Z é4­ÕÄmB=ò9¶Ú¢Z ˜¶ ”Y3­)/ê¶JÏ›ÞÒV[åË�ýܪ§[ïF¥�HĦ€­êóíÛ·¸wï²�‹>§4�‚­¶ d[Œôt[-Ë÷Ö­zú÷N¹­¶€ÅªÀV•ù0Èt—^«Ë6Z½«OüLkÊ‹òo«}7]�¸%>ÂV[%«Û)á°UI”$ ÀÃ�­*s>­)/Ê•6…ù¼)lÕ®‰~"V«£�#¢,a±<ت2‡Új+iºìdö[­º©�PΖ¸­¶Ê”=tìĨ•�°XnlU™Ô¯q¥m•>ضÊn‚˜7…­ª„¬Ìz¶Þ¸üóe‡å!°Z ÿÀVõ‰7?E§\o«é X‘×ëu-˜z/êt[%º©°K°Õ�M C¦,–ÝʹQn‘ˆÀ?°U[üŒø(àùdv–­vÜÔ�PšV[¥‡”û•ø÷NŸÒ©`±x¶j lÕUC lÃ�PšV[•„ô*ÿÞy�tJlµ ‹`=°Ue²q«×2lÕIC”ò�¼é®.9¬¶ªÒÚŸôpÏ_ðã±°X쀭꓎[-7†MO€­¶Êg–�°Ö&تJˆ7õT é'b% -Ž:+P1 €ØêS€­†%ƒý¥Qå×>|ýàÚ2Œ‚­ª‡0Ždv[ZQg.ˆ­€ÂP¶úži«åIýhmZo«­˜æV‡æ[µ í�Au˜µ$ê¬À]±HÄP¶úž`«7u•+� Y`«oÝqéöŽqòÏÕn÷Ò�ê|°ÕSba±àáÀVŸÂýl•—7u˜ç“g@Ù…yû0pÇ­Ò¶:ˆ’üœ8H:]§E,,<ØêSpn«Ã¨–W9Ô·¶ÚwÓÙs$ÃV[¯¶š Ö?lâö!ZQÄÏâ é<Â8c#°Xp3`«Oá,[¥çü`«ýÂéê0ϺÅV[!ÕFu›¸Mˆu”$ËhÎCࡱÃpX,8ØêSXi«³�t76Ä(¿  -[*…7[-C:oЭGÞÃV«QŒã ¶jËOC`®À!°Õ§À³Õ°äž¶p0¢îd«ÃÔ©]Öv‹­¶J–‰ùBŸêyŠ­¶^*7¦G,lÕ4Vþ [�­>…]¶JÏ›ÂV‡Å²-è'ØjµlU·‰)……­J¢ˆ�òDìl‹wŠ•‡ÃV�O`«ú|HaºWãj¶½UR¸±ß1É™i*oêö$íÄœ¦v¦ug5߯V[/•¯· [eG «Û)_´ãŒ¶ @ lUŸ{Ø*[§b¸Ï“ô.szkß5U?lucÙJ¸Û/Âú(‹ÀÖï y‹‡ÆÊÃa«À'°U}(fI/¹ÆV;gâeç³;Ùj¹±SlU²%ëIù Ý~ÖG- œýª4ê$V[>�­šP'm ZÝb«SY"Ø*%¤“:ÕíR¿pù*luqˆ\•ü{§s[­šþ†TŒÝ[>�­êcá  [Íü8Åç¹ó [íë¾i—`«»š�„L©’ï\,�v͵ŽáwÖez»žÃa«À'°U}()϶Zí˜çó™g[Ͷ O�[l5ö“§Î°ÕÅ!-…õï�Þ¤Ó"°Ü¨õ“Ò.V¥Ø*ð lUØ*/Ê�­Îêé‚.Q ¼ôç_ýöõSV·Õkç¼~pm¡ìOØ*½|¹‘ø¹xþv³£¶Vcé lu`«ú8 Pí˜ç3Ó.[º©µ99Ï­¾Õ†ä¾'¹UŠÜ»Ú‡Ç…P<É¿wžn«­bÕí»lU.»°Uàت sþ;|:€nÔ2[Ͷ¨§·ØêÛü~ûþüëã_ž­†™ìÑ{w$;A˜Ö[+7úüÒI¢¶Êc«Û‰ëF[…ª·ÀVÄ3m•¡§³M¬,O±Õ03Y5u:¤o«ÃV†mÁV§Bb”õ~æ…hKùt`«T�­>ˆ‡Øj_¿tl½­þRÕF¶ÚÙ?ôž0lµÒíöɶ:Ò�RÜϼ�ãWÆÎþÀPlºÚ.lø¶ú îj«Ù–a*ñi¶šVÉ´©Øj«dÙ–bý‰!åF£]}\àöØÖ—kX-lÜØêƒ¸‡­òlf¶IÈb[ý®ª!d¶š"Tá*v¶Z–§x•g)ôR 4ÚÕǺ�~@°UpW`«âD[º©µJ.hBÙV,§ªwº­¶ ”]¢×ÏèÒÍBè�ì,,£-'�gÅj}@¶ [}þmµÜH9•>ÍV¿¬Ç|êŸÉ9 pW[-ËW·÷ÓT>=r™­J¢ßVتulÎøFØ*p lõA8´Õ·îQŠ ±Ë/h¢_¾ŸD¬$VÃCmµZ¾³÷Üzä¶Úz©Ü(Ùá»�¥„÷?#Ø*p lõAl·Õ�x-9ãú·Õ¾Á§…ªj€­N”g$Ù½ò²,J²Ãy-Ê�e‡ÇÏèõzÁV�O`«b½­N¥NŸl«é*}/õlõÏ¿ÞÿýÇlgž`«Õ�þï(­V\…,Ž £ÚG>luYø;r«À+°Õam«ÄS¾¼!I”[•ì¨XySUlU!¤õî|ªçq¶Ú*Pn¼Ž4ØêšpØ*p lÕ ‡_U·ÕNRÐíw½­Ý”!”¿T54mõš¶ªRnlUØ\¹‘þûù8ã„­P¶j‡¦;öZ]¶±Ó+ÉÉi*#èöŒ»ÆVÓÕa,lu}yÅ�þ÷¶jHTØ�¶ @ت 7°Õ)7­†û<ãZtlå¾úÞVÕMk[Þÿýlu}ˆ$HoE²8jA p·óu+‡­·ÀVM8ÑV[Áe§´ƒlµŸ=5íRn«¥ªتÇúO·ßIÔ®Àêv¢ûÂVðlÕŠr8©+[5=wò¢<Ûj¶e˜j5´Õt @hØjøu£lÕmH+èö»#‰rHÉÂÂVplÕ'¹ÕÔ˜3(JùY=]Ð¥_…gl5�xU«'×ÎyýàÚb‘©z‚­¶Êg[ì��µÕVál l?ÀVMpb«Õ޹=«mlåmß•ý©ò¹ª†‘­þXÚju礹UÊiÞÏ><.Ä.[íÇV·Ûýx�ÇÊÃa«À-°U`«¼¨-¹«°õÊþTyjb5ˆr«}w�[§óÀÚÉ՞ؕ?=D%[eÄÚýx�ÇÊÃa«À-°U`«¼¨5§öBlQþË»øÌ›þ²Õߪ£>>^âŒýÓ·ÕaÃV`«³!Õíº;YuVàl¬üç¯]õpØ*p lÕ ‡Ow´ÕjTG¿Ö¤oÕË¿½ecJ7ý«(ðsËûûe‹éjl�Þs†­ö?£ û˜<{äÆÝ�,‰:+P%–§°°UªÀVŸÅ]m5ÛÒ©ä.¶zñ­�ÔÊK¶JÌž®´Õj™²Åúv Ò81Ð.v¸ÿa«T�­>‹{تs­Q/ßPÕ@´UÊ`bOR¦„•·Oè´7)ô’FYÿÞ;.pq¬ü'»é²QØ*ð lõYj«ýÔàTC7²ÕŽª†þHvORØju{Ù FýéGuüé é<ÅV«±<……­‚»[}§Øj_O… �Už•XÍ_% «[­–,7RbÝz¤[m•϶˜~/6º�í°Õ�t&8Dz�7‚­> ·¶:¥§’†Ž+[e”§x•[�tk«eÔÔOتQ,û[U•0œ“ô<Œ;÷Q8±Õ–L,KQþÇ^¢úhÿÕ§Ùjµ@¹Ñ§Gd«­ÙÉ·{Kàq�–ጶ*¶*¶ ~±ËV‰©Ó‡Ûj¹—¸‰Õ¼lµ’mÖàV=]Ùj5¤ÜH¯ä,qtb«­åÆ[[[¿Xf«D=•7ĈòS¾¿—Úªfm5Єõi¶Zìð·¬LYÀ§z:·Õj ý×ÂYâèÙV[Q×Âëõ‚­J€­ �­‚_ÙjõÄãö¤»±|UO[åa«vå‰!Œü+£•-!‹£(�­ÌßzqÜeœ[l5‚ܪتØêÊ{¯ýœm/7žò,+JêÔíI׺ciaöŽêªj Øj^¶ªRnlUØ\¶…÷Mœm¶ faØêðœVy‚‡§oÂV7“~凑m¹V…û�YvÂp{Ò5íEO)•Ë«•b°U£�¾ÂÂVÕé¿`«SÀV…ÌÚjëô½Þ,êgô¶º™Cm•a]e >Oºº+w”¼?‰ÕJ±¡°ÂVµBge«­2ÙÆ7qªEo±òpت�òt\-ÖòØ*lu'}U-7î²ÕþÉuÙYí[zü½mõ-¹'㺽=ÊV˺¿ºýâH¢ÖÒS°Z-î�•‡ÃV…”§ã?‹Óñom%¨žÓé%a«@Df«éKÕ_QËlu*uúp[�ÚWòþŒT5,¶ÕÖÛ¿rWD ƒ­V_ʶÄï¦Ï/Ž$ÊI Ñáê!V[2k«¡6ˆs‹'”¢[}”Æú³oõÍZxQNlµô³©&„o\)±Z)I·Õt´ÞË{c$@U`«ÄÂÙÓ\àmµZ¦º¶ f±È­.ð„¸ñZˆåa«b°ëW…Y£žÏjmµïgËlU/±Z/ÙÖVµCËV‡•Sꦭ–!¦¹@Øj'°ÜhúËA+‡­ Q±Õj�Fâx­.n¶êŠ8ÂV·4t•Ÿò³ûÙjõíOõœn«eÍC ƒ­v^Ͷ¼so'‚­Nšþr�ÇÊÃa«BβÕá�­>…þÐ�[]Þ#}8Û„°ügû_Iž­æcBä'Z‰­V ”õ+§Ôãö®»·­.°ÆÖñ[}&çŽøVëlõ)ô‡†„%síV{õ[méé�àØêòz%¯dhGU›c”Ó:ß»~¹ÑVËòesŠõ¯ ÙõÅ©~.Õd!lÕ"6ÛB¯ ¶z4¥{U‹µÊ˜*ÁЪ÷¶ ~qo[%fOjÊ÷ž‘ÔOrs�¶Zü,Ã?¶²Õ¬|_`«Ã¢Âª´å!p£­Ý`0Š@[2¼¶ úÀVÁ/nf«D=¶ÂQ³Õ”´À°p¨Ûjè «g[­–)»¤Û„0dý¶Ù¨l ¥تJluçÃV�¶*¶ ¾ÀV?¶ZÕS‡1]žX¸! S…oc«eù)ýrxðB£(;¶jKOÁª7Û‚­J€­ �­‚/œe«”ì©C‡0±Õ)Um—¿±­V·§«i‡‡/Ä4J®PSÍ)g«ÕXë`YͰU °U!°Uð…eƒx!ÙJ bª¼Ibµ]þQ¶Z˶xè•0d}T¶…XÉbéôcœº±�ß°Õ½ÀV…ÀVÁ¼Ù*%{ªÒ»¼uV¶Úy²­–!¦¹«»Ú*/ÿ[µ‹þ ‹!°U °U!°Uð…í¶ÚÑÓ5ç3'¶ús?”¡ªí¨–°>ÐV«Û³-±˜Ã#ÍgTëÀ€­ÚÅfá�l تتØ*øÂúièÙÓ{Ûju?&VÛQ°Õ©vâê±¶Ú Ì¶Pê�­*†÷?تتØ*øÂ[¥ë©¤vÔJ[MwEÅ_éuÂVUË CˆG8lµHñWتixüÞ[•[[_°°ÕÖÉ{�s¬i…�‡¤:`«›Ê놴¬ ¶:X=¢`«kÂa«B`«B`«{(ŸºŸ½›m1ÚØé˜üe”[:ÑV«»‚tb¶VÕv lÕ:„’5ÔêÕQ’æ²-¦{òÜXa8TUlUlu?ñ3(Ÿ#ü±j±±ßù9Ã DØeW8·ÕÐVâž¹öÀëÁÇ,cþ�4¢uù÷Îõ¶šE™îÉsc…á°U9 []–½¦´†QÁ2ã_‚­næD[e§4²Jœ;=$.«ÈÙ„ª¶Zî�˜[¥*°Õê«Ù–wî³7ýG™6§¸'é�Þ)6ÀV5˜µÕe>0”„VbI­žÀV7“~žmµŸ2\vbÛî±L¶E·‰‰ÕnìÐV‡)ä÷öH€2¶J,Ÿ®ÒcýÛêzÇͶXNGÇت幸Zl½ÀV ·¶:uj¼½­êÊú ©¶&±Ú�mÙꯣNvlµS-±ògÚjBßoþ½s±­–�ÕcUwž`«TlõÏâ\üÛàÙjÕ%`«·…òÙXü­¾-H68wºœ�j«íðwòEüt[ u0ýy°+D½‰Ö~óï�ÛmµU&Û"ÙŸôvuUÂa«rfm5ÔqîJiU{’°ë^¿c¿^…­š²ÝV«]ò|Š2 é'P{Õ)¿TUû5¼^G”Øjµ@Y?±rJý[BÖ4‘m±;ª×G­‡ìv%�*á°U9÷έ®I®ÁV÷°ñ˜è÷Êó)J·¡ªžîÕ’­¦~if«ïʼny£­–åËæë_²åø§ï:Ø*%vÁ¡( T ‡­Ê9ËVcꔞ|…­ÞØêú³5%{ºQS~u¯ï£q‹znõkm~r«ÃòýO¶Ú‰jí:Ø*/¶ã¯v�Z‡ÃVåœe«ýžÃVŸqtˆÑÆN¯<Ÿ¢x!q™»QS®tæ+ÛÚñQá-Vå¶d¹Ìòz¶Õ²@ÙzýŒ.1BœØjY8Ûbý¦ØQ[±ò£‘Ѩn8lUÎÍl#Àfn`«e®höl½ESb·__·g«yb•(¬E™×ç¿�àLX²Õ²|¶…r=ÓV˨©½[¥®9 Ãa«r*¶Z£UÆ4{5Liyè l|áD[-õTÒÐMy«fUkü,“ª*ak«æ×clµºÃSʰÕVTgïÁVy�Õ/KZ¶z:Ãax l|á[}›¹¾ïÙV[)Õ!ÕòŒJ:! lõ=Ñt»ÏˆRž‘îZÐ+yÈš(áÞƒ­¶Êg[Ö÷9¶ [[[_pk«ÃªbCË4åcáõcË‹+šŒÀ²’¦¶úž¼úJzBib�f[t±{åóëYFMíÀƒlu‹æÆX¶¿ÂV·[[_ðc«U=]sÞ]S>ªjðj«á«°*Úêû×—Òn¼¼záP`«ý¨Î΃¤s¯­V·g[ZÅ`«{�­ �­‚/ìµÕ·ÑõýÛØjøª‰¯IéŒåg;UUQ·Õ÷bcÙ�×Ú‡‡±C؉.Ó^�%Ü{³Ím\[ݱ°ÕíÀV…ÀVÁÛj¶E=©Æ‹2-/WÕP$#gÃ[U•(Újé©�¼T/¯ñÂÙãùá¶ZF-ûƒ°%pol¶e¶*تتØ*ø‚µ­v®ê6$‰²+ÿ–\ý�¼`«-Uítà¥÷˜¥e¶š…ô�öûÙªº5 ¶Ê ŸõWتتØ*Èakç/iç„íölmT¾ªªÁ·­†DXéoó{µ?„¾u:pm/=ÅVËÙŸÇ?;j�Ê÷ál‹Z�c)áý [•[[ÝÉpvܸÝùã¬:?Ü;U=ÁVÓ]ñj„¿Î·Õòÿþ/í9[ü¹Ÿ‰Ñ«rãP)n«e`¶…n½°ÕaȵðþتتØê6ZO[óܳ~ÇØ×.ìNGØj©n­¬j«*¯†©´lµÿ›ä�üh€aB!¬·±Õ²|ÿ«[ý¶:lUlUlu­]„­ª\�»“­¦«¥Ò½Ú±¯£l5ÝÞÚEtO¥´ž–|oxó�ƒlµ,“m�­ÎV÷!lu تتØê6ª»ž²q—­ösi>…€5,OÏß¼Fm½ÜÛjH ôwË”§Ò[O Ç\õClµ ɶPjx¸­V£²-ôJ`«€Ç¬­fcCmX`u£ÅXA‹úg{[ÝFTÉkµ n±Ub.í§ð¢ªå;²Þ*ÿ"´õÒx\*£’©Ø7‚#¾wßoë%JëÕzk«å±—•Qù%É‹:ÅVË@º¿ÂVIn5�]õÕ¢~FO`«Û¸Ä4;·­Þ@xQWyº¬³mõŲÌ2ŠW=¶o«ïo•�E+ÃF~õgªŒQrñ[­–IWß¹W½e«Õéj, [<ˆgÞáø@Øjت!”ObÁPí˜Ûs›õy·“@�­ÿm4b5ø°UJxËV)ž:jú•‰lßk_ÉÂ{í @8g˜Ê²^e[èß…'ÛjY>Û²æ�¤J¬<¶*§f«å‰x0pËXAØêÓ�­z°ÕjEÞ±�»<,º×«õÒÀ«g6ü­HÑÉU5ÔluX>]­~L*ÉÅÛØjE/Øj?�ᯇÚ*TU-[M_Z6Vð[1œ¶ú œü^©vìÞ¶:L Ê;öö}À+-p­~Ùt‚­fÛ¯÷¨â©a^UËpÊÇÔº¤;Œº«­V ¤«Z¿Ùž8ôWØê“áÙ*Eà�[ °UkÊß++7vzµì"ׂ|˜÷ [½HS­/¥a­�Œ:k5ÿÜöö=Aùý=j©jXe«áë§ã'³èÇVËòÙ;Å¿w {O ÛÕ ‡­ª b«Õ:�ÄñZ])¦°U0Ç=l•—Qãõª iÙj$}µW®¨9¨ Ø2[‡¹­�»¬veÝÚjEü69wǽ�A&¯ó²°U¶J¹ŠÜêÏWa«äP[íœPkD´Ú‰eŠ1ý(¦­–¯&‰^‘5²‘´‡Ëmµ,œm1Ê,d«åKÙ¶âÛ²Üe~e,ý`ƒ­žŽŠ­b$@±Ç>_…­>�ƒlõ�v ÿb�&V/Z®G¸¾fƹ¦/UËtº[í‡eϵÕjátuÍûbú±Õj™l‹ð—€06ÀV•¨Ùj…¡Ÿm+èaÔ"lä8·ÕtÕgÒ‹b«DQË ¼h·CÍ*à[•Xf«åKéjú¹?ÖV³�Ùü4lµ•mYöc 6[•3¼¬úÀVAŽ7[¦mˆ­Hʧ!³Ãè´ ¼¦j†­²CØ2qc[­¾”®fÅ`«S�Ë~ ÄÊa«r`«B`« g»­ªŸØîa«YT¶ "ìðõ-¦£~)?xxa+³Ø¸çØjY2Û[•ýˆµÁVåÀV…ÀVAÎ[}£�@å5´ÒVßdƒVÙQ°Õ‹mµÜž®Æ2{{å­­r£QÖœµ1–ñ,Û[ÝlUl䬱UbþIÞ#„ÝIJĪV�Záë[<ÈVËbÙW¿Ÿ¶("`«Äðr#½Bت °U!°U�cg«eÕ•FÈ›€­®i.q–­–åé¿Ü¶䯶ª–[e‡Ó5ÁVU€­ �­‚E[ž†�kÄlÈF[eW+�]ßÜÍlµÜžm‰Å–äb d7—®š¦¨÷ÆZØjµX¶åŠ‚­ª[[݉‡9̪½’œ¨Ê*%ŠÑ�]£|\Þ2hUR­°UPa±­– TÝVf£&®Ù1†LQÎÖôI>�@åN©"ü$[ ÍÁÞ¼��*»±­vl¬óà™¶Z-�®–)Øêv`«B`« Â[�2Tv+ì(ê5Íe¶Z}é"- j«©ªÆµ§XYÔpˆ­fåéòú[-_Ͷ°“Ó”æ,ÇÎ&_;ÀVµ€­ �­‚ ¶ºñb(#JÙVÕUU=ªˆ½T5œf«ÕÁÎmµÜž®fIGŸßI#��œæ5'ÜËöWت°U!°UPAËV‡ T·g߇ÛjTÕP<ãŠ/¬Öªnb«e±tÕç÷E%onv=ÐV«ÛÓÕVý°U-`«B`«›Én ¼vøp£ÅMY¯Ø'�¡¡V£f[áõM±ü÷·I*z”­ÆI²'T(°¬cÄîh«YH¶ÅÈÌüGu‡{ ¶Z-–m¹¢`«ZÀV…ÀV7³qn³~¯ØæžãµZÉÞ¦mb•¨4àçjÊÇKЕՠ4tÕ­­v._„ÝS™:±ÕjÉl l•¾Oú‚­ª[[ÝÌ¡¶Z=G:Ézê¶Òq�Ã$�”ÚN°U•ôê)¶ZHW¯kνs}¦“-¯Ç§06 ·ªlUlu'ôGœy°Õaõ6¶JLßßV«Umì}ÐÅ׬0CÚµÕ²|¶ÅT˲ÕÙµ°ÅCclUتØêN¦­n±U¢·]m«Ù;—¿T5�îR§÷sg ±ªõã¦*©åV§ãàøH–‡˜jÙ¹¶ZHWcá-Ö(ÔMت`«B`«;Yö¤Ýáãw[=ôà‘v­t$†t>£ŒãÜ"�ZÂz[ �¡á´«ê!ºZv[-Ëg[Žx›*á°U-`«B`«ŽèŒð0`ˆÛs|hÈJÿ,Þoå÷ßß~J¾«a*áýzÊ�í_;ML÷I#½ÚÓt5$>�dëbæU¥-aÔÞ@ÆŽ‚­>†­§÷ K¦ *óYv�vz[ulÕ¨¢¡Ò[ùPÕkáû7ë®¶Úª¤6oq4é× OÒa¦*c*>kK?Aâa#ѵØj5»7žc«åötU1a/ T ‡­j1k«­³öÞ›°[ÝXs¶º '#ª;ÝVß&Ç¡NµòÅV/(bGdz­~}éÃ4{TÉÒÆ°™*> þñÇ{ºy6Å8›Bs«žŠßÊáÞx¬­–Ų-Œ?A³�…ÃVµ ÀK³ŒÕÓ4lµÞ1ت5ËréýTÙ+·¶Ú éäPílõÚ—õ$ël5ЄU²'¾ÐO¾~�6Vž­–ÛÓUFî–ÒÊöbT¹7`«�ÀtÕ:¯[Õ¢t¯WQæ5²UÊF;[M_‚­d«C•´B±ÕúÕmSMtRä­*Ês>„ ¾VKªÛjY,]õ©ž+¿•éªúÞ>:0´ÿj]è¦íÃa«Zðl5¦™Ê¡¢éFØ*lõ¡ø·Õ¸LŒU´Õ2±šò+ɺw *Óìlñj_X�ÞPk°ë2[ÍBÒU¢ìÞÉVCWÈ,lì Àa¬nÚžÞîت [ 5yÝ5P�¢’°U°†°.»æ¶>ßµo«aêâuت¸†«üb[Í #}µZÛ½mµ|)]U±± Óö’¦3`«ZGtƉãµJìllc»­v¨ ÎÙ[�¯V |¡,l5í�¼µW;ºËVC’^]l«å«éêûç-\ϱղdºêÜ7†Úoõ°d El¶ªÂY¶Úï|«{°U°�-¶Ú1TaCê¶JQÕÖ•ë_TG¨|éòáMŸ›ƒ’.ϤWa«eátÕOÇvE•)õ¬ì¤0V½Qú![u‚Š­î [~Yi«q™ž˜Ùe«ÄÄj§@*²•{†TÌ.©ïË+U%öa&½ [퇘šÇ¶Ê³±'ÛjY&]MËÃV�PºWµX«L6žuÁÆNç·ô¶ ê˜Úªð: s[­&V‡e¤£]?kiI/UU«Á´2°U•]óØî�*QÕ}[í„d[Ø­ÃVµèË[uÔmµ•CÝk³å)·XýõÕ®ªÎZI»^ ò×¶­Ò»^+V ë–ù¸Ò�KX²Õ²XºúL[-CÒU•¯¶iì–FÓpöƒ­j[[uTlµe¨ý(FCê!}[Nœ?%XÙØ€~Êö ©œ¶'r ê‰Õv1تuHºJ”]ÏÞÉŽJ§vË3mµÜ˜®¶ê‡ª*[[ÝO6~åÚç[Ʀd½â�})†ZF12 ©–'&V;:´fe‡üê ]UÃL×iºëYÙ`€ÛØjv]"}µZ›ïTWÀþn�­VËd[®ت"°U!°Õýx¸Û®Ú«©³{\>â4?U>¾»ÎuölãÞ'¤U}WÕ)æÙjc ‚©úä=ªFÝØVËWÓÕ˜wtî�Ö ØR1»…±ìðk§½^/ت°U!°Õýj«UCõpÎV ©¾»áS¬ä·õ32¬�ªÊ±uf-»¨¨´ÝVCÒ_â1àó˜œ ™º>.ihK”¤¹tuÁn‘ c…áÈ­*[[Ý en3?¶:Ì¡:Œ –SÅÇ—`«›ñsDf½:ÈV‡©¯Ù†ª¶¾ ëz[ fIV»”ð_£gtüU>XÚúïcg•tUˉ7†LE±ß>£-•À•ÍÉw¯]•Ø[UeÖVýd²Zˆ%ï®�­‚ þm•b¨ì†ÒÂQUõºuaô©)f£Ô“¬V’ý�SéTþµÚ¥ð™O]`«Y]Pîa«YÃÏnl«Y,O^a«÷€xgsš]*̃­ÒKÂVÁ |ÚꬡJêÛêÏ•r«w8­©mÈÖŸ¡Ÿº™úëxtï§¡n±Õr{\./ÜÏVË�qY墇mu¨ªŒJ¼ÙjbtÑÜ­­f�³rv{[Íyò [õƒp$ÀbGL3©k„­‚m¬·—Mÿ«Øjh§ñB߃U�Ò�E­Yô­Âç…õi¶š½”®J. Ÿb«åÆtUëË–@‹F‰ò [õÃY¶Úï9l8ÂÔV3Ce\C\o«CU _Ý(»±½o�Šhò’¬‹ÀV!’‹Â‡ÚjY&]eüјjN7pA£o�!ѰU?ÜÌV1`Ù ŒtcJÿ»=ê¶ÚÉ¡ºµUFbµój¶E2ÔõWµâ‡i©Ì-`!¬*¶ZÖCVo¶š…LÉë=lµ IWüõ�niT²‹Ò(ت¥{U‹µÊdãYlÌ:¿½'°ÕúƲ l•Bö·µc¨�¨ÙV,¢ª¶JO¬R '_{•ˆŸP[-qn«åƸ\}õ~¶šEÿÎHš“îj4 çÉ+lU‘§)„:°ÕúÆêMpkúVý‘;cý*í ï’®Ò/tz³Õ«|j9ê¶šEñ¦Äoi"ÝA×Ùj˜VØ*#DëŠùY¶šmOWµô]¸«ÑN8ñ5lUت�§Ûj\&Úê”ÒÕ°ßhZÀtxJÙºnÆå5iÚÊõv¦T•Xf*jè¯ã§žŽº£õˆ�a=ñ«@ßEF¶zíUõ«ç>CØ—ƒÏµÕ²XºÊÖwz‹º±F¶ZKWclUت�GÛj©­)UÛ ]Í¥,S:–6šðc«UC]–õTo¥|;SÈe„!q¶â<Ãû®ˆUA±Þ3SUýñþ‡úÕó#Bè¿*oc«eTººàÏŽ0v�­–QáÇÎ�­*[ò\[½è$SC⚙і T¶¡¦õ¤BYý`¶Ûêðlw–­öߎé UITŒMWyJªn«CýR›ž­–µeƒTÒoÇ…ô½í®¶ÚúlîWÆn±ÕlUتØê„­Vc[IY¹­Vë\o«ô|L8ÁV‰ogAb•U /‡ \\Ÿ°|xk¯J†ú¥Î…¶šÁK¿g«e±lËlµ|)]•¼<¶z`«Bžk«�‹ø¡m«é«e%ÕVˆ]*ó¸êbÚ·ÕR»/¶d=uC¦„;†¤"èßV;eÊ�}…·ûµÊx—˜�_êÖ6¼ÑŠqõÜ•z C÷+sº­–%³-�²U¨ª.°U!°Õ�­–‰U‹q«ýa‰­V]vj´h(žl®’“‚ûQòE÷°-#؃A[‰X"Õv²Õ@H¯Î^=w«žò¯$1Ù|?[-ãò‚ßðòXa8lUت�GÛj(¤3¥•ãÌ ´6v¶WûS6�•�­RB:g”™œÊÏb…µiÁ-V*áÙàE#Ô­ÐÚV?¶È¥¼1³­¬éGµÞõluÖà…- c…á°U]`«Bžh«žÙ8 Ú™í§FJˆúµÚËV?T5�µé[MÝÚªzÇBÈóÊêzÁ0×Cmµ,™®.óν¶Z¾”®²'O5j[Õ¶*¶ê‹þ]F;�ñvjLCâ2ý´jd«n­vbƒÞQiµžmõsñuýïýý­UX.…”ãó¶š…˜~1åQkß x•‡ÃVu�­ �­‚& [ o[¶;m_ƒV¯e£Ä*;ÊI¸J�ù$\–C~üÿ•n4µÕ쥯í¾[´¢¢Õñ {?[-ÓÕ©J`«·�a«­©�ú-ÒXËrg�žÀVA¶ÚJÕX:qZæåÓVå>çÃVÿûë†Wº¢•¦ý¬ùµËVË’I¬Z‘„5¤híì(�Sò [½ <[mÝÄÒÙ¢>DpÙ¸Äá´E°UPg£­¾}½�ߨ•F±´Ì+´éP[ ÂzñÊä’1&8©*­ó»l5 ɶ k8ÚVËòqùQ¶Z¾—Ëb°ÕÛ@œ2règÛmÕ®QØ*`²ØV§Î^Klõõé7ƒ ëA·X¥á.Ó«¯Ì,‰æZ“Ô^µ-aÝu�~˜u»“­¦�ÙÚ÷Ô—tª–lõ6Tlµô«¯7®PTµZ3l<‹¶Êί¬µÕŸSY…š*�;hÕƒ­†º°¾º_ýIñ(¯NT¥Zo¶ZˆËWÉ»Úꬵë6ç90]]ö‰Äæ`«Š0l5}¥?hu�­Æ¦wM[[MŒlu×9˜R xE~m‘ÌåÁVåõtjž ™µÕ¬d¶Ð/ü¥˜s[Í §«S�ÇÙjY ]eÿÑ 6ç'0‹�=`«®æVw� ŸŠœu ¶ ¡h«ýª9¨&VÛü*pâHy=�š'£Ra}‘Uu–JÍUaõs@¶Bè%n`«eù¸¼æ­í ìÇå¶êŠY[퇧�ÄñZ])¦°UÀDn«o£›¥ÊF+Z!„Äj•××1¤¯Ìö[¬Œl•W'lUÒ·–ûÙjÅH9߯VË’éê»xÌ+lU—³lµßsØ*øòy|;ðé�•ùð _U5ÌÛjºú�þÍ@{§JuøüÕDX_°UIHötn«º H‘×»Új˜®2*�­êrôH=�­:"²å ,ûÃþYO‰J÷‡È«­—¾ %ˆºáO²ÕJå÷³Õ¬|ºJ�=ÔVË2qù}ÓhW'±Œ$lU—Š­Öh•Ù›ÆòÐت#βÕÖŸ?Ÿ§í~”^buXø OÛ­¨ÏwôúZðec«eÔ¯XºáÝÃV¿>võõuù¼’…Wu¶ó2WzõצÊ÷ßïýl5‹šý¸½§blkWÀVu�­ �­zÁ­­Î^BòyÚ΢ޒۿ‰ÕÙÂý¨ï[®iPC[^-ž¹ºf0ÀW= Ý­—BÃJ__·÷ÃóWËÁ sõyØÓËgo9¬Ê>î²Õr{\nðlœŠ±×®xÿlUتت JIÝ2„¹Ú7Ÿ'-Þ™>.ÇØBUƒ½­Cò2Zwñ·TÒ"½ÚN vxu§¹­V’…t W*¯Újzt�{IAâ‚q™î»çÚjV&]�¿o2Nyl@nUتت <ØjµWËN?F§á·ÑýÑ2[¥—”GÓa¯Z¶JN ¶x‘½³˜F½FÅrae\@¿“­vd=¨ú:;jesŒD»¼Qa J8lUتØê~ʤ殉*ÊŽj«é…þNÔŽÄ*;ª^¯‡1yÛVzúß×ÿJþ%–oΪª–|e~FO(Æå»Újùj\æí4z[ê�òæò [¶*¶ê äVÙå—kÏ·ÕN™ïÄQ°�0�€.¬„ëû”N¶xµ«v¢^I™¬Ø«<–dàµÕ¬dºú[-·Çeݬ³$P%¶ª lUlÕéç±eZµ²? 2FŒ¨«ülf+m¥¦ªÁÍ U‹ð_�Ù|«’ªºe(Ū53‰-fõ_øóÏï{ãßÿþ#’{$Eãn`«YTºJ÷Ý£m5+“®&j`«¶*¶ zø´ÕÖ…þ©VĉUFy^ˆbx¨%___Ò‚QÛ+±I^O(�¿Z¹<õB×VËWã²DbœÛ꬯³Ûb®lncâY%¶ª lUlôðc«o£û¥¦Zù¬íõõõ×clÕ®~vU/ o&~/“ªj0¶Õ¬dºjjŸmµ|5]Ý•wÜ’æä]6*‡­ê[[=¶Ûj+�*iå?þã÷kõ·ß®‹à¯Ï×_·´* ÖÏ®ª,Ìî %ð{�]¶š…LI̹¶ZŽË±ÕlKºªžx–‡CUÕ�­ �­‚[l•r&S±Õ‹Og �O¬ª4Á¨­ZŒÝ“aà÷W3U½ˆÂºÒV³-q¹õãí¶šFe[LóŽNlµ,�®ÊÏòpت: [Íæ Šw`g[Œ6NõÄ´{ñ%Ø*h²ÒVã2%œÝJUSÂOg}ÍTöº£­ª´¢Õ»'­Àï¯àãã.�„í¶š½š®¾Ž`¹Ÿ­Î*»nsÖ�ŒXbæU½Ý¬Qت.<[í۲ɂˆ­`[M¬m•}AÐÌV_dC¢—”„(†k�·B¯ª_€Ý“jà—{ªüÛjY8.OEg«Ù«éjZòƶš.þ#‚­êB|xdßÏ`«¡lõéXØjõ�Q6 ’ºK20 h»#D1œXƒ¼bU”†(e(�¯ÌM�³Õ4„®/~¼S%Jžt<ÑV³-éªÅ§k†­êRs¯²Ì—kâCA\c«l…­‚uhÙêðüêÇV³íŸ‹¯¯¯¼nªªZm ë!6ÁîI üþoëÃm «s[Ͷ¤«å«>½S¸æzº­–ÒU•O?V[Õ…a«éK45h¶ ö ´Õ·Æýý¨ÙVˆ´T5´m5-�¬½`«²F§êŸ*œÖ=õâ¶ZˆËïâ‰ÞÜF•�Ä|óÍlµ,—ÙŸ~ ‡­ê"Ì­Ú‰élnuWO`«^ø6º?.ØßsWíã„—§®ñ™ÚªDUËòŸ‹/zl•[ùlùÕSÕpS[Í Çå.öÚjöRºšIíb[Ý¢¹A»`«êœe«ô7²¬'°U�œb«­ ýÞÎÜUå‘YáÆ¬×nU�­D¥Å¬v�ýÀŸ/•nJàQM¯2²’ÞŽù~ùþ¼™­fQéªÝÅy 0¶><Âa«ê`$€°'°U�T?¹ô¥~IS[¥œÈ½�¹-«�W?_Éæ×Sm5V%¬° ÿ¹:;2uXà²ÕjRªÿËÍÕ1O/_¾Á{ÛjE—×ãlU˜{†­ªSž|«ÅZe´FýñÆzè lÕÙH‘oË﹫vé}~Â?WgnëÄj§X±íÅmóµp€V‹iUA¯ÿ?ë!þÆ`kf«)�/‚«c^R>]5mKeÔœîç+ Ü{í„×ë[Õex¶}`«Ù˜i¯öÇái˜ÒWUFb•õ9Îõ¿‹„+‘×r[UiT¥ž/±º‰ðj�Ž­¦¼¹«Ík"�šú™z³Œl&îaù€×�±¹U`«B`«Ù5Š¹Ú“5ç‹�·ö“«$h ¨%_#¯¯Ë¯z© •(¶K¬ªR&}jïӎܨ~4 R’þm5Û˜®V ÜÉVËÀ¸¼à#Ø`«ÀV…ÀV=[e‡¤' U ¬¯v[Ûüšª¤ˆ� g„´*yQ’ÊŒ[ø)0Ò«³¶Ú÷_÷¯;d«e™¸±÷¶Õêç,([½°U!°U8¹ç®Ú±#lõ­6;�úˆÕ`pW=œüHØ*/Ë©£úáy ì½± ½ª>ƒUÇ\�¶Õ¬|\^ðÅgGöß>l\ÀV…ÀV½àáž»j¯<Ûj\.c‡#V¯…ê©e«ÙÆbr¨/®tò¿„È/å§X¤W¿Øê¿þ÷Zxÿ¯O5ÁÈGÞÆVÓ¨ÙA7°Õ¬XºÊû”gU� °U`«B`« ‡C[%&rZ¶zyjœ=>MXïô_i«‚ù‚ýD§eCßiÍÌ¿ÑV‡�¥°ZØjV>]¥üÎmµÜ—[¹ç;Ùj•®®I<ËclÕØªØ*èáÄV«ç¼áµ¹êcŠâUõÎmO’)<…åÕ¦ÐzµŸwð“r?·ú|Fzõc¿ýíOk[ÍBˆ¿Á޳լ@\¦|‹%mù œ2[½°U!°UÐc¯­¾ÕF£[yûŸÿø¹ô¯ßÂgª/|•*â ÿtëTµËVËJhÏÜ"Áz·éÕrèê‚4XóÖêêÊV³Âé겤£Ÿ@Ê€­Þ تØ*è±ÞVé釱­†ŸÂ¸Þ™�èëN«?¶šm,KÊ/ßó5‹QzõçÒßþ¼þ?•^5ýò&êêÖV³¨eIG·�Љgyl€­[[=VÚêµ0•ž©¤c¿&V£yÄ<뵦7«ÔOú»þ.xÅJèáôßÂ7e”^ýu´üÀƒ­fåã21ð[ͶÄåV…n¥S%P˜xf·›5 [Õ¶*¶ z˜ÚªúÕÀŸªšyjJ#ÕJDð«EͲ¨DÝA¦Wþñm«iñ»s¢­f¯¦«ò¤ãA�1–ñ+EØn€­ ±Õ4¶õHöl‹|cÖ�5�vz[ÂJ<•9áUΟ5W=5åkž•ˆpÐêú1¯Z•XdL]¥WeU?Œäà1µU]·k Í2ï\#s¶ z¨ØªÅÕ½¬ü÷&†žzqIÉdžõ±¶J©dñT ’J²¨/¾Új˜Ö½¶š•IWïd«iTºj�qôc«e™¸,üñŸ[U§t¯j±ª)Ø*l ‘Øj+�Ú�šm%\c Õh’•üÔÖ ÅûÙK1:Eé¦*Ù5ÎA%½z?[ÍÊÇeS¥[o«ù/ÕõŒ£[[ÍÊg[Ø}†ªZPq¯PHa!]™ÆQTRÝV—5 [=†{<Ί}µŽ}¾§¸JmM^µ„lñåò•,xö�z _¦ôʆòðø×oÖ¿µì¢¾ü¢϶¡" ìG©g�°Õ2<]�ª ¶j�–­¦¯VÖÂV×4 [=ƒeŸýÔȶš¦Q×å�® úñ_ ô’±ü'*™Ñ#îF"Ö³}6YIzõûÿÊ#¡–^]0ŽeqH_eN·Õ¬d\^ö§I%Vn«­ôó°Zت [-Sª[”À‰œÀV�r„­¶þ.²Õôê¿�­¦Q3C]…ùHSËÔªg£nJjhªj¨éx­c~¯­–Åâ2OéÜÚj•®Òk¸�­f/¥«e1ت*¶Z­ÓÈ®ÕÖØ*ø‰g[}�F]pʪšÚjíêðõöhNϳè«râÓ³ƒ+~­´ƒ‘°F$[]Ùj—øÜâd粡òX;[-KÆå+¶jÁ¬­~+nÃZ)ŽÃ7[}:Ù?¶:u3¿º·RUûQmmú¨7[Íj3õ`‹*žÚúXɶš2k®nm5�Zàsm5Ûž®–¿Ïol«YÔÇ¿¯× ¶ª#·ZÆb$@¹s~¾ [ÝÅÆ¢Úë¼=ªrûÿF[MÊ\O£g´¦ݽ¤[IY›nµò ëS¨– o¨ênï ëì0Á#l5Û˜®jùÜ⑼tãslõ¹U ˆ§Ú¾­f�¦³¬i´ÓتS<�bw.y«ÞþïÁV³ò?� N…­ÎÖ�®Æ_ßé|vzéUâ0Áô2ôY¶Z–‰ËŸói«YT\ö�^[µ`xª}`«N�­–üþþþíõâ«êlavHÈïʺ OàdHhµÂÀ}ní°fÑÝýÉ\c?_ |jzéUê•�ú¸²Õ¬|\öÙCIT8;ÞC¥Q°UoÀV…ÀV½àdhHµcÎ@uU þ«�¨¯òÚ“¹z¶U UåUNºÜ?¤õI5,¶“@e^0óžeVWõ9;™Ûe«åö¸¬u`Èåá°U `«B`«Žð04¤Ú«íçÈKUÿz½D¹Õe¶:Õ¥Þ†ØÕɨ¼yk¿â‡ÕÙ^S†­¦å�¼g½­fã²®Ì9±Õ¬L\Î>YØ*°U1°U0€a«AõÌz�>Tõg2a]“éÕëWSv¬ m5{). ½g¯­fÒÕXø6¶š•OWa« ÀVÅÀVÁ€]¶ÿâGOýÕ¥kËÔ#¬‚{[Mi 2Œ†d®´Õ‰i§"ZŸrwÚ²RXm5+–®žk«eù¸|?[ÍbÓUz=ÂF%¦ [µ¶*¶ ,¶ÕøÇýZ.UõWÇâK’ûiüDÅ@Ix�ÿ9êÃO/²$z |Ö¦éÕ}HÓüì!ï —‰±nm5 LW½½/õ@ú‡[½°U!°U0`�­Vÿ‚DZª½¾ÅÁ¬aä1­¶ÂÃü­B�žÌ<-¶ÝV{Z2ˆ<»OŒÒ«?RªY‘(¬kl5•㸽S϶Z½¢|¼/ÓÀ¾©ÃVolUl °³Õ4�š…ÐU5]ýþ¿™ÇiXœXU¬¡ZÏçc;kö «AiÅ=°ñƒûÚ�ÖÑsü+m5Û—UŒg£­f/Åå]ïkeà›Ò¶³í–ÀV-€­ �­‚º¶J<1l5nü¹$™–•ÂŽÊjªÂWVÞÕV’Œj)u•4+,,ŒúÜ]ýC1|@ÁÈUŒÇ‰­fŲ-÷³Õ,0.¯|§±Eت:°U!°U0@ÅV³4j?„¢ª¡a«é«ßÿG¼5§Ê[]¥w£sÏñvûº¸†Ú{‡‘)a]`„lãqh«eT\6Ýç»ÓØþ€õvlÕتØ*À¶Õt•þö÷%å¶Ëü\:(±*1lÅž k³¶Õ K0«|‚3¶f„u�V�‡’ ]c«*Hk‡Új¹=.wQÀV½!±Õ4vïì­žÄ@»žÀV1üð‚ýQí/£Ã8á]f ¥ªiáïÿ›rØ*¥6#a]–`¦„ؤWÛj¶1.·|è [ͶÇåê¿�­feÒÕÔàa«Þ`Ûêu¾Ž§þ��·L{R-iÚتZÌâ¢Ú±©�e1—ãÊVMp±r"$v ’Ú=²;󨡭ÊëWúÿúÏÿG�& ëF[Í Äe‰ë8±Õ¬L\fÿQ¢7§È‹e�ýÈ€­ZPžy«ÅÊÓ1luر[ÝȶÚùãÈøSK@/Ö*<6×�ƒVåµ­I¬Z´ô|�]CcØñx‹?�Ô¯J[‡H\Ç¡­fåÓÕ5ïN(�MWgë�­ZP³ÕWQêU=Ý·|`¥­ö{Òz�°ÕûSýðÒ—ú%Mm•r­öOí�«ý¿VÖߕկaWOèU™Úª¼~Õ‡T¤êo¡¿…¿ý×ûuZph«iTºj”*fGÉ››õòm5��ý@a«ÜÏVÓWíº7ìØÏWa«»ˆ^ºqÁQíÉ{òˆ©`ð÷}JUéÅx…­,~.@µÿ¶jÝœ“ôêäèÕ�ûÂêÜV[®Ó¹Ìr�­fã²î»“šÆß2lÕ†­–’ºËV=ô¶ê‘½DµK¦§I?¶š†Lß›e”\ÿ<­Ùz¬åxozõëÓV«TTña«ß£?þSºãÇÃpÒV–î\[Í ÄåÌ×ïd«YɸC`«œe«ÑúXГÖjÞØêz:ÉÊ´Ö®ÝirVU§JÎ.ËO8«�TÍÖ¼ØVµZ´›y€mü“3XERaý¯÷ÿ*�àP[-KÆåØjV8]½«­fQÿ¾^/¨ª³¶ZfŽìÄ´¯ÕžTßlõA >�ÛÙêÛç<ÁYb5ßøÿýßÁ  ¦FµÅV§*±nq½°Rª)å�œUýWøWÖøÛðÚj’®Òe×­­f�éê”òd«H¬ÁÈ­–±»Fxè lÕÕß4{ÍXÆâ4ù?oÿ>/•²l±ÕôÕ|Óš¹–§9g빓­~zª$+Ùjøqx—Â>¿ SæêÜV³Kçq¹?€ò[e¼;ÅW†ÃV� ºëÛjhºqø.÷¶ê…V²}ï¡ËÛÙêÅÇI݃­òìö˺ќSÎmUÞî‚ɆSqý K‘º”¢ª†ÄVC‘a; C:ÈV³—ârù–O´Õ쥸\–�­‚%1:ÀVÁ [MU5|fXuç®ZP¾ dÎ* xëýúa*ín´ÕöEúÓ}Ó[¤¶ÂÚÿ‚TèP[ÍŠÅå+µ|º­fÅâò;wtòT‹á°U#`«B`«`Œº­–ª/›NÝ|ÝG}ÀlÔDÚõ¶*izÙ[Ë=ð•C.ý¬SUýÙT"¬áó¾+úàθ|º­f!qÙíûb²‡º²[Ô ‡­[[c–Ùj%Y½ ˜ TóºföÓõÏÐZl«3wP1æë-m5Âú±º@€<Ûj5k®þm5 \óUÂa«FÀV…ÀVÁ][í¨jºñZ(Ÿt®­V¿¬ËMtcb•»ìv.Z2µ„q Ó«¡¸ïjHö�¢Ð)¶šmŒËÛß;ªk÷UÂa«FÀV…ÀVÁE[ÍT54l5}õZÞ£mQ^˜…W’¯ŸS*¯Á•­~êéÅì\iö½wÙ�-Vƽ>'ÚjV .oy_ì(b¬îT ‡­[[cìlµ¯ªYÉkÁâ.;„% ¯?¿ eý“ŸØ5èÚmCO3ñCQÖÙ{}Þ¹·1ù±Õ¬pºz[Í §«°Õ›[[c´lu6±Z-ìdöy ;¼òå™±a^[�x¬@íN© W£D²DØÂ:« ³c%Ù ñB$Qéê”z¶Õ,0]]óqĶ`«ÀV…ÀVÁ¹­~¬Rn=éPÞ¤ºvrc[íD5Ó®>çj\Ö¿X¹çµ„µzÌS„U"‘SæêßV³¿-qyxÙý [å½Ga»¶jlUlŒáÙjº*TÕVá8< ÈîÇb”—DÙµ;žKK8‹VŸšPjAŸ´ŸŽÑM{åc®µúÈ€ÈPXµ$r¨>gÙjöR\®¾ñCm5{).wÊÀV½[[õŲ'WM=ÎjÊVÓasqc9 hØjVàZXp?–‡©S,C8©þÆ]—ÕSÝÞ·ØþÄçZµ.(&ÌØwùÜÀV³�¸¼r ¨µ­f!é*lÕ [fšâöeÙ«ô],ΣÁVýr„­V3©ñ¥��UU Ú‰ÕjyâýXáL[-÷§*§*Ü5ˆ¢¬�=A1/;¼Ë*{u—­¦QéªÝ@ÉÅÉÎ+påЕ¶šÅ²¶jĬ­¶NÓe=Ë|àRÉj7˜ lÕ/nm•øw°c«v‰Õ²ð0Õz¨ª–5¸²Õ~�Ö×ñ)±A0kµ’N™RXË�×ö?|ÿýÇeU».ÐÛ ”Üb«Ù–¸l1t£­f[âò°Zتåi·Z¬cаUتS¼Ùj'�Zå­1@Xk«éökAx?–Ðf³ 5sM ]ËÃCô2×ß’ïéJ«[yÓ¹¶š½—Ëb»lªjlUl�Ú*=± Y _ä h¹itåjß“¸¦·g•ÈŸç´fZ€Ó�xê™U µM‰³\µˆ!¼S•‰Ý=l5+—ß·Þ¡[µ¶*¶ Hômµ£ªÑGSSüíëó+'X9ÎrcGI[/…™$ë¬Cw^õóôÑ5ž· •]ª5ü 3×k•笳æêÐV³�¸<ëÙV³¨¸¼¸Ã¶j lUl�èØj©ªÕ4j‡ßŠ»#³«Ÿ-ç£Tž¶2,OI²òîͪ†—ïKñ9¢SQkîÖ_æÄÁlŒlu×5×zXkºJ$=Ò,FLn‰š»Sl5�]‡lÕتØ* A±ÕjuŠK(Ky-+¤¨'¯ü0É*±Õal?[EkšÕ5#>—�+]àßFžZ'H·Ä©¯:7`Ñ�"­“Û£†bw�­òÞ ¼Ý[µ¶*¶ê”þÜlvO èô§úðCUå’z1% Š¶Ú« M«ÛªðZPyfìš1µËFîš k\ÖÎA©0ÓÖV1Êõ�r£dĤ«¨ªØ9‘N•@»;´`«vÀV…ÀV=ryäðahÛ¾zýÑJjd¥­þöÅÔÿ¼¾}ûíZHo«NxéÄVËAsZf«kêWeaÆáë~.­qê—ÃlH«QÆØÖN –1œÔ�­f…ã²7éT Ô½C ¶jlUlÕôG÷z°U-U 5-oÆê—V+Œ†Z%ÕÖ2ÉêÓVã–k�­‰Çyä‚w4›Iú+[R‰ÍM™ëU2ýv0FLºµÕ4*]]0 tK`\æÕ[µ¶*¶ê”ìùfå±×VÓ?‹º¹ÕjÖ󳿥�¶lµöÚªpHÚb,èVU³W¯…ÙÑœI$½úÓêåõ(qA˜ ]0>á¢:§[g¨k:rz =k9жÚú f4 tËíY1œg®°U;`«B`«Ni=�7$ƒV×Ûê[ñ¤azµ4K¢P¦I©á£ü¬ªf�±Å#l5-v-ÐgwZæ‘ÂgD¥0ÞWKLË�Õ¶ðq ×–eÚ:$õÚìUÉËè8[Í^ŠËŠÃ@÷Új¶%.÷k†­ÚÁ°U‹[Sx7± £B0¿�¶ê”NnUELû¶ú­‘ždhå;SƒœÊ©òr[�«l•QU–`Ó½FÏУ­û¥ÒÕòñNŒ¹è®ßRXùãvug¨Jp+­ËûÈZ WŠ`i�°4�RêÇV³WãrY ¶jǬ­.;ïó†ÒK*j lÕ#�fÍZ6ÚÉL”Ϧʠ˜¢O[-c¯$«üa­xµQ¦°å!×KñÎ2µ)ùÍPVHéX«*⮈wú{Åk¢l+–¯Îê>ßþàñ£ïTz ¤ü+¡P^l‘g…Ã@}ÚjV2._!°U;ˆ)¡õç}† ÀVÁ/βո,9ñ0„’¢h«qc˜qÖí¶*”HÓÀe}£×@o⟯ÿìÈâT¢zV[…š[M»¶ä5ÒòתŒ¦¶ê‘D ý•{¨[Í¢>þ}½^°U#*¶ú·âPÿ×o§Øjµlõ‰ì PíOÇVµ²#F¶*QÕ~8ÝY÷`D­i…¨µ'[õГ¯ÕÀ á“fû¹R£a¯šÃ9d_·V=ÂŒ,Ï_ÙÃ@Ï²Õ äVíàÙê·_óØXݯB”�²'é«vÝvìç«°Õ]t®¤«¾±ÓŸþße¡°ò„r»­†ähôø+•Ú< îT¸úž zÓ“•5™P¶je÷”×êÓ³Êþô®ô©âƽb¥]ÙõWÿı‡�ÂVAʽs« z[$`«ÃW;yÖ㫼(ë ôêOK«e§T;ummÖÓ©|6�{m7ÒÖjÕh¨kk4m ß=É&LØb«BÓ…­Úq–­f™ÔαîI¿Ý_¯ÂVÁl•øRÕYµÕ©@•÷Ø©ÄHUcåÁ@UË&w®Öê½ü*O=�Œ‘¥8kI\M§@Y’RX¥•)Üu{–06ÀV-9ËVéodYO`«€DßVƒXX=Ûj§†ÎöPÜ^-逤ž³.зTÏTU³<¨éîjÞ¥4“Û\%# ZÏží nññÝ‘gL‰5LÝøÕo%Ì x]y{–06ÀV-™µÕ•iÔ¾:é l�ði«ÄÀõ¶_½M¬ÒäB̘ç5ëÃT»ixÇe‰‚ä^�fxe›+»êتت_œÛj&©évž­ò„2óÈß«?3¨Ðêú70•ÍMÕ£Û+Ima•‚çÆ÷û UõbåèU°US`«B`«gPýœöÚjGRSJa-§g2²ÉrU·þ#l5Ì «µª¦ÛËYå=¬N¹Å«jjŽúVCº÷T{5[aØm«­Á©ëm5õT¢V.H¯ ÀVM�­ �­žAkÐêz[%Jj$ÚjܲÌ&-êOë<ÅVä°.³U^sFÝûø×úw ‰Ë’ËëêÖÆ®Sn«‹oöïÎ;¥]zõòÔ+#ð÷ÿýOXa«¦ÀV…ÀVÏ`ËÜfÕž0¦ø™[mLjg“Öõd«�,¬‹U5– 7ʉuÎ «ú¨P-ìF¬֬Šw³¿¼°dŽ*‹ôjê©ÙÅ+ú_lت)°U!°Õ#Y3'pÙ(ã'{œQ¥*¬°ÕN‰gų>ݼךµË†™f·gùŸR`ezõZPOš²mµ3Ju}z5>z 5—_z«kÜÞÿ[5¶*¶z$°ÕÖ6y®­†‘°nI¬fåƒÆß©[ÏÏÔ}J¥'OöêÔ¶,·&4ÙjH†8sœkÒ«e2µ¤5 o®°US`«B`«g°~$@µº¶z¨Mm«¡-¬{«YT(de}÷:Îj¡ªÙK­¦y2hMt°àv´Ùy©‚ñ`] e§W)žŽ^-Ͷj lUlõ¶'v5ª<6a]?Û ˆhÍ3ÅÈ´+Ÿò› z ¿îÓPW>ôU×V;ýíÒ«³©ªkèìÍþaRU/¦„‰Uk¶º,E5Ì[ £‚ýó5a«`¡­†¯Âztn2œo«áÓ¶»à²ª„Õ¦�¶.™úJ÷ѳU©Ø*å&ª-ƒª·R©k(¥X–O­>¤ºlÕ³¶ºløßpL`«Àâ'ÁVÁ°ÕXðd«¿ž=;rí"™ËaUAöà«j�’§¤X3Kk æj¥?òT2tõZ°˜­L>5Uh_ô_™^­^÷gØj˜Vت5Ä9"[ÒµÑV[o¶ ürW[�µ½Y[eÛ$±Ú×ë•-Pb¯2ógÀ1‰U]¥Új¶ñZàÍ'ʆñd×~mÖóv™Þé?[ž85Ud�­öǧš¦Wa«Ö”îUsŠ­V‹ÁV�ä¶a5µIŠ­f¶UoØÑVUl²SsÚáŒá{Éf¥õ�¹V¥U­¢ªf®>…%cL«Ö/¬'àMžj}§ÿlù©›¨ŒÆ¤¦Cca^*»ô*lÕšûÙjº±šm…­‚mÈmõcùC¤ˆ¶jg“}Û˶W§‰mÕûÜ©?LÚdYy§æV+¡ýÌÛt «Ó«*•óF¬ò&éŒÈ•Ò¯$“× mÏô1×û÷†in5�oö¿0J¯ÎÎKe”^…­Z#±ÕÖÅ÷õ¶º±'°U0ÛVÓ¨ËV%¹C¶MÙž¤æ×úõK*¯n�û?ÝÏÿnÌ\Ò«RœË.¤ZI\^“V+ùÊSgâÜ[‹ïô'ŽžªõX)aÉÙy©ŒÒ«°Ukضš.sÄo¿®<�|¶ |1k«­Â—-ÎÒ« …ð• ¥¶Çèpµ|ß&…•SJÊ…uÍT’VvÙjZ�pn•'¾Zt`û�þýòe>uJXum5¦TgÔ(½ [µ†g«�[“[¥ä\a«À�o£‰Ö²Âô1ûéjUþ–Ù$»ÚN�~±Ùjû­ «;aª¡taqæ’W•ÑØS­†ˆUQñš¡8ìu¶éV7üÜéß)_}$Õ®ôjšR]`«� ¬°Uk¶ZúÙ.[õÐØê£a ¯þÉë·˜�×T·Éì%#›¤‡°=’Ò£Û”úÙºø¶ý5ÃOפН»¹N«UQZì÷ÄÕmþ­ò�!ªëmUev*‹ô*lÕšòl[-–^ô¯¾TM0YlìtuKO`«�FËVOd�2-ž–ÑÕVb{}}”{$¥9õš3´D‡8Ñ•'ÉkŽmUŸO€=nõZXó«†=tUqj*Fù¬dçnª5¶º¨a«Ö O¯ lõÑm•!©%±Ór¾ŽD Ÿº¤–•Û휸šM¯Sb÷ìVú“Ü�%Ï(¯[Ui®FS_Í>6ˆŸ…»àgƵ { ÿlùl‚*ÝÙ©è凞z[µ¶*¶úhx¶ª"©%³ƒ5%MXKªnCý0;Û:Ì+§ÂZ¥e±klÆÂkåM«²{â+ñQ«×‚Ölb fQµ¸wŠQ>~A†fia«DO½€­Z[[}4ÃAÍÕ(‹ÄaµZ­†ìl’"|솱ôÁÄj‡ÂzÑy0ÏÅ•�‹ËýÚ,lfv&ÎàiZ­ÉÂŒ­/÷/³UbÈ‚©©fËOMP¥(¬—§†™Ë_°Uk`«B`«�†‘[MgbSLVk:¥ººI¢è!*&­%è[í.7 X%Ÿ@àr�ôwÜ2Û™Ù¦•ð´µê¦¥¿^ ê?*$�ÃÏ7,™šŠ^žžU�¨Øj–O}{{‹/á.«½ÀV…ÀV ÏVÓÕkAb“Ä ½!;5òÈì%ëQ ŒtïSiU—Õˆâ:-]–8ë‚'oÉçHïî3ïÔÃÐÕÖuÿ�¶šÝM5å a^÷ï›+lÕتØê£ÚjºýZ°³IJ¬ŠíÙ h5ÔÙ¢R¶[x»½z–ÛjZÛµ •aí‹N Ý+ÆsVÅ1”’qy˜@M·_ ‹u\h«Ãû¨¶ X?;ÕU8zjö˜ë¥¹ÂV­�­ �­>�Ù§ uöZP¿¬ß©ÍÚ&u«-ëïl‘TÛªMwH€ºª¦·Q«kKtÏ�Òº ±Ú‰ŠËÙ|Ù#XßÝ/ ¼Bˆ7Q-¶ÕÎìTÁ2½šæS骚Ž [5¶*¶ & ßÊ;´Ô�/«P±þV2ÒÚ&í²Îý�aT|Uþ4 >¥ÌÞ ^…8u6‘©þðõB±[ŽÞ¯|YnõZ0º¾Ï8Œ¯�¾§^¬¹ßŸm«°Uk`«B`«`‚©ï[&¬Z6ÙÒ2•šý„MÐ*Ð=rªZJ‹Õ½š¾Ê¾—eHçêj59šQíXªOÆjU»1±Ê¨d½­ÒcÞéËÚMTknö‡­:¶*¶ ¬°¸%‹>ë”’¬ä”zê¾qëñ­ÕŶ_ŠËôɃâ²é…ûÒYý¨*±Ÿƒ²‹þ~luýýþ”©`«Î�­ �­+TnÉ ‚ÜaßçTl¯“U·I»‘e�¯´ÚMÓ–ZMëÖ–ÖIN 5�ràa ÀT=®¨Üé?[ž>/ã~¶­Ògø‡­:‡m«ýyЯ—ª÷Ÿ7f}P¯¶'°U`ñ–,£Ëî�ªT.�wZ©®jÕßñH•Ê[/e Ff©^!qä«¢ÆeI…ë³³NlµÕÆôªü~ÆíSafzتsx¶úíç7¢7uOunáFëú=�­+ˆ_Î,Õjt�;tó êõ+¶ÒÙ!ò}ÅÒð�ü_^‹U,æÀZ¯ªYU”Û›ìú³òI³*ÂJ¹ÙßϼT¶:õ¸Ôتsˆ�Štb“Ã7[÷aö§¤î#²"U!³KÜ_’T+,œ–ä½ý¥¥˜Š¶šVõ¿áÿ Ë+ªj¿6¢¼® oZHœ”*8›—êBq0ÛS/$¶ U]@é^Õk åI3 ¬žUa«¶ $0l5‚£2¢´_ [(ílRÅ#Œ¯JCìTÕú#IU-yÝ;KëJ[eLJV «Ñýþ�g¥†¯_Étö~"°UçhÙjúRæUÞ“e“§F¬s¥”ö¼T³åÓ‹þÂ_×¥¹ÂV�s–­Rú[ejœ«ÊØÖ©ÛY{^Ù¢°ò~%™b*ÖÏV¡­²ÃÓÀÔ\K^O°j7æUÝV‡ƒS÷Úª|^ªaùh¨Áf½¨­°Uç= :N¶ ŽdÊ5UjÈ.XhýõïœK$BI�åµÂ;ÎöŠRÌôáìZáÄçf‚¼n@4Â�Iâ,�~Õ®ÁZóRµÊ—’´=µ„qoÖlu¥{U‹ M1 L-V}c§«qèêÊžÀVÁ4­¯ÙŲc¦õæ� ¦ÑZ=é±ZyßV=Œú_äû®ŒtS7vÁ}ZºOÒÚÕ™Ùé¨.ÖÛêð>ªY[ _G£^´®`¨«jÕ€gµ¶ºyBçáÀV‡o„l,èCkx͵ ë�³áŠy”j+Fyš–­2êÑ�é]+VnqŸ–¢ïî�ýêZX0v™-¸FóR…äîþl{ù%U4Wâ_йÂV[[|Rgõc«i�k¡sY_wü@‹n+F×ßH_XyʨrW–Ö„Y×Âv[�5ìzVàNGu±fRª`3/ÝSKØ?•Ù»Zæ []lUlH©Nu±¦]b‹©¶j]:ϰ¶Õ¬ÛêÚ:Lój «î£V§PŸÞU¢­º~¹ø9XåEÿe¿@ˆ!1™jq›¿ÄS«!år«¤ü+Ÿi+lu°U!°U ƒÃÜjY>.+ªdëü¡¥ÅÃó“°!úù�ÑЫ1†•1rT’½ãµ;[ÕÕÏ5s£¶*Y“^ÕšŽŠ5;)UP½Ó_ÑSKZß2ÝkA)×d°Uk`«B`«à)dó€\ ’ËÜÄx6ÉVCbˆ0c:ŒMO®™³U#­*khï“úõÐS­ÇÙªútTì¨ÙI©‚ž­~l7òÔj�­Uõ†p®·¶*¶ žBk¹k�x2°–¼ qæë7¤xf-ê4ýú0|Dj§Û)‹çv�­ªŸj5ÒJõÁ¿}™PF:*^àì¤TAÃV³P¥ËF*+—üÙÖ_Îs ,ÀN[Oap¬�´ÕTòZ2:á•u®ÙpÏ~T_¯ú£5­«ÕÂׂz´U�Ö|Xk~Ó«”›ý%¶Z^úï�*´þÚ¿hÄú[sÎ °“…ÀVÁS þ±È´Õƒäyne*½:|µ,Iép*Á-'V«QAoÞ«N%’ S¯…•7ø³£f'¥ Üy©BíÔñHáWlö°Ÿm4óÔ ˆÔ°“…ÀVÁSàÝ•e-‘vNl�ÁžVym±{ØOµnI¬VïÓ{¡Ø³P¥WN1¶`Rª0i«­|*ñWV¹<„î©�F W6êsTã\o v²Ø*pGõv¨ ¾ÀÕ“][Êm’Xƒ\ gÓ9Ä.ii´|f¥*Z&jkßG)¶:¼Ü¿xB\ëI©ÁVû£b™t‰äÕß©­¬¹? çzk°“…ÀV�/2UÝø¸,Ý'»†És[ íìSn“ÖéÞ²­Î}] ,¦Ðâi+ÏV}Þ2EŒÊ.úkÙjËPÓ-Z¿ ²e­Ê‡�ÿlB¤ÀÞÉ­3Qø:òX}ãTOb ]O`«Ànm5Ý~-ØyçT¸–íµê±°ÉêÉÛ‚ä„-µUëÙ^u§¾âÝÔ_vÉÃ`­I©bHÕP³cÒN%�~žµZÁIÜ ¼óWö�óê9Ñbã°'Õ’¦=�­_ø·Õ´ÀµP=먟“Ê �N¨-[U¯?:�]+ÅÅP…‹øÖ5 µ•8{ÿÅú·¬¥;)UhOìYsð—ß\õŸ‚»ˆ Zô“‘¾Ãí²UbIØ*x�Ô›­¦%¯…Ö©HëÜLëz¨Vͦr߯‡�jÝò­êŒ­Ã1Aé¹_aë`õI©ˆžÚ±U•#Óô Iê©°U?ÔNmÕ§ÁÕM±]É¢Üj¿'vÝ£t,ÀVÁ(?:×tc¶Eõ[²2ªùB­æ:µÉ¢<»­© ³©Ö�}ÍR­©­þV|Stï-Ûb«ôI©ˆ¶ÊóÔV1JI^ýeåô†JO½€­úá~¶š¾TÍåÃVpJü:éjëð4)´I†JΖgtŒÞ;™MLµnÔ¾¬’lË‚)fWΟz-èNJU}Pj„wä,82³Ê‡o�¢`/÷³ÕÅ=�­ Fuϵ q©Ù 1DÅq[áÂó4¥-ÅÔr?Õª5k••Ç“Z7ʈ2š”ªŸRÕ:>[¡Ññ_¶8[�“¸βÕxæšYØ*gÐÿ2_ t�”œêv©¤¢AöÛ²h¢šju’XåÕã|0À‚I©‚±Gö[± 9Jqv>‰³l•òÊ—`«àA´­^8? )™ŒŽ¶Z¨Þ2•4õȬZ£÷=&MµšXUlÝ¢i­I©Êòå¥ÿõiÔVZ›ó¿„ äf¶Š‘l¸z¥ÕâT=©¶å{"v*i}�>­§“'¶U­?[]y¿‘b=»Ò«­(‹I©®�Ö¥ÿ5?r†MË›h‰‚ 3`Mé^Õb}[ÍÓCB}ãÔ[XÐØ*ðˆÝŸNÓÜ-£Ûiì®NZ¨$ŰåmÑ=žÑÖTHµÌ‚ûœ„õø±UõI©bȵВÅÅ?r:%-fžz!üóxôõ«sÁï!°Uð8¾žÉ±²3åÏJ¹¶Ú©äš(‰LPbéžAl+¢¢§)†"Èg¤ ª“Re!SžZ-Y.S¢xÇñØ®zê…üï•«¿�{Xl<”ôïµ[M7^ ³§CS•T1¼a[ZÙjK±þ~£þŸøjTƒÑŒTYá zÕÊß9¡-ÊO½P¹ü |ØÃB`«àÑTçéXÜ�þiéZžíTRåšé°-£VÊ:�<µì¿JÚuï#©x5Hf¤ 4aU÷ÔŒõ¿sÒj)wj*þ½Úþ7ð!ÀV…ÀVp—[­»ªgèr»�zWÖoêvN<”¶¶zö:Uƒ|FªaT:;Uë�"˾Ã|ª5p)k°‡…ÀVØÉ쟰ì Ó3ôëÖ Q²’ìÊ[µ©XC’²ÂknÒR©jÍŒT��2Ÿjý;'ØÿÔ ‰§Âfî >_!°Uð8ª76…M‰ WÓtôKñT=¬JØÖ¬DÎ6§²+† WEUU©mýŒTé–н(¿8e®•pÍò©+m&½ú¿ýoàC€­ �­‚g1œßxS¿&PŸF`êd/1ƒ5)Ì•vjÖßo4¢òT‚õ¹Œf¤ Ý)TûÁú”9ïë�yêŲ¿?7øx"Ø·B`«àYÜà/µâ4ý¢Ÿ§å©¯¾…¨§ÖZI;]O­¶ñ6V¬ÁzFªÐ˜BÕú§£ FsUO½€­Þì[!°Uð,nð—Z>�€®Þuj3MF¾~ ^«­eõÇeo¹ÕkAkj§|�yjåCT<�Z¿¬:žz[½7Ø·B`«àYtþ:Ÿò×D2�€©ÞmñH£V²þ¥oûþä$½º`Fª ”OíÓ©Ùú< …­nûVl<úš…­ÝË%™FÀN«õ«7×OF*æÆZUÉÛ¢˜º°ÎÚê‚©Â×I©BòS'œœ5O+wxÅ]VëÞP’ç8d[䇽µhtöÀƒ­ �iö‚Wƒµ³V%LÑ (’'in6Öº|Øg«�‹þê3R…Ñ¥su¬³æimZóR¹šÆðàÙjÿV¼kU¸±ÚnhÏV¡Ò(ã´[@‡×ÚÔgÈj0òH^àT”ðró°-Iý‹…ux›¿<½Z•ÔPÛKêæJÌšKš‹�Šã‹,þ˜ ·ºžN¶2¥ÿù.pIJ$l€ÛâÜVÓ�×;igŸB‰¤4§ÒDÙVV³¤þe¶J™Ž*Èlµú¸Ô@ÛK èìÁK„‡ší9´U‡�ž@¹««×.ú¿s–9"l€GÐù*º²ÕôÕkaA22kˆ§/’æ„êCoK¥ ;a�WüùNÞH€kA僞ýì¬ç¡í©°UpÁ°Õô¥¿>­ÂVë¯âÀ€åBÏJˆç¡Ž¶I^§!uÔ/.W믶"&݇ZÅeF–4Èîñ�¨d�«ËŠM ›ë{ê…®­†®F0*„­.C˜[]숰UÀfÏC©¶Z$;S²šOñÈ~ýÕ¼æäšÞ8Å»š!Þãßz›Ö‰s£&ªÍ-;?êþô%: ÐeÖV«áFâx­ÁV¸åW1.Ÿõ�úv‹™úU ››u#Fsl[mÝÝ/VÊ=þå{4JÌg,he½ªZ@ tqk«ÃÞÂV¸-·¹Ö–½‘ka�DÒ‹ub§§š“‹ݤ/ÿ£ ëð¹SжJ¹âßzU‘ìã®&ÑUš¨´¦š[=èÏ Àí ±ÌI§UüpK[M7^ k$2°Ð9lÊ­V{ua'‘¡a«*-RÄHÞ"]¿Ò2ëÓ«�”ªÅn/k[ùËÇáY¯5ì�×Uuý°o…ÀV0¡5„ÜâoVê¬þ&–÷p,HCfeØ�2Äh¶EIÓ«ôyþ³}’®d+Ÿm„©ªzøJfPnñº8< ζ €>[²ßj“­iJË)n qªçkÁ4 Y­3«|A‚P½-aí<˜ªz-¾ÿau !~"’æÒdj†âwSqplõàÃ[@ŸÖ÷ªÌ»ÈŠË~îí�j½ÔVk‰Lk^ÐJ+)¬Ü(½Z^ýŸú8Øo“÷¡O5×ñÔ õo�Êàu[]0—(�­ �­`BGXó7>ïížD­ ²j«Š�.KCª§WÓ”ª°ŸôŸ*?NúÍ =õÂè[ã0· sZö¹Ø*§²qt¬q°ÄµºÌ ƒ’D®LCÕ©¬ÒšÕsÛÕwjñ;¡¬™è©Î±¸ËêÐ?ç‚.¶ À©Üotl™-¾–dàZ”Äðè-–ƒ ´Ò«FžšAO¸*¶µø‹àspØãhKÕ!']F 7z¶ À©,»Œþ; öÒɨAÑð:-V[Q±Õ˜X­¶«K|v‰ÕXç–‹ ËçÀ}�ƒñ\Àá¯�ÎåµtU¸‘ÞgS`«̂ѱ+v›¢­§_È®ÖÙjE"¬©§ÒúPtwcyݯ­¦[$cL;¯žø5&­ G­Ÿ7°UØ*€D–(ŠÛ·dŒªÚzË ÙÃyš�U-[ÑzƒÄEØné©Ûm54<`¶Ú€q‡SŠà?ÿ™‚ÿ{3?ÓNl°‹Û/Z Mýè—·B‰Ëwº�MOC2lµõ�*Jstx?f´<õƒ­¥Á9ßôæpë±°Õtµz`ÀVû±˜Ú†Ò–ÿhÖκòB6# IVЧ›#†È÷I¿é¾§^¬?8­ç|ӘìÇ:·ª"¦ÿ¶G`«œ lµÚÆ-Y-袦r![’†¤ØjõaªŒæ:• ÆÈš¦xê…‡ƒÓ‚»¾¯£b«�ß*°U/dì²ÕЕ×-´†p] yb[׬¶ªèÝÞV¡ª–Í…¯Ý6òÔjÓ#O´†b/œÎB=·Z­¶ pÇJ[ ¾OÃ?d3Úºò*¶JC±ž–­2®þÓ­.[=Uñ’ºúå‚Å_Ip ¶ ÀÁx6È•ÿªöµuåUl#w,…U1¥Zm1ßv+TÏåÃVÁJÊc¬Z¬U¦5º,`±Ñ°U‰êŸW'"fU ÓÖ•W±í*mÕhæÿÎQ̶¶.úÃVÁ‰à[Œi�ÚOÿ|iëO-%O} iø½Z^ýWitJëÙ-ö§ZØjP:ªa« !°UÀçwY±Éî´5º�ݪVn�¥Øjÿê?¯QIú™ÞbßS/�7‹�4œªýwÒ°UN¥u^¼xÔœlZƒÉT®bÓëadKÓQ¤*�*“! >þÿÛ»»%Uu  ž÷è}.¨²(~bÒIÖºbpÄö36ñ¹ç¯å¼½IZ…ëV_’V×ë—…kŸbß+-o¡y—íÙN›ïèp�õ9µ­ÂU/Ï=ŸIëÑu2i•1þ;ú*Âý`a¡ l³ÃmN¯g`ý.‰ªAÓrýüÜyY¨ü»y+ê¾÷4">î÷º£Íö‡—bkhˆÜ§ÕPßûr¿§öç^¾OÛiÒjÏæàKZ%J«´Z³ž&:_>²4‡Œ­žØgéBCdŸøø9ÏÜm÷»ÿܦ´zóo�k<ëˆr8&Z“V7ŸGÆV5¢54jjžÍã›çq\Ÿ]Ñ��õ¿º³¯ÊV‡Ëû=ëO˜V—…­¿Â'Õ‰º¸ÙyÕ“A.H÷”c‡ µ²zÖtèhkìD’ë`º£z›‘¹e¡áècͦîÇÖkcÃÝoù:ªáÙnsv ?žw>Ëê,Éað,>iIâì’�Â�›¿•V{Ê0íyªqx07cë徂kññÚ¾þ´�šëýS=¬³’V™›"B”>iuÍÉ|G†´šÊ�éTþ[[õ¿VÆÇæ­ ûýÖäÔÅÀóç¬Yh¾SúrçÕçè¿Tø¿í×W®<;*¨1Û3–< �ÍÇVibÈUVŸÕIº»¿ª 4?ckçøzAØzû¡S“4YèU�8­Þì¼úü±üVÖçÍíÏŽÎÌöŒ%�žiUr}œ ëµúëaìckçø½£OLT={�tGûGð»&É9ÖP«Ï²>,³M«…À‚Ùž±äQx#¾vù*«ÏI�¦¡¸õùÒêú—…nñq‹ãÆqƒ¢Þ>¾DŒ­®W&9ÇjžVפU†›í \7Äu¶»äiõŽo$Z~Œ›ëpË cëasjд 4Aiõ3iZjõYVýÍö+¥Uâ<þUh%hˆël_Ó§Õõ�˃&À*\Dúµík,Ö§ŸcAiUß*IÌöŒnj>ÄUÞÑ'ëUVw”Gõ>¹'Àúy±‡¨7_šŒÖªój½fÿ'…~ƒÃ•û¿ýgN.Q€³�lÆt¿ë›7b–7ø×ØÚg¬ÊI©DI 3E85ÙØj·öƒú­-w¼CûL€U?yj„>o!€ç’V�†ô­&L«ßÛ/ ëTÚs¬�/sw0M¨Às§ÕËÖ#‹ÝrêØûžÿA†S €†§Õò1Œ�Y7ã©Ò*�œZ P"}še7RUÂÃ>Ά³_õ™?µÒSÞB©À‡YD@ùœÿg–…;³_åœ|ôo!€�¼0/òˆI^ËññÚìWcçO¸C‘Æè?oÑSZ$+ægl5*0E `øUV¤Õõí—…Í,ª­î‘ùP�±hà=¤Õß@6ý? ÈO­žVëõ,Í §ÖŒš·hú‰¤U`>j 0†y‹"„¦ÕOÇ÷_j ðûàõ]î\ ‡t;ÜÙæáz/@Ò*ð£še ¿�H–ª:0u x‹Q-˜K`~%ÀC©kÀ�G¿;xÁÐ:³Ê”õTL`Œþ‰móµ«C.o�˜5Ô�÷kÒ*0̨!ÆMd’›T{Ÿu´À|Ô ~X�� à-Þ0ƒÀ|TLà-Þ0ƒÀ|¤Uà-Þ0ƒÀ|TLà-Ì`ðD*&ð/™ÁJ&£¨¯3Í Všb�7�VLS,0=E x‘MëêwýÓ+¡¦X`bŠðc¯²êàq_ë Pc† Pã%ó­Î‘¼¾5à-ηªÒ\¦†oQH¨Ñ�R`¸L^äìsy• -i€¼¤U€XgSei¨¡VØ, 0µ Ð>’~×H«5ÔJ€@‡‘tY)­ÔP+�EÒõw¥P ­Ä*Và'µ€¼¤U€X›y¾ë•_€Ò*@ Â”U:j¨•�¤U€›ÔJ€@Ò*ÀMj%@ ßep“Z k}eÕšò PCZ /i ÖÙ¬U:j¨•�ô­ܤVÚGÒïi †Z è0’.+¥U€j%@ ³Hº4³ªÀ?I«± �UøI­ /i€¼¤Uò’VÈKZ /i€¼¤Uò’VÈKZ /i€¼¤Uò’VÈKZ /i€¼¤Uò’VÈKZ /i€¼¤Uò’VÈKZ /i€¼¤Uò’VÈKZ /i€¼¤Uò’VÈëÈ4ö endstream endobj 64 0 obj <> endobj 69 0 obj <> endobj 68 0 obj <>/Length 14928>>stream xœí�]z丱`¡÷ÙÍøýj5ö2,/ãz5½Ïš>>ž;ý!±ä'׶Á4áúŠÖ{u–`°Ï´Ñ/‘¼žùÖÀUJë:˜!¯{höÛM�r ö0ää’ ®Þj€éÀ`;°!kÛÔ€=Àv`B°H�=ÀvHÖ=\WVF=㊶A¦Y~EgæÙÔ€µ/6uNÉ`„q…ïOæEåŸÍœ?5s!YH+6À`°¯_÷ó³ãѬ“ÉO!›f¢ƒI�A¢ªW—pÁ�eq_ßÕÿÑë+ÊØCjxÚÿV€åÁ`;„ÅažË7®Ÿ¹�ä­Vö�?•*P[{Ð>›j)y,-3 ØlGeÚËœMÛW]¸b£ØÌž-xg„Oå—ÙCÁ+Àò`°ÂÉ‚ùYpìAõ¬ä�É´‘÷=ÁÚ‚=Àvdèg÷h{ìAþVpt²FR ŠŽ{höÛQcÍÓ ö�zgTïRÁ»�=Ô€=Àv`ß•¼3™7 {öÛQ“Ø´} ì!Ú&ÓE>`Õ`T/DòÎhß(IÜ2{¨<Àz`°¯ßà_jêÇ|cÉ`ZÙÃí„e– ¦IÜ‚w&ï’AÛƒä¿`y°ØIýÿÌϼò$Õ÷+:ž£Yñ¬Ê5hô¥e†”°Ðêãæç‰$çþÛCô´|xÂÎ`ðòšüÎÕû�_;Àö�=HØùµ`ð؃„�_;Àö°5ÂuùŽËSü.¬ ö°;™—¯½öù){—V{ØèÀ@ö:°Ð�=€ìt` {ØèÀ@ö:°Ð�=€ìt` {ØèÀ@ö0ÿú׿2ÏþóŸÿ4 ì ö0‡7|~~þöÛoßÿFÛ|?Upfœ´`®9‹ §1d졌ç@86{ðÈSNšÛC”£È‘záØìÀç Eª�{(€Y€•À\�)6ܘÔÊ¢Päð ö0’«4öVöPE°€1§¶ËŒEŽ€=ÀP°Ø”â=g¯z{¸„çÄšj(Ølö{Q¿‡BÛþÙ2µ²{˜(PÃY•b°ö»Ðj…¶ýµe~eö°| ¶³*Ø {€Åi¾‡BÛ^¾¬{ Pô„Ñã¿ýö£À`Múí¡PµÏÊΉ=è{€�`°½÷PHÚ_W64Y_y{ P@`4Ø,‚ÙŠ|ûg±{eÉ@ØŒ{€é‰Œíá3±�Bufì�@r° ö³’_Ù`ci(83ö@ 9ØŒ{€É¾‡â]¸p{eÉ@ØŒ{€iP-‡ìdŸâí—#Áfdörö£ÁÀ;Ú½—gã¶öp+64wyKìÁm ìö{§\¥¡àC¹•=¤V6`E1 „=À>`àŽç Å{ȯlÀ&Šb{€}ÀÀ ™ K{HŠÏ�=lÅ2PÀ`4Ø F²¬ÁÆŽ£œ@Þ{ðÅ2PÀ`4Ø C¾‡¢«=h½¡àüØÃQ,ìFƒ=€5{(:ÙÃueCý: ³–؃Ï(–�ö£ÁÀˆ²�—g—†ö-6`eƒ!Ê�@{€Ñ`Ð�Û …Á"†T—Ïô6 ì¡l0D(`0ìz‘*6ØÛƒdeöP6¢ ° ö�y�¡°´‡L±¡2ö@”��ö£Á Â=ö )6Ô‡Àˆ2*PÀ`4ØÔ¢]ÙÕÎbC?(ö°CË@{€Ñ`PHñŠöð,6`•¬”×±€æ` Fu§ì'mí!µ²{¨d¥¼Ž=4{)·bCñe{x]ÙÐ{uö@”��ö£Áà…†/‹;^»¤Š m£4lŒ=lÅ2PÀ`4Ø$ÉÏPÛÃù¸yÎ.ë‚=e` €=Àh°¸#\ifÂbCemì�(ìFƒ=Àl¼Tu¼®lè­]z4ƦŽb(`0ì ÷Pô³‡g±{¸¶ùú�çSmóÖJy{hö°55{/›ÛÃgzEY¬‚)ÏöpJUªö ÿlX©d¥(–�ö£Á¶æãã£øÃ®¡=¼®lØÜnïOýÌE[Ϩ{({€±`[3Ö2ņ&á°‡¨WÕÛƒ„c0ª@†WöÐìakFÙÃñ _j/ëâÊ2õK{Ðv¶¼¾Lì¡ ìÆ‚=l�±=”yCM¸®‚"o¯²‡×y·ö :¹°e“1`ÍÁ¶ÆÆnÒ`³ˆ¡ ‹{‚|¹€=È£4™:Ášƒ=lMo{H¥C(è2ÐTU™­ìA{6aËN/ {€}À¶¦“=¼æBìá<~_ßçQÇ£#~{Ž6ÃRoK(Õ,ì�@°öЋïÄ|ËèÇ�£ŽgÆ™I�¡Ã­/Ë:Na)ÓÂF…X5öÃÁz1¯=dŠ 7°‡sbâ8’êŽ=Œ ±j 솃=áß$ņØÃñ@2ûƒ= ±j 솃=áÙŽŸz;Ûƒ¼B£:3ö@ Ø {èË™›Ï÷y¬=\TžÞíi§7´uyKì�@Ø {0Âsí{¶¿Õ°ÿ!V „=Àp°#°‡ÊŽcí!:O�=ø±j 솃=ôbÞ=rv°‡ÌúìÁˆUa0ì¡ØCÛŽöö�ñíù±‡Q!V „=Àp°‡Žø¿ÖdÀí?íÔ·Ä„=Àp°‡ÝÁ®íCŸË]`£B¬{€á`»ƒ=„¢+eiÏ�= ±j 솃=ìÎæöðYt'Lí�°‡Q!,™½œ€=€°‡ÝÙÖžó؃v$þCXÂ`+°‡ÝÙÐRë°íHü‡° „=ÀV`»³•=¤¼¡,öà?„e ì¶{Ø�Mì!ï e!°ÿ!,a°ØÃî,oo( �=øa{€­ÀvgU{øÔoÂÄ´#ñÂ2ö[�=ìÎzö𩿃vÙ¨°ÿ!,a°ØÃî¬dŸ¥wÐîÝ{Â2ö[�=ìÎö]Ü€=Ô€=øŒr€=Àp°‡Ý™Ý¢ÞPe"{øúúŠ—„‚=øŒr€=Àp°‡Ý™×2ÞPe {ønð­ÑÚƒ° Ñ|ÌÅ`Å`0ìawf´‡Wo(‹âÜÎW]9s!ï‹=8Œr€=Àp°‡Ý™Ë„ÞPÅ­=Ü^u¥=i[ÉH…ÀÊÀ`8ØÃîLaŸú‹7”EñfQ[2³ɘk${({€á`»ãÜ>K/Þ ŠÒ»}AËL•Å•=ÈÏ&iÖ)ûbÍÁvÇ­=|Ö]¼¡ ‹{8dÚÏhÂ=Öd,Vá8À`8ØÃî8´‡è×î}ìáµåÂö ê+iVSµº†NâØØêÀ \ šÛC¦\¿¼=HªgìABÒì:[ôÍßÃßÿþýýïÙàûÇ|߀=Àf`0Àž}3ÞP«w—Vöp}íÔì£DßÌ«:äI‰E¿—†=€°LUËï6___Ñ„g,kÌ)L4m°ðö`G¦`lÏèÅŸhËØÃ§þÒ™>í!ØæB ÚXجö`ÄkþÆFuù,½t¦[{«äu›(Ø@؃Ïä=væâ9¼=íá9O1‹=À`#{xÝR±ž=„ß“Vèp5kì¡ öË€=ÀÅ1‹=¼zCAˆQö R‡“¶ir u° q�…=À2`ðÃÂöpœËBc°ØüàÖ„ßË[�ÍÒR>ÑÉRÙ1ã72OEKšE«mïæõ T³Uõµ�\JÊþj°pö?8´Õ÷òVc³±‡Ì,Lêœu�¤´ð°„ )KPÙƒ³6ìÒ¼ý§ò^á©¥”öêpp�G°œ¶ˆ>u>¾EÎÇ~.YqÆÂZ�=ƒ=€ˆQö”+χۀªý­¸2£=„?Óó¨ÂÃ)’HL{˜ìÁìD ¹ZTpvõ§†íŸ¯n^{âí—7 Æ|ØCªÌ =ÕõÇÃf_ô°°{–ö -æWÆ2nŸ²¢Ùí¡LÊÂuÚE"oÜðèØC+°c°ac·Ìºž=dºÛäêà3–ðüM.£ÙCöV` ¢·=D¿‘¯d¯1؃‡@MB¯p…=´å–Ìò—ˆæµk—̩Χ$íkŽ Ïø8öïô³‡LZuhÚ.ŸâÛ~bÃÙØÉõGì¡!O{øï×W¼å××3¯Eº_,AÞ¾ÕqãpÃÃ@D{hõu¼¦‹�=Ègmf´‡ §-†Ã‚=XÏ õ¯ÆØ„ö œÎ˜×äUíio )6)<Ä2~-=Ô!`×5ö�:Û¨t^6<ìÜÑÐ^K©Ž±†„ø,ºí'ö0<ö05ýìáz<•;±‡È ±�ìAî ·Ž±F…�o²(‰+{ ðP{hKC{ÈäHËôØñÀÃð°�R,ÚþµãDöu#ìa–XØÃìt²‡ÔSÔ°�RfÚzíïö�y�]í�i‹¹B\cuR‡€=\,²‡×oÿéùãm'ö3¡µ‡ÏŠKFžgðoª‰Œú‘ø±‡• 6!®±°‡æ4±‡gFt2s1jØ4@nŸÕ—Œ,îhi’² ö0E¬e¦-öpù1ÓX’¡Ÿ-×C¼¾:ì¦AhѾ[{(è¢ZÆÑÛŽC‚i‹špØCs„+2ÝoG®iòyÐàxf„–ÃÈÇ@Ä«=¤¾‹¯gòöýìáZx0N~Ƴ‡®ê°°{ð‚7¯ŒŽ0õ©—¯á/cªªCÁÉ‹í!ŒøöŒ=ÇÂz€=ƒ=¸ÀáœVt�ѺBh7÷_ß±S—Ï¢ @©«ì!ºâḇÂ2³ f±Vš¶ØX�=¸`F{�xÃÙrj{Pm²(O½=¬÷M}¥—°‡n`Æ`qnro8˜×¢¯t¸=„·ÃJ_Ö³‡Þê°°{ðˆ[{8dô⎭ºd É¿=„γØCM,ì¡؃1؃;,·çíá¹…ÉLŠ;6é’?Ép{�§ºNy‘½š5ᘶèö` öà?öðØòöÐ|èX{²#…‡šXú�=ƒ=øâµ€=têÒih[{ЪÃAÛY ì¡&öÐìÁìÁÏÿ ìÁÆB·E ìá UšÄjbaýÀŒÁ¼ýŸÀzÛƒV´!ÚC�:Ô!P‡ÊpØC?°c°<×'^—><�²ø³¯L ºÚÃgé-@絇ƒš”‰=ÔÄê­{ [‚=€”eìá³î Cì¡•:gMì¡&öЕ×-cW¢ymÔW5áW8I÷`ûÍ{k؃vfå¨|ÚC(šÅXLÌ¢œ±°‡®<íáïáïÑ–ÿÿö3M,œ>Î42ë�ê_�±8˜ÝRKüÛCsu8Q¥ÏÅìa½E{À¬^Nf¨5Æà`^{È/�tnŸ²‹K#O¢ØCM¬Pz±5ØÃõG•=¤ÎæÄ„ÃK�{€‘Ljs GUi½Õá@2‹±ÞÀíí!J[¥À®?nb×ã©ÔŽ=ÀH¦³ánLŸöpÝâá²Ð‹Ì¢œ±òjT¿œØÃõÇb{ÈäHöàdxØH±·‡‚ŽŸÊ G‡hÞøæ=Çc3u8È$ÔÅìa¢Ey½¸�{¸þ¸ƒ=¤žÂÀ³ØCèyõ'm{­=|>v“Z&¹�˜Å`Ú¢2Vè¶èáæ___ØÃùc™=äÓ¹MzþHïáÌçlì<âß ÔA¢`Hr{¿Þ^NnÉu±ÂƒY”3V0Y2¨=TÛÃ3#ºª=¸öR<ÛÃgé…# ÆÖâÞ3Яù{¨Œ°‡þ<ó\¦q4¯EÓ¡{xžå„K~¨4ÀàÀ­=DW ô{8ç,œNÎ�L[T† ØC$+òÝoG®iòyÐà¸óáa Å¡=D«ýÙÃuüíáàºÛp�¼n¿Û¢ø÷_ ö0z�=€Wö�Zâ0‘=ñT‡€=˜Ð¤ö=Ï�tž{èÈs’"/ ¯½2SSçSQ?M=5#•ö ò†kÇ‚X½Û7¬�ÛÃAü¼:¤ÜŽTÞG{B?{¸>›Ê�ØCd�“¦½3÷§ò÷뺇ü"‰Ô ˆä×n^jì!(½áìèÐBÓÚI¥=„v™xO{ˆvy*ö0 ›Úƒez–Œ{hO&ß§ÜZ¾V/žÇS]–™)³‡buþìAûZ^O^¯õÉxêõ’�Rר¾]Å«fñl=ØÃõÇ&ö�z{XßRù[5s‘)^=C/f W´öpæÚâOO?öpõy3{ÕË (<‡¸þ8ÐvV‡°–=ä'Ê�”F·‡hU uäv0z†“ÔŒFªû¨ìá¶Rrj{Pí³�Ÿ¼¡:œ”åK ­Âa£Øaæâù,öОW]ÈÛC&÷ §$vž¹x–÷絇èT…g{¥3ýêÃ¥þ¯±žy.Ó¸Ì,§ ^f3 ìá¯#![68ä eOMúN^yµ‡Ô²€Ií!õ”s{úY ì¡I8ìa ’eçIÍ#ô>žíå¨ámd·ƒ){ȯ“¸¶Q=5éÛx#o¯™r¢=ùÕ‘M졟:œÓç’ê`+`£ie dY{˜—¼ù†qWYi{�ìD˜È$K§°‡ ¾ƒåzÝ�:ìÁìÁìÁ©’‰ýtWjxÏDd;§°áË©·u8ÈçQÖK¶ ‡=Œ{0{pÄÇŸ{uf±Õg¢{hµšAÒÒÒBvÄ’…ûX= oZ°²•%؃;„é|¬=ÈK'žíáxÐÄœØÃA4¡.™Ñ]ö`ö` öàŽü¾£�û…®ƒ±ñ€²^ ÷\ÔwI-É´W‡ƒ[Z]RŒcìÁ؃1؃;òéÜr;oˆíL)þôiŸš[^„ðfá×YŒ%3º½:„>K†µ`d+K°w¼~û·´‡gôeìá³èÊÓÚQ9´‡ƒw÷~�¸ª=üöçýc3`½ÁŒÁÜáÙB…@¸²‡[K{ð ÏÛ>õØ’EŽ3œä÷-ól+±ÀÈV–`îp5sÞÔö]ï¹­=ÜF’º�䕲Á¯]xxm&ù�L!ÿÍÄÈV–`îȤóÔã€=Ⱥdv@ØØƒgu�w|mó”’²wi» ¡Þ^û £cd+K°wD¯÷p>®¹v¤öxjx3ÚC´äPeg{ž¼þ$΋g¸Þöðzæóñ××ö0z�=€c{(è�,h»$~v{àú’­ÂÕ,žmµ‡ü~±+’µeÑSyøþ–^°½{ö 沇|É¡IÕ`<¨CXw #ö€=üúã-ÿ–Êk±û#úYyö^ª‹Áð°Ð1‘=Tî«lÒÞ¡=¬Zx0ްgÔÛÃq·ëÖ£ÃKuÁÀSØÃñ@ÞËÀœ¨CX7�»U‡€=˜Ð¤ö�8� {� ÏlØ¢¡bpe {h¸M£²=ö°d¬€=øc[{¸>k¹){ží¡ ê  Q0¤ß~¿áwb³¿¼ã¦-†Ã\±­=Œö:ÜÚCÁr‡â±•ÙÃqd¬C¬šÎ=«CÀLØÓRÏbà‡öpÛXáÊBbÎÂ8Û Š=œ`¬dé=œØÌŠ7{x>;…=„¥ïSeγ=بCÀ²åËdæfÀ�=|&®åàÊ^Kš9êÐ0œÃÂCÀ²Ë o,i™ÔŽ=ÀxœØCæl~ìA¾Ï ÿa ÃayMfÅçIÍ#ô>î|xØèn©’CM áö:!V‡!á°‡´²‚=€Ž±ö 9‰{P©ÃI§D¸p:w®{°{0{íA»u³ßØúÙCèS„À†Ã|‚=ƒ=€Ž!öp<�/TkÇ€+SZC‡XX†„Ã|‚=ƒ=€Žáëzj¢‰:œ4I� §sÿê°+°c°ÐaiÚªCM úçrÎâ9‹(•Eˆ…ÕaH8ìÁ-؃1Øè0³ír‡â@MB\GÛiÙc(rˆåÓ9öp‚=�­,Á@‡�=|ú¾òô³ýmWH¿|¦M–ö×Ã^xÚ"`¾ÁŒÁ@Go{È|­o«¾ýSt .úÄEˆå+þ �›\X�=ƒ=€Ž~öð9Õ§¯íŸ˯ÝAà˧sìá{ÀŒÁ@G'{Èïbphá!:–öp�OŸËçò)¦-ö`ö` ö:šÛCªäðÚ± V“öNÔá S„X;�ÏRx؃؃1Øèhk’VWö�³ãìáà™J×^/9$öàœú{lÞº\o&í¸Éݰä#¼7ÀàJ±=„ÇÞ„ »�ƒ{¸.–µâ!Å­±|.ŸeÚ"`V<í!õKòý¿™²‡çñ!wâ>¹ç…KÚ`ð MìA;S0Üž{+,÷YÈ9"t»Wg&îÂöP£{°b{8žÊ·Ç`Jj&/Ž]—4tÑ®ètk§C {È€=ØPi©\8*=c° Æ·ºh¯›H}ªÃs Dª1wáFÄüSoׯ‹°É# °¸Q`eU‡³ï{�l"õf£L=%?ÏÚöP©{°¢míaxzÆ`A´öP¶ÜáÙ½_—üÜDªýgÓÛi6¡afŠÅ›;°‡)¨_÷=ö a¤ö7äö�Yl(ÇØ$›A®ÞPyÌVD“}§Qõž ɇ¶—•¯¯¯çñ³œö ö`ÃŒöð‘Þ$‰=À‚íAû…^~žæ]´Õ‘gÕaˆCÜWGþïýOõÿÈmy¯ík,¢ê�ç&؃ Ì\XOô°¸!±íJí©Úv9g"ä5•ÔåƒÉ÷ïãÁU¾Eái/ç©v U.w»Æ"3°o ì!ƒ¼b¡{xæ¿Lã¼=¤ì!=ÂHìnäí!Sù÷lA³¢3¿X²“CD¥á�§ôêð.ë'­* ’ó¿Þ×£,zæj½:|ýޤe¥X`’„÷z†óqJDzO æ9—ágxÑÞ`p#cÚ 'HèmmÕᤉC\3bÊz¨Ã+gÐC2ú•[äNÐC×*íA®„V�=ÔÛ¨ÀœâY<£ö \lèÍ´sA¹KSë¯K"]†ÚÃùãõÙ21ÅŠ‡+MÔ!ÏU,°ìÁìÁ#¾/rþ´ùbC?öpÕ�úy¢ß%¡_»0\¢ ¢ÇkÒÿ\ö` ψ·#»}tcÆ`î8wòLaª²¿{¸5èm!æ õYˆ:ÔÄ�ZEóå™ǫ̃|PcÆ`N™Âj.«Ðµ—vù…¼v"ÌayWøc­ÀœöÐ<¨¤P1‘= £ÀŒÁœâÜŽ½·B÷JuIUJÊì!·S@¶^AØ2Õ}®ÂCA ë�fö0Wáu8ÁŒÁœâÊž;§Ë®~S|Ùœ&EŽÌIäë$®4I¢Å±FáAñ” ƒËiPx˜ìÁìÁ)®ìá9¶¹ìáuq†d�D׬©uˆå ™ˆ]5"ZO ê0ìÁìÁ)ØCMÇk{a]a¬=bgu¸={OfϾ³�:°§¤¾¤–4ö8›{hÕ~ˆ:œÜbu¨ª5‰†ê�o_ðÔ­Yýgòõã%õb:fÿt` Æ¹=¨.`•?ÿXu89b{hQ²ù³ÀÚ®u–+°‡¯;Å®¤V~äDÏ|}'£Ýû}‘ öjÜÚÃé ­.áÄþšÝŸ9‘{ú,K W‡| Ì³ŸÏQu+ÚCæÆrÏW*Ÿ½�>5dy,بñiÚ}¯!¼©Ãuþâ§ÃlÝC´öiàvè0Šáö ]¡ ±¤:+íaÔm,êÛƒ=8§=ô¾ß•¶cÙ&‹N±ž:HÂåØ\IS¢*­uÀ¼ ¼DŒ±=hm ·=ÔïÏlxû‰ ÕAúU/j†}„r‹€:üöà…Ì¢‡!öp[©Ãíá¹>º pB:9ØÄb[©C4âõÇë�mç,Ê< ¦PQ¶ÖÁRž¡Cv¶âÖ :âm€=@œ2{¥�=Dð„`�$c¯3ìÁO²8’±·ðÈÐÉ ÔáÚþö#¤àO’DíA²ŽòÌ Ã÷8xH–†qŽá� ãùú�çS•J�=ØÀŸÊvÈë´O{Ð^<ê™ Ìò–‡œívgAb`EDuëm¡RÔ/wÀ„𧲪oZ7{(»põ�[蔽œäìàc$™1Œ*Eh§-$ªÑd¥$ö „?•½(¶‡&êð¤GqÂCÂ>p2’×a;Dínžyäø<‚=ìE�=tò†•>á$a7#‘Ãl:£ùzɆû3©=áOe/´ö`pëäWT“ÓåìÞŒ¤k)³:ì@ *{‘·‡ë‚Ê5â¶8?Sœp’³� #Ô�¤S)¢­=4_&‰=áOe/´µ‡óÙ¨X(Ej__fÃ3÷öp=Ih÷®bkÀŸÊ^ÛCªÁó`ÛÜPp¶�ÛDÃrêp=[hq— WêpÀµ& Àö¢­=¤z=jsÆÑ¾ßÊ|vŠŸöxPvò¶»-øìö°ö�:Õó`fï9‘µwŠ«Ûjh·Ã Ë€=l‡êZ“]=R‹4‡¬Ð¬\<±•:\„wølò?‹:x{G8ñ‰h¸)vŠØFRŠhb¨€°pDªÚñ´Š~>!¿{“·�¢Ãïç�Ná`1°p„|®¤ÓvÕ’‹kKìá:€ãÁí¾\V{GT®´¨TŠšÕšNLb¸:\9K¨Àz`àˆë4…JÑp£Çyž!÷®ôcg)"T‡Po`à³+ýÙ\:ÓX#ªCøuÎB¸ äÙ€�)o`XK?¥0˜×ð¯)òJ�:ø{ÈÕ<š+E§‚„C{¨Yî�éÈG€°õŒIëqÔß?b%u8¡ðàì Íz‹b¥¨×oö€:,öÐqµæ«RÜöz˜êö`г­“"ßDz<˜ë"Ù¨Àð)�9R#¿W®š•QŠŒF 0ìZrn}ä÷JÂ땺mXøÓ$³Ô`ø”‡ö`BÊÞ¨¨R w [Á§<´{Òð�«¨Ànð)íÁ„ô~£l”uØ>å¡=ÆöpÍ‘ü>çiî¨Àž`ÐK{¸Å¢ì!äu»‡D)ªÿÑcá/Úƒ=ø§l»ÇU)ƪC Î0>j¡=S8ö ¤áv�Ê{†i‡Á®`ðíÁüÓ{»‡ðÅcà?`,üÂ:ŒÊ(3f²!Û=nwô¨ÀŒï9ÀJðë0$£0/'sé̲ù‹ê@!üÂ"ŒRæà ¨ÇxÏÆÂ_ ¬À@u}j°€Ùá/¦gør2™ì`vø „¹yN¥ÛüJß®¶Äß‘ ì`vø P3üU³_œ{˜þÔD÷pyMØ>wj±¿+öcás ìvƒÏ€Z°Ø >wæcöU“0;ØÀdŒª=<!1Û‚=LÆ{xÞ΃ €�á`2ìÓvôvØÀÎð0Nf.Ѐ�áï`>†,8ˆÚÃ9>I¶{O{i °üÁ€Ö=À ð {€þà@ö'üÁ€ìNøƒ\kN°Ð�=@®ßAOøÕX쵇€@, ö ˆÞB)`‹‚=@òöp>~^�ðxðü%L=õz<:Œ&§€ì ±‡“ÌÁkßçSÂã©5§€+Ø4 ¿jòù-ÿzäöl´h‚’yê6ª×ã’SÀì�ÿÊþº*B®Ñ(õµŠ×SÀì�ÿÊÞÛžÏæ�—� N°h@™=„Š™ íHž °h€ÖBö+~«Õ‘òU“’.p‚=@ ì!üZ�>¥Ý™)Ù±)ïØèÀ@ö:°Ð�=€ìt` {ØèÀ@ö:°Ð�=€ìt` {ØèÀ@ö:°Ð�=€ìt` {ØèÀ@ö:°Ð�=€ìt` ãÿ²\ä endstream endobj 70 0 obj <> endobj 77 0 obj <> endobj 74 0 obj <>/Length 20470>>stream xœí½Mz庑vÙ¯ÙÔé;Çqà3 ÓÃðÀ7ŽtßžMõóJ‚aã'€ ù®ªç"ƒ ´µ“‹€à�ß¿òöû«�}€ÕÀ¾Àj`_`5°/°ØX ì ¬öVû«�}€ÕÀ¾Àj`_`5°/°ØX ì ¬öVû«�}€ÕÀ¾Àj`_`5°/°ØX ì ¬öVû«�}€ÕÀ¾Àj`_p&?~ü(7žò� -ÙùŸCúYíÜN€ØœIé¼³,˜�w7ïÖÀ °/8“ªTN1 ì X ì ÎdûfìІ”ÝÚögû Ù­=€A`_p&’q_ùl#>{¬NõŠõ—{³ä-©VR�iý¾L;µ5´~ñr{õ÷íî¢Æ]”vögÒmM·tûûvƒGZÂÄ3µIšg¨¡lU«�ÕjùÈV˜æ ?Iî ì ΤÛGTM†ªÚ‚Š }iɉÌ-ÑÖ&i^õ�–S…•t/ÞšòÏgó n¬ög"ì­¶â™ 3ûvû[¾-Ñv�›'©Aø[¸ØW®^>€û‚3á;m­гì+o‰DN­Úv³ouTxо­ß€çû‚3^­f­—õ}gÿ^;Ø·; ìÒ÷à™À¾àLF,ÅTè3-�}Ý“çÌoÀ�}Á™À¾’c%í�}¸°/8“®lÚ 8ÚWÛ’‘Ú$Í£šíø_PØ û~Ažì ΤkƒŒmbÐúR8&mp•پݶì›�Âå7¼ÁàÀ¾àLä"Œt¿±.ö¥Â7ª–d‘ÕàVmÂæe5H:Ö*ûV‹x.yUeóÊšqöÀôç<°/þÀ¾Ø`_ì €?°/€öÀØÀû«�}€ÕÀ¾Àj`_`5°/°ØX ì ¬öVû«�}€ÕÀ¾Àj`_`5°/°ØX ì ¬öVû«�}€ÕÀ¾Àj`_`5°/°Ø€QþùÏÆò?þñ�[¸ °/Rãþüùóׯ_oÿ}+¿âv˜Ðö@JfÜtW´o¶1–ab@ ì @‡(ÝÒ¯‘ª}³€X†‰°/ÊnnH/·â»öM‡‰°/ß0Ý\GûfÆ2L Às€}ÁÓaFsS&Ù7 8Ž#þpo`_ðD´‰ån€‹}Óô‰¸7°/xæÄr7ÀݾYå± p`_ps\ËÝ€©öM`bîì nHÕ¸¼Þ®bß줱 p-`_pøsçÙ7L˜zcžÝ»01×ö×F˜X&oû¦ç ៤Gê €‰ØØ\Cb¹ <<ž®LgîÏL¼Ò¾YÃb&``_pFËÝ€îÞP`¦%óSºÒHC\`böö[ã•Xî”{U�Wù¬«–‰wŽabÎö;RvsgË©´£jàVnßlcV‰¶—˜€õÀ¾`ønîTûŽg†mö­¶áÄÔ4ÁĬög²,±\ H…7X¿‹}OOMg101ó€}Á d‰e­F&¹ÍÑ¾ÙÆì,î§ÆÀÄøû‚E0ÝÜö��×�dß, =ÝŒSc`bÆ�}ÁD¼ÖX–Äð}Çnnùö�U/³o+;M�1b`_à�6±ìk_[nùZöͶ§Í9Åx ºÅ�}�#‰e/û†‚-·|]û¦Y“´58ÆL ì †à×ŸŠ»&Ù·ëùYîa߬¯Û&¬a^ L @ì Ô¤Ý\þÅ>wûV»¹ƒg¹Ÿ}Óí±|–}S`böBZ‰e¯¤±¤’Xn9öLMK*qŒ!˜<Øpt˳í+ï·Á¾æÔ4�”�ÎÂ`bð(`_�#_ЦÙ×0fy¢}ßv̳ûì€S²ÓLL nì Þ±½1·ŒéÚ:PºöW{*acÖÛ7½Eíg~…Íí›Æ¤?NÍN Ã`bpK`ßG3øÆÜ,æ­Üý6ýøAo1oÿ-9×=ÂÃ[~ýUdž³Èä:r;•m\iß4&·ö}Ž/6Hc$ê¥/ûf["Ž}ÓjWÕ\UB)¥}U‡w°&€‰‘ô‰µçlL . ìûJãzu_b�Pø=*í›í%�)Í¡=oµÉ{lÕ½©5ùÃyûRòA¥‡t°8@Ë­àöM�‰Áå€}ï “X>ž¼zcL`DNƒö5¤[…öͶd‡_ȾågEúì´c“Ò0˜\Ø÷n¬|±A<…KÇ7 ˆåÿû—¤11 ½Hܵo,:ßûVÏ®í�û ÆüTf§›Ô ƒ‰Á¶À¾7A²âcŠã…Xþ RÙ— nºö•$Q™ÃÓcGì˜öìoß,&–Gn)„1’0˜lì{aÌ� Ã$WsÕ×Gk_úJD§CW¸Õ*:âQÀÕ|©qDϳ¯c=1`eæ™æ¥GN!0Ä0í¿�}³]±üëØ€}_8kU�I«mŒ‡MµïYla|æà³ì÷f§s?…$`$fR‡~F˜ªÂã8`_`ö½O¶¯¤Ãª°$,íÃ�kßj"TØ<—6øž(–Ǜ䦊Dߨ€}¯Ä>ö%åsº[Ù÷sÁÊ!é+�·²oº=mSÿx|cb“šÖV妊„}� Ø÷JœbßP(-µ›} 1ªüóžöMÒÆÌhƒoLVý`_pW`ß+±Ì¾Ùu°ìø’Ø�k&* c � ÇîïþöM�•6LXÃâ>LÕ§w9£9ö6`ß+1Û¾e0æϵ¯K?›4‹P–Ç’ÇJ“æóᾩiÇyU±<òù¨ÂT‘°/°û^‰‘Wü21¥t³˜ª}i¬?ºÒ¾Â7,1¡pEû¦±Ìô87´/ß§w?£6ö6`ß‹áØýe¤›Õó³ýNÎŽŠÌH;·‚½RÖÄJëø`ž>]ì[jÌà°í›m�å_®ïõÒF¾Àì{1Æí›^y5’>’ÿ¦?Ôá=`dqfm|ö¶à‘ôx éÇ•~’áÃìf˜S¬´oº1bä*öÍbBÁ«aªHØØ€}/†Í¾­”�Þ¾%GOÀ!à˜±Tsɼ+?K:ý*lI?º_¯™çòßÓ¾éÞX<‘0fFUÝßöûûæ¤ë>¦k>g”ëDn¸ÜU·O0ß¾éÞ#M\϶¯ö�îQö=Þþ¿ú‰ýj�û {fçÚ7�á¼³}³-¡ ½ÝÔFžhßê¥ ìCçbû¦”ßæôåÙö2~“¥ž}qµíý‡fï!Yã"cMß—9ÑWÚùˆÿ_~hŒ}ƒÝ²•öMŒå¸}Ãì4–ý]O+<Ѿ¸€oK÷¯ƒ?Þ7’—ý¥w{ÍÑOå€.�`_ªó˜míÒiþêòŽû¦K,øÃ'ð1òÔôø¹&…É5|‰Ž/Á¾{û*Ú·pÊ+~[×Ä…ö%VÀå®ã£ü�8�Éwõæì�ñëí/¬²o¶=­D{¸c€<&–UïŸ�fRD°/ö5Òíø2?.°o7·¼±}«19f}7ªÖ�d›3Ž8ß;ýèÌöMbU¶Ã—Ù·ìÄgG]¾éöXþ%žûãa_PöµÐòßYö-ž_Ú¬ö-·E�©ó›‘)ZÚ^Õm {¿ìbßxé�…yi—€‘˜¬ÍSÏ55L•`'Ø´�}Õ0]ÏìÓÜ!óÜb­}©!àrã‘ü¿�ïøIëj½®r$…V#�©öÍ6ÆòÎöÍBaM{ÜÃb¤ä�}A ØW¯^jtI7™u•²¥}�×ÿvë,+y/ÔfE5©f°‹Cª-á[xdždßto(´bö±/ö"ëØê¹öMŒå¬Ø´€}Hžëm=¤[ ß^mäeíK…JÍÕV”3…g/w½ x�}³¼t¼¡}³-¡·_ȾٮX÷«Û·\á€ÃVsUtÙÅ4˜=¢­ê6öU`°/½ö€gl/O·¥}IæÚr‹¶ÎÁ`m…Y¡ZÕû�ãXcßtK,ÿ µžkßtW,_ѾYØÛß}+ûòëo0—¯,†·o먻º >¥U’þwã:ö=X·¶ðu.‹<ŠÿR­|¤Ûå§µo¶7Ì5c¼¿WŸ0ªÞÙ¾´_æù}KcŠÃ�âj_ÞñK&œfG1g㻘fd[V¶JØ`Ø÷n,¶¯X½d²ok£p¯{äQ¨´l­û LjüFì ohß4  ÚtúŒ0Uä ìËÌ$­nì*ÐqWç÷ŸyêñþwãIöev™#[ñGòßn|µ|ð^cßôÇXþõ5`¼­}Ó�±,I§»·JyiûV+¤+Ø·s…}Á ÜŠùù2„yˆ›v°ÃºåÛö‘Èò�ô¿ÚSd5ûØ7Û kìëzç÷β3"ïd_‰zù-°oÖHØ÷n̳oy½Óô}‰µïÁÖSÝË¢ «HÖß®ºýøÏ~ÿñÇû¿CCâwž}c@,OºE�Ǩªê¶ö}Ùb²/?t7û–m†}Á ÜíËt2¬ö=Š£Ê-ݽü!òæXr²/•¤÷1§Û÷õ¦*o¡ËY„1檪ßUØ÷e‹Þ¾¶‰Nå–2+»¹ÕæÁ¾`^ö•dö”ö¥˜€UÚ· èÆ«ÂZjoÅ©}ßþçÿþïßa‡¤Ç#—Ù7Û›·¿}Ó]é�°ï÷¥}»ê¥mìË4ö+±ïOýC¢_Å£wÂ2àx-Kj8jeI¼–x¬¶’Vüwe ¦OçÙ·láH3„1îU…Âø­ƒ6òêöås¼ÌH0vŒZrÜUmÏšS�7ö½!û¶.O’+rpÉW6õøÚsd‘1ì+õšúެäaµã'’œ4lÿìûRwÿ§Û7Æð#{Ú÷××¼î¸ÑÖxy�­^jØ—‰ǰ–›™þ¨û®O=Ø`Ø×‚p¤¡ŒçoÍÛ˨:4Л‰ö ÄÍtcʘ}IÓ%•×Ù=V[U+þø°ï?‡6¥)h&ÑÍC¬´oÙt”柵òÓÞK­OM·d¶³}ËÆWSÖ°/öµ#1å‰öÏUvÃFìHŸ|õx²6«J^¡¤æîI%‡|ª·üÜÞ6ÚäçÕcs·o¶=¶pOûÊ?^ظûatxŠ}ËÑèW®qûÒ×<,ÊMœr?•¨J@7’9Ö°WrÈ‹}3 gÏ et/ù[®sí›´Z8ãt¾UÉÃ`_Ðöµ ‘¹Zv$óÜbûV{�eL±í`�8¼ÕÕÆ´â¿7jýâLXbßôÇPHS©;Ø—ŠjÈlCûÆÈôGæ(Ø0À¾jªæãí;¯Üjá�ì[òU<!‡õi]I°ªÂxeûf=þì©-ƒ�óÒÝú%æ˜jŸrÞéFÂÊH¦C ûØWG˲eÌÎO®hß4¾ñð <­+ŒTUøŸý¦eÊ=ýÕ´©ãñ”ï‰öMw…Â/ÙððöM·Çr€}ì«Ã`ßô¨ÝVÛ8×¾¶Žoé°�ÿ=¾6ÖGu…aÂà#ùoº%ïæ–k•D%«:‚ò€–†w°o kš$S�ö °ï=‘øöýÚþÏäᥣØ_Ýhˆ·Ú@Ù³F­ÉÏ12~òŽöM·Ä²¤¯¹Ø¾Ù½m°°¥6ö °ï=¹¥}»ñí!áC¿7bß©igm€MŸƒÇ¶&o×'a½Ù÷ VÀkRÓ¡0r° &kçYö=]½Ô´ïÑ?ºYð«d&+tßUþ¾’gÛÏj0ì{OFì+¼x­´¯0Þ`èqõNð·z¦“’Œ—¦ ½vyÝȾe>™Ï03G¹ï*_IdwéÀ5 †}ï‰Á¾ÚÄ]ŒÏ»ºÄÛ íÒñíNž6¦¬*·/}ø#­Í¯Î(õ¶•}Ó°nÇö-í[­�”¯–i…¹ìâ[ÛŠ„}¯Mw°}ÒÂî nIJöªô~l’5Ï9ò:D^më%ƒMr¦×¥¯þøë¿•cj>žÙÞPØÓ¾é�¡ ½}Q…Ñí+ôÍ>ö•¨÷Äþ$ƒí­äL5xp{µ…ãcx1²cßÀ_t_! ÙkŽWUëž46´�9ê幩¬ïø0í÷~ßXéeγoº=ä½vyÝξü�ê†öå;0°ï%a²Õqk4Þ«Üj¤×Gj_’v‚OL;§ñ4ð¼²äá%mc¨¶e%ó þ(üZø@0�ÅŒô2Ø7 ˆe¯“Ò½ìË«—Nµo÷ª[ý]`ßKÂíÊ�^2R2²½ÕȩٶŠz_Ó‚RÇYgØ×vˆð@Uœ’e°ÂÆ,… 0- Xãxϧ�цy Ó�ì+ÉçEfKkß®z™Ú48ÝûÚ‘Œ+œh_¯K‰Â¾ô’­-a¡ëqÎH;ÇC´�Qµ‡©¼ÚÙ­îÊŸ9.?óWZ¹Š³ì›îeZè{®Á°ÁVº‹}[×™®}©æB÷]eºÆrïY †}íðßËõö-ÿ=Ì»~q}ßâ ™Ök|$L²¯yâ•at9ÛB²ä|(¼¬šùuOóBؘ¤ ©aŽìcÒm÷ ˜ñ°,/} û6 /zÕCÜw©,¿™XÐ`Ø×s‡µOß·û[L·oÜøúš_§¦� “¥ '2tµë«U×ÆÚ¿·¡CA¢�•öíö2÷±o ’ ÷´¯öðêvù`j5Þ}—¼ÁÝëöÊþTÉ�VF«ÜjÃFö�»^™ô¯!~žæil†W%óÜú„ÃÇ[{˜dÚ8˾éöPv1}µ*ìÑ ‡‡éöS�}ÕTo¯$cøe°×öV;Wgžõ–1‰Œç»d�»Žyšh|Š5•Yè’"�ÒÕÆéöMBa¼=^MjEþlÏ—†}ì«Æ`_zíÏØ^mçvö-’)ZmBØwàÖ÷A^²¦¸«õÄ2§á¶€»ùÞ5©ia˜¤‹¹ƒ}³]¡`_ÀûÞ–kØ·Üøš ^ÿô°ã›̳®˜CêƒÁ”h8ù<ýÿ÷wó½4ÿ™%y˜×ذít.µÁ¾€ö½-ŽC¿•K¡vЗ `2ÿþŸÿüýׯœåµô`OšQ5§ä×±á(àñ|ï‰öM·‡Â/ñôãõö À¾€ö½-íûÿþ§¤ôínowˆGVW^¹t÷¦�z Lj-�~€o–»³¥áì›Äòx«`_°Ø÷¶L²o]½díø¶ö æNj^¶´yÐz<5�m§–ˆ.©�/|!ék:zNUÓkw<�*rõì»7°ïm™aߦziؾY€°'ýłǂ'˜ÍgŸÝÚõÎÇGÚr0ÿMèæ¥»5ÈcÌU•�„}qߨ÷¶øÚ÷ýä=×ñIpÿ…×ûÌ}ß•š/ëFº‰?‡ŸYÆŒW%ÏK«Z%�„}AØ÷¶ŒÛ7½„yök»aZõ–ÛÌ÷kV£¤DóäÔ÷eÖ‘Nƒil)J[GsñT)I—Ý·Uñt°/à�}o‹Ù¾•«*“pxÙ—’5›$‘°W iê5«Q’÷»²§„[{ãè©MQªŽæ†cþgŒg�}ì{[ ö W¨\ÆãêÆhƒÍu )¶­Fé•sž1‘[òb¥ÁâµÆ†iæð0ì ºÀ¾£ÈוLw-XñJnßX®ŒäuÕKsìpìOóƒÖ_ð©fÛJ<|·µ{ºnL먌4eÍŒDõ|‰±aš9<|'ûJÞPî:å- òÈ^ ûQZ�Y‡rñjÏ]ûvsq>n“´‚ùçŽÜ;ÓTIS$«EΘlå{ºìÀêPqJÙkÔvŽ/16LÞÃô±}Uo¬ÆKzg½aP)¹nã ƒ[S½µáß8¯\m?JÇŒö½wy…Pši_jO²o+Þ”¬î"Ìf—gt|ª›‘–‹ÓkòbC“¬×.¯�ö¶/s?×5kënÕ�Y¯£¼d�ï*_¾ÁÝ®l0ìk'|v-Ýf?ÎÞ^m^µ#ÒíÐüíõÇÇQù嵿š²t°WÚÙßè“~• Õà. ?,Y~«¬<:xľiL(ì36\ «¶ó™ö-;µ©T$¥Väø®ò÷íF–w g5öE8î{¢}U·ó“]\r%> , Ö.Çah€<¾ÚÍ ¶¾²¤æÁÓ1 XºØw·±a>,mçÓì[­�’kq+�šm_¾Á­:aß«²›}ËñÕ3\k~Wû»5Þ4üü)cÛ«TÁò|¸áìÚx~m�dEÌòЕo ŸœU¾ÎÁœ˜ÝplX~ÆP�TxKû {œûØWX'ì{U¶Í;Dè`ÃYÒceožúv&þ�†™z£ky%3d¶ŽßUÇ]á\*ym·±¯<ÇÛêw2éºñ]ÝÆdÛKf´JØ`Ø÷Όؗzr•ëùe‚ôøìèî«§&½»‡ðQ/½vµ{ïœ=¡ºÿ^á¢tS‰ M©Ö@~«SùÚ—¶éøRþL¼0¸Æw4™ìàà.CƒË6ŸÒàÓìËß¡TSµ‘îßTöÍÔûY›[îv|›£Â­)Uïý=qÄ·%æõ–544l˜=ÒW.7v§k•T{Ì-IË5 ûŽ\G®ÀÕáØI»´ ®¶y}ƒ÷²¯d 5ÐM©ÚÒ¾eÌËÏŽiÛS:¾YY;âÚ“&.ßÎwµjy»°p$˜Ÿ�'H¾èv‘»†}qaÜ–�ì+©–„ò°/µ»°ã£ÂepœxÆ› UÕj‰Ípïø2§û@¸¢ä z»ï¥HSåÝ9zL€j&—û4lU$ì $ìb_¡h»òó�™ázIZãr\žõç†i`yg~ &^È‚ù\æJŠ…·˜g‡\Ô[­çSöY×ÿ£Iåß:�ë Y £^~l˜–?:L°/�±…}%cÀ­�Ýqb‰˜…Cú—ÞTó¨KÚ¹œOײ¥�}_a8DÕ ?iû‰¦2#í¢Þê�Üüó¤ƒÞÍHSÛ¾+džåaûçÛW8j�Â?øÅˆ™w6+pEäö¥öuð³ªD�“ÒÎݘϒalX¾|´„ëa9ž·;'<6/Bɤ¯+ê-[õúˆsÿ©ñWËòÞ-IMl–‡ì dœlß@õñdjÛ—}_IU÷ÓmÆ%ì«�ìkX5ßxAÇ×eÐW~^Íðpù¢ß.Üo@þw;8ˆÖ÷ÑaÕØ°<Œ`_ ã|û2C¿¼’™Nm„Ÿ>íe_ÛãnÂ1iíö,ÆË¾”hòûV³ßŸ%aO×å) [ünöMö�°ÜQ¯-ÃßspüCgƒ»*¯yt8Öû‚.çgžU[ÊíÂGÍÅÚ·jÁ–}…7æíeÛøëEº ®\�k}åa/Ö&™§ÚW;ùËåÔ# v~!/Ó·wÍãë¯÷‘x«~,]+ì ˇ‡»ÿX`_àÈFö-7ví+™ÿÜÜ÷m庻½öåjóª×‹lMZf¾U^áë U&lRÚ¹óY xÙTçýí›nÿ¢5¯êåqÞLá#®µ¡œÝÒ°|{½i�Çca_ÐeGûR£§˜"I;§‘å^—9Ïáãë6ƒŸùåµ½ÕÂô’¼›]Däö%™€¤�ùÈŽ†ÍR4¯àq!ûƽ_Ĥô7æu4 £ïµg…«³ S×RÓY=íð0Á¾@Æ^öͶw翪7Ð]Žtäñ_&L2ë*Õð>꥖}™ñõvO1Ðð*»Loa|W«©|_¨³¾Á°¯üÈ«pæ—×ö²m^ö êM¤ÂÁò%±NL;·‚[+þ2èž‹Ú×0?|°û«™s�îöƒ³©Ñr _—tÇ�ì«�nRFNÝÕjmuË¿KÖZØ÷Î̳oÜH½Á9íÅt^˜$¾|áR%AmèÛ«IXðŸÞؾ†;¶ìž�Äã»ûÒ—€/÷zAr²o¦®ïzö³oõ Ä¾§ÿ.YÛ`ß;3Û¾qW,Kr†»¥�™€Î4ïîÔªÚÂ^ô²åu aY¤Wå²éÍ%ª{&’­L)ïþ>Ó¾/ÊÆJ÷±¯°‹ û‚)ðöuQoMÌÌšÙ0í\Æ„‚dŠÙ;i±±TÓ¸}ë'MÙÁ¾’ÈÆÐx÷‰5I÷7Ý Ý¥(…ùjØ÷Böíþ`.ëí›þËÙUõÄ´ó¤`~ùíy…‡WºÂSíëX-I ™¯'ïþ†-ÂIJ<ÿÜ {ˆ}÷ÉpÏ0·ö2S�×ta_ öõ¡å¿Å}âì¼)åËÑöéø ÃÊ®ðB%¶wnnƒáÀ‘°º†íÛ[9²Õó^~¦•ïµµúì „À¾>0“èª�Äe?.Ë2ƒ}ANk\äDûvoðcy†}ÓídzÇf¸núöUeÎ}§FÇø(ݪ€ûF|óÀ#"ÏZû›jÎ~\¹‹ÿÝË3²\ß`Øw"Õa†eö-Ï.¼¨ýÏßþæ’yæc&-ÙÑ n9Ø1›}bþ\åþPpY9+�·/}} y ¯–?•Dû©—öeâU™çêõmý®ë6ö]Ä>™çÕ,œyF´0L>3kÒè¬cŸõ*öMWÎR=ÓÌàkßôG²æ�}“رÌÄ_¾#UQ­÷Ë'îºhƒaßYTG&²¤ÄŒr«1¶+ѼÑY¤×̬ndÖ ~¬}ã�±l›œE¯ê%WûÆ�¡ ÊOBf†oîm_àì; yRÂ}{µ1#¬ÌÁŽöuŸ™%Œ”ÏÉRÕy9ûf»BÁ°ê5oß ^’ezdž%UÉcªaÕ–À¾@ì;IRbÒö²%ã¬xÅñJ;3aæU;H?ꥷýíë>9+°Ì¾1&\ªüw‘6ö*`ßGàb_ X›vîÆ„Â$·Iìhß‘gMÎ ¬·o¬-l1OÎòMbÇû9°ï#p´ozáY&ZFâ±aYIãföM'g˜)Z§Ø7Ý é謗Våaèû°ï#pïûòöµoõu÷á᪃Ÿlßlc¶%.y]ê6óñTû¦»H¼j‡ðtò0ب€}Á¸}™,_éà©öÍvŲjxxƼèÛÛ·Ë­îoT/Í·o —̳P½û%°ï#0ÛWžÓ‹ž”v–„…‚ã,*y…Â:©Öƒì2)Ù>^aŒÿ׿~ÿùçççÿæÝª}½T'�éjö'û>ƒ}6žkì΋vwª°BZ2<<¼+¿A!Ùo´‰}ã�Qѳì›þ˜¶Äýt±rØÈ�}Ÿ‚|Á�–wÓ¾’Pp|KR7¬ŒdŒ5éù¥Vpì쪘.#[�ûÝìKŽ[RŸeßt;)'gÁ¾`°ïtZOýîöȯp´Ìe^´{Ú¹Y5ÖŒ‚ËšKéòM­ÂüR3–ëÒVH5õRaßôû˜� îfhº-Q�.Vû9°ï\Z+^mµÜ•j¦¨vâLÕÁóÒÎÌ^2-ÜAzûÆ ³­©ÂHÃo´Þ¾Q½ä1®áC²;NØLö�Hõ=Sû,õ,ŸQ•eèg¾ÐÌ,à ޝ 8å5 ì·„‚{*Xnß´_ÞJVþt…—tÌ¿woY¸­÷�þš£©=&@8$™— VÍÌ’Ì¥"Ótªñzý�háä¬l¶oÄ=l‹©v…ofßÒ@)ÌÕ£ �/e?u×u ûN„O;ŸbßÁU’¦ïNý?ûŠ€cÚ¹&œ™UÚ(}jÈð ³0rp5’Ù“³bð¸}#ü÷SUÏHLúuÚwCõRþÌýY«‹Ë¥]Z×%z½ÜMÚÕú­ËSû yVƒa߉To3-ÛµoÙ€×µê¸oµ“±r±h&²;3+Í .±)ŒtySżÉY1Ø×¾¿zÏé®ÌNKîwµ¯öjSFNÝUý•™W�:«Á°ïDf[ÖœynákßîXÚOöáàeöM÷R2�)[cý@µËèø¼ÉYÔPo ‰€ËIUÚŒ$¦Ð:$^âmS‘]tøLûfÛc9.-´oà-x±}ÓiÎ79û-°ïƒÚ7–çõÒáÕ­tð¥íû;üÙgä;‹ ¡}³Qáô;–2{°6ë þà\`ßéd$;?òë2£J„×µ>]ÅËO¾³‹ÿþÏ�¼ý·ö¾ý—V-+­ª0wí›y7¥tð²©RÂ�aùéöz`ß¹Tç&T§¶¦3˜·WÓº”øNNª²ÑJDWqô“Wò6WbßX¦³G¾«ÁÔîþ2Þ͈.tœu%4t(ðž†}Á$`ß¹´žøn=æUn5¦:£ŠVMªÊ6Ê/ÐÕø·Â²Ça«Ê¼�Û7n …V£¯¾oúçH ª!aúøÎ¬·oLA‡-Õd5ì &û.¥µŠûöÖÙùU4;L¼äbÝŠáIrì4<´¨ZVkßt}üÖ;Ø7þXjØFkT8î�—�.ÿQ«ÚS½ûî 컈êê'§Ø—Ü=wRUvá^Ð[�àíK ãfðŠåk(»Â|“Üõ¥z«]a Õ¿~Uà ƆӮ0ì æû.e}ß·xÞRU¼ˆk“Òæ·#8®û õÒ˜}cLWÓ—JÿF­´ÄÈ´¬@æàe3³ˆÍHgÀ¾Àì;—Ù–5gž[Œ_ÝFfTÑX3��µø Ý´¿+gÀžé�´dr‰:bþšÚ¬Ÿ²%;„1ªªøtÁ¾Àì;—VÂy“YW%#W7÷IUYAxl?{^tµ³{–}ãÆP˜79‹d�¥” ÛððÑ[²ƒ¦šé þÀì;�ÙO¹¦L•ŸÞà¬y°ïƒÚ×Öq‰W@sï§´¯¹á%öM#CA²¤—üNKøeˆ_m ò/Û¤™Yt_ûRc–Ö%ì[½u8½ÁY aß; óïÚ÷º“ª 5À¾ÕHÉìhUŽ�Ø/†¹ó÷äç°oFÕ¾Ôèò.–Yu޵…ÇL¿ZÓ` °ïÈîOùQÉŒ*2å�Ë‚êpywʱ­€}í›Îü*é¾eaê4?;Ú|“”5RƒáÀ ¯™Ytwûf‡Óöö­vE`_àOygJì@ˆ|F‰'U™³‚˪1Ç×üçÖ±%^ö nû×ÿþýÏÿþõößloØøö_¦yËæÅrºt%�ÉÏÜm-�Ñ ¥aØ7ÓIU‡­!aÇ]ü/H2nÒà¬I°ïµaþ…TƒµËTÑpßÔ«k›Åk¯àÕ^—¶ïKÃÚ‹Þ ?2ö�eª9xÙ¼è¬å)}V{½kr$ÝÈŸú÷)ÑÆê¥†}™xIpv©Y³«Eõê×jó N�}/�Á¾r捻Æ"kŸ£õ£¡’‘Òëþ²¡ßÌ»�®}ãzuðzû¦Á}2_›©Éá)ÑÁ·´¯¡†ôGFϳw1ÍÚw‡gǾצkßì9ž0´Uâ(Îý/ëû¦‘Uï„ö�ÛéËÁ;Ø7ÂÿE„/÷ GÜbþ¾Á¾`°ïåÑö}CAu=*/‹ªkbõ‚¨jFõtò6´"ã–yC¿¡PUi$smK½i@(ìcß@ëÏd¾Ogµl ;9 ö6`ßË£�u•�»#æ>ÍéCk»¿ªõ+x�´ö�a$ðJûª7IZ´÷gÕã¼ÍúO7¶4 û°ïP=qT&¥åý˜*ƒÓI5¨Úïk_~>s‰Ù¾^󢵑›¶²,!ûÃi5Ì|—$•t¿6¥ƒa_`ö½ ò ú­¹øÙÊ|Ñ´îXCYîå5ô+™Ï\2bßX¦�yÑÚHU*bð6N^�äDLŒö[5 û°/øÄ6$é·AUÉx÷W>Ÿ¹dܾq ™æEk# öâÿ²ZC—Áñ¦MBµcmûÊ…yѰ/0û‚oFædÙº;­C´5Tã…•„›}ùyU‹í·‡Bx‹âûªþXÕo‹9Ï�¼]3ß/Òç­Û¦IØwg`_ðÍâ9YÔ»üÉk`b˜€ô ®šsË]MJTj°¯0&&½Œ�¾>:³;ËòÊJ2*‰ñÛ^$aß��}Á7Ëæd-®¡ .TMcvOéTû’lf-Yj#c°çZ5òe0Tr|æK>oU·½HîÜ6û‚oÌɯaü¢_Ûµ¯m:•0r¶}c™ÖÚ7l_‰j°¶†V¤¤æð´¦žã5Õ¼³ávn€}�ˆÁ9Y鱿F¼K…¿»f2ÌW´oÜB…ƒ—Ú VZÌ^—øz´_¿V»\kpÛ‹äÎm°/�2"àÁ¾ovÈøe´Zg˜¦T Ty…Mª¶Ü ªE+Ýç}[Ÿö¸ö´_<þ~KUIàrCØwg`_ E;'+кð©ú1¶Î–ä,Ù.a�–®`_÷™YÉjäa¾Ò¾6$ß“n ½ ºØ—YÌçÄ—¬<õÈ«`_ E>'+ ¹ìv媺ÐÛ�ñrõÒ]ì#I<5ZÛ…%«ö¼ü�5CUO ¾èepð ƒ­øÓ_Ø·òÔƒ¯d€}�Éœ¬€Á|4v•¤á‹õÃí+™MúŽoú#)¿#_ªñ»º#â½nþ¶j_v]Òú?ðò%.¶×ÎÛv ›Tµ²U`_à@t°¹›B¦k´o *ûj2Û2ã1badwáhs2£»W^Ãà)øzRïk_æ…i­7™Fc9î:ñÔòV€}�. UŽô\©¸¤rŒ‹íT÷¯ýþóÏoÿ}ßòQxû/Óßnw5’Y8:–«Þ2ôŒ»Ûå•ÀÔs\vˆ·Š—}Ë>ì[|~j`ßG3㛤š“Eí˨°¯c¸p/K>Gï~þøj߸‘j^`ß´‘�8;ºz‹c¾Ý!§‘]s Ycnv¹s±oFúÏüDûf-™tjØø �p¡­\5'‹—l>@+×î®5öͼû¹±f߸‹^¼æ©¤2,Ì÷I-¼Äi®ä®ê%?ûîæ¹Ömì 6e¥}Ó3ºçÍ=­j¿- ›—|®z÷3¦mß@_>ž1˜éûÒÀeüoj®$ªå~×:÷qß³r¼éµ‹¹€}Á¾d_�5ߤÔÁƒ9Ʋl«„éOϰo(Tµúó5ÜËÄЗƒ?k›¶̧yr‹Çf´*ïVr¼Î®‚}¯eßj;a_°5|úhöy]Œ¶z⟗‡¯}™þîK˜Ì¾Y0±žd_rÍöÏ«�‰Ì¼0Ûwå?"-ƒö¥öýz7)í¸Kؤò¨•­2û>þ^rÒã·y0ÁØÚ8^ƒ£}ËùÌ\UzûÆ2 ÌÌÒF’~>½~Ô#z[⤬dä ?uøÆ�ª}™ø–êª1+wñMÚ¡U`ßçâ{'9]ö…éùd…A·æ3sõXí·�if–6Ò–º°Y3;|¤†ôØñù ÌÞÝ®–.étæN}å®VØ>­Òû‚E´nó‹­`í?ÍK›íËÏgæê³oÜNÊ™YÚHƒÿÒ–LÍŽ5·�ü†Tô�ö¼NÞr0û6À¾ÏB>‘aÆ©™<Ò`v‘<®òñ(ƒ}%ó™;UwÊ<Ý­‡Ä¿Å<û2wEåvm ªûªø…w̆ÂâÉZ`ß��}Du6AäÜ?tl�KvqD½¤´ïç!=#J´Ú­GXÕrÑÍHå¸o€ÿ„%‚äc C­˜y³š×OžÐûî ìû ÊŽoY>‘gksÚ9þ(_œy$WœÅHjó�MÖ¾/ó Çôƒ„²žÁ¿]ºÑkV3ÃâÉZ`ß��}ÄþöMÛ#¼þòèÖÓºvK&3“Ò…Ýò¶ïKÍ�µ$GÒ΃7=Y=eY[Cÿé_æM€}wö}­ÁªÝ줱ùÌ|¯mfÝãT~¾öõªªVu°Ë ï`¿<Ö\ÏõN}ÔØwg`ßgÑz^b‡¿rõ»Xu°¡�•"S¬¾óÇ<©jûÆí”8xܾY§“ôîO>SâÝÙ¾yàG`°ïãØm¾•„è`sn3 ?<X¾H$_Û>ö�{cÙl_CR¡$ÕvµžnUYw�}·¾É€}wönTSp¾Ë¢Òð¸ Éôö®Ì*¯´oFâ©ÑY÷TòŽð‘G±pì›ûî ì |h­>ãk_ÃZ•¶.Ú{ßW`/rµ/Í™uÕ N�–ß»DªýW[#;*ëòF`ߨwg`_à«’v­Jy·êæeöM½Ûuð¼.2?5z0í_Ú×F<ö¬ëÆ}�°/ð¡µüÞ$û¦gzlÅ <¢Ã–k™íŽ÷Õ°ÖÔh³&5úÁ¶J6YsžÁ°/ð¡´¬ûJ@’µ*Çûgéˆæ¼î¯$Ï\Æøv|™Èrjt(Œº—?ª*Y0«ùN¸¿e�ÄÿÆg¿Ï`ÏV©€}�e'`e·`dNV$5Ĥä³p|7=�&,î! K§FW Ú…Ÿ0%¬*ëïžnßꊭ{^'[颭GþªaÌÓî».Ñ*-°/ð¤Õ^ó-r_«Ò×¾¡ ÷®ùð]ä2-Oìç,ïàò‘ÇÀ¬æ)bÆ^^*«ömM¯ûó¿UU]ýçÌ|¶î»ª¿‚<½UZ`_pâ·YÕ^6ñЬêÕV²À¾棳%–ËÉYæëϤéQÙŒÂsû´oµBjÌ瘷«Õ¦yë[eö÷!û6w,éÀy-maK;Û*Yfß@9ânÎÿ§^y&M¦}Ë�ÏìÛê‚}XMõÛ\u°PƒöÕNinU®­d±}ƒÞMëñº´ÑdûfGª�Ä�í›qz« À¾À‡I‰>/¢ƒU’0'ŸmSšµ­÷ÉYüÇUíõš‡ÞÉïÒFÓì›Ö°­zÉ;ó\ˆžkßÖ0-ì žÅæö ¨ÆƒÉdß‘)ÍüFy%+íÛâÕÞåP-�;¼/dvýÝ3ç¸Í¸où×\sjØ\ƒ�/C�ʵ*Uö …‘)Íß‹>W²À¾¿ §FgW7¯¯ÓIr©í»Rf°o%à9ßT0ÎæþQL“qú¥USš%•Hê1ÛW;ÄËL�Þö«Âв†¿‹‹}©�ã]³«ú{¥»2YžÕ*-°/xÕ‹�M{^?¥YRI·Õ”+*Ö!Ѷ�jÃ˯-.·†ÕKsd·«eë ß‚d-cVîºD«´À¾àA´¾îUÇ�U÷ΞÒ,¯„Ú]aí„ç‘éT)˼;iÜ·ìø–å}pIã3ýû•».Ñ*°/𡚠"ï/+½^ì|OœõÒljœ7¥Y[I5RÛ÷%§•´¯Z¨ö%×Atàì |(‡^"^c$±¶©¿¬\ÚWî-š3¥ÙVIvÔàþ¶¡ß(ª5W•Öèàx�TLÉ�}�ØøÐš%èuUZÖç(çEG��ÈzMi6W’V%¬„yâH>í9›5ºìªÒ’¥K�^*aß��}�7³ozÒÈ>SšÇÕ+¿ŸP­¶QîªNä9e¾UÀ7ã[­;°ïÎÀ¾À‡ìz4ɾ4?ãך&ºRxS+Ñ.Z©Z1#›œµÏÕcÆD„ý�}wö>T{î�ÇU·û~EùyÑæqVáöõ•ðrûb0®;ûî ì œ™1ÒVV9%‡éµþÆnó¢Ë`›}÷¹hœþ…9Øwg`_Ôt¼É¼hmKÊÚ´™gÃEó$›‘,™ô Ó$`ß��}Á•ؤ+“΋vyˆ^…g«�œÆ†³Ú$‹qÒëH¿ü�2ïA²ê¨ÇøPì ¼€}ÁeØçI�r^´Ëƒ@´|©çn%ÙÚ#%å¬fƒ}gLeoÕ0¯æ �}wö× zi>k"ë¶ó¢½ê‘¼YÁeˆw¶}É»ï›Ö³ÿµöÝØ\ƒ­VøÛp^´W=|¶9Ý>i 3Ç?ë>É’³€}wö×`+ûò,ží#å�1¥yª#7™(p.ö•O…k=ôÏWâ¾ë*À¾à,xžØ—ó¢™í†z$³« Sš%<Ü‘óh ‘´h “ó1LÍåTö¬÷]ö—¡¼Ûݰã™:/z¤’j=ò.ï…’™ÌÐïU~…AªöeÞ˜ÙRu&QÉ\¶ÖäŒê,w¯]­ÏaO`_¦°ù¼h²¦š}í›]µ¯¤­,(쫵¯íÞ%³/#fÇ]ÝVmì ®Ä…2N3æE“ß›Ž$Uß‘àKÙCŠl;›úB¬·¯$Aû`_p®5…Õw^4ù½å·Úå=ë ­KªûS¹ÌµûÆÀ¾;û‚kÀŒá‘÷?¼K*{­äÜM5¯GÂ2ûRM ·ç¬Ìs9L û–À¾à´þ�¹ÿÃÓN ?W÷I!¹¤yCk׌\ÀÔÑÙò¶éº3tlLµ/7ƒqß.°/¸Ëú¾+Ç ´çEÓ@V¹š�ήò�TÕ¥:Üë>÷êWjËìX£ØÛüMa_pÖŒû®·oz^—$d3³T³šÛ7Âç*� û’`†‰\¹«õ9ì ì ®»íxŠõöMÏN (*€ò·�ù‚Ua´ÊÄt#W//,÷­V8èàÔ»­ŠÖñ¶`ÆvhÞ¥q¹—’ÏVc"Wîº °/¸*ó.Л¤¶ nõwKoòïzê¬+€LÆÎÀ¾à¬ì’n…ÐÁg½#a�•yþûî ì ®Áú�$�U¬!mCkjô¼w$LÍ gõ0óZ�Øwg`_pZWêg¡×Ù•‘³æg·ò$ÐØ;fg†[O�d§6`ß��}Á•Xð\ʆ¹Ðì_iü «gØì;õÓ(ûÖ×}†d7øŒ8Ø\Œ©Ý£ýí7RoÙÈêQfû¦?ú~·Y?G`_°#óºG­îõž>¨:Øqv2Üì ÇšEµ‰ž1«™aNöOd“ùV*æM±Af€õÀ¾\LpàNàß3x×íÕM²/³À=`°/x×�U4þÌ#+×úp¸°/x§�øš;ßóì[®ÔqÝ WöÏ¢µÌd`eçrÆé´À¾œì; ÿøÊ¼'Jg\»‹-ðê l~¯¶jÁãÅUNÿp€ì;ÊmìÛmju]¤*; x}“Ö¬_mûp°ï(ò‹éV—ÝÞ¾ÂGBw6Mà”&-X¿ÚÌþ2n ì; µ’(�9œŠ.fõ*Yí†ÚNTmªD´Õ�¸”§\wº5ÀØw³}[Z-Ïhå´«aª1jçÇ€™� ¸z/²¦�Èë°ï(óuÇ€…†3HqðDLwM¸Zònö•ä`6°ï(#ömU­\žø- À ì >yˆ}… óM0¤¬—ößø^ß÷´E–<¿DÏrê¬lÀ)À¾àY\Ѿ4yV6`=°/xÂEB|O×ÿúx,°/x§<ìÛÿúx,°/x‹çožÓœì Àt `@ì ¬öVû0æÍ�Oû×'Y�tM&­*ã²Dë3¿ö`"ò×3?�sÿä» ¤ó¯WIyø×ãiÀ¾LÄëÏ÷`ñÃÖk�¼I¥›öÀšÞö`"­«ê3/¯ÂwB«dáÚ×;¼L"ÚêÆg~=žì ÀD¯Ðó.¯Â¾/óFê®/»aË^Œ-¿Õ¨n„€oì À\¯®µ3†!Ϫ,«?–'‘¢°3Êç6ªÍN=ƒ}oì Àtг Hz®ÂnkÌ÷}å‰_ªÝ!1M-kËÎËŸ‹¯ÿ™ß�GûÑr•0·¬º‰‘Ï6×6Cõ©f]ñ‚›û0—Ö@ãÿéIÌתªƒX~à’;IÍÕ0óœgIUàfÀ¾L¤œ ›ò´}ªÇa™IRŽã¾ÝÜõÈh±ÆmØá÷³�}˜‹ðùN``KÁ¾Àì Àt0ßj›XÊ·›üR`6°/°Ø€¹0‹9à_�ö`"ò—�ö`"xâPö`"ü;pð¯€Çû0fec‚}x0°/sQ-äx°/ÓÁû}°/°ØX ì ¬öVû«�}€ÕÀ¾Àj`_`5°/°ØX ì ¬öVû«�}€ÕÀ¾Àj`_`5°/°ØX ì ¬öVû«�}€ÕÀ¾Àj`_`5°/°ØX ì ¬öVóÿoÜÄŸ endstream endobj 78 0 obj <> endobj 83 0 obj <> endobj 82 0 obj <>/Length 33195>>stream xœìý۵互`‰"þK‚V#Ïn®™b”—y¸´»ÿ³Ô( úÿtD0‚�… 03$çÜcìp§Ã`\þât#~û׿þ¶ä¶ Û‚­À¾`«°/Ø*ì ¶ û‚­À¾`«°/Ø*ì ¶ û‚­À¾`«°/Ø*ì ¶ û‚­À¾`«°/Ø*ì ¶ û‚­À¾`«°/Ø*ì ¶ û‚­À¾`«°/Ø*ì ¶ +ùöí[q»ÇWÓ‘+ﹸšˆ;ä;@ ¶ +©Ùjpð¼.[Þ�¤7¾c”`«°’¢AžÂgûÕ¶Õx»fjY` lV¢7Èv-3Ž’ç’ïÀÙ¬=œ 66 ÏoœíÙké’½jÈwಱ|¯$í{ÿvÉ3sÙ'À*°UX‰¤üÙÛ¦(^Å-Âþ/«˜�,í½áíR´°Û†ƒš/� [€•´+‘ÉÆ˜Ë“Ú½¶Úø2ÜÖVÇþvlî¶ +‘�mÛÕåIíF?B[mìÀ[þÛ»þ€å`«°É||“±›—ãV%µÕ'–�Cm„��ÙmÛjãÏiô0lVÒˆy9Q½w�@ž«¶Å6µí îå|em5ïYîе]Ê·¬[€•\Î|ji _íê_Ù¢ªqÔðH€ÆÇä¡„áòq«ÿ*-Úz™(ߥÚ_ ° lö[€}ÁV`_°UØlö[€}ÁV`_°UØlö[€}ÁV`_°UØlö[€}ÁV`_°UØlö[€}ÁV`_°UØlö[€}ÁV`_°UØlö[€}ÁV`_°UØlö[€}ÁV`_°UØlö[€ÿëý¯ÚCÿóþÏ™{/[x55+ý믿ÎÛÿýwr·Ñ!. ¶`«¯@b¥5[½lÜx—€^°U€G!´ÒïwÛZÓe«íÎqYè[¸%šZiXg«í\r°U€­ñ¨•ö¶Ÿf«—»Ñx—x*Ø*À̬•ö¶ßÄVÛ!¸,ÀSÁV¦"·Ò.�ÃVÛà²÷[pAY+ ØêÄ\`g°UNµÒÞöت_Èçói4Àe¼ÁVDL®•ö¶ÇVW…P—ð[ø‚Óü�lõ¦!q.  […7RSÒà6 [½iˆ< —�€­Â“ÙdP鄨ê>!VQ¸,À¶ O`óA¥R`«û„̉Âeà=`«p'n:¨tB luŸ�¢pYxØ*ìÈä ; „ì–[Ý'dÿ(\î¶ +¹´ÒiÇolµ¶Úr÷¨Foˆ,,[… ×J±Õ:ÇV»BEQ–€­‚%m+ÝÙ°ÕØjWȃ£Ú�¸,8�­vóíÛ·óöùìMÛ¸ cµÒ�][-¶9n|~rn—îé‘;¿o¥ Äe`lµ�ï?cÇÝi½þª:5+ýî.{Jä´D»¥Pv^ü™q6Hj«�ß$Gȶ¹ó;ðQ~�¸,4ÀVU%ò޶Ú[+ÝV"§%Ú-…¼q[L‹ü- p)²�À=Õsƒ|†­¶Áe^¶ªâv¶ª_Eÿl¿§DNK´[мqí5(Êmµ¶3�ý9ûßS=÷7È7Ø*uY€—ƒ­ŽpŽ(->{;تßG'Gm›h«åÒù¶Ún_Ëk˜eZȃ£–*cqY€€­ªÈ%òÜâj«ñ¬“xŒÜ-6?@n›hUŠš˜ºî¿·­ÖBnZŽ}pÔ’@×X\à`«*N9¹¶ú½ÁÌCȶ9-ÑœùÆZ�´ÕvûÚC�~v~Þ"jIàÂX\`°U—zšÜÅV·u…µ¶Zs/yŠ·Ùj#¤½«Û¾oµ$pÛX\`Øj5‰l ˆïb«ÛºÂ[­=T³.lÕ<¤ö�UÑúÙQKo‹Ë‚­v“/ÚŸ�"Í·{_[�œè²}QŒü„[U† ˆìX¢[G- |d,. жú°ÕɉâöB1uJlÕ/¤ñèÛ*²K_‹Ë$`«[�“HS1ÅVŸò¶Šì’ÀƶÃqYx!ØêCÀV͵ÅtrùvmçØjWHµØÍ?Œ«_« Çeá‘`«[ÕD TL±UÃ�yXH;ªýLîüa\øÂX¿p\n ¶ú°UITMþv^],[½iˆ&ªöÐ&Ù%�/Œ]ž„ ¯°ØêCÀV“¨âvÃC>¶j¸3 ñˆÚ¤"»$ð…±ËÃÃÏ7¶ û€­>„7Ûjñ@¾•JNH�­î2?ªö�yEvIà c—‡l6[}/±U¡˜î¦’R`«û„ìe^‘m§s |aìòð€­Âf`«a²­Ê£4Ó==[}IÈ]¢jµ{ÃV'Ä.Ø*l¶únm«m1�sÇV`«]!w�ª½ÖG{luBìòð€­Âf`«á¶Ú> &‹ÚÊ>{Ûc«û„<5j¸;œñµ±Ëö ›�­>„a[ >G»Z¹tg]Ø­»ÜVÏñó“s»$pO�Üùíw‹¨Z Ddïh�ت¦C°Õç°j¢UML­ra«;“´o¿ˆ­­ÖÔDã%O ypÔ@ ²";–ôî±Ëö ›�­ŽðÝ ÏÛç8mcc¯¼?]bªÌ¥ ™“è¾¶š¿ŽíØ¿e#4^²­zîo�›Ûj#Pþ†¹£qb«†`«Ý|—ÂøI;îNÛØÞ1ÃÃÏ¥˜n+‘ÓÝÂVk¯cWçB[mì̫ʱŽšhR‘È»Iìòð€­Âf`«Zîn«—ÑÜS"§%ÚÊVƒç� ½­6ZÖ2f™òà¨%�Il—ȾV7±Uxت–ÙªI™-îmO‰œ–h­­v¹©rOülµ"1lu~Ôæ�†Ù®¼Ï Ø*l¶:È9¢ôxw³U¿2Ûü¨mMK!|5 U8Ï5ÙVÛ-‹Û%á;¿ýnu¯À8vàm³°.«ï[…‡�­jYU[�'`åx[×̨my¤ÐTL_b«µ�}ʱŽºW $¶ýÆ^e«ËU5`«°ت–�¨±ù1rÛD‚•tè' Ï³ÕvËâvIøæŸŽÉQ÷ ÔÇÖºì[°[Õ‚­zGm›¨×ó�¶ÇlÕ0Qñ࡯`«o ‚÷R°[Ê~ÿ(Mà cÃèûÇ*{ÀVa?°Õ瀭ŽEIÄT™b8[½cˆ0jÀB†s­�Ò¾0VÞþHb«ð0°Õ瀭J¢ò¯ø¸†á§’RøuŽ­v…(£Ouí-½óçWøÂX“ðÚCò�<¶ [�­>l5‰*not…­ÖÀV»Bü¢¬Ê±’\†QšÀƺ† E[…ÝÀVŸÃ›mµø¼•JNH�­n2?ªñ¨a9vIà cW…Ço¤Ï热ÂV`«Ïá=¶šžó>wSÉ )°ÕMB¶Š2,Ç^æò|aìòð@mö[}�´Õá¢én*9!¶ºIÈþQ�W³Ý¶:!vyxÀVa?°Õçpw[­‰éÂ"î½R˜w~¾"ŸŸ·7ù©°sÈþQ½Ãác;#±»…lö[}7²Õ®Šé‡ð[¤Pvž¿(ç£ñKV³™¤«==[U&*nwúóÚØåá[…ýÀVŸÃ¶¶ÚÐ ÛDʨWÙj׋Rû�Ñîð²Û$|OõÜÜ;Ç¢lK¤ír¬2ã c—‡lö[};ØêeÑtg]x°­ÝTÞ¹ÄVk{rù–ÈC²l²”­­¶Û·Oø½zߨåá[…ýÀVŸÃ|[Í7^ö³³.<ÆV…uÓ9¶ZkPKd˜eUÈþQÓlµØõ¸£qb«¶`«#|÷ÂóöùNÛØØ+¿#И›ŽåÒ‡ÌI´I ¡›jvÆÜVk!Þ³óÛofÔr[m4«=4y‡Æ.Ø*ì¶ÚÍw)ŒŸ´ãî´�íó+{ä=o~dÝD%ÍS4ÜÔoÿ§ÙjãÑÚŽf± Ù?j[[mÄŽ½°Õ1°UØ lUË­mUS1ÝüÈú[M¶´•î©¶Z )n7|ŠÆBf&Ú?—2ð2¶]ŽÅVÇÀVa7°U-7²Õšú<²tG[ÕüxØŸØj1¤ñ4>éíw—\Ê@eÒâv×äúØåá[…ýÀVµœ™�1]h«]Þƒ­Ž…(SHê¦])°Õvãâö˶}ûÝ%—2Ð#VøfÀV5=Ø‚­ªˆUurm5–ãoëšµm"¥-Ib±Uï�KqÙöí7?jIàÌØÆ›|Úï�¶ û�­Žëã-FÔØü0¹m¢Fûš›z 1¶jRü{ý^‹±�ÉQK7‰–cMò.Ø*ì¶:Èeáóñ¶:¸óQ|ØöäuSlõÖ!reÙù}>µ$póXÃrloj¿ð€­Â~`«#ä⸃­†QaÅV»Bänªß+lõ!½…·áDk£–Þ7¶ö�ðK[ˆÁV»ÉŒÖfY9mlïÛæ‡®ÛÙjÃMg–o×vŽ­v…œQÅ'­Ö¶ú’XÉol [}�º:ÓVó��N°U«=yXH;JYu“'2�ZøžXÃ7¶ Ï[}ت<ª×MRèC°Õ;† '*n¿|c«‹ÍÃ{ߨ*<lõQ`«µ¨üë>ïsÂŽa«o±MÔþY…­>/VnXŽÍñUØ lõQ`«gH²EøÕ�­ÁV»B&$+ÄŽåZøÂX“ðÚCò�<¶ [�­>ŠGÚêeHÑMwSÉ )\;ïÖm=ò1¶Z‹jb•¹–¾0Ö5\ò;U… ÁVÅlUX7ÝM%'¤ÀV7 Ù-‘²Û›Î6ð…±KRÇo’Ï热Ân`«�ây¶*tSe–±�ÝR8u~¼ŸŸ[„Q»=™ÓB6OtF X,¶:!vmê@m¶[}w·Õš›îé%»¥0é¼öÄrS´œ¤« ŸÌi!›'ºŒj¼¾Øê„ص©¶ [‚­>Š{Ùª¼nº§—ì–b ó|c­‡F)®Ñ[£Ã<|×x,dóDcQó__b—„l¶[};ÛªÜM•‰¦…ì–â²±æ%¸´ÕÚÎ�xÏ—x,dóDÃQÅ@¡ÅÞÎüî[ÅVá‘`«�b[mˆÑ¶’ñ0[½tӮ·mµöh1…¼ÿË C6O4Õhò÷&5ŒÅV5=˜ƒ­>ŠU¶ÚU´Ûö@~k[¨›.´ÕbûZ^«ÓB6O4¥x•5I5±÷ÕMl ¶ú(æØê€ 爺‘­_×ýŸ`«Â¿4Þlõ^¶Úx´¸ýü1Œ­N Ø*l ¶:Èw/ßxÙöy‰†£æ޽Êʤkc—‡l¶[á»ÆÏÛqwÚÆöŽ)�%]uÓ‡È7±Õ®—@³?·¶ÕbÈ¥ÜlûÞ›™h8jI`Û.Ä:%�»<<`«°%تE³Œj·\h«Ãbt†?é@¾ÊV“WaØ®°ÕZ³|£w}nÛ7¹&jI ÉVó�í— [õñ®Ïmû&×D- T&­=tÙ!¶ªéÀlÕ€Ø,Ïa¦Ç»ÐV»ê¦›)ïk«]¯‚r—°U}ˆU}nÛ7¹&jI SÒËŸ+ت¦s°U-§AžÏŽò·OÀÊñv…™Q{Újr馮»„­:…·ß÷·ßpÔ’ÀÉIM~®`«æ`«*b}|Æ,«=£ö´Õ�º)¶jÕ~yHÃb7ÿ4 G- Ü!iï/lÀluœËÂ'¶jµC¢¢›Nblõ^!ÃŹÍ?ƒ· œÛøD`«¶`«ƒä∭úEÍO$¬›b«Kvæv!…Ýü3x»Àµ±ùF¿²mxÀVaK°Õò£ñÐÕx‹ÓÆÆŽa«QB7Õ¤˜Ð[½WˆÒiºr™DÝ+p·ØÚǧØ[HÀV¶*ŒJŽg³­ì³·=¶zß�3Jî4ú\½Q÷ ¼Klï+n›½–[…ÝÀV¶ZŒ’—N·²ÏÞöØê}C.£j…Xlõa±gxí÷ΰÕQÚ«ô€„†‘b«�[ ŠÓú½‰vk�­Þ7d8Q¾ÑUhnxÓØv¸¤‹­®ârb ´i?�<¹�â…¶ÚpÓ ž±U{§Î�gøó“c‹‡më‘;Ûj1J¢°7’Î;§Ÿ­6Bò�Ãû€­Ž�­*ÁV_Äãmµ«nŠ­´¯=ÃGµUÉ«€­v…xGIjr†év¼i¬aøð‹Ž­Ž�­*ÁV_ÄÃlµËM5‰†C¶j?Öù_• g yˤ«bHïÎÈÛ?,dUTï ‡­zÇN¿´Xlu lU ¶ú"nm« 7�¶{[Ùgoû±2›°ÿ¶­^f¹L·­G>ÛVk�æO»ÅV]c†Ÿ¯ûçóÁVÀV•`«ïbLXç)»ê¦Øêpc«ß¶Úõ›d[�|¡­ÖBò�æ?¥ o»<:Éë}8QKv>ü/·UÍ/�Új¯=ìí:9jZàp!V“t“Øåá¨ê0®­ž[°Õûqù¤ÏŸJíÓNzméa‡ÿùŽõWsÔiï1[m4N¶cw~»NŽZxYˆµJº0vy8¶:̽lµQImX¶z{nj«šJÞÙÞ!s�¥ˆïþÀV»B„ê³óÛurÔž��×[[æ^¶*üC$~‰­Þ‰üÕ�S9/îIí«ªí¦;,ïk«½Õ Íþ`«úåë%ÌrÓ¨ê_Ǜڪ2uÀVôÚêÌ2jÛ"j „-±Õ;±¡­öÖMw>XÞÈV/K§~Š­:…äïûQÒDÝ+0�­½�‹ýc«ÐKñkN­M¬s6&;Ÿ4È÷?ßn»'ت;Ųù[­}³ B;Ûj²å2[5i¿6¤­°;”4Q÷ ”ÇvY¬a^�plu!—µ$hƒ­úrYBßg$@›�–ûØê€žjö [½QÈ@v,Ѫ¨{êcó�òw¶úB°U%ت#—•Î%㣱Õá¨<ä/»9û!ØêÝCä?ovþÞ1Ð#VX…ÅVß ¶ª[õâ♥¶j5ÓV“-—¥VluþÎÜ:¤V´ÛùxÇÀ™±šB¬2µaì¶: ¶ª[u¡69n0m|t’[•Gõêé@ M¶úž�|£¤“�?¶&±·°ÕbìØkº°.{€­ƒ­*ÁVß¶ÚŽúËôÌ>¶ºdgžRŒ’ü”Úùck{_[­=”oŒc«÷[U‚­¾ l5ŽÊ7¶ûÙͱv°ÕãiüüäØâQóÛÖ#Új±M¾qÛ�­Iì†Æi[û8ù5:“b«c`«J°ÕwñH[•‡´K§VY†Û÷†,±Õâs×V=j~ÛzäV¶ZŒ*n·ýU¦‰Ò¾`«Içæ5¡'…¬Šê²luB¸aêÚ¶Ý?¶: ¶ª[}·¶ÕFAnOÏØÓV…uÍɶZk–'²Mq‹�­¢j/ ¶ê;'¼ý[fÀV=V·[s‡=ÁVߎlµXó³Jô[•?�Ã{âd«y{¹¿îù– Ù<ªí7æé–Ç>ÛVk�Ç�Ï热ŽÑk«W»ÆÐ&{‚­¾‹ÍmuÌ«Í Y•¢ö4z¨ð™bŽ­Êwf ÅÎ!wŒ’+,¶z—ð@mUÁ啨jÒµÐV7Ùlõ]le«�÷Œi)„–ÿH[-6Î7JÂ÷|=)ªø‘ÇVï°U[ý½Fõ>lµ¶'Øê»Xk«Rµsˆ_ á3©ÙŸûÚj1¤öÓÈ6‹Sȳ£ò�NïR«XlUÓÃk1±ÕPÙ9ÇVϼ~I±UøÃL[•ø�a® C SÔôÔO@f«ÅùÆ ßEÏŽ*Ê_lufxÀVhl5VUj«å½ÂV†«­æF5í°·gˆ&…°zŠ­Ú†ä/•[ÕDÉ‹¿~ogœØêk¶Õ8pæ„§ãnm°ÕG‘Wìgn¬í’á—û¥Qa«]vßb«Þ!EIš¼cŽRæ=>8›Ä.ت‚1[•µÕ€­j˜ù¨ãUØj¾ñ²«�mu ʶ}QO½…[Õ‡´ýÕ*ËK¢4�ÅXá7¶:¶:Ì€­æGó% ±‰Ì`«“(>Ñ›ÛêXµ/é[�ïÆ�»ÂVMÚOéò×ý òÖ¶Zk–oÄVÀV‡)Øj‰â)Óø¡%§gw8QŒ­Nâ¶ÚЩÍ{ÚêX[5i¿<¤¡G›”&Gi•Ió�®°UM¯åò ;´ÁV'±‰­†HXŸTÚÁVsןð‡`«7 û3�èFQš@ó¤B…ÅV5=¼lU ¶:ƒ†ªæ�šõ¨í•·.ÌŒZb«¹žê÷j¹­žm°Õ !rÝü8¥ œ“T¨°æy7 تlU ¶êN[UóÓj«]l~Ø›f«ñ]¹ù¹î’¡­þû¿ÿuüºù»³0Œ­Z…Ôüuóàp”&paÒ|£Ü}±Õw‚­*ÁV}¹TÕÚ]lu‡DòÒ—Õ^-´ÕCU¿¿w¾ÿ[Ý'd¾a«±Â—éÖ¶ŠªjÀV•`«ŽHT5ßò$[ \h«íê醎eb«ß=õ¸qØêq#ˆ§……ë®ü@ÒØ«ö É£„¿£°ÕµI5¿4”©=±U تlÕ‹âò3פhìØæ‡¢™�liw²¡cém5WÕónM€â»G›¿×V�,jÛwÑÂ_VyƒdËßSæù- ¼]Ò öWlõ¾`«J°Õ×ñr[mWO­²Œµ÷N‘7>U5ÔmUòŒý] `bQ»½‹&‡ 'J¶HzÀVçÇÊ[½/تlõu¼ÍV²åíL›ÛjCUÏ�A¦8 [-îF~²§Gîl«y”ÄŠ°ÕMbM~æ g/‚­jÀV•`«¯cÌVÃÜšÐpH— ½ÙVcU [ õñ ]¶¥W¨'…¸F�•`Çrmxߨ|£÷7R’ [[U‚­¾Ž‡Ùj£tj›hB{ïGãÄSÖÚj±AžBÞ¿$Å�BfF +¶ê[ —¿^ÊÔ[Õ�­*ÁV_ÇÝmµ¨§söíÖ¶zWëÙ{Évlf°¡­ê‹4o¶Õóv#°¦ªAf«áJX7±Õ<¤ë­…­'ªJžlu«Ô�— [Õ�»×'kóÁV±U8ÙÁV/«§lf,jf­´Ö ÙrÙ¿^UÏÆµ\ÛÚjq{²ål†­'’—`‡3>&vUêó%û|>Øê0†¶zÖeÏ« Í·ÕPcŠ­‚%KlõRO•¹¶=–ëÛ·Ÿºvÿ O=x¡­[Æw÷Ù±%Qó+�ÃþzGã¼£­žP[Õ ±ÕDã9IÆ­Öö„Ú*ø2ÇV5Лk ýpÔ[M¶\–Zk lUõ )¦»µ­&!]/¶ê(yîhœØêk¶Õ8pæ„§ãnͱUpÇÉVkz:ç(»í±\ÒÞ£¶w©ªaÈVCEXŸd«ÅíÉÍÛ[ .Áj’n»6uÀVuŒÙªDàæÔV—ï ¶êH>ªcæÆÆ^é*òú¶zY7Š˜ô/QÕ€­*Bºê¯ÃY–Dmk«ÅÀ|£ü¼�­.4ÝlUÀ­æ~¶ÊVwØlÕ‹™{ù+Fmu¸þ‡­íÿ’MÞ×ÿ᮪zÆ&Ißf«yÈn¿ß†£îe«—?ƒÃ…�î«تŽüH]lV,BÅÍ/xm²'Øê$ng«¹žî|”ÝðX>æ÷š?\è©[ ™°b«Å‡’-§×nû9N´s`ñ…¸£qb«·æòÐ m°ÕIìo«—vµóQv‡cyñ ôþCÎö3U5`«C!òú«2‘&j[é´ L¶Lø¶Y«تlU ¶:‰ mµ·ø‡­&!’'pŽ­v©j°°ÕðUX±Õ±¹6a«†�ylñÝkûZ¬�Õ‡lU¶ª[�Áù,/˜\Û«9‡±'Ùj¯ß�¥èmÿýÕ®½ÈñCç›ÂDUÏ®Ž½ÅV­BjþŠ­ cm_ y^�X}xÀVu`«J°Uwâ§x«Új//´Õ\OçÔJåíÿý¯¯=ô-ëHÿ¾­¡­|~<‡çÆw=~'l"¯¿ês�…Ü.p8VóZhòêcõá[Õ�­*ÁV}‘¬È€­ê£ ³üÕœ¼¿•­ÊU5}ôk-vl«“¿r…κç[hrÔð;öd΢ ¼]ÒÞðüE9ÐdGU•/3Y“®…¶ZÜ“b3lŒÙÖV»ôT“hZÈÀŸßöÔ࣪¡ßVϨ|7\8û×`U|ÂVóÀ^½—8ÞÂVkáÉ–®Þ°U%¹{}Â'ió}‹ÄV·ÃV¶úTö±Õšžnë ¶*¬§†¯ãV�«V(‡œzêí©gº±\g‘µxäÞó-49ÊCãÚžt/q¼µ­&á]þŠ­*y¤­žâ {‚­¾‘µ¶ú—`òþ¶Þ`k«Åbê9Ç?!™\õkã”ÉU“ûéÊ2æ¬ù‹2PyÚÜ;Ç¢æhœ²Î7�Ñ*öI¶Zl“l9C°U%[ÍUµx#nàd«qÒðuvãVÁžÉ¶šl‘t²§z„ÔÚçOËI­Âz ˆo„ðgM€—bË<ë�s «ùÆ ^ëGQÖ¤æ?zÙ^ÈæQó5î¯Ñ©îØê„ðóuù|>ت†a[­I›«­&EÓ|O˜e3ð¶ÕËüa®ÍCŠí¿o¼<éŸPTUyìeå=6Hï+`µçu]ÏúŠD?¯ú_Âvöα¨U¶ZÜßµúµ Œ}›­žP[U2f«ÅÉU1ÞŽØØlÜ1·ÕöqeO�œ’·PÕþ̬ˆ½ì6|5Ú±¹VùD+ó/IŸ­Y_¥µÀ‚b´ôد2lu,Ðêׂ<ãV±ËñU%¶*?)ïm«ùFlõ™4~Åuuó��ýQùºŽÓ{zäœ�¸ý¿ÿõïú™_À„âþ4j±ÅwVãòWÂï�Þ9þrg­yê—Æ¿‹¬ÊŸ"ÂsÙØªa`²ÅõÃÚØåáØª’Ë*éAñ˜ž<”wèêµ=™l2ت;ÅÁÈñ£Ó*ùqƒ�cX|WY_|IHü¤)+£µU§AíØ áx«¾pž7H¶ d沊º—­æ'.’6†?ÖÆ.ÇV•\—¡ ¶êKn“7²Õ¿¾NÞŸy4ºoHñIÓTU’Sö&Ϊw_Is²4bƒìéJFH{ÿÄw½k�o³Õb›d‹æ«L˜Ô#vmꀭªÁV•`«3¸‹­^Jw.ð¬ Iž4ó“õ¡¤kk°·}Qy,¶·“âB•–]Ó¼k�Øj1*ÙâýÅ$vmꀭªÁV•`«3¸·ºÊV{+=Øê_¥Õv< õ¤fZk°·̀ݙ…äXXs­ùW¶X˜ùÇÁ¶ˆ­J»ü[…1°U%Øê ÖÖVk£¹Ã¬+zo®žÂ–ñÝ\hü„µ¡Y«p,|l˜¬í8ÝP_ çø %‹ äkuÈß{½oÔÞŸ”É4Q lø+¶ c`«J°ÕÜe$À%³ÕvTûäï_¿/Cå´¶ÔÁe·ÃX—¨ê@¬ßSšl)Œ²(yêŸß « $ÝÚçây![5 쪿æµ ÇV—ƒ­*ÁVg€­ÞÂV%E¬s$@²V¿‡Z9 ½Å‚…öÿÇD£†ùù ɯˆ`4ø»kð€² x w\²ß«1—}b«o[U‚­Î[ÝÙVÏÛ’ð³¤zÜM/‚ê³t¿aã……Uy'NêdKe·ÇŒÍÜò~o+«€7rǵ¶Z|(Ù¢é­Â±Õå`«J°Õ\βrÚØØŸ×ÚªþXž,üÙ¸«ax1T?œó×­ªR¹š—iI;Öùç ºÞó7rÇÝlµØ8Ù‚­¾lU ¶úFÞf«�ª6Ù2§ì­Œ=ÀV•`«J°Õ7òx[mŒÇ%%Õ'åò8_¿•ªÖº�³€¼�I–ðUXw°Õ¼e²eÎ*cïh«ù¯å¤�GÙ[{€­*ÁV•`«oä©¶zÞî:UwÙ¸¦ªÁÇV�ª³ËW<½ì|æue / &I"aÝÐVó(ùï=M.eìlµØ&Ù¢ù�Ó•º ¶ªdÀV§ ¼IØn�ÌÌqÚlõ�ìo«’(}AH˜eàÄú…ÌXÈöTÕ8ÅUMÖp˜éÇá·°ÞÂVó�É–¼Fˆ­:ÅÎù¢»[UÒk«Ó&d_ÎÒ–,è>á:GØê¹¯­6 ¨ûÖPÕ ¨ÞÍYB_Òá&;SËrÜ0wôÆF§¥Ç.ß7µÕb³d ¶:-vàÉÇV—#¼jOMºŠ®¶jM!l&q#[•Ÿ‘´Ý·¿JsªÌWbòPUe®¶šHäÀ¬ü¼ÃDI‹] ›�!�ð[Í£’-ÂNîU”Ý6Öµø}vˆ­j(H^éÒ#÷²Õ¤lŒÙÜVTÃ,�¨vIõdO[Õ;_¼'¶…ϸÿvŸÊõ¤ý_Ð#©°vux [Íõ(iSûYˆ­zÄ¿ÏplU¶ªÜlõ�lh«¹¡|;e­VÚwºUßuZ?˪9ÐÏ¥¹ž}JÜzÎR¯¶ÂzG[-¶‰ïŽ}Ì{“ÚÞ46”ä5tú+¶ªDc« U-öìg«¹ªNÛlõ�ì`«—§ø—ØêϽúü¼yüÐ{z› TaÛû¦¡ísÇ�±Q°c�ÅѲdK;Üïê yWµ]z§­æ!É– ÏÉ;cká]/¶ªdØVÛªZìÙ¤àzÜ•è#¶ ^¬²Õ®SüómõûÍŸ’úùÚä×]Í‚P&’äj¨]{BŸ¶:íù€:{ürë­KX7÷Îá¨�~ÿJmôyGkÜÍV‹Í’-g¶ªdÌV/Uµv×¼¶Zœ\ã=&ái¶ú-šž–lŒ‘¼!Ì4[½, Úæ>ÊFûù©·ýœçšfÙkN@'gºç¬~* õ]òÛá±òQ½�ä• ëþÞétR¾ñrGkÜßV‹�áç3�­*°U‰ª{6·Uáðlµƒ†­ÆeóЬo?W[Í ¨sŽÃY~þûùýÿ�,îW3}U¯k{�UB…{r{Ü�ÌsR2Öó˜ˆo"¬û{§“­æ�“-3ÏÝ7V¨­ª¹¬M$¢’ßÛ~ju¨êÿ÷¿¾ÿÿU¶Z|4Ù«-¶ c`«J^m«yaÕiÜj(qsyõ³Õ¼H|2áDضjªªí•=üji+¬½8¸Ü ý{/õÕ;â²ìZÖÆ{»Q|ÅV­b5îá¤[…c«z°U%�µÕ�IgL­œ™4¨mlloìØ­gYÜÑV›gÿO>{Ûjø:xà c ¬Z*¿Ý¿a.'U=;¦k¾ÆKhFàŒyÕwUýþÿÃV�½ØgÛjØUáÖ'Ý![Õƒ­*yš­n ¶:!*¹*©ž|æÚê@x#ddO$ ¶¦1!IŸ×¯°zÜ0_½µ±2Àð'(ߘ÷s¨jÀV�’ ØêËÁV•`«“ÀV'DÅ!²’êÉg³A«®í?gƒö… ÎKg�[zö¡…ÄGç_ à²ÏÕ€­l5’ÔO|cøœ~;*÷*lÕ<°X|ÅV_¶ª[�Äð¨寯þìì�cQÙAâ#‹ûÜd€UŠø¡O| >4ÇX•<»:Hê1³*ŒŽ¸¨íXIR>ñO/§OЩª!²ÕÐ/¬Øêe`²eÚï“plU¶ª[})3mu,p`ÜêÏ?¿7|Þm«µ¨dã¯Ûò•¤†K­ÊZ©ÕVcU=î7„y±ÕÞXÉà«ÔúplUÏ€­N«j]–ºvØlõ¥<ÆV£/ýO´ùãyf¿·½>|8ã§þ´|¢ÿÇ7¤'»åÚjxÍ­Ë~¦­Õ:°¢ÂO>âüî¶Z+¬†¨¶*”*lU{Y|ÅVïN¯­N1x9Œp“=ÁV_Ê­m5þf�Ï]þü÷óûÿqª®Æí7I÷ùj¨�>=¤_4Ài]ªFŸVW®j¤&*UR?w±ÕP P“WlÕ•µ¶Z3ÔbÈ@aõëÆÿU?£ýyÁ Õ±N”yãðB?c«_}íðO·š’j;¼9—ÿƒ­^溌J¶ôŽ=èͨŒ½—­æ±—¥îتž1[•ÜœÚꥪ:íÞåŽýz[}*óm5¾+,ØØjÞ&Ûö¹ìùkã®öÊpeºáN4yÛ±_^‰´XC®Ô^žú—-8õ¹£­æªš¡°ZùŸü‹[ÕÇÊ-`«zl5÷³U¶*܈­‚=luøw|œÈVU‹!γ²”±št«òÊcÛÍ>Ù�˜O¥JFÙ vìl#i¦‰úüÖ¿¬lµ¨ªa'[Í�ïÖF Ù&õTÆNK]óWlUOî^ÅfñYõâCߦ_ ¸'3wï|[}#N¶*„Ú•h‚­ž·þûiF|(¬º…¢ÿ‡¯=|þþ§~ðk> «ßP>þÏí�òêkm5oœl1 ±sìÂÔÇsþù|°U%mÙ‚K°Õ—bh«]ƒP»…ϱùUcí³A®A=Î5éª+\™n¸e^Mø§r»Öæ]Ó²›/5Øbf«5U WŸá«“«••ÖÌrë…±kSj«`«J°ÕyH/»Öó“¤V §#D—­* «ífÙ¶OW¢¯�]±½í­:ÑäÕÄ&=|¾nl‡|!^Kë²ñËmõòƒ°³­æ㻵ÁšØj/تlU ¶:‰Ã#k#B&¬U–çíúþ2„Úr\—ÛjòÕ_?âèƒVáŸÊíF?�»Â¤’,½�½!Ÿß£WÿîLôåCwŒ¨9JVy{Œ­æm’-Ãê/Oê»6uÀV-ÀV•`«3(ÚäùPØÕV‹T«!tm¼Uu,ªx½ŸJÛOiK¾±Ao{«N”y'„*·ó6Â=‘$5 ìŠúäí…¥óC÷×ÿÿ¤�ýóÉ¥°îi«Å¨øî„_Ý&±kSlÕlU ¶:�Úrçölõòÿ3lÕ[p{,¶Æ[•µOn²íy§E}òÚªP¹Z¶óÝ\ÿã¿­­ºÚÈ’äêem`¯¼b«0 ¶ª[�Ƕ¶Ú5u‚­žì¶²Õ1ÁMÂ{VËúÜÐV5±&ÙÃhøXÞ QŸË‘5åú5ļ­ªá·­ž·;ëŸ_\?]ö‘¶š?”lIZb«0 ¶ª[�GÍ&çØjmu·Ðy:lš­î? `8<ª¼~êŸ÷Ùª2\ÓÃXàœ¨ÏO[ýKØ:U®ÓD‹Äªơº•t^ú«S^ÃX}xÀV-ÀV•`«óXk«ùÎL.&ŒšPX‹ÒØjãʖѽÏ×ÛŸ e eÞµášfö†|ºlõä‡iµU5TlµÒò…¶šÇÆw'üÎ×Çêöj¶ª[�Gm¥ª½˜>ÉVwSÕá(yìׂë[ µÕô~î°UÛÀ<¶«òŠ­¾lU ¶:�ËõV±Õm «ÃQ±v+¼~^9 `¬Ÿáì�]!?Z~óü¿ÿïÿÓ™åjrÕ�ÜVCKXo$�®ÖØ(¾b«/[U‚­ÎãIWpŠê²Õa}ÜÜVóö£+ |°Uÿì�Â�mÎ d¸Øj—ªlµ;V3r@“×6U5aØVSP¦™Ã´¤�=ÁV_ʆ¶z|³»^¿j8ÐpŠ•aûföó²aá>¶ÚŽúµ=ž“wÜîVûÂjÀV-Ǽ{ÃVÀ˜­~ûz]!�°—ge§%½œ)Ž­¾”1au²Õ?×úº� � Ïõuç'ú³®°jØÃp?c�†Q?¶ä/ýF¶ÒË œêIçB[Íc…ÅWlõWéi;Ü[-þ!Ø*ÌcS[ Žˆ i{Ï0MÒ΋Ä~î? @ÓÕX 2êOìå»]n«"U ƒ¶Ú˜f4íûdIà„ØÚó‰­>€‚{…ô#ÿ­$]تdǰÕ'³�­¦ªZZ«<[ííD°Èë[�õ§½üÒhr[•ªj0°Õ?I�+ôË+¶ÚI¶ÔžüÆ£c©“¤Øª[ ¥‘�ØjÀVŸÍ&¶š\ó#hæ¬3Ýq~F½­¶{¨hëçƒV5]yþj#™}âb«ªú;°xF{ì47¶Ú{>¥É¥F’Ë�%‰°ÕxFmõ|[…yìh«�#è?ÿ‘Ï;ée~à@¬·­ÆÍ~ßü!þ\c«Ë¹—­Šö[…9L¶Õóv~= §þí| ¶z2d®ŸÕ¶šô0Öáðn|’X󥂅¶Ú¡ªa [ ͪa»ÃgÛjÇZ¹‚ïÃÚ!ت ·¶Õ|#¶ óð¶ÕËcψª†_ßαTu]&êñ¶jø7ŠÍõóV[ýÓÞ{_ÉÐÕ»ÛjþP|wBƵ±ãuqÙø|yfáß‚­šÐ˜,siŠß¦_ ßÕsèêÌ=ÁVß‹‡­Vk¨YTá«YVX-´ùºdŒÉܬÇÛªðÊaÙ¶ÏïÿºÒe�h‹� ÷) üÓà¬FOø tY^�§ª¿{hÀ… ÿú £•Â%#e“-ÊÉ]¯ÚAiªîÂÎ…K6b«zÚ²—`«ïÅÊVk†z5ZXí½úN|[5Lª»A5Øèd¸Ïbà—-�Õû»ÀVõ�ñÝŽ“ìn»ú×ï«ñ-NÞo´WÒ¶Ò„ö` lÕlU ¶:�åõü|ô#ÂÐªŠ–…U9£“´¦e—ZÕ¤�ªõqXO`¸ÏOT0þ…ù Ô±¨¶­v—èa«ÉÄ�¶ÏÿôfÌ¿ôäËå6Ÿm-QUþ$ø|>تlU ¶:‰o\í7ߥ®‚Äy[Y‘-Yõ‡ÏK~§øïÿø7ùâñ…UMÞZ`OÙõ³�­þ ™ðªÝÞVÃa]n«ù£ñ݆º]›%¶ú+õïdOû¸¤,¬û�·¿šËDµ¼Éøò¨A²�ñ5ëJtî ªÂN*¿$sU vkLózfÁVõxŒðsĤ|»pOjwÓg [}0®¶Ú^ 2¹šŽ‰­†âÙ'ÙêeW‹d%L®Èö éd[ý2 UŽ‘­~9õßÞ‡º­œ{rôùÿI�­ë�‡-ÿä÷ðõ—¤Ÿ­æÛÛyõ©¶jĽlõòOÀVa~¶zYU ÑÙC[ý“B_Y ÷±ÕÒ®Áíz;V%ýìi«iulxåè`€ÔP¿~ ÿìU=cán´ýè\(¬Õ.¦z/[ý;ÍVófñ]ý˜×³lU¶ªÜlõ½L¶ÕÆÙ/aµµ@¿@§ýlŽy}ö0M"�Àjuº­þ lÎîÿñOûŒüÕ[N^aýûç•vÃc”}•­æQÉ–±}ÀVMhLQŠiÛj˜ŒgµÝØõ'LØlõ½8ÙjMUzjn«A_a�v°œsdÍÌõñ¶:œËð™¹>×?ÑVãŸ‹ÂÆe²Wç#É “Kaý«vµªý­6c7±Õ{CºlÕDUº½¸ÁV ÏYd¿‘­æ-ã»G¶j¶ª[�Ê>PÎÆÊáPqx~-€öRäµ»†”/£%á%¶šlù‰ù®Vá½ýLíP¼ÐTþåUÃÂêX›b³Ö/IlÕ(V~|Ï>lÕlU ¶:�o¥u}ãGgNî;h~v'Ä×Yí:?è5àw·#Ö9¶ºêÈÚŽª\w°Õ.•ô°Õê¹þ-mõ\ÀÉVåÍ‚ð#ù¸A«áž¶z@mÕ lU ¶:‰Ü&÷·ÕZ µøõwªê@1ÆÛVÀ°ÞÂV'ìdTpÝAU»úq™/L§L�Emf«]-Ãå‡ñq…Õ€­¶ª[�Êþ¶Z3Ô¤MqÒk��m¬]þÑcY€üÊ=¿¸¼JÍÛ†HB~³d1��~¦Î— klõx]ÚCn¼Uµ«ý—5_ß1h5`«€­ªÁV§²§­J 5&ÿúû¾¥«²²ÐVÿœˆÌi¯1)áÁ¶Gý3½ì„ZýÌž/ÔêÙòÿüç� áŸÅ†š‹DõÎÊ*;+¶j«ÇV­ÀV•`«SY~)ˆâ^õ~—™ØjrA�®sŽÂD5Z3”\ÍcÏA«c�_ýµèˆ“­ö¶7˜/fÙj(k¡Iøçæ¶znüuKó̇}­l°U5ØêTö¬­öþÉ×_[UkrùßÿûM­2tØæ{·I–ãîy¯ñe.ÈŸÄÖç‚oZX6ŽÐ�y=±µUãùRc�>¶¿É=¼s PⲿnM^uΤ‡ºªl°U5ØêTo«¹›ær™Hdc£’š­†+a½¨‹y6‡Ï=ÕVóØß(�Uo«Žó¥†-|yP§ªÃQ�Ø‘Q­¡ó‚­:„c«V`«J°Õ©<ÛV¿c$ƹÊVƒXX;Š@¡´ëOu;«¼_zèb£*†ÿóñ&ï‹iM�/5ø,[ÍÃUk²ž\>E«m5tÎL‚­>ƒa[­&:qn÷[¦}í‚ñØêTÖ¾ØÅý1±Õã†P7çØª$KMX»—ã9¹\j Rl¾Ž-ö¶É UMlÏ„­UýukÚµdY€¯Â𼫗Øj҃ɺ­´=­ÖÖ¥ÆVaÌV¿}]¦½¸}N‘ëÛêã±ÕW£·ÕãÛ¹K4kbj+¬B'. ëðþÇ?µEy®ž¥Î:aÌëÚª°ñWNCíž25y¾Ǫ̂$äŸÿ¨�Éž9hµØ�Ç¢­s]]X­]à¼�­¾á¤çK‡‹Ã§ÙjÞ²ÑÌiO°ÕWcb«½Š¹•­£ZT•!wO�÷äOàEÓ;H˜ax/ó#[õulÉ…Õ±®T¿O–,)д²k†yÅVŸAî^ùoïï?³/0dn7m!¶ ˘o« %]e«Ágœßqø‹DÎz ³ ×ô3äÃÌe~òý�÷ŸŸÿs¼mL®·ÄV­FÊv¯ãqâl«�ë°„¦¼b«Ïà‘¶zVˆ'ì ¶új”¶jXXm?4@o×pqÊaO�wæÇ?›ÌX×*cMºÚ€ïXH䦇­~Ëék«÷*¬¶cçMÒê·Õ¼A|7™°jAÀVí°²Õ\RWÙjȆ±b«à¶š<¤¼L¥ÞSã=¬:+…Õ �ÛÚêoOÍçÝc«í6?þ9†2ŸèGŒ„kU ýÖ(¯¼ÚæÍÁV­¸—­&EÓ|Oœ’b«PFc«ªö¶Õð[ðÇ�C¬lõÏ.ݱ6i®ïg[F}­§&ŠöŸŸÿó«Õï÷ð ‡ ~¹?úŠ›Ûjßíµ^luLlõ[67ËÛ{‚­Â<žj«š,]Ö:©]†`€âÂ?sL\ 'ŸØ´êòBú®`«_=õ f«¿"~¿�»4ÎPU»z[e«Iƒc^ýmµ¸bà�rÂ%ت†ãV“íØjÀVϰ­†ÑóÝ—¥MaÝs.—¦Ï wÖlÍ£FÛꢰ¿ö_i˰«­¼S½@’U�[ ¿ßH]ÚúÔa�t­£<ÓVóGã»ù\.lur÷*6°Õ¤7«�]„=ÁV_ ¶ê‘ÈÉVÏG‡{Ž1˜ö«#Ÿµ »º‘­^jÂey5RrÕó;muðÚuU gJi–Ê*‚­ZÑ–-¸[}5/´UÃ,µ®\mUh;²v°æÚ�rÅØÙ™KýÿD9#*¶Õö¶ZºW Zë!5Wçª2\?[ [µ[U‚­¾ša[Ölu¬OÃ@aívà LÍu‡Âª&ܵ(ûµŒj2#Jh«qý>Hv̰±a¬¾“Ã\7·ÕÚ˜WaŸØªتlõÕ`«‰|Ç­Ö=rØVckùïßùDã‡òö"2,µ>ÆV+eÔ%¶úe¿¾škïž´w̰±a¬ÕÜÈV“‡â»µfتتlu1“Ç)çÙ{¿ýTUÒÀ$ѽlõÔˆK�ì²Õ¢¡ÖH2Êÿ@3g½µ­ F£.·Õ8$í½ ÖæƒV/Ãoj«yËøî…­Z�­*ÁVW2 ˆ|Æïon«;8±&Eb“m•<=²&‘µYY—†z™ñäzE°™ko†+mµg4ªÕÚ¨‡°Ž½ýD<~"YŠÿ‘ƒVóXï)VÊðáØãÛþïŸ`«&`«J°Õ•ìo«ù8'×Úª°ÍYÚ�tõ_Ê^›Ì%²ÖÏ÷–êZì¡–úà—y+…õ.¶Ú9©?ÆäºSöªÇÖ.[ÐæñÃÂ=mõ[µ[U‚­®dO[mŒÄרj¨Ÿã6\Z?î¡xL=2´Õ$Q^æl/;•¸ã°M Ímõ²ñ�–_ ËùS‡÷L»ˆÔ*[­õpÞÆVc°Uتlu1ùÓ%¶*œ+jb«��˜’1‘òG‹FÕ.Ž‘ë¦dOj<ÌVϳëÌì¤Õ¬¡Î¼äiqèê[�»:nð7Ùl„`«J°Õ•,¹vYqO„ß¹‡À|cCt$*)™dÒæ’F'šþi«A#¬ûتl(êZ[µ´ªéçûm�'Ê*\ÙƒPUÃ�mU5[U‚­®dÏ‘5жj~Ž{ŽKa«ýë{Öå¶Ú¹zÿB[=¶¬-¬æc`lWBÐÇZí¶ r°U%ØêJnd«ùýÌÏq?ÃV5)l«aLX—تb¾T0„:µ•­ž�&«Ìêc­và¼}9W[…a[mœ �¼êeíOˆ·ûí ¶º’{Ùª·Þõ6[›å²‡áÓåÞûZ[ ½ÂjuA¬‰ó¥Æ`«òAçúKgm5hµ½Ò>¶ aÔV{‹en•3${RÜî=Ž[]ÉÂßI[ÅVݲ´Ãü#tÐ —o­Ÿè¿£­Æ×2ÍVã–Ç�iO¯m'íaɤUl‚xÉ¥Ãå}N°ÕÆž`«0 ‰°š¨j˜â‘òXo/ÄVÛ=¬·UÁhÔ™¶:U éVïaíÆó×½2é¤kÐj|wÀ±ÕgP°Õü›íŸÿ¨™b£Ïiçcó‡’°Updš­ÎñHlõ6¶dåUs[½Õ”©±�%¶: ªùÆó¶ëbúNä¶¾*〼b«Ï[Uî ¶úv°U¿Dcë’nèÐæýᢠ«Õ«ß¬:A?-ê˜ý£Çô¶š48oŽÐ°êaØVó‡ÎÛÅ6 GlÕs[�ãˆí?!Ùl¹´ÕÉÃ�b«¬öóÏ »µ¥šk üfò%¦VEõzêÁž¶š4>oë§glb«I³øîyÝlõØÚj¼ÑÃÏaµ}ÄVaØêتÕ~~¿}(È—Ç÷xÃV#-²Õ%¦¼£Ž›\À5ïØ8לiè2ê¼§Ž“b«VÚªÄê¼k«ß²YbÞc°Õ·óZ[ÕdÆb«ÂðCX㩼fln�c�Ã{8lœûVá祎wK×S·¿­&±Â‹c¦ت)V¶*”×9ãV“íØ*8Ò¶U+U تÿ.IÂïb«&ç|•½íl«šªêÁ­m5ßžlñ¸†VXd«ÉÆønû [Ý„‚­–¸<é_lÿmʪ——¶êº'ØêÛÁV²Èc{S¼ÓVCEXmmu¸Ãµük-ÃoIÕÈßíluxÀë�ò¢Ëm5oß�Ûc«ûЖ-¸[}; [5TÕ0ËÛnm«&*éqÍó~Šá‰°š«êpŸ›DÅ£#bcÓŒ½× Uel°öÚ«ªaúT&^ÏXlÕ lU ¶úv°ÕÞ]±÷²Õ|=Íäg½µðXX±ÕsËq£aicw»Âª><îäöÚ»¿­&áñÝÞ®°UC°U%ØêÛy’­N;íî´ò€\%5>šŸ‚?oÿë__FýûögÞ}åt‰�SXßl«µ2j lu¸“ÞkÀÞÎV“�ñ£—=c«†`«J°ÕÅx IŽ˜>×V¥^¨ªsBö·ÕšJ{äŸeùKÝ6H2b«æQ½†Ó¸4”yEVÙÉr[•LÒj_Œ÷¾¶š?zÞ.6ÃV ÁV•`«+qZÔW¾èCx·­Ž…£…Ï^µíUɶGþ£4óTh¨’Œ¡YèmÐxZŽ}6WÕ°¥­&'ú «¤ÿñ¯ÿ _ß&£]%© Û[ÅvuR+¸¨jØØV“–ñÝ# [5[U‚­®äòáé¶Ú>»mR+m�ÅÔÛê/µª>%{£QÉÄ#óÞ¾7PªjÞOžô@³:AmM+%3—£jGÕF£ÚžÓ?„õä|×£6 i|Þ>Fh<ÕVóÀïÿÿ|>تتlu%{Újü#Ûiùªó¨Ù>»=l«ò±˜[Í=5§frÅ(•lwâa«�6ùÆØòßf«’sý®¶z’üXšVì¼�­&�ahŠý*[Ušn ¶j ¶ª[]Éé—ÇÝ Wƒ(îÃ÷¯¤â&óÅV‹’ZÙ«‹ëj¶‹éšÅ¼åp'3mµ˜l¹\À–…S¦üæKÕk¶Jç¾Êöáv¶ªßlÆÀV•`«+ùö«8÷gvÔ„+í÷Äv0@í4w¯ßô*Ñ€B�YWW¶Úî¡6cl«òêØRÿÇ “)ScQB[->švU™™ô¼A«íplÆÀV•`«+Ùy–ÕA.¬�—'¹ÇL�±,تGaxÞIRy½£­Æ’:sa©.[›�ø¥çþ¿nyaUÙ #@¶ª[]É-l5Ù2|þ÷µ¶*o#[UvU³Õ´Í}lµXI]n«¡"¬& �…βq~Ô.–¬`�Ä&ƒ¦‚L^±U [mœ �¼êåÚ=ÁVWr []>ÌÑ£Š©‰òsâ …OlÕv¢Uûtÿ†¶z–HM®šö+…`A(ý*§ì.¼jkþUy¹diÀVá'c¶Z.˜ô9Ç–ï ¶º˜…¿“ÎÆío4aÅV±Õbì|aÕÛª|ÿMl5_'Nï¬ÅIZ�+¸¼ê�¤“±}¸üªŒïÆÓU±UÎ!i;Ü*[-¶¼l€­‚%�±Õ9B<–[­ÞÅV‡/45`H¶Ë|ߨXcøM“ d„¯Ã§4´:ଓ§XIÊ®’N°ÕgPp¯Ò¹šš)V;™x>[…•L°U“"œ_lÕ<‹¶:p­©i§õM¢òùU¡s¥ÕZ¹´k’V£Ä«_ wø É{–h“-ç`†ùÖ8°¶«IÞ3¶jÈólU(¯Ø*Ø ±Õ VlUø[Ø1[[žÚ°¹­Æ�zU�£Bå¿r�k PÖD/Î&zZÛ‡UÎ8¼w‘lu+r÷*6kÛj[¬ùÆöŸ�ïÿ9tÕiO°Õ·ƒ­vÅb«šÇvL)¬¹¡šOc² Ž ‘{ OâËI®¼ÚU 6.\m¯)P+�^v²ƒ­&ÛÏÛW%ت5mÙ‚K°Õ·ƒ­vÅÞÂVk½ '{7<žói¶Ú®¡Î´Õ±(Í^Žèv¸M5WM�åu°6´Õ¤M|×äª[µ[U‚­¾¡­…°b«’À.• W6Ùk«gÏÿõo¿çÿù¿ÿT¡¬Vo[6þ«…8-f´³­¶«ªÁBU:±ªæ*�Uc½Ç»³­æ!çmlu°U%ØêÛy†­ÎbM"�­æ*®lRb«±Æ=眹º&HIvIòè÷‡L l'�±Õø¼öyIU?[èA™ô ÿG6HnÚU¬ng«ql²¥«+lÕlU ¶ ¾ƒô'¸õ¶*9»=!K—®ÉU2”̵a«E÷’$šc«aaÝ$ªQF5) Ö˜YX½ —û«ÉÈ×›ÚêðU ¶j ¶ª[݈ڄ;¿)~gãU¶*<µ=V˜ì:»=f«E§¬e‘èšF%óìE†{n'êzö’“û Ã>Ûc«—çúƒ§­.,¬ÊÛ'[ôWÒ:F¬.\ôÔ/õåòXت-تlu¿œpù²bj¡­Ù䛯�‹ /èT²X˜žÝâ2a"”—)Â×sè�ꩼC!ßóæ]7Ze)Zr¬§ ¿4ì ¹˜p—eòsý—8 ëþ¶Zìá¼­™_õH[ÍŸ·�(lÕlU ¶º {Új~a•1[í2¼Ð¯’ʤĖNÆ„/O‘›¡JηÕZƒøîeãZƒï½ÄV“%–Æ&Ôï`«ËU5éJ~=‚˜÷ØjøýÿŸÏ[5[U‚­nAb™Ëmõ”Ô|»pz~²E#Ir•Tf‘JýR<ÒV»Z^>?†Âº›­ægù‡uÍÃVïXX­õ#/¸ž W½ÍV¨­Ú‚­*ÁV·`[À�…µ¶´Pr~_oH’ž2 ¶j•e¸Y»å}mµå1_ [•÷Ó.¸b«Øª!تlu=¹¤z_l·¸òu¬ÎÛ¶¦¢éä.YÚ6†­¾ÄV%ó¥‚Âm…õ©ªš´½C Ã5ýÄ—Ñ’Ÿqj€­ÂÁ€­z, $\/¨QäZ²rQ¾K飨ª7y¥S/¦®¶:…ÕÊ�Öª¤wŠ9yk[ {«ÇU¦jtÉVÒ¸;|Ô™ó«LzPös8ëù­xhßå’OE°U8èµU ºA<ç{íž4ž�ôQlu&·¨­lÕ!Ńmµ7éæåUyT,©Þš(wÓó”·ßzX÷-¬&ቭ& äý±Uâ!yË1o‰­BJòþ8·{רýlÕP�&œCÇVM²ô6�·ßÁV/‹•TW[íºÚê¿…ÿ}܈§HÚ^nà¶ú�¯_‰—Ú×0Wlr?Ë¿F¾{lâˆØ*ì¶:3ËœùOÅ>±Õs[=<µhH~¶zÙ&ipÚjL¾¸Ç2_UMzÐ÷Ók«1ùÕØ*„~[ ¥ª¶Z}[}½¶ÄÂz/�œ“e•­z¤�tkh«ÁTX­lÕõ‚¨íºi;i±“¢­æœþúÂÂjÐÙjÌØPW}^“plÕj«c{"lƒ­¾luf–WÙêXÒ9åU¥­zOðoGi&` …5 9ëlõ¥«¥˜ÔG{WÀVŸÄ¶¶zVpkúˆ­Â.`«—]y§ÀV…QËmuÎÿv”É úKg�/w|h«~X‚k¸ánL{*1WlõIlk«—{‹­Â. Øj� ë„ïm³`«Ê,]�÷i"¬³ûÔ þí(ÃAma�mõÜ|<˜„îÆä™Rµ ǼlÕlulO„m°ÕW€­ÎLQì [íêsNyµVF]h«:X›w•¨jüÐyÛʤMÂMúÉU5L·Fý% Æò&`«¶ä~VlÖžeå´±ko'ïIm—ÒG±Õ7€­^övG[Mº¦øÞì¼­\ùAóG­ �”Q‹Q«lÕDæ„ÂÚ°Õ¤ÙqC¹×T5ìa«ql|·wålu+$åCh€­Â¸­†+¡ÁV%)º.õtÜðÈ˂寞ÿëÏGþ?ÿóÏoß�ê�lµk4êL[=½e.V¡ªÆ ¯!p¹c“ûÙÍV“¥ ÎÛ’ÑØêV`«J°UÀV¯{“¤�«d¯­æ*9à‘µ¿+é¹ÚU=cïë")ßNºzܘ0eJyP“»Ü“ÃYlõŒÎÇêÚ«i�U5lc«ÉCñ][Ã>ûÄV ÁV•`«àe«æ%CMÕsX%/³ ¨¤ÐV…*)ôÈ<éeÏÂŒ[ýb¨‚òí[m,æÉd[5TÕË>ÿñã�0¨ªñÝ0qÝ+«~nd«yËóö‚­î¶ª[…e¶ÚðãV| à0ϦÈd•œ�ÂÏ#CT‰ôNQ»kÛyxœ­z_°4)£6»„•Õ0€áðó¶í UÍlú¤ŸÛÅlÕ�[]²XÐÚŠ`«»pY ÅV‹Ýb«’,�±Õäu¹—­æQV+75®\JgV/ûÑ\FK>!)tš+¶ ½¶ºd± å+5ÀV·`Λ¦‘ý¦¶:áìö­SlõŠU¶j²~ê9GʤB™_ŒªÈÙlyaµØÉÀe´.Uu`j#\¶ú$„ãñjçWk�`«¿ÅV'�¿kÏ¡«ÉýÆÚ(m5dÂú˜±˜·N¦Ûªy¢¶ ë…u‰­Z•TK»bj� èíù²[ÛÂj¾ñ¼}9R¢×V“GÏÛÅfØ*äÒV¹˜¶Z[…Œ ë[ OQÉÇØjpþ[6|/[ÍOÙ§ê™RBOmÄžÔ:‘8î„êìåe´4¶š´çÿOÚév¶Õ|ù}ý&“u�â»V¶ª9eßxrw[MZž·—ÏРت¹´›ÕÚ$ãYm7&û9?©l~`b«!Ö­ŠyÓRôª^¯­žý÷F]6NT2|µIax­Ùñh¢§'mÝÐV‹×ˆ2wÍÞÒìI¨—W“?m¸Ôjx©Ø¸‡}l5‰Šïê—[5g¸¦Ø*üà ¶: ’±êõ– %û“«dè±ÉÚŸ»oM%…‰ŠHq·4žº¼ÿxçgÚj2wʤžÚ ¨w—n*ïVî7–@Þmñú «ai�ó[^[Ý lU ¶ ?Xn«~UÉFÕP©’—6&¯6:oô_lP¬>=O(‘ÅÆE1=_ú®þ‹ÕÜ�ýQç�‡üÑï·5Â*±ÕZ%Õi`hNì—~Nœô?áOÝ«¿vW¸•­&[ÎÛíž±ÕÝÀV•`«ð¥­Æ±‡FtydX¡’AP5l«¤ÄÆŠm Óv©^Ñóò?ªáyc)ò,q ¥¤4VÚjh kcݨ9žš$ò˜�ULç�¥–Ñ„Ëjñœ"¥¹­&�ž·ófØên`«J°UøÁ˜­CÚ¶*/^Ö kY„Δ^Ñ’‡U²aWò’á@çµDž{Säm4ÏŒ„b.[-SOr}t²:óU¢$éBV^µÍ’gl�²Ø�KýÝßV»bssÅVw[U‚­>–®Yx]¶z¶ü”&wmUic†*yiKq®^•ô“¼ÞÎÇb•*ÙèAßs#W°ºÚ–ÔМôÓìÅu•¨�t ÿÀdbÚŸ0ºÒ’X“Ëha«æ`«J°Õgһ™ÄVk ŠrK^èñ¼vãa•°%¹MúIžIçÅÞŠ=;©¤mÏI‡çO¦aaýÇ—ßuª‹šÊ›yôຸ©&Ä0¼Ö[Lû̸͖¿äv¶‡›+¶j¶ª[}&†¶*ÿŽ”aOjX�Iÿ�ÎgJžmç�žm³ä*i•¨Q»íµÕÚìþœáµBÇ¢&,€eXŽ•wb>dâÜ�Ëß·µs½µ­&[ÎÛ’Ú¶j ¶ª[}&J[Õ|K´MÎÕó>?1￘ȵs§DÅnmµþÒz]FÉmµ1»?o<­P:m¬%ËQ9yªíÛ¬f®�±ÕäÑóv±¶j¶ª[}&c¶ª—ÔœiYìÖɆk7 ;/>ªÉ%ÜÛ±\O…0Ñ¥þžÍ„«PÕ¬´8ÑÇvŒf±ÃÉ `MXŽ*¸É±¾˜*$–¹GÚjÒò¼}†`«æ`«J°ÕgÒ¶ÕÚ5ßî(‘¡©Jz¡”ô0l“ɆhžIEs¸óv?cÏLQX/'NœÂ:mŽÿLO�¹„jˆ´2f8iÒ[û�ù—Ø÷og«ÊZGå[µ[U‚­>“�Úê÷§Åš|ã»Jdo'Ó$¯ËnMþüb?¶ï$—«o cc[JêÉœêc’Ë/]ûÏñûc%Kni„$ï„â»Ñï—vÜóKfhj«hl5Ž-®ö£Ü˜ä2ï¿k…¢Øê3³Õøîy{¬X( œP\¬…{0ô°<ÑÉs=x7¤ÁªçÚ«Óõ^:»éäJgp0×�«C™¤V>�½³û^.?Gž¡°U†mõÛ¯!LÿÊ;9ËLš���4é¿×F϶ú@”¶š�*@Åž­rÕžyýß%M%-¿?¤Q%ï+EIdNi®_œ¹lÖeoí÷CÍ#M>hcß3›¡°U„ãñòñB[­í9¶ –ô^@Òæ¸‘¡{T5ÂÄ“Îí�Êþ‹Qo•Ôçê ïÍŽ5 ÛjqA€åEG¹¹šïª°+�TV?‰Ìõ²˜*ä3´¶ê@IÚ _;E} ¬í•VƒÎÍ×O ¥Q£$Ã^m—÷¿ôTý²Ø‰ßïá£Olnd«ßþ úŸ‘T¶ ?è}%ïé`:гm«*…!&õÂ'©d#…9qϽ«ñ÷^ÃiÕJøIÏÓ&„y,)ÿ!ퟎ~ïIÛÎóžãÎï2C+ ª> Øj.©l5|�ŸU¸7µwyèÿöï=&M“HI'¶Ôš”ßT%ãÝvýÆj«]ªG7¦­„ßèš¹z¬HÕx·ŒNÊ×ð~ó_îÿÎ3´¶êö¶WR™eOC9++XØ4‰Ì»mlñÈu/•l÷¦ÿ»Ú¯»¼ö©Ô»9—‰Ê3º^LµØa­O«©N¼?_µwŽÕgmìs´Û ­€­úÐk«ù4¬ ∭ÂÓ›•|‰\ÚŠÍÚ¶šZmLr™÷™T¶ # üœÓʄÉz{ÐTeºBäQ~*éñ« Öaï3Ó8Wî¡bN‹òX*Ù%¿a¯—3ý•’wùö3—ÈäSà÷þÏS„¹3´¶êÃpM°U˜Dí—¥w™°W"m Ϥª$ITìÓO%�ÒIŠ�t5[õPUù¢¤Ë×Þ¥±ÎC}„¨Õûg²Dæ=;}ÄÝzÏРتتl&Q{«M›•ÕîÄé8—tëz4�Ðy1…IºöÎw¥Ë…u•ªæQÇ�Uë ä)¹Ô¤.žô÷v»i‰jïOÃÂ¥§æxÌРتتl&qùY�6+«Ø›ßq4ïÜUˆƒÃ´Ý�2]ïAúr—[õ˜Se8)óê½~ªüR'ò¯íŸqá³Öx€­$r,©ÕWœÕ ­€­ú€­*ÁVaòϪ÷¬¬Z·óë1šŒÂNÆr ¤Úx’_I«ñ›áòÑü¶o‰ìJ1–TÓÿevlu7°U%Ø*\`õëí'Y¸Øä;½mHVEWcsõH«g Ô�Ö†)jéBT°¼…ªz—W ÷ÜãT½!s$r8…$©Ÿ§†¬ŒÝ;C+`«>`«J°UøCmM�ƒÉo«YYaôpØ›Ks�›Y‰©;M:ftMq²É2R�n‹ .7 ¯nj>¢á©š×·ý>ñ“Èä†Ó[4ïÙ<Ñåþ Í[õ[U‚­Â¾}½LpX÷SÎÊ ‡7¡fÙäjÇN§c›SçIÏùSdûtÕ<@/j%UI·JmuòÔƒâëhûjت9Ó~M5lU™wà+¨a®Øªتl Äκ›­Æ ÎÛ3Ÿ�é<úo»£IºË'Gùì ÓG{íÍûì¿Gûà3±ÌõÝR¤Ø³Ç‡zÂAþÓº+¯ÕWPb®Øªتlªœ:¸§­&�ÏÛ~‡Ï¤WIõ8‚öÞ@®�Ø®¿ÎÊq&_õ*(Âri+6‹Ë7Ň¾qu€â£¼¹áÙ |ƒ'c}‚úHÙeNšt=Œy§ß:ºj�»ºÝ¥ƒÚ.,`®ªµgÉP"å/„&éÀo’ÞtV?®�4<õ[] Ï¿l �ÆXŸ ‡ÉÐïR&îÕèÄÃí’>]õ±–Ô5Ëç'Ç– k`%k¬šHdטޤ½“'UJäe:×�FHßEkli-<ÿJ°U€>Ÿ¡¶ZÃÚGe'÷j$òÀ°Pw™¥øŒY%•è¾ÓXyUuø½a"‘ ²�ÔïgIíyö@î©°تl¦R¬sp‹÷›äK§¨­®¥»™9!×É�t¨LÚ·™3VUèå¶Ï|û5uzßÎùÙsvþù‰SºOtÒº ¼RJ°U˜ÍÎsÿÍ»2Þz‰w]GRT&í*¿i2ðz“*k„zs^Q5d/Äœ_>s$Ò)©äÓ¡O{ê�Ó×)jeO©làú¹õ.ßê'fÙ•k‡IócdoupÀös¬xégÕµsUΩò®tS¸>uµ>'ÿòKw¶Ì¿yôߥ8ßu °U%Ø*<�ãûwù¥jÙM´u‚¥)íAn((“ ò2—Iç5sÕ¨jâ^~eHÉ»B“tà÷Oïûdø'Vž¥-ÓÞ3ýwûÂ|$<¥J°Ux,ñWðV¶o?n TYna�µ]Kwk Ò#cíéŠïžæ:¦ªsÞƒ”*%ò2©Ç»7Ïxé©¶cœÂ_˜�„§T ¶ çÛ׋ ¯Ú‡Ëu˜�—®`n�yÏ~nçQ¨»Lä—®ñŠX=™ò}8ヴ}6jý8½�'ÿø bO=0w ¾0 ¶ª[…W°gmµØò¼=_"g¦p-Pµ ÃÕ™LòjžaFsƒ,veû«–Ô)K-cm‹UŠüb•óY¾σ§T ¶ àÎØ÷”ëU^Ôth’´ËWÆ2ê÷Sþl¸>ÿ~n·ª éš®öt~X>Y1³y¼¦J°Ux —8¾ç_a«­]9œt@‰’*�¡« ihB wôþeâ—¢Ö¹«×lÕÊ %]ižÛÜS&›M|öÿ¾_˜›3¶˜Ìy»=ó!nà±q°Ux‰ªÞ·bax‰× 8�wZéÂe?~Ù¸áÁ„, !¶JÚø+lÿ@áë®7H×ß?ç£�«âMû¦zÌææô>™—¯E±�ÇFù>»‚­ÂÓxÌ—¯ä¯A|äv­6ù)WÒó4·sMQÌâ'‘�Þô¬üÝ¥ü‡ßƽinðÅÛ—Ó.±Õ‡Q[Ç0aøµÀVwÙQ!�ùòîm­à:Ç mð—‹wͳä”aFÉ3¦|íÂþØ™5ÈáD’¼3ÙÙUlõyäÏíýWúÜþ玿Øê.; ¤ñyóXíÅo¸ÏÀ™£øîœÒ wº¢™ëÅ´do½iò㡽«NO~Þ¡÷¡ ’šô¿çñ[�¶ª[…ry’Å*‹ë·üp'~‹ 4ðN5°—× ‹©½Ÿü¼Û0¥Ž^ûMâ—+ÿ‹<žÀs®ä¶ÇSfYMÀÕVã)¹Ø*|aÛšDüÍun4©·ÉË{c‡c»„ÃÊí&× óž[üÒÍ)v:äå‹b•7öÔ«ï×ó9à‡‰­~+]»áòH„­¼šým5ÙxÜè:›¨§$ܰnwYƒôÓÇZÅΜ9ÂZüC<<²ýŒ™xÿÀ‹2�÷lYüÚžo1üΡ¶:§Új»¶ SÈvqyÎè¸Ñ8›×kú ‹}> Y³.[‰º�>i—DŽ¥Óÿx�äÍ‹© ÛÚê¶¿º†‡­æ±U(0g€l/¯˜¢¶z×ç(]£ÿù5H²±I`o¬þÉ‘ôàñf®}X.?qØêËÉŸÛb³Z›Æé²¤M1J¹q°U€§Ñ{Œ1ÞzI±ó¤ •1”HaWʤF¹ä© Å®�ÔÜ ¿µæ¼™g%=Îç`«sàÉT‚­ Òø­|ÇÎ7ϰÚan�Þå½aå(@Z½ÅÔÞb÷ïQ鬥sMtöœŸ9�€ùùœÆŸ€`“©[äa5‰š|+�ú]Ž2,Ozõ”„Ï©ËN3H¿µt~Ió·™ÇÓ˜SïøIÏމ <ŸJ°U€Ažm«ñöãF×Q_é B£27’Z‡~uÁ92—÷ŸüEs 2Ïeò[¨Ý�IºÜS6©­ÞîÛæ…Üñ °Ø*À /±Õ¸Áqc¦>Öúô>­\´Õ9¹œÒµ_Û‚«üÕQVÓÇ¢ºkžz0ù“^ûÎQîFÒÕ¹ýv_b;sǃÂV`«ƒ$‹N¶Uóò‹³²¼õ1X•$—wrBõ±‘¥Ý~ µæ‰’ÿÉ&ï´ËtçÆËŸp̲ µÇ [PñíëõE<<²ñ¨U®±Ý¶ÞzIQÍó �Î_ë“ê÷v²A湊;àô›á¼Ý.¦&`«;À;` )Üó@r.+}Ü�©�’]‰„� ë²ÆêV¹c’1éÖ#WžÔ/E1Ý&Ÿ¬l ïT€µ1^Nßò±³îs Ùa1�0ª­†ÈFæuÁÉÕÇbêi¹’w‚GƸžê÷ɲº@ÀyÛdܪ‡L†w*@•UßòÉÀƒå\.&¦ š,æº4HCõi¤ŸÒM®>†ŠAšgo^vk›Wn�š¼&?$äEÙi+R q½ÃŒ(€"Ø*ÀÌ\ü× _»ž€U²Wé4yõê)Œõ(xÿðKO=ØÇVƒÅè§‹Ü>뙼Èâ-†ÜÕÖ˜PÌ[¢éÄPºT¯ãU¶šl?nôš™~ì@õÑ[ ³4ò†h”íª·–Ó0›ýÖx O82Ü�ù°)ÎŒž¯ª~sÈ„ë ´]Íc(jã|½ëÈׯ€WW$çýÚ`«ÐAñ2-¹i5N�åÍô—~yÏ(j6˜iäò'³¦­®uÇ$Kíî­3&’ºðí]»ÌDàkà><ü ¶4l5&X¼‚v(*¶z2óˆ¾ä$æ´KJt›é¿Ã“€­@¾` �¤¶b׆ß~Åâ†ÚšNÝA±UhÃÌ =Yž/¢ƒÚrKÇ�ammœôßáÉ¿WýæÃL¢±ò¥wÞãÆä•³h?Úz9Ó¼Qýæ³Å÷€÷:Ë,Ü%ÉðVáŠT> |OÀ$–¬RôH[MBŽÉ*ª»ýiϦx­áU©'ÃeàŽl÷e �d‡5ö·U ~Wy`1ÔK¶š’†JÆHfY…¯Íšy,kÀMá{&±VÔ’ªÖ(dÕÏ €¾¯`8âŸ�;î3< ¾ƒàɼj+?VX_@ðd^µ‚À#á{žÌkL[Á à‘ð½ Of[=Ó7øÖè[€'󶬨ÝÀóà{ ^ÁóV°zÒ,.€·ÿ¾x-Ìâ€7À÷<œdèê¹ý1ß~Ìâ€gÃ÷<™…³¬&Ÿ©g<lžÌòõV'ÇR[€çÁ÷<™å+X¡�Jø€'Ó0T<àðe §6~”o?€[€­xQ[‚€².€¾1\`€ |c¸�+é¹[�Ã7&€ E%=6b«røÆp¡¦¤ùåR ¶ àECXùîÂ7&ì ¶ àE²À¹�/^9Ø*€ Ë/ú ð øÆp[0�oL°UøÆp�kY˜À7&€ñ̪¾xä`«°/Ø*€µU« ‡oL· `ߘ.äJznÁVäð� àBQI��Ø*€¾1\¨)é1˜•ï^!Ø*€ aå»@ߘ°/Ø*ì ¶ û‚­À¾`«°/Ø*ì ¶ û‚­À¾`«°/Ø*ì ¶ û‚­À¾`«°/Ø*ì ¶ û‚­À¾`«°/Ø*ì ¶ ðÿµ[ǃü­§±£(àËVø²U¾l€/[àËVø²U¾l€/[àËVø =ÈF3 endstream endobj 84 0 obj <> endobj 90 0 obj <> endobj 89 0 obj <>/Length 11586>>stream xœíÝmr"ɲ-P¯™�ÙÜaMãΦfÖOv±‡Ñ|¸‡“‘$kýhS!ØÚ$í¢ýçŸþ XÒk€eY«¬ËZ`]Ö*ë²VX—µ Àº¬UÖe­°.k€uY«¬ËZ`]Ö*ë²VX—µ Àº¬UÖe­°.k€uY«¬ËZ`]Ö*ë²VX—µ Àº¬UÖe­°.kŽàÏŸ?¿ÿ½ýv¾<ýôñ­ËK]�ç*0ÿìÝóägžèêüþ±ûûç\ç‘óníÛ£q{žGi¯¿j—÷™)_}üúa¡Ç\àiçŸ÷Éj)wäÝ3 ~ö¶ÉÈ™'º½¦;­Õ¥–P2U£¿VßrÕFþ ôtì"7°‘µ GðèÙ©ñ wûÙËÑóè³ù³¹w£Z×ë9ÖêéƒZ«Ó¿èR7°‘µ G°ÇZÍ/ÒZ«wO/GUr†òƒÛ£Q.æG_ýòR­ð»•’W$7ÓGõ¶^>^o¯Úí±-�@re§ÏÁ>|>kŽàîòø÷Ï쑵z’<,”gk=ÛwÕ]«—Ï×êø+n“WMtßxéÅݧ±#=ªåž»{ÕÊ—p$ùîÕɯìÇ3ï+ˆµ GðhŽŒ,°«�GŸ½=O²ùîyªïnáòSIHùÇ«æeÂxøHÉäÚµ _�ò(¡õüúà“ßo‘YÇsü¸ÇZ…#˜²V/£’3ĽÝðèâwÏV>Ew÷Ÿ¡ó'Ë”Wº›yuÙnx«dÒdp­Ž�ÖZ-ÿN2~eï~õíÇóÑ•²Vá0¬U8‚‘çÒº?¼“Iš¤•ÏÏÅØ"yûZ}ôLó ÖêÝã�œçQ«=Öêàaï°åxæWÍZ…ðVáFžvjý+ðÕ‰åi2þ¤Ýkµ|¬›ûÏôÝ’åq,|åöêlyNwü°<º‚ƒÏU·þ‚t76??ðY¬U8‚Yk5n~ØÇÅĉc.or{b2zÊ&ùõ ÙÙOü#{wÀ „«+ž¾5Òên`Ùÿ‰+»ëñé|(kŽ kd­ÆƒÅSþËøMnÓFž‹½=¥‚wOi^þ{ôHx÷ÇïžùQÛ»ùù*gÜÕUËÿ tÕyü¼àÕÙFÎYžøPÖ*ÁÏ&9gå?ãv›Ä½­6>mŸ‚å—+âfº †�üãxrHËÂw“ë2þ¯í·WùQáóyºÓ~­ÆÅïN�'é–µzù›X¼Ëi¾»ÅË€£úùùùøµzÉ+ÞåžÂ\¶Øž[½d­¾Ë7ŒÂe‹À�}üZ½zÝêéckõõ¾a.[ ìã×jüûu«·'†ÿ;ÀK|Ã(\¶ØÖê~¬Õqß0 —-f­f¬Õqß0 —-f­f¬Õqß0 —-f­f¬Õqß0 —-f­f¬Õqß0 —-f­f¬Õqß0 —-f­f޽VOQsÓŽ= —-f­f¿V×Ü^ŠgÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjfÊZ=�’˜7˜&F­¹½άÕ̬µºæÄQ쉨5‹À�Y«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€ÊÖêï¦<|®7~bžl­Ž§…bÍ´°V òñkõwP^V:ýqüÄ2ÜZO Åšia­@ÅZ-­Õñ´P¬™Ö*T¬Õ"ÜZO Åšia­@åã×jÜ{5ªµ:¥X7jÍbp`¿V§?·z¹}g9Mœé±Û)Öµl18ªŸŸk5 ÷ÜêxZ(ÖL Ï­@Ås«E¸µ:žŠ5ÓÂZ€ŠµZ„[«ãi¡X3-¬U¨|üZ ÿw€ QŠu£Ö,v„µºkµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨|üZý”W§œ^ž~î|÷Ä<ÜZO Åšia­@åã×ê¥ßqyžª—=O¼{bh­Ž§…bÍ´°V b­�ÖêxZ(ÖL k*ÇY«—ëÓZŒR¬µf180kµÈ´VÇÓB±fZX«P9ÈZÍ—hk­ÞþÚÖv§‰3=v;ź–-Gõóóc­f±ž[O Åšiá¹U¨á¹ÕÛÝi­F)Ö�Z³˜µZ$[«ãi¡X3-¬U¨s­†ÿ;ÀX”bݨ5‹À�a­îÇZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*GX«¿›òüñ¹Þø‰y²µ:žŠ5ÓÂZ€ÊǯÕßAyYéôÇñËpku<-k¦…µ •£­Õ»'Z«�¢ëF­Y ÌZ-­Õñ´P¬™Ö*T²VÏ/H=Õ³V£ëF­Y ìk5þý{T_·zù›X³œ&ÎôØíëZ¶ÕÏÏÏǯU¿eõt”bݨ5‹À�á¹Ukõé(źQk€{çZ=ïÅ«Í.äò�Öê`”bݨ5‹À�½m­žj÷ûE]%ø¿ŒD)Ö�Z³Ø;×êÕ«#Ov¾˜µÚJ Åšia­@åÍkõò5Öê`Z}{)œ½ù•'W³uÖj+-k¦…µ •7ÿ–U,üÄjX«Í´P¬™Ö*T>þ¬ve­¶ÒB±fZX«PyõZÍÿOQ«Makµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨¼ùu«—ÚT kµ™Š5ÓÂZ€Êûßo59åí¬ÕVZ(ÖL k*K¼ƒÕ™µ:’Gß^Šg﫳զjX«Í´P¬™Ö*T¼ƒUÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k* ½ Ö{1€µÚJ Åšia­@ÅoYe¬ÕVZ(ÖL k* ½ƒÕ‚¬ÕVZ(ÖL k*o~%ÀâƒÕZm¥…bÍ´°V â•kµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨x«ŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*Tz¿Õw°µÚJ Åšia­@ÅëV3Öj+-k¦…µ •…ÞouÁ7´²V[i¡X3-¬U¨X«kµ•Š5ÓÂZ€ŠWd¬ÕVZ(ÖL k*~Ë*c­¶ÒB±fZX«PñVkµ•Š5ÓÂZ€Ê›Ÿ[=§-ø¢Õ°V›i¡X3-¬U¨¼ùu«—k5Ö{1€µÚJ Åšia­@Å{d¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V â¬2Öj+-k¦…µ ï`•±V[i¡X3-¬U¨x«ŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T–x%Àoæ–_±ºûŠ‚Ë¯Þ'ëêÄ<ÙZO Åšia­@e‰ß²:­Õxö¥«åÛ œþx÷Ä2ÙZO Åšia­@åýï`uûÁÓQ�N±VE)Ö�Z³ØÇ¯Õ»—²V£ëF­Y l‰Wœ=·Vo¬ÕÁ(źQk€[â·¬N¦¼ ¦ƒkõîŒÞè4q¦Çn§XײÅà¨~~~õVÛ×êUšçVÇÓB±fZxn*o~nõòݦ¦$[«­(źQk€{óëVÏï]u²ý·¬¬ÕV”bݨ5‹À�-ñž±í0þ?ð¸ŠR¬µf18°7¯ÕË×lùßYíÄZm¥…bÍ´°V ²Ä;XmüYíÇZm¥…bÍ´°V òþw°Zö‰Õ°V›i¡X3-¬U¨¼s­®ÏZm¥…bÍ´°V òþçVÏÜÁÖj+-k¦…µ •%^·z¶Ú`µV[i¡X3-¬U¨¼ÿ¬’SÞÎZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*^ �±V[i¡X3-¬U¨ø-«ŒµÚJ Åšia­@Å;Xe¬ÕVZ(ÖL k* ½nuAÖj+-k¦…µ k5c­¶ÒB±fZX«Pñ[Vkµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨ø-«ŒµÚJ Åšia­@åÍï`uN[óe¬Öj+-k¦…µ •7¿àr­†WŒ¥ÅÑ·—bÀÙBï °àÓ«Öj+-k¦…µ k5c­¶ÒB±fZX«Pñžkµ•Š5ÓÂZ€Ê›Ëêò�«MÕ°V›i¡X3-¬U¨x«ŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T^½VÏïTåu«O§ÅÑ·—bÀ™µš±V[i¡X3-¬U¨x%@ÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ïy%À#«Makµ•Š5ÓÂZ€Šµš±V[i¡X3-¬U¨¼s­®¶MoY«­´P¬™Ö*TÞóºÕ�xC€°V›i¡X3-¬U¨,ñ[VçñºÚ`µV[i¡X3-¬U¨xn5c­¶ÒB±fZX«PñºÕŒµÚJ Åšia­@Å{d¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V ²ÄoYÍò;.Ïõî¾ä û:kµ•Š5ÓÂZ€ÊqÖêi‰žê]ÎÖóïžXfZ«ãi¡X3-¬U¨X«E¦µ:žŠ5ÓÂZ€ÊAÖêÕµV£ëF­Y ÌZ-b­Õñ´P¬™Ö*TްVoGê–µš¿kÁsNgzìvŠu-[ ŽêççÇZÍ’=·:žŠ5ÓÂs«PùøçVoŸ }4L­ÕÛ(źQk€ûøµzÉs«Ý(źQk€;æZ ÿw€±(źQk€;ÔZ�ÎZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*ÖjÆZm¥…bÍ´°V b­f¬ÕVZ(ÖL k*GX«¿›òüñ¹Þø‰y²µ:žŠ5ÓÂZ€ÊǯÕßAyYéôÇñËpku<-k¦…µ •�_«W¬ÕV”bݨ5‹À�Y«Ešµ:žŠ5ÓÂZ€ÊAÖêù©§zÖê`”bݨ5‹À�d­žmnõò7±f9Mœé±Û)Öµl18ªŸŸk5KóÜêxZ(ÖL Ï­@Ås«Ešµ:žŠ5ÓÂZ€ÊǯUï`µ%J±nÔšÅàÀ>~­†ÿ;À†(źQk€;ÂZÝ�µÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*TްV7åùãs½ñódku<-k¦…µ •�_«¿ƒò²Òé�ã'–áÖêxZ(ÖL k*¿V¯X«­(źQk€³V‹4ku<-k¦…µ kµH³VÇÓB±fZX«P9ÔZ=Ð-kõò7±f9Mœé±Û)Öµl18ªŸŸŸƒ¬ÕËõé¹ÕÁ(źQk€;Ès«ùµVE)Ö�Z³ØÖêíî´V£ëF­Y ìã×êíËLÏ/]½:åщy¸µ:žŠ5ÓÂZ€ÊǯÕ]Y«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T¬ÕŒµÚJ Åšia­@ÅZÍX«­´P¬™Ö*T޳V—åe·ß?ž?>Ÿ~÷Ä<ÓZO Åšia­@å kõ4C/WéÕrýýãÝGbcÛ¤Xvâ(öDÔšÅàÀްVoǨµ:¥X7jÍbp`GX«'ÖêQŠu£Ö,f­™§¬Õ‘´P¬™Ö*/áÎ|4kõNÎôn§‰3=v;ź–-Gõóóc­f™§<·:’Š5ÓÂÓ]¼„;ðÑ<·Zdž>°VGÒB±fZ¼„;ðѬÕ"óô�µ:’Š5Ó€à%ÜÙ€�v̵óþ溺Ց´P¬™/áÎ|´ã¬Õ=X«­´P¬™/áÎ|4k5c­¶ÒâÿŠmoømGl{äÜÙ€�f­f¬ÕVZ|ÓZ�r5gƒœ;ðѬՌµÚJ‹µ×êÜbË®U»„[î‡1÷¦œûeVÔܯ舃µš±V[i±ö(\¶ØÜó{\ß²?×_ÿ—]s-;q>ºØ§ßÇ>ý!ýÅý­ÕÌøZMn��…¯/6xľa­Îýžý£ü²?ð–ý¢{ÅÛüã-‰»\á¦Ü»Ø£¯Xæ?]lÙ›rÙµºìì 5û[«™¬ÕäÁôeÅî>˜³VoÏ¿ýl{Ź?·žö%? F.øé?°/¸ÂMùúí5øH¾ì(|Ë;}°ÓcÔškoÜšý­ÕÌôµºÂÄyËZ½ýB´V‹uóó#vú`ðˆÝ�ùÒù‰‹{Úë<}ÄæÛ~çìæ?wžñ³ ^pןë‹Üù·?ÀN)öôÃÅÓùƒ9Ûà{ú‹Î½óïz¯Þò_Üÿ¯µš¸»V»?~º'¿i“‰“ŸÿnÂ�×êmŸ)QÛ×êH±¹?~æ^ðõ?G ~W~úÛþ]uʬüçÎ3~¶Á >}ÄFòßrç_á>6·Ø­½.ž>bOÑ�ß§wOœr¯´æÃÅ_k5ñh­¶îèÿù̵:±X÷Á4?bƒnûlhèÞ”[Š}Ð�Ÿ½‹�øÚ#v×ÄbƒùÏ�gËÙ>ý¦¼µH±½�Ø­½.¾ä¦œh͇‹¿ÖjbËZ=ŸòŸkõ2íꃫóŒçç%Ýï�¼Ø®kuËÛõ¦ÌÛN,v7§ ®°V)¶ì›Xì®§¿+GÎÖ}I[𦼵H±½�Ø­EŠ}úM9Rc‘Ø‘¯x{â_k5ñqkõõÅ’†;K¾tÞçõG,o;±ØÝü�.¨˜bOWŽœíKި׻µH±½ïü{©±ÈwåÈW¼=ñ¯µš°VÇïè/+–|é¼Ïë�XÞvb±»ù;]P1Åžþ®9Û—±¯-vk‘b{ßù—½)Gú¯pÄþZ« kuÁb·)öÆ#–�¹TL±§¿+GÎö%Gìk‹ÝZ¤Ø²Glïb·y¸¸:ñ¯µš°V,vk‘boú u~Å>î;P1ÅSL1ÅË/h­fÞ¾V?îþ¤˜bŠ)¦˜bŠ)f­¾Žµª˜bŠ)¦˜bŠ)f­¾Îy}þ¹"ÖªbŠ)¦˜bŠ)¦˜µú"¿Óó²üÕ]äôÁj7Û²÷'ÅSL1ÅSL1kõIÖªbŠ)¦˜bŠ)¦ØÇ³V‹‹œ>Xíf[öþ¤˜bŠ)¦˜bŠ)f­>ÉZUL1ÅSL1Åû¸bÖê�³½°kuè"·äŸÝ~þ—}!Å[íüŠ)¦ØjçWL±EŠ ê�{)WWu䚯³)¦˜bŠ)¦˜b«�_±�Š ê�{)WWu䚯³)¦˜bŠ)¦˜b«�_±�Š ê�{5úÿw€Åo6ÅSL1ÅSlµó+¶S±A½sÀ+Y«¬ËZ`]Ö*ë²VX—µ Àº¾b­þyð?_}âºÿyðžYÝ÷bHòŸË¹z«ˆóéO§�/¾1mâÁ���ÿ–�‰ÇâÁwþ§ÒÎwçï^Ö�ÿ9îüãiîü­´+ ÞùGk~­&´ýv_ÿ>ÿÝ÷k¥%Ÿ}ºXRòõi~^æ‰bÉg9bsoÊñO�œß�¿5þ©Á4wþVÚø§FÎïÎߊÿÔ`š;+müS#çßxçßÂZÝôx>å¹›íô�³ý/+ßù˜ÛŽÿ¬ƒ_ù˜îü�¨ñO�§¹ó�§�jðüîüãQãŸOsçOÿÔàù7ÞùŸf­ný<�¸åf»üæñ˜ÕMÛxü·üøÖǬpçŽÿT+Í�0müSãçwçŒÿT+Í�0müSãçß~炵:á;ðöïjOøsñš•'.ûèÎ}øÇ¬˜qü·üÛb[Žÿg=f…;ÿp±ÁOuÓÜù‹ ~ªu~wþÁbƒŸê¦¹óüTëüSîü-Ç_«qq�¼²ýÑ¡<}VþÈïž¾1íŸõ^k¿ßñßþ4É­-GlûÁŸ^Ì�ÿ½ÅÜùßXÌ�ÿ½ÅÜùßXl×;ÿh�oX«|(kµgúß~.Ÿüß’v÷/RSþ¾8ñŸ$vúûâö¨¹ÿì2릜þ7ì‰ÿ´7±Ø”«¹«íÏ{û:N¼:sŸ�»›?ñ¹¥-5îž¾ÂÃÅ®?’¶;_|{±ÃÿHŠýoÊ×?ˆY« û½²dâ‹„6¾t)/³Îkq&¾BknÚN7åöbyø‹mO›èÑ�Ø“7±‰&^ÇË´]ÿAö¹ûXòÙîMùÄ¥’´YWsÙïÊé7åú°ßö#éõbÖjç<4Ìý¶¹÷ý|÷ôíGlãÕœxoëm|"çr÷úvÓæ^Í)×1f_Í]¹Ž{\ðQÚÝÓg}‰Eþ.4÷‘ýI£bêÕü’IË®‹§Y«¬ËZåK=z®kû_d·ÿ+ùŶ?½7ýI߉i·ásŸð{ïs{·ÜrÄ&Fíš6÷Ö)¶ÂÝé5i§V{¸X¿Ø¥íÿз=mn±§Y«|£OyõÒÄbIò‹£¦K>;ë…+O¤M/ö 7å—;}°ý‡ïĨ¹ißsSî]lû‹ vú!╼ßÊ?°g¥Ý~§�OÙ¾V·¤íWì¨�òñÿïÛŸ‡žž67êð7å·»½{tMŒÚ©X|ÇM9·XžüⴹŶ°V¹câ½pîzVÚݜӉSÖêÓiû;ê£üåcóï~í‘6%ênÊ/,Û¦áĨýŠ}ÉMi­îÍZå¾cÖG!Ï=@OL{M±üS{GMO»ºøéƒY«™•¶1êÏ¿_·ñç⬨éžáö£¿‘ž>˜ò—Û'¢ö+¶ì(\¶Xžüâ4kÞ,Ù…O|SLL{A±·GMOÛ)gzÚ¬'}cÆó¾£f¥ýyðjŸ�{ÚܨuîN»¦�>øgÕ_fZ¶ØåÅ·<ÀÎJ›[ìiÖ*ë²VX—µ Àº¬UÖe­°.k€uY«¬ËZ`]Ö*ë²VX—µ Àº¬UÖe­°.k€uY«¬ËZ˜àÏŸ?ç�¯WÏŸú=ýòã)_±•sYò|Ù'r^ÉZØêrð]�¿äS­üÛKuÓ5±V�ÅY«›Ü®½¹»pÖš|”c­‹³V6IÖêÕ¿¼Ÿ]}êê‰ØËË\íà|’^}õäÉà»_à-¬U€MžxnuüÄ»ù�¾ÊmN~þñ�ÞÈZØäéµÚ½Tòug�ßZd­lòÜëVóô¿=ý•kõ¶ÀY«›lù-«î¿à?:}�çVa­lÕ}«�^·ê•À!Y«<úUúñW † &?½n½'°k€uY«¬ËZ`]Ö*ë²VX—µ Àº¬UÖe­°.k€uY«¬ËZ`]Ö*ë²VX—µ Àº¬UÖe­°.k€uY«¬ËZ`]Ö*ë²VX—µ Àº¬UÖe­°®ÿÅØô� endstream endobj 88 0 obj <>/Length 8514>>stream xœíÝav£Ú±€Q<³Ì&Ȧ‘Ùdf÷9O7Z´@ˆ‚CQöþÑKÆR °,�‘üó×_ PÒ�Z ,µ @]j€ºÔ*u©UêR«Ô¥V¨K­P—Z .µ @]j€ºÔ*u©UêR«Ô¥V¨K­P—Z .µ @]j€ºÔ*u©UêR«Ô¥V¨K­P—Z…‹ûùùùýwú�>^þ¼<5¾ÕÛuÞ.vv5^7™.œ}^zûÔï‡Ñ§¯…áÓkÖynœ]íéÞ˜^çÓ´üM?<šÜûúí. Ð32p„Ù(‚µ:{…•Ÿý´{ju[¬¬¼U©ZHÕ!^«§lÚ×ÿÉì[äËJ­ÂÅ}:¬µ>þ–‹~úì×뛓+tÍ ·*•A—©ÕæwZêËJ­ÂÅQ«Ë7YîÁ[ì._áíÂt£>Eþ´b³sBÃgWiቅ½½2ñg~Ú´¯gk,|îbù5»±Ÿ¦ÍNˆ®Ï\�Z…‹›-€áC.LxZxÆøzµ µ:¸\«k~Ýüõä‡èð gPÌ�V'잯æ§]º°d¼9Ë{Äþ\^ŸA°Âm¨U¸¸¯/‡Ï©ñ6äÓg§×ùztsáÂÛ´5A¶æÈâú 뇯YÉÙ±VøÓ\^¾<ðëÑ�=t®ßoÀŨU¸¸&µ:µp…a.8fWfe­Î†Úô³¡õ�þ¦þëáÆ•+¹°&+kuýÕêò×1´±³÷¾~Ú(µ 7¡VáâÖ„‹þÔ_™¤ ŸªP«Ÿ'Ôêì®X¸Î§µ:¢VWî–õë°g.ošZ…›P«pqkŽW…~}ü¶ðkÄÌN>äËžZýúlÖö×ôÑ•ütÛP­NM7gÏ1Ýõ»åÓ®Z«ûÏ@X¿[–?{Äþ\³þÀ%©U¸¸å`+ÏXþUû§ß/�Ú_«ÓMX^�¯ñýåøì•?­íìüå;úšqo›¶ü?™·u^ÿYy÷«­¹æ×ë—¤Váâ6h\˜óòõ÷¿_çì©Õõs¦wýé „…â›Wrz/ÓõYXáÙ� Û²þ·íÓMþ´Â g,¬�[Q«Ô¥V¨K­P—Z .µ @]j€ºÔ*u©UêR«Ô¥V¨K­P—Z .µ @]j€ºÔ*u©UêR«Ô¥V¨K­P—Z .µ @]j€ºÔ*u©UêR«Ô¥V¨K­P—Z .µ @]j€ºÔ*u©UêR«Ô¥V¨K­P×ɵúóóóºüZ“#У3kõ7+Ç÷þüðˆ…oG)sj€7…bN­ð¦PÌ©UÞT‰¹WVæÔêø•X¿�G»M`É¿þõ¯õW.Q«ã¦Ì?¶ú{�ÿüç?M6€e¿ÝÕY­.÷¥Z¸’ÎjuZ“jàÂzªÕ·“G‡ÿ½™ò_P«izªÕ"Ô*@µ¦VÒ¨Õ0µ �F­†©U€4j5L­¤Q«aj �Z S«iÔj˜ZH£VÃÔ*@µ¦VÒ¨Õ0µ �F­†©U€4j5L­¤Q«aj �Z S«iÔj˜ZH£VÃÔ*@µ¦VÒ¨Õ0µ �F­†©U€4j5L­¤Q«aj �Z S«iÔj˜ZH£VÃÔ*@µ¦VÒ¨Õ0µ �F­†©U€4j5L­¤Q«aj �Z S«iÔj˜ZH£VÃÔ*@µ¦VÒ¨Õ0µ �F­†©U€4]Öêo/ŽWã÷Ã×å×ò� —ï]­äè¯VŸq9nÍ·rýýpç¯+ VrtV«ÓÄT«ÖY­þ½jຯÕaîÄSµ p Ý×jαÕq�æñx¨UÇV‰ùÇ?þ1üÿõN^¸ÇVÕ*ajÒ¨UµJ˜Z€4Ý×êà¯�N­@š.kõ\jµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iº¬Õß^¯Æï‡¯Ë¯å;.ß»L¹9µ iú«Õg\Ž[ó­\?ܹðë È”›S«�¦³Z�&æl_ªU¥V Mgµú÷J¨UN¥V ÍEjõuîés¹ZåPjÒ\¡V‡Éi¬ÍkuüJ,Ò<�îkÕ«¬HæØ*¤¹Â±UµJ2µ iÔªZ%L­@šîkuð×H§V M—µz.µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒtY«¿½8»ãå¿—_Ë7,\¾w™rsjÒôW«Ï¸œ®Æxù[Î>?\¿ðë È”›S«�¦³Z�MÌ×§µJ µ i:«Õ¿WbÒ”oé©V9”Z€4jU­¦V Íju©ÍkuüJ,Ò<µêØ*1Ž­@šî�­N�z†ÂT­²�Z€4Ý×êìrµÊ¡Ô*¤¹f­þ:GR«�¦ËZ=—ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iº¬Õß^¯Æï‡¯Ë¯å;.ß»L¹9µ iú«Õg\Ž[ó­\?ܹðë È”›S«�¦³Z�M̯WP«´¥V Mgµú÷J¨UN¥V �ZU«„©UHs©Z}-o^«ãWb�æñx\¤VÇ [åPŽ­@š‹[]ŽNµJ[jÒœY«ã_ÜëÞëô톳~º‚Z¥µ iN«ÕW¡Fßœ˜üÒÿí³ã~ë¯ЄZ€4gÖêÛ�Õ5Ç5+P«¨UHsr­ŽÏP«ôB­@š“ÏxzËÖâÔ*jÒœü*«¡·«ƒZE­@¢.ßÁê\jµ i²kuù�Bu‘Âjµ iÔj˜ZE­@š`pÞ*]Q«�æü÷[]XR“ZE­@šï`õ¢Vé‚Z€4翃ÕK©:¨UÔ*$òVajµ iÔj˜ZE­@šBg �œ  VQ«�Æ«¬ÂÔ*jÒz«^¨UÔ*¤©ò×:¢VQ«�Æ™ajµ iÔj˜ZE­@ï`¦VQ«�F­†©UÔ*¤)ô~«½t°ZE­@ç­†©UÔ*¤)ô~«½¼¡•ZE­@µ¦VQ«�Æ™ajµ i¼Ê*L­¢V �w° S«¨UHsò±Õ×´^NZÔ*j�|Þê¸V‡NNP«¨UHã=ÂÔ*jÒ¨Õ0µŠZ€4ÞÁ*L­¢V �w° S«¨UHã¬ÂÔ*jÒ¨Õ0µŠZ€4%Îø�z‰ÕÛ•Çg¼½%Öæ…Ë÷.SnN­@š¯²zÖê°:‡?[ó­\§í]øudÊÍ©UHsþ;XM/|½ÕÂÁR«$P«�¦³Z}»íôVj•jÒ”8àE­Òµ iJ¼ÊêiÛ«¬rju¶­8Úãñèï¬[å\Ž­@š“�­¾ÎXj[}»w™rsjÒœ|Þê뽫žœ·JÔ*¤)ñžCðøëœK­@š“ku|@èÏY�H­¢V M‰w° ý-«Ó©UÔ*¤9ÿ¬ú:°:¨UÔ*$:³V;¥VQ«�æüc«/½t°ZE­@šç­¾t¬jµ iΫ…%5©UÔ*¤Q«ajµ iœ ¦VQ«�Æ«¬ÂÔ*jÒx«0µŠZ€4…Î[í…ZE­@µ¦VQ«�Æ«¬ÂÔ*jÒ¨Õ0µŠZ€4^e¦VQ«�æäw°zMëè4VµŠZ€4'Ÿ 0®ÕÁ™tB­@šBï ÐËáUµŠZ€4j5L­¢V �÷S«¨UHsò«¬Æv‘ªƒZE­@"ï`¦VQ«�F­†©UÔ*¤É®Õ×;U9o•~©UH£VÃÔ*jÒ8 L­¢V �Z S«¨UHsΙŸt‘Âjµ iÔj˜ZE­@š3kµ‹6�R«¨UHsÎy«ý¾!À VQ«�¨Ä«¬^ñÚE°ªUÔ*¤ql5L­¢V �óVÃÔ*jÒxO€0µŠZ€4j5L­¢V M‰WYí4{vÁÎ…Ëw'SnN­@šîkõ·Ç«ôüpç¯÷(SnN­@µªV S«�F­ªUÂÔ*¤é¾V‡¹OÕ*‡R«�¦ûZÍ9¶ºüVäñx¨UÇV‰qlÒ8¶ªV S«�F­ªUÂÔ*¤é¾V€tjÒ\¡V“©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�F­†©UÔ*¤Q«ajµ iÔj˜ZE­@µ¦VQ«�æ µú›�¯Ë¯ÕÛ¹pùîdÊÍ©UHÓ}­þ¶ãx•žî\øõeÊÍ©UHsµZ�]¨ViK­@µªV S«�æ"µú:÷ô¹zj•C©UHs…Zþ|ÉÔç­Ž_‰@šÇãÑ}­z•É[€4W8¶ªVI¦V �ZU«„©UHÓ}­þ:éÔ*¤¹B­&S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V Í¥jõ·#_«÷{ùµ|ÃÂå{‘)7§V Íujõ�ÏÕgëëÃõ ¿Þ‘L¹9µ iÔªZ%L­@š‹Ôê[zªU¥V �ZU«„©UHs…Z�FjóZ¿ €4�ÇC­:¶JŒc«�¦ûc«Ó£ž¡0U«l V M÷µ:æØ*9Ô*¤¹f­þ:GR«�æRµšC­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V Íjõ7_—_«·sáòÝÉ”›S«�¦ûZýmÇñ*=?ܹðë=Ê”›S«�¦ûZ}£VI V �ZU«„©UH£VÕ*ajÒ\ªV_­Ù¼VǯÄ Íãñ¸H­ŽCÓ±UåØ*¤¹È±ÕåèT«´¥V Íjuš˜j•C©UHÓ}­NÏ(}�ºú¶$´pùeÊÍ©UHÓ}­æS«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V �Z S«¨UH£VÃÔ*jÒ¨Õ0µŠZ€4j5L­¢V¯äùÕ|AªR«aj•âµ*¿B~w׿ÿý×?ÿéû (µV­V¥I¾úµ*¿Ö³»ŠS«akÕÏÚdjõJì.€âÔj˜Z]©xÒíQ|ÓÊ>$j²»ŠS«aMjµaî´ýYÛvÅ Žj¢Úú¼‘_!ewWóï VÓ’©Õ0µÚõ¨&ÓÔê•”Ý]eŸ%’©Õ0µÚõ¨&ÓÔêé|EG]þ!\˜Z S«]�j2í5¡f¶Þ!M|EG]þ!\˜Z S«]�j2íˆZ-û�hè»ëÛ�L­†©Õ®G5™v«Z-»� GÝaw©U _j5L­v=ªÉ4µz±QwØ]jè—Z S«]�j2M­^lÔv—Zú¥VÃÔj×£šLS«u‡Ý¥V�~©Õ0µÚõ¨&ÓÔêÅFÝaw©U _j5L­v=ªÉ4µz±QwØ]jè—Z S«]�j2M­^lÔv—Zú¥VÃÔj×£šLS«u‡Ý¥V�~©Õ0µÚõ¨&ÓÔêÅFÝaw©U _j5L­v=ªÉ4µz±QwØ]jè—Z S«]�j2M­^lÔv—Zú¥VÃÔj×£šLS«ÍG=?µþŽn¾»6ŒR«@¿Ôj˜ZízT“ijµù¨è:ß|wm¥V�~©Õ0µÚõ¨&ÓÔjóQjõèQjè—Z S«]�j2M­6¥V�¥V�~©ÕÿÖçëòš­S«]�j2M­6¥V�¥V�~ݽVÓs¼Eo~º‰ZíwT“ijµù(µzô(µ ôK­n©Õç…&¹³yÂxÔ~Ö¶ÕdÚ´VÎܵú½VǯÄ �ZÝrlõy�… +¯Öõ {\g[ü®mlÍö¸Î6¶ø]ÛX»í†+Å®]ßÛö¯Ù¾ZnØã:ÛØâwmckÞ°Çu¶±ÅïÚÆÚØm7\)víúÞ¶Íî¨ðÕªpÃ×ÙÆ¿k[ó†=®³�-~×6ÖÆn»áJ±kwá'þ×NÿjU¸a�ëlc‹ßµ�­yÃ×ÙÆ¿kkc·Ýp¥Øµ “Z .µ @]j€ºÔ*u©Uêºo­þ|øã«vÈχ÷ÌŠ¾AçáÛ†¼½‹Ä솦½n¾sZ/{~Ïœ†;¿æž<ì·ŽzSía¿gÈåöžp6O{SmçWØóÃ]ökWãžµº°—Ãïöçõgßilý¨…Ïn^«…5ÌŸVsÏUw~Í=¿¼2öË£ÖjÍõ‹ìùå5¹ÆÃÞÎÎg‰•ŸZsý"{O8jõpÇ}-ÇK6?…íÿïË ¿‹†}{~(¹ókîùÙ›xدµþS+¯_aÏ7xØ{©S«C�‡½'µz¸C¿–¯…{ž÷‡ÿ}/ù. �Ú¹ç‡b;¿æžÿtû5£ÖjýõOßóà öžpJÕêPàaï G­îè¯å0÷¿·¨ŸÑ),nûé±~íŞÊìüš{~á&ökVlå§B×?wÏOWìz{O8Õju8ûaï G­føùpòÊþ‡ì×åM†¯¹áìò�Óþ*vö÷q{~Ïœ¶Ûøºm�=?xØŸ·b5÷üpƒ‡½'œsW¬àÃÞNtÚf÷­UêS« ´ýÿÐøw;GM69jÒð×C—ÜÆé/qö¬ÛAÿÛnû;¾:Ûx´ýÇ`Šoãž l¸-mYM‡7<´g5f—Ÿþ,Ñêùy¸Á6Öü4ÞÆÍÔê^�krШ&OÓE΋ºó6îµ<ùÄÛ9ª­O?hŸ.°� 7p<íÐ_Ënxt-|vÛ¨£‹¹È³Äþêå·ñÎ?ƒòŸ¸Ôê^õ¿‹–'o˜6^b—G•}H ;6ð¸Û?já³›*ì�Ë²ÛØj‡?NÖdvTèS Ó†¦_Äý¸¼Ež%ÔjhÔòä Ó†?rרÆ=Ôê^÷ü.z-´�Ë£Ê>$Æ /S«Ûn²fæPõ�nšØ¿�ÓîIº¶µ:]Ÿý_Äaß.¯C‘g µµ/œ^«›oõuæóBÃÄÜ6óˆZݳ> w½yàq?8Ž:èIuÿŠ5uÕŸA5·qµÚÀ‰6Œš]¾sÔþ‡×Â7ÒæÐys¥m|[½�Gt^Cf·74ªíõ¶ñhM •·±ù·ÏæÕ˜]Þä.Šü¡í3aÁŸAm§ÕÜÆ²?ƒÊnãfj€ºÔ*üíÓ¯�ÿ¯-8ªÉá½¶}®ØtxÛc~­¦59·gw5uè´Ë�Ú©æ¨×Àç…RÏ5G >¨.9jµ ÿUóDŸƒF-ŒÍŸÖvÔÂg[ý*mô¶£ îù²+VsÔ09…f�š£†ª;¿æ¨…i—µ“Z廲?¶[�æ¾÷^Kv&fÁQWM“á�Š�CŽ˜ÖjTå=_pÅjŽßdúÀˆª9j¨ºókŽZžPä0ÇÎQ;©UViø¸ìhÔsáþĬ6êªi2¾á°û-™Ž˜¶TÙ=_sÅjŽš�04z7†"£†ª;¿æ¨å juP«¬×Qe6œ³áùº¯QËŸJ˜ÖvÅÞnþ¼ÐêÒjÚžQ?ž'·ógm«QÍW¬àÏÚ¶?¶?ýGôy¡ÉÿiÏ5,î¢k$¦ZU«p‚…4lsGí9~ÙjZÛ;hNóim[|Ï´†£ZMûùpžÏ•Fy 4ê5ðyá¯J¯gª9jøó¶3 kŽÚC­P—Z .µ @]j€ºÔ*u©UêR«Ô¥V¨K­P—Z .µ @]j€ºÔ*u©UêR«Ô¥VZúùùy]~{‚}}êwùør“{ ͯäë¶æ$P«ÍŒƒï-þ>š?½UtÚ§5Q«@Mj �iíµíÂV5ùiŽZjR«m,ÔêÛoÞ_Þ>õv v¼ðë o¼œ¤o÷¾p0xö2©U€66[]¿pvþ§{™ÎY¾þúËùÔ*@›k5z«…ûmu}µ Ô¡VÚØvÞêò/ý§Ë3kuºùÔ*@{^eý þ§åG[8—Zh&úV�·êLàJÔ*@KŸ^J¿þL€•CVNÞ\·Þ(B­P—Z .µ @]j€ºÔ*u©UêR«Ô¥V¨K­P—Z .µ @]j€ºÔ*u©UêR«Ô¥V¨K­P—Z .µ @]j€ºÔ*u©UêR«Ô¥V¨ëÿâ”Aˆ endstream endobj 91 0 obj <> endobj 97 0 obj <> endobj 96 0 obj <>/Length 15543>>stream xœíÝkzãJzláÜ3Ãl< ×4<ͬOµeóм@¸‘Œ€Þõ£5µ”~ €Q,–ö?ÿú׿É?Ú*bÑV�‹¶ €\´U䢭 m¹h«ÈE[@.Ú*rÑV�‹¶ €\´U䢭 m¹h«ÈE[@.Ú*rÑV�‹¶ €\´U䢭 m¹h«ÈE[@.Ú*PÏ?ÿüó÷ï¯åëÇ¿¿¾çú§nœ›ç¿ûЙ—?È’‰ý¸BΓzûæÁð§v}ærôåÏ@>A7\Û¸¼ÒÏô•{äCaáwï“,‘?ÈζÕ„fªêXßV?òÔ–üAhó²!Û`Ú*Pϳ÷¥îÛê³ëýþ»×uçÙw¶½geúƒh««V{5/:hÔ6؃¶ Ôóж:ÿ#kÛÞ|ž^÷uyþ½ä 3na· >;ÊÃT7OáÇØ3›µa¶÷ñæËëýS{¸ó˜y²‡Ïsaž m¨g¾Õ-o«ßüXg´UïóýxÄmåfÃwæö#ûSÍ ÏÊôÂ÷œ ÏÚêÌ#×Ogþɾbžóy†Â œm¨çYYÒ½nyöÝ{g¦­>dÕ›|7«-ùÙ¿õìÿÞqá‚ËS­ ¶äß<òl…Uï²oØ‚ C;jžËç  m¨ç�¶z½ÔŒ05†g?þP[˜d<¯bË×öVâòò·dÁßn|vè›úÚ¶úc¼‰·ù¸cýœgþ¨³žÏž”¶ œm¨gÉ»hk_¶g*éÌj?¾37t‘Ë#kÛê³·‡7·Õ… ¾¢­Ž'û8xÉ»Œ7ñæ|–póœçÿ~Û<矚¶ œm¨gÉN«þþ÷æÁ=ïMþøW·÷?~ñ—÷þ@ó¥pIþýMÿã¡_ÑVï¹:{ÞÓÝ?ç…ïU¯úcÒÃeç}Eh«@=GµÕq÷2?®ÊÍxRãæ“Ü?8Sw–?¯U r[þ ɾ¶ÀÍ�bÉ»¡kÛêÚ™/|»tÃɯ˜ç’üÑV�zæßÁZÒVÇ“®óã߉oHr¿Ú†w|—$\þ݇Güñ=rÜå9þP~õÙúóú±Æ-|{ûaæ…Õ|ùÞhKÌ}�h«@=Ëÿ^{þzŸ/‘ÿ¦uU’ñ¨¥ýX —¬ö0áÌ;vK&6¿àÂg´ä/Çg»JÞtüqPÏÆ²¶šÏ‡Y8ϵËhD[€P–ÿÃ�ü“Nƒ¶ q,y'ûÚt'¿Çd€Ó ­@K>p#»™_c&À™ÐV�‹¶ €\´U䢭 m¹h«ÈE[@.Ú*rÑV�‹¶ €\´U䢭 m¹h«ÈE[@.Ú*rÑV�‹¶ €\´U䢭 m¹h«ÈE[@.Ú*rÑV�‹¶ €\´U䢭 m¹h«ÈE[@.Ú*rÑV�‹¶ €\´Uä’ÒVÿùçÿ'ùûõåñ�xømõ»ž~'¹®­÷ÿ¿Šˆ.¨­à!Ÿï‚ß}ôÒJµU\ø|ÔVðŒwÁû’º°­^ÿK¬¿üùóçµApÿùŸÿ¹\nm«7‹|}}½2&Žáom«i«7ï�Žÿþ‡VÚ*À‰ij«×xoà7PßVÇúÿ:€¶ ÐBk[݃¶ Ђ¶ €\´U䢭 m¹h«ÈE[@.Ú*rÑV�‹¶ €\´U䢭 m¹h«ÈE[@.Ú*rÑV�‹¶ €\´U žišÆ_ÌÎÀ ÐV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰)k«‹æåëK’믟YÄë:΄¶ 81Mmõo˼>úåÿÞ<¾d¯ë8Ú*àÄ4µÕ´UàmpbêÛêÚª:´UœmpbúÚêåSª—7V¯¿»$ž¶Š“¡­NL_[½ðð½ÕgoµÞ”ZTðçϟäÁ{Ç»P8Þ[œ˜ú÷V—üKÿ…Ÿ¸YÇë:΄¶ 81Mmu,ø¯øWVø…h«€SÖVA[ÅÉÐV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'F[êÑV'¦¬­þ-š—¯/I>8¿ˆ×uœ mpbšÚêß–y}ôïÿûðÁ×ñºŽ3¡­NLS[½A[¾ÑV'F[êÑV'¦¯­^>¥ú�D[´UÀ‰ék«V½·zý/±ÐŸ?~E[½ùAïBáLxopb~Ë{«7?èugB[œ˜¦¶ê7XÑV'¦©­ÿuàÚ*àÄ”µÕCÐVq2´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰ÑV�z´UÀ‰)k«‹æåëK’믟YÄë:΄¶ 81Mmõo˼>úåÿÞ<¾d¯ë8Ú*àÄ4µÕ´UàmpbêÛêÚª:´UœmpbÎÐV¯\O[ÅÉÐV'¦µ­>ûÀ³·ZoJ-*øóçO_[�ùÛÿ% ðÞ*N†÷V'¦ï½Õù>ª­â¢­NLY[½/£ ? pó#^×q&´UÀ‰ij«÷Ÿ=½|tõæ‘×ñºŽ3¡­NLS[= m'C[œm¨G[œm¨G[œm¨G[œm¨G[œm¨G[œmõ“|—Œ¡gü>Ží—ÚêQ˜$ÞÉÂóÍíÐV?Éß»Æý׿þã?RòàmxùÉÄ$ñN´U`!Úê'ÑV-^~21I¼mXÈ'Ûêå¿’úý£z[ÖVñq¼üdb’x'Ú*°��µÕKC]ûßM=äÐ!ª¶úkñò“‰Iâ�h«ÀB>ÙVoÞX½<òj´U|/?™˜$Þ‰¶ ,äÃmõú3Ú*~^~21I¼mXȇ? ðÍMm}5Ú*>Ž—ŸLLïD[òáe5ÞþÆêÐV€—ŸLLïD[â7X}mõ×âå'“Ä;ÑV�…¼»­^àŸÀ/ÁËO&&‰w¢­ ÑV?‰¶úkñò“‰Iâ�h«ÀB>ü¹ÕËj™Ÿ[Ý|+ù~äÇŸMn« ŸÂÌÏÞäf©…Z{žÂægú{^Ì^}Ð�Lò÷`n7|äï:ÉCbà@^º§k«÷õ4ð7Xíi«Kjhx[ÝœM[ÕVÓÚõB^‡¹Ý�\CC6+$ä´mõþAm5mõmõ¥h«Õ˜Û É54d³Bbà@ÎÙVÇ]a=Ù'´Umu­¶ð ›µ…h«™g`2ævCr Ù¬�8�Ó¶ÕO¡­.A[½A[})Új5ævCr Ù¬�8mõ`´Õ%h«7h«/E[­ÆÜnH®¡!›rÚ¶zÿÑUŸ[ÍA[½A[})Új5ævCr Ù¬�8�s¶UÿÊj¹ö´Õ´Õ—¢­Vcn7$×Ð�Í ‰�9m[ýÔ‡ ´Õ%h«7h«/E[­ÆÜnH®¡!›rζ:>WXµÕ%h«7h«/E[­ÆÜnH®¡!›rζê“˵� ­Þ ­¾mµs»!¹††lVH ˆ¶z0Ûê÷”ǾJqýÅ¥êÍ,ÒÒVמ‚rýÅüwo´žÌìy ?jÏžæZmÛ“?�ö ·ãáS^•dÃn[ÿÙ!’ÏÀdÙ¾WŸïdókÇ;WûìœCbüÞ0ç—îéÇÚêyÖVï‹£¶úжz¿ì¼vèÓÚΞ§�ÜV—œö ·ãØsfñ“X½þÌsI>“ÑVoÐV$$ÆïA[íC[]‚¶zƒ¶ª­âÚê Úê�„Äø=h«Û‰ú/¯j«7h«7h«Ú*ž¡­Þ ­þHHŒßƒ¶º‘ÀÏ­j«×h«7h«Ú*ž¡­Þ ­þHHŒßƒ¶º‘û__õ¶_h¥­.A[½A[ÕVñ mõmõGBbü´Õ�h«Ï‚¶zƒ¶ª­âÚê Úê�„Äø=h«ñI€g A[½A[ÕVñ mõmõGBbü´ÕíøWVɯˆÚê Úª¶Šgh«7h«?ã÷ ­ö¡­.A[½A[ÕVñ mõmõGBbü´Õí\PõmZÚê2´Õ´UmÏÐVoÐV$$ÆïA[ÝÈ÷Ç®Ûêð¹Õ$´Õ´UmÏÐVoÐV$$ÆïA[ÝHÈïXÛ-.xH[}õ™´¡=ä·ÕoU¶Í¶Õµ·†ùºv;®6iæ¹Ü|±ê™Î¯¯­Î!¯Rk¯Žö\›¯ÖÖfÛsGÝɯ="VñðŽúÒC»þ—¶:´Õ'~E[}[¥Øó~¬bÛ^¥ÖÞ¾8U´Õý—ÉÂSkíˆoy•Z{u„°çÚ|µ¶6ÛžÓ~ÿ%¿öˆXÅnn/ÝÓ¯_þ¬Öv‹‡ n~}=äex!n%Úêͱî³òL‡¶ª­–sÈ«ÔÚ«#„=׿«µµÙöœöû/ùµGÄ*Þps{éž~ýòß`µ¶[<\póëë!/à Ùp+ÑVoŽuŸí�g:´UmµœC^¥Ö^!ì¹6_­­Í¶ç´ßɯ="Vñ†›ÛK÷ôë—ÿ«µÝâá‚›__y^Ȇ[‰¶zs¬ûl‡<Ó¡­j«åò*µöêaϵùjmm¶=§ýþK~í±Š7ÜÜ^º§_ÚêÐVŸøÚêͱî³òL‡¶ª­–sÈ«ÔÚ«#„=׿«µµÙöœöû/ùµGÄ*Þps{éž~%|àú}«k»ÅÃ7¿¾ò2¼� ·mõæX÷Ùy¦C[ÕVË9äUjíÕžkóÕÚÚl{Nûý—üÚ#bo¸¹½tO¿þ•Õw[ >ºzóS3Î/ò¥­.ðµÕ›cÝg;ä™mU[-ç�W©µWG{®ÍWkk³í9í÷_òk�ˆU¼áæöÒ=ýúøo°ºÿâǹþ¿üñÐ_Úê_[½9Ö}¶CžéÐVµÕry•Z{u„°çÚ|µ¶6ÛžÓ~ÿ%¿öˆXÅnn/ÝÓ¯¢¶úpmu!n%Úêͱî³òL‡¶ª­–sÈ«ÔÚ«#„=׿«µµÙöœöû/ùµGÄ*Þps{éž~%|à‚¶úº+víD[½9Ö}¶CžéÐVµÕry•Z{u„°çÚ|µ¶6ÛžÓ~ÿ%¿öˆXÅnn/ÝÓ¯„eõÍÚ•µÕUl¸•h«7ǺÏvÈ3Úª¶ZÎ!¯Rk¯Žö\›¯ÖÖfÛsÚï¿ä׫xÃÍí¥{úUú¬ž}~àY[}øVî ßûwTÂ…«{ÐcyQ¶c'ó‘&g[KÅv¸6�÷à´ÿ 4îòŸ?>ùÞê¥qŽ5ï­^WÒ¢÷V7¿µá�­™lóÃÙ�íþ[kß'›×†\˜m!Ç»ù)Ìk3!�=µÙŽWŸÏ �~ÿƒçöpý½·ºç|Û¼þ’�,ܾ�u¿Ú½¿0äÂlkÏÀ7ðê;Ãõ²›wmávl¾„®öpÙù´þ•Ú†Kx&ÛÚÆúÂ�ÿñ¼£Îg[{C˜Ñ¾>û¹ÕËï®úfá©§Úª¶:Ÿm!3熧0¯Í„<öÔ:d;^}>/<úý>œÛÃõµÕå'ÞÃoi«¯»3\/«­>;¢¶º!Û‹î¨óÙÖÞf´¯„ß 0ÿîmu¡¶áÌÖVŸMR[}Ýù¼ðè÷?øpn××V—Ÿx¿¥­¾îÎp½¬¶úìˆÚê†l/º£Îg[{C˜Ñ¾>ÛV¯?°ä÷­ÞŸýþÎíáúÚêòïá·´Õ×Ý®—ÕVŸQ[Ý�íEwÔùlko3ÚWéo°Úƒ¶º„åÙùN}ìmëØÍž§0¯Í„<öÔ:d;^}>/<úý>œÛÃõµÕå'ÞÃoi«¯»3\/«­>;¢¶º!Û‹î¨óÙÖÞf´¯�¿·zÁ{«Ï1©/Ô6œÙÚê³Ij«¯;ŸýþÎíáúÚêòïá·´Õ×Ý®—ÕVŸQ[Ý�íEwÔùlko3ÚWÂçV/øÜê†K}¡¶áÌÖVŸMR[}Ýù¼ðè÷?øpn××V—Ÿx¿¥­¾îÎp½¬¶úìˆÚê†l/º£Îg[{C˜Ñ¾>þ¬fyÚê–g»ÿÖæ;õ±·­co4{žÂ¼6òØSë�íxõù¼ðè÷?øpn××V—Ÿx¿¥­¾îÎp½¬¶úìˆÚê†l/º£Îg[{C˜Ñ¾~g[ýþbùäæ‹ñünµdµë|›öð)ì¿m-\vÜ—\N{®º…“YxÐ=Ïômü¬v=ɵ“Yx2làæ]Wì×®ŸÂ¸c~µùõîË̯µWßgöœ�÷ÜóLÇÊ�¿ÿ¢{˜mívì™ó’lÓ£â8ôÍÚƒÞ<òðÁå§Ö†Ó~<ß¾…Úž“áýmuùx¯]ù�Ÿøþbçä²àÚkþú?ÒV�}Ÿló÷_N{®ºcºç™¾m€ŸÕ®'ù¢¶úêSkæI�£_EÆó«Í¯ßuŸ9ä œÑòú¾jàÉmõƒÙæ÷eáöíÙåÍÚžlžZµcO†WgÛsj}/þõ;ÿ•Õ÷;GyYpÏ)Ûõ*r?ÌCÎÅÍ—Óž«î؃îy¦oàgµëIj«?fw̯6¿~×}æ�3p~DÚê;³ÍïËÂí۳˛µ=Ù<µjÇž ¯Î¶çÔú^üëwþ«ï/vŽò²àžS¶ëUä~˜‡œ‹›/§=WݱÝóLß6ÀÏjדÔVÌ6î˜_m~ý®ûÌ!gàüˆ´Õwf›ß—…Û·g—7k{²xj=ÔŽ=^�mÏ©õ½øWÎçV߆¶ª­~Ð=Ïômü¬v=ImõÇlãŽùÕæ×ïºÏrÎ�H[}g¶ù}Y¸}{vy³¶'Û�§ÖCíØ“áÕÙöœZß‹i«cë(/ î9e»^Eî‡yȹ¸ùrÚsÕ{Ð=Ïômü¬v=ImõÇlãŽùÕæ×ïºÏrÎ�H[}g¶ù}Y¸}{vy³¶'Û�§ÖCíØ“áÕÙöœZß‹ùWVcë(/ î9e»^Eî‡yȹ¸ùrÚsÕ{Ð=Ïômü¬v=ImõÇlãŽùÕæ×ïºÏrÎ�H[}g¶ù}Y¸}{vy³¶'Û�§ÖCíØ“áÕÙöœZß‹i«cë(/ î9e»^Eî‡yȹ¸ùrÚsÕ{Ð=Ïômü¬v=ImõÇlãŽùÕæ×ïºÏrÎ�H[}g¶ù}Y¸}{vy³¶'Û�§ÖCíØ“áÕÙöœZß‹ùWVcë(/ î9e»^Eî‡yȹ¸ùrÚsÕ{Ð=Ïômü¬v=ImõÇlãŽùÕæ×ïºÏrÎ�H[}g¶ù}Y¸}{vy³¶'Û�§ÖCíØ“áÕÙöœZß‹}ö7X]V{çÇXµUmõðƒîy¦oàgµëIj«?fw̯6¿~×}æ�3p~DÚê;³ÍïËÂí۳˛µ=Ù<µjÇž ¯Î¶çÔú^ü볟¸n«Ã'â_Eî‡yȹ¸ùrÚsÕ{Ð=Ïômü¬v=ImõÇlãŽùÕæ×ïºÏrÎ�H[}g¶ù}Y¸}{vy³¶'Û�§ÖCíØ“áÕÙöœZß‹åüN€–ÿòª¶zÍ!çâæËiÏUwìA÷<Ó· ð³Úõ$µÕ³�;æW›_¿ë>sÈ8?"mõ�Ùæ÷eáöíÙåÍÚžlžZµcO†WgÛsj}/þ¥­ŽÝ£ü…Úe˜É!o¾˜ÿîg³åÐdvžZÇž�Ëš?ÀdíEÛçæF[»}ÇjÉ7·gÚŸ?üN€‚3;M» 39d‹VÒdµŠ�ÉZEÈd­"¤ÉThk«ã®°Öý+«ß¬]†™²E«i2�ZEÈd­"d²VÒd*´O¶ÕO¡­j«QZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜pí2Ìä�-ZEH“iÔ*B&k!“µŠ�&S¡½»­^~S•Ï­Vk—a&‡lÑ*BšL£V2Y«™¬U„4™ M[�F䯄k—a&‡lÑ*BšL£V2Y«™¬U„4™ Í'¦¹1áÚe˜É![´Š�&Ó¨U„LÖ*B&k!M¦BÓV§¹1áÚe˜É![´Š�&Ó¨U„LÖ*B&k!M¦BûÌ'žá“-Úe˜É![´Š�&Ó¨U„LÖ*B&k!M¦BÓV§¹1áÚe˜É![´Š�&Ó¨U„LÖ*B&k!M¦Bûd[ýÔ‡ ´UW]”VÒdµŠ�ÉZEÈd­"¤ÉThŸùÜê!ÀÐV]uaZEH“iÔ*B&k!“µŠ�&S¡Eü+«K}ôI€F­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÞ[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦Bó¹ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4¿`‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦B‹øWVoF[uÕEi!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉTh•mõoݼŽqiŸßü˜P[uÕEi!M¦Q«™¬U„LÖ*BšL…Ö×V¿»æM[]•J[uÕEi!M¦Q«™¬U„LÖ*BšL…VÖV¿‹éý{«Úª«®W«i2�ZEÈd­"d²VÒd*´²¶ú?!®êéÚª:´UW]˜VÒdµŠ�ÉZEÈd­"¤ÉThgh«×ßZO[uÕEi!M¦Q«™¬U„LÖ*BšL…v†¶ºäS7¥ö!ß3¢­Õ>{ôhŸ=z²öÙ£Ÿ@ûìÑO }öè'Ð>{ôdí³GoÔêÛêòo];ß_$ÿ1¢H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…VßV7ü~mÕU¥U„4™F­"d²V2Y«i2Z}[ÿ÷3©þ••«®N«i2�ZEÈd­"d²VÒd*´Ê¶ºmÕU¥U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉTh•mõoݼŽqiŸYO[uÕEi!M¦Q«™¬U„LÖ*BšL…Ö×V¿»æ%Æ}sý1¡¶êª‹Ò*BšL£V2Y«™¬U„4™ ­¬­~—ÑëJª­~\«™¬U„4™F­"d²V2Y«i2ZY[ýŸÚj’V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ í·´Õë‰õŒïÑÖjŸ=ú ´Ï=YûìÑO }öè'Ð>{ôhŸ=z²öÙ£7j¿¥­Þüø÷ÉŒ(Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡i«ÓˆÜ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThõmuø¯|Z«™¬U„4™F­"d²V2Y«i2Ze[݉¶êª‹Ò*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*´3´ÕKûüæÇ„Úª«.J«i2�ZEÈd­"d²VÒd*´“´ÕU©´UW]”VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2Z}[][U‡¶êª Ó*BšL£V2Y«™¬U„4™ í mõúÿ.‰§­ºê¢´Š�&Ó¨U„LÖ*B&k!M¦B;C[½Žôì­Ö›Rû�ïÑÖjŸ=ú ´Ï=YûìÑO }öè'Ð>{ôhŸ=z²öÙ£7jõmõ†% ðÞª?#Fi!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡Õ·Õ…Ÿ¸ù‘ï/’7¦H«™¬U„4™F­"d²V2Y«i2Z}[ÿ÷3©þ••«®N«i2�ZEÈd­"d²VÒd*´3´Õµh«®º(­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦BÓV§¹1EZEÈd­"¤É4j!“µŠ�ÉZEH“©Ð´ÕiDnL‘V2Y«i2�ZEÈd­"d²VÒd*4mu‘S¤U„LÖ*BšL£V2Y«™¬U„4™ M[�FäÆi!“µŠ�&Ó¨U„LÖ*B&k!M¦B;C[½´Ï¿,‰§­ºê¢´Š�&Ó¨U„LÖ*B&k!M¦B«o««çu¤›ÿûìG¾¿HÞ˜"­"d²VÒdµŠ�ÉZEÈd­"¤ÉThÚê4"7¦H«™¬U„4™F­"d²V2Y«i2š¶:�È�)Ò*B&k!M¦Q«™¬U„LÖ*BšL…¦­N#rcŠ´Š�ÉZEH“iÔ*B&k!“µŠ�&S¡ý–¶zý/±ÐÂoi«äþ‹ùïÒ2�~­"¤É4j!“µŠ�ÉZEH“)Ò²Î~7O`Éó ™ø™´Š�ÉZEH“iÔ*B&k!“µŠ�&S¤-d�ýnžÀ’ç2ñ3i!“µŠ�&Ó¨U„LÖ*B&k!M¦H[È:û=ü³þ¿�0ñ3i!“µŠ�&Ó¨U„LÖ*B&k!M¦H[È:x'Ú*rÑV�‹¶ €\´U䢭 —â¶úÏ“ÿøê¶gôÏ“_›µö—,<[|ó"7¿âòøÎ§ù÷Ç\í†À-عŽ]° W»ád»` >¾Ã.Ø…Å«Ý�¹ Kc”¶Õ™1m˜àÍ�<ü%aË—šùîž`3!?¾Úòo-\mÏ »pÐjvaÃjË¿µpµœ]°›W›ùnÎÜì¶lvá=h«�äòÈæ«â�?‚üÚKbìÛ‚aì‡V[þ­å«…ì‚-ضÚp!Ø…­¶ü[ËWÛ¹ ›ÑVŸþÈ÷ƒ{Îæñ¿†KbÛj;·`Ø»ðöÕ–kÕj »` >¾Ã.Ø…5«-ÿÖªÕöï´չ¹ÿ£ØZþ¹ú0ʶvâþ†Kb±Ã.ì^Í.¬Ê¶ð[kWûø.Ø‚�oÁ}6»° »°sµCva]’Ò¶:®Î¶9ù~|ü�ÅþìÃÇ7?ÍË�_¯¼sµ£²½n v®c웳eî‚-øø »`Þží¥»°4Fo[ÀéÑVÿ‡ÿdsó®þž¥Æ“?$òÇÁ�Ý0~Í3½ÿ«™�ñ^÷Çès?ÓWsÈ-'~¦‡¿•rì;@×?öͤ=I>žpY½á6¾µ–gšð‚5²Ÿéf´Õsà§F^÷”�ŸŒ™ÏõQ›ßùL÷¯6¿øg³í_íXž½¦~ã™Î/õê¿„Ýv²Í|wój™Ï4ö"ý�Ïôw¾`½ÿΦ­þ›Š¶:¿ø†Õ®‰º$æß°ÚH}¦¯xy8ñ3�ùî¶WˆqÄÛã×<ÓëSk[’‡«­úÖü‚ãè |¦áéï|¦¿äk~ñW£­þ›_ÛV/žì’hy¦/zy8å3ÝüS?®9Â~�Íž$ókŽã~ƒÕÍ‚ÛòÛVïS²¡#ì™&_¤¿ö™þ’¬ùÅ_�¶úo¼Æ^z¿â’[ïÅ¿ê™~qïH»•Üd>Ó3Ýùƒ?.ûýEH[Ýóƒ?.ûýÅQzó‚/j«;SÍy¦/]íE7ÞÀÕÎý‚ûL÷ ­þ3¸Ù°ÔÃÇ7ß7ïW8ü%Ð3]•pÿ;7—u>뵫ý’gújŽšØYŸéá/NÇÞ@®òG…Ão•G½Z�WÞÆY­â™¦½`%?ÓÍh«ÈE[Å9yöþÖþ?ªÆ®vÔ;µ±«=\ÿÀ;XÈj÷õvùzÿ¢{V;6ØÍ‚'^-ä¼zÃj#ûR±Ú5ûÿª'pµÍh«8!ÉÜyÝj3+Ÿcµ™ïžlµÌ]ˆ –¿Ú÷‡¼Ú†¯–¼ u«íÿÄNÚj{ÐVá¯ÐÇ®vó#—Gö÷ËØÕZnÁÛVÿ{’ì_'|µØ]ˆ Ö²ÚýI²�ŠÕFð.„¯6¿xûj{ÐVÇž^±«=\êûÁCúeæjÉ·àCÚêågÇîþ•¼Zì.Ä+Zmìî…-«%ïBòjó‹·¯¶mõ×[1\íÙ:ÛîÅ�«Í«qµû¾¿8ê„ÉYíŸÿûy¸ý/„G­vx°Ø×Ô—®vyðû‹³®–Ü“W›_¼}µ=h«8'3¥pÃ9_·Ú!o쥭¶pýÓ¬vSv.xàjG-õÏ“Ïÿœlµ´óêu«�»?Ò\?äOn¿aµë¹²ÒVÛŒ¶ €\´U䢭 m¹h«ÈE[@.Ú*rÑV�‹¶ €\´U䢭 m¹h«ÈE[@.Ú*rÑV`ÿüóÏåë›[èå[¿þú�#®Zç:äåg7¬G[€\¾›ò7ó­UëßÿÔÚÕž%ÑV4¢­ÀRîÛÞ±½ð¨6ùlm@#Ú*,e¦­ÞüÍû…›oݼ{ýà�0¸éÁó•ôæè3o?<"ä ­ÀR6¼·ºüÁ‡ë?;Êý:óþò¯ m–²¹­®ý©™ãåk«ZÐV`)Û>·:ÿ—þ÷�¿³­Þg€4´UXÊžeµöoðŸ=þŠ÷V mV°ö7X½ès«> à÷ ­À:žýSúåŸX¸È•7·[¿@Ú*rÑV�‹¶ €\´U䢭 m¹h«ÈE[@.Ú*rÑV�‹¶ €\´U䢭 m¹h«ÈE[@.Ú*rÑV�‹¶ €\´U䢭 m¹h«ÈE[@.ÿÙ>vî endstream endobj 95 0 obj <>/Length 14444>>stream xœíÝ[vÉ–$PäÌj65ŒÒ4j6wf·µšÝ\¼|8aG¸!|ï�\L>ŒÇƒ!#Iÿüûßÿ¾@¥´Uji«ôÒV襭ÐK[ —¶ @/m€^Ú*½´Uzi«ôÒV襭ÐK[ —¶ @/m€^Ú*½´Uzi«ôÒV襭ÐK[ —¶ @/m€^Ú*½´U¸¦þùçï¿~�|ýÛË_}ü¨Oïóiàø­ß¾Ïø�tÏg}`fÏ}òÛOäÓ+ïÿd—|j¯‡)�þÈá/¡è. LôÞ Íæ×ùí;ÜùÖ¯IîyçMo«UMhPUoy[]ò©ÝóíÍá±%ÇL§­Â5ýô¬¯mõ§›À×·~,F?½õΦøS™~�¶úÓ»Ý9íÙžô UÇL§­Â5=£­Ž?$mŠã6üÓç2xë·úרƒ‡øéq¿Íùþƒßéþú¦hɃ�}�7.¯_?µOùïÙÀà“�¾Ï;óÜ€+ÒVáš¾ýÅþv‹Ûê›;{Þý-ö§Ÿ~5ñÙ÷|¦‡«\÷Gý©^ßùÊGŽø§¶:xÍÇOgüÉ>cŸã<7….M[…kú©²üú¼ÕÁOÈn¿õžèOYÝ~®ƒ¾õmþoÿ÷k†;Š|ç£�ÃÜõž‡| ¿¶ÕŸõÄOö©û¼oÀh«pMSÚêÇQƒw¸}×-~úðoß-}ŸŸ~pxø™w>į?nü)Ì À±¶úküïðãÞò;�y|Ÿ?}RÚ*\˜¶ ×tÏÏÛÒ_à•t0íןá݆­åÛ·No«w>Ä3Úêí‡Ó| ÷ü”ñS¼ñÀŸÞüø÷÷�ísü©i«paÚ*\Ó=?šŠ~§øÓ+iŠ¿þ&ï×ÿ6ó¬¶úøoÓÿæmõ«¯¿‡þÈÏtßü�?«Ž¾ùùvìøý�W§­Â5Íj«·/…àö¡ݾkH¿&ùúÊc}ñÁ ã0㟭¦nð�·ÿ<šŸr¦mõñg Ü¿–ñ[Ÿ±Ï{ò—¡­Â5�Öuç3Žýý�$_§Ýó›Å¿¾õëÃ}ûž¿þ~ôà�Ó¶÷SÎAÕþiþø�~­qŸ>µñ·7Ÿ2ßYÍïÿÀOïvÏ{þúþÀeh«pM÷üžø=¿À�ì÷íïÉFInßõ¹ñ£ ~>wO3ûöÓ<Ä�9ïùÍñÁº~m«ßüöõéï¶ý” ½³ûöGv—§­ÐK[ —¶ @/m€^Ú*½´Uzi«ôÒV襭ÐK[ —¶ @/m€^Ú*½´Uzi«ôÒV襭ÐK[ —¶ @/m€^Ú*½´Uzi«ôÒV襭ÐK[ —¶ @/m€^Ú*½´Uzi«ôÒV襭ÐK[ —¶ @¯ÅmõŸþyù=Ƀ¯à2V¶Õ¿]ó㣿ý<'9çÐV襭Ы¥­¾=U[ࣖ?eõÞ>§·Õ�ë¯?þÌýˆüÏÿüÏýï\ôóÈž ð÷}þõ¯ÍÀ½þ–1muôÚ*ÀB¯ÔV?=oõíemàÂ^©­Þþóy«__y›ý¯h«k½X[=™¶ °–¶:¢­¬¥­Žh«ki«#Ú*ÀZÚꈶ °–¶:¢­¬¥­Žh«ki«#Ú*ÀZÚꈶ °–¶:¢­¬¥­Žh«ki«#Ú*ÀZÚꈶ °–¶:¢­¬¥­Žh«ki«#Ú*ÀZÚꈶ °–¶:¢­¬¥­Žh«ki«#Ú*ÀZÚꈶ °–¶:¢­¬¥­Žh«ki«#Ú*ÀZÚꈶ °–¶:¢­¬¥­Žh«ki«#Ú*ÀZÚꈶ °–¶:¢­¬¥­Žh«ki«#Ú*ÀZÚꈶ °–¶:¢­¬¥­Žh«ki«#Ú*ÀZÚꈶ °–¶:¢­¬¥­Žh«ki«#Ú*ÀZÚꈶ @�ÿú¯ÿºýß_¹ç€s½X[ý[ß_~Oòà+Çç¦@ m•=½R[ýÛ?>úÛÿ>øÊ_ÑM€Ú*{ÒVyD7Jh«ìI[ýåÝ(¡­²§Wj«·ïžxª­° mõ2eä•Úê9?[ýXˆXëÏŸ?Úêè}ß@ ?�» Gñ³Õ_Ñ•@ ç2eD[ýå]I”Pq.ÃQF^©­ÞüëlLŹ Gy±¶z2m€*Îe8ʈ¶:¢­ÐCŹ GÑVG´Uz¨8—á(#Úꈶ @ç2eD[ÑVè¡â\†£Œh«#Ú*=TœËp”muD[ ‡ŠsŽ2¢­Žh«ôPq.ÃQF´Õm€*Îe8ʈ¶:¢­ÐCŹ GÑVG´Uz¨8—á(#Úꈶ @ç2eD[ÑVè¡â\†£Œh«#Ú*=TœËp”muD[ ‡ŠsŽ2¢­Žh«ôPq.ÃQF´Õm€*Îe8ʈ¶:¢­У¶âÔ«ecmuD[ GmÅ© VËÆ"Úꈶ @�ÚŠS¬–�E´Õm€µ§6X-‹h«#Ú*r—g[µm°Z6ÑVG´U(ä.϶j/þÚ`µl,¢­Žh«PÈ]žmÕ^üµÁjÙXD[ÑV¡�»<Ûª½økƒÕ²±ˆ¶:¢­r÷¬”�±­Ú‹¿6X-‹h«#Ú*'pÏJÙÛª½økƒÕ²±ˆ¶:¢­r÷¬”�±­Ú‹¿6X-‹h«#Ú*'pÏJÙÛª½økƒÕ²±ˆ¶:¢­r÷¬”�±­Ú‹¿6X-‹h«#Ú*'pÏJÙÛª½økƒÕ²±ˆ¶:¢­r÷¬”�±­Ú‹¿6X-‹h«#Ú*'pÏJÙÛª½økƒÕ²±ˆ¶:¢­r÷¬”�±­Ú‹¿6X-‹h«#Ú*'pÏJÙÛª½økƒÕ²±ˆ¶:¢­r÷¬”�±­Ú‹¿6X-‹h«#Ú*'pÏJÙÛª½økƒÕ²±ˆ¶:¢­r÷¬”�±­Ú‹¿6X-‹h«#Ú*'pÏJÙÛª½økƒÕ²±ˆ¶:¢­r÷¬TíÆjƒqµ×Xm°Z6ÑVG´UNàž•ªÝXm0.£ö« VËÆ"Úêˆ¶Ê Ü³Rµ« ÆeÔ^cµÁjÙXä•Úêßîøé5oa>¾þ=Þý¯?¢+‰gsÏJÕn¬6—Q{�Õ«ec‘Wj«ýí‘ïUõc¤·ÿ½ÿ•¿>Š+‰gsÏJÕn¬6—Q{�Õ«ecmõ—Gq%ñlîY©Ú�Õã2j¯±Ú`µl,ò’mõcÑÔVyuîY©Ú�Õã2j¯±Ú`µl,¢­þò@®$žÍ=+U»±Ú`\Fí5V¬–�E^¯­ŽKçãmõëŸå`•?þh«£Çò}Ïæ;ìTíÆjƒqµ×Xm°Z6y±Ÿ­~­˜Ú*¯Î=+U»±Ú`\Fí5V¬–�E´Õ_Εij¹g¥j7VŒË¨½ÆjƒÕ²±ÈË·Õ›€çž•ªÝXm0.£ö« VËÆ"/ÖVO¦­r÷¬TíÆjƒqµ×Xm°Z6ÑVG´UNàž•ªÝXm0.£ö« VËÆ"Úêˆ¶Ê Ü³Rµ« ÆeÔ^cµÁjÙXD[ÑV9�{VªvcµÁ¸ŒÚk¬6X-‹h«#Ú*'pÏJÕn¬6—Q{�Õ«ecmuD[åîY©Ú�Õã2j¯±Ú`µl,¢­Žh«œÀ=+U»±Ú`\Fí5V¬–�E´Õm•¸g¥j7VŒË¨½ÆjƒÕ²±ˆ¶:¢­r÷¬TíÆjƒqµ×Xm°Z6ÑVG´UNàž•ªÝXm0.£ö« VËÆ"Úêˆ¶Ê Ü³Rµ« ÆeÔ^cµÁjÙXD[ÑV9�{VªvcµÁ¸ŒÚk¬6X-‹h«#Ú*'pÏJÕn¬6—Q{�Õ«ecmuD[åîY©Ú�Õã2j¯±Ú`µl,¢­Žh«œÀ=+U»±Ú`\Fí5V¬–�E´Õm•¸g¥j7VŒË¨½ÆjƒÕ²±ˆ¶:¢­r÷¬TíÆjƒqµ×Xm°Z6ÑVG´UNàž•ªÝXm0.£ö« VËÆ"Úêˆ¶Ê Ü³Rµ« ÆeÔ^cµÁjÙXD[ÑV9�{VªvcµÁ¸ŒÚk¬6X-‹h«#Ú*'pÏJÕn¬6—Q{�Õ«ecmuD[åîY©Ú�Õã2j¯±Ú`µl,¢­Žh«œÀ=+U»±Ú`\Fí5V¬–�E´Õm•¸g¥j7VŒË¨½ÆjƒÕ²±ˆ¶:¢­r÷¬TíÆjƒqµ×Xm°Z6ÑVG´UNàž•ªÝXm0.£ö« VËÆ"Úêˆ¶Ê Ü³Rµ« ÆeÔ^cµÁjÙXD[ÑV9�{VªvcµÁ¸ŒÚk¬6X-‹h«#Ú*'pÏJÕn¬6—Q{�Õ«ecmuD[åîY©Ú�Õã2j¯±Ú`µl,¢­Žh«œÀ=+U»±Ú`\Fí5V¬–�E´Õm•¸g¥j7VŒË¨½ÆjƒÕ²±ˆ¶:¢­r÷¬TíÆjƒqµ×Xm°Z6ÑVG´UNàž•ªÝXm0.£ö« VËÆ"Úêˆ¶Ê Ü³Rµ« ÆeÔ^cµÁjÙXD[ÑV9�{VªvcµÁ¸ŒÚk¬6X-‹h«#Ú*'pÏJÕn¬6—Q{�Õ«ecmuD[åîY©Ú�Õã2j¯±Ú`µl,¢­Žh«œÀ=+U»±Ú`\Fí5V¬–�E´Õm•¸g¥j7VŒË¨½ÆjƒÕ²±ˆ¶:¢­r÷¬TíÆjƒqµ×Xm°Z6y±¶ú·>¾¿üžäÁWŽΕij¹g¥j7VŒË¨½ÆjƒÕ²±È+µÕ¿Ýñ㣿ýüõ]I<›{VªvcµÁ¸ŒÚk¬6X-‹¼p[ýö•Ú*/Ç=+U»±Ú`\Fí5V¬–�E´Õ_ѕij¹g¥j7VŒË¨½ÆjƒÕ²±ÈëµÕ÷çž¾%ÑVyuîY©Ú�Õã2j¯±Ú`µl,òbmõöŸdêÏ[ýø'±XëÏŸ?¯ÔVý)+®ÇwØ©Ú�Õã2j¯±Ú`µl,òb?[ÕV¹÷¬TíÆjƒqµ×Xm°Z6ÑVyDWÏæž•ªÝXm0.£ö« VËÆ"¯ÔVoþu®È=+U»±Ú`\Fí5V¬–�E^¬­žL[åîY©Ú�Õã2j¯±Ú`µl,¢­Žh«œÀ=+U»±Ú`\Fí5V¬–�E´Õm•¸g¥j7VŒË¨½ÆjƒÕ²±ˆ¶:¢­r÷¬TíÆjƒqµ×Xm°Z6ÑVG´UNàž•ªÝXm0.£ö« VËÆ"Úêˆ¶Ê Ü³Rµ« ÆeÔ^cµÁjÙXD[ÑV9�{VªvcµÁ¸ŒÚk¬6X-‹h«#Ú*'pÏJÕn¬6—Q{�Õ«ecmuD[åîY©Ú�Õã2j¯±Ú`µl,¢­Žh«œÀ=+U»±Ú`\Fí5V¬–�E´Õm•¸g¥j7VŒË¨½ÆjƒÕ²±ˆ¶:¢­r÷¬TíÆjƒqµ×Xm°Z6ÑVG´UNàž•ªÝXm0.£ö« VËÆ"Úêˆ¶Ê Ü³Rµ« ÆeÔ^cµÁjÙXD[ÑV9�{VªvcµÁ¸ŒÚk¬6X-‹h«#Ú*'pÏJÕn¬6—Q{�Õ«ecmuD[åîY©Ú�Õã2j¯±Ú`µl,¢­Žh«œÀ=+U»±Ú`\Fí5V¬–�E´Õm•¸g¥j7VŒË¨½ÆjƒÕ²±ˆ¶:¢­r÷¬TíÆjƒqµ×Xm°Z6ÑVG´UNàž•ªÝXm0.£ö« VËÆ"Úêˆ¶Ê Ü³Rµ« ÆeÔ^cµÁjÙXD[ÑV9�{VªvcµÁ¸ŒÚk¬6X-‹h«#Ú*'pÏJÕn¬6—Q{�Õ«ecmuD[åîY©Ú�Õã2j¯±Ú`µl,¢­Žh«œÀ=+U»±Ú`\Fí5V¬–�E´Õm•¸g¥j7VŒË¨½ÆjƒÕ²±ˆ¶:¢­r÷¬TíÆjƒqµ×Xm°Z6ÑVG´UNàž•ªÝXm0.£ö« VËÆ"+Ûêß.ø6íï ÿ[؃µUNàž•ªÝXm0.£ö« VËÆ"ËÚê{C}{áM[aÕV9�{VªvcµÁ¸ŒÚk¬6X-‹¬l«Ÿ~°úþšÚ*'pÏJÕn¬6—Q{�Õ«ec‘Åmõãs´Uöäž•ªÝXm0.£ö« VËÆ"‹Ÿ ðæSmí¡­r÷¬TíÆjƒqµ×Xm°Z6Yü§¬nÅ?X½i«œÂ=+U»±Ú`\Fí5V¬–�Eü V#Ú*'pÏJÕn¬6—Q{�Õ«ec‘³ÛêÇ'|ÕV…µUNàž•ªÝXm0.£ö« VËÆ"Úêˆ¶Ê Ü³Rµ« ÆeÔ^cµÁjÙXdñóVß§yÞ*ÛrÏJÕnL0ž­ö(kƒÕ²±Èú¿ouðšå´UNàž•ªÝ˜`<[íQÖ«ec‘Š¿Áê�¶Ê†Ü³RµŒg«=ÊÚ`µl,²þo°z×VUoÚ*§pÏJÕnL0ž­ö(kƒÕ²±È‹ý VßÜOÿÐÀ×÷¿rüp®$žÍ=+U»1Áx¶Ú£¬ VËÆ"¯×VÇÏv}ÿ]ï|å¯çJâÙܳRµŒg«=ÊÚ`µl,RôL€Û?ïÔV¹÷¬TíÆãÙj�²6X-‹¼ÒŸ²ú¶_j«¼:÷¬TíÆãÙj�²6X-‹ý V÷|ÈÇÿ}Òª¶ÊKsÏJÕnL0ž­ö(kƒÕ²±ÈâgDÓ,¦w¶Õñ¿¶À™þüùó2Ïø:ámõÓCø¾'åûÅ”�¥j7&ÏV{”µÁjÙX䕞·úu‚¶ZÈW`ÊÆRµŒg«=ÊÚ`µl,òJƒÕ9Ïøôˆ®¤”¯À”�¥j7&ÏV{”µÁjÙXä•ÚêíáÀ¿p_�)KÕnL0ž­ö(kƒÕ²±HÑß·ê_^½_�)KÕnL0ž­ö(kƒÕ²±È ?oõÚê¾S6–ªÝ˜`<[íQÖ«ec‘•muü¯R5ÐV𘲱TíÆ»ŒÚ� v6ÑVG´Õ|¦l,U»1Á.£vc‚]†�E<`D[=ÀW`ÊÆRµì2j7&ØeØXÄŸ²ÑV𘲱TíÆ»ŒÚ� v6YÙVûi«ø LÙXªvc‚]FíÆ» ‹,þÙêÇ¿ µ°k«ø LÙXªvc‚]FíÆ» ‹,~Þê§¿·¿­°j«ø LÙXªvc‚]FíÆ» ‹ø;F´Õ|¦l,U»1Á.£vc‚]†�E´Õmõ_�)KÕnL°Ë¨Ý˜`—ac‘ÅÏøD[½_�)KÕnL°Ë¨Ý˜`—ac‘ÅÊêãÿ¶UÕ›¶zˆ¯À”�¥j7&ØeÔnL°Ë°±ÈʶÚO[=ÀW`ªvc‚¥»ŒÚ� v6ÑVG´Õ|¦j7&XJ°Ë¨Ý˜`—ac‘Šgü�YøG¬nÚê!¾Sµ,%ØeÔnL°Ë°±HÅŸ²zk«·¾§®j«ø LÕnL°”`—Q»1Á.ÃÆ"+ÛêÛ¨¯/ôÐVð˜ªÝ˜`)Á.£vc‚]†�E´Õmõ_�©Ú� –ì2j7&ØeØX¤â™ï´Õ ð˜ªÝ˜`)Á.£vc‚]†�E*þ”Õ›¶ªzÓVñ˜ªÝ˜`)Á.£vc‚]†�EV¶Õ~Úê¾Sµ,%ØeÔnL°Ë°±È⟭¾?cõæg«Wá+0U»1ÁR‚]FíÆ» ‹,~Þêûß]õ¦­°j«ø LÕnL°”`—Q»1Á.ÃÆ"+Ûꧬú;®ÁW`ªvc‚¥»ŒÚ� v6YÜV?>@[½_�©Ú� –ì2j7&XJ°kXüL€7þ-«+ñ˜ªÝ˜`)Á.£vc‚¥Ku[ü§¬nÅ?X½i«‡t^èÍj7&XJ°Ë¨Ý˜`)ÁR�ÁV¶Õ~Úê�z³Ú� –ì2j7&XJ°Tg°õ?[}W؃µÕ:/ôfµ,%ØeÔnL°”`©Î`Ï[}×VXµÕ:/ôfµ,%ØeÔnL°”`©Î`+Ûê§Q…O]ÕVè¼Ð›ÕnL°”`—Q»1ÁR‚¥:ƒi«#Úê�z³Ú� –ì2j7&XJ°Tg0Ïin«�×Ó­8X­Ú� –ì2j7&XJ°Tg°emõæOY=¦ózº«U»1ÁR‚]FíÆK –ê ¶²­öÓV¨ V«vc‚¥»ŒÚ� –,Õ¬èy«…´ÕjƒÕªÝ˜`)Á.£vc‚¥KuÓVG´ÕjƒÕªÝ˜`)Á.£vc‚¥Ku[ÙV¿¾²­¿j«Ô«U»1ÁR‚]FíÆK –ê ¦­Žh«Ô«U»1ÁR‚]FíÆK –ê ¶¬­¾mõ€Ú`µj7&XJ°Ë¨Ý˜`)ÁR�ÁV¶Õ�O]MŸÆúécß_à•ãGi;°w�×Ó­8X­Ú� –ì2j7&XJ°Tg°ÅÏøÔ#ïþñ�?ÕÜ·ÿ½ÿ•¿>PÛ�½ë¼žnÅÁjÕnL°”`—Q»1ÁR‚¥:ƒ­l«‡ÿåUmõÖz=ÝŠƒÕªÝ˜`)Á.£vc‚¥Ku{½¶ú©zj«‹s|Q¬VíÆK vµ,%Xª3Øâg|¢­Þ¯ózº«U»1ÁR‚]FíÆK –ê ¶¬­Þ¾Öû«ê·/||‡GÚê·5€%þüùóJƒÕ mõÓõ}{ñ®ó»Ÿ[q°Zµ,%ØeÔnL°”`©Î`+¶šúúSϨ˜j«ç¨ V«vc‚¥»ŒÚ� –,Õìì¶úþÇùü·¬ülµózº«U»1ÁR‚]FíÆK –ê öòmõöŸ?sõ¯,W¬VíÆK vµ,%Xª3Ø+=à|ÚêµÁjÕnL°”`—Q»1ÁR‚¥:ƒi«#ÚêµÁjÕnL°”`—Q»1ÁR‚¥:ƒ­y&ÀOÚª°¶z@m°Zµ,%ØeÔnL°”`©Î`Úꈶz@m°Zµ,%ØeÔnL°”`©Î`+Ûj[7ýJ[= 6X­Ú� –ì2j7&XJ°Tg°5Ï[}ð/8�¶z€`)ÁR‚¥jƒÕªÝ˜`)ÁR�ÁÖ´ÕÏCÿym+¬Úê‚¥K –ª V«vc‚¥Kuó³ÕmõÁR‚¥KÕ«U»1ÁR‚¥:ƒyÞꈶz€`)ÁR‚¥K –,%Xde[ýª­¿j«–,%XJ°”`)ÁR‚E´ÕmõÁR‚¥K –,%XJ°ÈÙmõµh«–,%XJ°”`)ÁR‚E´ÕmõÁR‚¥K –,%XJ°ˆ¶:¢­ XJ°”`)ÁR‚¥K ÑVG´ÕK –,%XJ°”`)Á"Úꈶz€`)ÁR‚¥K –,%XD[ÑV,%XJ°”`)ÁR‚¥‹h«#Úê‚¥K –,%XJ°”`muD[=@°”`)ÁR‚¥K –,¢­Žh«–,%XJ°”`)ÁR‚E´ÕmõÁR‚¥K –,%XJ°ˆ¶:¢­ XJ°”`)ÁR‚¥K ÑVG´ÕK –,%XJ°”`)Á"Úꈶz€`)ÁR‚¥K –,%XD[ÑV,%XJ°”`)ÁR‚¥‹h«#Úê‚¥K –,%XJ°”`muD[=@°”`)ÁR‚¥K –,¢­Žh«–,%XJ°”`)ÁR‚E´ÕmõÁR‚¥K –,%XJ°ˆ¶:¢­ XJ°”`)ÁR‚¥K ÑVG´ÕK –,%XJ°”`)Á"Úꈶz€`)ÁR‚¥K –,%XD[ÑV,%XJ°”`)ÁR‚¥‹h«#Úê‚¥K –,%XJ°”`muD[=@°”`)ÁR‚¥K –,¢­Žh«–,%XJ°”`)ÁR‚E´ÕmõÁR‚¥K –,%XJ°ˆ¶:¢­ XJ°”`)ÁR‚¥K ÑVG´ÕK –,%XJ°”`)Á"Úꈶz€`)ÁR‚¥K –,%XD[ÑV,%XJ°”`)ÁR‚¥‹h«#Úê‚¥K –,%XJ°”`‘k«ëãûËïI|åøáÚì]çõt,'XJ°”`)ÁR‚¥‹¼R[ýÛ?>úÛÿ>øÊ_±íÀÞu^O7Ár‚¥K –,%XJ°È+µÕO´Õ[ßõt,'XJ°”`)ÁR‚¥‹h«¿ê¼žn‚åK –,%XJ°”`‘Wj«7ÿ:À�×ÓM°œ`)ÁR‚¥K –,òbmõdÚê‚¥K –,%XJ°”`muD[=@°”`)ÁR‚¥K –,¢­Žh«–,%XJ°”`)ÁR‚E´ÕmõÁR‚¥K –,%XJ°ˆ¶:¢­ XJ°”`)ÁR‚¥K ÑVG´ÕK –,%XJ°”`)Á"Úꈶz€`)ÁR‚¥K –,%XD[ÑV,%XJ°”`)ÁR‚¥‹h«#Úê‚¥K –,%XJ°”`muD[=@°”`)ÁR‚¥K –,¢­Žh«–,%XJ°”`)ÁR‚E´ÕmõÁR‚¥K –,%XJ°ˆ¶:¢­ XJ°”`)ÁR‚¥K ÑVG´ÕK –,%XJ°”`)Á"Úꈶz€`)ÁR‚¥K –,%XD[ÑV,%XJ°”`)ÁR‚¥‹h«#Úê‚¥K –,%XJ°”`muD[=@°”`)ÁR‚¥K –,¢­Žh«–,%XJ°”`)ÁR‚E´ÕmõÁR‚¥K –,%XJ°ˆ¶:¢­ XJ°”`)ÁR‚¥K ÑVG´ÕK –,%XJ°”`)Á"Úꈶz€`)ÁR‚¥K –,%XD[ÑV,%XJ°”`)ÁR‚¥‹h«#Úê‚¥K –,%XJ°”`muD[=@°”`)ÁR‚¥K –,¢­Žh«–,%XJ°”`)ÁR‚E´ÕmõÁR‚¥K –,%XJ°ˆ¶:¢­ XJ°”`)ÁR‚¥K ÑVG´ÕK –,%XJ°”`)Á"Úꈶz€`)ÁR‚¥K –,%XD[ÑV,%XJ°”`)ÁR‚¥‹h«#Úê‚¥K –,%XJ°”`muD[=@°”`)ÁR‚¥K –,¢­Žh«–,%XJ°”`)ÁR‚E´ÕmõÁR‚¥K –,%XJ°ˆ¶:¢­ XJ°”`)ÁR‚¥K ÑVG´ÕK –,%XJ°”`)Á"Úꈶz€`)ÁR‚¥K –,%XD[ÑV,%XJ°”`)ÁR‚¥‹h«#û´Õ‰Ó:/ô›`9ÁR‚¥K –,ÕìÅÚêßúøþò{’_9~¸¶{§­¦K –,%XJ°”`©Î`¯ÔVÿvÇ��þö¿¾ò×Gl;°wÚjJ°”`)ÁR‚¥K –ê öJmõmõ¦­&l,%XJ°”`)ÁR‚¥:ƒi«¿muí¨¹l,%XJ°Ô&_•µÁ&Ú$˜£\E[ÑV׎š;m“` –,µÉWem°‰6 æ(WÑVG´Õµ£æNÛ$ØD‚¥KmòUYl¢M‚9ÊUÓ´Õmuí¨¹Ó6 6‘`©M‚Õ^ü‚-´I0G¹jš¶:¢­®5wÚ&Á&,µI°Ú‹_°…6 æ(WMÓVG´Õµ£æNÛ$ØD6–Ú$XíQ ¶Ð&ÁåªiÚꈶºvÔÜi››ÈÆR›«=JÁÚ$˜£\5M[ÑV׎š;m“`ÙXj“`µG)ØB›s”«¦i«#ÚêÚQs§ml"Km¬ö([h“`ŽrÕ4muD[];jî´M‚Mdc©M‚Õ¥` mÌQ®š¦­Žh«kGÍ�¶I°‰l,µI°Ú£l¡M‚9ÊUÓ´Õmuí¨¹Ó6 6‘�¥6 V{”‚-´I0G¹jš¶:¢­®5wÚ&Á&²±Ô&Áj�R°…6 æ(WMÓVG´Õµ£æNÛ$ØD6–Ú$XíQ ¶Ð&ÁåªiÚꈶºvÔÜi››ÈÆR›«=JÁÚ$˜£\5M[ÑV׎š;m“`ÙXj“`µG)ØB›s”«¦i«#ÚêÚQs§ml"Km¬ö([h“`ŽrÕ4muD[];jî´M‚Mdc©M‚Õ¥` mÌQ®š¦­Žh«kGÍ�¶I°‰l,µI°Ú£l¡M‚9ÊUÓ´Õmuí¨¹Ó6 6‘�¥6 V{”‚-´I0G¹jš¶:¢­®5wÚ&Á&²±Ô&Áj�R°…6 æ(WMÓVG´Õµ£æNÛ$ØD6–Ú$XíQ ¶Ð&ÁåªiÚꈶºvÔÜi››ÈÆR›«=JÁÚ$˜£\5M[ÑV׎š;m“`ÙXj“`µG)ØB›s”«¦i«#ÚêÚQs§ml"Km¬ö([h“`ŽrÕ4muD[];jî´M‚Mdc©M‚Õ¥` mÌQ®š¦­Žh«kGÍ�¶I°‰l,µI°Ú£l¡M‚9ÊUÓ´Õmuí¨¹Ó6 6‘�¥6 V{”‚-´I0G¹jš¶:¢­®5wÚ&Á&²±Ô&Áj�R°…6 æ(WMÓVG´Õµ£æNÛ$ØD6–Ú$XíQ ¶Ð&ÁåªiÚꈶºvÔÜi››ÈÆR›«=JÁÚ$˜£\5M[ÑV׎š;m“`ÙXj“`µG)ØB›s”«¦i«#ÚêÚQs§ml"Km¬ö([h“`ŽrÕ4muD[];jî´M‚Mdc©M‚Õ¥` mÌQ®š¦­Žh«kGÍ�¶I°‰l,µI°Ú£l¡M‚9ÊUÓ´Õmuí¨¹Ó6 6‘�¥6 V{”‚-´I0G¹jš¶:¢­®5wÚ&Á&²±Ô&Áj�R°…6 æ(WMÓVG´Õµ£æNÛ$ØD6–Ú$XíQ ¶Ð&ÁåªiÚꈶºvÔÜi››ÈÆR›«=JÁÚ$˜£\5M[ÑV׎š;m“`ÙXj“`µG)ØB›s”«¦i«#ÚêÚQs§ml"Km¬ö([h“`ŽrÕ4muD[];jî´M‚Mdc©M‚Õ¥` mÌQ®šö’mõo‰üãïÿ¾¿üþúû_9~ Â+éMçõ4wÔÜi››ÈÆR›«=JÁÚ$˜£\5íõÚê[ãüX@?5׿ÿ{ÿ+}¬Â+éMçõ4wÔÜi››ÈÆR›«=JÁÚ$˜£\5íÅÚê×Þ©­¶Mlᨹl,µI°Ú£l¡M‚9ÊUÓ^¬­þ¿Újëõ4wÔÜi››ÈÆR›«=JÁÚ$˜£\5M[ýå� ¯¤7�×ÓÜQs§ml"Km¬ö([h“`ŽrÕ4mõ›áO @æÏŸ?Úêè� ¿ïyÓùÝÏÜQs§ml"Km¬ö([h“`ŽrÕ4?[ýå� ¯¤7�×ÓÜQs§ml"Km¬ö([h“`ŽrÕ4mõ—*¼’Þt^OsGÍ�¶I°‰l,µI°Ú£l¡M‚9ÊUÓ^¾­ÞüëeÓ[8j.Km¬ö([h“`ŽrÕ´—l«§ÑV׎š;m“`ÙXj“`µG)ØB›s”«¦i«#ÚêÚQs§ml"Km¬ö([h“`ŽrÕ4muD[];jî´M‚Mdc©M‚Õ¥` mÌQ®š¦­Žh«kGÍ�¶I°‰l,µI°Ú£l¡M‚9ÊUÓ´Õmuí¨¹Ó6 6‘�¥6 V{”‚-´I0G¹jš¶:¢­®5wÚ&Á&²±Ô&Áj�R°…6 æ(WMÓVG´Õµ£æNÛ$ØD6–Ú$XíQ ¶Ð&ÁåªiÚꈶºvÔÜi››ÈÆR›«=JÁÚ$˜£\5M[ÑV׎š;m“`ÙXj“`µG)ØB›s”«¦i«#ÚêÚQs§ml"Km¬ö([h“`ŽrÕ4muD[];jî´M‚Mdc©M‚Õ¥` mÌQ®š¦­Žh«kGÍ�¶I°‰l,µI°Ú£l¡M‚9ÊUÓ´Õmuí¨¹Ó6 6‘�¥6 V{”‚-´I0G¹jš¶:¢­®5wÚ&Á&²±Ô&Áj�R°…6 æ(WMÓVG´Õµ£æNÛ$ØD6–Ú$XíQ ¶Ð&ÁåªiÚꈶºvÔÜi››ÈÆR›«=JÁÚ$˜£\5M[ÑV׎š;m“`ÙXj“`µG)ØB›s”«¦i«#ÚêÚQs§ml"Km¬ö([h“`ŽrÕ4muD[];jî´M‚Mdc©M‚Õ¥` mÌQ®š¦­Žh«kGÍ�¶I°‰l,µI°Ú£l¡M‚9ÊUÓ´Õmuí¨¹Ó6 6‘�¥6 V{”‚-´I0G¹jš¶:¢­®5wÚ&Á&²±Ô&Áj�R°…6 æ(WMÓVG´Õµ£æNÛ$ØD6–Ú$XíQ ¶Ð&ÁåªiÚꈶºvÔÜi››ÈÆR›«=JÁÚ$˜£\5M[ÑV׎š;m“`ÙXj“`µG)ØB›s”«¦i«#ÚêÚQs§ml"Km¬ö([h“`ŽrÕ4muD[];jî´M‚Mdc©M‚Õ¥` mÌQ®š¦­Žh«kGÍ�¶I°‰l,µI°Ú£l¡M‚9ÊUÓ´Õmuí¨¹Ó6 6‘�¥6 V{”‚-´I0G¹jš¶:¢­®5wÚ&Á&²±Ô&Áj�R°…6 æ(WMÓVG´Õµ£æNÛ$ØD6–Ú$XíQ ¶Ð&ÁåªiÚꈶºvÔÜi››ÈÆR›«=JÁÚ$˜£\5M[ÑV׎š;m“`ÙXj“`µG)ØB›s”«¦i«#ÚêÚQs§ml"Km¬ö([h“`ŽrÕ4muD[];jî´M‚Mdc©M‚Õ¥` mÌQ®š¦­Žh«kGÍ�¶I°‰l,µI°Ú£l¡M6Vl¢Î�i«#ÓÛjí….ØÂi‚-5wš` GÍ�&ØÂQs§ ¶pÔÄiÚꈶºvÔÜi‚-5wš` GÍ�&ØÂQs§ ¶pÔÜi�Á´Õmuí¨¹Ó[8jî4ÁŽš;M°…£æNlᨹÓ:ƒi«#ÚêÚQs§ ¶pÔÜi‚-5wš` GÍ�&ØÂQs§}õöšcóµÕ3¼V[½ózú6ÃùÁ~z7Áz¦ÞØùÁJ¦½P°Ú‹¿6Ø�ïVìüi¯ÌQFý}Íÿþï¿ÿû¿ÿïç©Û«­þmŸï/ßó‰¼\[]~= 6%XÉ´Ã;?XÉ´ V{ñ×»óÝJ‚�?íÕƒ9ÊÁ¨†¯Ê�Úêßêù1ü§ÿýéCî\ñį‡GFM¼ž^(Ø�J6vÿ~ýØ_?£‚Õ^co/Lœö¼£, æ«òÀ>{þ«Ü.î™ß|û¬ö(K‚i«ç9¹­žv=}|ap=}}áÙÁ>¾¦ö—Álpsèö_~�w”‚ 6ñ?¾Uó/muü!_Wüñ>½²ùzúú³ƒ}|MÕW`m°Ã·†oçNü2lJ°']*çûöýŸìIóÛ3Ø·óK{ÆWå¿´Õñ‡¼½ðÓ±}{¨ß¾pç»=ø�‚ &˜`»;ð‰l¾1Á{v°é_•þüÑV?¿Û‰¡ÑVïú�¯/ŒßúøûŸö@‚ Ööþ‚ &XÛû &XI°;eï]åÓ§zÏgÞl‚ &˜`‚ &XÛû ö¤`wÊ޻ʧOõžÏ¼ÿØL0ÁL°¶÷ìIÁw›ò üØL0ÁL°¶÷ìIÁ7œI[ —¶ @/m€^Ú*½´UzmÑVÿùá_=ð¹ÿóÃß™•þ] ƒùÇæ|ú«"Þ_xÚû‡?8mâòoOÞÿ#C&îâòo.þCÓÞ?ÜÅŸ~¬‹ÿÿýÓ\üÑ´O /þ{c\¾­ÿu_ÿùþßþ]bÑ´Á[„<ÚÄå�Ã6xkÉÆæåýoºçý]üѨûßtç44íþ7Ýóþ.þhÔýoºsš‹?švÿ›îyÿ/þGh«}¾¿æØ±½}å<þÍÊž÷¬ÛcûŸµüÛ–÷¬›‹?uÿ›îŸæâ¿Úýoºóý]ü÷�ºÿM÷Osñß?íþ7Ýùþ^ü‡i«�~¾½ò‘cûøÅãž•N{pÿ�/ÿ¶ë=ëæâ¿{ÔýoЦ¹øïœvÿ›îÿ�£îS4ÍÅç´ûßtÿû?~ñ ­Nø üú½Úÿ|xÎÊ��ýéâ¾ü=ë6cÿ�,ÿk°GöÿZ÷¬›‹ÿî`w¾)�æâ¿3Ø�oŠÞßÅg°;ß”NsñßìÎ7Eï?åâ�\¿­Þ>\‘Ÿ<~wøõõ³æßó�ß¾þÁiÿî{®ýóöÿø�I¾zdc�/z0ÿÚ`.þ…Á\ükƒ¹ø{êÅoŒÚ*/J[ÍLÿîçãÿ™öí7RS¾_œø[Oú~ññQsÛeÖQNÿ{âoíM 6åÓ|ªÇîuíÏqâ§3÷rßΟø³¥Gb|ûú†ÛÅSIz$Øû‡?ìò¿$Ýž”çßÄ´ÕÀóžY2ñIB>ui¦ç¹8Ÿ¡5wÚ“Žòñ`ãá ƒ=>m¢Ÿ~‰}³pcMü?N{êoÈ»ÆoM�òÀG ¦Íú4k¿*§eÿ v·_’ο‰i«�W¹5Ìý²ùøšž[Ãxx:êöÀç8NRµ±[åQ>¾±Á[ÿ aúÏ6ߨà­Ç¦M)Я¨I¾½i<ð6õ(ÿÇ®ôU¹[[OGÝþóª+ÙØxò³i«�W¹5Lo«ï¯¼ð­ávôs'©ÚØÇWö{Ò§ù �½¤¡­þ¨ñÀÛÔ¿ÄçÓÌGÝù¦{ÆÞæåí±Ïqœá2_•Úê%IO~6m5ð¼¯ÀÛÔ ýmõvèýÔ`Óo ·£¿ýóŸÏ©ª½™~ œ{{áñÏñ6ûÓ<üQ÷Œ}{¡¡­>ò�ã™o/LŒtlæ“Úê#‘�~xà“Úꃣ¾~È3n°S‚=2mŸ_’:ÛÅ#´ÕÌà cÓ¾}ý±ûéןþ‹â±¯ço_ÿøÆü4'~Ž_ã=øƒœ÷!ß~¾é´¹Ÿæ”Ïñ6ûÓ|*Ÿã3>ð§iß¾~ÖC”|/4÷ÎßÿKÒƒ£nS?ÍM~Iªm‡i«ôÒVÙÔO?ëzüÙÇ—üÁÿñÞôúNœöuøÜø­ýÙÞ×|dcG=uÚÜßXè Öp9�3íí…¶ÛE°�ÿ�¾Ç§Í v˜¶ÊŽ^åÙKƒ &Ÿ;ØãO*xÒ/"ž ÀzÍ¿`Ïšöõ+íý5�·ÕG¦=/ØUïò·ÿa<þsèéÓæŽºüQîìë呚8êIÁn{åÜ`ãÉ'O›ìÚ*ߘxν gMûvÎÛ+§´ÕÃÓžìªwù�x{øÏ~=cÚ”Q;å†Án�UÉ£žl“£ÔVŸM[å{×.¬? 9vƒž8íœ`ã7={ÔôiŸ>üí…YßÕÌšöà¨þóéqþº8kÔô`;ü‚ýÓw¤o/LùæöÀ¨ç«-…µÁÆ“Ož¦­Âbƒ^xà‹bâ´‚-5}Ú“æLŸ6뇾·?÷�8jÖ´~x¶ÏƒÿñisGõ\NO�öö¿[ÿ0Sm°�þÈ vÖ´¹ÁÓV襭ÐK[ —¶ @/m€^Ú*½´Uzi«ôÒV襭ÐK[ —¶ @/m€^Ú*½´Uzi«¿øçŸÞ_þtÏ|Óß×|yÊ#›óÈÇÞþó“}ŸóàL€Gh«#‹Ú§Ò6xS4ÿëG˜ö>gVÓ�òÙý öã+}‚Á§ö9®’ŸýÛ÷<â`Î×=ŒçÌ¥­üèÀÏVïå·óz”¯sÒ÷?ö¸÷¿ ð$Ú*À�·Õô£�{fËÔV�BÚ*À�Ž=ouü›þ__f[ýšás&ÒV~ôÈŸ²Jÿ§×?ãg¢÷|¾~ž ”ÐVFÒ¿ÁêIÏ[õL`[Ú*À/~ú#ð÷?àÎ!wNþö¾ýk3dH×ß œI[ —¶ @/m€^Ú*½´Uzi«ôÒV襭ÐK[ —¶ @/m€^Ú*½´Uzi«ôÒV襭ÐK[ —¶ @/m€^Ú*½´Uzi«ôÒV襭Ðëÿ “`£ endstream endobj 98 0 obj <> endobj 102 0 obj <> endobj 9 0 obj <> endobj 11 0 obj <> endobj 75 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <> endobj 7 0 obj <> endobj 10 0 obj <> endobj 103 0 obj <>stream €@@ • &Ó)Ìœe;”�æÓ ¸ S’N†a¤ÆM*A âwÀløŸÐìNû1¾J�‘ø:&'A Ôàp =ÓA¹¬÷)88ܰjJEqH¬V,!›Î“‘¤Îh:#› €ÄyTjuQX€‰ ¯„kq”ìe6V¡†ã¡:b:œÄ(¥Èœoˆ ˜3)œêl0œ„¨äzümÀ`°‘QLhBæêÑÈæt;Ì&#�Êf)MfѰZ_èIà€¢)€$%P\X€0E€pÌJœ Ð`4 Ä%Àà Tõ€N d )¢ )ð Ãð’ D J#3$xR%¨gžäp|t2“çÀ _(%™¬E€¸&Xî‚£°â7 ÃÈö>‘`ÉA’d™$E‘dɆ˜‡¸Ä‚eA På 2 ã�H2 b`ž}†� f™…™ÀEšÀA¼(˜�°3 Ã(ä0PÂàØW˜F©Pq—†�>Ye©R[PÕ9O‰><à�€{Œ'¹rÄÆÁ†|©DG„iF„Á"R�XøE�C9ö Ø08ã˜XB ĺ?ãx!4‹ƒÑ(P$á²Oš ùH?¤9ECá1îááî›"ùt" BØÖ ùPw‘ĤxE„Q ‘$dˆ\k±àÁ˜`I‰±"$¨‹Â- ‰ôàÃ`„"pD °67Æ8ÁâÄ; p¸²ƒ(ºb¨EŠ`+ ÂüT†`z%@ô`pO�p>CèaôAˆth!X�¡àH'Ø$Ã�|¡ì „ ¶@k€Z…Uæàha¸àÚÂøT ‚ÐuµL=ÅP€ƒÜ} ·4/À@ ì qä#“€dI�!„(ˆB B�àÈhY b91šD‹B-°¹!ª‚ûâ$A¡†@È‚ ¢-0E{ÂäV qÐ2€ð~Ah&¹l�D…b\F11#€øãã„�ð …€yC ÝÌ�€/€ªàTKÁ'„X²bT= �^%B0—`­º€€Þ#D ’ƒ z�pD<@𮢔f±`XqÁ´:‡ÀüƒØ‘âv3 €þ$Aat$�°l ``BpB!Eø~¡Üxˆ± „X†bAˆ€ò!‚ � ¢É��_2‡À6_ì|Áv‰†€›a€TO€iz÷D€Œâ4Jˆ$D¸Rà„GÁ ÀÀ� ‚4Aµ¨' ¯@K ñ\*FäàÀ �ö4Ähp¢!�™®%D¨¦ŒPG‰ ê=Àà÷ã\{�!2À@©¢„6‡9üƒõaò‡Á" DXa€4…QöÇØ7 cÜz�,"Dp… Dˆ1 ‡ØTcD =Ñ L ‘"D˜r@Dá 8sá¨Cx‚"Cø‰rhb5´: ØœV`j"ap> ÷@T>ËD!m �ø@Ò!ˆ’âÔ{ƒôôøŽ±àF‰A#€ÀN’|@±,tSF¬‰µ°–>Á�E!ˆe�l+¸`|;ƒÛz"Úq ¸K‡ñN,Å žÃT10>ÁØ÷`TVˆ‘BÄ\Zád}€ ŒC˜p !è7(bÀ*ÈÁ#È[ �>,Æ(ºbÍÉ/¡D>€¼$à`p+@>@¸Â$Hˆ�XàˆQ�ÔDˆLÊ"„6eìÁD8ƒ`6Œ1î Ǹ:á {ƒ¢…èH¡\1°óž BHS ‹Ú!„€ ,tB„‰L=à û hS ¬BÀ 5q†PÀ—@ �ðK !Ž*G`µg¢Ül �b.×Èø W�€>«EHáâi«Aä=@¨T �:…¥ lE°Ò¸r 1ŒÕ…H³³h !4 Ãþi¸¢ˆ@ý™Xàbh>Š1L(ø¥!xW%5vØ&`À ¨:¨ÂC\cªd0ûÃÈ»Q€‰¡Ä=Âh×DÁà|1îÀ¨U ¢A¥ j¨–"¬{€ì €ø¦â€m‹áî4€ Â3ˆP—KÈÂ1ôE‡a“p} H�-CÈ› Š}�aö ‡ØPWAY†˜3Ÿ«ã<ˆ°"XØtN"`8 Àò)¨¿ƒP_âP°>ÁÀ÷ TTˆ‘4ÆC8`°�°€ ÃHsÂÈo ÑîhÑœT =&î^»ºàPQUÃÃÀÍVƒè{€*€lz¤)a^0DÐ�BLU�ñN#Ǹ*Ôkˆ±ÂE¨m¸Ð,&®�ÐÁ cdi �h3†5¨ ÃÜâÁÈ5FÀ¾PÌà=‡@Ø8l «Œ4Pò C³“�ÁU ®H%Ã8|q ÅpøTr€`f?Àu¨*jáA(É~Á á!çT@!8Ê è !\n�¢Áî �hÁ¦á¨m Á"` `ÁPÏ¡`A†PÁ0� ¿a!À>稤AÝA4aBA<¡BÌà´ M˜ €ÎÀÚ €î  Ú`éŽîrÁðáR$à`* áá8~i°�X!^aX ¶apÐ!|`4µ` ¡ ¡vji"Ü æ€à`€œò  afî‚  Á&� aX›aa\ÎÀʘÁîáöÚ a.Ρ"0AVPÁ¼€Ê P nÞ ö`>ÈÐtÔs!xÅhAîÀ*`Ö¼ô@ø¼¥ Fät¡A$À>aÁ$¡&èð˜A¬K`LîÈÆá�,¼Maö î aö 0`¢ ØM@ Á6áR!`!¾€<Áð`*ÀìJADñ€è áít~ Fadó«¸ ò €þ6.|ÁX �ÖÁ0�^AdàNq!TátÀl a6áH!î ´Àˆàúþ ôáî�ð  0Ò ÀÊ‘5 av�<�Q$Àº‡ÅP´©8&öaøäîÁvà�¡V`¾ œ Î¶a �V ð6a¡H¾¥ ÌCD8 â‚Á°àlK¬ ŠE`*0!àÞ àí‘ÎÁ"ªì€ÁFä(ð¡:u@2àäÀÓÁ€æÀ´ `Ä `ŒÐÁHá4�ÀÀè€Ò ÀŠ¡ Jà<¡î ¤¶ e°àp„Æ€¡1;a€`cÀ&à&è!%.ñ2`fA`¡~aÀᆰdAa aö ˜`üäðjÆázÁ¤�ž¡n Á),ÒÜ òà¢`ô@Ìæ2+fÚSÁJAn�ª<$}¤+ `*¡¾As!†fAT @Ü îô%ö@<ÝŠ¡@àwà® ÄØ@¨G4Áîer à  ˜m á !`"¢OP "¡z� T™Aò2áš \¡øÁú € 5@Àò¡ð�(àÐ @ A(€4" endstream endobj 12 0 obj <> endobj 104 0 obj <>stream €@@ • &Ó)Ìœe;”�æÓ ¸ S��æÃ!4©ƒ‰Ÿ° à8|@e'Ù‰ôi|”¡Ð1:¨ƒ�´hIð ½Ñ@÷¹ ÁÆå ªR+ŠEb±a Þp<œ�&sAÐ@1ØD#È‚�P© ÄHmlÜ Z̧c)²¯ 7 гÔæ ‰E-äãxä@LL¦CIÔÛ{6ßoø¨ƒ †&3D ¸±,�΢!ÄŠr#ÈçBAÔ’v%Ì$³Áˆ˜y1“OFHy<ÌP3”M#ILÔT5•M…ci\b2!Dc¡ø¬Z– Æ¡ž€`€t ØJ)À˜N�ŠP¤+P+€X,È!€h- Ø"€x#ØŽ �@’`”€–©¨h€p�  Àò�€Ø`x€ 8# ¨ ¼� àŠ‡ ~Mƒ�m€¢  XÀÐ Màà-€æ˜�€f!HWBicxe€àU‡È3¥ �ÃÐm�á�J‚H _‚"0"\B0$L‚a�&Qg`(6†Ø*£0, ‚Äð,r‚âP.&‚äè0È0YƒÀ0vØ2 ƒ!p2Fäp|ŒÄYH{ˆ‘ð#à ò"”€© „XöP '¸}ŽgÁD à1ö9…ÀÊãà¶A#‘î/”€8 GŽ„±R‘dÁ&R 4Y¸ê¡é.3‘c©;ÄÐD�ÄXüE¤H…9øDä*tžä9à}�à(|YF|FpÎQ‚F©îžàöž ‚eÁî4*}Šc˜ [�„¡EŒ Aö]û!A Ä9žä)FŒÄ€þMe€{“ûII¤©(fÁDP”d¹D •Äàà)ƒçÙ ´ŒÃðö4�ûyî?îc!@’äYk½‘à9Â+AÈž.�â€Ì[÷ >|‚Iò"!ƶG@1(EdYEdI.AcžN@Âà–A�# Ö9 Qîñ>D’_BPä™^Fû¤¹L‘€AH}�Ã�W‘ÁU Ǹ´}–ö¨†}Ž#hÌÃðY¬%n°Ðœ$C¸•\B,P‰ñV5Gx±ÀaŸƒa.£ÊdE‡ ô ™X‡bE2öf=ÇC "0> €¶4ÇØJâ¼ ±îÇ÷‚”O Q$Vø/\AÈU��ô*C�¤CÌ{ƒAî ¸9mH 5@T&ÝÈbi÷ 'ƒØ‹ ~†ÒàB ¦5€8÷£Ü aîEÀx� UðÐ*CHš¢iÂÁîh¶ƒ\  \1Ø;Á8}Ž**@0 CÈ^…Qö�Pb è/‡¡8-Àøø€W‰¡0,€ð ƒDU†ZƒPo`k[` °8>ÁêƒÜ �p*:âcP¬y�°*Ä`l£OAöØ.á\(…î/‡¸&áN‹ñ“/—â -t�qT=Á°!>,�°àïFp†‚ E†áèhAˆ}€1öV¨ áðEá %X‹!ôRv$%€@¡BLZáH#+ëo¸Vˆ‘Jøiá,}Žª ÛHBÆÆ;Øh9b Vö#ˆSã,M !<%…h�ˆ €< ±òE`ƒÜ"РJ=Á` 45‡0´p B7ˆ°’"Â`® Âü7 ú4ÄXïoaŒe�p…ж!”[áljÀýõpü5©aàE¼€ø#è• Œ-‰`¶"Û0[`¦x�°ÀKfXûŸAŒi a8,b†‹�zÀa„PaFÜ~Cà F–£³PÃÜ5@ŽÕÚË[k­|B VÆÙGà‰m!‰µ…¸ØÁp  ‰±@ÂpŽB|EŒæö@8» ‚”? {aÜL < ª:p Q €| “ÀºDX’‚lK‰�>(E—6À_Š0ž>À¸û´) Ü(…ˆ| W�í€sq¡ÄZ\ A¤9ƒ�ø í€AÃà�� DØü¾áØ–€QN…ÛOô€qâ"E€f=JÎŽgzzÐh Ÿî€&€˜¢øsŒ`õð¡BX8 �˜Fí¡ð¥aZp­!Læ¢išî@*àJ  ø¡ á¡!a A,‹P¶` šà’€ºÀáž ¡NA ` €Ú ¼ ºÄÀ<—@r€ Á@,4gºa¡Àþë`Á”!Ê@ÈÀP >áP áHaZXáH!Jǘ <îÀò@¾¹òÀð�ò Ò ØîÊ áîf¶gz! A`ªDà° Àê ˜ !<ÀÔÀ¾`ì!‡Fö ¡”†áî¡r²@Êë, ¡D +6³«>´ дkJkNµ+Vµ«^¶+f¶ª8 Iòi¶ ÁäßAF!–j&m!¦Á.Á&¹î þAîAn!¦i隫¨äw œ Æ À” …áöf ”ÀÆœaRªjÿ`î  ö ì¥@Þ8f !Òå¾ÅÄá‚J €¬êªað0k`ôm ´@ú�hN… a(o*�Êúzá6á }AöÜ! è &Ì a÷"@Æm2Ra£%§Ö§ÜÁ ­7&ÎX`´€ü¦ÜaAÊa „`ô!$Áï#+’¡˜ �D±Œ�€àšä °<a!(à<á4Ç‚��gÈ Ì†  Äà¼@èÁJ¡fAfÀà@¡®àF Í:sªvÀ®ï 6kÁ`¥Ê(�àü ÀØ€ø �Àþ !�àì î ŠPa*c9!F`ý0!dáA< !"0áöàæaÔÁ2 Þ!f*u aNóöS¡ á À’»�ø@1-á”!ö@ Tí’aaB¡J¬S¥:€ŽÙeÆŸLrÁö¡î¦¨  `*!¼FZ¥fÂf  à~¹@` à°Ä`ä�fáF¡2¡0á6Á´=ÀNa\–!СJœà„áö`Î @îà À ®s Át Á–�ráz@<À° ð’öaTab‡g஀*Øàþy@cLaŠ¡ja@ 5³^!î2&!*] ä�üA÷c  à¬áH‘¦}aj}Á8A2A A^!0¢€î^A `Ø �ö ¡ö Æ: FÒA58ôZüÀ‹ÒŒù¯žŒèÒjœò£$2G$¦ö ÅÆ Aöá<a y6eÀúÀÔe†\`úHN’ CA:€s:àð`+áÁöÁu,îA<ÔA,JÅQ`y0'~jJaDx8Ó`ø ô àÖ°,øÁ A@! aj!mTá.!"‡ÓQsúáKz²f ¡î�ö 0 ÀÌÔ@ú `‚àô Ædnzn`ΠúAo4¡j!r¡A&ÃA< Á8A"K2«I@þ¡ —òn7J°ÈŠ¡‚(¡G†žìÉ–™ Î¡ ¬kÁrÜG�ðÁøa.á´ar A^az¥Aî!Љ€Rj |j: `Ì7`Ìà¤�8ÒT‹`!T PŠ`Ú @– àAvâáHAT ‰Aèø@&òAîà* À @zàØ Ö @Ì `òË` Àðé)R †ÒÁ2ÅU‡Ö'Üá®Up`&{ °ÁFÜýàäà—ë–�ð%Òaîr(“µ;�/;È4!@åS¨†àšžêS>è8!.“èaW3ù?Ô@Aap!8 (tavò Àô â tÜ!3�(�@�� ‡»U�Pjƒ}àâ  º`Ô�Z.A íDa\g€RB8§Bë� ¡�iŠ\`C"ˆ %z â Ä¶h �Äà8AVA~a4a ?rùj ! A:�`¶j¡FA’ vi¬àCˆ¦¬°aT¡Š—ÁôŠháè¡ðáîêAð *�"m ¦ ÿ7(N«ÌbA¤Ü �Á4A©E³B`¸–ä �ð € a"w¡¨¡6ð�œ€Þm žÀþ·Ê£R²ªÁñoîøÀ Ðí芳®š¥ú@Ö`ò`ì `¾ @üka�ÁîÍ N¡J€á`E´^AK”@U€P/²¶`ë+àxDEÆÁ`nïøáÏ-arHæ!'.  ¡×çDܨ`® ¢/@Ó†Ì ` r ¡6 «`“ã `JÂ�XšÁ®èXaz@<ŽÃ yTààé1ÆL¬AŽà&›ÁLÁŠ�T`Ê4Ä'·hÎ8áðanj’ÐJ çz¿�8�v HÈ ÆÒ @ù#²Ÿ�fÁ(2«!ðÓ¦�hÊÙ:Á�0˜²\z`³Õ ˆlÁ‹t¹ÿ ŸÀh˜¼ZÑà* `´ €ò ^ Ü ìÀòa�ö ¡¾�t ab Ad ¡> ›Â n t·Aºß �xaЇ"Aîà+D¡geP¨Œ& “~ Þ¨ÆÝ0ö­!]áì­’(¡òæ¶ ±Î@Èmáö™ Ôk¸í¶ø‚rþá P"A–`}B š“á÷bp±Áî~ Ù¦ö)}®à¡n඘±°àAð¦¶&Ò àºÇ4Fæ²òt!˜oaœAn‰Àá„ABÁ:Áá ¾µü�¡Ø æ¡`�HŒ hà� àæ ààÀê  ¡¥ @¿Ox�ð�\ÎP»`t\†¨ ïÏÔNá̾Án¡¸AnöX©#ZA¬“!q&! (¨ɫa  üม¡daAÄa x­Äa¨p€°ú�D�.�¼€¾ë ˜àÊ4ª`î A §ÙúZaîÇ*DÁ€ATANsÑZ†:`ÌF¨�ðÁð@*¹@,¾�¨`¾ á" `7b0T€ÒÔ@ÞáBa<ÁtàxÆ ¯šñ!:!–‡ ˜HÜ @4 !¬¨XÔAÆáÜš JÀ”Àvá$áRáC ApAt\A"¡> &Ap¡D�€A`þ ÞàÁø È´!‚ ô @º €âf ¡Dá@A,áD€,�ð@*A<``\Î ÂÙå^èt§–  ø9òž}‘O•:°®{‘^ïh¸ òn}‚B¦´íxE—eäé¥ZxO SG•ƒqJ®O­—,†b±Â‹væGØ¡î)}˜ŸfØ©ö,}™ ¡»–ZUgv¹½@_KžGFM¾kq¢Ùµ²M¬¦>ÝÏ•˜Uîe¾Á”ú95ö}�ß`‚sÜA{™™opKÜ |0j7ÀIœ÷#¨À-¸}îÍ€è/‘ÀUöT9�—($’ b?@tY…‚/ �7ºF3$é¤Z€ŸÙ#ÒITªQB¢Q¥ÔH°B¹8p)‡ßhm‘˜ü{4¡÷/sþôÎŽ?p–´`ÂVaJÆc¹D®†‘jGÃõZrRLaîâYî‚à™°|‹å *<‘cñ"@“غ{– ÁŒO„ÁNR16Y‘e€…QöªŸf° —�j�ÄÈøEˆmxœÙD ·‘îs€8zJ�$±i(ÁLžãöf€§¸Ã à–|€©H‘äÑH’$©6HŽ‘ÎX –> ƒXìŽ#ÐÒBäPåS"|%¬{…à‘�AŸa37 ð0´�0 [�D¡Ö­åÓd1„º@<$z48ÉX�™à"Ÿ°*0 @Â/ƒQn[•¥an[ %pÀÇÁX|ƒEPðO‚E»Ýžà\Áð7®ƒhÚ�ƒ‰A�D],@é'Tظ5’#(6}ƒ�À|}‚A™~&Y‚�>g,à F8‘b¸2# Bð|(‹%!x2ƒÃ�`>•ƒÑ¢#ÄYP%!&JdY&E’ÄABB£Ñ`BΑîçî Âé¬%•nÀNjE˜ë4`É’Z–&ypZ�1^£A67âTô{œ'ؾU­AÀQ@�LQÍ ¼Ó—Ä9.?‘c^7â°ø: CÀüä’q%2Ó)$’ AR8cXÌ9C8 bŒFé `ÅáNÅY&X‘f5PxÈ‹W 5ˆ¼U�EÁlW¥±l4W¨Yò¿'ÈO°¤ŒÐu© �jB ó"„‰J‘f¸|7§¸C—âé8}�`F$Džâè ~€1 €¸‘9fåÉîóÓ?¤ùî)³‹>|ºáö5€1,D’¤QEdA,BBé<»Aö  }„ðæÅhˆ+p2šób"à |!¨D*z�†",] Îpê`hN!$ØÄaü>ˆPÞžMÐ~7¢Eˆa „¸û ÃÜP�Þ=(�Kˆû‡�x>@¤#´{ƒ1î5…¹càe%ÑŒ&DØËo�}‡b6D(Ÿâ,!ñŠ`@SÏ,…áŒ=ÀážFÈY‰B&„È—n¢ìF€ˆ¼9‘ˆÑ‚\?#rßDX)hdñvXy‚,jˆ±¢(E°°ÄR�q:R}cäƒ*Íb4F�)q\"Ú Ð@퇠î`¹ºT 5Àö'„X³OCä3‘>>A«!FV�°Ò€0ÒÂiý†±Iøz)@L}�Ð0>ã x „E‰¨X(„Ж"4H±0#ÐŒ�ìr#z! ƒ�P{‰Aø:ÀÀ¦ÃÝh�ñF2DȘâH �É.dŒ g`Hi³;F ðAñ(>ЦiŸ…͌׵2k] _g„B*! *§ç/ ±<&À‚lP Á$'زAÐ'�ƒµJƒðf—cÞpÐ#Î ¦8¦ÈHSŠt(Då@‡HX‰ æ*A² "?†Zš �èd¢K–¢€#Ïaî!H2‡@–}ChÊ Œ&ºþC€e éè}Àù2@û«A¦g„©¤0D@š",6!0}`}Ð!öÕG �bá HX(ÄДâ8Fˆ¹Þ$g¤^ˆÄZ‘> „°sÀ®p€¡ö2 ÀøMˆ–5jˆ—‚ýðEátŒE¨…¢N¡îàîž‚„áðP0ü ‚p¸>p˜bˆP ÁCÇÀˆO”RŽGV=Ì(4D|„CH$ءĉA$Äu®ÂTR !0t… –¡p�À*l�Èw@¢€oA€�Gl‰Ðæ€p`Bèe �x-ŠðÌ.…رä]Qe…šXÒzWKé�7§tþ¡3ƒ‡RiM-¦4ÖœÓÚƒ b»èùB�ÔàhjðǸ¯ Ð ÝzGhÔ`Tp €0ma˜�° ³¶†ÒÚ›X„!ÖƒÌ% ƒpb=µ†ÎÚÚÃßlî� ºö~Ö }‚t ƒ·&ØØû%=Žý¢÷À=0º?Hê]cª5¦«ÔC@i0ʂ֘bèX‹j,u½óà: \¾P˜+À�Ä";C‡Š‚ ÷u¡í.�A&&FP²à T‹A4@ïc4¼ÐzÁ¸_¬Y H)EˆŸÂ\= à<ÄÀˆƒ­àQŠA6+ƪ `ä+ˆÐ‚hatAæìÙ „0� ª t °�¤²¶–›Š‹.u]1Ù%ò…ÆaD(ã4{‹ÓH"�B £Œ{†R‚8Ê�Ù»ýpaE˜÷.cìC˜î!À6¸á$r˜QF�ó¹üó_�#¤4–°ÔúÏUkbŸ0ùWäa�ŽAŽöô-QËèøà§ dS€F=Á”rúF€G_ð*„XI áˆ!†°¨Ah‹¼1�¸eè^€T=ÁXû xg�ÀÌ—B€ƒGáÀ@p=ƒë7@,ƒÂ8�@ÎÉ'�XO(]…àO‹à�°—pK‡¸/„Ð`¸XV`dh€€ endstream endobj 76 0 obj <> endobj 105 0 obj <>stream €@@ Í&ã9’g9‹JFS9ÔØa9A âGÀløŸÐ,öøm¾àPè˜�ƒTtØIî=½Ç@÷¸Ü ÁÆäÂÈ ªR+ŠEb±a Þp<œ�&sAÐ@1ÖD#È‚�H¥ ÄC)Φn ¬fS±”ÙO6™MÇBq¤Úb:œÄÓy¸Þ &"qX¹Êëw¼Þï·ò`%c…`Y|;Ù“ÚÑð…Z[ëGºéh| ૬ �J$“)„Hò}¯Ç”ü}J!¡÷¸ÍöùIDÑÑd¸¡\–Ïp°:„JoЈ#Èyö)´ÉKó“-y8®àø8ö›| S/pÂaLš-�K@ZØ€`Ç endstream endobj 15 0 obj <> endobj 106 0 obj <>stream €@@NF“ °šTƒAï€Øð> 0蘜sTOqÀIî,½Å ÷¸˜ ÁÆäÂÈ ªR+ŠEb±a Þp<ÂÌæƒ €b9¤ G‘Úq:ˆ†S™¤În ªFS±”Ù?6™MÇBq¤Úb:œÄ3 ºÔLŒ¦s©°Âr²Ùí6»m¼ˆ0{ª�Ø�qÑDøP&žå$¹QDl‚œ¶Ê@ p%€Ûü endstream endobj 8 0 obj <> endobj 107 0 obj <>stream €@@  &Ó)Ìœe;”�æÓ ¸ S&• Ðq3à6|O€è Šû7>‡’ :&'@`ÕpH� > ºl÷!„88Ü¢cJEqH¬V,!›Î“‘¤Îh:#šà€ÄyRitÑX€‰ «„k1”ìe6T¡†ã¡:b:œÄ(¥¨œoˆ —³)œêl0œ®ÆÛÅêù_ð$ÀT¬A7FòÉ àZ"H§"1ÌŽt$I'bQÜÂK<‰‡“4ôd‡“ÌÅ9DÐR4”ÍECYTØV6•Æ#!˜Ðj”ã�äF: Ç©$˜ R@éåÑjX\_¤FQž€`€t ØJ @L `N#A@*€H+P+€X,È!€h- Ø"€x#XŽ �@’`”€–©€h€p� €  €°;€º 2¡€Ò` <Ò  € |ÀÞà€(BÂh*(k€#€ Cjbhg€€ÈI€ X K§¨ 1€ÇÐD€æà)ø}"ØQ�AÈm�cPz‚€R�¡(>�§P�Å` �ãÐ{˜ e‚$ø$E0&d`(‚…(w¤(*z‚Á�,EáÐ.bƒ€03p2% 4Cè4@E`6ƒc`6lƒ‚88>¢:1¤:\ƒÁ0<5ƒÅ€>?„@F„�@y ØB„!ÐB*„#0B>„%ÐD žäp|ŒÄY>{‹¡ð“à ò+À¨¼G$¨ÐjŸdiðf¸ }Œ‡àþ%Ÿa0þ=‹dH2<âÑ<‹c¹0S’äq2Hùr{� )îMÅ VKŽ�âE� É9D¬Ea&ŸƒñîJ‚§¸{”ç¸}”à(|Y4|Fm›ç¸ˆo€dÙð¤‰J‘„±ä ø-çÙ‘b‘>‹8>ãA4‹xøK‘ex{• 9v\$¹YÝ—…Ø$ø#/ˆ&Ãгåyƒ'ž-ÿ¨^zãÈt‹æ‚.�ƒÐ–ÀðÚâF… òDT`e¡´Q>>@M!0|‚ *>ÄxÃD‰±"à‹‚<†àÎ>À(ûÀ`0Œ`œ8˜¶b…Å ñ4$Å`Œâ0 áö0ƒÀ‚ N‡ÁÚ>Àø÷#ì�ö GØU@„Cw’ÚǸ}máDG‡‘&"ŦB�X7°=Á@Cì À´'CL"qAä=ˆÒ"„8‹(?¹Ø/[xV!ðJ†Š> ÷À`{‚aî†`Ùâ\eˆø>Ax‹ÁàX�À,ÀžCÜ�î!‡ˆ:s@\ ‚¡9@¨Qoˆa. XAð(<@‚ƒð8 †¦Ø8€8ÙcHP Z+ÅXŸ,]ˆ±nE˜l´S.„Ø¿€JŠ1A1`¤"hX @4=À 2�á‘ö9¨ìbäC ðù1PÄb˜1„À4"¨v �Œ:°ò„Iwah>‰AWE ïØP !(&€ð·ÀL69¡�Á�= Á|�÷F"§ÈS€P9G¸™   �€ÁÀ°0p¨}�±Ñ#¥cÔ{�áîÁ|k€|?ð*7Æ5C° /p€0£a؆ñ~ƌ˨] ‘¤ lš ¦�qž<@ù rÀ}†ø4/ÄPœb,9ˆ±!ƒø‚ƒì�°í�@÷BMˆQ8"ijŠ¢f‹Ñ"Ä­˜€" È‚.ÄH™£¼}‚Ÿ""pBx€Ð@ˆ`ò›`ÆmàÈF‡×¨5Þ¸VsvD; �Æ)E¾’Í ‡Ñn>#G Â̹Ð^@ø ÀTApìC°¡Ø=‡ðî"Ä"ÁðH…¡6D˜\`äEƒ€ØFB(M  ¸E�°"Áp©¢ø) p”9Ã(îr�EŽár2°y¡"�ÚX ‚,)‰ðÀ,B ¼ ƒ—€7®GC|à”b ðìŘa¬Mñ<€E/a´N¡:G¸m"¬|ᎆ³­£†Va(I¨”‚HE‰Gv+D�� €|~‡ˆÄ€ b`õ)À8 Ât„�ÐÊzàÄŠàÔ(ĵwcÜyáŠÇ¸£�0¾‚¨_ã`ˆQBC@~ �è �pT¨©b¼\�QxÇÛŸah 0¸…x©®à{ˆ±b>ð±$I×PôÄvåä9ðú�Øû |Að=@(š‚ˆ‡qöÀ(¥ÂP^ 1>'¢àLŒÜö@0ü #ódÁð28£uΉ¢I©9'¥¢cÄ|h•+`ó‰@TE„0þ�ø†� °X9°"Ç ¬# f a`9\ú¡´l…A„Æ€û"¼}�Ý‚(©ˆ#hB KÓ.© ñ€TU a&-Ìa¤]�á²E 5¿ þ€ Ä ÁÐ\ ¸(‡ðhîâԹÒc»T'¸Rà p$(Ç÷c~V<Áø>è ¢˜6‰@ɰ@�Cƒì°$3A�é£R‹±nðeî!ð"p &/38€ * qŨ¨@p„>Æöüb?CÀjá°EùÀà%C¸Ÿ b ; Á3^¸ Tp ‘T‚F«Õ²lXql-¸”2„ áã+ ø#ß°†ð GØ ÎÆ;°à‚Ћ "@B ! #„Kº�_‚à7]0~à !î �ˆCÂ0úúCxƒ¾N|Y )Ĉ‘Õ8 ï` †`ø€bHÁàF¡øêFˆ‚¡ ú`Š—nò ú€„ïÀˆðà áÂtÎÀi¡®v$u*!ÊG©�(max€²� `þyaáA4aˆzàêáVÁzÁ"� !,Á6¡-'va4�N€ìàÒ" è‡€àÁ Àê àü ð��ð 4á�÷t÷�|•€ÐæëG2ýàvï`vØ JþÁNô©À8ÿÐP ÐPa±ð#p*€Šx€pàF؆ÞÁ¡2a¦zàÜÅeja8z`tÇ!ð! þáðÁ>ÁBA|!î!¢•€X®ÁîÀ*áî€  !AHðÃ! °Á ˜�8`ê¡ 6€¤ † aV aÀ `> ÔÀî‹ €2 àÖ à° ØB<ÁHADЊaö0Á$¡°^`˜ÊÁ2!DÌ€&� áLá:a°aŠ!zaX á^x `Þ`ø�À2aTár�R dJàh€úað˨aîØ€@Šò !îÈ.`òÁl/*A(B >À `œ†`nò†àœ!NÁnŠB�’Áža†axd áS%`à€œü  aî à «Äò ì°Áa!$ Á4 ¡& Í‚ ‹`N`À!L† >ÀŒ`Êëÿaî!\a\zà¾x�Œá0±·!T!~`'`á&»@*‘ÀÁ*A <�±¤@Ê €À `öá� ƒá a�ûö áR Œ�ba~€<Îìq�¬2 ÀøÁ”‰!d®!<áxáî<!ì”Á†¯ï4aös+…,Á°KHaTˆ!°�,—†—q6`n þ±@áTmà€/Ä­Aî Aîaö ç‰CôCDtJÍ´P ÔòtB4'B Bô2ß§>¸J^!Š*‘LA¤u Œë€&ô *À ¡Ár‰!Ö`dÍ!°@2 ! '>çˆ á  úà0àþ §v €Ö¡jà&îFʧ´2� §>�v ¨daLÿalÀ á¡>á,Á2��D®@ @g5A6-øüàn˜hþmàrÀ÷á¨ñNò�2¾ô&¨‚ l— t¥àûxi¡ð3€‰øÁV5Mð°Á! Pa. � 5Ê«4Á$Á4`°€!Ë!r�î�ö`0¡ ÁÁ ò5þa"a$ Øà(áªPá"AS]'F úÕáÿTÀ‰AT¬a©Aá¸4&h‚¡ H`„—`Æà¼àì ú¡&�ÁÀögæ€à !h ¡Šà§4ê]'•‘YAŸ8Ü¡¨>HD çNH @0áî€ô!la0qAC\ÁuBUÖ õÜ–á> ¡$ç```¶ "!¡´!*qA@á&µ}]`‘]ÁD!' °à6aÔ. ¡&¶ a0áJÏáÌo Á¶ ,¨(af©¡îÀ0¡jÁ öÕ?tt!ˆ T’FA†ÈЉXð ÁšÖÀúá PÀ�.îô`a~ÁP�F¡^ < v ‚ @˜�>áDœÁ>!A A$á�‹ô$ÁV!f�L ÀªÀœáöÃl`À  êàúŽ Ô˜€° �n á�áh~<a0 á  ì€6¡pa\8 `^ò/:ÁÀþ`ú ø^w`Ð áZÀ>ó\�^àìrÝ¡<5J-¯ð!òà*á´+>!ðÁ¼àê€Ú €°bN© '‰d!-dt&” ’¡.Á”9‘<”FÆÞ§âz•nàžáJêA®‚‹qTà€ÞS²—úr!î¦Þ á¡*Ø`úh) Aî ž�6až2‡Çž¥æŒfX�@,àºp8á6 �nv 1x€ÁL!6a5ÖUÝŠ�+ð&àþ ä �  þ ý��>Þ ó„”qWv$´uÖ `ø€!`ü@¸.؉ƾ#! A'˜§ž àþo"A0à>Aî÷FO_A¨æ� AJ`È€@ZáÆ§€Z.à À€àþ@ü Ü` `!³ì¨fäÀÂË�6àØÔaî LP `~ N À¢ à´à< ÀAtá~!z¡öÁö`¶ `r à¼AHöMÜAð Eà&ð!îMl  ú€ø@Ð €¨,0�À„Á"À>Úx�¤!2Q¶‡Á]Ð%�,Í754ïÐØ\{ZÎtNš Á¾Üõ” õšuža6S¦A àTaPg65Âôp³!¡4AlµÔ`ÅPAJá8&Ìæ¾@1_Á4 ¡N !6 èä„@è €ô  ú/1q®A!!n€ôö­z îàæ AVAjÁvaî�‚‰ \XVÉÊÐÜ að¡P!Hvaî* `Š àæØ—§A„A¸á0Ì > ê`ÞÇá@Ã+�ÁD`Š@n @°àÎ @> ¾ àŽ`xsà,Oêapa6A^ÁLy|!ŒÇ!ôµITÀ¹á:¯òÚÊ¡ø 18ßøå‘ÑDñÁ!Ôrï!¤0¶H‡À·€€â�`ö… ´ƒAºÁ0áeaøGˆ€úp̆ØñG»ˆÂç6áø@  twÄ'P"@×  òá ! gÓbÀô ! ‚Íì!ð-’aÞá`¡:Úa¨A4ì÷ÔöÁùÔ�Ì·t¦œáðJjβóz�s Nà ¦`òA;Gv áKšöpÊ ·­Á m)¥&– ‹à(AZà—U ppá„€îA Çv©§~¡x¡®x €­i`Ì>X‹T©GÈùT÷Žð* ˜aŽ´2¡2ácWÈ|è‚5ò¨ê+¹@šsáÊržNRè4†A2af ‰v ¬ÓÓÜíÏôüøñH\þñ@8Í!1y= ²›ìî Ò„á^$ŠàÀ À–x¡ P Áˆ!b�X!�zá‘/¡˜!PAV ¡^ ¡@ ôÒ`¸ Ê ¸ @á�€rsà<`jsAÔÁ�hÁjÁö!î€*Á²¡`õF á0˜† ÀúáðÞβ†}(jx¡óíAö aöŽØcÈ`` £ ˜€Èl÷)8àA–Ü ÁÀ �Žà˜nàWÚ lAr!^ a‚ AT«úa üÀî áq€ä€è Ð Àò ÕlÖ …Q]rjx"Þà4[ÅNìZ®� %²ñBÂE‚Ïw -4øªÞæ8äß½Ù/‚°Uö{‚ÌTò©b L MÉÐòlâ—@§"ê$òuD¯/©IäÒ±ÀºqœKè3:(všÛ¯¶pB@ÈhpAñî˜MÇ(äYÖ=ÙÏppø`"ÓÏu Íî½XÁ'{Åî{{€Bá3cܼ÷[…T¨”â)J‹l¢Ø)U²�Ž«W²lÔZÔú±8* kq¢œ[}§Á4áàÕA¥P(²!øE¢Æè4ý<=Õ‰à8ñ|L¢Ú€ŒSàìS$’Jg¸m’\ Š—Øî}F#N�ëª!önb=ÙJG¹©d�‘©Ú8V™N| GÀ0 –AóÈE�„pîI¤˜08£� 8¢áp‚!†aL2™£P><#ÈôB�ÃPÜ?ä\P;ãùh;ˆ‚¸à5c0+"ùÔk%)j_ƒÅ‰TNdYbE»¥¨‚G`©" ÄhäJdÙO•…qLI’„Q$EËÁLD‰Xe™4UÅaNMÄYzE•1D>•`AöB€Ð*V†Ù ^"ç1X? âˆ~2`(f(•¹DI©z’¹Ð ˜Å9\\•E(ô6“`ñ:4âé2˜Ü4 ¢xÂfoQò3 ¡^•§¸ |Õè|Š'Øf–Äpv[‡G¡žLäárYš¦ibs!Þ.Ÿ`áîb�Ánvø¾•!ÉŒ%ƒÅ�ÂUŽæ�æ] €ÁžàhÀ{†há)’Ä`H€ÇÙÊ|˜ ©lE—#Á\6"ÙV‘ta Á(Æ.ŒÃ®: „X¶E‹äàÎUŠÅÐÖw¡Iu•ih\–…¹tP¨»ÖŽÙ‚š†ùî'$Ǹb{�`©j\•$ád‹—¥ Î"ƒçش߈äü(�«î4,â©*B’dY ·‹`9è0˜!Р0Žbxºæ CÃHþ9b˜ö Ž =€äy0¹lI�c>~ møŠB�B‰®�‹8¢H�$¾ÊŒ!zð|Kûx°ƒóÄ›ÈNO£,J�Åiö1òqœL$¹XSe)�ÀS à ‡` !à€èE›�ô#ÃГ:B°L†`Ì$ÃX Œ="PÐÈaa\E¬ ¦=À Pa”_†!HD ~ØE‡0È]@È& "ä@ðt¤}†€ (MˆLдL‰ 6[à‡Ç ŠÀø,E˜ƒ`n#ŽA´<†èTƒì >†(aæ` !j,FH¸¡à3Šà<*ƒX™"l(�HˆÈª=ªð&FQ‹‡<ƒàN…Qð@«w Ð2‡à @˃0MÑ4#¨‹"ˆJ§?y¿â 9î!D}aõÇñ$…yNÐÔ‹‡DBCX³ƒ{€!Œ5Ǹ"ñ$,�¢„RŠ‘Z,E¨¹‹¨÷tC´Z€î$‡‰'CäQø" ø6�€àCaî.P9áõô�ð$ÆW¢,PÒÁö€@£Â{ƒà ?Euu⺠3P¤Ó9!�ƒ�4Fé&ª  Ã)Dˆ¸¬¡ø-¸àìo¸ˆ ?µÐüYøŒ b4ç±\G¸L­€€}„ñ!Ähˆ¶b8D‘& Dp…u|A! Àðx,�¸M`¾#ƒ`ž "ø}‚Ñî€À¨ÃHfŒ‘r*˜B€ad"„°‡t˜Aˆ úCøû£ì�ð=² ¡ü70¢ßƒk�ÊØ>‹qð>Dðf~‹sü=ÇÀ—¤,K‰±º%@@žaðÚ ‘ &è‹éäQ5qCØml%†À€öDXZaÀ]‘V!8Ê-ãPß�1,%†Ø’ÃcìW›A´!D³ØIäfqöFà9®æk áž,€ð£¢P\ˆ±± ¥‰¤˜O›ÀØ—�� ±*BãŽ&ü*‡Ðü*ùdœ&ðÿDƦýˆÐ®ƒ(�Áè àPÌ øù¢|��š>AQ, !à !'^ÀoaìBþGØ'€ °V=Ç0j‚ QÀ2^È•b4Gˆ¶&XÆÐ^‘2E°2â(~ �1qǸrV ¬‚.Äv�ÁLì‹ð8ZLÜy˜|+#¡al–Ùqö$s°}�LE5ÐäYÒ€|-‚È·Šã~#D˜•;�Q a8œ@·!¡©�°Úoœ| Pø{‡B΄`|($·‰*E°¬¹| A:ÃT æü)<qK o,áÄF†Ñ„è‹V¨1VÀ8> !`8…ªƒÈÄ "˜*²1Ãè8 € kq#BÀx "*Í>‚&’ÒšX}�4KÖžÂQ°à"ð…"7�°">Ç>¯Ütˆ‘ … _"PQ=°X£BT`ì1ö'Í ÄBTA Ðv+ȵ¹r€!è‡([\Š2$…ðŽÈ¢$ÚvÑ4E…Ð £ðVí =ÁpøcÜÀvn8àúìS˜qî.„ð¿ÂP`a¦tGF™ZX{†‘ÂIżu%� Púĸ�Âè;@[¨h†Àm(ZÐ…ÐZ)œpE…ð=…Ð7P;…<¸/„ðéhÐR€`€ÐnXa�x,‚ø=X3€óà8ƒ¨'„ÐC€ÀZ \`e¸fÀ/‚`3ƒà3ƒ�9ø6ƒh7ƒà#¥A�ø{�8e‡À£R°†ÈÂÀÅƒØ �(|ˆ/˜ gä'‚X{�¨¢@xÀ{�Øx˜ $X–#Ü„!£€(õƒèXÀbÒ¨Èh‰8$‡Àm€¨{‚À«ó„pIˆrÀA�>°@„2SÈ}ƒ)‚}„EHE„PE„H „0G„@I…XY„ ?¡¹€83&˜°X'ƒ¼>6Á Q J¥0rù�2…Ð9†°o†˜SñKÈ\b@aõÀ\‚È^‚ø[‚�QØŒÀ(Àhš¨°Y¸*…�† |( †pVÀÐ8è4�/@9ƒ 4ƒ\L€H„�F`H€ðIhE„XF¸I„ˆB„5ƒx3¨3ø{„(°_‡À!€¨I˜M†¸J0E…H ÄÀNƒ 9�ûüÐàð}�@ UmWÕ�YÕ¨Tå^Vå|ÅÉežZå¾\âpâ(…Û쇸]¾à ‚Ø6ƒˆ3è" 49Šh}€˜XHq�(ZØRƒ¨_ƒ[ €À†P7…p8°9†p@AA•‡ LèSHS†HT…xi†* f�Sª€-¾ÈX‡Ü¸¨]…HR…€\†�qq•×P„ 3`‡ˆ1Ø8…+…X?ƒØ Ù ƒ@S‚Q‚@KûXƒð€'x&h3‚(ˆÀ}h>ËH`5Ò/T-A €mÏhYŒHoÈ"  �è4À?@×òûNÈ{‚txt† cø^àg0jNÁ£°–‡Ø�8&P$ƒŠÐ…TÂ(hH€øf*ˆ‚0 î…£~BŠ$h4Ø4ƒH+°6i³&€˜`YÐ^¨SÀVÒ¸oøH…€7Ø ‡sâ <ƒÈ}�{€ }‚h}‚ø}�°}�x}‚¸}Ú€V{ƒh…èL¸v)èØ‡ÀŸðD„Ð9„H2H-ƒÐ(ˆ.'07«¸€@3 Vø`„è^…hX€øS…XWøQ ˆõæ¤Ì„ð“„- €¨FÐF»™H „ <„:?¸MƒÐONð8H„@L0Lð?pB3�„�D ÃÈSP … 6à?¹Û÷%øP…+~øIø2Žy'hA„€ àS„ðI¼†„ˆL `R@QàMƒ°>Ð?Xh•Àƒ¨:ƒøBE¨R�øQ„‰ÿ…PH„ðG’¨K?p=„Ø;ƒ¸>à;ƒøGƒÈHƒ°¨5€6;€ðƒ(PÀMƒPWƒ¸QƒøIƒØ‹® =ƒ¸9„ø>…ØAøX T„OðK 9ØB‚ì„=øEƒ�¨LƒðP„ØJ€Oà@V€H˜I¨J�HpPèX}�€RÈJ ‡k‰8_‡Ø €©ûƒP=¸H‡È8UÀLX(RØ3‡í‚:yb©+¸.bÐ{„hf‰9øO�}ƒx$ÑÈ}ƒ†,…†oo‡¸8JyºÝ„ø=‡œ-€Y H0ð}�:Lö„È•¨ÆÊZ€PpXT„˜`pèh€€ endstream endobj 2 0 obj <>endobj xref 0 108 0000000000 65535 f 0000061808 00000 n 0000281327 00000 n 0000061629 00000 n 0000058869 00000 n 0000000015 00000 n 0000004735 00000 n 0000256035 00000 n 0000269860 00000 n 0000254722 00000 n 0000256606 00000 n 0000255113 00000 n 0000260393 00000 n 0000255817 00000 n 0000255879 00000 n 0000269350 00000 n 0000061856 00000 n 0000059011 00000 n 0000004755 00000 n 0000008523 00000 n 0000061928 00000 n 0000059155 00000 n 0000008544 00000 n 0000014063 00000 n 0000061991 00000 n 0000059299 00000 n 0000014084 00000 n 0000019537 00000 n 0000062032 00000 n 0000059443 00000 n 0000019558 00000 n 0000023996 00000 n 0000062073 00000 n 0000059587 00000 n 0000024017 00000 n 0000028051 00000 n 0000062114 00000 n 0000059731 00000 n 0000028072 00000 n 0000031553 00000 n 0000062155 00000 n 0000059875 00000 n 0000031574 00000 n 0000035510 00000 n 0000062196 00000 n 0000060019 00000 n 0000035531 00000 n 0000039844 00000 n 0000062237 00000 n 0000060163 00000 n 0000039865 00000 n 0000041459 00000 n 0000062278 00000 n 0000060307 00000 n 0000041480 00000 n 0000043298 00000 n 0000062351 00000 n 0000062319 00000 n 0000098040 00000 n 0000060475 00000 n 0000043319 00000 n 0000044951 00000 n 0000098113 00000 n 0000098081 00000 n 0000134174 00000 n 0000060643 00000 n 0000044972 00000 n 0000046069 00000 n 0000134247 00000 n 0000134215 00000 n 0000149378 00000 n 0000060811 00000 n 0000046090 00000 n 0000049128 00000 n 0000149440 00000 n 0000255651 00000 n 0000268719 00000 n 0000149408 00000 n 0000170113 00000 n 0000060979 00000 n 0000049149 00000 n 0000054105 00000 n 0000170197 00000 n 0000170165 00000 n 0000203595 00000 n 0000061147 00000 n 0000054126 00000 n 0000054346 00000 n 0000215468 00000 n 0000203679 00000 n 0000203636 00000 n 0000224184 00000 n 0000061315 00000 n 0000054366 00000 n 0000054588 00000 n 0000240003 00000 n 0000224257 00000 n 0000224214 00000 n 0000254650 00000 n 0000061483 00000 n 0000054608 00000 n 0000058847 00000 n 0000254680 00000 n 0000256924 00000 n 0000260826 00000 n 0000268972 00000 n 0000269590 00000 n 0000270466 00000 n trailer << /Size 108 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 281548 %%EOF iozone3_508/docs/Run_rules.doc0000755000000000000000000006400015051766074015151 0ustar rootrootÐÏࡱá>þÿ /1þÿÿÿ.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì¥ÁG ¿&bjbjŽÙŽÙ *ì³ì³&ÿÿÿÿÿÿ]’’’’’’’¦¦¦¦¦ ²¦¶ ¶ââââââââ{ } } } } } } $l ô` „¡ ’âââââ¡ ª’’ââ⪪ªâ.’â’â{ ¦¦’’’’â{ ª&ªÐþ«¸’’{ âÎ@ ¥Ëþ¾¦¦šc Iozone run rules In order for Iozone results to be comparable, it is important that some basic rules be followed. The idea is that someone should be able to reproduce the same results given this report. The following is a list of rules. For buffer cache performance comparisons: For single stream results, be sure the file size is smaller than the buffer cache. For throughput results, be sure the aggregate of files is smaller than the buffer cache. The file size must also be at least 3 times the size of processor cache for both internal and external processor caches. For disk performance comparisons: For single stream results, be sure the file size is 3 times the size of the buffer cache. For throughput results, be sure the aggregate of files is 3 times the size of the buffer cache. For automatic mode (-a) Be sure that the buffer cache is less than or equal to 128 Megabytes. The benchmark will automatically start with small file sizes and increment up to 512 Megabytes. This will ensure that the results contain both in and out of buffer cache results. For NFS results: When publishing results for NFS, the system specification described below expands to include the complete hardware and software disclosure of all networking components and load generators. System specification disclosure: Report must include: Number of cpus in the system Total amount of memory in the system Total amount of buffer cache in the system Total number of disks in the system Complete description of the layout of the disks in the system Type of cpu, clock speed, processor cache sizes, external cache sizes Type of disk controllers Number of disk controllers Type of disks If using striping, include a complete description of the stripe layout Complete command line that was issued with Iozone for the given result. Version number of Iozone used for the tests. Version of the Operating system Availability dates of all software and hardware used. Type of filesystem being used. Total amount of NVRAM in the system. (including the disks, disk controllers) Date when tested. Any other hardware used in the test. Raw Iozone output file with the -R option enabled. Filesystems under test must have been cleaned (freshly created) before the test began. Minimum results include results for: Read, Write, Re-read, Re-write, Backward read, Strided read, and Random read. The results for mmap, threads, and async I/O are optional as not all vendors support everything that Iozone can test. Compiler options used to compile Iozone. Options used to create the filesystems. Options used to mount the filesystems. List of all tunables that were applied to the system. Company name if publishing for a company. Name of the person that ran the benchmark and their email address. Other requirements: The benchmark may not be modified. You may use any compiler options you wish. Any tuning that is done that benefits only this benchmark is not permitted. This includes special tunables in the operating system, or any commands or utilities that are used to enhance the results of Iozone and are not used for real customer needs. When running Iozone in any mode that is attempting to flush the data to disk, the data must make it to stable storage (where stable storage is defined to be: Data written is recoverable for a period of at least one week of power outage.) Use of hardware or software that is not available for purchase within a 6 month time period is not permitted. Use of hardware/software that will not be available for at least 6 months after publication is not permitted. The system under test must be in multiuser mode with all daemons that would normally be running. Review of results: Unlike other benchmarks, there is no review required for the results to be accepted. There are several reasons why this is not needed. We are all gentlemen and ladies and always act professionally. We all respect the golden rule and treat others as we would like to be treated. If you lie or cheat, you will only discredit yourself and your company. There is no way you won't get caught. The benchmark is publicly available for free. Your customers will download it and check the platform before they accept the machine or pay for it. If your company publishes bogus results that can not be reproduced, this may be interpreted as false advertising. Who knows, it may even get your company a nice lawsuit from a competitor. In general, if you feel guilty about your results, then don't make them available for others to see. Hostile publications: In these times of road rage, sometimes people will publish negative results about a product that are not true. In the event that any company or product has been attacked with bogus results, the company may run the benchmark themselves and publish correct results. The incorrect results may not be removed, but the new results will be added. In the event that a publishing conflict continues, the webmaster of the results page maintains the right to delete inaccurate hostile results from the archive. In the event of hostile floods, the webmaster of the results page reserves the right to block further publications from the person/company that is continuing the abuse. Any person/company that believes their product is being slandered is free to pursue the person/company for damages. The Iozone webmaster, authors, site owners, and friends are not liable for hostile publications. The Iozone results web page is like a chalkboard in the hallway of the internet. The maintainers reserve the right to remove graffiti, but are not responsible for what people may write on it. Web rules: The webmaster of the results page reserves the right to block publication of results if the intent of the publication is hostile. Hostility may take many forms. Publication of results that are known to be inaccurate, floods of publications in an attempt to overload the web site, publication of results that contain viruses are a few examples. If the webmaster perceives the intent to be hostile in nature, the publication may be refused. The webmaster reserves the right to control the submittal and publication process. ñCe!96G % Ûíi}¸Î&ûøööööööööö5�CJ$5�CJ$ðñBCef !9:56G  ' ( > [ € « üüúúúúõúúúðúúúëúúæúúúáÜÜÜ & F & F & F  & F & F & F$ðñBCef !9:56G  ' ( > [ € « Ï S l ‡ • Ü $ Q q § Æ  % J } Ô ¿ üùöóðíçáÛÕÏÉý·±«¥Ÿ™“�‡�{u                                                             +« Ï S l ‡ • Ü $ Q q § Æ  % J } Ô ¿ è 7m—ÚÛïðúúúúúúúúúúúúúúúúúúúúúúúúøøøó & F & F¿ è 7m—ÚÛïð@<*™hi|}E•Ý–R·¸ÎÎ#$%&úôîèâÜÙÓÍÇÁ»µ²¬¦ š”                                                     %@<*™hi|}E•Ý–R·¸ÎÎ#$%&úúúúúúøøøøøóóóóóóøøøøøøøøøø & F & F°Ð/ °à=!°"°#� $� %° [$@ñÿ$NormalmH <A@òÿ¡<Default Paragraph Font&*ÿÿÿÿ&« &¿ &l q C K ¥«(ÒÙôøX e ! )   = K ntnuŽ–(/nÍ(ÿÿ Don Capps*C:\DATA\MS\Iozone comparison run rules.doc Don Capps*C:\DATA\MS\Iozone comparison run rules.doc Don Capps*C:\DATA\MS\Iozone comparison run rules.doc Don Capps*C:\DATA\MS\Iozone comparison run rules.doc Don Capps*C:\DATA\MS\Iozone comparison run rules.doc Don Capps*C:\DATA\MS\Iozone comparison run rules.doc Don Capps*C:\DATA\MS\Iozone comparison run rules.docJCapps'C:\TEMP\Iozone comparison run rules.doc Don Capps*C:\DATA\MS\Iozone comparison run rules.doc Don Capps.\\RSNPERF\CAPPS\iozone_run_rules\Run_rules.doc ó?M ÿÿÿÿÿÿÿÿÿš© ÿÿÿÿÿÿÿÿÿ(TÍ ÿÿÿÿÿÿÿÿÿ„cÄ- ÿÿÿÿÿÿÿÿÿãþ@ ÿÿÿÿÿÿÿÿÿ¨'OW ÿÿÿÿÿÿÿÿÿãX¾f ÿÿÿÿÿÿÿÿÿ¢y:²¢šÿÿÿÿÿÿÿÿÿ !dz ÿÿÿÿÿÿÿÿÿ„h„˜þÆho(.„h„˜þÆho(.„h„˜þÆho(.„h„˜þÆho(.„h„˜þÆho(.„h„˜þÆho(.„h„˜þÆho(.„Є˜þÆÐo(.„h„˜þÆho(. ãX¾f¨'OWó?Mš©„cÄ-¢y !dz(TÍãþ@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ@€@“¶&P@G�Times New Roman5�€Symbol3&� Arial"pˆÐhÊr9FÊr9FáB9f~é *Ô¥À´´€20dsÿÿIozone comparison run rules Don Capps Don Cappsþÿ à…ŸòùOh«‘+'³Ù0ˆ�˜¼ÈÜèü  8 D P \hpx€äIozone comparison run rulesozo Don Cappspaon  Normal.dota Don Cappsa2n Microsoft Word 8.0u@FÃ#@†^Ðú¾@¼M˜Ëþ¾@¼M˜Ëþ¾~éþÿ ÕÍÕœ.“—+,ù®DÕÍÕœ.“—+,ù®T hpˆ�˜  ¨°¸À È ðäHewlett-Packard* sj Iozone comparison run rules Title˜ 6> _PID_GUIDäAN{89D73AC5-56F0-11D3-A7C6-0080C789BADA} þÿÿÿþÿÿÿ !"#$%þÿÿÿ'()*+,-þÿÿÿýÿÿÿ0þÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀF�—Ëþ¾à&¥Ëþ¾2€1TableÿÿÿÿÿÿÿÿWordDocumentÿÿÿÿÿÿÿÿ*SummaryInformation(ÿÿÿÿDocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿ&CompObjÿÿÿÿÿÿÿÿÿÿÿÿjÿÿÿÿÿÿÿÿÿÿÿÿܨÝAq ŒîA$ÞAÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿ ÀFMicrosoft Word Document MSWordDocWord.Document.8ô9²qiozone3_508/docs/IOzone_msword_98.doc0000755000000000000000000064000015051766073016310 0ustar rootrootÐÏࡱá>þÿ ›�þÿÿÿ—˜™šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì¥ÁyÀ ø¿)Œbjbj½½ ¡~ß{ß{å‚Cÿÿÿÿÿÿ·llÆÆ222ÿÿÿÿFFFF,rœFÝ:4Û+Û+Û+\:^:^:^:^:^:^:$<²Ã>R‚:2Û+c'xÛ+Û+Û+‚:ÆÆU—:—9—9—9Û+ªÆ¾2\:—9Û+\:—9—9ø9„® :ÿÿÿÿÐ @Ÿ,Íÿÿÿÿ…1.:H:­:0Ý::?³7ä? :?2 :(Û+Û+—9Û+Û+Û+Û+Û+‚:‚:—9Û+Û+Û+Ý:Û+Û+Û+Û+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ?Û+Û+Û+Û+Û+Û+Û+Û+Û+l Œ: Iozone Filesystem Benchmark IOzone is a filesystem benchmark tool. The benchmark generates and measures a variety of file operations. Iozone has been ported to many machines and runs under many operating systems. This document will cover the many different types of operations that are tested as well as coverage of all of the command line options. Iozone is useful for determining a broad filesystem analysis of a vendor’s computer platform. The benchmark tests file I/O performance for the following operations. Read, write, re-read, re-write, read backwards, read strided, fread, fwrite, random read/write, pread/pwrite variants, aio_read, aio_write, mmap, While computers are typically purchased with an application in mind it is also likely that over time the application mix will change. Many vendors have enhanced their operating systems to perform well for some frequently used applications. Although this accelerates the I/O for those few applications it is also likely that the system may not perform well for other applications that were not targeted by the operating system. An example of this type of enhancement is: Database. Many operating systems have tested and tuned the filesystem so it works well with databases. While the database users are happy, the other users may not be so happy as the entire system may be giving all of the system resources to the database users at the expense of all other users. As time rolls on the system administrator may decide that a few more office automation tasks could be shifted to this machine. The load may now shift from a random reader application (database) to a sequential reader. The users may discover that the machine is very slow when running this new application and become dissatisfied with the decision to purchase this platform. By using Iozone to get a broad filesystem performance coverage the buyer is much more likely to see any hot or cold spots and pick a platform and operating system that is more well balanced. Features: ANSII ‘C’ source. POSIX async I/O. Mmap() file I/O. Normal file I/O. Single stream measurement. Multiple stream measurement. POSIX pthreads. Multi-process measurement. Excel importable output for graph generation. I/O Latency data for plots. 64-bit compatible source. Large file compatible. Stonewalling in throughput tests to eliminate straggler effects. Processor cache size configurable. Selectable measurements with fsync, O_SYNC. Options targeted for testing over NFS. Building IOzone Once you have obtained the source for IOzone you should have 12 files. iozone.c (source code) libasync.c (source code) makefile (makefile) libbif.c (source code) Iozone_msword_98.doc (documentation in Word format) iozone.1 (documentation in nroff format) gnuplot.dem (sample gnuplot file ) gnuplotps.dem (sample gnuplot file that generates postscript output) read_telemetry (sample file for read telemetry file) write_telemetry (sample file for write telemetry file) Run_rules.doc (run rules to get reasonable results) Changes.txt (log of changes to Iozone since its beginning) Type: make The makefile will display a list of supported platforms. Pick the one that matches your configuration and then type: make target That’s it. You’re done. There is no need to have any install procedures as IOzone creates all of its files in the current working directory. Just copy Iozone to wherever you wish to test the filesystem performance and then run it. Or you can use the –f command line option to specify a target path, for example, a path/filename in a new filesystem. Before you run Iozone please read the run rules at the bottom of this document. Examples of running Iozone: The simplest way to get started is to try the automatic mode. iozone –a If you wish to generate graphs then you may wish to turn on Excel mode. iozone –Ra ( Output can be imported using space and tab delimited) Or iozone –Rab output.wks ( Output file “output.wks” is a binary format spreadsheet) If you have more than 512 Mbytes of memory then you need to increase the maximum file size to a larger value. For example if your system has 1 Gbyte of memory then you would want to try something like: iozone –Ra –g 2G If you only care about read/write and do not wish to spend the time to perform all of the tests, then you may wish to limit the testing like: iozone –Ra –g 2G –i 0 –i 1 If you are running Iozone over NFS on an NFS client then you may wish to use: iozone –Rac This tells Iozone to include the close() in the measurement. This may be needed if the client is running NFS version 3. Including the close() helps to reduce the client side cache effects of NFS version 3. If you use a file size that is larger than the amount of memory in the client then the ‘c’ flag is not needed. Definitions of the tests Write: This test measures the performance of writing a new file. When a new file is written not only does the data need to be stored but also the overhead information for keeping track of where the data is located on the storage media. This overhead is called the “metadata” It consists of the directory information, the space allocation and any other data associated with a file that is not part of the data contained in the file. It is normal for the initial write performance to be lower than the performance of re-writing a file due to this overhead information. Re-write: This test measures the performance of writing a file that already exists. When a file is written that already exists the work required is less as the metadata already exists. It is normal for the rewrite performance to be higher than the performance of writing a new file. Read: This test measures the performance of reading an existing file. Re-Read: This test measures the performance of reading a file that was recently read. It is normal for the performance to be higher as the operating system generally maintains a cache of the data for files that were recently read. This cache can be used to satisfy reads and improves the performance. Random Read: This test measures the performance of reading a file with accesses being made to random locations within the file. The performance of a system under this type of activity can be impacted by several factors such as: Size of operating system’s cache, number of disks, seek latencies, and others. Random Write: This test measures the performance of writing a file with accesses being made to random locations within the file. Again the performance of a system under this type of activity can be impacted by several factors such as: Size of operating system’s cache, number of disks, seek latencies, and others. Random Mix: This test measures the performance of reading and writing a file with accesses being made to random locations within the file. Again the performance of a system under this type of activity can be impacted by several factors such as: Size of operating system’s cache, number of disks, seek latencies, and others. This test is only available in throughput mode. Each thread/process runs either the read or the write test. The distribution of read/write is done on a round robin basis. More than one thread/process is required for proper operation. Backwards Read: This test measures the performance of reading a file backwards. This may seem like a strange way to read a file but in fact there are applications that do this. MSC Nastran is an example of an application that reads its files backwards. With MSC Nastran, these files are very large (Gbytes to Tbytes in size). Although many operating systems have special features that enable them to read a file forward more rapidly, there are very few operating systems that detect and enhance the performance of reading a file backwards. Record Rewrite: This test measures the performance of writing and re-writing a particular spot within a file. This hot spot can have very interesting behaviors. If the size of the spot is small enough to fit in the CPU data cache then the performance is very high. If the size of the spot is bigger than the CPU data cache but still fits in the TLB then one gets a different level of performance. If the size of the spot is larger than the CPU data cache and larger than the TLB but still fits in the operating system cache then one gets another level of performance, and if the size of the spot is bigger than the operating system cache then one gets yet another level of performance. Strided Read: This test measures the performance of reading a file with a strided access behavior. An example would be: Read at offset zero for a length of 4 Kbytes, then seek 200 Kbytes, and then read for a length of 4 Kbytes, then seek 200 Kbytes and so on. Here the pattern is to read 4 Kbytes and then Seek 200 Kbytes and repeat the pattern. This again is a typical application behavior for applications that have data structures contained within a file and is accessing a particular region of the data structure. Most operating systems do not detect this behavior or implement any techniques to enhance the performance under this type of access behavior. This access behavior can also sometimes produce interesting performance anomalies. An example would be if the application’s stride causes a particular disk, in a striped file system, to become the bottleneck. Fwrite: This test measures the performance of writing a file using the library function fwrite(). This is a library routine that performs buffered write operations. The buffer is within the user’s address space. If an application were to write in very small size transfers then the buffered & blocked I/O functionality of fwrite() can enhance the performance of the application by reducing the number of actual operating system calls and increasing the size of the transfers when operating system calls are made. This test is writing a new file so again the overhead of the metadata is included in the measurement. Frewrite: This test measures the performance of writing a file using the library function fwrite(). This is a library routine that performs buffered & blocked write operations. The buffer is within the user’s address space. If an application were to write in very small size transfers then the buffered & blocked I/O functionality of fwrite() can enhance the performance of the application by reducing the number of actual operating system calls and increasing the size of the transfers when operating system calls are made. This test is writing to an existing file so the performance should be higher as there are no metadata operations required. Fread: This test measures the performance of reading a file using the library function fread(). This is a library routine that performs buffered & blocked read operations. The buffer is within the user’s address space. If an application were to read in very small size transfers then the buffered & blocked I/O functionality of fread() can enhance the performance of the application by reducing the number of actual operating system calls and increasing the size of the transfers when operating system calls are made. Freread: This test is the same as fread above except that in this test the file that is being read was read in the recent past. This should result in higher performance as the operating system is likely to have the file data in cache. Specialized tests: Mmap: Many operating systems support the use of mmap() to map a file into a user’s address space. Once this mapping is in place then stores to this location in memory will result in the data being stored going to a file. This is handy if an application wishes to treat files as chunks of memory. An example would be to have an array in memory that is also being maintained as a file in the files system. The semantics of mmap files is somewhat different than normal files. If a store to the memory location is done then no actual file I/O may occur immediately. The use of the msyc() with the flags MS_SYNC, and MS_ASYNC control the coherency of the memory and the file. A call to msync() with MS_SYNC will force the contents of memory to the file and wait for it to be on storage before returning to the application. A call to msync() with the flag MS_ASYNC tells the operating system to flush the memory out to storage using an asynchronous mechanism so that the application may return into execution without waiting for the data to be written to storage. This test measures the performance of using the mmap() mechanism for performing I/O. Async I/O: Another mechanism that is supported by many operating systems for performing I/O is POSIX async I/O. The application uses the POSIX standard async I/O interfaces to accomplish this. Example: aio_write(), aio_read(), aio_error(). This test measures the performance of the POSIX async I/O mechanism. Command Line options: The following is the output from the built in help. Each option’s purpose is explained in this section of the manual. Usage: iozone [-s filesize_Kb] [-r record_size_Kb ] [-f [path]filename] [-i test] [-E] [-p] [-a] [-A] [-z] [-Z] [-m] [-M] [-t children] [-h] [-o] [-l min_number_procs] [-u max_number_procs] [-v] [-R] [-x] [-d microseconds] [-F path1 path2...] [-V pattern] [-j stride] [-T] [-C] [-B] [-D] [-G] [-I] [-H depth] [-k depth] [-U mount_point] [-S cache_size] [-O] [-K] [-L line_size] [-g max_filesize_Kb] [-n min_filesize_Kb] [-N] [-Q] [-P start_cpu] [-c] [-e] [-b filename] [-J milliseconds] [-X filename] [-Y filename] [-w] [-W] [-y min_recordsize_Kb] [-q max_recordsize_Kb] [-+m filename] [-+n] [-+N] [-+u ] [ -+d ] [-+p percent_read] [-+r] [-+t ] [-+A #] What do they all mean ? -a Used to select full automatic mode. Produces output that covers all tested file operations for record sizes of 4k to 16M for file sizes of 64k to 512M. -A This version of automatic mode provides more coverage but consumes a bunch of time. The –a option will automatically stop using transfer sizes less than 64k once the file size is 32 MB or larger. This saves time. The –A option tells Iozone that you are willing to wait and want dense coverage for small transfers even when the file size is very large. NOTE: This option is deprecated in Iozone version 3.61. Use –az –i 0 –i 1 instead. -b filename Iozone will create a binary file format file in Excel compatible output of results. -B Use mmap() files. This causes all of the temporary files being measured to be created and accessed with the mmap() interface. Some applications prefer to treat files as arrays of memory. These applications mmap() the file and then just access the array with loads and stores to perform file I/O. -c Include close() in the timing calculations. This is useful only if you suspect that close() is broken in the operating system currently under test. It can be useful for NFS Version 3 testing as well to help identify if the nfs3_commit is working well. -C Show bytes transferred by each child in throughput testing. Useful if your operating system has any starvation problems in file I/O or in process management. -d # Microsecond delay out of barrier. During the throughput tests all threads or processes are forced to a barrier before beginning the test. Normally, all of the threads or processes are released at the same moment. This option allows one to delay a specified time in microseconds between releasing each of the processes or threads. -D Use msync(MS_ASYNC) on mmap files. This tells the operating system that all the data in the mmap space needs to be written to disk asynchronously. -e Include flush (fsync,fflush) in the timing calculations -E Used to select the extension tests. Only available on some platforms. Uses pread interfaces. -f filename Used to specify the filename for the temporary file under test. This is useful when the unmount option is used. When testing with unmount between tests it is necessary for the temporary file under test to be in a directory that can be unmounted. It is not possible to unmount the current working directory as the process Iozone is running in this directory. -F filename filename filename … Specify each of the temporary file names to be used in the throughput testing. The number of names should be equal to the number of processes or threads that are specified. -g # Set maximum file size (in Kbytes) for auto mode. -G Use msync(MS_SYNC) on mmap files. This tells the operating system that all the data in the mmap space needs to be written to disk synchronously. -h Displays help screen. -H # Use POSIX async I/O with # async operations. Iozone will use POSIX async I/O with a bcopy from the async buffers back into the applications buffer. Some versions of MSC NASTRAN perform I/O this way. This technique is used by applications so that the async I/O may be performed in a library and requires no changes to the applications internal model. -i # Used to specify which tests to run. (0=write/rewrite, 1=read/re-read, 2=random-read/write 3=Read-backwards, 4=Re-write-record, 5=stride-read, 6=fwrite/re-fwrite, 7=fread/Re-fread, 8=random mix, 9=pwrite/Re-pwrite, 10=pread/Re-pread, 11=pwritev/Re-pwritev, 12=preadv/Re-preadv). One will always need to specify 0 so that any of the following tests will have a file to measure. -i # -i # -i # is also supported so that one may select more than one test. -I Use DIRECT I/O for all file operations. Tells the filesystem that all operations are to bypass the buffer cache and go directly to disk. This also will use VX_DIRECT on VxFS, and O_DIRECT on Linux, and directio() on Solaris. -j # Set stride of file accesses to (# * record size). The stride read test will read records at this stride. -J # (in milliseconds) Perform a compute delay of this many milliseconds before each I/O operation. See also -X and -Y for other options to control compute delay. -k # Use POSIX async I/O (no bcopy) with # async operations. Iozone will use POSIX async I/O and will not perform any extra bcopys. The buffers used by Iozone will be handed to the async I/O system call directly. -K Generate some random accesses during the normal testing. -l # Set the lower limit on number of processes to run. When running throughput tests this option allows the user to specify the least number of processes or threads to start. This option should be used in conjunction with the -u option. -L # Set processor cache line size to value (in bytes). Tells Iozone the processor cache line size. This is used internally to help speed up the test. -m Tells Iozone to use multiple buffers internally. Some applications read into a single buffer over and over. Others have an array of buffers. This option allows both types of applications to be simulated. Iozone’s default behavior is to re-use internal buffers. This option allows one to override the default and to use multiple internal buffers. -M Iozone will call uname() and will put the string in the output file. -n # Set minimum file size (in Kbytes) for auto mode. -N Report results in microseconds per operation. -o Writes are synchronously written to disk. (O_SYNC). Iozone will open the files with the O_SYNC flag. This forces all writes to the file to go completely to disk before returning to the benchmark. -O Give results in operations per second. -p This purges the processor cache before each file operation. Iozone will allocate another internal buffer that is aligned to the same processor cache boundary and is of a size that matches the processor cache. It will zero fill this alternate buffer before beginning each test. This will purge the processor cache and allow one to see the memory subsystem without the acceleration due to the processor cache. -P # Bind processes/threads to processors, starting with this cpu #. Only available on some platforms. The first sub process or thread will begin on the specified processor. Future processes or threads will be placed on the next processor. Once the total number of cpus is exceeded then future processes or threads will be placed in a round robin fashion. -q # Set maximum record size (in Kbytes) for auto mode. One may also specify -q #k (size in Kbytes) or -q #m (size in Mbytes) or -q #g (size in Gbytes). See –y for setting minimum record size. -Q Create offset/latency files. Iozone will create latency versus offset data files that can be imported with a graphics package and plotted. This is useful for finding if certain offsets have very high latencies. Such as the point where UFS will allocate its first indirect block. One can see from the data the impacts of the extent allocations for extent based filesystems with this option. -r # Used to specify the record size, in Kbytes, to test. One may also specify -r #k (size in Kbytes) or -r #m (size in Mbytes) or -r #g (size in Gbytes). -R Generate Excel report. Iozone will generate an Excel compatible report to standard out. This file may be imported with Microsoft Excel (space delimited) and used to create a graph of the filesystem performance. Note: The 3D graphs are column oriented. You will need to select this when graphing as the default in Excel is row oriented data. -s # Used to specify the size, in Kbytes, of the file to test. One may also specify -s #k (size in Kbytes) or -s #m (size in Mbytes) or -s #g (size in Gbytes). -S # Set processor cache size to value (in Kbytes). This tells Iozone the size of the processor cache. It is used internally for buffer alignment and for the purge functionality. -t # Run Iozone in a throughput mode. This option allows the user to specify how many threads or processes to have active during the measurement. -T Use POSIX pthreads for throughput tests. Available on platforms that have POSIX threads. -u # Set the upper limit on number of processes to run. When running throughput tests this option allows the user to specify the greatest number of processes or threads to start. This option should be used in conjunction with the -l option. -U mountpoint Mount point to unmount and remount between tests. Iozone will unmount and remount this mount point before beginning each test. This guarantees that the buffer cache does not contain any of the file under test. -v Display the version of Iozone. -V # Specify a pattern that is to be written to the temporary file and validated for accuracy in each of the read tests. -w Do not unlink temporary files when finished using them. Leave them present in the filesystem. -W Lock files when reading or writing. -x Turn off stone-walling. Stonewalling is a technique used internally to Iozone. It is used during the throughput tests. The code starts all threads or processes and then stops them on a barrier. Once they are all ready to start then they are all released at the same time. The moment that any of the threads or processes finish their work then the entire test is terminated and throughput is calculated on the total I/O that was completed up to this point. This ensures that the entire measurement was taken while all of the processes or threads were running in parallel. This flag allows one to turn off the stonewalling and see what happens. -X filename Use this file for write telemetry information. The file contains triplets of information: Byte offset, size of transfer, compute delay in milliseconds. This option is useful if one has taken a system call trace of the application that is of interest. This allows Iozone to replicate the I/O operations that this specific application generates and provide benchmark results for this file behavior. (if column 1 contains # then the line is a comment) -y # Set minimum record size (in Kbytes) for auto mode. One may also specify -y #k (size in Kbytes) or -y #m (size in Mbytes) or -y #g (size in Gbytes). See –q for setting maximum record size. -Y filename Use this file for read telemetry information. The file contains triplets of information: Byte offset, size of transfer, compute delay in milliseconds. This option is useful if one has taken a system call trace of the application that is of interest. This allows Iozone to replicate the I/O operations that this specific application generates and provide benchmark results for this file behavior. (if column 1 contains # then the line is a comment) -z Used in conjunction with -a to test all possible record sizes. Normally Iozone omits testing of small record sizes for very large files when used in full automatic mode. This option forces Iozone to include the small record sizes in the automatic tests also. -Z Enable mixing mmap I/O and file I/O. -+m filename Use this file to obtain the configuration information of the clients for cluster testing. The file contains one line for each client. Each line has three fields. The fields are space delimited. A # sign in column zero is a comment line. The first field is the name of the client. The second field is the path, on the client, for the working directory where Iozone will execute. The third field is the path, on the client, for the executable Iozone. To use this option one must be able to execute commands on the clients without being challenged for a password. Iozone will start remote execution by using “rsh”. -+n No retests selected. Use this to prevent retests from running. -+N No truncating or deleting of previous test file before the sequential write test. Useful only after -w is used in previous command to leave the test file in place for reuse. This flag is of limited use, when a single retest is not enough, or to easily control when sequential write retests occur without file truncation or deletion. -+u Enable CPU utilization mode. -+d Enable diagnostic mode. In this mode every byte is validated. This is handy if one suspects a broken I/O subsystem. -+p percent_read Set the percentage of the thread/processes that will perform random read testing. Only valid in throughput mode and with more than 1 process/thread. -+r Enable O_RSYNC and O_SYNC for all I/O testing. -+t Enable network performance test. Requires -+m -+A Enable madvise. 0 = normal, 1=random, 2=sequential, 3=dontneed, 4=willneed. For use with options that activate mmap() file I/O. See: -B What can I see: The following are some graphs that were generated from the Iozone output files.  From the graph above one can clearly see the buffer cache helping out for file sizes that are less than 256MB but after that the actual disk I/O speed can be seen. Also note that the processor cache effects can be seen for file sizes of 16 Kbytes to 1Mbyte.  The graph above is displaying the impact of re-reading a file. Notice that the processor cache is now very important and causes the sharp peak. The next plateau to the right is buffer cache and finally above 256MB the file no longer fits in the buffer cache and real spindle speeds can be seen.  The graph above was created by running Iozone multiple times and then graphing the combination of the results. Here the graph is showing the throughput performance as a function of processes and number of disks participating in a filesystem. (disk striping) The good news is that on this system as one adds disks the throughput increases. Not all platforms scale so well.  The graph above shows single stream performance where file size and request size are changed. The place on the lower right that touches the floor of the graph is not actual data. Excel graphs empty cells as containing a zero. This run was taken with the –a option. If one used the –A option then the area that was not tested would have been tested and had real values. Normally this is not a desirable area to test because it is very time consuming to write a 512MB file in 4k transfer sizes. The –a option in Iozone tells Iozone to discontinue use of transfer sizes less than 64k once the file size is 32MB or bigger. This saves quite a bit of time. Notice the ridge that runs from the top left to the lower right down the center of the graph. This is where the request size fits in the processor cache. For file sizes less than the size of the processor cache you can see the rise in performance as well. When both the file size and the transfer size is less than the processor cache it rises even higher. Although interesting to see, it is unlikely that you will be able to get applications to never write files that are bigger than the processor cache ( However it might be possible to get applications to try to re-use buffers and keep the buffer size smaller than the processor cache size.   The graph above is an example of a real system with some interesting “optimizations”. Here one can see that there are some file sizes and some record sizes that have very bad performance. Notice the performance dip at record sizes of 128Kbytes. (Anomaly #1) There is also a dropoff for file sizes of 8 MB and larger. The dropoff for files greater than 8MB is very interesting since this machine has 16 GB of memory and an 8GB buffer cache. This is a classic example of tuning for a specific application. If the poor system administrator ever installs an application that likes to read or write files in a record size of 128 Kbytes to 1 Mbyte his users will probably take him out back for a conference. If the system would have been characterized before it was purchased it would never have made it into the building. Another type of graph that can be produced is the Latency graph. When the -Q option is used Iozone will generate four .dat files. Rol.dat, wol.dat, rwol.dat and rrol.dat. These are read offset latency, write offset latency, rewrite offset latency and reread offset latency. These files can be imported into Excel and then graphed. The latency versus offset information is useful for seeing if there are any particular offsets in a file that have high latencies. These high latencies can be caused by a variety of causes. An example would be if the file size is just a bit bigger than the buffer cache size. The first time the file is written the latency will be low for each transfer. This is because the writes are going into the buffer cache and the application is allowed to continue immediately. The second time the file is written the latencies will be very high. This is due to the fact that the buffer cache is now completely full of dirty data that must be written before the buffer can be reused. The reason that this occurs when the file is bigger than the buffer cache is because the write to the first block on the rewrite case will not find the block in the buffer cache and will be forced to clean a buffer before using it. The cleaning will take time and will cause a longer latency for the write to complete. Another example is when the filesystem is mounted from a remote machine. The latency graphs can help to identify high latencies for files that are being accessed over the network. The following are a few latency graphs for file I/O over an NFS version 3 filesystem.     In the re-read latency graph one can clearly see the client side cache that is in NFS Version 3. The reread latencies are clearly not the latencies that one would get if the reads actually went to the NFS server and back. Run rules: If you wish to get accurate results for the entire range of performance for a platform you need to make sure that the maximum file size that will be tested is bigger than the buffer cache. If you don't know how big the buffer cache is, or if it is a dynamic buffer cache then just set the maximum file size to be greater than the total physical memory that is in the platform. In general you should be able to see three or four plateaus. File size fits in processor cache. File size fits in buffer cache File size is bigger than buffer cache. You may see another plateau if the platform has a primary and secondary processor caches. If you don't see at least 3 plateaus then you probably have the maximum file size set too small. Iozone will default to a maximum file size of 512 Mbytes. This is generally sufficient but for some very large systems you may need to use the –g option to increase the maximum file size. See the file Run_rules document in the distribution for further information. Source code availability Iozone is available for free. One might consider using it before your company purchases its next platform. Additional notes on how to make the graphs Iozone sends Excel compatible output to standard out. This may be redirected to a file and then processed with Excel. The normal output for Iozone as well as the Excel portion are in the same output stream. So to get the graphs one needs to scroll down to the Excel portion of the file and graph the data in that section. There are several sets of graph data. "Writer report" is one example. When importing the file be sure to tell Excel to import with "delimited" and then click next, then click on the "space delimited" button. To graph the data just highlight the region containing the file size and record size and then click on the graph wizard. The type of graph used is "Surface". When the next dialog box pops up you need to select "Columns". After that the rest should be straight forward. Contributors: http://www.iozone.org Original Author: William D. Norcott. wnorcott@us.oracle.com Features & extensions: Don Capps capps@iozone.org Not measured I/O performance after caches are exceeded Buffer cache effect CPU cache effect Buffer cache effect Not measured I/O performance after caches are exceeded CPU cache effect Buffer cache effect CPU cache effect Not measured Anomaly #2 Anomaly #1 Not measured Buffer cache effect CPU cache effect  š ÎØ£¥ZvQYnr·¾æñ!(!X"b"ˆ$–$¨&¶&Z)f)Å,Ë,//7/º1¿1Â3É3®4Á4Ã4Ç4?9H9y:�:R=^=°=²=O>Q>«>­>-?/?µ?º?ò?ÿ? @@k@m@›A�AžB BACEC–D˜D-E/EiEkEÊEÌEÍEÕEAGCGDG`GHHFHHHÜHÞHü÷üòüòüëòüòüòüòüòüòüòüòüòüòüòüòüòüòüòüòüòüòüòüòüçüòüòüòüòüòüòüòüòüòüòüòüòüòüòüòüòüòüòüòüòüòhT`Ž hÔ6®5�CJ hÔ6®5� hÔ6®6�hÔ6®[a   ™ š ÍÎØêû 8Ue€®Êäû<_‹²³ýûûûûùùûûûôôôôôôôôôôôôôôôôî„Ð^„Ð & F³ÄÅ(CZt©Ó÷<rªß'¨XYZvw·¹Åýûûööööööööööööððððûûûûûûûûû„Ð^„Ð & FÅÆjtÉÊ–©ª9:WX§¨·¹ˆ÷øùûOPlýýýýýýýýýýýýýýýýýýýýýý÷õòòýý$„Ð^„Ðlmµ¶äå!!V"W"†$‡$¦&§&X)Y)�*c+ò+Ã,Ä,Ç.-/./=1¸1¹1À3Á3­4ýýýýýýýýýýýýýýýýýýýýýýýýýýýýý­4®4Á4Â4Z6è8=9>9:v:w:z:�:‘:;;P;š;Õ;<Y<—<Ý<=R=•=–=¯=ýýýýýýýýýýýý÷ýýýñ÷÷÷÷÷÷÷÷ýï„Ð`„ЄÐ^„Я=°=³=>N>O>R>§>ÿ>]?µ? @ @@j@k@n@Å@!AzAšA›AžAþAWB�BžBý÷ññý÷ñññññý÷ññêññññýêããñý$„Ð`„Ð$„ø^„ø„Ð`„Єø^„øžB¡B÷B@CACFC£CDSD•D–D™DñD,E-E0EhEiElEÉEÊE×E,F…FãF@GAGaGùóóñùóóóóñùóóñùóóùóñùëëëëñù„Ð^„ЄÐ`„Єø^„øaG»GHHHEHFHIH¥HÛHÜHßHõHöHûHPI¦IþI\J]JbJ¼JK{KÝK)Lùù÷ñëëñùù÷ñù÷ñùùùù÷äÝÝÚÚë$$„Ð^„Ð$„ø^„ø„Ð^„Єø^„ø„Ð`„ÐÞHöHøHùHúHII]JaJÝKëK*L,L8LeReWenepe“eŸedggg€g‚gnhph—h¤h k k,kLkOkSk l¢l¦lÅlÉl=m>mCmçmëmn nOnSnÛnîn>oFoGoLpTpü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷ü÷üðüéåÞåéÞåðüðü÷ðüðüðüðü÷üÐÈüÐjhÔ6®UjhÔ6®UmHnHu hT`ŽhT`ŽhT`Ž hT`Ž5�\� hÔ6®5�\� hÔ6®5�hÔ6®Mr]É]!^_^`^o^Ã^ _D_E_H_g_h_m_Ê_â_ã_æ_E`F`I`m`n`r`Ô`5aøõïíçáááíçßíçááíØïïçïïçáá$„ø^„ø„Ð`„Єø^„ø„Ð^„Ð$$„Ð^„Ð5a”aîaKb¥búbûbcccÄcÎdÏdÔdeje’e“eŸeùeZfcgdgggÅg'hmhùùùùù÷ñïéééñééééñïéééâÛÛé$„Ð^„Ð$„ø^„ø„Ð^„Єø^„ø„Ð`„Ðmhnhqh–h—h¤hejk k kNkOkSk¡l¢l¦lÄlÅlÉl=m>mPmæmçmëmùóññëññéàÛÛàÛÛëññëùùÔññÔ$„#^„#gdT`Ž„^„gdT`Ž„^„„ø^„ø„Ð^„Ðëmnn nNnOnSnŸnÛnÝnínîn>oHoIoLpVp}q~q€q�qörþrÿrsxx"xýýöýýöýýðîîîîîîîîîîîîîîîîîî„Ð^„Ð$„#^„#TpUp~qqörürýr‡wˆwxxx!x“�”�•�–�˜�™�š�›���|‚ˆ‚s†Œ†ø†ù†$‡GŠJŠoŠåŠòŠóŠ‹‹2‹3‹D‹E‹Y‹Z‹g‹h‹’‹“‹¤‹¥‹¹‹º‹Ë‹Ì‹Ù‹Ú‹å‹æ‹ñ‹ò‹ÿ‹ŒŒŒ&Œ'Œ(Œ÷óëóÝÕóÉÀÝÀÝÀÝÀÝÀÝÀÝÀó»ó»óÀ°Àó»ó©ó©ó©ó©ó©ó©ó©ó©ó©ó©ó©ó©ó©ó©ó©ó©ó¥h*‰ hÔ6®5�CJhÔ6®5�mHnHu hÔ6®5�hÔ6®mHnHu jJðhÔ6®mHnHuj�hÔ6®UjhÔ6®UmHnHuj úhÔ6®UhÔ6®j‹|hÔ6®UA"x#xU{V{¢|����’�“�•�—�˜�š�œ���{‚|‚‡‚ˆ‚„A„e„…„­„r†s†Œ†�†ø†ù†ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýù†$‡%‡HŠIŠJŠoŠ®ŠãŠäŠåŠòŠóŠ‹‹2‹3‹D‹E‹Y‹Z‹g‹h‹’‹“‹¤‹¥‹¹‹º‹Ë‹ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýË‹Ì‹Ù‹Ú‹å‹æ‹ñ‹ò‹ÿ‹ŒŒŒ&Œ'Œ(Œ)Œýýýýýýýýýýýýýýý(Œ)ŒühÔ6®(°Ð/ °à=!°"°#� $� %°°Ð°Ð �ÐnðÝTß…a†¥]_šzJÔ�<_uÿ‰PNG  IHDR�oì„ PLTEff€ÿfÌ€€ÿÿ€™3f€€ÿÿÿÿ€€€™™ÿÿ€€ÀÀÀÌÌÿÌÿÿÿÿÌÿÿÿWá3bKGDˆH IDATxœí��š¤(°¦™ÞÞÝÙé:]Õ�÷¯[™  šñ=3�Š(¨¼F å&“i¹Ù0™LAÆ£É´ŽŒG“i�&Ó:2M¦ud<šLëÈx4™Ö‘ñh2­#ãÑdZGÆ£É´ŽŒG“i�&Ó:2M¦ud<šLëÈx4™Ö‘ñh2­#ãÑdZGÆ£É´ŽŒG“i�&Ó:2M¦ud<šLëÈx4™Ö‘ñh2­#ãq¶Ü.>O’—:LÿÊ™N–ÝÃÙr 3‘¬"Ò¦KÈîálí±8E©¬ã=d·q¶pÖ¢½{þ¦yÒ¬¯Í>»ƒ‰û&�ÓgzÀ£+ž¦³d7a¶ WùÒ#1ËàÁƒ�+7Æ…¸óòoš)»³å<öÀ‚¶ Ï VÓ=à:ºG¹Í4Wv f À|9ZÄ"/°v!G\̉c+lš'»³-Y首<‚ݪy,÷0W“Ý‚ÙJû„!Ñ`=2³ý�È1³ƒ˜¦ËîÃlÁ˜)Ñ×s(�%±i±äñQòè²Ó\Ù-˜­Øµ{Ä0g<‚¬ðo™ÑF<\‹¯.%»³b5áß=òR0cŸlqebÚ|„£E‚áÑLse7ÁdZGÆ£É´ŽŒG“i�&Ó:2M¦ud<šLëÈx4™Ö‘ñh2­#ãÑdZGÆ£É´ŽŒG“i�&Ó:2M¦ud<šLëÈx4™Ö‘ñh2­#ãÑdZGÆ£É´ŽŒG“i�&Ó:2M¦ud<šLëÈx4™Ö‘ñh2­#ãÑdZGÆ£É´ŽŒG“i�&Ó:2M¦ud<šLëÈx4™Ö‘ñh2­#ãÑdZGÆãP}xÍ®ˆé2‡Ècøù­í#Ó¤�ñØU�C¯dÅÈ4q2»(áÐe¦«q³‘iÊe<fÕ<Æ#Ó´Éxlgx™�Ì·–ñX%�=<ÄcL02ßQÆ£J)‡Žç©�àFæÛÈxd…ÚóyŒ FæÝe<¢bíá<c‚‘yO�‰TöpÁá�ÌÉx|‰�—®ÍcL12¯¯÷æñµ‡Wåid^TïÉcU÷ð‚<Æ#óZz/›º‡—æTÃȼ€ÞƒÇCÝÛðSŒÌuuo»toÇ#¨š‘¹˜îÉ#àPÑ*ߗǘb`®¡{ñˆØCã±.ÅLæT݃ÇÈaKË5Ñ$#s‚NâÑ}K÷S¥Ò®Æã÷I}<Ϭæð‹ðedž¦sxtÛ?Š�|óh€í,ݦÏÝ>:®ÇcL22ëDÕùŸvs{¸"�Ä]Øf˜áB¶ÀÎ3 RØÃÕx¤ì[%�] æ<šÍ<¬³yt‘Ç=·¦ Ìâ15h�xÌ,æåxŒ22«t2�À ^‘ÇÒµTìß>þèJ2©]–åÑlf•Nïˆ.ëÅx̰8‹G²—ä1ÊÈ$uê|€­M鿬Á#nžÎç1«Oi0/Å£ÙLRËΗ›ÌcÒì×á1$ ³˜çòed¾dø(ºRøýšÈ#á2ãýÇÎóã*n1�Ç:Ó_=ʣƴÌàQp™ùxŽ*~²�!-szÆãвy$c5ÓyÔt­tñU6~²�øCEU€ñÈè4_�ÃZyãKÀã÷:gšxŒkMs.�!­¨¼Úf�/­hõ¸]�G¬f]yô usÃ"m1�›Gã±WY}â9u)Ýx¤ƒ‹CxŒkƒ¹�1MÕé¯J4»•uMÅ5–GŸ[öux ±úÖ}¤uÅñŽº”<’-h �auWç1¦àž¬ñøÒ…ç(SZx”¢Sy I5Z̾<†4'ÔŸJ4§h�xbMÊÖâ¬Åc\'c?Æã::™GöY½6�!%m×#=ØîiHý©œÆã�Å£&zyÃ2aoVç1,Óó)ãq†Æón¹€[-�Ùú¼÷óf}c"Ê¥ñ8Cy¬ ×\–Ǹ¨ï ­ÅcX€g`<ÎЕ~Üíxô)²Á\”ǘò-ãq†úòÈ:ކǸDöÏçñ)ãq†:ñØ!\sC}BÉ¥ñ8U÷åÑ·´†.fGÝöýœª£ŸÈcXpôå2OÔ yÌù³x µøøüLüÃyŒ)b@šñ¸éV<¢}¢óy̪ñQl:ü�æq<ú$èÉ�çéÖL°\‘ǸŽG~ŒÇ1º:�Ec™Ä#3ŒÀÄs´�}"�>I)1;è²ïwPûÓyPE|Ujì ðVˆg¾«ñX©ë½ÿÈ»zgòHv°ªy KD[_ˆÇ�VÖÕx<® }@ 9‰Ç´&ÝxLϽçЉµ#<†¥P[ãñ¸.Á£o��lÀQÖ�Ǽ°•yŒIº¦ñÈé\÷>â%¿÷ȸɣxô«eC_‘GŸ–T×x¬Ó‰<ª¿¿< ‘“sx,ër.�iUùG-»˜x «êÞp]¢ñØ­¤‹}ÏŠt”çð˜ÖJ¨Ã|CZÎ¥ñHë¼ï“ƒúñØÒ¸U<ò-h.�ŸX3_˜Ç°LLjgãqp95�tïli}J�à×9<†Peãñ¥uçËu{RÞ'\_“G¿@z…Ëñª"?Æã�Á£ÒÕ»�!¡8·ey ‰ªÈ�ñ8Gcyäb!÷àÑÿÒnør<†.òc<ÎÑ(åX­xô«X _•Ç�ˆÖÚxœ¢N<‚„ýÞÖâv�ÇÈ9<ú”¤�/ÏcXÕ¾3ŽïÂcò”}ký²>è3�G¤vîÞŸ{¼?�/m(�ò­fðèS .׿ñ)ãqŽŽòèZ}ëîÄ£¯ø U[qy KäÕ2ÏÔ-y‚æãyL+ðQl©´×'ðXU¿“ҌǥÔÂ#Ö):•G¬H€•�ªÌãÑ'%\`ê˜)4WR�ô(ÛI<Ò ˜ð ‚*óy*h<ŽÒ x”r3<ÈcÑfÕ<Âý«Ná,÷¤Ò�=À£=ãq%É·}xŸÉã^a‘ÇähšÒ³y K\ØÇxì óÞt=?øH{§'ñ˜< :ñÖ%ƒ;�Ç�¢ê§W¤�»N}ÿ±Ç%×n8�ŠäAÓ˜ŠX!ö µ)UF.uc�Ç:Õ_u¾¸&uÞéH)>ÆðèWt¶h�a…Šú�µº�5Þéy«<”Ç=A²E3yܓʨ�ñX«Óyt |dnÐp5Vù Óú,ÉcXˆu4+uú÷W ~ðßÔ`!÷Áb7§ôà1$à�ã‘ѹß_]ôƒ�bOu=ý¯oó+ò¸§åÏã‘ѹß_]”ÇÜÕªí`Îã1¬—¦h(�Z?´ôüñ¸�ñ¸ëÜï¯.ÌcÒT.Çãžür<†4]À˜J4»”óR·ù5)R¤y\•G¿¢í¸ÍáqÿÆT¢ñ8I'ðH…/Îãž"wÜfòVi/Öx\ICyä[ê=x K1Ÿóyô‰ª.ðSgñèNT,ô¤“kÐ ±§ñ½yô ª?�G¿ª9™Ç“ÊIŠz'Ã�[sOÏù~ŽþÊ@,ä1$`ÏÍ—ŒÇ9êÈcvoOâÑ—úñ™Ö`.�~…hð«ð¸'"Õ4ç¨ �h£ÏcRjôWq¦ðèSò*-ÆcXŒõ4çè �´w:–Ç’¸¢ÿ˜10•Ç´NËò’Îûþªñ˜©µ�‰OüAe�~!VÎx<¿Ðj�ãQòO{ò¸Â÷s(?q.�iåtu1ç©�9Ša”N<îe-óýñ94œ=.MQ»§ŒÇYêÌ#ãõç6­Õ¾ŸÃ¹‰}yT»¡�ÂP=ãq-õã±2|zŒÇ9üû9ÕéÌ#¬…ìÜŸÍ£O¡B±Æã,uá±É Uò˜;¨Ùf<žÃØ�SxÜS²v¿ �Ÿ‰ ¶�³t�Çí½žÇ¤Õ¨xÌkYS¿Ž®f×úÄyã~AéàÕ¸ƒWã‘öÓ†ðX¶¯õxÜ}Ugò˜U¥~×…y<»¨•yD>ø8œG"\±*�~1P§ó«RéÃ� }E‡Úa�Û±¬ñ8¡Pˆ£Ú>Š·¨�R�HÏã¯Ò¼ÎøžÕla]dÖxœP(ÄqufXÍã/÷k2�ûºŠ„á<"•9Èãi8ÞžGˆc?[ïžI/ýúæñW z~?§æ`}€îø²\ äÔC¥R'ȦŸk<®¦!¬ñ8QGyÜ﮼ÏA�ËpL�Ç;¤ðÒ0Ëò§òèWv&�\² HÖä¾?�üƒö¨=Ì»¤¿ !�ÊñÇHÅÉ<úµC.lGauŠ óx¬zc£.÷½y”}°.<Ærxµ¯®_Añ .lwQöt÷â]LLgµèoΣ²;Ö�GXÌ/ŒGdÃü!þ4�Çý”?—G¿â+t6�ÿ÷%ãñ©™ÔÐ2™õ‚yGdó|¹PÔé<Âò—à1Th�î{VÛ¢Óä¾�y£Æ#ö€öæñ3+µâºðÊ]ØSxüœm_€=4ýGŸ›ÉvCUþi³‚Â"�c²Ç|òj¶#�ûï¾�î¡"lïo*s?îÁ#éËõ摳O¿8=�ýÞï¨p`»ókð¦<ÒU0«‹Z�Çü.ä‘s¾Êõ‚<”Ç�Ë~Ϫ'�[š“ê`<òE�Ë£~@Æ9ô�;ˆÇ¢(‘Ç_¾‚ÏÇ�Ë~Ϫ?�bŒG¾¨SyÔÈìù57é �xçGZÿÏkƒÑ9šGÅ÷s¤§AC‚ʃÆ#]ã‘/êLë†oãy¤»¥ÂzŠ£ç�òUóýodÓO ô0˜v0�Ð…­Þ×x<§ÐEx ¿ŽàñËVK%=­$7YáV÷¥ý\çðê@Ìß0§Œ?¾Ôc>@mJî¶!^TÍ: sŒb7¢[‰S:Æci܈¤|Õô:kº¤Úúô�g8�["rŸ–ã1F74Eœ$ä¾�Çþ N¼Ã]xtÞ6ºgX•odX#Mfùêd¥=?دf^ä:‰Ç¬dÎùß³zþ#Ìk¹•Ó_ÈB×R+�Ùö�ÁQõ@jpLä‚<‘Ãy g©q&Æñ«�ÿá�ópL'Še‰2��"æ¾1�ªNQ-��FGì%H'Ò¸mÇÔ|M<~zG€š�æÑ'b·òtÿßK �Nš÷ ñÎ<’>×1]Jã³Y�ㆢDãsÏ"� ݪSy gM?Ïá1«ÇK×ãÑÝç{V<›֕ÇFo°t±Umz–£$Ò×!³‡úÕ\U öT³zLæqÃQË£{(¿~u+‹&Ó‘G9ÜœÕçÿ9à_ÊÜ1áŸlÏl4ä?ªÎó4·$Åó`0�{Ê™Ÿ{Äxôð<º›~ÏJäQùônæ:ªÇ4Í¡l¦¬I3v°¥øYõ¨PÇPAÑd®3xüœlA„Ga!n÷ç1¶Žø<è=c9EZ+ƤË@ãpñO;V½‚ÉxŒ%÷þDòExLÑí—æQ=ì‘ùD…Œðò£7IŠÿuâCÏ18þJ�eùǯ6ÞR¥D&Ã+Äã"!ã,÷$Íá<î ‹a“Ð~}nUkŸÄ£Ó{ÔûhC�îÛñ„g)¨%äì#ëÈÊw$·>�dNyGãdaÑd®;ðxvQgòè*z¸ûÉýÁÛ]o÷bpðc"ñô<Õ~i!ŠG�Æ^õæ}ìórúŒÆc÷r[xÍmHø>ð Ú:z¬òTÜäÊ;&½fò"Höj �±bÍŸ—3gêKÛýêm]ä1¿Ï£xYŒè±ÊS±.©Pضòé›ü/¬áÃ3¢íÕH‘.­ñØPÔªö1ô¤äÛt˜G_ޤ+¬°­Çè³ú+áßcÞƒAü)"×NÓÅì’nœñX]Ôª<îù5·©�ǘ[Î+‚£ðVVjq,Òø£ÑØ£¯‚)*ØóxŒWöȧ9ŒÇsÊ]†Ç´·åðÁ~W VÍÿNc}¥»Õ™«»r}“>B¥ñÈõ®°Âx”º'>…ˆ‘ªFûXˆèü6<Ÿ Ûó"ï~À¶ëT¤”P¶#Ú�&˜ê <þŸ—ð¨ùÚέyä{‹I 5†¨ä‘ Ïqæ/ ɈAç‹O-dõu¢S*Oåñ³,?•ñ8SÕ8‹Ï[¥Òó¨í-J<:”?ÇÎ{±%jˆòñþŒIÒfj’¡g½»ÓŸô°ažòÕ‡Ç=Iõ $�Ç.…"<ú�Ç…>/Rp�U½EžÇVUðø¢Ñ;°ºîŠp´8fs{ÒÜÈì‚‘W¥+�Úaã‘/ª‹¿úˆŸÇ=Áñ¤)pŒ ®PŒ’(j6+¿/72Ú?rU _§ð fv5ß‘Gç8Ô´æ‘Zw?ÀçÄÿs,’éTëpÄû�±è×£‚½*gò‹Å‡EŒÇ©<ÿ�Õ)¯¶PEš2—ƒ .™Å£ùš�ëWÓ\€q«ŒxU¾6 Çñn„æ)`<.©¶ˆC[(XêÄ£Oñ£"…½’hDÒıt\VMÅ£{1ÙðWêŽð¸¥åP^„G…æ¤&÷;ñè¤Ùq4�´9Ì’67ñ‡¨LüÑ´cÉ“ÆãHeÉm¿ÌãWà1ƒãý}¡ûºTâLý,ÐݪÊý.<>ïøË ôá‘Êäv÷„bJŽ@cº­ÙÍ26óèVÏÆ‰<‚‚•ÇûœÀ£�ÖÅĪð‡f§Ç{ðèv·f'…oÚyÜÆ@Ò,ÞªŒ¹j:�ÑÆçþ=�ä®ÜWÁcd£é‚ʆC¹ �ûß‹‰Æcõ}ߟi_@cÂ9?,ŸK¨äâ­:aFzà1í1ÖñøEðø‰žÁãö¯ä9�³¥ºËe\ýó5ýâ˜Ù­û(å TòC �YÅ e°ø��~  q�iÉkò¦½¨xtª�°]VU�¾½îçWÆã÷?ylÀ1¡’CrïbB²Iu`yLp$xhœÌc,Ë:™Gåð¹K¾–!íô¸%�™¯S˜Ç§~xËÒ³ûXq0°”EÜf‚eª€!<’h çqKCJžË#H¶�î¡Ûéq;óûFñ¸÷$Ko<�Iø5û rB\UXçC<æ—$¿rèné%>‰ÇÏPrÈ0•Gõ@Æ£øyQÇÆ18î B|GÍ™6€õÏ ÆqÍ 2�?H‹k¢â1½ÖgòŠvsÇ;üX¥~bnÍNwá‘l ÓøÎ9îj–âYüA½¶ hm™X·ï0� |®ª4ýÎÎæË¥OèU IDATÍÙ>²îb–å ‰æ”ë?‚ç:ƒÇ? jEÏÒ9:zs€GäšÔn ß—;…G›¿:¬d…Åe£{ëœÂ<Ƭ?‰¶qŒ³&w¤¦e*a¥†ð.A �Û¸ÆcŸ¢Næ~ÈC5‚“ß%¼»˜)'ŽåqK(™Ø}Ì‹îaiC™îÎãë<{ñïȱÏË�³xt�<î(Ê} G PcA›8ªvw5IL}Wi_E@§|r}¯ý|i;KÈz㽑Ÿ“Dšñ8Û_uŠ9 [Fp¿éÆ�­W›Ç¼»™pÉ"Õ�Ç×úÖ]ÔÌ/�Rvû˜`x|1ù3é:ð¸MÁÈ 4닺�â]ÎRr¾4î*¢|LdH÷±Lk±†e ôW=&àøÍãϑߛ~öâ1–æ¨lÆ£PÔÝCÁ£·RERºu­î*’èØAx<¹ºû(¦6ðø�L¯ÑS)Ž/"·Ž‚¦$bTä £Æã˜’Uf) “x,O «2Úì›xÌ.u‘:!ƒ¼ÉÞsÇ;’xŽò{V7›Àòèo—·™¤é/)áéÈcö€wÄçoøÙéBr;ù± ¤G?ä!Q…@B±‡%ù½ËÒ<ÆéP¡ÀÙósÆuUa«<ºòƒu̬ ã4©^<‚˜ÅcΆGø‡�¾§»h Œû¯ñ8¤d�ÅßòÓÏØôÆ“æ±`R†èH÷ËT2ÉÅ\q³F\Ã#n‹ŽðXBIŒ+惢0bƒ_SßqDÆcï‚+GprQg 8@xSKÛâ—Ô²w±¤ÔPÖñˆ”þ<þ$Fؤ%x&�=HãJëŒâ,_=»¨syt±¼z½ë‚¶=޾½øöp�  /7¯N•ƒýXQH�÷¾Ú³LG=�IJ~ÚMžL?_ÿ¥H²öÖx[r�Ž}pºó˜7¬uë>âˆâ}ÊØM, c �›�tî÷KþÔ�G—ËŸz­vãøÚžŒƒ]ùR�Ç¡%ëyÌ|T¬ÉhqDg¦lm‚mÛ}y$ú”�°Rí<~~þNä¡$€Ôò˜dÓlåÇžß;N¥*»!Æã¹%;¾ùˆ#?šÉ!mOoHÏ£oTÓî宿‰“.üæíYu`¼ù»�û�éÔ<æû¿l^Q|Äê€Ã>§¥ü{ Æã°’¥°N̯¹Sméã—ŦQ]ÊQ ¢HóÉcl¶¡Öd qs"ÝÖÍ'�#†•…q;³¸TßFÙx<³dyj_̯¸UZ>„�XµÉLÙ€î#—Ü�Ç/šÇxu\¸`�E' æàç|s 3ãq.�Ûl�PܪǤñ5òø3ùæ1IïÄã3¡Äñ7¸>›»Ö…ù«Ô£Ë�I‰ � ÂóEšÂ ñX7›EŸûÊóå]ÖúTìáI!ÁÒÃ¥4™Gåq4V—]�ŒÇ8 VéË�GÈBD&M�\<9ùõ2<ÖÍf©È}'“ NÙ¥‘pÞdRý9‘^<6 pþ”ìãoßsô"/7‡£¿R9“0êêÂÁŠrVæÑ_—-!¦èmÕ|ýêF<†~Ð G¬ýá10©¡j%Ý6âÃñèö�bí<îW ^´´žÞ;åÒ<î1åQD¸)�;‘ÇY?âעŸîcó±Á€ƒãÞ}ܦ®F #¹ƒ¤|š�ÞdV9äÞí…]�G§üžè?¾ �±%ÏyH¥yÄx mí(3Tb’|( GŽÇ×p� ²ð,+_Ýp;ŽêËçÍd %ÆãgQØxÜ¡|Ð?àïfc;sY¨¢²Í]ÍÞ©,ƒˆUQ‰}xÌ:q˜Ãê<� ¶¯Å$äÄÕâXvÀŽd|UÕ§\„Çm�ýy§ïY%·*mg�¿³ù’x©m_ÇcP¡y|јœß¾öÚ–\ëÍ¡¬¸zØŒ°±ãRŸò2<>jsß…GËc1ɵ(�Þ#«çQî>6ðè6csX7˸]2x*~— È8A®�ÇWš‚G¥ñ¸¦T<_•’æŠOb÷‹Žk?wµv’$åFS�i'”ZÈÏ,ƒxiŽñ¡Dò^è{VU¹oÂ#pÁDq ©hdr›Û˜ìÈcM°Ž1`•,pÌéܢȿ3—ÕUãØ�Gb òTÏDã<îMËÿH<þV6m÷1[×xTÇ2|SV’Å1^3çùý´ñÈà¨Ú@*�Çé"x|Ý$ØtW_uÈdãQ[ÔÂ<îùñ['™lz5¹Tÿ$rû?i‹¼ÀCæ1YudŸ’呎ÞTòˆN(ä¾�¼¸¬+"R]zïŒGº¨+ó¡KPy�àãÝx{"¾TªIB&Ú§$yä£7Ú$ƒ#êßc®¿C�4ua]›‚ÇÈÔ=Ê'ìJË ãñÕ§Äþ¶SÉ£½Å#2”çðH'H<†n£¿épyúrsÙBîkÏxý“y£2�0G2©§`2´¢}¥_¨i˜ñ؉©Ä>}ÓR(^ÓpÆJËw×ÒÞ}~Ôi'/S^—Çø·�y›r+C%L¡‹ ç1ïi bÉpl ðƒ#É}J½yLV=•yø¦µœÇÐgÖt÷tnXrc²Þ]Å‚s«óèC[B �5_¿º>�mZ){á;J¹õíà:Ò‰¹Ú‹ ]*Íc¹{n¡1¡ûˆ¾Hµ6�û#$m$):[oÌ£+ÙþTa}S";óˆ¥7vZ‘j8÷ûG˜G-�T/aRâ1Rù.<º[}Ï ç‘4�2�H¼�"4&@¶xhmŸfBÀó„¾O·�íæ¼W#y S(Õ>ì"<ºG �ŽÎf<¦YQqÿ‘ÖÌc'ý‰‘–©¯S—Ì£ºOi<® „Ç&ÚNãšÊèåï,ã1 ßÐ1›¼ºD^‚*5Žx�§‰G¥ñ¸˜ãІðølAþü îkÂ…c?ä��VîØâñw;�žÉ°b<«€¦—»å¬Ãq(�)m�;‹^¯\Ù¬»1zJ’…=Ð!>�98;1í ö᲎DŽ=�ÌC$�-¢ŠÇ,0sˆÇsq4“Ÿ�5»Q¹åSÒ¶ ��<æÎ¤šÇßæq»¾,d(ŽÆc‡¢.Æ#bùt´Õð(‡$©y,�TòˆEo4¯P5ñ½Ö£<:qšø…xÔÏH…Xþj;�JUð n¦tL=�9�šQI*z3€Ç´ûÝ¥û;ç±î�AU|ýj6�ÍónÁ£#¹C70Ñ=�wL:f“ÛÜÕ“×ãÑ;d[‚‹ÛDk¾~5�Ç %ó;ÐV¯ Í1keâXÿÔðèø÷1ô¬ÇbXR9"òè™Ä¿‡´.�û½Iۂ·s1ë{ñ(Ó¶�®Àç±=|ÓÌc�£7“RÈUÃãgê½�ã±�®z‚Ùý¤/@ýTN¾Ñ§ ÌDÍcÊdëèc6MœCoqeÂâ4¹/Ê£²Õ‹áÑé<>GI©ðMsJ9é·žÇÀd…y$yôLºKò(†u\‚šñ(ä˜Ïãç¿þ_™ò:H_ž‚}NV‡#úÚ'ãQ¹«fx—rm!G’}Ü£AÆcmŽ“yüã<+)„•¬©¬ îtæ1$>­d^P�Ûç; &Wæ1�Rî?Þ×>R�þÂ<’Á‘nÑ äÑ!_ÕªæQûe¯-Ÿiâ‘dÒx\A=xT¸Ÿl6Å Kÿ>rñÓ(7ï �Î¥}Æ“x,g×àƒÒxW¦{›ô‰#�zGñèqChs‘E¯W®ÓyÌY±M®àyzñøé¡4Ï(_÷~ÇI�–0l%n‘¶=÷Sê¼–¥S_\läÑáá›=åþe¼J({$LUEç½�ƒËïÌclü„=tn>˜?¸…؂㸥ûC <þ©äQßÀøF£ÜÕI×�ÇJãqpù<â†4ïÄ—DxLûv�º C7‡,Q9Â1Gð½T�Gÿ�Q v€Ç�ÉfWø|Î{ñè´ß³úæqïB0<¦ÌaB,›ƒYkä1)[ã>|#‘‘ò¸û•º�i¢ñX]Ô$·¹Ò,¢]þ&!$Þdž f(RÆñ¸¥z&�v KÇt ¡C.`�zóh<¶u�x޲4i"\‹ñèþFÏù�x_P䱌n9ìHÝUóW[Šº�¨-ÃcºÞÌ#ºÁÁ›ytT¬Tì@ƒ0�˜pqÛ_=^•Çà¶ ?µ¹/Ê£¾Í³ÖKá‰K>‹GŸD;™š+Ñ Oh#¢°8’œ» ™¼8� ß³ÒåžÍcË|Èëñ¨ç15SUoÀx\D‚Ã*O 8„*G–5Åmg2ð˜nYd뀬JqÔLÌ#õÖ$Õ«<Äc Òx<µr�ª‚GGàæÂfhÛJ]š Ãm˹ Ù³d%¹„åa<:'õÉ­�)•Ä»VÇyôL:ãñŒ:ÈÓˆöŒÉ�"<n»yc —C¬_´ŠnÉ•c?HB6Þa”YÓX�˦,�mò†qII6Wn‡ äÑeH&¯Èã~¥5„]“G­Fñ¨&vQ™W¨¾ìvãP‘ÇC<&¯Íãn'ŒÇânÍ�jìÍ9´½À‘ˆ·ŽæÑCi<ž\h«Nå1Å-çqí ÍÁ­^!W^¸»¢©ß sÖ†@nì['î¯þåIÇúùäÀP�+‹å‘1^˜õCpƒF*Ç-á1Á-¡mËa„¹àÁ\f@E1®T<’8ÂÁIÇ<ÞÊ«/�Jãqmiy 4¥Û mn¨uCh+q ´9t3È…fа¾² ¦u;S¹÷«âhH�#øÔP>­ç#“Æã¹Ò‡ŸŠÞ>æðÁ¶žWÒ–àFY· Úèͯ,>¹ûk‰ðS[xt;“<�§3#“-îê¡÷±wCŒÇñ5РϤÓ96&åiëÑQtÿ¢,ëDó¦¥�Ëà·â™Bjò¹ 6šª}ŸCxYó©wÊBçÑßk¸Õx­Z]xOð(ÁÄà$fPÒ¦á‘ÊhuQB«æ� cûûÅG¢1ßUà±þÝ*!-2y6ŽÆ#Ë#|XºmR‹Ód8‹G�ª æ}ƒÇWjù˜�Ìc/ã­7‡KÍcÞ™Ø:˜Þ�G4Éט%ÓïMKëzú«)“Æã µxô\yÃ\Úœ™¶~ˆÇçÆ“x¤€¬ð@Æ*s@]ö§G*xŒP:Ú<úÛÕ™G³�§T¢:žn%�mýX4FäñiÙ¤ l!×ãôÙÊ¢ÄÆåt3]~Hׯ£Ki$P‚©hÄ�“&à[ ©C1ãq]‹Ç·$Ç÷Ö��—߆l¯àѾ%méà ¾g$�ò˜\�Ç8Þqóùz<~Ê´i#rcår¼Ší…yK¶~l¼¡‡xm} "YÍ£s¬ó™s"48”Tµ4’ ޵í<¾þM˜4—ÊãÖ˜3Ú”¸} ¸0�7º\±9Æá0¦¸¡[‹UÁ@‚¨Dãß-Ø#䘹Q8Öò˜2i<.­òö„†œ±XÚ.7·û¥na-5^(M.3›8nèÑ‘<�.¡Qàˆ»H8r€C樶ñˆ¾zl<®¥ç]�«ŒÁú–/4x·Ô--pãaBi¢�dÁ·Æ¢( `Ü_¤‘ËÈV‡Ê±ÄY<ÀcdÒx\Fù( ¼;tX¯®ä¸<†•�‰¡ÉÛ77zë¾/úR¡KÐa`!S àäžÓ�ÃXûŽ<â1ãqšH…Ž´÷¤ÙP™Ž’})ÉtƒT–bIDATí(Üd|P±ÆKN¦¿1°©i̹“âÒK&T?Š“)οhãqO3s•ñ�~bºDå@óð¸Ñót…TŠ ï‰RÈ ÷�Dõ‹‹MYû‚f\Ëó¸ ¤í«èÏCزEeK×QQgÆJ°!Í‹·ey �›ht‘£äDÜp¨D÷”C9‰¨J×LpK¤ˆ«>Æ3‹Ç³‹º"�…ü“Œi8±‰0Û±öFZLnÌÖÂr§³Èq`Ä44;”›5c32l=c<Æã…<…´± H­-v…ÖÆoþ`ƒ@‰åNFTªpô iiü $ñöV¨ÒaØøOi[�Ç›ñøPÅwTÑT©¹97˜Žfb¼âä�G‚',YùŽGºKÞ¥Õá.@%lš^À&ãñJOB„͉@ ›`‡EÏ™ìÊnÏGŽ5�q,vò3ybMò:å5ÅêMf(³ÕÇxŒÇEU�ÀCÝìªhª9áÝÞ /Àã1W’ Òeß÷ÁÚ»Ž7&͓ݷ4Ù2‹+ÇbZõ{ùz‹>ì �ñ¸”5’Šç{é½Ä¼1`�MtrŶÈçŠ^2Kœ¸=ÿyª>½nÅó†ÏGÆxŒÇÅæÌkòÂÝtMMÊ"¶µPŒì(ã%å�Rä5*ŽF~Þ9 Rœž¯ÅK�޹@Æã’Òz«Õx¸¶�n¦Ž”³$>;E(õåUª Ðâ»�ÞþK¶›ÌTÙ8wnK ­èŒ¢.Åc³ö©ƒT{ ÚÞôÒlIJ£,F7|:H£@Uø ‡xÎb¿›óÑ›9¾}BCEŸêÂØU‘ )ê}x|`H ¶�õßtŸ}e3ˆG Û&ÓãÐ]YTBÕ…Úu¸B_`·�óyÔ¿¸qóï8ßä±Î:¨â3[ÓÐø.ß'C¼ÄúoÏÅo%§†VqŠ ã-çQ÷KýÑÊ Ù-<µÑø‹�Çã*&ð�¦ �ûºp*–@z‰élržF"ÐãÅœá^6—æ*ÀšsÛ?ÐŒ.yÓiB£qÿ¾TÅ£ê3;eQbã%Å8ç¼+ 4ÄÙ¼{%ÇóÖH†i£{ÊT.2Ù€ã–.ïÔzãØSn *ÃŒy—ì\�í = åù8Éìù,¶²"M ±¥áršÙãšoÆ¥!®2›¡Ì$wLÅsÌïð¹ÂxÔ€ætÙŠ¢ÄÆ+ª�Ç: ‚¦h<>ÛaØä<1þÑfÿ"v‹]OÏ�=Éx¤SäÎð£Àq‚A3Ü3Ÿjãñµ¤¡Í»OÃö~ì‚Í ªJ<\‹qä«.=P�^¨.Ãü¦YòèÀ?$hÛ¹�Jeþ°¢ §ò­pËÁ÷Èøc}L…õþ �¤�#wJó-äÀkšl÷‡Â3”÷h‚ (YÐÞÞ>qi){¹»Ð™ö“¶2Ýà…ªC–íŘÌb¶jŽÊÑ ´öH…©ëP”˜g îÑÙÚà‰íÊ/€ÕâìªÈ–•-½•Ê€+=§.cBÄI÷b͉Ò|kŒ#‡£“`KÓ±l|çË�grë4ÍË_ç¤WQðýÅ&¦Œ~è©¢�+"TÓ)FAh¨ð•ÑzUETy_9‹áÌnšÆãD…ë °†°²¤húcrô#tÈ8ø©:‹¶X8Ê 1³2Ûå‚Z�Lna}Æ.ä¢à&¢CVX6ÙYuâaa6é˜cPGÊïà-‹±åðT¡2àWy�#ÅÌÔ�n„k-CdÏTÚÒ]îä-»ä—Ì@—ÉGTó ïÜÁ[פ2äë°/r?mE½ �î¦Ü9Ž$Úà*{ckÌ1äR@†) *Fb¬¡Çup-½¦Ão]“Šwbâ¾Èý4ed°vM½ ªÇ8ÙtÜ„4u�Ç; 8TŽß‘d…'Ê·TÙü´Ù5eñþp³&?z¤pQë¨þÌxÍ£{�CÕðvEg2mŸI‹ÆZ9Öð…½Òtñ‰ ´ábÉ]q)j(‡»¶ÇÃßÝEðèâ‰�#ÕÆãëG5L¨ A»F¶ÿÐ¥drø2U…º8‰V¹,!¹bU×~EûèÀ?Æãiº˜Ø.Û’ØÉK6‰�t±kÀa%}Úì€B,Å(ĹbÅ…¤òŠýGr�ƒ$w1‹=²Ýéæ™6T]ÈUi×èC0«Ô¾ò^YªØ7MÆ7®Ç#h±mø´=ý©.*[2Õ ¹ÒÍ36R±×ÇÑ�o@�¦¼`*(d‰¨)NW}! ßd*�ge<eÏÀƃð¬)1š8s\*GšQöt•3ÆÅÊÆø&®X8GÆã\uy{¨‰æ‰±!$iÇäe«Š�ɤq˜¹L½¦Œó¡ a2çª�mÈ5eCâÑ9ÌŠxR=¬>L¦ª)ãÞ>¸òÝe<ÎUWê�kt!9B´cò²Us«Ç¬°ëuSÆÃµG37IŽÊxœ«ÐÙ¯ “!Ý´·ù=1�Y«Þøhö˜‰cCÔU+Ë´Z<çD%'kòr”.äæ9°}†B ç‘LÚº�ƒÊ†ï©b-îÍŸÍë`ú�pd™ãqŠÞá;ª%D¡ür$ÓØÅ!ù#àÜN� –ëêÿ1M^Þî±×¤~RtMÈA’4kB¸IÉ)`S‚¤«CMpŽÀ±eÞÔuõ稔ö¾×Zr•»oEÌ•CHÈQŽÉ%»ÌÒùÇ™ìë3¼i¿+ê-NR'çÿ=Ïr+œS°Q$IÚ^ÍØóðµÊ“Q—Y¸:*Z«®ì õö *Œ—u¾&Ùáó-‰�«.æ*R¤ß²iªUÕ—~«aÄfÙÅ©’ÜÅTÍ'AC®½b®r>¿™f›•PzÑòµ(Ι·§Öí tW=�º3Y‡šÊ«'ºR†Ôd2'Ã�3îë¿ŬӻŸ¥4­¦q¾¥>æJ‚ ~Š|8~Ú˜«?¤z|Ɇ_¼õÿÜÕ9²+P#Õ0YcGÉÇ\)j°dnN@paiCÞ†K'úúSþòr²+P#ݰu›ëíbÔ$ÔTN¬8iN èSš·j<Öiä4pH—¢&Î�QÅ\U†OÊE¾„Ï�µ�SÖí Ô¨Ê>¶;äCƒšÆÃô“ÊU‡aò9‡Õ4=²hSâ4²‹S¥šxN£¿š¦MFRF­ˆ¹"Å8ŒÇ㲋Ó]¾"Óá r(1�è(Ç7Š «b€Ãx<,»8ÝÕ“ÇÃ$6f߀g4ãËZÅ VŸ¹ñ¨‘]œîêÌãë·%æJfúHz‹DŽ�¯ø@W_Î�·…ìêÔH7�dß®»´bW4TcÓôC‰º˜k¯8L:]øZûh_ÂǾ2ª u<¬†ítSMÁ�r(Q~¤â¤ý”† 7ªÙºð¥ <Æå‡gqܘµªb*ÇLó1;ôвMS ¦±¢ÒøV]›÷vH¾r�ðw†ô�‹¦)b*£ $³dðÒ4öâQçë¿».|qv;y|Ýí`'Ýûš@bC ÷3chÄØd²àùZ¾aÏÛÇ 7µótá‹ÐÜAu¨ßÊÕ«XPå®<<�¤æõ Å@eË é/ \¸­�¦ _#Ƥú�×à±ýð%’jªñ�-_n´kΣ.dÊuáK'ó8ËaÕÆs\‹K�ÍÝøF]L=uáK›vCÚTÛX¡Ö`$s•iüP‚8ö[]RLÆoYûʯ¬ _9 �™Íã£�GôXʉçÒ×®Äy $`ZRvïn#ãñ²{w�7�Ý»ÛÈæçÜ@vïî#›x~}ÙÍ3™Ö‘ñxÙû×—Ý»ÛÈú�7�Ý»ÛÈÞï¸�ìÞÝFö~Ç d÷î6²÷;n »w÷‘½ßq}Ù½3™Ö‘ñh2­#ãÑdZGÆ£É´ŽŒG“i�&Ó:2M¦ud<šLëÈx4™Ö‘ñh2­#ãÑdZGÆ£É´ŽŒG“i�&Ó:2M¦ud<šLëÈx4™Ö‘ñh2­#ãÑdZGÆ£É´ŽŒG“i�&Ó:2M¦ud<šLëÈx4™Ö‘ñh2­#ãÑdZGƣɴŽþ?G¨êÓXÃIEND®B`‚nðÏîÔyn}—Çséþíbžkûÿ‰PNG  IHDR�oì„ PLTE€€€™™ÿÀÀÀÿÿÿíú½TbKGDˆHlIDATxœíÝ�z¢Ê²€Ñ¾ûøþÏ|311`u«’¬õí3 @�_@ÌL;U´ì.ôuèêÐ#Ô¡G¨C�P‡¡=Bz„:ôuèêÐ#Ô¡G¨C�P‡¡=Bz„:ôuèêÐ#Ô¡G¨C�P‡¡=Bz\¨µ¯Ûöáüç�o6ß�.£¶�<ž”¶2ùœ]fý脾–y4mV±>j›MÓcï»Ï;÷zŒùnÈdW³›ŸP»Ñ£ ³:j›º¾6ԯ᾽M�W»­j=>:’iVçB·z¼:$ýº×ç�Ïß¾ÿ·Ûu^ò1üjôÇ6ó¿šß×!óׄ.÷n_Kp¹ÃÕQvo~»û³�Õ¹Ðç.ðºÇÍF»ùCèñ’Ç®ƒ¯»~Þã:“ý·W=î*Ú-Ùvr—‰´ëïºóÛ‚?muþEÖæB›]ÝöTqsÒ¸‹s³GŽWƒö“–ßE��I£Ç@�¤ñy€@�¤ñy¹@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôHšC=¾ß¹½Ýèféñ\ÞùQÝ=”=ž³k›Çé9|¼ªGXfA�ï§Šz„ãŽ÷Ø:!îzlÀ}Ö¯z?VÐc GÒè1Ð#i| Ð#i|^.Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$Í¡Ûæ¶½ 7z„GzüLîßm;?x£G˜r ÇvÒ#,µàxõ=?=Âqz ôHšã=¶Ó7=6à>/èñýûì×� ö�¤9Üã9k=«®?êŽóy€@�¤ñy¹@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4‡z|¿s{3ºÑ#Ì8Òã¹¼ó£º7z„)zl_wÖ#¬püxU�°Š=’fI�mpù1¸ÏЇoëlî™ýº3Áþ‘4 zl›/z„îï±}\฾ó.J=Âw÷øÖâ¿ãÛpçóa¯ÏÀ÷÷xNr4ú?i×#i&zlmòôR�0gâxµµp©GXiâýœ»G=Â=ü¾U GÒÜ×ã×çôÏ£Ç@�¤™ú<€óGxª™ë�‚üI›¸I3u½Ãñ*<ÕÌõŽÇsÔ#ÜÃõŽ@�¤Ñc GÒL¯:„'ò~N GÒL^ïxÔOÚÄõHš¹ÏèžÉñj GÒè1Ð#i\ïôH=z$�ÏËz$�óÇ@�¤ñûV�I£Ç@�¤q¼è‘4ÞÏ ôH×;=’Æßgè‘43ÿ¾Uüçô+y5Ð#iôè‘4®wz$�ë�IãzG GÒè1Ð#i¦ŽW¯Ç¶�ámt£G˜qäß+o—�´þ�aÊÌõŽ«°¼�ôKèñ¤GXëÐõG=ÂR‡®?Þ×cîsèz‡ý#,5õûV�íõwšù}«ûS=ÂóL½¿zý�Ÿ€¥&zlázÇý~Ò&®GÒù|Ža­™ëþþx.¿ßè‘4~9Ð#iü}�Iãï³ ôH=z$�ãÕ@�¤ñ~N GÒ¸Þè‘4“ç�z„'Òc GÒx?'Ð#iôè‘4ÞÏ ôHÿ>r GÒø÷‘=’Æçå=’F��IãýÕ@�¤ñùÕ@�¤q½#Ð#iôè‘4÷õøñ—“;„§Òc GÒ8^ ôH=z$ͽǫÍñ*<�=’æþ,Q�p·{Ï�íõ÷˜z?Çñ*<•ýc GÒ8 ôHï¯z$�=’æøçs>*íÞèfî±�¿toôSôè‘4z ôHšUç�z„ã^°lÀ}¯ö�¤Ñc GÒè1Ð#i| Ð#iüý9�I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iŽ÷ØÞŒnô3÷ØÎ_º7z„)kzd©G˜¢Ç@�¤YÐãû©¢á¸ã=¶Nˆ»pïçö�¤Ñc GÒè1Ð#i| Ð#i|^.Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$Í’ÿ=¨½ 7z„+zü—^;?x£G˜¢Ç@�¤YÐã{~z„ãôè‘4Ç{l§ozlÀ}^Ðãû÷Ù¯;ìIs¸ÇsÖz„V]Ô#çó�Iãór�I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4Ç{loF7z„‡{lç/Ý=”5Ç«z„ôè‘4z ôHš%=¶ÁiäÇXà>+zl§›=¾Ÿýº3Áþ‘4 zl›/z„\ÜF©G8àøõÇw> ø¼\ GÒè1Ð#iôè‘4z ôH=z$�=’F��I£Ç@�¤Ñc GÒè1Ð#iôè‘4z êöØê.kè1xh£I*í¿Ÿ´y@Ñ3÷�õøŠTôøëUí1qËÓ#i~O�Ëö¨z$Mn�ÃM¼å�2=bÑýÏ*Úã�µ¢í‚þt�ý1¤GûÚŠô8qÿVnÞ¯Y+z¬H�½¡óIê‘ôØú’Í{åLôøKè±749=þYzì Õ#9ôتGrè±7T�äÐco¨É¡ÇÞP=’C�½¡z$‡{CõH=ö†ê‘zì Õ#9ôتGrè±7ôµ©\ÿ*¢ÿ.=ö†¾¸ÇÿôÈ™{CõH=ö†ê‘Oêñí”h7%=Þ¡G>=§Çv=)=Þ¡G>½ªÇá¦ß—ßã øõ8^×÷ŒNVaé^ÛãÇO|ùÃ×v¿ÿoèízÐõC>¿†iµëiµ0èã^aZƒ™<¼ÀÝ™Äþï¾¾­Zàû ¬ÎÒ­tÿÒÝ3¨äÒ½°ÇΦ1¹µt¶¼¯mùææý_\ ÿ=Þc‹lÞ�™ôx{¯Áè±m¾ÛÌᾡêÏ÷ñAaé^Ðcîóªýãæ¿Ý2¹Ês0¹GÅ’kד*¿þàä~Üÿ‘ÉÅ’kד*¿þàä~Üÿ‘ÉÅ’Žûw(|5ÙÚ+áNîÇ-ð™Ü>¤ã-‹èêÐ#Ô¡G¨C�P‡¡ŽgôøùY îˆ3í n›G…iõÇ<:÷©ÙÏϽöß¼ð‡ɪÿ©ÛÝwËrT ßlÿÜz#Úà‡iÛGÝ7f~îÌ~~îUøáÜWþð/Yõ?o»ëyy�½‹ §Ñ ÈòõÒ�ûüìí±à?|í^Ýã³WýÜî:^ßãÛMïÙï?[§Õë¥?÷ÙÙ?Ücž?÷õ=>yÕÿÈí®;çž[²Sï°ütêz~Y·^sŸ›ýã=–üáû'J£Ù]õ?t»Mf¡ñ™íí™v_¾n¼=2{^}{îS³ŸŸ{í¾¿ãZöÿdÕÿÔíî»e’¼´ÇñkËyäðE§?­Gøk¦Õ¶#¯1žÉp±fßÀÿÆÌ«÷“ßy¼&û¼±8ì„Oƒõ¸rZ¯Ùîz“¿ïnKÜ<ö¾9bÅùÅ3¦5(¸7—ùi�µ6Øôæ§5œTÿ¤r7í0÷áb}ßîñU¿rZ¯Ùîzê÷8޼߿¦Mk<“Þ¤™Ö0•®ÜÈ®?©÷¢»u ·û[‹5z+g4­üŸ¿ÝõüìOñ]ä—MëF��IÚÀ:yŸ~jRÓ�Ls¼Xý"h�k¶»žW÷Ø�ép‘¿]/ñY^:­Öë±³ñÍOë›'gx>4?­þÙØhÜ­Ç‹Õu{“ޏù4.˜Ök¶»žWöøõâFÜ8ü(íêö)Óú؆ºÓ¿C0˜Ôô´¾3XÜ_ò~Îpbù/œÖk¶»Ž—öܤÇÓå¬ÿš7=bünüC×;nì§îÑ>fÔ?þïT†cŽèšñÈ~à9ùnï<1¢G��úß1u4f<â"Lk4foúÙÍŽXÖãit)âÖ˜É !ù=öûš¡Ç\ë‚ü>|g~Äà‰ì�?ä<‡áRÏѵáՖшÛhVm’Ÿ/l£91B�¿F»º=>bôÂ>Úwõrsøì OíR‡#n\ ¿³?9¢7ÛÇFœ^÷~Nw1æGôèêÐ#Ô¡G¨C�P‡¡=Bz„:ôuèêÐ#Ô¡G¨C�P‡¡=Bz„:ôø;\~Yïã7÷F÷ê<¬u†“Äñ+\¢ÔÕ¾îÖ{˜«ðDü�Õ°®ïö—z¬Âñ\z¼üÅŸIÄÇáèå`öã^ŸûøÃ澤ò üaÿ¸¿ÙíÛ.Èø?™<¿A§Çîì­?ë±OÀoëû:P½¿G¬ù<¿Aoox}\ïaßX�'áW¸¾ÞqóüÑñj]ž€ß¡…3ÆÝ{¦û÷Wû}:\-À3uèêÐ#Ô¡G¨C�P‡¡=Bz„:ôuèêÐ#Ô¡G¨C�P‡¡=Bz„:ôuèêÐ#Ô¡G¨C�P‡¡=Bz„:þ.®& µ�IEND®B`‚nðËŸ†ª‰€Hn½(…Qég�Wÿ‰PNG  IHDR�oì„ PLTE€€€™™ÿÀÀÀÿÿÿíú½TbKGDˆHhIDATxœíÝ‹z¢X·PNýyÿg>Õ¹(àÞXSÝZc|Ý1'÷)(&5}£˜ž=À…>Â8ôÆ¡�0}„qè#ŒCaúãÐG‡>Â8ôÆ¡�0}„qè#ŒCaúãÐG‡>Â8ôÆ¡�0}„qè#ŒCaúãÐǺiºÞNß¾~þþföÝò¿ŽõæQËÜÁ­w™›³#Ú˜ï߈¬Åºi¶ŸÏÚÖúîúïûïרZ÷¶Ø3Ÿ³Ù=3¢ÍÙVÈ+±îz<œï•—cäÇuèìvÇrÀ>žÈNVbÝV¯w¬ú8ëëå òûÛÙÓlÈ5õ}ÿjðw`6K«Y¸žE_GtyôÏ4gc�-Xwz‹ÇSf%Öý×}œí¡‹×�?÷|ÌöôÙ=óz,zðq™ÆÏ#Ö5Y~»êã¢E‹™��î2’iý]sz‹³ò;¬Û�uX÷³kÏ÷Ý�K)>~¾ÿ¸~»Ø…gÑÙ7×Â,vöŽëq,¾[>àr;ëãíQ·7º_¦·œÖa]§�ëÛüÎù‰âwt~Æ8ëz”—àzð*vyô"ºŒ}´÷q;ºùöfz«Y£Â:¬›oÖ;åòLsöèÙ!ôp�Øêãâ(¸>Âuúx;ºÙêíô®#ÒÇë°n~ Xíã³F¬OW‡¤­>®¦Õ>ÝÙÇk›Vƒæ3¶êãêx¼\ÀË!R¬Ãº^„—ýöèÙarvÀœŸyÐòÞõàÅ fã(¸îcû¼v9ò}Ók^J4KÏ�q³ÁëÌÙxçnUhº-›§¿7¯ÇSÇÇë°îæØu¹ÿ§ 7¯Õ>– ìõqõ Ù½—k×Á˯‹ñÞÎç͹çìêÈt9s^e—ãœ=^S¬Ä÷¶|~xÔ”8ËJ|góã²>¾+ñ�M˒ܳ2êa-Â8ôÆ¡�0}„qè#ŒCaúãÐG‡>Â8ôÆ¡�0}„qè#ŒCaúãÐG‡>Â8ôÆ¡�0}„qè#ŒCaúãÐG‡>Â8ôÆ¡�0}„qè#ŒCaúãÐG‡>Â8ôÆ¡�0ŽC}ü|ðôõ�Ò/o€€#eú*àWjy$èÒWûôîæðùª>ÂÝè#Œ#ÙÇÿÞÛ™þØíŽ}üüþÀ^úãÐGG¹�¿|@a¿R÷TöÙ /DaúãÐG‡>Â8ôÆ¡�0}„qè#ŒCaúãÐG‡>Â8ôÆ¡�0}„qè#ŒCaÃõqÒ`þ]úãÐG‡>Â8ôq=yÏ<�>®&ÿGy}\M^y"}\M^y"}\M^y¢wèc²ÂúÈ3éãj\úÈéãj\úÈéãj\úÈéãj\úÈéãj\úÈéãj\úÈéãj\úÈéãj\úÈÕû8ýus£�pB¹�Ó×—å�>Âú¸—>òDoÝÇþ/÷è#Oéã4j»åJF &ò~Nçø8=ÝŸ‡D %s½Ãñô±�˜ÌëÇõÛ:úgd^?~Œùy}äżõçåô‘£�åÄèc91úXŽ@Œ>–#£�åļN§ä‡Ãõ‘!½PR.}ä™ô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G æI}ö�áè#Ïô¬>ŽZ.}ä™ô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�˜z§¿nnôN(÷qúú²¼ÑG8CˈÑÇrbR¯õêîy|œ6üÙøbHq¾ZŽ@Œ>–#£�åÄø<@91>/WŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91å>NŸ¾n?.7ú'DŽ�Ównú¹ÑG8CˈIôqúÐGHÐÇrb}œf_}œ6üÙøbH¹g?¿o? {°s|ä™ê}œæ¥ÔG(ÐÇrbR}ôy¨óy¹rbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G Fˈ©÷qúëæFá„r§¯/Ë}„32}\×Rá },G &ÐÇÏWŒúuõ>N½×�Ó†?[_,)ÞÏ)G FˈÙßÇéûÜTá^v÷qšn®õÿ ðyÈØßǯJöwcíÉ[.}ä™ôñrYCá>œ¯NSó¤>BÊ�÷sÎõðûVåÄìëãõóú÷£�åÄú<€×�pWG®?ž)¤>Â~‡®w8_…»:r½ãDõp½£�},G æàùª×�pGÞÏ)G æàõŽÃôö;öy}„{r¾ZŽ@Œ>–#ãzG91úXŽ@ŒÏË•#ãõc91~ߪ�},G Æùj91ÞÏ)G ÆõŽrbü=«rbŽüûVípN!Åû«åÄèc91®w”#ãzG91®w”#£�åÄ:_mý>�ý>›]ŸÔê#ìWÿ÷Êgo¼N?7úg¹ÞÑþËõRÊ}œf7ú%åë�?/õÊÊ×—E\ôqÚðgkà‹E %s½£ÝÇÏïÛOÃìy¦C¿oÕý|Ž>B‘߷úïxÚª©>BÆ¡÷W›ønéòFá„}¼¼�z„>Â~õÏçè#¤¹ÞáïçÀ}ùýŽrbü>r91þ^G91þžU91úXŽ@ŒóÕrb¼ŸSŽ@ŒëåÄ|ý¨�pGúXŽ@Œ÷sʈÑÇrb¼ŸSŽ@Œ¹�ÿ>r91>/WŽ@Œ>–#ãýÕrb|~µ�×;ʈÑÇrböõñû�“{ýw¥�åÄ8_-G FˈÙ{¾:9_ÕGîNˈÙßÇ£MÔG8jïëÇ“‡G}„½Ÿã|îÊñ±�¯Ëˆñþj91úXŽ@Läó9ÓÇå”vÝY}„ý}ü¯�ÓWxZ�Ca?},G &ÐÇÏê#Ôéc91õ>N½>Nþl |±¤Ü³�Ÿß·Ÿ†=Ø9>òLå>~ÕZ! uýQ¡Îçʈñ÷sʈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G FˈÑÇrbô±�},G ¦ÞÇ鯛}„Ê}œ¾¾,oôÎÈœ¯ê#$èc91�>~¾bÔG¨»çñqÚðgkà‹E Åùj91úXŽ@ŒëåÄø<@91>/WŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91õ>NÝÜè#œPîãôõey£�pFæ|U!AˈÑÇrb"}œÖ/#¿ïÞðgkà‹E %ÑÇé£ÝÇÏïÛOÃìy¦@§Ù}„‚ÀõÇy)õ ê×?ù<ø¼\91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91úXŽ@Œ>–#£�åÄèc91‰>~f¦¿®7ú'úøÕïð´ÇÔÞ�‡-—>òLõ>~•P¡.u¾ª�P§�åÈkz³Åy÷ìã´áÏÖÀ‹@Šãc9òšÞlqÞ…>–#¯éÍç]èc9òšÞlqÞÅÝ? �cz³Åywÿ¼œ>ŽéÍç]¼IŸÙú×ôf‹ó.ôñ6ÒÙ{íÀo¶8ïâßíc?r¢�¯·w;Çýëï»–eñ¨»M¥èíûØ-Wµ�;7ïã�Ø;÷=êÄ>|búѦ̇DûX]â^þ±}¼üp׃Ýb*É>ö×è¾í^}êÍ4íkxfþ¾ëÈŒýùyÔí\gìDOlÊî¸Þ¤�—�¸#2Í·øwd¼>ö÷žöT÷<ìHd¼>¶VÒŸÛáù>¶ÎÞþÙ>ÙíwöñO­�‹Èzx·õë/î:iÏ莇5¦Ò�<¾�‡¿½);‘ÆJîÎØoSi<ìmû¸ÞUÖ»ýuöÐǯÇêã<ÒßUúwíÛ»–óœJ{�®§Ò˜™C}ìwÿD¹N¯äÆ(»Ër¢�­íÒu|%?ª�«/õ±9ÑÇþ)îcúØß“óSi¬¾ê"útt·>öWBfÆºŽ¯ägô±±Û_|³)‹¥<ÞÇÖT~™±Å$ÓÇ{O¥ØÇè�{1•Çôñ3ö¿›G-ï:0•�û¸/rImFÖ >fGŠüïæûAfLõQÇ™±ûØÞ-OMååû¸/²^ðäT:[d¤réã£glß»�W}ÔÇÔÞõœes»ì[cóGéch*¹�8ld¾ú†š±ço—ijî0ûÖØüQú˜šJ{‹<,²c»ßs>1cÏ^cÑHv‡ùGúøoF†Ý!Ez}'¢�""ãDôQDdœˆ>ŠˆŒÑG‘q"ú("2NDEDƉ裈È8}'¢�""ãDôQDdœˆ>‹|?¤™¦§Î˜È[DôqZÜõ[¹¦iOdZ<~õ�SùmÆ.�:ºøÓ*¿ùù¯YÌØé©ôWrãçß"�©œXcû¶Ë¡eÙynï°à›?lÊùÈoy¥{Lä1‹?|ä}üm– ª}v‡£�?ÿ_Š‘᷈ȿ¨�ï+}ùw"é>þíß´úyÌ0îã´‡>Šˆì�裈È8}'¢�""ãDîÙÇ 8äîÇÇŸÿ®ßµÞñ‘ r[¨ó¦õ8F^p‘#·…:oZ�cä0r[¨‚ÿÎ�WãvÁEDŒ,ûTè"�¥�0}„qè#ŒCaúãˆöñçC@Í[SkÜ?Íb7#kéNþ·é·îîN¿;y‹oñÏ,þ¯3sÖtóÍüç©5µëù‘öRt‡t'ߟ~wòÛSéÏXsúßâ·"-�ëcëêçë¤=ù-Òœ~÷™+¾E,¾Åßá�}ü{ÓšÚÔÞRñ-Òž~{òwØ"ßâÿî‘}üh�vÞÝÞ"×¥_9·E:Óo¿èMÿü±ø­Éÿë‹ßMBÿ%í/Sk>sm¼Ü|qöܾûjäÄë”­ Ÿš±›aš:;^r\íWU‹‘·"�ëî‹Ý‘�Üa:3¶yܳo³ŒÜÇ�Uòß×PSšã:ÝÇã3ÖžJ·)g®lÔ®=®Ï¥hîýÝ~kÆzoåôF6B“;ÌþB¾j?nß?>½zã:ßÇÃ3¶9²¦£×¶F¶ñ†³E}Üš±v#_µ�‡w˜ûØžÚö‚oõñv ÿÙX½�½åó5Gk–¯Pó„íh·7L÷ÅP'¹Ýî~ }V¼1Ê�÷[‡çÞÈÎî0ýHw*±f32V¯O+·C6^ÑwbZÝþ>®þȺãúøÞ�š3¶ñVCgd�qy?§·õûs¶µÃln—C‘ã;̉=¹á1}öøÇû¸ñöuoÈfäÄ%’­cÚÆaêÀ€é{J�s¬îñ©;¤:9²¿9¾’ÏE:ÛkóX»û´åßîãÙWÝH³©Ý‘‹›HoÈF$9cÑH÷ªJÿjëBÌã–¥ó¤³5®w=_=³Cv#?_Û}l ÙŽ¤¶{ÿJÄÆ5Šî€àŒ¥#Ý«*ýK$ý 1�Y–ØxËëõ1y–3ýÜtúز‰õñ£w%bkÈÆÅ‹QûØ®WwÀvDŸ"WÈŸ»ûoÅwßðϽ{ß�¿3gmÝCÍë_ˆÙºÜÛ!žÛz+¹÷’·ÑÇW7­nw ù5r`ÀÆ�Íû?'M½cjwÀÆåží÷-DrO¬|?§=Ý!ýHÃ?ÞGŠ>Â8ôÆ¡�0}„qè#ŒCaúãÐG‡>Â8ôÆ¡�0}„qè#ŒCaúø.¿©÷ýk{½G5bSë7«yÛâõ]JÕi×t}X+¦�±-^Þ÷ß±ê¶ë·ã¥>Ķxy—>^þ.ÆÏ_ˆø>½œÌ~?ê'öýÃì±<›�ðònŽ�Ë›ÅqpZòöžÌ6xy�>6Ï`·~ÖÇAØ/ï¶}×Õý}tÂ:Ûà嵎†ëóÒÛG86Évx}ë뛯�¯Í6xÓÍ+ÆÅ{¦Ë÷WÛýtº:Æ¡�0}„qè#ŒCaúãÐG‡>Â8ôÆ¡�0}„qè#ŒCaúãÐG‡>Â8ôÆ¡�0}„qè#ŒCaúãÐG‡>Â8þp}3+‚ΠIEND®B`‚nðª«/ƒ‘qÖlj½)äRçÿ‰PNG  IHDR�oì„ PLTE€€€™™ÿÀÀÀÿÿÿíú½TbKGDˆHGIDATxœí��zÛ¸y·~ÿg¾mìÄú!”ˆchæÛ�ÓØGHŽ%[nS B‰ÞøtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|<‹RÞ·åÅóϯoß­qd‹»û\;÷u³ÞÜÁ 5öµÝtÁXžEY¬ù…mµïÞh®å†��¼Ÿ¶Ùƒjî*BžCyïãár…þ#ï{·M!¥|ôÞ ]0”gÑòñýƒ­co_¿·ñV§âãë‹Cîë«“â]Ù÷™ó÷V_µÞ[]4cÖ[=N‚¡<‹o�¶>nlz?úõ“Çj¹×Ïm—(/]Ê.÷þvããÊ¢Õ.7÷³‘²ý®Zoµ·çå�a$Ïâ{™/×ñãG�Ç÷÷�÷·«åücÉ+¿8—ÝmW�|?|ܼs³óq·Ess¿Ô[×�aɳ0|\ž„®{ÿxûýB Çòvû€Åal¹ïÌjëØ£ö¸]õÅnÕêUwF`$ÏbyìÙ.вöäýèÅ!tq¶iû¸z@ËÇÕQp{„3|¬TßÂWxoOƒ‘<‹åAc³ÞvlO!·‡§¥VµóÕÚéèAß6mîZîÌ®úÊÿuS?‡H|< Fò,,¿„ÕׄïÃäjÕ}ý¸hsð\Ä–>ÖÏk×ßîP½ÞFT…‘<‹÷ñ¤r†¹<Ý=ú±~Äú»ÇZ¥Å7›³ÉǦÈö¤tñ�Å�ÊûhY=ýÝüh]oýg8Fò,–G³å}‹µ{ÝöX?±8¢.¶ðöô} üέ¿®TßïÛîÜsqu¤ü\‹Üe×Û\<Ï…¡ÌÊú9aV%ƒ¡ÌÉòXŒ�ŸC™“²–äJeÐñDKð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|СÃÇòü�ôÕ8�ã2•ç—ê œ>è€�:ôùXðàBúÞÏiÿ½·Sþ‡ñûXqw|,à(ø ƒßÇòüNcàøøºòßþ<>gð|õwi£ø ð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGТÜzÉ øXþbÝà#8ÁGŸ�åù¥zƒ�àñtÀG|ðÑçãë¥">©Èú8eÇ®<>è‚óUЂã#>‚øˆ� >ú|äópøèôñ˜´z€Là#>‚øˆ� >â#è€�ø:à#>‚øˆ� >â#è€�ø:à#>‚øˆ� >â#è€�ø:à#>‚øˆ� >â#è€�ø:à#>‚Že?Ga|„‚�ø:à#>‚øˆ�RȾ¡1|ÄG)ðqBÄ>Þ|œq€�÷'Dࣉæ]|Äǃ$šw]ð’hÞuÁG|ª!;ïø8qËÏÛÇö§VÁÇ ˆûøztyÞ®oðqn|œ>ª!;ïø8}Ë%ªàãðQ ÙyÇÇ ÈûX_j>èâJ¿¾Ÿðœ2 ÙçaŽ�P?>–¥”øY'€�jÈÎ;>Nà3|äóUðqê>“vBÓ��w|œ>ª!;ïø8|TCvÞñqø¨†ì¼ããðQ ÙyÇÇ à£²óŽ�ÀG5dç'€�jÈÎ;>NÕ��w|œ>ª!;ïø8|TCvÞñqø¨†ì¼ããðQ ÙyÇÇ à£²óŽ�ÀG5dç'€�jÈÎ;>NÕ��w|œ>ª!;ïø8|TCvÞñqø¨†ì¼ããðQ ÙyÇÇ à£²óŽ�ÀG5dç'€�jÈÎ;>NÕ��w|œ>ª!;ïø8|TCvÞñqø¨†ì¼ããðQ ÙyÇÇ à£²óŽ�ÀG5dç'€�jÈÎ;>NÕ��w|œ>ª!;ïø8|TCvÞñqø¨†ì¼ããðQ ÙyÇÇ à£²óŽ�ÀG5dç'€�jÈÎ;>NÕ��w|œ€º�å/Ö >N­‚�÷±<¿Toðqn|œÀ'øhh‰�s«àãðQ ÙyÇÇ ÈûøõRªàãÔ},W>è‚÷s:�}æø8õã#>ÊTÁÇ à£²óŽ�÷‘ÏèTÁÇ ¨ûxLÚ =LCvÞñqø¨†ì¼ããðQ ÙyÇÇ à£²óŽ�ÀG5dç'€�jÈÎ;>NÕ��w|œ>ª!;ïø8|TCvÞñqø¨†ì¼ããðQ ÙyÇÇ à£²óŽ�ÀG5dç'€�jÈÎ;>NÕ��w|œ>ª!;ïø8|TCvÞñqø¨†ì¼ããðQ ÙyÇÇ à£²óŽ�ÀG5dç'€�jÈÎ;>NÕ��w|œ>ª!;ïø8|TCvÞñqø¨†ì¼ããðQ ÙyÇÇ à£²óŽ�ÀG5dç' æcyýJd|Ô«‚�Ðòñ¯‹Ûß%‡�*Uðqb>>•ÄGÅ*ø85ÿñQ² >N@ÌÇRŠãd¢…"<ïø8-}‡G|œR' æ£�D ExÞñqB>–ðQ± >NÕ��w|œ€��ß÷ðúQ³Šìv Û‹–�å]ñ1°Šìv Û‹˜�œ¯êλìv Û‹–�—Žø8¥Šìv Û‹˜�– /M×7ø8µŠìv Û‹¼�ï¯esƒ�s«È®a²½ˆù¸{ýˆ�2Ud×°Ù^´|ܽŸS7ø[Ev ;�íEÌǪ ø(QEv ;�íEËÇÝ=UW>èbðúcÓljÇÇDÏ�gDhñQ¸Šìv Û‹–�{AñQ¦Šìv Û‹¸�õl�¡ø8£Šìv Û‹˜�µÓÕÒNèáOªÁÇZ>Ö_?â£DÙ5ì@¶1Ûwãcd•Lk8S/ýàc†*™Öp¦^úá|5C•Lk8S/ýð~N†*™Öp¦^úIòï=&𑻝áL½ô“äß³J4#w_Ùzé§ç÷[=t_@¢¹ûÎÔK?¼¿š¡J¦5œ©—~ð1C•Lk8S/ýp½#C•Lk8S/ýp½#C•Lk8S/ýp½ãÚ*™"nÞK?øxm•L7寧®óU®?Þ:âàæ½ô“ä÷•ËÎH¦ˆƒ›÷ÒOÏõÏ/,ÇÇ<7ï¥|¼¶J¦ˆƒ›÷Òׯ­’)âàæ½ôÃõÇk«dŠ8¸y/ýp½ãÚ*™"nÞK?]ߊãã­#nÞK?=ߊ×�ª«+ÓÎÔK?]ï¯:>€�y"nÞK?>®w¨®®Lk8S¤>Ÿsm•L²½¨Fz®wðïçˆN">¦‰p½ãÚ*™"d{Q�ðy€k«dŠ8�íE5Âçå®­’)â@¶ÕÿžÕµU2EÈö¢ÁÇk«dŠ8�íE5¢x¾ÊêÒŒ8�íE5¢ø~«K3â@¶ÕˆâõV—fÄ�l/ª‘Î×�øxãˆÙ^T#øxm•L²½¨Fx?çÚ*™"d{Q�àãµU2EÈö¢áýœk«dŠ8�íE52öû‘Ÿ¿£µìoð1aÄ�l/ª‘¡ß�üóW°Êæ3FÈö¢ú¼>Þ*â@¶ÕȈ�å��wŠ8�íE52òþ*>Þ+â@¶ÕÈÀçW¿Ñ£îc€.®wüê#ÇÇ\²½¨Fü>>}ÆÇûDÈö¢9æãë'/ÛÏçp|¼SÄ�l/ª‘aù<Àm"d{Q�ðy¹k«dŠ8�íE5‚�×VÉq Û‹jäèùj©ž¯âã�"d{Q�àãµU2EÈö¢9îc¯‰ø˜-â@¶ÕÈÑ×�Îã°�D& Û‹j¤ëýœTç«D& Û‹j„ã#‘ ‘íE5rß×�DˆèEîûþ*"z|$BD'rßÏç!¢ÁG"Dt"øH„ˆN‰щà#":|$BD'‚�DˆèDð‘�>!¢ÁG"Dt"øH„ˆN‰щà#":|$BD'‚�DˆèDð‘�>!¢ÁG"Dt"øH„ˆN‰щà#":|$BD'‚�DˆèDð‘�>!¢ÁG"Dt"øH„ˆN‰щà#":|$BD'‚�DˆèD||ý:Èê >!2ÕÇòüR½ÁG"DÎWñ‘‘#øH„ˆNdÄǯ—ŠøH„Èi‘+��ºà|•�>!¢áz":>@„ˆN„ÏË!¢ÁG"Dt"øH„ˆN‰щà#":|$BD'‚�DˆèDð‘�>!¢ÁG"Dt"øH„ˆN‰щà#":|$BD'‚�DˆèDð‘�>!¢ÁG"Dt"øH„ˆN‰щà#":|$BD'‚�DˆèDð‘�>!¢ÁG"Dt"øH„ˆN‰щà#":|$BD'‚�DˆèDð‘�>!¢ÁG"Dt"øH„ˆN‰щà#":|$BD'‚�DˆèDð‘�ÈgùhÞ£:¼Dˆt1àcù‹uƒ�DˆLõ±<¿Toð‘‘€óÕ”>b=‘¨>FUÉaÄΊàcT•L‘L#Û˘�Åxùººò±<š>~}ßýœÿÜ•éÙ~NÄ1b²ƒü¹ÇDzø‚�wŽàãY‘‘ë�K)ññÎ|<+2pýñ‹ŒŸ�]*²|<+Âç墪dŠàãY‘ô>fZ*²‘LƒŒ�Ç»ÀGÍH¦AŽ=ÃÇS"&¹ù ããxᓌÜ|�ñq¼‹ðˆItG$Ó ;"ø8ÞExÄ$ºŠ#’i�|ï"Žw1‰®âˆddGÇ»�˜DWqD2 ²#‚�ã]„GL¢«8"™ÙÁÇñ.Â#&ÑU‘Lƒìˆàãxá“è*ŽH¦AvDðq¼‹ðˆItG$Ó ;"ø8ÞExÄ$ºŠ#’i�|ï"Žw1‰®âˆddGÇ»�˜DWqD2 ²#‚�ã]„GL¢«8"™ÙÁÇñ.Â#&ÑU‘Lƒìˆàãxá“è*ŽH¦AvDðq¼‹ðˆItG$Ó ;"ø8ÞExÄ$ºŠ#’i�|ï"Žw1‰®âˆddGÇ»�˜DWqD2 ²#‚�ã]„GL¢«8"™ÙÁÇñ.Â#&ÑU‘Lƒìˆàãxá“è*ŽH¦AvDðq¼‹ðˆItG$Ó ;"ø8ÞExÄ$ºŠ#’i�|ï"Žw1‰®âˆddGÇ»�˜DWqD2 ²#‚�ã]„GL¢«8"™ÙÁÇñ.Â#&ÑU‘Lƒìˆàãxá“è*ŽH¦AvDðq¼‹ðˆItG$Ó ;"ø8ÞExÄ$ºŠ#’i�|ï"Žw1‰®âˆddGÇ»�˜DWqD2 ²#òÁ>~=¸üewƒ�"U‘Lƒìˆ|®�OŸ©õ >ªTqD2 ²#ò±>>íÃÇ&ÑU‘Lƒìˆ|¬�|ü�è*ŽH¦AvDðq¼‹ðˆItG$Ó ;"y},ÐÇÇS"&ÑU‘Lƒìˆä=>âc|G$Ó ;"ø8ÞExÄ$ºŠ#’i�‘÷‘Ï4‰®âˆddGäƒ}<¢lwñóŽ�š“èöO¬‚�§DL¢«8"™ÙÁÇñ.Â#&ÑU‘Lƒìˆàãxá“è*ŽH¦AvDðq¼‹ðˆItG$Ó ;"ø8ÞExÄ$ºŠ#’i�|ï"Žw1‰®âˆddGÇ»�˜DWqD2 ²#‚�ã]„GL¢«8"™ÙÁÇñ.Â#&ÑU‘Lƒìˆàãxá“è*ŽH¦AvDðq¼‹ðˆItG$Ó ;"ø8ÞExÄ$ºŠ#’i�|ï"Žw1‰®âˆddGÇ»�˜DWqD2 ²#‚�ã]„GL¢«8"™ÙÁÇñ.Â#&ÑU‘Lƒìˆàãxá“è*ŽH¦AvDðq¼‹ðˆItG$Ó ;"ø8ÞExÄ$ºŠ#’i�|ï"Žw1‰®âˆddGÇ»�˜DWqD2 ²#‚�ã]„GL¢«8"™ÙÁÇñ.Â#&ÑU‘Lƒìˆàãxá“è*ŽH¦AvDðq¼‹ðˆItG$Ó ;"ø8ÞExÄ$ºŠ#’i�|ï"Žw1‰®âˆddGÇ»�˜DWqD2 ²#‚�ã]„GL¢«8"™ÙÁÇñ.Â#&ÑU‘Lƒìˆàãxá“è*ŽÈÍù¶>ÊÎ;"Q|$BD'‚�DˆèDð‘‘k#¥rÿçù¸êâõý±Èòë‘®{*UŽEUFwìê»x�ý‘«gÿ¿ã#v¶�gkµ‰;º˜麧RåXÄQetÇ®1|ü½ÊÉ>–í6ÖeÍQ¨ÝaváŽt�UãGe»•_#Ž^÷´w¬+2sÄ.äu“ýóâÞ±®ˆ¸�ºø÷ßË?œ¹ì‰¬"?Ãë‹”MþÓÚ¿8²ZÉÛÛ3ÉÇÞgY+ûÝË�Y*Îññ¿ûøhÏ~O¤5b—ûøÞ¥²úoûçý�ˆ|Fd· •“�4FìJ tqùññû¿÷wõ?x"7ˆì…òS¶ÛPnœÁÈ^(?e» 寉Œì…àß9ðf{²�!"Yû4à"œ >è€�:à#€ø >èpª�ߪÞѪVùyYÄv«ßc–ÿ­~íÇf}³<íÓ¾§ý_wÆKÙ}³üs©U{�¯©waÞc–·ë›åÛUì«Ö§}Ú¯EjÌó±võóߘÔ÷âü©Ö7Ÿ¹NŸÚ§ýLôñïM­Z©ÏÔãô©×¯—¿`FhŸög¦��Úi÷×�ë3òî~{�oFŒúõWV}ÿŒÐ~­üÝÛ·6söKÚ_ªUŸ¹/Ï»_Ñ·ëן¸í—çݯèÛåiÿø¶¶ÿëÎ@ s|l<«<ï5Ÿîê³OšÏ]�Ûò¼ã]Û˜½­ÆÆ~áêmÙ¶'ÆH6vÈsz´L×!ÕÚ–cÁxVr…)>¶ÏºÍ5\}á=·7_�8^§´víXÇ4”b,¼3·UUµÚx-b옹Í�9Œ±c­È¼slZ”}l É¿¯'™RÝ–ÛÇþ«W1Mñ\#hhWßÖWÕ¥a/ûÖŽYoåXSðñÌs\ÈOõñ±ÿØ=¼•mù}ìÞ±æÆªô^#hm¬ñ†Õ¢†�­«ù©>v/AëÕÚ�·|ÜÏð/‘ÆðVVË×kŽÚ.ÿ®Põ„­×ÇöĘ/†ŒdÛn;P?+nl²ñþbíðlmÌ»`ìˆYå´ÓŒhùø~ZÙßÓxEo4Q6·¿oËÞ˜¹­ÇkUw¬ñVƒ±1c[¼Ÿc;½g­Óœ—®Hÿ‚q¬ä s|€#ÜÜÇÆÛ×Ö=͈ãIë˜Ö8LuÜQ^•Œs,óødÞc†ú"=Mü~Oÿ û"Æ|5�µ‡O[îí£÷„©šjÞшü°‹X÷4"gîØ©óªŠý Õº3¯ãI§µ­¬ç«žiF¾¿Ö}¬ÝÓŽœ5ïö•ˆÆ5 óŽwììˆyUžDb_ˆ™ÓËiOà5>ÏÇ3ÏrÊ÷�ácåžvä4Ö•ˆÖ=�‹ª>Öõ2ïhGð1„ó„üþ±ýV¼ù†ÿyïÞ›ûç9k3_ Uw̾ÓºÜsÚ‚ü~n³ÙzÉkEðñÓ)›Û÷ü鸣qOóçÝÏIÅ:¦šw4.÷´ß·èˆœ÷ÄúxL|?§¾æ=v¤ÂÍ}�tÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGðñCùùÛy¯¿ªg=êØÏ¯¿ èø×"áLÿÏäGâò~Øöç–£ø(ãÿ‘¼þí*Ó¢Öñ²uÌÄÇ`ÿ�äÇÇŸ ãû_…x�vþœÌ¾õ{þá;¾ýùc± ˆ€�ÿHvÇÇõÍêxWVB¾ÿ¼ç­á0îIÅÇêìQïðQÆý#ÙÛ÷>Q=îãò„µþs˜ ãþ‘ÔŽ†ÛóÒý#ìc ÇFûÏd{½£ùú‘óÕ��qÿPÊîãê½Ñõû«o¿Œ÷QW�ãt5@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGþ\.‘Ä™_ÉLIEND®B`‚nð.h¾(º ²ûÏSÁû^ÿ‰PNG  IHDR�oì„ PLTE€€€™™ÿÀÀÀÿÿÿíú½TbKGDˆHËIDATxœí��z›ÈDç&zÿg¾›D²˜A@·Ú¥ò9ß®m15�~’´¨Ð¾{ð>è€�:à#€ø >è€�:à#€ø >è€�:à#€ø >è€�:à#€ø >è€�:à#€ø >è€�:à#€ø¦µç÷vçßíû‹Ÿú{\MYüöÒ ¿]hgæç+Á6b˜¶8ʶ�~zÞ8}ô}<9Êóááâ@»GÈ؆ažçÃå1ùu޼=—.¾ŸRÄÇ« álÃ0{>>±öééëb�Çéôkܧ@Ýz÷E‹ð׋•7“x^G?ZDÝSž£.ªMóºûC¶a˜§G½��jk/W²Ë;õýøz÷ù‹ñÏW>vuÓ]÷5H[ÿ4Ìëæ™»a"lÂ0�{yäÞ¾”¸=~¾=ìàå’åï?<¾Ü¶‹në;.WY%l|\�Í7Le|‡U¸ ›0ÌÄÇþì×ÿry™¸:s®—/4ZÜk¹hq[NçyïnÕ~µÛè~›ÜÅ„Fy«©A6a˜åÙf}H®mëÎDý¥áÆÇ­fËõ�ùØ�×g¸‰�ƒÜÕ ½»Ãs |ŒÃ& ³.†çÑqnç_ñë‰�qØ„af>>N„Ûç·¯#{sm9píõóÇ�@«“çm¹êòì6öñ¶îEÞJT¸ ›0Ìó Ò’Û Ïͽ׌ËkÃíO·Nªçƒ@Ûúô¼ˆ\Œ]0wz÷¿êóúÛ�Mfsæúú}[(¶½÷×¹f¸déÈòÒòK·ç‰ð±Fÿµ;Ó͵çâÝ‘öõ^äê,Û�¹y9ºÅ` ÛМþ¢* .Â6´fyfÆÇ€mhMë%y§2è˜@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGð@|Ðt8çãŸ{·Æ¿ðN©õGÄvz-8>èpƬvÃG€w‚�:œ0«Ý6>þym§ý.’êãߟÀ5®ûø÷\Øð �ÀùñÆù —°�›Ïà#ÀUb>ýîJ >è€�:à#€ø >è€�:à#€ø >è€�:à#€ø >è€�:à#€ø >è€�aÚ�k oÃà#¤��aðÒÀÇ0øiàc|„4ð1 >Bø! | ƒ��>†ÁGHÃà#¤��aðÒÀÇ0øiàc|„4ð1 >Bø! | ƒ��>†ÁGHÃà#¤��aðÒÀÇ0øiàc|„4ð1 >Bø! | ƒ��>†ÁGHÃà#¤��aðÒÀÇ0øiàc|„4ð1 >BÛÜ¿-×úqG'>B×}l÷/ë5~Üщ��Fðzñ û¸YáÇ�øiD|üû¼qýô.“s~|¬Õ @üùãz­w¶àüiàc|„4Âïwt׫ø!çóݯ¿»R5øiðy¹0øiàc|„4ð1 >Bø! | ƒ��>†ÁGHÃà#¤��aðÒÀÇ0øiàc|„4ð1 >Bø! | ƒ��>†ÁGHÃà#¤��aðÒÀÇ0øiàc|„4ð1 >Bø! | ƒ��>†ÁGHÃà#¤��aðÒÀÇ0øiàc|„4ð1 >Bø! | ƒ��>†ÁGHÃà#¤��aðÒÀÇ0øiàc|„4ð1 >Bø! | ƒ��>†ÁGHÃà#¤��aðÒÀÇ0øiàc|„4ð1 >Bø! | ƒ��>†ÁGHÃà#¤��aðÒøØþãù Â\÷±ýûÒÖký¸£!�àõ*>â#$‚�aðÒˆøø÷‰#>â#¤‘{~l€ëÕ0œ! | ƒ��ïw„ÁGHƒÏ„ÁGHƒÏË…ÁGHÃà#¤��aðÒÀÇ0øiàc|„4ð1 >Bø! | ƒ��>†ÁGHÃà#¤��aðÒÀÇ0øiàc|„4ð1 >Bø! | ƒ��>†ÁGHÃà#¤��aðÒÀÇ0øiàc|„4ð1 >Bø! | ƒ��>†ÁGHÃà#¤��aðÒÀÇ0øiàc|„4ð1 >Bø! | ƒ��>†ÁGHÃà#¤��aðÒÀÇ0øiàc|„4ð1 >Bø! | ƒ��>†ÁGHÃà#¤��aðÒÀÇ0øiàc|„4ð1 >Bø! | ƒ��FÀÇö÷o˵~Üщ��ÆuÛýËz�wtâ#¤¼^ÅG|„DÂ>nVøqG'>BqWOñà21Ûóiä¿Û äcÛüpãüp�ˆ�mð>\'òþãó+>dxÿñ/_ ÀG€0|^. >Bø! | ƒ��>†ÁGHÃà#¤��aðÒønÛ§ÍóyÖ6ø”íu”®�ÊFþ>¾ÝÇ_²¡U·;ðñ *‡ŠÛ�‰�Ç}üûQ|<³¤vŸ >vö±µÍ'ãðñÅ’Úy|&øØqÜÇJâã‰%µóøLð±ã„�mð—åà#>ÆÀÇŽ׫­z‰�ß4�Ï;N¼žsìôˆ�ß5�Ï;x¿ã *‡ŠÛ�‰�Ç||þ};øxbIí<>|ìÀǃ¨*n&>vœú<À…ç�ƒÍÝ}dõŠ�£Ï¼>†ÞÞ89ô¡Ñr¢Ww;˜–ËsnÊ뵕å}1·3ï?òµ�¿¢>ÖÁÇdðñ=¤ùxíz‡[Ž�'ÄÈòqûàãàÆh´ƒ¡Ç–ããÉ1Ò|< >Xrênøˆ�øˆ�%CãcÇÉëUž?þÞ¿1í`è±åøx2@ ^Ï954>¾?çœ|¿ãøx`É©»á#>^,9u7|ÄÇ­f\¯nî6¸1í`è±åøx2@Œïò±�ã?ÿýjÏ__õq]ë>tû›ÛÝ87ô`€å]ÚóÆv˜Eùþó�m6÷—“Üx#“I½šëÁ¡'î.9ž›1É‹¼Ì}1··½ßq­ÞÇ_­¿qnèÁW|\–ß\\ññWÝx#øx |ì†ÆÇ,ðñu>žü¼>âã|èÉ€øø¾ç�øˆ�Ó¡'âãÛþ¼>âã|èÉ€øˆ�›aðqgRøø2úår|äzññ@ôË;¤øÈë9ø8ÿõÙ¡'â#ïwl†ÁÇ�IáãËè—wH:?´ññåГññÌ¿ouìœÃG||9ôd@||Ïë«ë#¹›ËÆÇW6Çï5�|ìó´�ëÍûTp=‰nÉdîã�¥çãÅ£}´Í^ÝX¯3ÿË>_ν‚û^|q‡ùâŸäã�Ãø›}o |\ú8(/æãîîIóñÌûøˆ�ã17CãcÇ{ÞïÀG|�¹;Þó~>âãxÌÍÐøØ��›aðñ9©É¯ñqF��ÿ}d|\¤õ?-çŠ�³17CãcGàß+¿?Ÿ\?­ÄG|œ�¹;μßÑÿƒåíß—¶^ ñq>æfh|ì¸îã ããÙ17CãcGðýG|ÄÇScn†ÆÇŽàû�øˆ�§ÆÜ ��±÷;Ú­÷±-øÕfüšÞ8Èî:óÑF…§w}oÜf6è—�ÌðÔŸ·ZŸ¿þÖ•óãà|±9“ŒOúu–�ŸÏ�“þÁÄwÏ�£"“I¼ê»>?>[ý^=掀^`´ÕÖ]WLj³dÜê%¯¶îdF“óãúŠd²A§G“sìü°˜Ü›{{qÔj5ô™?oõÇßÍ}ñ_ƒ�é>þSrsW|ÄÇ×àc¾�mõþcûw¾Üœ5o7|7|ÄG|Žú|Î쎿·¾›?>â#>G;÷~Çñ¿?ñq0|Lôñ(øˆ�“àcêù±¥þyd|ÄG|\ý}_>â#>®‡þ¾¿Ï ñ×C¿ÁÇᑼÚNã½°s€·í’Å6y¡Â|;u£ÿÞ;bÖóØ¿ç)9'Ó�/Y?Ô�o´å6ꎋÍ<[w¾Ýw÷ïf´ÁË�Í4Ú=“Üõ »ŠƒÝÝîÓ]¤­nL‹ìl÷c>ö­ã¼ázu²­c>ÎÏ1öñK§GûĘŒ/}|Udp(lZôñÔvßÝ¿›Ñ2|<¼Î%w×™‰û8Ü¿ox=gw<ðÏnÚæãQðñØ |ÄÇí:'Ÿ?âcÚ |ÄÇí:øxă³‡>ÎI|Ü+Âë9Ç<8{hàãì�Äǽ"øx̃³‡>ÎI|Ü+Âë9Ç<8{hàãì�Äǽ"où÷‘w÷×ÁCññì¦ýY>ÿ÷‘w÷×ÁCññì¦ýa>î/ÆG|ކ�ûÝj�:ßuL_£]Yç­­2ŠÌGëïV³{"›Zq÷¼qe÷Êì›"žQ5EŽùxÿËÉyþø¹£%=:>Êí›"žQ5E¸^•Ù%6E<£jŠà£Ì.±)âUSäèõjãzõ³G'Jzt|”Û%6E<£jŠ÷ñµ‰õ>ZEÙñŒª)rôùãáÓ#>jŽN”ôèg}|¨†�::QÒ£s~”‹²)âUS„ç�2Q6E<£jŠ|öë«VQ6E<£jŠà£L”MϨš"Ÿýù«(›"žQ5EðQ&ʦˆgTM|”‰²)âUSe¢lŠxFÕÁG™(›"žQ5EðQ&ʦˆgTM|”‰²)âUSe¢lŠxFÕÁG™(›"žQ5EðQ&ʦˆgTM|”‰²)âUS$äc»û×}¬%G'Jzô ÿi¸^%G'JzôÛ ?gt¢¤GÏ8?Žÿ s|”�(éÑó|\ÿ©H|”�(éÑsÏ��µÚ‚_E7l¢Þ;:QÒ£?nÄ__]¯Õ¬í€‰’=íüˆ�Ÿ1:QÒ£¿çzeG'Jzô¼ó㟫Þî—V{Án‡%9zŠ�cI­ö‚Ý'Jrt|”‹²)âUSe¢lŠxFÕÁG™(›"žQ5EðQ&ʦˆgTM|”‰²)âUSe¢lŠxFÕÁG™(›"žQ5EðQ&ʦˆgTM|”‰²)âUSe¢lŠxFÕÁG™(›"žQ5EðQ&ʦˆgTM|”‰²)âUSe¢lŠxFÕÁG™(›"žQ5EðQ&ʦˆgTM|”‰²)âUSe¢lŠxFÕÁG™(›"žQ5EðQ&ʦˆgTM|”‰²)âUSe¢lŠxFÕÁG™(›"žQ5EðQ&ʦˆgTM|”‰²)âUSe¢lŠxFÕÁG™(›"žQ5EðQ&ʦˆgTM|”‰²)âUSe¢lŠxFÕÁG™(›"žQ5EðQ&ʦˆgTM|”‰²)âUSe¢lŠxFÕÁG™(›"žQ5EðQ&ʦˆgTM|”‰²)âUSe¢lŠxFÕÁG™(›"žQ5EðQ&ʦˆgTM|”‰²)âUSe¢lŠxFÕÁG™(›"žQ5EðQ&ʦˆgTM|”‰²)âUSe¢lŠxFÕÁG™(›"žQ5EB>¶»ÝJø(9:QÒ£gøø×ö^ %G'JzôÛ ?gt¢¤GÏ8?âã�N”ôèø(eSÄ3ª¦H®�mÁ¯¢6Qï�(éÑ78?ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"|@&ʦˆgTM>/'eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"qÛðQ}t¢¤GOôqë§Ñ^°ÛáDIŽŽ�rQ6E<£jŠ„}ܬ€�’£%=zž�«§�ø¨9:QÒ£çžkµ¿ŠnØD½wt¢¤GÜÈy¿ƒ×WåG'Jzô´ó#>~ÆèDI�þžëU|”�(éÑóÎ�®zW·�ö‚Ý'Jrô<~í»N”äèø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠà£L”MϨš"ø(eSÄ3ª¦>ÊDÙñŒª)‚�2Q6E<£jŠÄ}üÏ¿¶ºm´ìv8Q’£§ùØÖká£äèDI�Ž�rQ6E<£jŠà£L”MϨš"ø(eSÄ3ª¦H®� ¼áüøøïùÓ{oØDÙñŒª*²Õë m½–Ù^(Œ²)âUUd«×Úz-³½PeSÄ3ªªÈV¯Sü¹ê]�à´ £lŠxFUéí:å"¼|ÐtÀGð@|Ð!èããc?ã%;£_·Åj›ÁæK®M€Œÿíøq3x9�ã´ÍÝ/Ú`Éó£{£UÆß_rrÌ`oß>�4ƒoõqô†çmú`ñ†Í0œ3Ø™Á·Oà'Í`À{}üïÛ¨ïxrïØ ã 0ƒé ¾}?kÃì뼜ÅmtA}»�¯³_27ÃdÌ`2ƒoŸÀO›Álœkì<‹Ý?\í<%>ÿ4zÌ`üûoŸÀ�›ÁËéÀ÷ð6§�$íßÂùCÌx°ñeBîhm¹t³ÎNNÞh¯˜ôImg�ù`ºê¥Ñv6õíÅÎÎm2ëǺñÑFÇîvšé•öþ%øðªýò}þh3ë²F›ÓÚì˜Km~à´Í¦ve´ÛÅ��:ZÅ�8BÌÇyÙ¿_Ó<¹2ÚÞ¡�6ÚôоôòüùÑÚcÑ0¦ÿáÐÔN�¦ácÅ�8âƒ|¼ ^2®m÷PHmwœ~yþÂhí±h>Öpá|jgGÓ÷1ë@ñN‡/Êîm†ÁžM­µË‡BÎh/vÈüyPÖhmºh×Ç�©�íÅ’Ý]š8ZÁ�8â]>>J6 öžzOæÝVßß5ÚýÐ�¶ó²@Þh¯˜¥8½ž3nwgçŽ6Ygõ=6Ú€·ù§ù‰>î¼h}mÉ•÷HvÏhó½rjI»gMNƒ³kÏ¿?p~IRïE©;awÉd¿]Y2ºó±»9qù‰ÃtÉØÔKK¾HYr~ÉuæKæï„\Y’;·—KÆ�/g—Œøó�Ò¿_Ó–äíðù[W–(ûø˜öhÒW–”ù˜÷P>â#|̽ºi�oëÎ/Iôñ6{ëàÊm'v]]‚�…d ùøýüEø+K¦ŸZr™NýÜ’6Çe¶dg•Ç—¼%Ãi_]‚�ŸJ[}OY29=�]òbÁé%mzR�.™-ØEÿä’ÌØÛ­ôõœñL®,ð}PtÀGð@|ÐtÀGð@|ÐtÀGð@|ÐtÀGðñ“ùúCz÷?±7»×`µ6úÃÕðݰK>˜/©&vµçÝF«á£ì’Ïåþ÷XMízu¾ÄG=Ø%ŸË—�_+Æã¯†¸_Ž~]ÌÞïõXí~cq_�}ñ¹lÎ�ý·î<Ø:!·ÿƒìŠÏeàãð vï6>jÁ®ø\¶ö=/T�ûÈ«ìŠÏet6\_—nïÁ¹Qvdz~¿c÷ù#׫Ÿ»â“i›gŒÝk¦ýë«c?¹\•‚} >è€�:à#€ø >è€�:à#€ø >è€�:à#€ø >è€�:à#€ø >è€�:à#€ø >è€�:à#€ÿÝ‚"o¤ƒÞIEND®B`‚‹|Dda5�$xxðN² ð C ð*AÁÿimage002ð€bðé{È ë�Wí¨F·PïÒx€*´ÿÅ{D'nð½{È ë�Wí¨F·PïÒx€*´ÿ‰PNG  IHDR�oì„ `PLTEff€ÿfÌ€€Ìÿÿÿ€™3f€€ÿÿÿÿ€€€™™ÿÿ€€ÀÀÀÌÌÿÌÿÿÿÿÌÿÿÿ�Nÿ†bKGDˆH cmPPJCmp0712Hs¼zâIDATx^í� ƒ­¼q¦;q2ãıç:Éÿÿ­Zk¯;´:ñ×·B€¤‡·68?ÿ;æÌxÊü<åDæy̘#ð¿“ǹæg.æ™Ì˜<Î50Gà9#0y|Î\Ì3™#0yœk`ŽÀsF`òøœ¹˜g2G`ò8×À�çŒÀäñ9s1ÏdŽÀäq®�9Ï�ÉãsæbžÉ�Éã\sž3“ÇçÌÅ<“9“ǹæg.æ™Ì˜<Î50Gà9#0y|Î\Ì3™#0yœk`ŽÀsF`òøœ¹˜g2G`ò8×À�çŒÀäñ9s1ÏdŽÀäq®�9Ï�ÉãsæbžÉ�Éãkà'ÿ˜‡r6—}Ýn®¸œyŒÓF`òxÚЂŽ3k6q!C�®¸¢yŒsF`òxθâ^ F&M!ÔB�®¸¢yŒsF`òxθN¯×ïcòxÅœN}¼b”¿pŒÉã³ýÇ‘1î�ÕÖ%"TÂBäÓÅ3ÍjÔ¨õIèÀW\õ<ÆøLÇÇl|�Äc‡þ«ná×ôOÒºÀ$ºr˜�ö+;÷¿r_­ÓÞûø…Ì=N�ÉãÉœºGRˆ"­�Ôª!ô’@ˆ •çëo¹"Lu�î‚öyŒ‘˜<ŽŒÖÖ¶”:Ì͆ÈBÚÁ£ÛC<¶CÒ£m½¦¹ß#0ynJœç$Ÿw¾óŒŽ�ÉãqcyTOS�É÷õ3y|ÞœMŸ7'W�Ñäñª‘Žgò«¯µœ<~mFçõ¼y&�ož½yî_�Éã×ft^Ï›G`òøæÙ›çþµ˜<~mFçõ¼y&�ož½yî_�Éã×ft^Ï›G`òøæÙ›çþµ˜<~mFçõ¼y&�ož½yî_�Éã×ft^Ï›G`òøæÙ›çþµ˜<~mFçõ¼y&�ož½yî_�Éã×ft^Ï›G`òøæÙ›çþµ˜<~mFçõ¼y&�‡ÎÞßÛÏ¡ÝÎÎ~ËL�™éÂáŸ?þ¾üoý~Ž9ÄìåŒÀäqç$w3‡•Çò×úëg²¹s�Ïî“Ç­sÝAüì‰<Âí“Í­þ+ö›<O3SÄ!›e�Éæðà}‡Éc|†5EÜÌã´iãƒÿKZNí(â!§nþ*6'�xº+ˆ&€Wê#äžÔŒ}’ÓÉc™V¢ˆ�çÚÊ“Íϰ9ydÁè½Uuz†½JÎdNºŠN6_Íæ/æƒ8"ˆO°WÅX¹•L6_ÇæoäQTÄ/òØTs¹¸Éæ+Øü]<æE™—éߢ��ǧ�<>gIüÅ<ÎüæsV&9“¯ë£Vãö«õQ²ÖϦM{;§ŸåÑ©q›< ÁZh‡O6oaó{<*}ê/þfÿQÓG6FÅÏžl^Ææ‡x´3ú“GÑáñ¬(£“ÍSÙü�¡Œþäñapz²y8›¯æ‚ÈÜ!ú�ó÷Žp+ØõçççïËÿ~PoÜSÛö‰dN ^`ì#Í6%Ô2?[LÍXÐQ`^Áãº>—ó üŠ^•Ÿ¾àëèd…ë1rz3ÿ™?ÛF_ «Í­ŽæZÀS7£ ™µ»€ÇtˆŸåÿÜ_þUh$ ·ñËô±‘˜¥£”t��h–O·úh}„"MÄG²x\àûË_þòó³ü?°g“}ñÛ6§ÂŽgÚ«ðZ¤C'3ü¸«ô÷4¸„Çì?Ú«D—6P‡O²Yû³ú„ú’3y\h\x\þ/ýΧ"šGÂ÷8É-l²Yï8—ðØìÕåh–Y‚>ËmUßš97è^¡$â¾Âú˜(\aÌ<"(Ó…ÚQ ×Û«ý&&«æúé/×ÍKyLQVC&›Y2NÛ‰ú(Hâ&�™I€c‰Ì"“URÍ#%ó^{UçÂ/dóJ Šz˜õidÚ £“ÌÉãuËyàHWèãÀéÔ´È¥ú(�ª�Ú)¨Œ%ª˜GD#p"³ ? k +Fqc¡Ð×äq|Y^°Çïæ�DhöiI[Ô��G•Æ\E„â›Ð6»UëäN&�Ð5~ˆßÊ#ÓÄ1�´5S´àÔx,œ" Ä‚ˆ‘ë&GÓ¶"*ºš{4s t#Fyh$ÏIÃ4ýÇqÚ·îÁ&ñ€JÍMd–ž%O¸164 �…G—Æ #±Y ¯É)¤6û!Y¹¨�‘'=yÜ ×†ýÀOð¤µmN´âM�Di`´çöÓ}{ýO€Æ*Ž4ñ$”y$¢0Ôú�jæÔÇ ‹:´ËgìU¶DÀÚ¡ӺÊMIw¨3b�Ââ·ÌcˆÆV£cIò’Çòh¬8?¤,Ëü!ŸN} ñ}L#_ýüFjÝDÚé6¹� yZô÷ï1aÍœîb.ÐBl¨`î0aµxCs§i*[›û?�<ƒZ¨—ý< ’¸‡Ç¾z×j7ÌÉZ”˜ª­z©QëFo‹« NÓGÙd0Ts'¤ÓÔ0x«½ªëc“D‡¿@ŠQ�&)ƒpZ Je;.�ÐΕ2“ßÏâbó�ÓA)š“Ç�®Œ7z �!ó”ä0Ná±@„4’d.pyÄKôÖc5 ïãޙĊƒF.5©÷[¦rÓ^‡}û¾Á [„â5VÀGXMä ÊŸèA©WíêÖjn’Dš?¦Õ‹ìÙgñx„hN{õ]öêÿFyÔ lÎyÁ‚ UÌ·± ˜R‹C<²æ`wÙ½ë``MŠ©è±õ9º«9 �ŠN}Ü®kGíàg¯y¡µB ‘hÃ›Õ œÒ�B\¨6)ÀÅH‹µ:–Gpo hÆ=Í!Ñü¨¹ZßûvGb?ë ­O>ú¿Úî�²uê{˜Ž?)¨Xš¸è%ÓÿhTÇHA=QâÑú&EWÓ\ýò–-¿J¯à1ðâÕþæëb@A±w€ÿ(iÖ·ÅÑH�Ä é£•É—S¾X«ãõÑTB¬šFìäñ­|2½ŸRã4`žzümÈw(’ׂ84¡hx�ò¦jÿÒˆm)ó‹‘ku1�G«æ´W÷aº•ǰ—ÃCy̧¡™  ®ú�¤¶‚Ѝ$køQúw m%Ü®š“Ç<&Ç1`¶öC,Óˆ³‰÷ñ˜¥y=¾Æ£Š£bUIM6q1Kîúá“ìÕ£xUÓq3Êæo>nu…ÿ˜(‹êc¿câi¹ƒGxGXoZCçQÒ²d¹ù›_Ù*ƱbÆ©ÄÏÑŸ <óaGR#Ú¯>þø8­x"tPºõQÙÍ/ó(bdà¸�Gé%{BK×v™°Qÿq§ÚöªsÏ-6,ûM}Üa°Æõñn›&2Z·È£šós,[6“¬ß¦$ö�*þœqLmoyÜŠ¨æäq3ŽÇ1–ï8Yñm˜óXB:vºéE:†û(äHrëõ¿Ä·ªd 0ƒPíÕ[õQ¶ÒÕN}ÜdŠçV�×ä�öjÄ1ûùù÷åççßíÇ7ª˜‰[Û[­Ó6 $½m„%óöªb‘¯O7ó¸aÇqÚ|@ÿ‘DlˆÃˆþ,<.LÖŸú¨{3±£ÒJ³™Åõ|®2(0ÔÂ`ÁÁ-ö*½M7`µy—ÓyÄÙá>L…'Ë#üé+I4N Ш†)ÙÐ;Èÿuå�uÔ�¶�t¨RU<�©�›ÑÚ´ã™ò�¸b‚¨ ùgTÐÍ~Ù.‘�dÍœöê!Líéä—ðÈÍSv?7ñÔxÔ­ë]¦xÝ+·@Tʲ‰>e@Fà3 Ñ=Íœú¸¯á}?Ïc'QˆçX´-[©œ¾È'l7°ÕOO5s&rý)§·›G µblvò8ÌÔž¾Ì#²NÝ÷Xú8*�ØÉ¤Ð ¢Za_%³`QÐòE÷ßÿ=ƒt �½3O3JãähÌþOg¾cõÃûºÎ ™Þ(ë ÅgöðXÚ$†‚®Š<²¹ëI4ú<=Íœ</èèÓGè':öéÀó��^|§Ê$É“�­f ËŸƒ¾NÓGÉŒG �FìÌw¨x~†G±9ŒÇŠ@Äî4lQ™Îò©¼Ÿç²žd¯nõj"‹~æÌwD%Ðl÷³Ÿèš¸›ã9ð¨áè…�Îñm»×ŠÁŒ‹æÔÇ�ê£ežö~€¥%õ £Vn,åIœä=!žhI«àŠ+’©½�jÆs4 ߪ�¾yz �³s/ŽÔ†e@n¹n籇–¨1»Ÿ<¹‡_Ýa¯“4ö€‡a|]óô(?¤X””;�¡(툯I�¼•G74«E…eaW?�ß}ùÂ÷Ë_ÀªEÎ]ù�ß(õ9År<…Ç@ÚŸ2–wA;&n–ÿ…e°õ)ì±HN?b\²ö…t­dèŽdùãäjùGqîeJ'�»ô1…W}7ê£ç¹€êeY ØÄë“4Tó*ß`‡�Ÿ¨ŸØ�Êö(¶Ï™êDz�N… ©*÷=ã”Å[ºõК�<î"Oܹ¿?ÎëÜÅ£IËà篲>ŽóS¥‘ñRdSêqÀ³ì*@VØ¿Kesá¨L�ŒSoéòØïÅZhêãJsÑÁ3õ±¡H–ÓúçàтéA…+¾tÓÕ«ö+Á£ù•¬âgȪ®ÏBãÞáñ!’qÊâ-x”ûìës.ñó=îò>ºö*VEÆã²ù¯ýkjD?%ã!Û¬Û¢QqÊâ-Gxz]gdêã}ܰ«ë"”ÇÆ•ÇôS¡lB(.t�Çõõ­0úI<´O§;¦´,\”> ½ä» ù­åœÆŒSo¹“Çõ´&� Ú±Ë <æUÐEQ0P»ß²¸Ž€ÇôolcJ"cÙ—™–55h؉h“‡7g[ Ô’P«tŽÚ‘V»5NY¼å@§ º“ÇlmÙõ©(šè#µOã<%‹/ÙJ@¤»°Ý÷·" Ýîâ8fe–åÑ=Ìjcƒ[UúgÜ4�<ޱñe}ÄñSï…«}‘ 8­\Iåi =²°#‘šØWUw„Çnbçóí&lDÔ'�cPíhýMEûÔÑǺ9e9¨¹*Ú®5úšÃ¯šå¯¨“�#¥~LT¿#H!Uû|ûÑrØ­;õq@4§½ºîwõoÉJ Š´…ówÞÜ�Th®‚ÔB³'DòÇœÌòɺI�"¡„€'\ò¨º•þQJ‹˜.`N\ꨫ/é£cŸzçi‘y8’0O“È·þoHf#ö¯í_U×B2u²«çdCT‚­ úÃ%E×Ë/ì*÷âUî„t$)9ó�gÝ´~Çô1//êÐG•&�¢>æü$&ý…·uÅÿÂV¢©�qyt8µ…¸nÅc[L‰zòyãäñH^¯��Äý<"¢du}LÖªF¤¶AUD)ÁRuU°\¯Ò²oC@’¡î§Ko‰�N}lEÞp}t.\˜Ñäîâé£J`OE²2`Žf+U$2ˆ#°~i±^_ò5Ö-¯óÍXÝf…ûBÔT)l§YZ‹ ‡È“{˜õ9GçôgÃ2O=‘Å[-¡"0J]ÙÖ�²iÙ¿ép¸ÜgTaûȾ![# ¦%¯Ø�<îâq��õ‰+ÿW=ŒÊcCÑ•Ãy„)WYdGw+Ý ˜¿yÝëñX×ZEaj£¿RaW¼(ÇÛ}H5'�{x <ùØŸXÎh#A›£yÄqH¹<«5åá¬ìË>nTúIÊÚ‚€yê£5À£¤˜û­ØÉã3aõYËÐ ­ð”IöéÑ<ê6_.§#b×È=8Ö=Jš' ªc®XpYî#¾…G×”¡tòx�ÅqüÆìU™Dgþ,ÄcÓH G¥+tɉ”úþk‡ÒˆœJ;HÎgÏ(íâ±eFˆ�9yLªuÕϪ�ÉŒê#¶OÏæq9šn”ƒ8šÙ”¥‚k)µvC û¨I‘œH*¶YÿZ5î]Å\Ìøê9€¦÷ut³Uy¯U úöéÙ<þçÏ"wËc–RS#ò( ²)�äž² Ö3%@ÿü€ªPoðcòfÔøÒ+!‘9y<…ÇÑ>€ß�½úŸ �ËÿªJãd4+éè¥fD+QŸ²æÅâŸÎC‰Ú"„—�ÔÄ<‚ˆ‘™0™õr;!~áã…<¦™Ï<®?+’d)Ã8NÜ^u2=EX‡�ohóº©æIz)mºI_[pw²)±w,�ž-;ߟ³‡Èñ>^Ãc³‹;ŽIìÒmåq]ßzòQÛf‡k"ÑÝŒ[ íÙ ÍÓ~L=“ùºnJ \ÉcóY«b¦.à çþÕàº$ž“¯å˜z€~ãìÆMþ—‹0j€]TÌc·[óšNzÒÿ),tUµ"T�þÄ]ê‡!y̯"Iï6¤¡lÉ&?ôN‘b^€ã…¡Np¨KxÜ ­.\>~ªÿXQÇ úXìVȠɣayê@†ÍÕvOˆ%[òkcõ€’%Ùð N¢µÓ»ôÝ~'�˜Úµ ’›Hn ¡Rž}µQ‹û˜P¬ÿΚä1š}dºÖT=êª[¿€°ªuMO¹ÝjóhÙÃyÏ›ìÕÉã.žöîìÒæ†OIl â»¼Æc×É!{±¬é¢Qš2=áÎ*H|¢è¬ ·V¿ud¶'�{×6Û¿[©OµWYë},(ªˆ#M$®dBÕ+³ÐÒ(3W‹ù)Fiªm ÄPÑp ÚZCƒÐÎ{È;â9S¿ Œtx�>BU´xÍÕšY�´ÅÅ”º1ð,k2Îåà“?ÆŒ1º@"£^KïɌƂ§?ËAn‰¯ÞÏcJFŸRiýB}ôã7<´ œÅ�<®¹ÉôÓÂ$|±[^×�ÏéáØ`â‘T±—ê s¢ E;¹A�Ø(Hš9ô •Ø�ÒÃñœ±§”†Z’G8uyÍ‘e£ýíš«%ÀÕÉTÍ…L‡l†y„"¼?q宯wJ­Pâ÷ðXo^í¹Ü¡¯M,œ¹_zúe;‰‡ñØ�ÙZT‡ Ê#Å�<‚ÄG. ¹àfÖ;g@5ã<ŽÊ£ŒéFåx%jüi—_Áü<&ÿ1`ˆ “· ý5ž¡¸¶>g$ŽÓ zæî!ò ìS²‚ t-çÈxÄòH7—\Is1»‡×EHÄÓÔ¸ ªÙŸ‚õé”pá. °·�=ÓrÙó¶OQnzE¹\ï}ôŸ1ü”>6UŒê¡À#Ô½m<¶bt)ôÃ9ðÉ 8 ¸–-7„�H-,´çöjsò˜ã°éáÂòç™ß¯ðˆ Ôm<ydò·>û¡jg¡P؉˜³ÂŸaýJ Ûl®6çPQö¥ãÞ·j¿@ÁP‘Wµ¾IÝG›*·�à-öäÙûØæ)üžã¶0á&"3ª.�lqÚ¦&QäÀʪaSXeÚìmŒñØç£� ý<žÇ€ãâ9õŸþ£M¯ç±¨¢G¬[P—;pô∊\=ÕÄ <ÚÕ· (Ï“Gíû�$UFO†ÌôxN,ôóPËÉ'Ã3Û¡�_½uÞÝÞ ¾5ç¢z¹r Õš6.̉瀰Í1^ïô.€ŸÔÆ óÈ3ДøøTbï¨8Ñ"¼Ú6´l*®0óOH6c¼`G´g 8¡Qb§Ãî#Ù/gMà�mâ"@G½GýèÁOH@¦³BS4ÙÞÐÏuþ㉂®¯æ›6ñHQL á}Täq= ß´G1�bO ¤€ÎHd0šc½Á€u…ÈE>ÝPªÏÙú™<pŸH¶÷v‚¿XÕlÆ1î§5ãÐGå^y�??+Ž�H #}«K3ê±Y]�GE}5óçU)“ƒòhš«¢½JN³kŒ’O!{\JUÁÌG™ñœ½@‚|Ì�½ªÏ· (m€Ý�eƳ<®<.ÿ/²uœ¹ŠB:î£�ã@Îd0šSC¬,ëBÏÝ´,ÿÑõ?ÿtçá>yÜÉcf0ýŒù�òX­§jÿTW�Œ“WðXÌìäS)�¼³”ÁVÂÏ–ÑÛÏcŸÿ‚æÔÇ�(¶B¾e½KWa¢ñ˜ÍÖÅVHöU»ÖRÚE7WÕ-üöQå„g07¸�!—1ËÈÄy€T ýL{u“E+™I%•š§X-£ö*¥ÔÍU×Ì×]áU&•Ñq ª»™ÇßÓYu¢«¼`‰æÐ“/@^ÅãÔÇ},nÜÛ¥ÍÏwôEÒg�æ$s5»‘8ºJÒ ûÂ9ÀG°!Öƒ^©�“Ç�DíÛí0�…êó˜c­•—Ãy¬/þÈ>TyÿK÷,k<5R6ájò20üL�ß×GˬÃÛzýj¬Úõ–úœ1>áz‹|ÉULáÕeíù�uÓÈ…(�q÷±Œ†ô1î=Êòˆ ï–=lùD¡V¶WèU“¾ÖÓ—Nè7ð¸éùŽÀN¥¨»”ÁŒQr]ë�ú_àh˪ërâ¶ûˆÕ²c²' ›"ù©;0$‡‘pÍò,×'“gðØê–qÑ|�¥Ûó“2ædû¯ãÈâ�ÝWdáUmíÑ× êšöxd¦ ´‹áÎ×Ëcæ±—^q Se“ �"ŽCäÉ=\Ï�ú«}þ&ÿP õXql§%Eºª6—‹û}�¾Y Dò^yTêyùIåJÃ: ]!¿Åc½˜âEšA¼{üöºÆØ‘lçOðÇìÕ-òH-I˼•&Ž¡ÀhéïTyÔ3)£ú˜Ä1ÉjvËÏЋ�‡TóB},×ÒŸ†ˆeøC¯½Zû�Ñr~k•dž¢“ÎàËîÀØ¢áÒ@ÛÜ‹î:–ÃU·²¸Ð{äz™·îWÍëx<�7ͽ’Çr'üj цUñL~ �¼�aÆjÑIí=’Cò¨ÊÝh”FPC2(¯æJqðyd˜ïP¦q�>:æ*Ç,ª�¸Vð8×wÓxϲFj<†4Ì)L0Fô1Ìc¹›*fìˆ;íÕìèPN¦Ø:Š™³ƒÇay¤Å;µ SSi‘¿©;ƒÍ¿ÝÈsåÜdÑý£zŽéŒ×7…4#\N±'yqvÃ<&ã¦ÿ° ÛÁcZ8èg›¹*bã±Ô¬×Uɯ%¥ü+KPmÛq÷ì1ÂcÓ61!Æ´°�û™ú¸ŸÖ†£—JmÎöýt†ëPöåñ_ÿõ_é0,ëÑsÿ!\ ÷QJŽ,Ÿi‚Ú£³ 5'Ê ,9!Ïì`¹¸ ¥üõû€‚…bˆ»AcYg.Ä#1c¥ˆY ÖËí_÷‘nð;Ž�J<çHÓ�‚£ìõ)ÙÇ1Ó×±o!RP¦¤JçvÝÚáÅTŽË#´F}}l÷0ͬâ±A\nÈëßr“Çäf€ãý<þ0Iµj˜±íî#\¾¬¨Çc+t üL7FsÌhW4‡ïNô1Ÿ'+/ÜÇ£Ä%Èi¯îâx+�iqµpM¯Ž“ÍÏsxFss/•ï0�¾f¤› 4Žª!‚3œ�…Dö¢_.º¶I!{k‚9yÜÇcÒúþU³âH­Øo¯®ç�&{œG·:Ç’;o[$•Ò2Ö!ÕÍR¹ÎGÕM¬¨*�¬^ı< z9yÜÇã–½Ýpª(è"±XþÇq$ÛaJ퀞 M›i˜LÑÀ77gƒ3·Æ?{y,÷˜~’èt+�‡è# æ,—s�ISB…©)s1Ðú†xÎ0’‡ñ˜¤ÏK,8?�5W¹gYC´éìy(VÁ޹‹ÇåÈ,}�ËTÞÂãX‘ÙPë_ÃcC‘óXT²‚JvÂJûÉ ­·‘ôˆfÅ.,¬çœƒ(•J?ŠJD2瑬kΟ煰Áš=ÈSôñR«ŸPå¤T—E¿41òØÕª¥ÝKÖ­«vØ«�]›Áƒ¼ÇšóH¿Û kx�+„ä$Ëš2‰ÄôõÔ}Éåúià@â‹xlH5N}ìÞé´eÓ;RdÛ*!õêx�•QÊê*§Z¼ƒ�:Æ£jizÙÇí¡pÒ#<öç Ë-,Oé´W)p—Û«�0Sç³eÆ'3PÇyå±jbެ M = 7—Ï¡ «s¤ä5”^È#ºÀ5¶J2û<Û+$ûgÌ©��˜n¹žIb±@ùÔb°âê~Å`MaL—G BUJ{¼xsçEWÕ‡7Ç9=B׫ïC&É?BÞ%RT9Ê3íÕ#`�W×ÂûfŸžý<úX}AË}$­m򾮿‡yžå>FÄ×¶W›�ÚbÑÜ`U#©Â´O� Oì#^]ËýG%,ÇÂdòÉö¿éî£B\J-º£ºŸù¨å‘.�=‚G3ë�ó‹š÷¥Ю“0–PÌ€Ty¬-�\NÏâq ºö, su€Çf‹ ÝÉG PW0²þCáÕq³T€´œÌ;Œ(,&X§RŒGˆÜÈVÒºó´WwS:V‹+'<Ü;­cÑ‚û7PJT°A[ v+�MC˜FjÝÝt�иÅ>#Sûn†býÔ(÷.oâq=‘ ±Sé)_—[~Ýð¾Ž<¦Á³;LÁM·ÐM¼Û‘ Ï�(Éæ½›W²×¡)¥,F%�ºéf›™ŠÒ?}XvóXnÃ@.ïáXxN($á˜ÿøUgÚ­|§uày‡þó™Ç4‘ëïbÁ^ä¸<ÖÛ?b7¯JY�±^Àë)íå!{ƒ<šî¦o¯vYÌ9à)ÊWv�À»¼�Çz¨«<óà±ÐU£ó­<ú|ê Šë\v¿ƒkbò˜ù ±­Jô± žýɱŸôC\½@B¢í1+J͇x$æÖÚ¡n†Ï;ÜÏ©ïc‡<&ÕóŸGîúè¶¾¼^n‹ˆú7V[A‹M&39p!�\™W�ƒ«rKB4Z�Pú"ïޠëïpû l oŒs Êé5i<úvNõy çVµÏðÏß~þ–~úÏqOÅíq<¿•id­� *‡O‰»Ž}\N7 ™úã$^L7¬�0çÏr8Àú%KÒÎ'¬:ƒ±·_}Z�.‚¥°€˜y,??   ¨�<"‘%+’IäxzÖ¤f1݇§tîìle”Gäu·€1‰Zç?Ùcª/¶WkHÇ+mùâû¬Øÿ‘Ú¨M›<""WµtÜ<3ÝA6™«ò3˜eq—%ÞË#«Äg¸w™£¾Îc 欋̳@{„Õ ³~Õ^%,b§Dà1›®�Èp8§ ÎJv9‹cªIŽYÃ=Gñ˜ûñãE=¢ä‘ ä€>ÊM¯¬€ñdUºñœ‘ŒûçìUî/&eló¹ØªØ\­Vkö(%ÈøÌÇyPšàíⱃ<[ŒÙ-áU—GT*N#QŠåO ÖwñX %³_ ¼D?h�ÄÔ«ø�²¿8ÀãßþV‡#úhš«Åª”+Ѧ‹È¦~�#_ëjêc N«‘®/ò¸%10¾ÏWxL+ÑHWÕm«6Jú?+7Bë¦?êj–:¨ƒN8Ÿ`kÜJ| Rƒò(}c¬ê±ä~zVÂl{µ>޳µe�/ð(¸‹ê LsDxZ:DÕkƒ�çH�ñhà(ô$É´šª4²�8¯3Î#yKÀ«ìÕ-t�ïóvwQãQ“Gª™].ó’ÖY’ A»læR…6-\+ü+Ù±^•‹¦öø s¨£ú8yô}3�†»8Ê#5aÙß KΈ †"Hl={Ò;F°Åcñb‹\šEè{«jv3ß’tê,ÙW¢t«uê#Ãó[öÆ 7åóêåwq'�š‡Yí¿Q÷± ŠÌŒFÒ�.ŽýœëUÈ Y?­Þ§ä/–�n(žª…Wg,îÿR�+óž²³ýKåP$=*ò(ø‹n…kn�8óÂ9�&�K?¼ –í@Ië�æª$×É·ìXúÐÆN}\ò»ëÈ£˜[>>­UUóÎòÕ+}º�Ç\Ñ{Œñ˜'ПCÚ¢ó¨gq8ÕÔiŒ6© å)2ŒŽ±(�âZè#éa¹ð�8M¹y½Ã^]id<–i,cØ ¨( (Œ6^ó¸ÕÇyùzJÄc¿™nä1*�’„Šw¹­Q+SÖ³ Q-b�GÖ¼jåÊc2Qýû†_%¥À™F�ÇBXÃrêc-A?Æö{þ£[lTüGlØ<�ÇþÀˆë.ö î#‡eG5óÒï+Gñ¸ôØK÷‰Á*(!UËJ«$š¹�S„é?õOÇ6óº¸�#úȺƒJ©dì±ÙºÁ\=�Gp3ñýâˆ>®eÁÈ@¤n™†ŒØÉ£¯}‘;üÇ<ƒ;x܈£\ô*㽆-ò�Î#x£Ç}íÚœKi]Ác’ÆM<†ŒØÛx\çÖÉ ”&UTŠãå&nˆçlöûÝt�»äq�Çöh%S€ÈÈhœ^�˜·>ôº@¦-ÅPÅ<ÂkØSTŒØ»x Ä"ëó‘=r™P|æûîÑÇ«xXÌm=×}Tº?ŸÇî6Àc±ˆ–WÆW«çT À¢d‘ç»÷õ\c¯£,/g/€÷á æò¥X-Æçf2¢œð*ìRkšl7Æ%³jY1š�=äÑQ­´nÔí·ëãz‘bò( �aæè™ ävæA\_Êc)ªßÎcäíW·Ø«µy.�è¦Ȍ) •1½—ó˜YD×JÊôwóØ}ËÉã0J‡ì°—Ǽü£ÑÕ]áUåqg%®[õÒ×";5±?A¡æþ9Qÿ±ë"ºM¡|Ȱÿ¨|“ò�úØÌÕÀû:ZÄä¡þã0£{x̦ÍÏÏ¿þëŠä5áUjkw‚ú¹à]…zôÆò–xTmT`ë‹yì8Ú•fý}VåU­NÂýÛöjq3Ö ÉÂãòƒ›uýI%k)Sf¹�§õ5wÙ¡´p¼"û(ž=) �äª}L·ÃNá{y8ô¤Ò½Ößå±³˜¢ ÇHŽ$Ïè ØÄ)‹·¤å íf‘äe䡿ªN;$nÀ^…á^tAc; Ã×òqô#ß‘ó+õ³ˆyL*iÆC7Æh4¹µ?ÇkgFÏ¡9šù$œ²?ÁWZ4Öy­vXîXúØò]<–)hUc¥xÌ{CUkV²k7ZYÀ ßo5ì;–V�Ü�¼{EžéòXdÒŠðœÂcT6�¸(u_kÆ]ƒøºY•Ò€ÄS™@~C7-Üá�>b¯Ö º&ŒäÖKy¬Ö+ŽBèJ¥I÷4Gz�ÃN$m`f «îç^DÒ«pL›òÇòC<"#ó¸¸�Õ},ÿè¿Xˆ'‚­lÄ¥t€Çµl@Šü}L¡$óm±Êc’ÖÇ”@×�L>.÷iœ‹òØ ÖWÙ«q¦ö´ü�ÌaÄS]ql\—®K[¬'!pH87CÜ %+…“)DíO[4ùc•�`Ô†ôqò¨{�õMÍÉ%KGê�î¹U€}Ír¸Ä¢™¡ì60�M9›G9 �qyÔêÑ|M�„ûHï™ò7Q|mÙ“Tèn…ÎlY?¯¯èåqä¥:—Ö´”�nŽä±T°_É£æ/âY5ä‘*f ¢%½�¦rþ2Û–ÁJC²97"ÅLw¹�ÆŠÛm&�ÿšIœeL¡æa,G¬ØÉ£È#�Æ\Á^ÁÌXfÕì?à…�îó™T ‹f€‡Ø7�P!»VÙ1VqþÆtЊò¨Z GÁNû‹Çd]‰Œz!¶>®…ŒÔsdˆöëÌwœy;€ïñð«ÿRià1QCï–ô>ÝÄ”íkŒ�X±qï/ÞÒT^Ö ü Y‡BjÄ+G5ÞY§í¨<Ö1ÚÆã²wuí©W�͘6«“Çy,OV—wÏåJ@Ë~}b2Š.�ÂÝ bZBæ«|™ŒS¦´Œw `*ð˜?ÊÆ¶,‘A°î¾UeëòxNGǬ«ŒÆsX´ Í�  LäJbæ‘)Y°m�“2–¨¸�Gù�º«P§Ü!Ýœ¤ì‹|ÂÂå8Y…9[�ù<Ñà±®ƒî_EŸ·2<2ÜEòÜžÍ#´WaLÇá1[;Äc¬ë �Xx\ WEDѪIÝ�Ÿ Ó¤ÈLøSHa.ÜHžåv«0Y Õlö×ò8l¯–YBNeúÕ?)ƒÎæ{ýàÒ|G�hçé=ê_ ðó@{ú¨ðhtŠêɨ�Õõ@º–¢B€fÉ|ä;9´iÓú�€”#?•C†‚§R~e%J¯tõ¶ô] –˯úÔÇú3¿¥ìãQÓ@©$kw:+F¾ã*¥ïï¨Èc* ¸+ßqª>Vi&ƒN7™ùµd‡ÂXÖ‡”–dV,Â…}(�QsUÖGY¾;š‚Žï౪,mänkwA<-Ù/¹7ý¸ý«¦†×ùMùÇáóðk¢?N�¯Ròÿš½šîÍÑz¿f@íë|ÈŒ5¢Äò8RËg(oy=lЪÖíUü5¤<زWS¬ºÍËä±g8‡9¹j‡0�ÍÚÄ*¹Ì8N:rËH0–úG”¿�àæ¿ÖµPïr“n¾…G\ˆÓøBÅ¿!�²Á:õñ*Ð‚Ç ñ¸®ù?­î¦ßp“JŠyô ]I1�\òÓÓ+“S\¯¶!œ#Š`êGéÌ °ÂíùßëURåkŸu£eòxG½\�ÂÞ,Àc©Þ`å7È…Æ�fœÂÅÑ—IMî#‹#ñ¶z4V·ASɶ eSƒËQdyó��E’â0y\RJhȃuêã01çî`ó˜–wÄqyDvêv±BÊáU!S©•¤w5SÖtòr (DpPOá…{­{–ê@’¨7È4¯“ÇsñîÝà± hñØ£ñ8æ>Zŵìdê�­4Æx J.® îD›Á ¾P•NX $9¦>‚¬å0)×ì ðØu±ÜBiúŠqÐ\sƒÕ4a¥;|[�Z]�¦�‚ÀV÷R·BIÁÁ`Hèd}äï[@×(ê£äÖSëuêã5ˆ Eâ±Ù¨ E%™«ª&ªâº+LKVÐGê@®¾'¢‘¹˜5ꃋĬ\9ئ g{Á~ºAé§«åÔ…‚¹õzŒI?y™GÑm|)�Ë@„yŒ½ýêV}tßc0Âã (ƒ”Ȣљ�>r—a�‰>¶0l$ŠJ•Sçm)VCð)÷a«œÝÔ‹ÍÁÈ"ô¥é¿Ùݨ„ÂPy\ Àš¯”ZCéG΃•$¿´#ðF¶øÛ=îä1;p9R’Ù« àÙFÁVeÑÒ­<Ò¾�«„¦Ÿq71Ècé;/VÂQŒ+\,r…ÑÚ˜Á¬lå“‚)Ç�L>úc¹ý�9¿�ÇîJªX¾ä}Võ�rÞ{ š@Ò;$»c.�€'¬±C-Cöªcåæ>hb$h® LÆêc—;¸¤s¾ûè ¤øqý+¨Éµ€‡ŽAµ†X¡Ó2Qy([}ÑÊðXÖïãõq#l"ÔÊr9JÍ"mÓÇüXãZJy€w`µß“yÃá± #–G¦‹ŒÇ‰³˜ ”nÕÇUdÛã`ĨÖ¬^„­Ä§ñ(&8|u| �õî�0¬)��#o¿º‡Ç‘7ü�•ÚôÂ¥øg·D�=˜4îy%�Hå@p–`#¢-nêaž0½±c±«ö¢qü‚1ª�iž€eŠn¡�ëÅþc¹jð¾ŽÂeàíydWMßÃc÷“íRô࢜š;x��sYAs ú¶ &”MB=•ÔÛç>ÊQ[§ `k)±ÈjV‰ÿÈã8¤WèÜo¯îçq©ðXÙ"3yì$6|ÃRÐK'‹6+ßQˆÍú§Ú«HAÄoæõoZ¬3bÝz¥7�‚9íAcþŒæQ0S-×—vПûõ1ãÕÇÐÛ¯Þ£�"�Ùâ¢)>Zwð˜2ÆãÚP̉Œ‡WÃæê¨>fiã4� ¡üöÚAƒõ <&IñÎÞÍ㿬S(æ#b<‡Òßi§>®&«ç>õ\3•Á<¥æ?žÄ£ù ±Å#ŠâÄ:Ù·äÛyÌ'ÖGRv*ä–ˆÉ�ÙE¿«ø·Äücñ—õ�p|‰ek¼� }r�¸2ÀJŸƒ]Lv¯ÌU«Úp6¥¦’U»žQËÔ 1�O‘ò9ú?Àºë_‹˜ÊÛy,ʵWÏcü}@ë�C°W×ÉÃxT´ß( y´¤39žùǨ–ÛΉ% !‹Ô&WÇ æŠ¥Š+ðÍ71”ú�>ý•Ê«y,Ã�Õë#õ¾€Ò �Øâ”×—óØ …:”KΣF(y\¤R4f®JÑT“G)€çq¡ ¤]Œ“Ça^ÎÞ�óh',Ž‹ç¢�ÛxT””aZ¤rŒÇPì¦=¢p¢<Âê}T•ƒ¾^º?Y¾˜¤vjêãÙˆ õ/òhÔÛ\Ê#׈åä To=/Eö8fQs1LŽõ„“#<¹S‹N[è�Ê8X%'ñ˜œÆÉãW7f< å¨Þ£QœÑH<' ��I³x¥BúH2l¯êf¬Ää@8G,À0ŽóØ UÅ^¥HùYÓé?^Mœ}¼‡ñˆac<.›ÿ{ý)±P¤�4_@òs]—.È÷e›íVR&Gxäožj¤ßC Uœé£õÚ/–ç@¯Cñòâ|Ç58¼6ž#ÉãUúXh Òë‰eûOÁ2ÿJœ –(7W3Ѽ©oïÓ5^�ÃÞP”ѳ£õ„‡ÃAÏ7‚„‡Xk%'<®û:Ö™ïä;øÃS„PÏ8Ê¿û.HþÀÇÉØD´å–0½ÈhÌJYè,¿”µ=h[?ê ÝÉ!yìúT|+�¸.;�ÈÆ#yU˜Йúx�dËG!öªˆ££�nˆ§4ò—–ä±¢¶üyÜÄ# Þ|M°o™’]½¦ª=Ì‘wÒ‹àXE¼ÐÉÒ¨?³!$m~‹Æ%3ô uA�#³Wkoµu¾ «¶ne1æØâs'ú¸Fzw-VKl­ïs‡6ê“y{[üíW÷êã:uk­¸ñ«ÂKxëÒœìÅ­i_}¯¿ìùÆ$UÄÚ·Eoi–çý4éòÃ9º±Ù DòØMT±oÇ�Å<O1ª �^¥ªóÈ*æîôÞP•Öw)B÷Ÿ^¾•GëI•ögòÈŠ7Ê,f«5ŠMQÙÚÌ ±r¨ÀÔ?vi‹ë#‹±âU-ÛÄâKܨâUó%U)ëå;¶ð�ö÷pÈsàî>€ î]�?–'Ë`�ǦBOP�½ýêu<®£òGyŒ"•u¬Ì¬��Û—“ –ã§5@ûÝÍcJl3W™¯cɺŽ©ê?²ˆªþ­H+t–…sÛãÈ…Çâãç­ê«æô'Œ3´ ]çiÉwñ¸²¸ühO5­ic _þða<Öb�²ºQDS¸sÔÓ—1²Â9uú[C"ŒÊe¯f$³›ÈíQb�>’GrË Ž„d€G¡ŽN–GͺÕ8Ý�ð0ŽñØËqHT5Ì Ö'ðØƒŽ¾ÿ˜×«g ¾@‹Ýåq½.IꨃH‰;¡ì¿Ø+pf—·£Ðl UŒåOÓJÇ…—ÅY%«ý[È’Ç‚r¾¹šD9 “)øsáãóùëù}É{z¸Û^uiÓË}ì!�ª”:ŽÔ^Í–h#²"–>+vêÿ¬?ÝÓn!ù±Jµ VÖÇØ7©â¯áHŸR¶1ÀcyH ü\øz¹É£ù¼•kϱ"¶ò�Ç£Ûñ <6 køVç?ÄW3o�¶š}¬r˜„0ÁØ –å—˜“Ô¬�K7ýe7œ9}›X§écÑ> (ãqµ½:’ÇÛÞöÖxÎÈi÷¹p±âq¤:õX3nfé�}�<�G"¥g”F`´åJW%–RQ”´­ò˜·©ê×¶¢�CëZħGT]ýÇ�‰Ùƒ8º@NÁjs'×ñÈå¯ñhÑf›…&‘¥üœRÙt�Zàs#ÉIE,�§ë T§’G@HU5X'�›Q:dÇy$Qt”!ÄõȦHiª¦Ãdñø?Ë¢-Öê!úx(�«.’‡6BE8%lŒÞá¨>M…x„N}<ž:qHîVŠþ#P?`µ#›¦)YmÉ<Ö†«�nÕäÝ �ü›7„§ªÔ·ÈÑ�jàÛ:QÂÑ èÜ«�ÞgµÞÐ×ÊsãW}“@~›À³6ðˆÃs<±Òz¡È¦K›áü™ú¸Ö´ùHï6hc<öks·é£ðµ8^¦Ys}.Â�Ep+�Þg{YÔ½õ9¡[F}V¥'Ÿäk uö[,j(Ë_1Ù|;�ýv±\‰Ð1â7!{U ©ªúX_vÄT Ö«y, `# ¼ÏJ}, >GYUñ}Œ^P:Eà?<âXL�Ãèx!Y£Ì5Ïãq%%*îiê* /ÕâÑ àïo™Tþ(}#ŽT%wQäNö›òå<‡"/y�9–Zc¥ÞÛ¯PTõÿ1Ÿ ÷J‘ÂzµÆ`à~†kh­ôGø�í¯ç±ßÖDcTÈoèo‘Cß½—qÓÕ²n±ƒªM-1Žïà±Æ"süG{ÛÎýþ£Ë#�¯þ­ô!ü̵âÎôÜŠòY´¦�îud®¢§‰…êé#ñ­ŽEé[ጯÈÉ_ïÀ‚ª¢ÁJp|�¡·_M»‰è®cW»\ÜÜGØ«ý ÔŠ¨[²eÌ@Ô¢7!{U.Rµôq•Îf¨zä�8òïï¨Z—ÍÑu”µ_ ú“î^ëwò( ä­úè‹[Ö$nSƒg„Cþ#è‚íy[i±lý�åD˜QE:ùæ''•~ÂôQ�¨ö*úv?‡Çt7=þxe©Ì­<šw–r×iECh6¼ØM]äÙ«AÚ|ÜŽäà†t¯œl‚±þ({»ugU }É#z‘ª¡�Ë9�À�TMe:9¬¨¼0ýø{x©Ð;�ÇýÖèÁ<ÊòW40Ó(ò¶”Þá­¥UÜ”5ƒu,Àj©’ï>jÎ% âhIÇT<÷I*'�#ðœÐösž€Óî.ŸÄ£íÛqb“™GÝØÌÖ¤‹›ÛÀè¢ìëñÈßÀ VDõÖ³(Ú tqò¸ž: ³ÂŒGÙš›nm¢´]Ná­ÑZ<œ×“B›¦o—P76ßÃ#‹¨ZIF°�¿P• d5`u$Ì;N{õ¶¶ty�0´Y˜lþãvc3áfáx�Æ1ÑGá±ÿ�Ò U¡$fö¦>náåì}äQT¿šF×{ûŒÍò¸% #>öàQ(S…_t›AÉ›þãÙhmêßáQ ~r{US¿äÛmŽlúâö 7©–ï¨"O¬‚W‰yžây\O9\¸:V…ÖëÑ6QrÝNôÞIÔÊ:ÛçÙäÔÔÏñíÜP˯àqS‘ê£SÅêKô1üž™±×^µÇ±úÓY×á…îÖý¦6$ñUúO­†…dþ�–ï·7²ùéYj:RÂ%8HV1Z4Ž^'¸‹O汚V]Ìä¸ÏÑç&ÑքžGN—}A˜«tS•ôײ åQ?5´™­Ô]¡ÏgðèÚÄTç …‚ròT£V–JACª=rC˜|4�åñê!Â~�ÕÂa<Šòד nØq�. ±ÜF®#(�<Á㑇T€øöZß‹$e6dH/¯Ï)7¤¬vÉtõ17y•>&I\Xyß#t7ˆÇ¨,Ãöñx\a53&.óA}Déÿl¨nÐGRé вJÐõNã„}˜ÇtS‚÷ÏTïÒôO[§Çðè.ô Š›^tiÚß`Ha]}l^ã0�üÉ4}¢ê‰L>O<æìëô1‹££�Õ“&ÆÌú1xPñ'�è9Iä(/hW°êUÏ^å!U’ê—yLIHrã}%�% ù6} ñX¯�òˆT…¥kî©TóÕ/ÔÂV¿�9:" øŽÕP¬U:?ÿøÇ?d 딞èãº7-„c…7:�iš{ÈgÚ«×%=ò¨{úx�®)yº±¹àX9nˆèŸ•·p+¢D“ÓV‰ÇÕD¥ôyþ£U¤š¾¤–js{@%íàzÿ±Ü¤z<'ø"«—ÕøöªÆ#ZÝž>~ŽG ·Îã²xoºfÙW'·me/ªÊ&*çÑÌ8ö¤"ÕxQjÜ©œÏ#Ÿ¥š±Â£Õ7fþ#°@uܪuf˜«±äá^qÖGÑÜ„Æ&À­_eBÀˆ˜Ì<‚͈ǼÙÊ£ô.ÕåëVÂYŒ¸S9y<‹Çp¿'ó8â˜Il»¹Ê£…[cŠ™›9cað†pëYurí~ ^„£>`Ìß3Î4¥DÚ7þõw߬“v�Ý|-p_n¯†×鮆÷¾ïqèÔ¿Å£âÝ5ùÓÌÍ{Nc·K nȤúlý¢ôõ½åF2X­×ޝí…"Õá,„Ü~�<ÁsBcÆãŸ@º£å]ÿq¯>Fä¯'_ ÜÖ7Œª ˜`ÔhL Hqóyd(JjÈ]Jò‚QíAœe%~µlæûåN l¬Ë�<– æµ<j¨µYC› ©Ü0ý¿Î[ð1T‘õ9Î#FñkT¥´n—*zžjùË(Åɶg½§ä;ÆëÖÖo¶Wcúx �,#y’±‰‚›J¬%jmºòç6àú)DRå«jÑÊ!UÀÛNôÄݯ4WçûWŻ˕úhÐV^›Úã#íE:%L+(X•?KýÖ¦‹›Û@°ge à Hù¹ÿš;uÏáH}T¾žŠ�–>`PN¿Ì#Â1Y�äÉ�ú‰"%²©òP?—…H—G—è«ô'8z|•sÖ?�P¾šÇõBÖŠ1ã×P™kGóÕñÕå®[°B™$¤¹H,•µh±ÓóË5 žúù-Ü.Îo ìƒU{³±TªJÈ+P¾™ÇÀó� ÇüŸÐÓö•È7ó¸L>áטÌ<ªž_Æ×ÃÍmð —+å¥bÒ °ªo6WŽ+qž8¤×Çs²‰Ôßç>¶ûJƒÊŸî40J·î·º%Pµ²–Äâ°Ç*[Sñ¯G ýÕ<'goÄõ6MÝAqÌG±xì^cç1…‚j7ˆÉ}ú(*a2_ø“ÇÜãMò‚‹I:¿{6{õGXQlãÁ.ýk=0ˆªʽ¿ZUÿ~Ùñ]¡e÷à^@þ€Õ˜~n&D[Àâ'´e­Ã¡¨:�Y$»Pй ÌbÊ1.ñT�Ær"\ ãB9õq BÇîC'6ÿÐG?�i�y´­M˜Ý)øBwáYþ`Œ)$kŽþqT{αÿkíéc‘E�G‡ÆŸrÀˆ•š.G:viÙ½]øhðÝñœ‘a}�ÅÖ#L¶` Ž˜týËò‰Ca#2k˜ô“uÒ’¿¼'d—qÐð{søK�‹ÑJO�œ=Ÿ&”;õQòLGÈ9§­Ìã*�ž±éæÙ©>Zê‡5ŒY›‚ø6˜ü‰HUŠLs3G^dÁ [rA„yŒD Ë@9®r2É€ÙÏ™<žCÓþ^�ãÑÄ ¦ö¼TJÏÚ$ ÀY´ç¯zŠ J¡ÛÞ�ñb°¦6ZA\.ÅÁÑ SqÑ`ò_ûï·W‡õ1­¬l|qܸ=‰c-²úIphK¿Ù’–{7`n"ÁÒEÓQTî-⪸CÈõKiñåNÑœõqÄOkÕG®~€þÁ:—¬¬~”!�•`™=¼ð³žBPTMðÖh釣VΛv ú3äOßäþúÉKŒ#CµÆo|S·ÆõJ7� åëyŒ¦®#ó¶úÕ5õ1-5òPCYÑÀ$å‘M¾¤°©¡Í²”M,òÊ—iC\­œ†Àé¼)l°†í’ù. _©êFޤ6ÀëyŒ<øÿÒç­ÂDrë­¿æõp*¡yubb�,n�klz®_=/Ú‘r_É�ˆªn6‚S¢÷­ßÔ®˜¦@ª”“q@¶¯fÝ“Åyâ¢yiº£”Wç»v1(Ã<‹³+/¶WÛb¨oxÄK;aNš¿xfµÜPí©È¨u4Ü›‹¦�Í�ÌcG�¬ô[š9Gí“¡|6�ÿ“~êþS»õkxBK¼‚Ç~;âx´5².–dnÝpÜr…=¡=j¿åÆêY›ª‰ËRÿA²/ØÎKCCIýBuÏu�³‹ÚrT+“Ÿã1Éégxì�Fæ»GŸ. šaÏ3°¨»ÊdHe¨¤WT/ •×ÑVò•#{ê§;²ˆrƒG!Ái›µãø(¦+ òÜa¯}Ì”y •wµzÍ�¿öd{UáQXÕmêÝ•b‰É-ÊUŽ]j+_<8# ¯yA’ñ Íôúo¡íW èH‰GÁz•7rÛÞBé€(š�çqUƯÅsDU3É^œym7÷#/ûÖ¥i1TˆV¡&ÍX‹Y£jËߘ5Ì#ÜU¸¿hFD±rm#·lÅP>�Ç|öõ1un³ë£7�ºúÑõtÁÊ-Þ8n'9¦~04Psãö6±{‘l™QH…æÖ4¸ 'båMØÞ™| �™3´ïêc¾!Ù³ �3aѨV® …Ť�йƦϹ|ÙbÇm€ì+Rz”y …¥küÆ�©ês(ïªWÜa¯–5Xä,’èO*{ùÅâ«Ì^Moêâk˜HÔÏ áX«öÌ�­­ûÒÒ5r£UÔÞ‘7�F.v—EÁ3ËîƒÈæ ߤø]̺1Iåè7ðN“ïjøªxN޲ l,ð˜àñÙD×ÊÝÀ9P?Çì³TH YÉÖîo;V„ÊyêApWAö}+Ÿerò¸‹úm;s}lª^§Ó56ÍìñÀÐ:W{Î`ÄïxÎM  _°$ÄSî˜s�DåºQù+÷¢@©oîÑ¡nPN·!µo¯bsۺꤕb¯�MÍÆíÞÚ¡‡›y !H*J²¾–g¹èÁÜ3±Ú�ÐÐÚÒà±0>–ífI}ùÎ…ÉÉã>²Ù›½ÆÄºg£©$ëÈ )ué­¡b„i‚Ã~ïÑëÙ:6ñÁÈQtHcr.¼.§�ôLÇg‡7[wU®Zíùâ×ËÕ·C±ÓÉ“ýGzêœGÉŸÌv›”Æ.º’�9-#ê§©P˜sÅÌeg�ÎÒç\w:ó¾ŒÇ–¬•öìf®WÈê^[wøœÙ ›—Ė©¬\x´7ñÈÆ¼�<±ÌìR;Ò-V‘iag°6íÅi*/_�Ø»Õ�\Ç™-÷&My›FQ{u½Ç,· j¶ScZÊ<†6�õ)‹S)ì�Oc�Æ©,8k"mÿ‹/¼†­Õ5r•‡ØuëÓ¿ ÆÏÚÀÈe‹cH¤íª�Íw†GwfÉ¡±¤âc‹ä€V“ÇØ Š¥¶¦’¸\,Ë̅®™£±[,–1é¸9³bf6µ"/³ÒíLæV 7#õ¤¿®Ç`)ýñ7>õ~€ÈP‘6ü¾iIRÞP™ÜÔÕ œ0Poù‚’-†d[‘#怱~t(�é1v|ÉH'Á¹ø9ÝÚÙ¢«�F°²2å§~z°ñwð¨[+�e(%WKX«}µî2s]Ò•¥™Ö°{äìÂi ã®ÉÁ´%3��¦üI]Gů½ÈU3 ®â0ÿ#ýÖ’ÉvZŒùÜÅ_LrÞå?Ö{Ô@>¸^ Y¿º¸Uñsj„ ‚�ëÛÙÐôãêkZŒ8Lñf3Œ*ŽdÈØ€ª–gÍÏ~ ’š¶w,n0˜Ù%£4yâ5ÃÙ'¨˜mY¸«Ã\?hon•©�ñ‹¤N”¬IP YÚ�)/ÆSpñ±}¿È€êmè|7U}Œ_nóa}L¶ç˜#Á|ñè½:jbñ‹,LKHÀ6†…µ Ý«òªiV‡Ê#îк,÷ÐmgY'mM¿-¨jó˜â¦†!º\j…ñÛ<&ÇzÀ ÚZæÆqñ‹XeâÜÄ€•k•͵mÂÕW·�Z«õD½C›/\•ÄÝulM§X LýaM¹½ÚÍ4Ã1ÌvúÇõñǾ…ËB±G@�·.M¥pIßáÕSî4ü¼á™vù’¼GëæE\Réòµ S oD/.ÄQf<æ›|Dø>o¯pÓë bƒèÈwºˆã§Å=mÏϯi±Oú¦MµóÎíàÖÕ`åõ1F0—Ÿ7>¸9dþˆÖ5Àœïê¢ÝÀ“ÞÕÔǬØ5¨}gdÂÆl²œH >FÁ™ô<¿é2êòYõ“õî"p^ ö®ßðüòÓZ¦õ¾n7Fh�0ï#.ËîesáÁÞ•ïØ=²Ý΀]ùwê²²ä†"�·AñÝyq�ÆL;<å‘í�ðñúvp웥ËWsÅTÉBuÑÏ-‡ºð çcµ(Ô£H!å±!i5ËB�®J‘IE’ƒšîˆ::³Ôå²Vãv® ƒigKýÈ= 7í°ñ¹ºá�« Ñøž>‚Htœûb ë_\•]Q|Ü ñ£‡#Mwy_Ý\”©:?Ný�SÔ&ÔPú$FS^ñe`Åsv÷ê`òHLXÄ„¢OÍÊóŠN@=ªôÈ„ä^ÔÝÜÉ �ëgrU.‰òðÓȸ©êÇQ§êNqh€\i­Žå»CÔé�&�‚KY0Ü¥},š1 ~†�Ç*qìÜ(êázu1òªŽZ9¼çvÆRš�“Ç]÷˜–ª™2ÖÖ’ž"å&/·”W]�ˆäËéÚl‡Y츦‹zÝ]kèØ¹î=Ì29–c?%Å�–àÈJÚµv!útç9;»§•´üŒe_ˆ‡Âc®9—xdv®fq³ v’�ìÎn :n©©C£ÿ´é:gÎÄ­3;:½#KáÞäÊ÷ìÕ�cßvWC< mAí|XxèõŽ¡‰Ù Ë:h¸SüþŽ5‚Êç±·yܮ۹&†níûŽ5yÔÆŒ $Ð zz1žËP?1ÔQÛFôG7tE;ÏtýlCsu%�0—mf[)8E“Ç}À¿vo|S #Ò+LÇOȺu ×ÊÕŒS°Øúéz�ãÂh1ŽÐÔ6³½G_E“Ç—UÝÇ1’_¤”‰ö–ì‰Ú—m!AÏ û©¾¬{ED¸”‡Ð®DyZ+oàâá#xþkù§õk Ú«ñ¹5]1Ä/ãá1;é5s&mõóìÜZJªœ"Þ�¤l;7bòb8È`½?žÓBøÎ3�¾7ÌPý �‘ÉÝ&¢e°DkLäéšO2“õÛÎÌÉ+w#v�òxA¦üĄռ8�ª(Yæ¯üÔ³§<øŒ£¥—_ä1blª‚„Sp\Œô´%Æã%F ]rê©¥'½y»zO(^…lŒÔ' Ñ„.]Ý’ïøùGú‘ìåÉc9§Í†*H²j¢1Óïó‚ž®ô ºÁª½f’ú´yÚŒÂUÜÇ-“çñ6ÿqòxtfë�vèGZ5NÔ³¯À-Úçtž-MÃå8ÅÕϳ3»�ËÊfþ2+ß~5ŽÞy\N©x”â¯�Klpmå©�¯Yñr cÌÌoضžïö�ýG`Ï;º1Uë$x”ÓgFyVšÁªPô1­s¼íA<–û98£Éãí¤÷Ï`ÂÏÓ>GúxÔr@úÌGóu8Â.ÞKÐxv´{/‰\wÿã–FÆLñ ƒéÆ1yÜ:èé¦6l°*QÀü1æÁõûŒˆ(ÃAXÛrÿõ<Ø�÷�‹§À“Я®¯ŽãY_»¶aúê pî[w±x̧3íÕ­c[Øéc¸¯#jMÜå8–Ûg¾œÕÀÐÅŽhÉzëØ‹òx®§šâ@sQôqçü±{¦ œO¿“çC¯¶ �IWý õ?tf§6 z!åÃæòàÆxdSà°ËïãéÊAe·-QøÀ–hè)Œc¹eÒÌÉÑKçB4&�ÆäE¨•c<:“Ì’<Öísý>-ˆÔ-]×�¶o8P<‹ñŠz¬æ-òæ—=$žs4är¿˜G!xGÆ(£4¬Å§œ8»¬Í­,óÜ>×ïÛÒµ+yhYy� �«Ž>ÆÑ\²ÇÄW'�gŽ€¼;”Ç 1ž˜%¨Ö»x´{Å4^H—ôÏÕÏMq­›ú¨ßÊ[ˆèLÞ×·b2¹B,¬XŒÇ©éæÚCÍF7¢2uE“Bº’% ÎÂíßCl š��¶Î‰;iŽß²gÿ�}©½¡�Šò¾6ÅxÌšnÙ„AÚPÌÓhäÕíYÚš˜ôN`GŠC »Ž±œo¥Y]Wün§påîžÇï=ãݾ`±KIíG-]%³×ÒµÓ7énRÂ¥Ú’îjÏIxܱâ&�lÔ³m”òK»ô�¢,�ßbGh§´m¯¥ë½“®ÖƉ÷©&:‚óž>:bôwOßõüÒ˶zk|Uê8˜7µo£Öc²jB:BÜí 0:€pê—qäû� ]°_º0ée_Ïc]R&ª¤ý¤lêHŸ•B ¹}M½ÕpGLº)ùÉ7…ÇîÃ]/Y—qò(Ú«ÊÝÛ–@a«ã º}šô‰ÒI`0ÓûyuM„Gб-‡ÞT%¹š>þ–uú[®sà&·.“�‘{¶8¼#0ð¶f´4mtýN!c¯‹oÙ2æØ‡[ž:ª´‡_²PÉe×Gm–îÜîÐlzûG UŒ¸}(¸O«èö©Â™[{)ŽåGwèçã÷4Ÿ#·g®CØŠ1r';N©‹‹B†E`'È�ÍQ÷”ãðWÕÚ‹Fõ;Ø3mÞ÷×^¸1'ÎZA{J>�7ÝpÌGÝ>·ì»6�°ÑqnnŸÝÕF xƒ²>0�Eºþ"N€7¾oÞ>y”å«%=ÜÉAi FÝ>K�œbO\=á#â)Ÿ‡Ë“Ü@RÒ­N€;OïhàŽÜ;.ãȳÔ×ÊAG‘ÆÜƒÂ$·5ŠmAž›yÒkêðy5ÿÛ©2¢§3x½#¼tûäQsïü¨Äˆ]ë.�U+R¸D.ߦŸÒ¶¶øy´#éSëçV¶€¥ä®ªÚ@.‚Úâ¸üŽîȽã2Ž¿i¯*‹fòèѤn¯©æB 6Ú�ãÆTåüŠLªÊÙcMÞØéQ›Ï‘Çnx‰xSð{¶‡yD/�ɘ¹4:Ê'u@˜t1SCSl/Ḇq+g»ãŠÏµ Œêç®ù¨ Šú@uY5Ö¥‰IU×âÊç¿¡Ù}�c`#ßQÇî¨19jNïîgŽÇù3°=žãúü˜É€Ïç+Ÿ÷†æT ¬C{Ÿ?1<—ó'åD«ƒ–~©�‘Ý(! Ô‡ Á-ŒX9«çØ.žŒs`÷ógæyG˜Ãrþœ óèLŠ°Ù‹ñ ^ÕÆ"Ñ$ÍÒ†+¶rR0'Öôü‰xÁæPmž¤æ¹cXBŒn»–±s r?ét¢¥u’NšEé%Ͳy°æŽ±ð×H¬ŸßØê„±Ûñ¶Š¬Â “ås_�c^¯¸±æ:N©�.¸9R;&6:xÑ@l&j£}×N†3é+ßß]ßsUTq¨ 3aØPß1Ù5º¤>r¹·\F'%tø�ùs4“�I7Îs>ÕÛ„®éù”¶Þ`BƒõµF“Çógt�ǽúX/(›®.�¹‰ç|°äÁÒ4½\¸ÿ&¢óçà-G˜<ž?SÃØðWð˜—ãݳ8�3y¤Lú�žcÇŸóÝuçñ‹äÎÓ;v±KzÀvÍ9½ûnãF†Ž\ßÈÚŽ]Ÿß¬“>�jÂqÇ9�Mçolý53zÀ|ª,ÂßWOt¼ê&Ï ¢+Ïo î®KžÈÕcþÒã}ŒÇ.�’ÿx_\'¼ºÃËhå®e”»&ó6r6-þjéñ7·ùÔ Y„öj³U™p^<ëAg,œïØÍ£ãÉ„Vc?4Fáèq¨·_Þèc €˜–x(V¥Õxˆ%Wã/•lv{Bþ8tš{&~ï!æþñ(Ó˜•s¤Tãt(ÁÎ�_Xm9y´Ç,0óãƒ>÷8^ÌcqóAIc ~'äs$ýª{œ?¬waòx÷  ãÇíÂ÷ò(–lÐ88*ßÈI GMÔY'ó;®ò¬Ñ;ºßÈÚÄ Ì ßÔ°Wå/ª-EŒx,á+Ÿ<Žõl¿{x¬Å3>cÅøCU„Ú™j½–ó7xÌ›€ƒ9yܽ f»F`„Ç¡E+hCt™4ÖRÄèù¸©�{†xî{Ø´¦ÏEnw«Ž¯ ÝtÕ&�Àiœþã¦á�;;q»p\Jãì{M8`•MRöN¿·Ðøj¾ï<àùÕG¥wí߈/9�y�Ñç1ø¼†t"ñ'8G/c¶Ç#0y|éŠØÂãöK�ËdûØ í9zh¸žÓ8•Ë%[.~NMi§;v�Ÿßl92›s´N�1»0ç"'5Öo¤ÇÙæœMç9‡ž½ò8k:¢ùŽ9'7�ÀY àæËzíáÃóñÒ|Çk'æ¢ÏÿEç3�ñxÎ#òÁ«ûµÍ&�/�úqC¾æ\÷®‡9þ÷Žÿæ£oáÑ:Ø ùlžŠ#wœ<9šöµ%ßažÞ ù\8{ê¡&�O˜…mçÏwÄú§ObÝÍVF`ò¸aÐ^·KÔ�!Ÿ»§vòx÷ l=~r £…§9ÜpëiÏýl¯aŽÏ;G`0ž39{Ç4ÏyzÇ<±³äñ¥WùëN{òøÒ)Ÿ<¾tâìÓž<¾tZÛ³¡¬Žf¨ñKGä§='è­Ó•x—ñœî‡O÷œ ‡OÐ!§—gyùïœîCÆó¼Næ�7¶Ïé¹Ìry‚ù9ç5Ï„ŽÀäñ7¬‰:Ë¿ä¥Â/žÒÉã‹'/~ê Èø.³å#0y¼cÔç1çÈ#0yü+c¨¸îWŒÈC/ròøÐ‰9ô´fñÀ¡Ãybg“Ç÷1]O3ΉLß2S{Îsò¸gô®Üwòxåhßu¬±âº»Îrwlü’50R\÷K†ä™—9õñ™ó2ÏêwŽÀäñWÌû|¾ã%ÓßqÛÐxò88`¯l>ŸïxË´Mß2S{Îs>ß±gô®Üwòxåhßv¬ù|ÇmC?vàÉãØxÍÖsÎ�É㙣;ûž#06“DZñš­çœ9“Ç3Gwö=G`l&�cã5[Ï8s&�gŽîì{ŽÀØLÇÆk¶ž#pæLÏÝÙ÷�±˜<Ž�×l=Gà̘<ž9º³ï9c#0y¯ÙzŽÀ™#0y§/Ö�¬X<®1°Zà9-°x|N_¬;Y-°x\c`µÀsZ`ñøœ¾Xw²Z`ñ¸ÆÀj�ç´Àâñ9}±îdµÀâq��ÕÏi�ÅãsúbÝÉj�Å㫞ӋÇçôź“Õ‹Ç5V <§�Ïé‹u'«�k ¬xN ,ŸÓëNV ,×X-ðœX<>§/Ö�¬X<®1°Zà9-°x|N_¬;Y-°x\c`µÀsZ`ñøœ¾Xw²Z`ñ¸ÆÀj�ç´Àâñ9}±îdµÀâq��ÕÏi�ÅãsúbÝÉj�Å㫞ӋÇçôź“Õ‹Ç“ÆÀüLÕ;mºú©{Z'ÝÒsè–[}öE�©YüIBg… =»�Öݹ-°xt›(V ã2EMè¤P¡Ø½®R�m�ÅãI]³x<©!w5‹Ç“úñxRCþîj�'õ?öY䥆zêqû¡a üW)�OÏá"vtóXáƒMª5à¹ðI¼ªùD ,OjÕÄcƒ{{ !Z¢œ�²韬–|º|tç0]8�—OnA]µÒVûIO½ª9¹�'5(‘<i-¼!dk,V=†IB¡[„tÕåü0”êõeW;éÑW5çµÀâñ¤¶lC½[ù ®eN £«“ZE€<ÖKvwvÒ³¯jNk�ÅãIMIÌÆâÌAÝ•Gî6Ru£jW¼Ftºh÷§/Ö�¬X<^1þ€Ÿ+.µ®ñêX<~¶ûÄ?ÿü3ýoqùÙÖ~í‹ÇOõa%q1óÿZ\~ªÉ¿ ÞÅãé�˜E°ÀW¤ÿ,.Ooøo¨pñxb/ILĵŸÝ^E?äÓeÇžØ ï®jñxJÿ1ãto€ÇR|qyJg¼¹’Åã±ÞCÆ)p‚Gæ_»³uö[`ñ8Ûk�$žÇcÖË%—³}óÞó�Ã}W$‘ñÇ ÔúÈÌÝÅåp½ö„Åã@×QI¼ŒG0cÖòå@W½µèâ1ÔsB¼†ëáçô±ðÈÜË•îêºwZ<Úý…mñ:—ïblän�Zkõ’ø0ëí¬,¼‘ÿ첋Ǿ ‰câåúÈoo…}ž�Zèî�¨™X¦ÛËx,Ââ24òŸYhñ˜úEŠ× ln×Ç.#hÙ±Ïdκ«_Ï#"ÑÑC¸ÇñXRö–^¾ËßËc¿ ãKy\áØÅã£[ K"ÇϳO�èãÏÏ??ø‚Ãïînæ@:g™±�¿K­ QÝŽ �ÏX¸gÃ0‘¸ï·‚§ónä1ëå2cŸˆå/áQÚ#<ŒÄàúcƒo'íÌXÒê&€Å=Cc�’„ýÈH.}qÐæN0‚,·j—^>�Ì/摯a\Á#"‘]N?ÁR ;òióKúØ�´¸¼“ËoäQ2N—;CúØib˜Gà­±å4÷îf3ÂãJ+X<žÕÆbâ„Eä±�h»—Öûs�EEïR˜N>Íc¹ŸŽ=ktFêù}ô?Á#ÕÄ“x,æ)Ü3sD«å sÁ2c#8.s=�û8Ûn;ð+ôpb¦›$'Þò…,"BŠØœÌ#1coÔG"Þ‹ËРœ/t9�é‚?Ûÿ¹¿¼‡[Lôqs�MÀéKˆᑪ%¹Ä„`ÐG,—û¿—^zãsêó7ò8µ˜xœGÏ€ü$�Eq,ö^ËÕ—SÜi'½‹Gmgb ßå�™D¸+óÉg—HNÔG>,.Oáò7rÔ^¥nb' �`£kŽJˆ&>‡Çd<þÔ5’bÔr›2ÐL!B¥´ž¾n(µÂ±‡¸¼œÇ=�ö³l}L‡Z` ùEl{OˆØ<ŽÇÒ(á%’}i^�Ê—\Îay=�~ 'kg} ­SíÕJ"¿îcy,úèy¸f¾\ÅíKm‹Ë1.�mÚç^Ùëx„Gi�15‘�§®dÖÊ—1./ç1­=¦ÿ÷–=®ÔGi=Ñs8Çpõ,n§¶ˆ@«�Ø9BçíÎ\\Ú\^ÎcòÇò¦‘R.‘Æ- �Îcy ¢ú~«H6í‰<–v^\Ê\^ÏcL·q©©AäŸÔ-|�Çûß /‘Ä<ÊðÈüËñAñ¥güNEóÔÓC>vcúX.õ�÷tV¬?o –Cø�D²tlÉež_~�˜ÄA=æ±YÂÛøíß`C:NÎ8Ðí"¹]K#ä§ûõ\þ{MtGxLÙ�JA1èã9Ô‚ô&‡@ƃû<‚‹ì/³�Ïq®eÉŒê#/÷k¹üZQ—17<ä'xlã›�¬ÆW•Å|®‰Z>¹‡Þ‚ý ÿ(Lfü_ÇåwóHgÿOóXµiDEyÌÃÏ[üüŒ>²ÛŒ}‚ˆÎê#4JkÂ_Ãå·ðÈ;^ŠØ|ŒGq�ò˜‡ &æ—ð˜)p#ϲq*ëY<ÍܹüÒÈ*<Ö;y´ò0Õ=?u$÷ñ‡E6çxTÔRàD{›ˆBÌ'(†ð¸Ýèâñî )äÐl…lëÔÅË/@n¤Sà3yÌ÷‚…j¿¾áfŽÈn¨SÄä‚°fŠ�w㸉8™¿©g&VÏ´$´ˆ¯–_Gû;_Í.~Hé@–ݺ @�¢ççØñ`IÁ[<^‚ÞÞ¯9anOdmuYtåv +‰þè<Ã^%à_Æ#Ì9yÖ©WõŸØ�ÇD`åSâÁÙ.*‹ëÒÇ“!-»©ÀsµòÊí„r¦‰þè<Æ£ ÁWóXd=ߊÿÄá‘Þ¾„ÄÔ‘cKOFO¬î8�’u?NóX�a6¸nâ‘‘ÿÈ Šÿ j_„Y+žƒ¬Ø#ì-}¼+¾ŠqTuëô3<Ú|/�ðÄcŸCþ#…�ÏMâ$¹â9£ wÃzxŒ©ÿâ:Ë⫌V_/dŸØ>É'Pí�7\‰WnÓÖm©Kw �gëãx}¾ÔEÌ9ì̈&㨠™ok“ÇM+ü­Dg;A-ê ôæ‚8!©H…Ú-è,J8¦èöâqœ“«Î8‹G'|z˜GZ?½k…G‚Gþ#6Yœh(äóYóÓ V¬óÒÇ« ³¨ �`Oº…#ú8>=Àc èæQËdÙòI錑}]×òÈíiþÔ˼Ò9‡Ã§Ã<îWHòäY<‚ÀMÉ3ð‹5dgÄ B;dÆsd}DG÷&íîeñøBëQPw„óíïÆúÇxäbéÞ팂ZQè†B >¡Ôa �í^�¯â±�âk�;ÂEëûÇ»4~F‰¡&!ÝÛX~”ãŸ1DOã±MN‹Ç·ðèEO]sÔ- \¡òø¯gÛ«ÜqÚ &øEž†æ Ó³J–¯“<êÚŸÝZs5¥Ì±[ Úë�Sù9|Žð›ÀhÈÊWˆ´�ýLI¶. £'Bºôñl ™äxÈN®4­³ÑèÆ ÷k kwÀÝË#Vˤ›èc¹\‹`)ásäØÒdzɓë;ÌcÌ<õµÀ¿‘keÌT^®�?1êâ:l¯Ró_rÈGœ"4sñø|‹yêÃiÊp¥T2è©A`5™«û¯[ỹŸN#Wñˆ…š‡|ÊÅã5<æ�V™,÷³�+g¤Œµ€½ê„hÙø. æßOà‘�1Ó&’qJë`µ\öê S×ïG6_¹J!ÍAF x.Tª"L#ö)¯€ñH•�g¢ýA]Qwr˜x@~JÿL³"9@c‡Ä±a—>²e¤ª…K> ‘XÁ~dÀ”½ªX+*®Ih1òÿößðÏíÄ@e×—óšj]Ã#á"J°��Ì»”J|µ·�¢â9£øj l$¹tñ­oº<†�G¢Šôl+?G²%ýÇ9\"f8‹Ðµ×;Ðõ�¿ŒÇ©!oðˆ1¬<Òòìlç ¶t;ƒf ŠÃâ“Íø ý#v�(Y¨bÔ†ô‘¶´gÄ^Çc ~]ñ»ñµþcd\Íóùi3ûØ”¼†G¸0›bð h!›ç¤lÉÁØN»Ç+_MÜ(üBU‹ol=ÃÐGj¥¶xÎyúHF¨â`�¨_Õ[ò@<'Š­41,‡MË�œµWíˆÈ<Âzy<Ù^U)Ëçy„‹‰ÓAL2`«ÌHK?Ø`¥{ûÔ?iÌ^mW(8¶Õ޲ðA|@j• ù�j>.2ã®âQ°�ãùr�ev)%éÞ¾&lpä(~¡éøUöj¢þðœ×ÇŒb¹Ä�°M#5_kÜ¢ÒN2ÚVåÝñÕô\é&¬lÖv—�ÙÓ4ŽòØ™Àù’l�¡Ö1‘TQg"}Ö䑸�ª>–ÿ\ÑRÿgx„{/º”ÇÜÞæC¾šÇòž™Ø¸O3ò2ŒêºU÷í@PxêÔb‰« ¢Å` sqhŸ��,*!¨âxVÌU‘GÌw±WëÎã3`�³* Öo/¾Zº¡¯I0aÉäfœ)‡R…K\ÏQôÑ ÚDc@&Âc¶Â=݇bŒÆsylÔðÍ/»}®ÉcË:ì˜Ö¦v éez?àÛª[œ>½Š´lpU_B44'È~æ3Ö;zãvG1R Å3ëJ”À; -ìæ™�òh[ÁÒð˜+egKñ4\Ï×G<ÌQÍkÇ%sʆ}1�hõâ ú訚½šç™è#(É·é!Éo¨[©õj <=¾*ˆH$\,Ê!aÖl!µr,Ñ\eHW)RŠç!µ{ºÈ»íÕz�r8Ë峪âçòXPtGtÏãßþ¶ŸLq,íççoû2IéM{ë¶T ’ŠäÛ…» œÔG ñ˜0Šè=ƒÇÜZÙ#Dc“ŽÔ~Üf£Õ*–?{@>À Á5.\i\‘ÁàžÒñ¸·ÿ$&7*¡³ò1ø5Í#àQïϽ7ßã´C@K4u„…yDZÎy.�ƒu²øíùƒ÷} �ý¼ìŽy�ÇÂdÆÍÔ¡ÍNöô#!Hˆ_uŸFTÃîR!øbºê¯ýçùgñxgâš„k&¿c¹ªøU,—>¤üƒ§F)"9`¾9zˆÇdÛìžüÇŽÇ�{X1æ„Ê@ëŸÇcn?q º>?çƒcUýÍú¨xn6°%ŽÊÜŦ™Ü`=�Gìlͨ}luCЪ;x„›í<Ëå?^3C8W‰ŒˆÑôifçËfÄMsµ°~ˆGFe35OÕGb ÷Z%Ø’’yyäž=Û ,ßÁ£` ú »#x+°W ƒ“àÈ£«Â‚ÇGy„Ù…<µû4ãúXlÇô{<ë¯w� �9@J€ØzbñøxË äãñ0�ŒñòH8ù4�X˜/ÖÇFêâñ|a¢U^™æL}8Âc®WááØX/ÐG¤(“aQ¿‘@‰¹võöˆ€èÉú¸ÝÃ…8þ®÷!—÷Ìoðh†¤fô¸‚!À#mŠÇ’2Gjßß@8Ö™{óbtj8,:Ë#Qfø£ƒöØ1±Â[y¤RaýŲ]íyBþê•PøÜ&£ˆ3Žª¤ò(¸�ퟠÖm½ÃòÀøÝyš|�k‘2ÎB¦zµc¹îÊúZܧÁ,” MMta¨Zíuè/¨ì¬’ ¾„GÏ Y·7ÇW‹“›,ló=:eÞ˜6ýÝ.ˆEÄÁ¥À¿ÿ{!‘)!2;ºÿ¾ýÀ5õ±Ý˜ä}Üc÷iº:Ä EšzDIƒ‹¬¸Ò(|‡>"_a¯DX‘È 1Ç# VÄÁ¹ÀvêŽY…ò‡.?°Þ>N…*�Ó<Í|èFoq�Q�¦˜4Ø•"M=Ë£xÁgëcžf[„&ú¶ýDGmr‘¬?Ž$Ú€E{ŽÇLcfm3X3�¹«*†çòÈ©ü�YÍG,Øc<â ¦§ê{W;x¹>ŽÔ¹ò7Û«ã7=ËcREU1BC¼ˆc¿¬“”Ò$Ÿq}Üë êÅï…ܶhæYgèjÈ4“ß…t%—Ø¡¶²q¾xgäÊ3&x Œ¬�Ä-‰ÐØFyxÇòY}Ö}šð~+ׂ�€¦ %iáæHô½%ŠæÒÇ+©Ó¯5Æcî\ÿ$Ob¶�Bt/ÊcŠè°Ê[||ÑýºtkáT4p½›�, Ye*"11Œ•mÓr*¡rñø ôÄ»ðÑ*ãY¨þIÞ�›´Ù¡À£$™•±ÐQx¬uP ½[!Y4òÎÓG‹ÚuRàqw ÉåÓ~d)öS¢:³<ŠR dúÏ‚˜Õ£Dc’iú�dBAõµK.?ÂãÞÀy­ÔÝ;­$”×é³vâ„>¨ì7ÈLËÓ(�àÒþAd± 7qˆG%Æ\0#„ưŠÅC…º¦xÌÓËÖŠ‹ÇOð8´WSãn9ðõA„*¶qôüǪ�í.©ÕK´ò$ë°Íšë?ÿŒ>¢ÙˇžËã~áÅãÇxÜõ1Uîì ëyT,¦3ô±àƒlKÑ\ ñˆg æƒÒJ÷;?A‘F›(âtzÁT=ºx Òss~Þ4=Ècã>~¾>`㇄DO�دN|5åð4>º`,;}×cf\Ž?^Fåò[ă/ߥP‘Rû.aÞi[Œ›ÏÕ¥©Žf»ÞÎ#y0IQ&ëü²�Xj¡ŽXuÐ׊s�„YE�ÄEñÅ }ÿÑ|RB/²±ä1`£c©ü �R<ô»x,¶\̪ lìÀoÉ(½‘”Ö3Šå×n¹}(Š“Vâ‘B.ðØ !‘Ræñ?ÑO“ЙêcHŽO7æðœçæŒÒ¨_Àcé°<ìë{t\/+0¸ŸÃcu½va}Î3¸|Êþì¤dsÕ èü;\LÆq»ýÁ2­H™ûxn�<Æ (�“¦]ÊýĎʨfŠ<^‰cVÀžÇý‘Q¿ØÓô10…|B‘,Ê£±ˆ—l—jY;ĈÍ|)4v8‚ZbA v´¨üæh¡"æŒD¥iN±Ä!*ßÌ#È[ îÇðÙb ÓË�~€£:6e¼Y<&sR�A‡Gz^Ûíh8xL3¦dc<¦&lÊãð5˜Y]Š;`¯Þ¬�8 jòÖÞgÀ².ü!/îŒ(ÍGë臉„–èG[ GÆä~’²tز…DÃú7W³7I²þU² ¡HË|�Gm ˆçìÜË#Ò÷�q‘ט?GÇÑõé3–ðê€ ™xD½6rÒÙ4[ŽX«&Šœ xJå6§Uæ1ªdÓ<’ ÌòµC¡•Êè¹—¦çôþ£¿ÐÑ[<*<"o1¸èN`)TÓ•,!°j'|ŽÇ€’ãæɈˆÅs¢Lár…Êè¹w𘻯l‡º €½X;ø²|€qyœz!r?¸Búˆ¡¢lî:ÙxÄ f ò(›«¦>¢¹¤ö#>Ûe¸¹*,LÀò}Ð�³íUiígäíÚFÙ ÑgœÔZðÃW>2ò5FM„GÑ}ä™5;”y1ƒU;u˜ÇÆLH#B'•álLzgx4'�Åãçø­ÙçQ°P]Å ä@| �êv?qÅ 7°ßû] lÇ‚Cû¹ý$°x¥æsåí°÷]Ä� èã<ª$Ïéc±¸ýq(‡ËdJ.à‹RyýúãçF4®ùæýV©4kûzp&�¢@†ìÕÏñH‡°ß‘ ¢q  þ ja\Iå¹—�èN¡«5Ö_¥2‘G6*üñçñ¸WˆÝžœ»�œòrº¥‹îïèÃH截 \)‡¨ty mÝí�`�±uZ‘ ·"Þ¬��¤>”é�¸#©Ÿ¡¶—Åcªp[t@ô˜8~@ñ äQw[�Æ_cQ˜8�È Lëbu=t»Õ/Zïl!³xT¼Åf:м²Sô þ(1!åB]D4T—‚ž¤·7äËFó En·W·®³·t úèy‹Y‘Þæ¥Fèa{F(óJ�…’mnÎæqG³&¤˜ƒ…Ì)3jÖ>Q¡õìïó†%}5üö«»yL©·‘øœ¢+Mî�à„U$±Øú¸ûY€ü·úÓÈäx’ÕÌ|C¡çµœa0T¹m0•�FŒ¹�ÂL‡Ä¾Ýˆ${¢>SÇT†y¢þ#þª…jÁw¨Š‰xŽñ…µ³}IÉ£¦êbwÆ¿�Ëã6 šÛ?;ÕÌ×m7äcfy„öä?Å#¾™ÞÆc™Góø^<ª �¡$¡Êà $PŒ]ÃÎbËÚÙ¯%‰ŽÕýÇv¿îlã�Ì�NÄ`-mÄW©‘ü:ÿ–~PÄ# & Þ¤]ú˜4€LÍIØúçŸ�;’êî©�…2IÓdHwz±>¶{£Cº?¦�YÁŠRÖÊNäWUæ•_ÇãþàO·W'ÞŸsÔ^Í,z<,@¤Í‘ ¤a'sXŽª<¦+ÿ›F[60Ñr�Ô¶ü�é"ò¼òèõǬ�øŽâ5ŸÑ •Üï?9›Eü™”E\[ØD�ñfë �@¢cBNs*�:�γÂË=k¼=¨9ŸïÅ=-ÝïÕ„í¨”4S†ôúüœ)“$¢|÷m;7ÇWOá14þ¸‰jóH`ÙOe™nìïú'RÅF›F¦x¼txÄ̹úˆæåÉ~A‹õ_+ŒÁ'!åk“éâqë+ÏðÙê +÷:Nó˜ÌSjù�Êcƒ~¿Ngs…òW#ù{õš!þeú˜‡áÄø#§ÐðjS�Ÿ–}¾æ$�Ù`õ†—(W(ý*ôõ÷&ô±^%§ Ò*–½zÍô¹Š¦uÈD�á±$H@ºNe èø£ñ¨™¯�øÖvjHú:)žÞ¶\oƒ°¿xŒ�2S&5sø«ØS¸ª3‘` ŇÍ ÔՂþfaD e}ÜB«å-­‘J˜å{�éa¹�isšÕ†&iè !ŽÇyl“Ëv�Åã k‘sP~®›Üõu$ qøiØŽ¹*¸‹š½ aÑ¿tõQu ]ÁT (Oç@Öü=Ñ�ÿ(Mœé2‹Ç[3eñ¨¹‹–úe ˆ­";ì>Éq ;WÓ5Õr–džLÈ[Œ0+µ½Wy2�KgH �Cpô6k}´ÜÅq‰Á{"�™DÈ€>‚ºúãZ’IÁ÷#ôÅ,Q(E \<†`x@>9s!�AÛ<]ydî¢?–Ì|ÐA‹‘¤¥ÄeŒº�DI³>z¾±é g;2õWj¿U÷:xÍäP¹B�G©ØÒÉÑûå"oê@{[À?éÒ¶ü‘£–¨µ¡Äß‹ñ¨¬ª>’è�½ŠŸzâi WGÆ¿ŽËcSÊÙÊž�Nþ›x„M¾!{MÌ~g‹%Ù¨Ä?pþ[PÙ4�$<–é¤þvV6‹@æG�÷– 2¢†’ƒ¶–¢r©n�UöL÷‡ÙÇ-üFåƒíW)åËUЭYQ÷ôr7ðØ©lÿøÇ?]Çx,gCTçg«ºü¤ïw±;‰•Kzµl �‘±<üäõG^³?ËÅô•²e^6ME#öÞøj±Øüm•ðÛvîÎÏ ìBÁ[É´õGon$N2"AsU³Wëéû?�Û%ð_ ˜<»ñ êEŸnû“¢3�ŸÊªù<61î£T2ÜÏÑÇbÔ  Ëò8ñÂŽÈ8Q‡¨ä/²A¿óX%òL �„G`³@YRc÷Û�y¤Fæ™<¢š#íKâQWEØ4*JáSô1==Úï�×ì d=é—îG–7iþbÇc¶%§¶-’“˜!ÊÍU"˜€$˜°Ù¶µy¤Pâ¡=¨Ðb�I>n¿d1Í©¾‡Çê7:†h¶W�|þ"­cä1Á!.䣂;g1÷Qâ1 e¦ÓÒÇ6ŒùÃ�Âcj—¡Ø!w½Èkx¾¾V T#÷õqôslÎØ÷½À#3 u�ÒÞr•΋ñÈ�Xp Ù­Ê´™¡P+cÇâ%_ ”§b† šcoˆçp{5„L:ZÀu!~@>ÀL¬v`t©î¢ÏiúX\:ºýßÒÇllªúØRpÉ…³B'2Ä#Œ]x^¿�z@¼# /Òú'&™vû|uYÍ·ðˆ–óbjzw|õƒ<Ú®‰¡��•¼B ›Ã,²W ©mEøcŒ.ÈÏðˆ¡Dj4–ÑÚ›Æp1jK1×H¾%µ×Ça‘/î@)/ˆFæ #WžãOÿI(ð€ôGd)NUª`³£LÊò,2Yòñ ?ÈcþΘŽ`¤–1McqqŒG:«À Ì�¢eå2,ñˆðáßH(‰–Ï^«Áúi�1}ˆG\w¤¢Q}li¯Çù³ìÕÁA:YüËìÕ¢‹.~ªÿˆôq[|ÀÐLd†’°VORV;ÐJu ûà*½,ì${˜Ág‹MO1{•˜»ÚÙ!á}Æ’ì‰R¸eôWYB†Î1}L}±_�ŸÐ9´X_[ÝÝhj6 6“¾íU€«dëò¡"y$3œ'£&µLã©¢=�½Sy&�©Õ27Ö"eh3ªîžß�ÐñW¿®ã—éc[£q³2Á�ÇÌâ¸ö<‚Â¥ KDƆ!)å†Gõq¯’L@Ƕ3_‹„Ú׉-[Ä*�šµ²?ºôñcúHÊU6x ]œ¢x@ !‘G96Jñ,\–ß|C‡`­öÖqè°ˆÆÄÃJ§0n"j’¹TÈ­|ñ(u{|5õœýf9�Gf£N Qìù¤”´¡Ê£fUÖ&GŒa‹ÿŒ­v”k~ºòÌ«žÒ¸9—ÇlWfi8^<>•GX1�å:TÕ!†Õ|‚X'±%€š�OÍÅãQ��Ú!§xtšá( ©>Àcƒ2$¬ÊVG æe¯~Ì^ÍÞcŒÇÎÌ\NŒÈdR!¬áßA™õ)á(/&¶Xl(¼ ×aO“Rwë°:£køŒ7Ö{§ò�f.¿‹G!æ�ÆÇßÿŽÃŸ‚еC®DvgãsÓ>GÇÀ-�ÎÉJvÌ{–1"ÍÓ´ �M*Ë´±x‘ºß±WÏÐGÅ Ã<¢1ˆj­é× Üþþó÷ý„N?!ÇkÿÎõ±*aægÂ:00*PžÏ#�òÕ¶ËÉÕÇc<7Û«ç Å Ë?CoÛ¹]' áÀ$ƒ[�Ç„G6YÅ¥ŽŒ¤É#‘S‰ÿÙnÆåqj;G¨ ;jB’*´ßô¼Oyñ×étßW>¶FW[<ÃŽªŠ˜…–yü»j¯†\>ÕšEg÷@î3AÒÊf¿î,y¬¦ üÃyÖ�¬åJ “b^Û=z.«¨™÷ð_O_÷û‡×è0½îWF}©>¢n„å Â^Æÿ&JZM/zªÍjêã?‹ýš}²9ëÙ«r†§i⚃r)ÃúØ›¯Â©å1ù€³5Gð7*ñ’´òW~^¼Y¥­Mî‹<þýït'‡q‰­v¤àL+*™ÌLV÷²3XêçØæ£+> 2'ñ˜êaÈÄ$3¨¬Ââê~ûwðxÚð5+º€Ç@à¶L6{Ù˜zò“ƒÉõý˜øÃ1NÉ¢„)’¬Ù‹¾e€G¾æñY}¬¶žfgúªkQŒä÷|{)^<ÆgXki,oK§�æÚRK[dµ¬ìVžø¢I3ª�à8b&z>êD¥ì\jy;èøVÞäÑ û(u­Ñ·™_‰«ªêìUvÍ‚ýâqˆÇºüYèjˆfZ³%[ošÇ<®êG¦&Tâòذû×Q5­ôRÃÛ ä~A®¾ŽyŽ@V¡ON¬eÒ?Çå±×±Üè‚dŽØ«¬ë¶ÎZ<Žðˆ¤²ª Š™Ã<(ŠyÁ(¦�h<ÍóØ*‰˜«½ KÌ× §š× ß'gdçhyh¬ûäÄK4;Ó?'Æcu)Q…çò¸üÇ8Œ8è”íÕˆ3Oã1f„’�ÌÞšã‘TâÊ#1fÑ"eÙ¡�_Ϊ¹� ‹üÚ‚!Û4¹jšüøl‘Ð/Ü€ ò›y«¤2XÇÅГu6Œ\nÅsF€Ì¾cɺüQu‘écÖPÄ¥…¡Ó žÀ@aEºJjòv†Áp»ô™r Ü›øò€ô uPcîcŸR¾? ¹}%¿­qã0�MÒÏÖÇ‹ÍÕw¿ï‘ñXÂ:è0ÓÈf¬:9�JÖ#“~ûô8Ð#"æ‘f¶íÜVíâñáVËÓaKdÕ<ççg“8á¹æ8�IÔz›_9æd²R`uU)©ªRÁe¯ÎˆÞçÎñfwnmŒº¿¦pKû‰¹�zÌUÈ~.lIêN£Ëc² ó@?‰G\eµ;)G-ÁC“zb.ÁíÈNýõÎýȽ½Ú÷ZíÛÒïöÝü�2E#ú˜PKýª¼ic˜G€FP£ Χô±¡ÍæÉñˆËMOË[R§á’�]ìÃ}NÑέ9¬�hhxÄHÄôQáqÈ É%gr;´ãÕÇ¢]�Ex�G•óƒ<²zŸÍ#4*Ù!‘—òœ%ó@¦ ZÐûZ™N¸ë…Ê.ç4ËŸšŽd‘‡s%AÆÓ•©"k¾´™�Ñ*%:y�YÏñ�i­¬É‹G�¨CŸÃ¸žðñDížV¢ �t$&�‚›Eîž| �Êc*Øiq�äRMn¦lK)ÿkºeú¬!S3Ècå'6ʼn¸b¸"¤ËµË©8Bu‹ÇC¼ENžŠçÌðØ™yGy¬ —"”gðXo3r 2ÞË^� æ³§¸®Û‹ G`ÅÅGÁÃâÑU!˜›œSG “8ú<ʺÖ�¡•Ò´´%ñ•h«p¦"š+¾úY¼†kà‘DoXÿomÀ¯  ¯*qt®¬ŸÚâŠk±FyL¢Âäa¸&Nòh~þLC¼ZTa›’G9&‹WI,Éæ1Ëc2Xý‡‡†C9Ác®�å D*²÷V5Ï÷E<&‹aèûXÑöåtªü:Åoö™Ç(Œœ„ãN$v²¿õÕ^�ŠfH Ûº†^ÙN#Ø«#<":AëD@¤÷ ëä!)»_ýç ýÈä½ÞÛ¯¾3žÃ$Uù3�ð�GJαpNÃ*Âc+£ dºÑ9S3‚‘U¦†y"yúXLà>.vÛõáœÌPŽ•·(h4å¿@ç÷ñ¨Äû‘SåŒVƒŒ9{U7XåKi@‰xìÊFn{-PÅEŒµVësô1gŸ•�É‚–0¯µúºõŽ!— óˆɳäQËÄAÇÉ¥d«çX�Œú�‘2úÛPwY“ TcþgϤPÐEŬ;½Má›w‹ïOaAΦsÒwñHF×e*8åÉHrãU[IÔVí…šÀê�€¬FuÈi›ñz�ÅI=Móir}®>†S<fí³ÞŸÁªúú<3þ¤$”÷£Ç£„c4Þ*-"J‰wŽéƑʪ#5X�ñØÌÚN3<Ê&lŠw·vO<Ù«9“&Zûæ¶ÀIÏÐÇ29øA«º2BºHžG½Q«ò¸ v&?§�Î2çþXX»ó¿…ñé=ª˜àúiB…Üö˜½4aáÎ9”/â±�Ø,$o‰çËÚ»_®�exŽŽÉŠcÿg6&¢9î>Jd¯š Ž;‹XqD§“ŒÑgo|¶ª"ô…P-tž—¿Šžúv#Â8†}–½ ·‹?añÀ“–<Ö@Oÿ. #‡§_é×:{–k¿ÜXÊW[X•ð˜%CwÙÜÆÀ Ïã±Ä­Æ<ÒS3ë7ñ˜®þKÞg…Ò�ÜeFö* wÒçÉ#B’¯4"ãdè¤Â0" Û?ëƒÔ&|vÁ[D-D¨YH¿?Y ƒ6ìÏÏ='É#h¤ sMÓ�“Ù&©»†í«jÝ6KlwÞt\Ùâ…,O­�qeð5{þ•D�rñ8ÉÇÕ§9<Š� çd÷Q�½F9R®¢åÐTeJ ÃX—‚i&çqç�´I`>sSáö:ÎãQ”ß'ó8°C05}ðíWXœ�Ù�„â1Ê6ZÑiXƒFÚHÉ*�Ät±vÁÁxÑe£1I”¥´:mEÛ<ú¨uª›n+Pµ 2�K…»xF¾,Æåœ²ôOq½~AÍwñhÙR©kA_ÊÏO§‘" >µÆJ%1ŠCÁ[)\ѧ} Ržy0´¸„l\­H@­gò(�µ6©¦OïÉ'/®LŽƒ.±ŽJçôa?Ò(ÍùñfkÓI½iŒ˜?µ|Ù„•Ž3x$ã]gÍ×Ç"sž¢I¨Æ?žUò¿/Ç1K[þÞ²,yuî»c7°‘ðaûÁ¾Žäéh :B× <cµŒíl¹&(5`Bf¦p6åQ²N£ë~sp§ð_MýmÝ –æ&Úd“úØxÖm’Ç*”üüçð˜ý”Á©Û«Å}4Š=‹Ç£ ¬ûPŒÁm(ss•X¯I)’Çaˆ+žåq[vÌ>/¬®en[[«IÐQ«êú!Or*Nª�M¶àÄ10n�A�WúYuIëi3±•sΉn€Ìæ{n¥¯üa°Ãhó¸Î�l TGMí¹ �UÚó#àq*©‘H¶Ô„gðXî‰ÕuHq?çŠÃc³\U}Ãï·ðˆü —ÇÄ¢Ãc¶‘J6Z7ƒòX^D%eeй�¼=)qzkŒUr²|¶ú�«&Pä¶qQ>ÇÞ%�Ì`šö‡øA¨÷~Áµ�€Vµ**7ψ¯¦§ èz{�Cö�Ç!s•HX*Ųœáѱ·X±™Š–dÈŠZƒ”X¢Œr5 (ÝV„£8Ë Ôàê� ¾Oà1’��ïò¾IÖFÆÿˆúH�×Þ½ìýÍŒÉp8Çô»×d©š·S…2·BÇc5:‹É8Ç£[MH1I¡ÂäâñÉ<ŽK}`ª.E~~þû¿ÈÐjN�‘…w|tTšÓ^E¼¦šó-¨F-ðßðŒ"�¦‘Ù« ‹Î)Öf Ñ# �ñ —•.ÿqœ—OŸ©ÈÖ÷�;�<9‡ÑÙá**Tbº˜�E.µ7 4UÚ³Õo+…�Ì`ý—MøM “y\‡r\+í}u�"£‹ÇOÓ5^ˆÇ}e‘d|ÌÕÙ”ÁC“ìrVRÌŠœ¹ÞQ±†šzQó Aø-}Ä£¿ü[Ñ¢² IZ.Ð ÆÚ?­nñH³äš'9ŽÇåg¸!÷õæ;ÖŸMM,ñ‰&'†·‚[XqbAÖj�–Ì Êº)�Eøû´˜%·ùtŠFëqrqã‹Ç¯å1 ½½)Ž`¶jÞYD0#¶­×‹ )=§ýôúš�e ¿N ÷‚u¢éíHUë*Kx$¶k žHn\º¯ÅãWòHÆ\Çc3[ßãÃ6mq¾±Hb3—««`w‡Š�"ÝÏQ�f�š¶§2öCö*¶yáÙˆœPíŽDk[ù—£� *�ÙdGôo6ñ™܆”ɦpá�Ôì)é¦2k`³‰8pÙHrÏYë+šæ±dÐ’ $Í\ù9>®."ðÈÇÆÏŸ›6ï‘þ»¹sU$KÇ�GEE{•Frjå®�L!}¶vsžê‘ަs´¢C<¦9×÷`òWSöl·ß·M¤ÿÊ¿’¿Šnѽa9?G0v¶1«áHÉ1yìwQªçw–¬ "ã¶Ù¯$çeƒM4�@úlåhèûçÄRoŽóX˜Ükz.�c’âo¿zB~NÙm÷beÏU¦VM ßßÅáq_ÿ-.0ŠR,E KÕG=‚DýG±Vá ÔGy¤é³…Jd&ýsõ—¿”åÀi I{ÇxÄL±WI/g&ßÄ#DT[ØÔÞuÿ{µN î g ×sGGác/ÁÃÑѤ�WJ•Ãa�äëÈ,p‡xLHe,Tî-:”rÜTÀVšnx}NÂæ?‚$Dõ1—n~çóíU¬Ò¡øêÿÙc.eZc�‘[w, B ¨c2¤sR¡žî{OÙnÕñ8dБh¥+7�°WýÀjY‘DAÊzÿhé'ðX�>‰øW”ÇmpZJš–߯Þ;sèÐ�®‡èY¬yžÁ»È@ 7wA!¹Í9Í#!)‘U¨Í¡ªÆã5KOàqæI­!¶ Ë]!`’?–RÏ {“|ä _AÛ‹ØØ<Ög"Ï–v �­m2‡x¬L† ò Áy¥Ò„²xœã¦sŒ!8… º�ÁI»«Pb\¦x”·8#!Ö�$&8uŽ·�ÒC' ÿÂF»›éyð‘�¬GJOˆUµx¼‰­™ËxDéð(Ë#Mè}JN_¼ð/¤ü˜šÞ;iÚß™G²oÀ �±¥þ˜ò홄²ý'>+ž33JÇÏù>{µ E ëä1§ø0ûUu&-Ý·HÉ£SÝjø�E Qª2û0³V:Ž·$Y?OÌìºêBTÙ‡”€¤†¡øn ßä`¥ÛcàÓzbU-DZ¸í müpyÌ¢1mãðÅQÝU´´³O÷Ål-«+¦ùƒ” +$o,�¤qw\úŠ"„ÊñÕh�çút¹²5ãŠÁþ]þ# kše„""½Õ�0�UF‹P’@M(…N2OyþÍ�¹ ÌXIO™ã‘û““ú˜ªéëZñœ+f€s®Ñ�Ÿ}~ÅV³nìž$�èó(š«‚[ÊÕßÊÚHã´÷?ÉÕVîo» ¸¦Œò*�؇Ô`C’4Ï#åh^Ëây–>žC�UËÞCùG<5»2&�ÑèN\ë¶f¼p™¿|£`Ö‚­Å¥k‡<.£]M#˜àz:J èÒ‚-ÿc<6&�óˆùîk»/_îóä´X”bwÍ5»«vZñVÜSãö?Ç¢�åS1›b çTtørJâ|°ÂÓ®€Š‡/”„3ÿÔÏ~•z¬²¶‘[Ìu  «(–Ÿ#8§IBŸ �H?öÍT†š¼1î9¼J#óþùSpdüñ?·¿)‘^6€â¬Æ¥D•lòr{9jç S­æz‹-‡yÜ[�£ ON{ó+Šñ˜ºTü<qð÷Aû—ŸÏ™à‘ôVå‘.v”%9ÝÑW¢«�­A›#ª@+Ö'­Bîúˆt7XKnÀ?ÿ™'-OÁº?€`NÂ!ÏTO,³l™bye7êc±DŠuWw6ÆßF÷^³ËX{°bá1' (á“+RÆD^Àì”VÑþx±~{w—ÝÚ¤-yüü³å�þi}D† @N^ûcv1ø]ú˜¿�…ïœ�¼ð©½Ïêû³#p#sÐGòS¨vÑUéc1óe$œ“ËF-^|½üsÁå”.E$2! SÒÆ#(ä�…ÉÃ<êMðˆfŠGð˜<Ƥ˜_Êc ¯únd õÃ…¬66÷(­õ�8u°ùÐV-õSÝÇd‹N¯­n8Âÿ#"Gy¬DQÔB2'Äe‚’)¾®ã¶xŽ¢�®â•÷çÄF÷CìÕ> <‰çTó(ÈcgÍî¹5“ÑÕ,rÃ8–·¿ kù©’Á)�E%2-µB*D’È)w‰OQLí5X^Ma³ö¾øjÏc$ ÙÞgõ&ý@•µÞ±#ùÏ’üM]Eïr.âz„s€ç1¿òFçQøb.ݘe7ꈈœæ‘ê佚¾•Ç$`×¾ˆÇ|ÇæBØêª½ºûJ8;Eó&uóµ19Αy4;+% $9ŒBlG¾Ár4åè”dÐH>‰Ø™¸ ¨ÛQ“óöêVÇüÇZL?^¸Þ1–‹ÀºtÇ1ÉåÏ_ŒDR )uƒ8¶5y˜VÒ�¡|H»�PÕNU¨!ÆJ‰$HŽò(û“³„RÛµúlÎH׎ÝÇcîÚ"yCùdá쳇ø�c0â|€ÔeÇ�HŒW‹ý‡å²5]4 ²¨‚áóì¹@ÆDÀhm?‘3zðù½ÇZu²­}Ô¡Émý„˜Òq›N.¿E+Ž x;ŒÛ?„ÈNÕDÀ�Gb:Ïæ‘)z&ó ÉÒ%¶ž¯™µ‰É”Ð5ÆNþ‰�Õ•iâfX°±Ü8¡*QÇo ¯.}ÑÇYm€(ÁV+D!¥t�4i„é#©$ ìÐ'i›æ‘f¦yÌ'z³ÄÒÇ«PƒÔý'´Á³ÆW±=ÊÌÓ,¨Õ},VnÖ‡Çn=EͶó}N¿„¤ Ø…xü®ù‡¦ï‡xDLå‘â½ôñ*úºë@ò�Ÿ7ÇtDe”õqŒÿû¿ÿ úZ¶ râÒˆö±8 ,V¨EÚ³ ²‚-ÙÕ`¹‚ùJÍÖô q'çSª&º—ƒ]_›%–>^ChMï«Tê_±wT ÁPŘƚÌ'°˜öRxó ê˜<’ÄÏÚÜZöÇ"³@£ÒÖÌŽÉôàýNüIÅ왜—La–X<^Ã#HcNNl¸Îó—$Íò Ž<ŠÇ¡ §N›Ú¬m*áØL\¶&`-vØ�ØenzH£¿<Üù->QÆ"­½�ç#RÓV&;8‹ŒR*>¢“ó<Þ©�˜ÇíqÞ÷¥÷÷íW�âqî"Z�ûÈJ›G×9 �½ªÙx…kãjé#W9S8ôrêrüj2¹ÇxÄÙ®JZ,}ž'Ì_=ø~ÓbÀ�|K?†ÇÑ(.êfyÈtGÉÐòxD~¤JHDü,�LÇ1»x†V+ê©þ´K9ɬ‹¢<ÓµJ%�Ý$Nƒ< Åž¢�Q“$¶Lâ¶äGþ5ŠÆ-å?Ê#Ъ½!K—²Yc´žgâˆ7s,›ªõk’9ž*ÉPÍHr_²É$UL‰É¾Šät¦kõ:X¡TP8vc<ç ÿ V~�>þéhZ^D1ASTK�Ⲇp¤¦'µŽÒF $*Î`YB© :)¾//ˆ”•RßOJ˜è›�UK¶úl ‘½Çò0TƒéŸ´¦ïÐÇ(�Ä¥´�Îöiõ§z;1b®2‡ÏsEm›²›‘“2HD “ƾÉ$©uâ©K!Jè¬�ªx›ÙØà.%ò1ŸýºÇìúåöLÖ'Ø¡�_£¥¿AE µõþ<¤¢<Ê r`E¡©¶pÛ?³�Gôé>ФæS–±RK53éïÔ›Ðö“`³·Å¤õas)‘V&%-|–>^ã•-¥ú‘‡{P1f^°FåJ\¶¬NžŽ#²99“F„' Uk•ü£[J*v*”ꃭ¤‘›P¶¥�Å#‰û¼9ž³;œ}Ž>î£ë?dŒº£žshËŸ¬Ñ¤3©¤~YòÉV¶!˜¶CÚD¦MØÉÜìVÀ ^‰RÛ¼0™¯¹@ÿag½Åxî‹ç,}4[€„0ƒyÑŠÇV�ã”AóéGòqy,ÈD‚5ñÌ$}aýN€ÕÕH‹Èú1Œ÷y!ÿd&{5D!3ëCd½‚Hòo y\|õ·ñ¡¦íÇù•ÛÅáQš¾1„Å�Üäo®Nçy-Mñ£äÙ�Áx ÅNe�¼°,� ñì÷�Õ¯AˆíR”íºL'¥elÐöÉÄl38êÎÊäâñ>Âë tÒŒÚ÷7‡$.Ó†�1—ÁMwqãqßnÆlû†HUA#3 �jCµ¦ÔÙ¤ä|ó·§©<6[òœêÚ™,'ILòŽ�U�¼~Æ#YŸ\<¾ƒG¤ \=ªñ˜‰Õ¼Ëúåú%Õ 3¬QgÒ׌úŽÂ~Ëj¹Z�Ä­dyÛŽö˜”wìŸs�t“è$ú¼Éâ9I'ŸÁã~+yY.ï4Öé‚‹x¹ÂúŠÅäçŒû�–@~”Gô-oO ÿÈyߦEªQ䫤΄¤'àùó­,Šå¤ïô±ìZku$ë¨4·^1b3“ÄÈUxL:ùËæ H6õVç‹m7ÈsòWóȲî=E T;|*-h”•fíW=Øw T³ÕííÓ¾œk‘Ž@¬›ÄU&•�,¸œ}’+?O5XÁKÞÿƒŒˆìOÚ!ž}Á—e¼ÂLû¬õŽ"þÅ^,ïÞpyÌа$ªØÈ¼ÊB=vÞ[AÇ?C¡ß¦BÌzõM<)„Ãp…¾}˜>ö<‚×çÙ«) 4šëò;yÔ�ƒtV18›SDÁp…Ÿ6ÚË6æcaYÆ-®ÖÃWÑYw…[Òì[ôŽ ã�·³è÷6à?SÆÇ®‘òÑ<† Ë«¿N‰9µžQQ´xÜò\Ñ7ÕeâÈ0l¶ïñ!¨Zîdc†C×V#ŽâX„:´$êØèa:Ó�¾;>OY(­í‘òÉ—G¡£1T�˜¥N+o8Ñ®çmG®Ô“y„3Ë�¤z¼}^q<1‚æÂE4ÞšhÓ‚<ÔÍ%¥twWð9ÁÅ‹ÉÎ`¥N—¬ó¸xNžFK€“°—.[uáŸùˆõëIùgê#3°'«¼}ÄHܪ>RÞ² î¥ÿ#0 9 œÈÇôä®)l)�ã!Q(f%;Ñ!q�C°Õ!,MßÀ€ ,Ögéãèøœ+ÿ°øjhöTR×hzÎv^ó ˶)D æ T²C*a î+58;ÞðçÛ‡ 't Ý×(óV÷zl0ª#™ÌN檖·ª�§â˜,Wœwª…löãiŽïÒȽ U½Ú;|nqÌ`{r³R�|3�àFþ6}üƒòhó–`«8•d‚šå“N–yƒM•õÓBdÍÆS6Síðh¤š+ÝY…57ȆW…ÐæÜÆA}43áxN_á0=Èçðè …üÇl¹œNbâ"cw$ªr_Y!ž“°@ògòfò$ÑVÌÒ¤=Œ…ë}È.ºî2"+PìOoˇµP):”b,GÇŒ¨²¥˜þõ�zDç¹ ÚùÓª�fþ‚—�Îïâ±)YÝÌoé·�50:wž5ÚÀSÞÐ-^þ’�täQPWQö¨`’jK#fQ�Fø dþrºUCO“ËÀ±&šäSxl”E²É°SøEö*àÍE&ùäE�vdý⼞àCd¸´eh� ÎlºîJRº~È›¾¢Ì§sU§RKÇÁ0ðz;NÃSZâ0ò!<Â0 èc+,ý¢x3ÉqÂÕªN¿0oIMÞHéíŠ.â¶‘'Ù¯"©ÇyÐ'®D– HËAAúFœ}TòƵ�Vʇ%�wò~wIó^+ÓÄ£œ†NÖRÐ^õ>+�Çç/)ŠÓH¼ehûS™™ªÀZÃ;{=D%}’Ô¨×_\ý~íò–mû±ø~)åET­%yç#{ŘbEû;näñš@ÉÛõQ¯FœF7y³a¬°xÕ‡Ìo-\†äÑÎõC´S`Ò\a©ªB¾xÈ�´ßoÜ{�Æ5òK�×L ‘«ôú¨ÀˆAC¿"0êHR‡“Ý–_ôNülðˆK! Tò§LQ£.Ù×4óê0«EÌv6¿_¶Äá¼g» áX!Vö ˆÅc„”kÊ ˜VÙx´õ‘®;z17€É$ ­Œ'µ¤–¬Å³xG—6·Ó›åŠÕvIÖ}Ú8äõj;K�IU ·û¦/�X<^ÃZä*�>î‰óSö*õy]­ô€rQ pknžVD T^kkR{s«¼â 5õHfËÞelåÚŽ)4°ÄAy¤ê(d‘××ç>ãõk¿•ˆgÏ#„©z$é1V¤?ÃÆ³-¤@”Fe™Td·ß/¿;ŸJ%_òCdîÿLFB.¼†d‹õt——¼\MÀ•¯ŒÓ Vi‡$�H÷y trécD¹®)#òØ#)QÑŽ)<ÙækAR×ã/Þ¾a�¿â°}"– ( djÚŸ\ÄäXQgìbY„”Ö€*ÛÉå�±´±5ŽýñìëX�ÉÅã5¬…®²w Î@©3Û‚õy2>¬ÉÛ(rÉQÓ½�ôÓjp¼™z\ê®ÜäQ öl:d/Dä`ë�µÊè� d-¥DT¹`ç²Ox¤‹�Ïæ±Ìþ^k‰’õª%®îƒ åž§³&9xÊièþIòŒ‘n-^ÀÞ+3¾cføÔs¡ÝXµHÝ�®@Ì&½GGȘjñ8Q­ûÿy̆åð¥ÿGóˆ·5:;¨";ðö­ÂÓñ˜íV�'7àÑ�§ºiQJu©Ãò+ƒ8&½K·K¡Œá8aU_‹£¬ZÞ8Á“ÃøÀxŒ‡"Z|óx̺Û�õ¢|rGˆù|bÒ˜?TËÔ¤ìXWDña5"UéÜ?ˆ¨#ò ” Ž=Q�Éϲ¯ÇTqB¹¤…Ò±{–;²Âåh4 Ãd€¶ú߯‘Ib¥~•>“)¸‘ÃB›7'bdhª ¤�£ï=öÁœePCËIÙøÓwãÈkn°.˜úA.—>†\Öìs|\þLÞ ÖÔäÍ–ˆÔxÌÇ›ªÉ�[Ì×cË�½]íòèxŒ»¹ïÚ.NEò<‚PFxt°ýFÿ‘CZõC¢9„¥ŒÉ›M›³›Þó!©%µâÜ—íL÷ÅtRúœepuƒB..px¯­êÞþ߇T1�:kL>ŸÇˆcØ?¿ÍTy¬Ë’žzy§÷¹¹Áf‚>Ǟܦ“±¼Õ…2‡ÅIEª{*¾ýŸo4FÚˆÙÀäWðH<̈š~O<ÇâQË@£`‡ÍRǺÉYZ¡Ü‹pû¼Ã/jÃîåd4´ôhû”F@‰ºgŸ6ݬñýv¬Í2¯à1¦x‘/ ø.{UŽDuñVc»dóa$$é±¾„Å_·GËKóÔ2ëêyÊŽÙuÔ¶2k· \ù–Éprcå´:)$ÄöoH ¸¢`"·±S\a±Ëí–Ü<èz'�¡ âáB¯æq›zâ™EåI "Oõ —0•჆q8À#Üg#-Ê£RÆ—Jcž|Ò\áØ£©y/iÙq#&@‘VÅL.ÿá ê�{’OWQç ´×È—ó¦øþÅɵ²W8¾£$$$…õh�Gaÿ†›2žü[ëÅ8”FÕ!Z½0¹xt‡ùíbÖ*ÏÏÝY3yóxL'È"‰í©.ZY­„@c‘RBR§.d°ŠoÄq VçÝÿ�Y,1�Úxãv«+S»ßm¯¢p²;/ùtºüµÁ#—A£F1x±²ª>$îô» eC±m*LÿÉ[õRÛ¿!$¾cË;I£ñ¦8l©vfGó¶-‹ä¦×,]¸N(�2ÅÙ˜íËx¡Þ.e¥zÖqúoQÅ…—ý}œhá–¹Ëá’%ÇdƒªqB@ÍŽ­zƒ¬^°’9‘ªY‹?0_ŸÚH4 Vvi)„$tô¯7½Ì¾�íŽïëŽq¥PáAµxœClè,4µ�âÇS-×PÌßܹ#¢€]Ψ÷ˆËeOÒq•POhg ïµ8Ц0ÓèÖ(òÄRðE6C=|Zá /ûëõ1» 9:s(žêE\aƒÜË/ÚHy Iº‰[¤ú�‹ÇØØ~h©²9%Ÿ®­XJ¼1³+ÒñpIsÐG€–ú*"Ù($‘‹zÏ�8p€µØ§m6ã% `PÔáµx|(i¡ÛªG¨õ|:ži)ÀÅ¥•1C@ŽW¥¿^G–M8Ú#Ùó8¾!÷"îà(<6_Qós 'Ƴ[$¨¯CC…„Ëä¯;;9Ð)¦�t‚þõªïcjÂâmÄê”|:ÙFEi<•ãŽ�k¦�/%çæX8öH²åÆ"0Ü]Ç8R U=E5gãfNE%W`¸ÛÏ?¡ç±E—"û‘Þ~u»-p~ëëfœÇ}:«ÃÈ1ð‘9àÒŒhx¥0bíé‘�T%ÉvÆh…*�úGMQ-!UóñÍ '°To’D2,«f5Ë/ÈcËú•£Ph:¥¿�Güâ!}Úñ “€1eÆ€�*n.ôdZˆ­Iö "²Vµ ÉO•�48HÐJȆ#q�ò‡ÒF#›>8«Ws3§Jå€|=y_GõœÜ·í|3�yçY0«£›ˆ=kŠ­^¨.¤\åT(Ã@v¾.#ã*…`Ê.˜dËT9*ñhìàèiŒ&�÷óÙhøYÜÜÚAÓŽòâú‹õÑmgW0u$Ñ'b¡·HF*#%›H¬UT¸’˜ÇTÔ#äÖørñvûýÝSàD£·c›CŸc¯åB‹ÇY,a$H´uÇØ…ÐÐ&¯œË¢åx’\Ê>Rޱ‚æGcÌ©fV³ò3µØ¢y7�I‘¼xœ¥7";i8agÏnNüÆ pÔpë�<úojTe“&È 8ðÌ7^+à”Ï÷ÙgÎ<Å^¥¡Q&1¹�d�Ûœà0�Ù>ñƒÏª´YNåþ™õ¹˜ ÆØõêH—PÖ$ãy<©-päŒñ»qÖo ?ô(ØtoMtpø”SxŒEc¿;žjq�VvHñrꜱfZ£H[”1›kgî iÊ ‹JÎ�¾Þh-p¤ý…ÇHJ¡žwè&�Ïͬ¡a`êÖ;JX¦ú<‡ˆ¿Z4Ö,V§¡¯æÑÑ|G?¥€«·š(B‹Ëeœ�+;)ß½⑵4jï–lŸ¶­±Oh4æç¶'“V¨OcÍ6�€ÆA[ç‘ÎßÍ£Ó ƒ+\y.ÔB-íx? ý#Ò ÆÇŒ ÉVL˜*i7²dj):[íÖË[�{£TºòÌNÒø`_��½x<µ9-K¤¬E.˜»E ÇÁMU̪ª™›kŽÊa§p` ’ÁØtªÝÏR‘Ù¤nQ $�ß—­³xŒàqNpB?È– |ظyá‹Ð÷~xi@9T$åJ¥õ òŠƒÆêPz!W)£Ðûc ¯B-!Ñ õr¿Ú^EÎv¤%I·Ì<ܼ|q/"ØwYa'‹Ø®ñ˜k§šòÄc6Jmíî-×nn‰Ïˆ7-,#x\^†wKý–rí»EŒ{™€¼ñ²_0™|·ÒØÀQÞúï‹KÌÕ16/ïSƒæÂûûÕúˆ‚Õ‘~ ¸VVU$ÑbN;/¤TŒdRôØV{}^QU QkÆÁm N]î Gé˜ÝVe†m¤ÏN)³x<¥½JŽ{¡Ùö6®l�JcÖ§MÐ^‚°½¬®æ I¬�õ�Ý`E4ÖDñfÉÁ¾²¥hÿÃ}å ëóÀý©Ÿû›õñp«W7¸¯˜±Í6D> E\‡×A¶D�­zs}cÿJœª�ˆ·îŽÝFy-Îá¾:ÌâñHë…Ï=ÜÇrÀUG©~âeñ` D\õw ¨+ Fñ•ã"�8œšÿ­Üa™s+,èzÈ– � ¡àâñHë…Ï­ý;ÛÞRÀÕA B<&LÞk#á|S@[Äu(QÀ]ß䑤B¤�Üö#Ž;‚‡çÎð¨X<iªCçBàà ·Û)àj£–ß lªÖ 6¢ÛP—G=EÁ°XùGîúFúòF7bìÓ8õâÿGÅsò¨ÉcGü…ÖÒ¬b|øýfÿÑgÙ™•{]m Œ\]@WhÃ0I¸ñcÞßDy¬†ªð‚ªú­Æy�ÃÓ>[½�ŠE2ðö;ðœ}`=Õ›í+ñWÆ ¿4 -Îmç<ò3k¶’Œˆ+Ó �¶þ;"Z�¨ŒAÑ-ÖÆªõ�Æ) \¤„rT{”¨·¼`Zµës«¹o×GlL+.a0ïXÅ:—xé£èŠ"äæ”¥�K&-¥ ñVH÷É@•åÏIª�>n<–š=õîn¡kû­8�Ã3ã™< �l&Â\#°9i°v¦(º€h(‹@îºØÛ¦”Gì ÚòyÈ@§`�w”5P÷�"Ü^ÍÞ£iˆ¶ýšË^=ÐôÂ(ãdöÇ??âŠ_£(pËqï}¶žÇb¤J@–c0•8K�™ÒˆÀÏ6 µpôÄü Lðˆîzñ8ßòì̬¤T…&‘äQÛúwZ�#rÍøèNyŒ*�Ø ìƒµ`x'ñ wpZ?;‰ñœe¯^Õüí:'ñ¨ Ù`6¦UŸ­Ê’jEbe+oÖΣù‡ŠÁJ `w»”£ßÙoŒ[in©lž×"Õœ>N€G4Yd“Éú7QÏÌh¿ê-£€àé�ñþ Ïã±CR““zܲ“üÒfN"Q´³ÅÛÛâpÒº¦~Ý=ôÖra�Ϲf4/­vÞ=Ç:HÌ‚ê‡ZÄÕI™ Àæ�%I/Q¥dq™F¸×~‚pc®î m¶Å#J\ŠL`×Ì�ºÊޤ±A²X1jÈg&âË(�å”'ŠT»+6>û)ƒù»NÌ5°Â±x"ÈÔ} ¯¸ï=„ý4gE>�éöª›&ÃLÙý‚dÍ_õ Ñj£žÎž%× ó¤‰lð§8dýi†t^c¢øøƒL\„SxáE§ïöòó1ß Ž滇Ȅ¦-.l®Ë&�ã±X¸®%lù¶Íg�3ð•³p8åêap!ËtGM êè>â�@“ËCÚƒMVX YÎôa«+“FxWÍÁ©¾ÐœwBgŒƒÅãÕ3 6):þvFz¬–åß…ÍÒ-8Y-áóˆiM$]n³¥ª´‰aà·–yHÿ#‹æ¢;ZúèêcMU<©Kð8õ…­…6½�«�s®YÓqò…´dñv‰¢h—çSç(ÕÀ_<®øª YZºþEC5¼óñ×ä¥× CÏq[áŠÒ‘;@m�Y;jD¦¼;äY ™ DÓ}u8¶pdÇqWar«Q›#�yþ¹Å|ÉZHRš«Ã¢¾1`è~–>5×\adÉÈб™òÖ7bÂfYh5ÜWrb9û%U’>jKH^òá\ó> xü¯ô“ú2ý�ª­þJú÷ÒÇÃm}´‚2¥õ°.JŠŠrM!#¼~Q©ã‰YÓLc~|ð^R%ó¸yZb‹�&í¾Ðù�Ù}6�¡öü`¡:ª sßçQBt�5i3F·rÏ^%ç¼|@�º¶{ÃXÅ<ÏÀ‡ÀÈ£~<} ½* öDË^�µ“Vês<î®f²Ò#R6²Yà ûš3(:gqtV=Çz�­ðXgŽÅãiM}´¢(�í͸Á+ÇD@Rf'R4T‘›¾Õ¥�ᦒý�rÔšÔg† ê —¯™Vp¦ðh‹b¡"uše G&°c]rþÙË^=¿M?Uã k‘{!|cÍó¤biù­÷n~ží¾‚©¦ÍAßÉcîé¹iNnþ§õ+ÒÝý´þ8«}ä1ž]õdøFywXór\Óçðr‹¶ú™ZÊ[àøJÃ=w¨à²W5_èä2<�ÎxÞ‚dÖFË\Ý>+¯¬RŠERa=½:N¿Ö^ uõáB‹ÇÃMèV` O÷dT` ã™Hz{ÿ¯úðÑÆ~\ku7TyL³4|\X<ŸÇ“Ú#`øÒBaPgw†�Z(6¾çÚŒ¯Ö=©á¾µšïç±pyy†BþÞ†®‡v$]Øü´óZ‡.’þÍq¿²é¼µ¿gœ}v}O;e-̶³� ~¡´swñ�集ÈâñP¸ŸÇk Ö¸>?4 �w‰5Ú«p*‚Nr¼’û…¡[,í{À‚ÿ‘WSêuÀ°¨�ÏÝð �ÓvOx0ê*Êúxé}ã9)ÿf¬(.8AÇK;÷A�7Æ)7[}DZ‡ÑúDó?¸ÑCbèé¤s®éX©{ó½Ó‹ðø¸®²Ö®i.¾Ÿsõ^ôQ^ò¨^Ø^��¡tš©Ù;|‹óø�Åæ Ñü*÷®€1Sjó!Çeè”n°øÁhóVö°v9/ ké£öΪñ¶4x„��ƒYÿ¼:h7þXÎßÃãéMs°B[LÊ„Q†÷á~ðÒΛ|ªH–n=¸@Å“àÁ¶KÔ“¥ªæ�`”ÃkZŸHÆ:ái¢UÑ ý¾r¦˜|€GS%©|JH6£Âî*Ý?«@žÒ×&�Âå?žÒÜ¿¡CLÊãï£{8ž#µ]S§©EäY»S´[à”¾­ÑRæ´œuXͲ™)>åî¨äš¶½ãÉqͳ‚}(®¯<êH®~škÙÊ‘8×7�Õøn|§�cúûÐë ýõÆxÔÙŸ>Üš__ýâñÖ.€–b~؇wd??ì§1r·¶æ\|ñxk'@ ò(<Æî_y‹ »¿n�à݆ë[»ˆwÆj¼´@p„×e¿ÁîòˆLÚ¯3x·h§_Se¼3~M“\ù µù}7ç9Do1û{ŠHFÖÉ•f§…èí®r“ãj¬O´@æðCÓb©]~�\~ž�k—‡O´Äª³x&«%ß±0¬á�ôk µð��o§×ßàêŒ{»0¶‚0븑ÞEH®õÆ{{]¿úâñÖž ‚,æFëI}…#6;ÜÚb_~ñÅã­-X,ò(VÆÐ‰—‰ÜÊ*Ó·ÀâñÖQ$ †�<‹ÑãÁ»‰\e•™k�Åã\»�tVtáÄ0ìâñ¤¾ûH5‹Ç�4k¸ÒëW‡¿Ò9ü¨«` ��Fº½Èht³ˆÝ§Ö§×Ï·7íÃn`ñø°o'èØ…_Ið†gþ�÷¸x|C¿y,{rÍGZ=þä_½skï„-´ß*?Fà•·>ðº¸Ý‹Ç{GH¬ýSº\ò!ý»�z™BMÁÙÁ¿‡Ub¶<[õ:/ÒÑH˜Å ÇJI77fäQW¿Vømô‹J¬ápsg¯¸¹B—?s½#tÁUè¦X<ÞÔðC— ÆW—ÿ7ÔªO,¼x|b¯ð{ òZïxÃóþÞ{\<¾¡ï£<æ7ç¿á‘Ö=Š-°x|ÃÀ8u½cuùƒ»|u΃;ßÚ ë˽|~_/ŸßG§Ýaä~N»Øªh¦�3­vù9É�<�ySn8žTpù#® î-°x|Ã8ˆÇsܧ9j÷«Àt ,§›îƒ<ÆÄÕåöÜè¥V猶Øåƒ<.kçŽÎ9õš‹ÇS›óC•Õ½^wyŸèþVµgµÀêÀ³Zò£õ¬i|´yŸSùâñ9}±îdµÀâñ›Æ@YY½úÖ^]=÷Öžî;ìf~Ñ3Ù£,¿¨C¡3·ÿ®^}k¯®ž{kÏiú¸Ó¸zõ­½ºzî­=§ó˜·A~уýžGY<~S_—Þ\½úÖ^]=÷Öž[÷ý�-°xü¦^=kÈ7µÉ»žeñø®þ2ï6šæúE�üm�²xü¢]<¾¾3�¯ïÂö‹Ç×wæâñõ]Hy\ß§úê]<¾ºûØÍ¯m oïÍÅãÛ{pÝÿ7µÀâñ«z3¿gõê[{uõÜ[{NË—«A�/z°ßó(‹Ç/ê뵿ãõ�¹x|}²øêÚßñæ]<¾¹÷xx5ÿ ï!_?/l�Õs/ì4õ–×þŽ·÷æâñí=¸îÿ›Z`ñøM½¹žåí-°x|{®ûÿ¦X<~So®gy{ ,ßÞƒëþ¿©�ßÔ›ëYÞÞ‹Ç·÷àºÿoj�Åã7õæz–··Àâñí=¸îÿ›Z`ñøM½¹žåí-°x|{®ûÿ¦X<~So®gy{ ,ßÞƒëþ¿©�ßÔ›ëYÞÞ‹Ç·÷àºÿoj�Åã7õæz–··Àâñí=¸îÿ›Z`ñøM½¹žåí-°x|{®ûÿ¦X<~So®gy{ ,ßÞƒëþ¿©�ßÔ›ëYÞÞ‹Ç·÷àºÿoj�Åã7õæz–··Àâñí=¸îÿ›Z`ñøM½¹žåí-°x|{®ûÿ¦X<~So®gy{ üýiḠ&ÕîIEND®B`‚ï Dd1)Ä33ðN² ð C ð*AÁÿimage006ð€bðM >JÙžú‰ ¡�“§0~íùƒÿ) äú'nð! >JÙžú‰ ¡�“§0~íùƒÿ‰PNG  IHDR¿ü*Ú‚0PLTEff™3f€€€™™ÿÿ€€ÀÀÀÌÿÿÿÿÌÿÿÿb!©œbKGDˆH cmPPJCmp0712Om·¥vIDATxÚíÝ»nä¸Ò`nÛ¿ÜÊξ�á'0Ѐ�Í:èø““ 0 x²IN(`#½íi‘"ÅKI](QRfƶ¦mw.—x•XK‘2¶õ38xpâ àÄAÀ‰ƒ€'Nœ88qpâ àÄAÀ‰ƒ€'Nœ88qpâ àÄAÀ‰ƒ€'Nœ8¶fŒ•Öë­ý„Ë6Mñ µbs`G’øŠfÐCXsÈxÑH¼ík2Ÿ §� €»?�3?ݱî]þ>?ýuÿ4Ï·�øÃ?z>‚?–�ç_€ÿÃÿ÷Y"øÃú¯yr`î$þaâŸVdp÷.7“êÞãù?êXÛª/Ð?¤ì¿ÿèìÀŒ �ib"·yRk˜º¤ܪÊÐ`õ Û¾¾í�•e+(-àVÏpà ¸%°xĶ‘pWú‚9˜ÿÛ¿ÇXÉÈŸÉtàFý””ÁF ÀlF‰Pe¼ÿV±pÿUØÖÊS=[‚Nk€­ˆV~˜Z}Onhâêí` ˜èr nôcòá}ó—ÀÔ:ŒwÓD×M/pÓ÷ðúžœÖŽñ‡‹�ù16SOnôÓ-õ7ñŸ°á3&àÄϘ€?ã=3­Õ;î¶‹]7ò” Ül~ŽÛðƒ€'Nœ88qpâ àÄAÀ‰ƒ€'Nœ88qpâ àÄAÀ‰ƒ€'ŽÌ�ÿ½=㟭ŸÅœÈøß¯¯º®¿o}ü³õó™Yß¾êX…’Þú‰�ˆŒ�ÿ½=M à.ŠîŸ¥t¾Àÿr[ØIé¶~¶hd |´~`u ßâ‘)ð¿·ª¬â–›tžÀÏò0ø•!ýÏÆ/%Kà®<ÌÎ¥å‘!0o=,¬²QñÈX´–V±náȸo=$îâ´ÀÏòPpB߯š€/œ*Dë�€“ù~>âMõÉ+¼X·/3uù›ªèÔ+ÖOŽ®<¸ÀÏÜ5JÓ¥ xŒïW wŽ_ –„.8*Dç®xž~y±*(¥ ØŠ¾õ` •¯ –‘ÒŒ€]_ihˤŒV¡îBµ `6·ìoyœXk=hÀ]ù]ª£¶Z¸>KÛ­yrZc°ç{½—¹°ÓzàoŸå—€—ñuJïë W˜—_XtŽ x~€­Ù9&àù¾¬xÃÌæÃ‚À®ø¡�eëÌfö`O‹ÛWa½nÞz`5/ã;ˆhÀz瘀g/.°Ñ9ž ?,°h=8ÀàÙ�€'øšjpÇú˜€§…j=˜ÀU ¸ðè�«&-`VÔ¼ˆïð2u`}’’€§‡>3¤ƒ<=ôU“°9ø@ÀÓ}Í—)äÔ:Ï {fH0 –€§…j=˜À« x_÷ev]ù%àùñ,…ó2‹¾üÚ5ƒ€GGW `æ¦4Oñ5^®z™ÖÔOŒ¾õàW…ýº xJÈÖƒ ÌŠpÿ!|�—+§Þœñ`0ßeDÀ_˜>öáÀb—‘±þ”€yîË•So#€+c—´Î—€u`V˜¯7Üý<¾l›ÂÞ#@Àòe2ûõ€y¾»ÀêËõÎlù¢Àòm,ê l;Ÿ˜©©·X`ñ&¬ÆŽ<[^ά·¢€eÂGËO„Ç®ŒÌŠV ?¸?`:¸ÿmñ‚ÀZ>xX lV”å�ë#e°¶0*˜™ÍáS3ÿUÀÌxuQÀ¬&`õ©m[BùÿÕµµ0*Xë�pØZltH¸õÛ £"€ûO!à`wì,,gC Xû\¸Ñ{§ÑÀ•œ %à!¼'¹qÀUaÊð²À]} `ëSæõ—€“ÓÍ,ÃÓ“ µÏØÿeÇ3óc^X�„p`fµ‡—vœ ˜ÕœXŸÏ'àå��ù|^˜ÿAÀK[K~ xYàÊjÿð²Àjx’€“ÓœXž$àÀúð¤8¸Ëˆ€!`s7Œ¸ê2ØX»GÀÀÖzVXlãê? ¸AƒÀÖô1lnãa3°ó:íáIÞÆ¥§3À¬²_8ì߯¦3k×  7?°øúfuŽHé#³:X¼‰–ï gm¨ÛÞ¼â˜d»í  ¨­­^`6¸�>�+öŸ¿ÿFö‚¸ê‡`s­Ìô©À•dþëoÿq«ô¡€‘ ¹VÌ&”í@Å~ÿþÍ3ù/…¬u� Œ OÀÃDÒàŠ½=}ó~õ[åþêê…ü܃;û¹P`m"i°àýýë·š+¸ÂÛ¿6°>‘4˜W˜éÀ^<Ü*—„Û^Ásœ·•¶àêÅ—þ uð¯‘ÀÞFÄn€} l¬¥òÿfl}Ý(`s-¬~Õ�ßy§kò9�Yük&pqB`V�«7Ð0üFÀÀmi]`d!É„FÄ �Y.*�€#€«: Ìê TœÙ ^s‹ÆfÀÐ}m`VÀƒÚ„¡ž³‹Õ,àþC>Dñ²½pØ\¬óIæ7Б€Á}\°µX �yÝ&g¶· ‚À|™OBÎmDع±2,VIT€¤±âþ宵<°jD÷«$,`¾úïÏŸŸ??¦²½ßåí­,;#0«ÃÀj ÓÄílŸqýÃãG ý„ÿeþHX¿ÉèÀ¬«eÂo¿Õ,�Êq{à>ÌdæàvÉèqÕ%Ž ¬¯V«à·Õ°L¸19àîÀ�ÜÇ�F„ÖJs3®†Í‰r`cµ\¨‡CÙéþÇþtÄ¿d&¿ù€Çdp3Ë``sµ¬-¹€``^’#[iǶV«ÁÀróù¨ê×ל—âîï¹�™VNã×àŸ+üÃäïÄÀhC;,“À€ÿ¨“ˆþÑ΄Ï&°–í ÀU¬�b¢ÀWGÚjhûæN¬] Ô\Ô:ðòý ùÑü¡FÄ!�õ‹�âÀú2‰xà«ç¢2˜ÿ˜8_5Ú¿þ¶ø [Ö6.j×”¨vÀí{ƒ�þ¿ÿþ÷¿ÿßòE¹<¡»·ú_Ï-‡V6/Š×1À×ÑÀOâ£u°µ¥�ãFó�[ ·Û:òBÕ4àŸà#–î†r¶·ÃÀÀE݈XØÅí�±[o&†înïfuþÀ- ¼IkÛíë`V»À×8àkðÖ9n°HVX´Ô¶®æå®êXàëVÀe‹”ˆmZÃvû`c�Ä\`÷s€UG£f™k+Ð\àakQCÀìш˜,ƒ½¸-{rظ\\Ôp�®Âç¸p+mGcžÛ¦µµ f0”Œ§F«�¶.—†3$ƒ¯ÈàzàH¸•v`ûripUãÀ1éy=0pëv.—kã˜&0ù¦Ûç¸c»—K�õqLØ.gƯg ~-ýÀE�_A/xB+-~‹F¶À-z ØX(›`‹4"ö\Î6Ç1 `5Òc‰³Ç\ÏÀl�cÂÀáÙ€ËYÀj¡¬91Ÿž}$¢•¶à‘×3°€�»¦bÀâ`§±`_�Ý»¦êÀŒ¶>°9mïì)·ìñu4°*%xiàîV2ÿiá±àa¸¼>ß¶ÀúJlØJÌk4ð•€Õµ*=ÀÕtœÌnQà»â–ÀUífŽ–žÀöí¸RC@ܾ-íÌÜ å+¬w à­´JNÛcýÙÕ�Uû¹-­®€é¸Xï =ÌÑ+'nó¶`mà œïd ^øÇ(�rü½¢tà<Ññ–Z™°³ÅF–œ\'¶Ò,à©\bÓöè€ÁVÀè}φ]FÈšž-€Íi{¸U8àªöW²nõ0�Ó ž,Ÿ¶G ¶öÜX®ÿøcAO÷3‹e€'Ä&À¾ËUâý Y·Ú¥«½ãÅò„6´¸��‹ÚÌYâÀÄ&"øGlì:OÃÀú.˜'9V!†Ã*‘¯ ÷ ×ä??õ™€�].p¿þ1«OdQ4´ã'6g5à¢ÿ9\ÝËÇåÝÚu¨o÷kòÙ€‹pŸàöª?®ûññþÁã]ÛHëx%ø<Àj/Ahuee•ÛK/ûasó÷äÀko㺪¹ú'á zù°ãýÃ"‡zÎÌê°ÚÆuý#Û¼§ |á‰ìþ©ÏÌê°êBWNîú€ âWuxèBóÁq»â~¸†#Æ5©Î ß\[ '¹^-¸#¾b縙Àr4�J&Ømß<ÅZñMFý, `äÖàÚ[mŸœ,VI¸ø€yëí OgÌæ—nãŒð�åÜ]FOà¦lÅUÀ¦‹×èÖ÷É] ?¼›ÆÉ€›&°ÈÝf°¹�Ö3¼~ïG?$¶ñO½X÷‹î–ÞJÛ”¢HˆwºBÁ?CŸHàPC^.Ô6½%X¼a¼,pŠÝöMÙYòÜ”ýØ=_Á¬¦àP`#Ã+˜0X³4¼ü´=75X$3/,\.°šCƻȅþÿ@,|Žs#:ÒÅ¢Àm`Uƒ±~¥KæˆjÜ(ß°u%£.\<À@ ¶B¬èq€ÿY¸Ÿ¶_ä$Çkp9X @€Í+qT°™›®À˧˜¶ï›i¼·òœ7¢D°:l]‰£‚Ç”`í1õl`½£ï¶G×ùG‹ŽFÉä5‹?Éé‹Ta`­ Ë"±°þ~Ši{­'×ÿª‘Í´Êp…€õ>te—`Í1¢'QÀág€tЛÚé!CÀú#@àž-‚)ÁûF;è°½6fA+·BH·ç¸]ãô¸¨CÀæ,( Ì{Ì1%8RïØÓAoœë1£—’ w¹:ã·{`¤ƒÞ¸=d´«¬»JÜ2¢l}ë·A�å:‰ð³HDp%˜é 7Aàá¦ö!`gv#¸`Θ㛕-àaë •à>\‚C–[[ …CÀ—ÎÔÀ ~>/³FîšZE–àÈ#ïõ’À¾¼>bÛ|4àõwÛ{€\½»Lq縭�×ßJ‹WhW ð¼sÜ*ÀmFÀž»F]@¨™ç¸´ÀÛí¶G�‹Ú5®3 ¸ªSó‡eU"ôyf»Dpaw‰8ò^/lNÛãÀ«ï¶G€«¾ÀVÛëï{{rkﶇ�½·åê‘ì]L…Xx|l\Ô8p…øÅ{Îq§®êààÊkF€e®4Hæ·‹*g.j0CgžãÎÌ|ÀÌIó. uŽ;påË`{ g&àH`ÿ�• {$í׌:Ç�¸¨=ÀÌkgcÒÕ}P�ÇoÑØ°§‹Ì—ø¸jŒ€GûºÈ¼wA £4�O>°ÿÎÕ ^qÂOt�U > pQ{€+lIÏ{ä9.%ðp‘|6f gMàa³2\Tø¢¿©%x1à·ø:sd,x]àªö3|¾þƒ¹š#Ïq‰�Ë퀵ÍÊ…¸ò,ˆè–ž9žÛ—0p›pQ{€ÅÕBá 1,«ôkŸ½80¶Ó>`æ.j°<®-]yŽ[.ƒGÍÇ­\y3XT‰êò‡~¼Oå‹ÿQ©€Û\�µ!¸ßªx�Wœ|0§3÷؈¸Ýn_©�};í×.¼5Xy&0$ÌØëãq·HãªòË­�׈ªökóõŽð;{<žÀ<4åw¥�Teί€oC*O– l!ÿÆÀúMgñ;öñFš%̳÷¡ÇÝZÒnVeµäýÒW/2•§«wÇMÙ¯\Ô>`¹+¥ÏMM˜±ŽôõáÄýa/LaŽ»ü©YÏž‹ãË1%ˆ«�ˆòWý¢Sh‚Àû,ç+Á*�µz±/`ÏÂz}¨®Õ£¨.w�mïvê|økè‘ÎDýQ€‘Eɪú‚ÀÐ|2˜Àêè]›žG*Ä2«!².á%�…skp5&!ÅbØ<Ú/‚�E…˜¿b?Àö�< È"æâ £ŒAuùe8ÅÍ[ ‘0¶(Ù™¥W73Òôt§ˆÖÐïÖ’ž‡U¦¯†ÈY”ìÜtK›iëŸ*Š\Fõ|Ðh£M[ ‘0´â°Ñ6+[Àv'C&qt…€›Ë`bó ±P3 \ÒÙDË$W!œ€:ÛWˆ-€2÷ H^Ëhàí8Y‰À�Áaˆ;C8z†îžg/ /JF€aHx&cD…¸ç™À õäÀEÉ00¾+r˜W!Ê­uƾô`9“‘ÀÑ"‡^©2+#ÆtvU!VïÛÒ;wѧ¸óT¨¯Á; DSƾ¢=øaVŠÂH3/nâ³#Çm<”•"þw—=ã7�aàáz2‡ŽIà!�ã+„r–󀓜¼@4|[¾Ý/°veºxà2W�Kõ< ×ØwtMÉNÔ­ =×)Ùݹ¢È6„¶œ§)áÁ�ËþšC‰x3 TÊá¶ÛhX î3¸¿�Ó!JD…tˆ‘Âafn¯ <˜ú€»ùÄFô>Ëè–/ðçs@>ó�[o½� ¼Á ¯ÁéÚk ‡xÄTÆó €ìM`o;XœäÄÛýJ‹®0û+”É/¾ö÷äŽÔLûÖHBk'ø"·\ø+ÄÆ±"ðÍ ˆáŽê& ä»·Bœøöia1ü2¶�Ýä;{É8�×þ6x žX!´xÉ8�×¾Ý 26j.QwöÅe”À«;Â,3ø~³÷Å•[«®ü '𛋛R!>åˆpN ¼ð K`d.nD…0J0v?!ð·ø5‡�ísœºØH±ðÍS!_h.;fÜF[ øÆB ü0+L \nmº°ÚêùÝýÚ†بs*D^ ¼ ð ­cæâ°.õKÖ ¼ð÷-xгÓÜäEÀ0ð÷ FóôÅÆ,ò®+ßFU�ÝBFøžw§ŸÀúamÐ~¬]!rKàôÀãØ>ÜúÆ—ý÷ÞzïËjÀßàpëÈQÀÞõhGþî‡aFc{5à¯qWCÀ7'>‹Ì…ٽȄq޳¯Î“C¤~¹AñÉXX=l ›Ý ÃôèÀ pq ,Ny£NqÚak1+’ÀÇnEÈWÇïØæ¤ñ |Ê‹.F!>;p+®3o%0tÊ‹¬¶°ñãÓIÝ“3€Å«U‰üi�ö-ãp?ŒSÝ œÀÅ*Àí�Èvňjº¹P…(§<×]ËßÏÒ9 žö>ƒë�»Ÿ½:Ày&ðÚ rØø“y›nàÌÒ« \nM™p§à¿Ü¼M7x|íÕ*ÁåÖ”plܶVóM6,Ð!I0±»S�þE¶–DbàÖh¾ L01–Ølb;à.D"—ôŒ¾fÙ'ð¶À­Û�ç_1à—a$¸ÿ\Ö‰ †õJ«Cm× 4�ïª ’ogÜÚ‰sIK£ ‘ׂJ#2îBïPG,ˆØC#¸Í ¸ÕY«¯ÁθBdÜ…˜\ˆï»Nàu€ÇÞX¡OdQ'"VœdœÀë�ÿb¬ž7Ù^w�À«7ão RŠçÆÐ}t:pÎ œg‰0Çê_÷\!²nE"ï¶Bì¸ '‘÷’À›�Ÿ”4Œw“À[O™Vo´b%ðºwÙŠ~Ö{ú:Ûw™Àg½Y .'sdH~� �Á5b�À]wœ=10ø�#�áÿÛX·z!`óÇÆ?} ˜€�(�ç2�¨ßÍ(¶†4J^.Jè/ømÝ9´f ÇG 5�ÉLŽpf¸ÌÔ-:2s�€}2î!^ôɸ‡8ùó+·~ s_ÀÖÏÀP—m" Æ�›2£mpÁØ!pIÀ \"vtâ˸�;¹?mýlý ÆG ßž(ÏØ)0Õà”AÀ‰ƒ€'Ž’zr*VÎw‹Õ±ð‰MÖÎu]Þ*±0ënŠWŠï'þ–¢Ìÿø°°vsRñ—ñ¿â¶°.Òk�äøŸþþ™eÞ¶ý_qsãÃÆ:Àê.°âFÑ<{U&—énjœA¬S"\à¾4ôéM%bN(à¡DÈìo_¸H¬¬�ä˜~’KxSã bE`­™VjÍ4FÍ4ŠAÀ‰ƒ€'Nœ88qpâ àÄAÀ‰ƒ€'Nœ88qpâ àÄAÀ‰ƒ€'Nœ88qpâ àÄAÀ‰ƒ€'Nœ88q4ÿ¬Î“ïAx±²IEND®B`‚²0Ddq%å……ðN² ð C ð*AÁÿimage008ð€bð0pÑ­C8†t¸Ë­˜ÿì/Ó'nðä/pÑ­C8†t¸Ë­˜ÿ‰PNG  IHDRËKÓã60PLTEff€fÌ™3fÿÿÿÿ€€€™™ÿÿ€€ÀÀÀÌÌÿÌÿÿÿÿÌÿÿÿ€k÷abKGDˆH cmPPJCmp0712Om·¥/9IDATxÚí�»nK“€K’m™Cy ½�àtÊv~%N6rä`#e(T¨T�?8XFŒ%Ú\�_ÀÀd'ã3lwW_ªº«{†^†òô9&EŠ"9ë^5MX�«Ïj`ßïàÀ×°çö\#ÀžkØs�{®`Ï5ì¹F€=×°çö\#ÀžkØs�{®`Ï5ì¹F€=×°çö\#ÀžkØs�{®`Ï5ì¹F€=×°çö\#Àžk—éÕšºðùß dí`-ÂR÷åÞĨǎJHF€�_«Î!v{­zØïµŒ ´ŽÁ(nS+¿úÂß úZßÐ.GÝp?Úø0�Ò.iïnfÇAK0€ÑÝành4äÇÌïê¦6Wæ�Í_îYJwÆÔ+sä`£i@íÚ»Ý�Æ\[€^|õc€<JQЛˆrcY)dmP°»Íµ»p÷ëS€°ÊFFo`Ý ýJÚ»˜1~€Ú€îÙþ€Ã(s"�ñcd€ÆHR ÜóÚ@½´ ½ ¬F€#À>}ØÁº»Ã vcè"´åψQIÍpò0ÆÓ W `Íò§…1èoÝ-°ñw»Lœ6)'¢²…•¶?`§÷Sïû¬û†G€=ßð°çö|Ã#Àžox`n�{®`Ï5ì¹F€=×°çö\#ÀžkØs�{®`Ï5ì¹F€=×°çö\#ÀžkØs�{®`Ï5ì¹F€=× þ3ûkßoaí5 €ÿÌ~þüûà Â·X¨ÿ áPj|à¡!ÀÙlQy€óƒB8€ÿÌ6 ð�¤pÿÿAíå‹ÓA¸o€ ‹V"…{¨¥/ð0y¯g3,¸˜á*|ó6€Ã—½4®78¿MážZ×ËΡú �\TCF¸€_„ʨ0@ pÈR¸€Fú"€sð6 8\„»ˆ®—TÚK�ˆFj‚·k€ÿ̧€U±HS w ðŸ(pžG*KÂC01‡ÃC¸K€Ôõz*sÈÄ�J­S€ÃSätY/¥Qâ€ç(›àФpgµïHÆzšH¨y@pXw�f½DÂÚS9�0¨y¶or»øÏ,…l\9¶RTk wÐøŽBÐÞ€6¦Iáö’‚s8|çµÔi²p>„Û8›U©'�Ãb±@,P‘· PûŽ`äZ;´1Íðy›MÉ/˜wš¿VûE¸=€6ïˆzk&” ª)üà^¥p[}Éϸ³l⑘-¨Rõ àn `(ù©Ë?ôúr‰ÅT¡PP%Ð|òÇîM‘·�–üTÄüþø�èc“\Aµ*ô)rpOR¸€nÐÅ]~ðBBåÉDXAuîëƒ"@çÇ€{A¸q€aÐ…üŽ— ôqáOïjª"ÀE¨â°×šïá†ÒA{ ?À?>ü�Ë…|wÚ[-’0fE€A‘#€;—ÂÍ´‘ ;¨àwÅÍë �Æ…? 5Ñ!§ŠœÜ1ÂMt£<öûÁþPiþ¨ˆö&E‡+²pQíáæÎf ɰˆêìw¢½@Á!Ç—JL%€;”Â�œEGà„èè/þÇ€ýN´W˜8äô’Zöò;B¸1€•Pçmà‡ †êws»ªZÆy.Ðîáéù üáï„v€‚Cf´˜"s€;ÉN¶ªyp!šóÈ&7Vnø¦ ÀÄ!'£*C¸)Ü@t�¦åˆ—¾ëÐ~ÀH‘+ Bø×!t‡óþ›[@~Àkxß ôEr˜$'îê ÚèÃ+Tø€Joº¤9§ÈòÁ¤…c¿|wöÐêðwA°¥ :‡2@ß«.@³íµùV•èŸú•}ÓsZñœß8~æ:€ï¿½§Û ª,èVT‘‡¿ä·§ÿ<À¨ ¼ùfœÉwÔåïïÕ�7àÜT«@ô‰I•a�Íföé  zsµE¼ùPÉŸºÃ4ä.¸»�r`ô) àÊ|�BúúÂ@øí} Pk²Š¿Ã{¼ã¿í˜ŒùßæÏB� ä� ÄŽ `ƒ_® $…�€77ïý½ÿ­þÆIÕOûÇ.µ�µÙúŠ@âÉ0'� ˆb‘hoÚ{ˆ]ûéÿJ+AØ“Ww¦ðï­ò{� ̪p ð½øþ§öžp 6ïgtüY€>bÉtÞdXë²Iޔ⵰Šj}i*G{|"@|È J! c:¤?Wü“£‚"@c:Ë5ÂAƒhHJêŒ×7¹Št<âËj‡Üp±8ÀÂuxDÏd'`FD€U<XÅ—<æ“K×è@åÞ‚À¨Ô—´QãßòÝ¥Óá,@6‡ ¤1ßÛ0÷ÔnR³ç¸¢© è~®Ûìo 6^2@"“àï†À8}KòzëAtÖÏDs&o)À›o]²3êÄb©·&@VÓ·�4eolK$Ž� ¸÷$4vî6°Z´U¤ç¼tÈÝ‘Àg8¾ü¬×å{ ÐX° Zå¶W¤çð&úÓ¥@µŽ ÀËÈ [Ht ªsVPå;T¤I=L€ ~E5~ë9ùΉ­ �?¿O¾g?W WPÍ´ÝË<@2\›Xõ+ª?3õ_Ó ó–Çà%�bˆ¢?¾¼\8'MÅ…¬*«È¼¤_Ö›¾Wt_ÇÚÿÏtgO ?Cð†Ö o>€’PiØËòÞÜ_h®é?˜´¶ÑüY€Ç7À4÷†*³þ}E˜Lc„² ŠL‡�|qw 0®`Õ]ÊÎ8ÔÆòø2Ý3!0 i’šŒ/& ¬d€ �÷x€êß%`<,Ÿs+€�«’=²CÐWPä!4Õû:£Â2@-} „ê&ðÜäŽ�€Æ£RU‚ke€Öc  ýöøœ)«Æê ¾a‚òÞÌ{{Gs)�øæê0¹&{˜ì0ŸÀ b X¯òaL^?ÛœÄØB#tJ�Q¯��¬b€Õ 3Mv:£¶lÌ!˜Ø¶vßÛnXá�¦¿0?ô˜¤S€H� nÅJ¥1�—Ÿ!�ê'—R“�ÏÍsM,lDˆˆ°œþÿòK«ðØýﲫËãK%“ q•d£úÔ«!M÷ñ@uìÚƒÝF"j=3Pƒ qí+c² ý…ùaçŸ9ÀË @„§´ÚÓi1!>„q¢!Í«Ö!4ÓMnãñ|(¤¿°³€ÇTƒ1E±¹ž6Œ•p!¶ˆ…�æ5W«"@�üï`ÖÂyˆÏÇN�S€—Ÿ!ø–,@©EÌ>*èœ  .é€^}�ƒêbvBœÊñå²êP‘ZÁ¬Žµ&À¦PGl{h*£ŽÍåçà±>O2«x[ÆX‘ך1§µ?�¢—Þ@[Òwjê:I$}‚‚ßô߬hÊúJ· 0©cuˆÞ6öП�åÓßcò`PÿD܉JóžŠõ@zÒR0Êîº40œ˜$zÙ^ã†óŸ@Ó›.—ÁôÅ�9ÀéÓ¿ñ9°IE:p‘ž7'WôkH7¦´ì"j!�®7Hƒ /ëÌt:›?=Áôéé)ü||éa9lL‡ÿcú„¦U`fž(0óÙ]@÷¹{€™TnµÉTù7…ù6:ö¨šµ<9Ûq�‰ <=ý{´1Qa¢¨€>»ë°Çz @,¢-&,çì´É©¨4™ô%æ—-@Ep”U˜ß´cž(Á0Öé¤9Œ’*ð ¼Ñ3ô.�)@¦ÃË©è?�`~Ób†‡ Ð�IËcúÑ¡€O@Ã=ð˜zucªþfé‘ð�zÔ}Dí+ ÐöT ÐÔŸ€Ò˜>¸|”=êJÏã ‚Óéòé) ¸ä—áKŠR‰äÉõHK(ïÿÔ °¶ê+6•ÀõìvPÒ÷Ý<Ëd€#øD«Dðäúú¤’ÆU^\öj¸ZÙY³lc}³Hç‡cüA̯ƒg.¹OÉÏ0½¾¾¾ºêRP�ªÓai €È$×Ö¬�n ÑÏ�g‘£›__OƒÃ×Nð¦Ôð=Q7²\* ¼>ÉÖ‰ %å}_Çê ÐXÁ,@—ym V³ ; HõK¼"^ƒû�§§ µÏ‹©ºª^]W€DФ)…j=€ÆQˆ­°l`�’ŽHCP;�0•¹à–õ•©&,¯µ^åòO*ÒZvªJ;@Ô' éºoR…ט27Rt¥x'æF$ÍÃtO8Ñ"(oÝ‘³„!Œ Aa;@ ‚Æ`¥³^m0Œé>enì˜ÖbG*8�¢Á-^•bxr6b€ù/v°u¬6€¬/Œ½²4�†0Qº¡@Ú|$9–*‚KFŽ(ô4vÒ^VÕ;T ×ÿæÃ4ûÈ ùq ; PJå<À�¥rv¢Ë”¹¨8ÀT¸LD’¸-~Ú„^-Š›I;ºBƒ©8¤¿Ç’>ÎÛˆaL“¼Ò¾ÀØ2à0‘\z«¨K‚€Žx‘nF–¶–D€…!ýé,@�V(„± t$$¹ LµQVÐêjì�Ck) ÐèñÀá^éˆF YIa”XÉ¢6?êïþÓ9… Àt0°b7`˜ºæ¯¯þkšdqG£ËJfµ%¤º*”›ì­aÌàþËú¼<1!�BÓ,Y%Ë¢³¶P •%´Ôâsn„:ÌÛèС^9�œTƒŸ|AÐ{ee ÝÓJçÜøÖRWð*sÂÿü¨~DqtyÉ4éïê‹�;¹öO›û l²¿)€йË!¦!eÌ.4Ë=mrÎ k²ÃÛ8&{æg¼q�%†iÀë4‹íˆ+„8°°‰/k²["ChÀk¸¦8]P³|J:VeXby!Ä�óÂXV²9íaT‚ð/˼ºæ·®Œ*/£:µIª OX |¢q`Ñv‘Þ+@p'ÑÆ©ˆhLѵè­ëP|ìÇL xâ,átYy*UÉv‘NûÂâ,ùÊ×6WL°æÒÎ1MJÉJžuÃá–õÉ.Çã¾dÊý³®²²möKÛ™³ô8�õ…mUU>ÍÁó†úÂ`kYi9¦Y¸æì¿àDxu’Ô×h9Àå4ê5&�tióšçšÏÈõ…±xŸë 7›ì õ|[Tç•9˜ÇÇLd9@MðŠD{ à|JHT¦¡¶eîÒ`�tÎòóæÚÖ¦’9ÝÕ•ž6ÙF(´NðÍ”CêC®d€Z½¯¢ZÃ’  »ƒelÙ¯å[�ô¸àÊœ­^:áÚNÕo ø„t>A‚'Àk Ö‘þRË'-±žˆjüp!YÂ= ®ÉÀK²ƒ>[€œu Bè-!Uè(‰Ã%„¡²`"ÃÛ©G5>B~aµ€&flìT’u;&õm_€îêÁ+W© ôm“ B⌗î9,Á ëHЙì w"uãò OO¯…ó5)Àljp‚Bxƒ�¨+ƒÚ†dÐ|/�àôxŸ*ì¢5ÄRØŠÄä¦Î6ïy+lÌ E~×i�žä†Êûy¢>ÛG-61+„{¸r{:º<º¦6°' É9ë•É>çYä„Kx’˜À@ŒhôÈ)tC¨EÙAÈíö °FhËÜ 7v6³ñ‰Aë6 %Ç,áUZ,T¬–ò=oDm$@,aµW€.•³eƒ(D€™ï'5:l™djKÁçM>‘ºè‡]öw}õ01&0¸’ó£Ê[øÎ¶¯¦–¿àÕm|2¿0äLà9aBS…'à «%ruœj;>å…ÊW¤‡ p%ô–F‡¬†”œ¿ŠòãYx‚ÿÀô¹õ6¨>w-“.­¯,ô…åGô•ÀÜÆ'GÖ’Oˆ+yY]#B"WëTfÓ&9ÎúaHSÙ–I{9ˇ…¾°øˆ^£†m|ⲂóIˆ%Kh²½`ÁL› Ÿ�{àŸï¼ý»ð•9Î}�:vó÷+”&SfÎö…Í#6WPõgTÔq ͪËäÃ“Ô €º@ue€Þo/⬭rY–ß9^[/œûfRÐ5ó}aù[¨HGÁ«Ä‚"ûšá„”¬!¬“NýÇ3y´ö^Ø•:H`]hÖûˆ†ðAt¡Þ:ÁΓ©»8¶Qý0*â�@pB> ›Ò­ Ðå¦ù¾ð®ÎXG€sk‹¬!S ”œ°Í•Á&'WÈë‡`þ÷Í5‘WÞ@w"ÝžêÐâAvÂŒ£ÂTÝÝ @v[ý< Ý«‰-M{^`F…ÝùÂûˆ)‚ÓL �›à#œ°H1äÏ&>–±7ƒ™ý¼8‡ŒÆ+ ñ‘ýö�$¿4×C#”»’óó~³ç ›Gì¢/L‘Ë‹#˜$ G‹ø;)^�yª¾àEªÃ€>�n �´ío4�v-ÔÌŒï‘PåÙ {õ›äêâ—ð*H.R|¸8JD°0|îu>•ó7™ÊÙâVfÆ—ĹSgß‚è„-€IàãÃIðÊ„€ÐÇ€k|õz%@(ŽgÍ©y€ØvLІ¦ü„³{41 ЏÿÈÌ”B®žºo€…ßù3dj‚çÖ·ë7lÊ_M€G›œp#ª!”g|Ï^^àHð!xæ>­Æ±á·3•ž\…_zp¯`?³sÓÉ|±æ¾æ|yZXbrèæÃ_Ü  «Ú0vÆ@º—°Ÿ–Ûšì0*„ÏG2@ŸÜ±úÂÙ]aˆøÂ½žýœZæ+‡ðåÿŽ„hÚ‹ 3…ÝJ4(@e�¨CÛ€êpÎ ¿…ñùH½sRç:GëWê‹…²¬•Ãà=Г´NøÆÅ„Fþa½Ä*Ãvö‘æA`�V_Œ–Ìþ‰‘ÐI ñ(鲸m¶¨s_8s"q¿rVG€/Ð$ééüœ‡ P7…À?Ø<d€väÒ�TAŸùe»!í�KZ…q3± jK'ÍnN´Ñ6À—3�8Nß|Pøð@Œ€I Àït‡Üs¢Ëª  É£jZ&o*É'o«¤o�öZOò’>¢ŽÅ…@Coïä^€Â÷[˜î¾Ó`íF-D€«í,Œ&Ì)Àî„ÑöÑ;uP?Ì?€ÖÜUÀd÷�ݼ^®­iËÇ›XŽ Ðä%©+9â¡ ÄÁÉŸS€ï¾|U È ëÙÝw:\5°[€ùñ,PJüL !ÆÔ\‘¹]¤U€ v(@3[ ŠÜ¾ rp•mknI…Å K ÐìQç|ˆ½|>Or‹wTò>ð n&-lßY�À]ÌÍøâPh| xn•¸  Sqž¥¼ûúΔvËÂݡ֘).ŒYm'Œi$€~Æwñ|ž Ûh�)´¤ãŽ*äÚ­zSKXÞr¢{_8s"ñéÒŒ/FƒÏ$¦~á:Ë£Áó‹6€�趪‰.J_k¸êÞÞV*—~?.™ñ�§®˜»;2³@SzpyßW0þ&BW€¯^}–f|ñ[)8@æJì°[e€!-±é÷¦�Pß=X€Å_{Tg ª}Q°#@{# �m7ƶ/,ÀWpN³bn C&œL3gÂ{’H·c©\nDú b]áL°„Ä´%” �°'*L¿›¾Ý  ‚‘"?Ã3m°@sáDü’TÞøm4J @]%<¢�`-€ú>x§~YÄÅoh9\€V£€ƒŽ&sáñ¥å Í‹ó;Ы ûR´Cè %œÜË )´ …‹ó³3úàý=øÝžøeü]UÐm?ê!Ì;W‚…Ö(¦1ñ,Ȫ–ÌÀ»û;�êÍ�”g|ÙWË_ÈùBk¨J{€çÀ”Ý·õ"€ @¶ï¹ä›Ç `a¼9­1ÍIVçà˜[®gžŸEÖòù(°¢v‚WáêzNf<‹o�ˆyqÑ•¸0™ªù3}HTéòã@]Ó¾‡ïšÅÜGl£Åw™0ãÅF­Î€Þ•ØÆSsGܸè,@q/äªÃ¾ûï 7ò>¾«*6LX7f&0xt%¦|ö"4B˜¸X€0ìáûW ùlVö|á:s¢ÍÊmb·ù‚ª0eéËÌq#�³È‡PWr~n$T¨)—V|[_ ÝÏ6¥Nwâð&ÛšÙ1ý ±Hs öÀË6 À—¨ã©¢òØOr%UW€u¾©dûÂn“M,ìãKâÀÌœ½$p”ЦšcŒªÙ šXÑ•˜WîÐí¢‘mk6[hk–ÂúÕQ!?…ćx3×�W³S€‹Ì¶ú°ÀBcÝ4�6 °H€sò¶gQãű Æ3y€¹mõó¾ ÀFíðÛ îj6&Ⱦ;Ô&u)@ ìsüðiÉ9¤³_0Ò Nhí®/Ü `T%ž§>¤;@’¹ÌÁ*˜ÛV¿+Àüx›¸ÁôÖÆÛ@–›;Rb®Ûx–>Ôe.ç0ƒ� ~>Õši_÷ZÛi_¸ KðpfРË\`6›Ý ù”BÕÐ/p#¾à<Ɉ³À‹¤°]¾˜2ëé̬ Twøêµ€®³Æüqê£Ö1sâCºÔ�Qp&Œ_öpÆ¢0_ü�Gí+¦Y€ÏXÑÏT-@˜ýL†)…ÁÄ]-k¹³žfÄ–ŸÕ∠s¶Ÿ>ýVë¤dñÆË©å7ÓÓVp·éýyZQ¥‡eŽÄó›ÝB*Uàó§ßð7ä‚ã§ !s"ÈŒÕC˜Q�ó¶DeÌß­U€�¼�/ލ2€^öfèns ºß¿Àß¿@ø¬žÆÔO*ô£¿CX܆–ôÖïÔ6ˆŸáwP¹’DZ@ð6ÅZr%6¨0Àì”y0¸�™ @t0“†~ÏŸ~¥•'Á?™3¬?…±¬ †°nÊ#ªxù·w˜êÚiø`&TæO¨Õ8–@'зþ¹\‰ñƇ0鈪>”¿}Èq¢ðá`õ€@í—ƒhï s%3É•(50À$ˆNGTCú´ œDšNˆ+Ùá•üõLB@ÔæJÐ `®TÐÖ0Þb*gë´ ¼FÿÂb¾JÝ,¨À_¿Îˆº?‡€ÈyõSŒgÖP�¿_X*Vµ4Œ·pl”×¶àŠ5Á3Eχ~y€Æ•x€ìÔË^É•%и®•ÿФ\ÚÒ0Þ:@–~@ jOò ¹<@z€úóðÚK„{öj€rÁ¾Ü0Þ:À \àµ�jŸþgÁq^Æ÷ÆDûÈçÙ;£D¸gXlo  k ÿM$Îÿ˜HdðW�c< Åð1¥~ª ÍI}¦@È4-ÛÆÛ¬_°y·!�vb³@çŒíGb? /×ööÏõÚ'³aGicøïÛà€ƒÿ½M~\ à'”A'½·$£ƒYxîõêS­S€d+ŠÝ$£ ÁH‘CãÁ µ†À_:ºø$™FC�¸ñ` ÃÇÄ]I'€rÛ<|uÔn’á‰)W¸M2þz§Ï$üòIô-J�Iþ~OP½ÄÏ5m`6Œiio Ï GwÌ{�H’ƒ“@À๬_¿ˆ¾X‹g0^ðøk…úL¾ž}¿p&�.7Œ·0H…·K·@e…PPké;<—õ«&(üýû4”$R‘v/Ù  [PJå ãm$òA#4â™ Kj~ "($%‰X¤Iî³ÀׯÍTÝ1M?ni&ÈGÒ.RÑü4=¼† @£²AÐ%éÆRÿA´N¤nNƒ�O<Ç)ÿÕŒ4ò;($NƒVµˆÑ8Eo|@]£üÖ錊™ÆD‘ô'ï@ê‹ÝUdB*b^�—ú  }õœ i; Ñ3Õ5I£ÿe©/¦CZJ4KQj|HKÉ,Ý a‰¤­ÿå‰/&‘AuKŒ¢zjÿAýl€+–õç<É'kýÞ€_ß¹kâJ(@–Š?Å]IÑtž$žeA°V~_ s% TúçnqÀ1À&s6p¡a¼€èIÒ—$ijw]~’Ée¸©L·`Ô®ÅrV¾Îµ#€† ¤GJ2ݾ�$p·,0ôf›Žª_›bžâRhäϼGWd úqfp˜?¶z°aL“šðÆLKüà—� u%îÊù$1=äØŸœØ6`Ùì)�:ÆH ¨ý/H\‰»ýñ*äÅÛ²�\ÊØò ã­LW³bõAšÊAhüo0¸’ û 0™v�Ö6€¯_Û«ôS×6‰Öoi~â¢ÿEr–#º u¥ŸwÀ&90€ÚÐÊql#Mn@ô¿w Àû;æD¾Ð¹rÚ’;•0 Àº©S7ŒGü/­{¾#üD€HÐK 1�¦^¹n9¶ÈêƒA„ ¸ÏD|çâhæuùÔÍÚÇ>D€�Èꃾ`rÜ{ðž4@îu‰3®“÷²ÊgÅC¸Ê‡5¯ºsÝÞ~ ] P$iß’<_] o¥K3,€9bKü¯«O�û6€>­ûzÊ[£Á(ùKšÿ `“çS!«sx›*o ðþÀÛ8$Ç«zõ6Ú­ @ZÄ0ä>ø1ø úºœÒÁÌoÄôæFѰú ¡˜¼ûˆ9@#ƒ_hßÒÿ˜©¦ L65Èêƒú:âdäÏü»�~¡–À£ñԯ쑠Nòt³:"G§6„vi°Õ_uÉ,¡¹•ˆ~D…ÜñØèl_ö^Lh@x�†ÉhíŸÖãÔ•;³ÁÏ£Ö²<¹©ãÀ.}áz�}a\ U5YVÇ:yÔ‘‹à‹ïø8*^Õ^žÈ90xüE6�?W‘–ꦹJëNÊïžfuà½_’/¾sž‡FÒþi£†Œn®—œˆ¸ÊUî³ ã¤YÝ-� è‹ïhis¹ð´Q"Þ`®­™k Éê@2è|±�œš9c=ô`áàºÌ5Œw 0‹ù¬.‚´ØûbÐF�·¹4X¯ºØÀÕ*ÓÞKc½;@ï‹=@§½à퟾Nž’d˜• #ØVÒ/Û@ãu÷?“)m™_Y‚`ðàøi‚ @:©^ó *÷ÂÅUG^x¨ 2à{u©ÓM|1DÉ„kË¥mŽ·Ìí=à0Æ´?R§›øbüÙþB£ç:$h䳫ûõ…÷=`Ù úâ�Ô馾Ø×öW§ôÜþ4ÉãÀnÕ˜l_xÏ#¾ö øóÇj¥}ñGêt_\É=Ð4:�y%Àׯ]Œ*Ô‰Z) ¦� ¾Ø»’{ZȆ° Vá·�ljT(_|KMžè‹½‹> ¥ÄZÂâ“MMK.üFêã$NWöÅέ„bl½’¦Ø¸}(ø�ÕôµÒ¾˜HZÆ[œw¬„/¾^W0‡�åµ2¾ø#‘¿œ/6F±XÂ_ÿØ`2p)ªUCcéœ/V7<À:÷boN;.$(ûbw·v+q ?šã‰÷›h*%K>¦¦!и/f¾$*áG³`¦ ]Ó—z{3¡…òÅs¾˜¸˜Ó¨„Õ¯|9Ü,û4_ +ÌùbúóiTÂOr \•Žì€®d€²/f~9.á'³`%�}ÛGê‹™_*±×yá®]àa„B³6ñÅL¥ ÂÄÒc§å¬U‡.ð 6Pçm{ì‹™%<ÍUÈ‚ºì9ø±ëg¿ó ùöð –éæ}ñ�XAhxÛÈìé¿>@O½¥€? €%µà¾˜•cÀUøðâXa@» À¶&æ KL̳‚ Èÿ5&îæ Þ:@m¥"GuÒAšC¦‚�luœ€m]àa\Eñm|‚±#H§ïr„Øè[éE€]NnÀ:m’DvËøâ ¼Á�ˆkæE^å…»v�0­¦• R÷á°t0¥ÓẴaL¶=<(€‰–ª÷|±Í@ê e_äØÓ@z5ü@:Y‚ \1‚àÎC—Ö‘³tìî-Ôþjð©Ü*©‘Èó,ž äfðQÝ#ç<ÀׯßĶHI ºL,A©‚@´Fä,{ßUã;Ý8¥ÂJJghã#C Úço‘Ê®9KÇÞw™'Ù±Žgö²gh+Íö%üÆ?b€�#géØû®ßÔV‰Å+Ž;²ZX»sÜI!yð‘sü>6±öpÕÆx€vú­^€‘Ê®9omí`“¨pÞ˜é7zûõ*»³Úù*ºåæ4®<¼Ve··ö °å íèæT6=€}¿ƒâ»Û÷èð÷œÊÕå_ó›¼ø2Œµo€e"I®sãw‡G°ç——ú÷T!õh£—¯„…ÓÃÞ@S�B¸¨®WcýÞàȇzu2VZ¸Æ ê®ÖÖšWSÛóžóé®lùjß #¿©WýY�;~·Àž­ÅÓþ¤'È×é_]þÛâê¿zðií™1{¸e€2§Á‰Y‰D_€è¬FÛ~ÂÊB³]ÌR!U凧§%¯·�®”‚˜Ð š›îÛ]Èëz�ªü@Vo€®µå�$ÊŒlš{ ½¹œõ'H`íŽÜžÁ+kÀÚ9(Lªò�û&ÃX½Öîyj;mžŒß6¦°érõ—@jÍ�Á®ˆ…ÌûÌãV½°˜(Ú@ÉC»80mºqm5ô©Ü«âÀ7 °…Â-ú ¡ÄçÞÓAD8{X,ñ5¯m›ïrm `¡ÎÀ~QªP ¯'½Çý¾|¹Ä7l}ùz�zà ×¾¦%¾àZ+õ´à8ØÛÞ‡=¼wTZxXkØs `³Næ';œ(ˆÇâFSìnõz»ÃZk¦œ.'çòà6h°�ò÷–v]KÜzXò¨m‡ë�ØÔë\Ù�ÍœQ€±††…¢Ú×&ÿ€kô5mÃB+Ìi«hï°Tú]«u kÖð®5àæ°4^³v*)‡ã‰G:}»C[kzáÚÕÃíîÏ5‘K ÐÔ¸›W”v;¬\g�oºÞ€uâÆz€Þ‰l>ŽÀâöÅñ…Ÿºß„f¾£Z]›}»ƒXܾ8y°í@Ç6µ™´á¸~Øê…ñ¬Ð?Ä® е–‹q Oåþ„8°^ ?–ºýÞ?`óênð׫+ú8�½±‰5@€‡µ†p­zàþ×ðn¥ì¹½5@€ë„1û_C¸F=pÿkˆê<‡áäùHÅ·;´5zá?j�{®`Ï5ì¹F€=×°çö\#ÀžkØs�{®`Ï5ì¹F€=×°çö\#ÀžkØs�{®`Ï5ì¹F€=×°çö\#ÀžkØs�{®`Ï5칚ÿcU›’rIEND®B`‚^ ˜žžžžžžžž666666666vvvvvvvvv666666>666666666666666666666666666¨666666666¸666666666666hH66666666666666666666666666666666666666666666666666666666666666666°62ÀÐàð 0@P`p€�ÀÐàð2(Øè 0@P`p€�ÀÐàð 0@P`p€�ÀÐàð 0@P`p€�ÀÐàð 0@P`p€�ÀÐàð 0@P`p€�ÀÐàð 0@P`p€�8XøV~_HmH nH sH tH 8`ñÿ8 Normal_HmH sH tH 8@8  Heading 1$@&5�DA òÿ¡D Default Paragraph FontVióÿ³V 0 Table Normal :V ö4Ö4Ö laö (k ôÿÁ( 0No List 0>@ò0 Title$a$CJ(DC@D Body Text Indent „Ð^„ÐBþ¢B T`ŽBody Text Indent CharPK!éÞ¿ÿ[Content_Types].xml¬‘ËNÃ0E÷Hüƒå-Jœ²@%é‚ÇŽÇ¢|ÀÈ™$ÉØ²§Uû÷LÒTB¨ l,Ù3÷ž;ãr½µÃ˜œ§J¯òB+$ëG]¥ß7OÙ­V‰�$ùãûÿ©«×îÇ !)OÚ^ýrÍC$ñy@“°íÝö/­yH*œ˜ñ„´½)‘Þµ�÷ß»Š×UDb‚`}"×qÛ‹”J×—–¤ÃX^æ)I`nÌEŒ¼Šp)øèÆli¹V[]Š1M<”àÈÞ�©OÐP“ô6râ=¯‰’zÀgb Ig…Áu��SÙebÖö€OÀ�†ä¾òÃRÁDÛ«™Ÿ·´qu ¯g‹˜Z°¶´®o~ÙºlAp°lxŠpT0­÷­+[}`j×ëõº½zAϰV–2ÍF­ÞÉi–@öqžv·Ö¬5\|‰þʜ̭N§Óle²X¢dsøµÚjcsÙÁ�Å7çð�Îf·»êà ÈâWçðý+­Õ†‹7 ˆÑä`­ÚïgÔ È˜³íJøÀ×j|†‚h(¢K³óD-еß㢠dXÑ©iJÆØ‡(îâx$(Ö ð:Á¥;ä˹!Í I_ÐTµ½S 1£÷êù÷¯ž?EÇž?øéøáÃã?ZBΪmœ„åU/¿ýìÏÇ£?ž~óòÑÕxYÆÿúÃ'¿üüy5Òg&΋/ŸüöìÉ‹¯>ýý»GðM�Geø�ÆD¢›äíó3Vq%'#q¾ÃÓòŠÍ$”8ÁšKýžŠôÍ)f™w9:ĵàå£ x}rÏx‰‰¢œw¢ØîrÎ:\TZaGó*™y8IÂjæbRÆíc|XÅ»‹Ç¿½I u3KGñnD1÷NIBÒsü€� íîRêØu—ú‚K>Vè.EL+M2¤#'šf‹¶i ~™Vé þvl³{u8«Òz‹ºHÈ Ì*„æ˜ñ:ž(W‘☕ ~«¨JÈÁTøe\O*ðtHG½€HYµæ–}KNßÁP±*ݾ˦±‹ŠTѼ�9/#·øA7ÂqZ…Ð$*c?�¢íqUßån†èwðNºû%Ž»O¯·ièˆ4 =3¾¼N¸¿ƒ)cbJ u§VÇ4ù»ÂÍ(TnËáâ 7”Ê_?®�ûm-Ù›°{UåÌö‰B½w²ÒzÏû¨nœ”ÇÊœ"Z úàxŠÕJÜZšìp;‹“Êì ØåÞ{/å<óP;™Ž,)''KÐQÛk5—›òqÚöÆpN†Ç8¯KÝGbÂe“¯„ ûS“ÙdùÌ›­\17 êpõaí>§°SR!Õ–‘ 3•…K4'+ÿrÌzQ TT£³I±²Áð¯Ivt]KÆc⫲³K#Úvö5+¥|¢ˆDÁ±‰ØÇà~ª O@%\w˜Š _ànN[ÛL¹Å9Kºò�˜ÁÙqÌÒgåV§hžÉn R!ƒy+‰ºUÊn”;¿*&å/H•rÿÏTÑû Ü>¬Ú>\ Œt¦´=.TÄ¡ ¥õûS; Zà~¦!¨à‚ÚüäPÿ·9gi˜´†C¤Ú§!ö# Bö ,™è;…X=Û»,I–2UW¦Vì9$l¨kàªÞÛ=A¨›j’•ƒ;î{–A£P79å|s*Y±÷Úø§;›Ì ”[‡MC“Û¿±hf»ª]o–ç{oY=1k³yV³ÒVÐÊÒþ5E8çVk+ÖœÆËÍ\8ðâ¼Æ0X4D)Ü!!ýö?*|f¿vè uÈ÷¡¶"øx¡‰AØ@T_²�ÒÒŽ q²ƒ6˜4)kÚ¬uÒVË7ë ît ¾'Œ­%;‹¿Ïiì¢9sÙ9¹x‘ÆÎ,ìØÚŽ-45xödŠÂÐ8?ÈǘÏdå/Y|t½ß &LILð�J`è¡& ù-G³tã/ÿÿPK! Ñ�Ÿ¶'theme/theme/_rels/themeManager.xml.rels„�M Â0„÷‚wooÓº‘&݈ЭÔ„ä5 6?$Qìí ®,.‡a¾™i»—�Éc2Þ1hª:é•qšÁm¸ìŽ@RN‰Ù;d°`‚Žo7íg‘K(M&$R(.1˜r'J“œÐŠTù€®8£�Vä"£¦AÈ»ÐH÷u} ñ›|Å$½b{Õ–Pšÿ³ý8‰g/]þQAsÙ…(¢ÆÌà#›ªLÊ[ººÄßÿÿPK-!éÞ¿ÿ[Content_Types].xmlPK-!¥Ö§çÀ6 0_rels/.relsPK-!ky–ƒŠtheme/theme/themeManager.xmlPK-!0ÝC)¨¤Ötheme/theme/theme1.xmlPK-! Ñ�Ÿ¶'² theme/theme/_rels/themeManager.xml.relsPK]­ 9N`uƒ®ÀÕçõ 0B)„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ%ÿÿÿÿÿÿÿÿ!ÿÿÿÿ4ÿÿÿÿ)ÿÿÿÿ2ÿÿÿÿ,ÿÿÿÿ*ÿÿÿÿÿÿÿÿ9N`uƒ®ÀÕçõ 0BE ÿÿ)„¾ÿÿÿÿÞHÉ[Tp(Œ)ŒGPUZ^³Ål­4¯=žBaG)L1PÏS.Yr]5amhëm"xù†Ë‹)ŒHIJKLMNOQRSTVWXY[\]ðð7'7_ðÜbð$ß…a†¥]_šzJÔ�<_uÿåT*¾bð$îÔyn}—Çséþíbžkûÿ×bð$Ÿ†ª‰€Hn½(…Qég�WÿÓæ)bð$«/ƒ‘qÖlj½)äRçÿ²¹Bbð$h¾(º ²ûÏSÁû^ÿ6k`@ñÿÿÿ€€€÷ð(ð'6ðÆð( ð ððf² ð C ð(AÁÿMyHTML1"ñ?ðððx² ð  C ð4AÁÿwrite_latency#"ñ ¿€?ð"ðð|² ð  C ð8AÁ ÿrewrite_latency#"ñ ¿€?ð#ððv² ð  C ð2AÁÿread_latency#"ñ ¿€?ð$ððz² ð  C ð6AÁÿreread_latency#"ñ ¿€?ð%ðð\B ð@ S ðD¿Ñÿ"ñ?ðððP¢ ð  ð€"ñ?ðð ðð\B ð@ S ðD¿Ñÿ"ñ?ðððP¢ ð  ð€"ñ?ðð ðð\B ðÀ S ðD¿Ñÿ"ñ?ðððP¢ ð  ð€"ñ?ðð ðð\B ð€ S ðD¿Ñÿ"ñ?ðððP¢ ð  ð€"ñ?ðð ððP¢ ð  ð€"ñ?ðð ðð\B ð@ S ðD¿Ñÿ"ñ?ðððP¢ ð  ð€"ñ?ð ð ðð\B ðÀ S ðD¿Ñÿ"ñ?ð ððP¢ ð  ð€"ñ?ð ð ðð\B ð€ S ðD¿Ñÿ"ñ?ð ððP¢ ð  ð€ "ñ?ðð ð ð\B ð @ S ðD¿Ñÿ"ñ?ðððP¢ ð!  ð€ "ñ?ðð ð ð\B ð" S ðD¿Ñÿ"ñ?ðððP¢ ð#  ð€"ñ?ð ð ðð\B ð$@ S ðD¿Ñÿ"ñ?ðððP¢ ð%  ð€ "ñ?ðð ð ð\B ð&@ S ðD¿Ñÿ"ñ?ðððP¢ ð)  ð€ "ñ?ðð ð ðP¢ ð*  ð€"ñ?ð!ð ðð\B ð+@ S ðD¿Ñÿ"ñ?ð ððP¢ ð,  ð€"ñ?ðð ðð\B ð-@ S ðD¿Ñÿ"ñ?ððð\B ð1À S ðD¿Ñÿ"ñ?ðððP¢ ð2  ð€"ñ?ðð ðð\B ð3€ S ðD¿Ñÿ"ñ?ðððP¢ ð4  ð€ "ñ?ðð ð ð\B ð5€ S ðD¿Ñÿ"ñ?ððð\B ð6€ S ðD¿Ñÿ"ñ?ðððB ðS ð¿Ëÿ ?ð>g?g@gAgBgCgDgEgLhMhNhOhPhQhRhShöj÷jøjùjújûjppppppppppp p“y•y˜yšy)„éþÿÿìÕTt!E  t½ y#¼tÑh½Tt t]!Üt( �tí¤A t U(t$™ðqt# ˆ]!ðtñ0u ˜t˜ñti˜9ht9hõ„tÔ9 tÑl%Ôt&åX9Ü t%9ð�Xt a< tÔq<t"ñLt!˜ñt6E }„t5E a„t4Y„E ìt1µ˜Ut)UA„t3=˜Ý ´t2Q´=t�ÿÿÿlY!~4-1&U^ t,U¾© &t+ù iöt*i¢½ t ¼!4 ¼!4 ¼!4 ¼!4glms~†ˆ‘“—  ( 2 Z b Å Ê è ï  < J r � ~�Z_NOST²µ¾ÄZ!a!¥!¬!Å$Ë$%#%& &/'7'‰'�'~(„(º)¿)**++Â+É+ä+é+ô,ø,k.o./ /o/t/0011?1D1¤1©1Ø1Ý1 222 2$2-2a2f23%3+393R3S3ž3®3´3Ä3]4g4w4€4†4•4›4ª45*505A5ó7õ7÷7ø7ü7ý7r8v8Û8ß8?9C9�<¢<°<´<õ<ù<?=K=·=¼=0>7>Z>a>Ä>Í>æ>í>M?U?V?^?M@R@_@c@¥@©@A AAA>ACAPAUA_AdA÷AüA^B_B'C-C1C7CJCJ®M±MzN~NU%UcVmV~V…V®VµV`ƒ`ccZfaf‰f‘f•f�fÂfÆf2~;~å‚'„*„%,û»Áv|˜ž<Bª°Ûá@FÉÏv{:>€„%$%‰'�'Æ'Ô'**ô,ù,/ /o/u/112273;3a5d5e5h5‰5Œ5�5‘5¨5®5³5Ö566¬6­6ÿ67.7/7]7a7ó7õ7r8w8Å8È8!9#9?9D9z9}9¦9¬9ò9ø9þ9:W:^:ç:ë:÷:ý:F;g;£;©;< <S<_<�<£<ñ<ô<D=K=l=�=�=±=²=È=×=>,>/>…>ˆ>ã>å>»?½?M@S@¥@©@PAUAbB…BD·DþDEEMEßFâFœG¢G÷GýGiH”HÍHýH#I)I|IˆI>JDJ KK7KCK”K—K-L5L‰L�LBMEM®M±MÍMÖM%OpOúOPWP[PqP´PQQ.QbQyQÄQ(R,RƒR†RÚRàR*ScSzSÅSÍTÑT?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿þÿÿÿÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefþÿÿÿhijklmnopqrstuvwxyz{|}~€�‚ƒ„…†þÿÿÿˆ‰Š‹Œ�Žþÿÿÿ�‘’“”•–þÿÿÿýÿÿÿýÿÿÿýÿÿÿýÿÿÿœþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRoot Entryÿÿÿÿÿÿÿÿ ÀF@r@@Ÿ,Íž€Data ÿÿÿÿÿÿÿÿÿÿÿÿÀAL1Tableÿÿÿÿg%?WordDocumentÿÿÿÿ¡~SummaryInformation(ÿÿÿÿÿÿÿÿÿÿÿÿ‡DocumentSummaryInformation8ÿÿÿÿÿÿÿÿ�CompObjÿÿÿÿÿÿÿÿÿÿÿÿrÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ ÿÿÿÿ ÀF Microsoft Word 97-2003 Document MSWordDocWord.Document.8ô9²qiozone3_508/docs/Iozone_ps.gz0000755000000000000000000100103015051766073015005 0ustar rootroot‹JN?Iozone_ps¼[ýsÓH“þÝUþ&u nqä8@vÙ881d‰I.NÂÕå… KcG‹,IÎǪì¿ý}ºçC’ã·uu$šQ«§§§?žn‰'+'ýÆždcc­Y¯=yrd¡Ü½ÀKâ4fâcœø¢!�ÿŽ#y5No1¾zõrÍ�=¢ï$ÒÍâdGœô½$˜d[k~Š ™¤A‰­µ–%ÂxßÍÀû¥ÓÂßfsC¼ÚimîlnI—xxîd’ÒèM<�ü ½‰ïvÄ*žŠüg4âŽdZ™9NeÌ2ÄI–¸AfH�_‚í^ê�œ&÷co:ý)}éŸÊ4ž&ÞGCÓŸN&að#*lÉÝ�PºÑ‹7jå37Él_Þv»ú_½¾èÄaœ(‰#7•‰Xo6›ÏÄj«¹¾¾ÖÚx&XOGn4šBî#y#Ã5wù�xLKA3¬9 ¢}9t§a–š�V¶¾E·^½/^¼ Š‹@ÞâfEW뢉?ëz‰‚_i‘“b�ìÐ(bG ƒPŠ“”÷sõ1ˆ>œ]$Iœ¼s#?Äæ¶ÖÀ»^s¼i’`ʼnë}ÅòâöZ&2ŸÄ'}š ¾:©|H/†n˜Êz­¸7 †øëü2H¾N°}±½)üÀˈƒ°“’Ú™$Q–ûÓ‰Èî'ÒI³�Óe½Éüµ ï&?Ad¡Äýk±-ÆÓÐÉó®Y²ì§Æ+±ã Êœ,¾gšz�‰ââ è�÷^Dòvâ‚+ݦZ"�Ä8¾‘YŒcë$ "`E¨ÎŒøV$Gö¶Æ©dV8„Ðò³œÌ‚éu|;‘O‚à(¢0/K­d$Õ†c˜k© ˦��&j4£m½~�;ÞD47Rß$!6Q8SªÑVÑà'½üÞ�£ðžõgVzÑâab‡Zs}XÐõ}aGY…VŠ…ãR´¸[¯YõÓÉWEÀ1«UJç.Ô«♺¨<ÍaJŽdB›ÊÍóU®„ß¹=ˆc Êæ¡‰'2¡8ÊlV -‹X"g£a%…�”™@O_™ÎuµA£ÆÒM9ä*†°^[mÐAÁMîy š†aÁ™FË ¡.Š )�°éŽ᜺7%r…ü@ 3[B?Œ£¬Ä£ÀLhw¬XÃLê5…Dĉâ,_u =lhùya‚ 2á‡óÕ­ê'�p«ÿzfxéðƒ…DÁP"tU™» 6MÇÏ‘m®^ôøúh(\ÓBDDÅðÉuà¥Bo“â:m§^+¢hÓ„ë‡å·| ”ÁÛ•×äUâkßF¹‡H”sÊÓwX„¹éfœH/tƒ1‰cweS†½8I²‹^/ÍrD‘ƒÓÓãÓñŒ¢n!a¤‰Õãn÷àÃþᇷ¢sÜëí}Ø×¤8Èñ'"ÂØõ™Úœ�ca¸¬’< ‰Kÿl¯ó~ç™fJ«´´—9©¼�¿~ÍQrª0ƒäó²ÇîÍó£”´VŸ<¹ gX ¼›zíµrûßÄñp(ru”ü†¸ºM.>=yò쵆Óôšm€ ’ )~ÌÈ«š%‘ÄdšqjÛ,ì�¦8›[À̾ª× €µEÔµ£44øn à›$±‡§0_yÀb½%·6šM…ÊZ0ãɽ5;±dlÚ�jßû>Ðìj‡|0fQËP!½‚àp˜ç7*bÜË—ÀX>b y¦¢œ†Ç\S;ÝÃ}8N°#×Îm‚’ŠfÎAäÅ>B~Ø?>ÈŽÖÍÜ ~5™H?ïg0 7ñí Â0žä…Ù,ì¢ qŠ‘E”À€´ cÆ<]„:#(f IÆ j?¸©×¼› ×Ñ‚‘¡òa�ÿÛ4@¼æè 4Û3Rè ªb' ú7á ¯† Bº6dÄ]"Xœ]©ø+Àž±4"bBÏXâ׽ȢÜ7Ýl/£GØ�d²ö õ“Øj6‰@i*`Ì#‚TŠ!ì+¦ªç¹ oÄT¤žîÈ ¢æ°ùr P{ò#ñ4#ƒÄ‰ŽÝì¹ð®c`mq<É‚qð·DF¦; »‡ ¨²6_� ‡3P5ŸèË §6‚´Pís1v¿"âL!ÑìÙ=� féš°§öM[ö` (3×�Á™ÿÖÖê©ô§žz:šŽÈØ#�tªô"…¯«Q-Ó&Ét›-ß%ê 8Õd-Ô‰-ç,Ë´qŠS�¬=àqŠ‚'JÛ:Å·fF\ôtHË’)4Sr< )U£¹ÑÍØ @½»�H›;½]ò$K:ã)"¬-qXVp_r ¸Þı7!ÀîO¦WoÜ4ðlŒòŠ3AˆçŽÊ¤]Éø w~>§‘ï„~þ\] "‡ï†˜¼…âp†TÍsAÃt‘ŽÓQÀhoÿøj|w{Q~'-†Cñ”L õîéPýÜ!Û(ÛUCÜM$%ãÀ Fó¡ˆéX˜àÒ9“wÙ!(œ·”¯ùê< ”®À­Hgy[«“–ßfyw¶‹’úNµò•Ù®Im¥\&~› Ø]­ _ò2^¹¢&žf¼2ËÏÞ{JHe¶[RÀœÌÈM\Sé „V,$–²kmh`Ô_ˆ3„+q?Áû8°éqÁþò•ü©Ð*‘w”Ì@Æ0¯�¦Ót÷/acBAbÈ¿ˆ~™ ĹøB61õÜT´Ö·_AfgÕ"“)tÄCûPØ›)/±˜&¢ˆ¦“\£ê}”Τ­è †­–Àò.°�3€h±;`W̃�ö@8iäNr»”ºEs ‰�žI¨)ª†ÔGš?~§^ ìóØ€Ïý‚¥¢ŸÛß�_&�âèo™ÄW|&Ú\ª€oóx†‰fD˜™‰&9þú,o¬c»|”†ÅâÊ( Ë̱ôâ¸"Š8ÿ½¹ù‡wå3ª’ö3µóðo.TŽŽxØÁšA2É7E£%~¿Š_ûbx‡ŠƒF=QyJè‡ð?Q"©×Ò¤qøùå'”45Îû§¦Ë¹³/‡‡Ã+Nbüƒ\ !ÏÜ 6Y½Ö[º1гa¾@ÈE»Ê³TÂ2q¨Ûf˜ˆLœïws ¯P\¥•áÞiå^¢1î ¦ ÖV"åE/Ðp¸Ülr3½¡~"ÀǹëÏ RLœë!°œv¹’ÏmQÒåÒã š-9ŒªÎ@$:à¨1‡×nÒçvSJ}|õ¬³ÕÊ�·21çSpˆÖÖ¶àæ õþ1Úb™Û§HõX‰ÒéA©à õ©dr=ì}íîÓ �º`E…›i±o™-ÕkŸE›w%¿ÁbÚΟëkÀi’X:NxÇØ¹Ù´Ó°>A ʱ±'±g/m n릿ä5hCjëjkFÈ깊•Ëù'”ê@½ÃzMíñÇåð˜ÉÙêê¨e‘fB]a/³PhxE¯‹RHဆ0Àñña†KÒÅŠÙ.ê¶Æ:üLQÁV§#²MþY B;v5P½ùíðõÅëö ¹K’²È%¸“x<ã…�]6'›W £0¸aÞå73j \/õ⧈Y�Þ|a¿ÓÉž£*¤·d€¾ž{Óѳ§oß0ŒãéS oK¯sCcy¥^9pPduâ°O£G‰è ÌÛ;U�ê$ïð ¹SdDIþã�qõUü(Q“Š3Æüƒ‚1Y}åÙßwÞÊì�3T¡d�F;×z¶^¾­ûY�­2‹ðW§DÀÉ="®ôfOé¦Ì—À©¯*Í65^*Dšûâ,ǶBm”pÕ28ªòŠà…5ûÓAšÙ4“�Ó}ÜÖoV.ј-}r–¯.�ÿÏg€q‘ë­Bõѹ»»t%Xî?þp|Ûœ²>V~¿Tñ}T >OƒÐ÷ŸÚ{‹gkí¢à€ŠÁ,;ôË/¾ÚöÅâ7âOñ*�Æ.‚Uÿ*UùÎùŸ1Úâ” à�¸±ž6A¡‚º~�´Í�‚h·PP€¤7K𖆥K‚1Wü7pm�¬W�” <ä!„/•‚Ù÷£=,PV.¡¬ÅÓ|p.�Pu•O�ÌùõÒâí¼²HûǦI.ý@”GŽZ,zÒ …ƒE*(>VÅY²�ÅxSY„ƒgõ¨ám뜓N^&u(‘FØüÙyÞO®É`ÒÖy Á³›×k_L®~ÛêtþLÞÅ)œRq† …Ö9Ò!�·f»çû†…â^p|iËš%Ĥô%2Y|™,ön!O‰%ËUTºgMÜët»½ì®µ�Xô 6É8gö�Ò>•h6Ý›z-P¸qÆ(A?¾M¯X¬§Ëê¼3Þá°w©?Ï`<é;ãnOØj:è¹™º¿ÖZ„{aÈTî¥V;!Bv¶§]Fbß—`À`Qîõúº9›R‡¤ïCò\_›B È¡›o³¬B§¢ÄdΆf!è¡ã³Ãý÷§ä†%«rWiÆ9€ì<ËŠ\)±uö>ô ÓãÐçŠ:nh;)´—qåÇ UmÏóv!�JŒ‹�yU•rœøN;¡ —ßf»ùUy_pz-¬…ü•[NIÙ-¬¡!¿wúFñœõW„Ü×`ü*’.UŒF½€|ÛÂQ(›#¶Lü+*Ky'*V²Ê!ÇKÚH[t÷/Ì;µ_c\ Ð|½F�opêÄ72évNÝh¤Vl± ¥r`ØCÙTòs˼‡QS_RzÔÐRÃW™CyéÑY¾#ŽnE£WùªF0>í©"´^;òÄ{êâ8wç'¦÷t_\N?š«»~q¿¸Líý´ž€ÕቹæA¿ïÔoè<§Ý Ä£¹þYþ�˜Ì5Û¹^I?r+¡!ÝJíC§ØØ¯â”ý¸Çw÷˜Ònìªö­GRª¡‘§Îoº™‰Hvœ£îIž?-¬ò�§•^|±DÉ>߯�)W(þ$ȼë½Èïºã ¼gÙ1ËN&U·‰×Ã3‚å‰~vò 8™9F(sUab�&8·ò®¨ÇÝ~n ¡^û¡%Œ»›­ý’¡£”­,§íWuƒPM­Ròj²uòr 4L^Š=#µgv5ì`!ÑB´ƒ§ð‘ƒb}ýPÑ4Pâæë[Z�s V¯•ev¬R©uÖí¹´ô�žê~V"=‡‹ÖÖ&lÄv4ê²·•«–ƒ¨ÏéÂÕ!6\Š-F³Ø¨ÓÝ—“ •8Aº3$•àWÔÐZ¦Yn&ð¢Å»N‹Õòmúô"¤8mÕ`)hC „¢‚m2Ù"QK�ª¡Z¼½Qæ� Éű%²A­øbŠƒšA¯¢]ÔÔª\Þ(‘>x.ÊÏàåtJý“ñ”˜ápXÍtçf3 Û²(´^=e]°¼GíKûѸˆvu|Ö½º@LçpoÂîJ±‡gSä˜øÜæ}n+bêÎQpÞÒAúUÓÄ¡Ss¡"‘éàÿ|‡|g,ßIhj­”�¥7ï I䇬ÏÇܯCt]J:ܬ³!]—³!⯨MAJ£°Ž;¡OE¸–åע˕¢­4S¯�Y£@\îî>çl`ðyI`«@îß ôõZ9—ÔfDΫj[ØÌC%VÝàÚQKåøUsœÂ¹‡üzmù×Cô™ ‘ñg1ô‰o?*}£¾ZøèÕÅ»%_»0#zÍÄËê¯]ΪŸº”œX ëµËïH8ùI©«Pú2çŸË¨Œ R¾ïwÆé»�?¡I‡Içï:�wÿ¿å%DÑ=È·¹“I8g›^ .F4`nl— ‘¶- yàóŒØæ—Š´ò&ˆ@VÅ�*OGjvè<§ïû6ÞQ¡ýÐZ)T+²IA<³ÄliYñe¦ gÇ)°Ix©^û… â.…Ú€Y.,d¡¸�L÷H<Þ<’ßu:çQðm*Õ˜º:æ�ßãÙË»Ð&w(4÷ÕòB©‘›æúxÇÛ à3ƒÝRϺ­#ÉX.2ÿöx¥Là…z¬Z¿õíÿhùó+3b¾iÊ*õÝÀB)`|j$£iô�_˜ÚVÏØ„JuZi¿Ä›j‰Jfó2U%Ð+ã¤wIÿGÿ‡-BmÔ¼º ÂÑ4mýÁƇ„Æ ö´QÄz=÷ÓØž:ÜGg­ï6hº1“ž·'-n�´J�‘zMO›÷¹�—“›|+·eƒjmq’ÇÆš à\oUG[0ØÇîò_BPÚæOÔ»ù&–ýÚà—¡—MØûúQ‘á«ÀÄk¤Û䊭¿%ÊÎ@o´ÈUÙÅs¡ûf…-,”bzÑBë*™&W_¯®Š8X�ÛtüJ¾ü†ªê}¥wä“›Ú÷p´ìhÊɔآ­|�f~‚�}H=²«Å²î¯L¡Ô8\/uym¥¡@v³è4>ÒbdYÊÛÅôØ\ãpv‡²:Ëõ‡V+¿ñ•ÿÿOšoÒKñ�— 粬ýD·ÍæÁÈ^Ú"÷åÆEù“�ª‹�ÓŸë˜R¦¯¾Þ¾NŒ^4þ,ûÎõ'Ô[Àæ]ç½FÎêV)™^,©L=PT•úàßì}y·²èÿóûñÚ�fñô¾'ÄkB a„$cÏØ˜�YŽ_ÎgU%©TR÷x!9÷Ýó÷ž˜iu·Z*•Jµ×¿Î�hýê"B£€ 5Ô$ۙѺ34²�Á'Ôú¢ªqù[ß«o¹/ÜU½`Üï£.:,¹DkM&óÌϘkޤFG³Ð«S�^$JMg¸ês©V‚ ¨Dõ*Àhxz'reÅ飃à.ΫðNçB®:Ð-:ü}_Òë/×�ð|4‰)-= ü@Î_ýë5R0é·£TbÞS¬|Ñò‚–KlîX¡ë¹¿,£ï7D߆²ŽŽ—ß\6,³Î‹ñ,©/¸ö5€%|¥ø“׊=û º;iBég4¾äè)"~W¡SÓ�Òœ=§ áU÷�û×è ÛŠ@av˜2õF]ûH„‚&ðôöÞõ½†_­—ðü /èÖ@Ð —Z@¼÷:ðN÷à+ü×¾§Ã¨Ü‘;Òï÷¯“ib#“olH× (ÿýPCr*�ßó�¬ÌRZvÐûJý¶ .N�þžÖ9~ûý�ãY“fÎQ¾ „;?b«ÂÉ¿˜á¦°: ÀÞætÒ«½ ånü/ý 9i”-V±#ÿjÐêyôíÇg ¶�7=uå²_h¦1tE¢§0 >ž:ÊbmÕ&züÃÉò=/t×¼íóÖÈn™‰¯µçÞü´-.æL^´„îvP\Õ×$¬ŠÅd±§þ¦gµOh[D�=YqtÏþ÷k[xˆ@nÿW«[ÎËÿ×ê`zvŽ…Q›®ÆåÙ¹T.† d§è\|½¦9Èþ:1»ñ¯»�Lj�CûòÌÕ¾<[ª~yVS¿<;Eÿò¬¦qžÖSFG 3ç@LcÇž/¨Î2OdÈúÇÔpÑ,/ðp5ß- ›ˆQécήR‹«ûÈ$7‚Z>ò‘J¦Íñ Ëz¦ÙæIdd.úçN0ÛìbLîíûÁãà ¸U _Ó•lz Ðí@G‰–g•’ùGv¸áu¸Qï›6 Ã÷Ðaª;Lù�ìð¹×áóz‡ØôG=¾åª÷Ùå¶×åv½KlÚ&òòF;ðk㎉m—Z–ž§Ó?ýNÿ¬wz©E�b§ÇçéôØïôØvz©å4?¾0ò¡wþ7Ýþý7Àø0>îüÑën=¹oÜ‚à'Æ�œØüËeCíÕ“û:Ζ–Ÿãp6ÜöÓq-bî›í{ßj›­jA§Hhû±3Â="‡¹Xû_tÿÎïm}EV]`5ắ ¾hã}ÔÃüYÇýu‚áÝö‹ÇóÞ$(¼E® ÝöÏÔ¤ntÛ››ã¯PE¦èæë.œ.à×”‚‡?„<ÆÉïðáÞ«Ÿ€š)dì–2}!ÙÛýŽ=áMû]ÞÿöíxÚÿ(Xgpr„?áyh}Ö›Îû@úNþ€ªiw»ß9™:9èÂ/Õ¸iö{ܺ5Ïfª»Àv€�ª;ÔA Ÿ¿ßùðB‚€~_jÎOèú¯j àQ�'º“HÁ}ý† �*ƒ›F÷ Â7ƒïi£âHÔËh|Cg6õÙÛðjxêËmªù.¼z©eý5}\ýF¿Žû�ï”�…f¶÷᩵·èrÝu¿ætˆŸ°l¾RÛÒ/Êçñ£·õWƒ�6²ãGÈw먔öñÃé¡¶HÐ?ý-ж'4Ûzÿbwñ~¼Ôòw‘ÞËô úäÍv¬ÝÖðݧ�’g´Î-<�ÿ|ô xüøH�D“ÝÛ1ÜŽ¬VN6ü@$†»¤p?e\wïep/SÃcœwžl>× ¸o(O{r0�E;!È•Ê}ÍЗ‡OŽzÛ ÍP{ ßׄȬ¯”Xò“ÜùÒŒò6ì’C•¦äg~|ÛëÍ|˜�æ™&QïÔkˆ�ú!ÔѿKÿ¿MÔpÐ\‡¢ÁÁÞÁIû`çá.†\‘Ù…fíºùäá_'È™™(AÜ£q|âSfÔK2u7äÎ%KÒ…ó¦ §ºÔ‚sl--Õk”[o œÞ¿4Q¿�ÐOýÔ34"¼0?aÊ7Ë“Ãè�£ÉfGRçéZLúø{ó1ío` Üoêƒišƒ»�¯~AVû¿sB˺Ú�ãŒÃ N9#}>ã_ßâ/è�O:Ýèœrô´yÄgddQ´”øIžµ½r ®ªpXuñº{Ê�ˆ.ЀœØ;£žºP©ŒVŒ§ pøÜk×Ö±“+`Ì”<ßwe7»~7ʱBžæb 2'4�K-=—Ý`øAœóýaç°7ìÌÞfÖLûw�¬#D&DÛÍUÍή=["Síöh1éŒÌpÃí*$-!7<Ò.ÿ5„ùÚÇrˆs g¾;W@ °ÔWêY”zn>ÆØcÇìAïè@j¼w¼ åX¢‘PØïɇ6¡‹�}§OhO�9»Catò½� Ã)©Íæ�?êƒUOÍ%Ìîîñ÷–·IÌ6ºÔ’°|mv�j4;Hw‰¯Ä6Œî"Iue:Ô]q�ôl“5nõþ|öcoŠŽEãÚy`£qJä}»‡Ñ$¯Ô‹ôßëî_'ö1R¿Q$£yï7¼¦_½û×Ý6þ1ѹ^ˆ¿àÔRÃݦ¬k r½ù–Ú\´�®â®“»HàËŽ‹1—Z gpSþFˆã ��ðÙ¸bps[Hä8MäX‚ξ{�~ v8P’=^j= ¼€êÎúï«¿8ÍâOó®‚.ĺ0-£0°‹Àü®J*rá“n»¿'ϸþ{rÔí©†*•þžÑßÉxЙöçǪi8Ï��CºkW¼Ø›ìc‡]BŠ&TÏÀeÁ4.‹IÔ™í÷û˜Ííä•>Çi„¦+LeÚ=ê}0Ñ·û|hc¸ç‡×˜cãäЩƒz‚‹ÎôøŒ®ØÁº¡ÞjýÄvD¢—öÆã­{÷ÊLí4„"¬AûÑbôiÚU3e°�»C’}y¯üÖ›Iï�?�éIÎÀú:°ƒÎ‡ úê«ööÖ“¦þìÜÏzwxl×9žý/\dÂQ•­ñD^R2b¥&�­È¹Tôþb0ïO=K™(�Ì&!”õ&²œð꣆Àsö²R¾í*±ËéÓ7� ô£YyÞ§ÎZLp4A‰S÷ÐÔ„Ÿ˜ÃcGQBçss�uÇûƒÅœšNÚÓÃ=¼bløZ1Y+Z•¡×Zªbo#¸ ·¸øq•&©}ÔGLxó|»ÛûÐëX =¢�úÎëS±ÉÜ¢TŠô)^?`ðëTk§B@Kß~}*l‘›<º–î™Ð%íEw¼uÿçïxÍe ¾�—€‹ M<€ÒrHõfÄŽÔ|Óç¹`élÐ%Ð<êZ`ž±A/ ÌK­fh,( Z¢Qî¿ôÑŒ¦²³¬Nøx:&�ÛücÀ¤>Pþ…0¤ñL$Ô(¨ÑOàŽ d>uè™u�Å“Ä.€2K„Åsí¿‹™AÓøÛ®­� N“÷1œð¹¨[pã~×çdŽ�áN¨[·ï›æžl&oD¼×¾7‹Ã(»{âe\Í‚Ãçã Æû”hã1œE¸h楕¿NNtp­ÉÑŽ>R:³,Q£ˆªR~Uœ¤íÆ'§JêºÔ2±î àÓ¤Çrµ¬h"ÓÓ¤½€m &\«ÜžŒæ³ú 0iÈUåáxJ.§;y´ýøÄÈ1BÎùW L†Ö¯Å¼§”¡í§½ÉîxŠ e«'Ûý)ù`ÛÜ&�TŸñ_#sw©uýppüaUF@óuX<·qÅ&3²WÕHæÃÂoÙ‚΂ࢎø15 ¼›j÷/í æPˆxõñ{Û°2 %«Ø‰XGK³¤©  òE�TÜrÈ�Ñÿ²y樣N¡»q;Ñé1¾Ö7ÿ¥mÿ*F›¢æ'tš  Ýw—~,¦àÑú÷p€ÍDgk®lÛçü.:Œˆ�oÝÛ†õò·•“ò¹ß™˜Ÿ[˜SóÕpù˜ÇS†Äf5ñ‡XÄÈz:ëVª‹d¶©jƒ¾Á`Ê$tÐþ‘Yõ–íî`Éæö÷©ÕÜË}ºCñÍãy�1_tÒ$hš€º�:Áh"6Ç�M-$I�À �œ£ðVnÈL¥Él-X‚“øûëÚÜìUMßVî€äLMá帶\íòª¡ñÛ™˜ÐÞà‚ãE71=âGgåk<×pa‚«;U¤ú+ÛpKg/s*Ú Þ½MÞ€&xž¯¬Y‚Š« kÿêü«ÃsPo¤¢~õÿS 3 vP÷ÿ†gl+⸎è¶PÒæ\R§ÒÒZGHJeŸ§“.0 ANvÔ_×ø£¨´6‰sÒ6:Ðßá ’Ó ËF®ý*}‹%ãGÛ½› �hBRWؼv¢"¡W›!Í€Y8R´üu¢µÁ(Z×_™ûŸº«ÁS#æåô=¹èåôìZȤ£½1H9ê팿³/(œMnŒ y_œk/\ŒÍM—ës¢”ù!‰-]÷B÷Máʈ~BÙÔM! dbä5BM1¼ygÔ}’Äwm¥6¸‚~¼‰¹j±óµV)ý�.U]ÑßýagÒ|¾ŠŠ%|h^§*Š«øusº^¿×…s·??ލYÅ!W%Â[&KG¨ ¡©8‚PW�Sc�¤l ÅÁƸ7øñ~W‡˜GCüši¦ß8»íé H² �ÇG*ûc Öpyü'êéex4›î+ÖÆ}VI]0Ä'³A}qdE Ó'ÝN�˜ö|ÔuE²›(ú�i/©ƒb± sið- 6eMû ~Í?"µ÷z§Î9Jñ"Ã8BìI—ŽáàJ_Ž;×T !lMueUç:ëÍVñIŒÎì¸ÕÑyS¤± ľá‰ßB(Îø$�5v܌̼u©•êñ UÕQ­oÚ¬AmM-Èÿ:±2CåÂßL{zï‰$ñI&·žª¤(É;—óÖÇtš�²T™ª²t¸4^•�et�JP³[¯š’“pA wè93 _áðœ¤ZÍ!:eð3öœ±@ÑÈÈÓ®Õ ²Òëù·–ÅðWQj"¥�‡^ÿ*DÄ0€0ØÈÝï¬â‰É©Œ«ÀK�èÊ€ kZ_N‹¦Übñ:Î .óy©ÅíF¤PIï ˇÝȇ]d ºñSš¢Aþ²ÓVKpã{å�0lÇV¥…Ä&ŠM¢tv =­‹Ûгrïñ{&�g„Ò¾<„oe3!÷–)sÖ›ïwö�L¶h}fñ0xÂôz*ïK\ŠNä멎Y+�ÐmQíGàN�Œ;Äá/çÒ/J…ýïdñ�]—¢¿ÚÓMìß´‡¥i(žÕÈx~e'[€( Éæ9¨­Ý]›E,|¼Ø“e ©)àÆ€@¬–(ŠÊ$�²2¯‚eRRb™vƒJv)“,éiCçºvƒ¼¡ê~Ê Ë}ÅYì�@øèw;û@&g2«�aƒEYUä‚u¡Õ ö$fNFŽð¯‹wt÷/è'Õù ŒÆÔÛsÕz:‚N|õi ÌÁ©PÆLTw_�ºœñH—ÎkÿN2Àpnü/Û]}ø_j‰^¼:ÊºÖ£ÛøÄ­û'pÊÙE°J9ýݾ3VÎMv_[)ê_0üú7­ÔSñNüA~„9£TûÝŠ§©ˆÈ˜�Ö}>8íñ»ÊÐÂí*Ë5,ç �áé�rd·ÝöGÚ�;†ÚöÉ‹€�_?ë_ûéqŒÈ¡~ˆmsÄ??ØŸÇ¡måŸÉ1¿–|°½%¶‹Äv‘Ø.ÛEd»ˆì bì�FÕ… xG‹>Ùd —èãè6Š¥wq ÜrˆJ³ûûo·Æ°{f˜ ñ]üÂ_‘~‘ú‹ñnŒwc¼ãÝïÂ÷ÿ:¡1ÓpN08œ$}‘BP!(ÔŠ4~ø_wÛÇ™žÚóã85-©ÜqbšÌƒ†AË€e° þ›qÉõs^ °M‰ µþ/ sjOÚ±LìÁ ?yñ3e²BMƹÿæâS{è}s�r"Ùo{Ó1I×sþG„¿ïÅv6=ëjæ�>ÌoÖÁ"ÄB ]ÓCè…Å5 <5»�Å'˜Ëìdä·ÎS'@¾2ÑæB\´·ñꈬ�Çêõ¾¥»CÅ<µaÂÉn[¡+ Ý¥–~# FÄ=ø#Ús�6�Šò]Âãäj§öîQ|˜0øC¨~G ‘�œ 4Ô,"=TU¹IÖxâEüKåöBL€‡~ˆ2Xà²3|.\C„Añ2¢��÷¬_¤ßy{_Yßö•w ðÂã¡©'1ÐÕX]MQG�æXá ½7ì=ÌÃÔíÒ‹t¬¤Æ*¬”uHÕ-¬Ù OžàHáxÇGá5uÖy ñ›z䌊?©èè1L@¦’›˜ÞÔ£Ø5S xõCÃàö«ORl˜•àCm» b˜íbv.<…¨,· œßš¶Ë]|òå=Ã]f AËqv©uï¯ÀFÀ§´)?à> nïcW°ù>¤° ô(4BWÄÊM^üå‡�|ô¿\Æ™ YíöŒ–B¿°rEãhw¿Ó¥7Åöž)QPnd#UPª(.Ä£3/Žlµ`Æw/ÖÏ¿jà ¡æ¯»ÿˆ”(kƒÅ´sÀ¨þ2'5׌݈dê;n>Ã{×ìÆô€sû‹à‡¾Õ^øöñÙRº.`’ )¿˜h5›w¦óÁxÿ­áÆl‹õ˜c6‡Vù”º´į낓cÙy€êm¥—x òÖ´×pýp¤âW†6 ùèÃo#*k?�ù'>úÞ¹:Â+ô°ÀËIo*ïÂå‘íe1ч¶ëÉ!÷�iWð�agzHm‘þ‚m ú¥Óΰ‡WOTŸW@ø0>8˜‘“-övl¯Ú{c4éØÂÂz@*úŒüt,,wŠ5„q´4XY—¾¤=%VĨELCûwÕSoææ¿�r€_×-�ê\…øhë{fÌ%ƒ\vÇ‹bžò§k>ôµ�´iz`u@¬ Ms¾ÔŸ{{ã&ü�wa°E�òYà¬�zÖŒ_�xI/Nëå½¾iR5ÍéˆBçæQºùXbž}Ñ铞}¦ÓË*@ìÄ)›!ŸúNÀ ��b"2ÞÀt•%úHél�Ø n䜄œ ¹*! *|!–/¼WƒÓ0òß((O$º{·SJˆ¹lJø÷ žã¥ÊÊO“ݪúë#Z 5SNO©]ߙԹü|¦žrÃ.Rü´Z³¿Ðȯ@j¶ŸA­›Æ¦í®�ûS�åÊë¤8¡`’~˜‘ñ³û iÁOëÎÛ9¶7\O«€ +ã7;L¯�Z<³Cu£êÁT­ ê” ‰å›ÐÉbÙöüá=ª �ÛE¯�ŽR7TC@�°WÓ/•¸Á’óþ3Y8É,áô#5!OXSá›0îÄÐ.¦cøÐÉ2-A§®Í°—lôtƒ”ºÎYôk‘ {ò…˜§À‰³µçíö‚§½õ¥€í‰_͈6�!¨A‰°û Ï•O¯©REó®çŽ"^tØd¦íú_L´¢;:^ÒÑ‘éèXvô׉ÿ=8©� ÄPæ3VÖY×L¥`L®Ur\`€uå/jé¸ß™ü&¬[÷7~¼m‹SíÂÿÝþ¶^üÀËÅ™rEÖoãÏȚdžõ×p¿ w¬Ë±(Ê)ÆŒ.?mœúÞ3íñékvWd·ÌØÞìÕ�ÎØY“gGº¾úñ0„ÇCtôˆè2‚Ë8Ëר.c¸Ì¢x=Lè2�Ë"/×Ô.S¸ŒÂ8]3ºÎð:.©»œZrlÉ诠믋 :,éºÄÏ…)ôXÑu…×I=nÐõ\“Gn¸nRË&>QFÐã]oÁuÐã6]oãuC�;t½ƒ×Y =îÂ5Ž ””i¸"„@VùzD ˆi’ÅëÁ B¤yX®G„��–y }E‡(UP‚ Â!K è‘ !²<� B!+Kè‘ •4˸§ÝÁl‡`V"³C0Û!˜•ȾìÌvf%²/;„I;�‡Y… ÌÁl‡`V!³C0Û!˜UÀÀ¬ïÌvf²/;³’;Cd_vôÛÙ¢&d`vf;ÛÔ€ ÌÁlg‡�}Ù!˜í Ì€ƒÝU:‹�R"œ»³Ýˆš��Ù%˜íÆÔ Ìú.Ála–ÇȾìTvSj@öeWï°ÝŒš��Ù%¸ìæÔ€ Ì.Áeá+ ºKPÙ-©Ù—]‚Ê.ÉâIA„s—à²Kâ8ŠDë»—]‚KŠŠ“]¤]‚JŠª“]‚Ê.A%EeWï°]‚K† Ê.Á…T79 ~c´M`4G&V±AÃÄN°óW·Y Ÿ46ŸY¨¤A9V×\-f½z´Ó«D×þh¥™ñýZEí/Ó›ÅPœ™2)—ZuFRð�¡ä*qQO‰K*øIXPä»,?Iú0ÁNFÄoZn’´aÄL*V’´a‚“¼Ô"}˜`%I&8IÒ† F’´a’‹$FSoOÅF¢>Lr‘Äf &’¸Lš¹«Y#É@"ë�ü–å I&È”8LË?’6L0�¤ ¼#P"Ô‡ æ‘ôa‚w$m±ŽŠq$m˜àIVi‰GÒ‡ ¾‘ôa‚m$m˜àI&XÆBs•–g$}˜`Q¦8FÅ/’6L°‹¤ Üâ¥éûHú0Á-’6L°Š¤ œ¢Ò†mhzC)Ȉ›´¼¢Ò‡¯¨8E¥ œ¢Ò† N‘´aØ¡å•>LðФ“œ¢Ò† NQiÃ65½í}˜à•>ŒxEÅ)*m˜à•6LpФ Ã-¯¨ôa‚W$}˜ä•6LpŠJ¶©„xE¥¼¢Ò‡¯¨8E¥ œ¢Ò† N‘´aØ¡å•>LðФ“œ¢Ò† NQiö4½¥dÄMZ^QéÈWTœ¢Ò† NQiçHÚ0ìÐòŠJ&xEÒ‡INQi稴a[š€l)q“–WTú0⧨´a‚STÚ0Á)’6 Y-Ë+*}˜àI&9E¥ œ¢Ò†mëó�xE¥¼¢Ò‡¯¨8E¥ œ¢Ò† N‘´aØ¡å•>LðФ“œ¢Ò† NQiöõù¾­dÄMZ^QéÈWTœ¢Ò† NQiçHÚ0 �µœaå�^‚�TÊ0Á)*e˜àI†¼›å•:LðŠJ&8E¥ œ¢R†íè¶£ôcÄMZ^‘ÔaŠWTœ¢R† NQ)çHÊ0ìÐòŠJ&xE¥ œ¢R† NQ)ÃvõÛUú1â&-¯Hê0Å+*NQ)稔a‚S$evhyE¥¼¢R† NQ)稔a»z‡¯¨Ôa‚W$u˜â§HÊ0É)’ºKrŠ EÎfƒÓ8E¬Rz.Vñ|fÔóòŠç°¯^j��Y\Ê*>s9EU—„YňYE ‡¸$—ØžŸ-áºã3` #;ÛŸ–º�c¼–õ¥|v*ã}45G¿žò0©!{lû’b3 õEzŒ~M1…öź¥ÞñÁìgGíÞ�þQŸO;]ô¬yÛžyQ/�{fªû?Ûµ8¹÷øá€]d ú×l>žLzÝ“*7Ãýë«LVy”ÿº‹Ò¤D¬…X H÷TÞ\a ¥5��?tçu²ZˆÒ�îm|üëWÀÒÀlÂiåU1ü¿‹þƒ{´•ü—ÁÀ_—DUÀyÄqÿÅpð_Mà¿ôõ‰•*"¬kèÂ'òö^gªêX¹FaÇH^#T 'tçáÝõ&á gE�ïµM�‡¶E:¦½ÞÛÿ´�ªCÙÕV5s¯šnäF5mîNխЛ¹¿ìß3·-ôÑ´q½mkº³·6°©JªyæˆÈ#‰Wl>�gí�Á䨣~Â†Ž‰‡J±Ü>îá’�ßöF€Òm8ñæ}\BÝE÷œ¦ÓîAoØÁyBƒ³ ×™f9bM%Eûèxr]Néh„NºíÎA¿"ë×îöÛ“Áb6Äú»íùûñlKÒǾíùÜ5×m5äá¢=éL;‡X¨Mwºˆ•Ôñ,õ`é,̸Ú?õÛ[ðß�³¾žž!/‘~�¯;vÁ{rn=•þØÂjᾬ Ú{8‡Cšf—¦©{kÿ‰7ð¿9M»k¿ÕÓ¨i²�íýöXOsÒoOaš3œ^¤þiÏa–úûí ÌpþƒKxGÍRÂߨéX x!ç9æ54PÅ3É¡„gJ’V#Au^§,›M�my‰'‹éÛþìè}þ^êˆ8Ÿ—§jóUš,÷>ìÃîèŽß�Ú´p†;´¹Ä¿E�-†¾êÔXcÑi¤Ø#Ä ‡ FYBŠ Ò–ñ{0Äag¶¿8c4G<ùnÑ™báC‰é³º™âÞ gOÛP;cC�eC`Ë­%·2PÚ }°±ÓÞ2ÃÚQ¯ï¨×wÄë;üÖ=õÌ=zi¬xê?õ�Ú~^o<ÔˆÝ9T…>ŽÛgD­§êå§êå§âå§vPvŸ?Þ)VÐÛ!FÛŒy�\k²¡:ꈎ:j–Šv4 .4=z÷¦z½'^ïñ{}õ‰¾z¦/žéó3‡ 4#³ cõÎX½3ïŒÕ°Æüj·ÿG`êÅ…Y‰…xuaßÑT ¶¤LûØÜÝ <òJDßìús‘ý¸ÖÅß û ‹ºÿm@õþÙ_Jöÿ—pæ>ñÿ›|¹¹r©?²ÇY‘'ùEÈ¿Iéׄ‘ãßMúÍP$é¯ OZLóÕÐ@õÍ› *EUé_eñ¯�Ř©_?™ð¯”eü«ä_¿�×¾–seÈÏ%f yjú+SMó)ÿJ¸Ÿ<ã/G9ÿ*øWyÜYäyÊ¿2þeg–çÿ*ùϱùWÄ¿bþ%fVðw þN‘ó/þJÁ_)ø+ehû)ù;%§Lø¥ä¯”ü•²ýðwJþN6B)Öx•„|e—._PHúî¾ÿ·¤„¢´ÊÖig¯¿ÿ}Z¨ÕÈ`Ç5ž‚SëÇžÈy’ºà_¥·a²°j<0Ĩ–ê`ϫʑ#c5,~>�Ì~M€Â¹ç…^x휥½i<0ÎÒÜ\øÀÀͨ�Œ‹É jªi˜|„ `Þ-¼uMCCÒÈ’›4ŠøWÌ¿þ•ò¯Œåü«ý”ü‹¿‡ü‹¿óWbþ :`ðoþNÌ߉ þÅ_‰ù+Ihe ÓÙþ`ÂLxZ)‘ϰ”ϰ4M´4a»KSW¤Ð­<ê”G]خˋ æEžd6‹v`�?ãñg<ã,uDÓÊÃÎr-uˆ #z˜†r‰ìqÊâR닞!eà¾ÿ·Î�2ç3d³øòŸ}†,‘8œæO–÷QË ²®n²ó;×òHÊÙÒ9mì(Œ±'ˆF“fiÃ(wœ}xLvn‘£ÓkoèñÜÓÿnè-°¥õM®j zÚÑµ‚é¥Ö3Ù½ó�â÷®&çžîãùŒV|>P==�·Œ¶I¿öÐè[X×dO‡§z˜?(ÅÊc­jÒoZ5ÓK;ReœöLº›¾þ·£;Ø×'O½ÔÓ�õÔcȯ¨ÙèàO}Ø�Êù½•}ý©� 3­†©žFò £oÒ/.Ó5-Ô ‘RÀ™©÷ú=Kìÿ´ãü“éšjxÝ \ÊŠ@.Bð�D{|<½�Ôéý£�ÝÎè?•àã¹…¡>áñWìÓ}un�_x cD’}ÓyYÌ�ÊüÊy(yh¾­y h«„aÆsN/޳ŽÍžàTs_†07 þUñ¯Òüª’¶.òÈ3ˆÍ½(ä™ö\0Maù ïŨ°Gƒy#9K!åÛ…ñ%TMÔD s3ã % ìò4ñÂNSë/ò(Éx cy„¹Ák™¥Ü à›Ö0*øWÉ¿Ob†hÌÛ~˜û‰ù‹šïÇ_ÜwÌ}ÇÜwÚ~î=‰ùƒ(á¯$ü•„¿’¢þNÂßIy)%寤ü•4µýؽ�òwRžMÊ_IíŽâ7X9…¿ù�œßÉù�‚GVðx O!ÆSpï�§à¾ î»à¾Kl?%§äï” Ý’¿RòWJþ zñoþNÅß©º¥²hÎ_©2ÛOÅß© 8}<:¶¸¡ëK¨ãO ¿‡¿qþ$VgµÓÁM>BŠ;éýÍsɃ9‹?þºÔj8ˆ‚�<~Îã§IðxÌÜ–sühF퉚ÍKý�jj÷ÛoÚ@åÛÃ6ìØö¤ý® gMöYû�öûö‡öqûOê¿§¿9UW楯)Žä#}˜ Àµý{®nç@¸ÿéð�úV°®næÞ¹œÝ꬀äõ.æìÆ_¶¬ííòpQ%ä)ÞnçQB^ÈÛÍaþ�Þn;ó£ÿ1W·Ÿ5Ï{4žŽ;€ûñïû·iNqþ£ýÛz˜E[k åù›ÎmÒ¼„Žn5>€€!|ÚzÎ9ný ý['xQ?Á‹ú nøT½½ gÏLªæ/› j_y͸ڃßèÐ «],•¹ðƒ¼ÇZe£­—útÃ/+^ÜÕ©»œîW£ìp¹¬\׬ºæo ˆ–ÑDóü3µìæ0¹KlÔðzŠ{ÖRÞK)þ¾W¿ÐaYW3½ô%‡etXØž‘K„Æ]ëæ™5ÖΛŽ"^ñê¼7Šø>ëÍ=½âÄ�°3pnÓ úŒÿì�{.O =9ú{@1õ´ÇXëïYž÷± ÃÁ�‘àÄÂC@3ÚÄq‹þ´Ø:3ëäHp³ü&öE‹µsw=>ÝØ4ÐK¯E`+àQUµÃk: �=[õ­õ{öyô²%¿ý` žÎzOl¤Ò�m.÷ G ŒfŠGÚp¼?‚EU…ŠÀÍìÕ6´šàSÌ˜Ž y‚�_ø›‹}>è½Ç/?IðÛwO¨P®®1‹¥ì±bqï5›êÊT|u¸&ÑÖ1õ:¿…Û+§¿ḭ́3ê•‚gç¸"3QÒ+ 7Œ ¯¿Áš¹*øVáÀ°fhXJMöhžÐå;* ‹á^j™6 ]ërz=ÓgUÏê 4¶¥1I=·ø�ŸÖ—…û�ª›‰+&!(«d·7XV}ÛÖ{w@^ï [ :ßëb)=ÓJ¯u§'&êZÕã徦¸»¬Û® Ó_à î­%êªú0ˆipÄî÷®oþ0¸¾¿ [® (;P±Ú€Å÷`4ÓÉx D¬»l Á#||ÀŽêMÿ€F·ß]زˆ×qÐÎ-ÑngØ7ßn?'©éú£Þáä8÷^¶ÛÿÐëþØŸö~(xÝ›wýý S¤ZžŽtá€dz>¥à6Д·žõ÷ߎ°BjÆeê)õ»˜–âó hD0­®§R5ÕìD–;· =VR=Oée[Ö*äîM º¾Te£_©ª]T¢ÚüzÝåÚÒXGúävŒµ(0R&V†é_räõòÄ€‹?NûÀ±Å�µ­ý`û¤‹!%~<Á1ãOÀÝ{ϰž^<Ú>™ÑÞ0} UU ñÓG½ú>Ö?Æ7nÿŸeoø‚xÚ)[DÓü?·i@Þ�öÿ¡±ù­›ƒEïYþÌ^ÝŽhE˜E’Y LX¿¾Ôú?·�¹b½©ŸŠ"^˜¼†vl‰qg-L¢¸Š êõ~´ §ö|”Qþ<ûxÞýöù¥Ö«<|­®ž=UDø{w çÊæxÐUˆI=L:³Ù{�f‚¬L*…>Th¬\Ëh‹b­ç×"ªFAÐ1©bÝ}UÚL—«("·þšiWEÄqEñ ‹+ z¦`{;ÿû‹BjÈ éÁ¡x°ºÓìÕÉ_øÿXVáÌ:OØYrž²Zædèí.ž^êI—qR6Õz²½ý¥‡ÐH ¢Ðzáìl$,�‰ÇvÊÍs mE‘ú/ŽÂͯPч�Dëåf¹EØÆ·½Æd.hÇÓ%&.+·Êî{C?ûn±¢Ήƒ¥F½5Y/÷ʽ°ö¾Ò„ŠþÃÎôטTÙãµ[¯H®ÈåF·Ë‡öI,¨VP?xàˆçn‘eäñ â(O=�S> Tz¦AبÞ P«ªv†•=8åzþ�¨Úæ’ð>”e¦6§®)cR;fíûøC•Àö™¥ozsà�^<½·}"Hlô`_]q�ú×êÌ—�?õß-z÷¶M¹{xÇ4½nà‡|þpsr±àNi¼˜ŠÈò.NðÌÞD®�½0ÏBo)]VÏ ƒ}øEw�ù¼7Âߢf|q¿³Ôëöþþ»ÖÖ" g¶|?§™Á3‰~ hþ“±Zt‚œ$—Zf§‡gou»U¨Ú�è´­Ècîªb;_‚l„C´[˜ºžJzZ�ñ�ŠE¶–€Ô9‹™`úÄ'�´' 4‚´íÀÌý¶ý:wv:­'4moø.-•«‰ðh¿b¼Õ­K”ÐÇýž0Žˆ*ÈS`Ž^UŸ� 53m -‚%šõzGux�±ã©8*/ª�yðä·­ñvˆQÁðvo|(ªžâÊ%¯�Ï¡b÷È3 Œ;°gŽ0ÒÆ*°ýΠÿgïÄaë�GRò0ýµœ  ‹�ym_ïþ lG¬Dc�†ø¿;[Ì&È¢r±¿J¶†é-†=1 ¾Ù~ôø„êùβÖVÅMð*Õã=a¶èR«¡RªT>–]Ò£8ÞÚô5©6¶·ï´éuìh%U…\¹íAÛHYvÂZóUã0IãÃyj»nºVZEïÝoÀñ§.‰G…×Q šÍ;óÅL¨T®þù«žî.öI꺬ØÒÀ½«F}u=xýùç«_‚è·ü¦a5²°ˆ�rÙŒJóRëU 4êïk­Röa´±Íyy—÷| 4Ú4¡žñƒñèÇ·µ¶ûNðÝxïIØ#b=Øö 3:\À¢€ÇDrÚÿ:‰Œ�2ÄIÄ z[t¨Êi³T ÒòùÊZŠÕ} Ì�Ï™¿ïÍõk¬îU_ÐKçŒûRë/=»ýA¯CU†Ï9ßç�þÜŒ/AéþüýIË^Ï;é÷ðŽ™r"ßùgæÍ3¾�»`° F&Û�ô)Ç´¨Úß>¼BpÀ¯Íàqÿ+q[�gùHÎÇ�ÐÕcDÑzsrêºÔ àÿb1~äUÅAQů�Ò;@èî�$ïÑ‚÷!œOPci†X# º1Çgh·ÿÍ/n¡ +Ðø'ÓEÏ]s‡TLÿüT÷%qÍgÁ®2¯Ê¯ËÛŠ"ýóC€ާ�zh£%}L(£уu?h‹'�›rèê‚ðöÔÜþÛãù€9ÊLKçKo‡=fÅ„m¢ïÖFq¤oü3ðŽ»@�b¼}o´?Xt{üÀ>ß¿¾?<~»ú·?ˆ˜þø=YØP@ÜýwaÀÃÅ:Ý„mõt2Qáoö¸½˜ ëø€ÖãÌÞ"œÊŠû4é‹7c2Ç �‘vO‚WA#I žÑ }›¯¢ �,ª4(Š|­ªª°„ãYOý]Í[Xí–&!íÞ‘ÃQB‚Äï #2›ãÅÕÙ@ñ =ÃÿeU Ÿ+ ;ƒ�ÙñgõÏÔX7ó!‚‘Z5Âö6-ç£o6iåÍÎRZ ôgŸM66·„�Ç€F±Œ=ñ¨w»âHŒŒçjg³…‚�l°ïg·�A&»Ô±Á³ûwQd³í�°b”7áD[;Öœ·ƒWø:f%‡ƒ5 Ò* ò"‡åÁòBÉ.– ÛÞ w6Cø�¥»EšTY¸ÿŸÛYíáæ&ü[†ý[E;Ô^æÕnYEQV¦—Z»E²b ½¼L‹²Œ‹�b·Ü Kü[„‚WñF¹¹»nçiíbµ 2O¼ØÊ6¡ïxwf»Sn–¼µ oga‘§ðÄ6>±‡ùFïmîQ™•;%öYîB÷zü)Ü)+5~€õ3Ø‚ÑllmlUöSAoUV†|ÒíõRë"pÙÀpÓàQ„”°ªÈ`ÆUŠÕ‚WñK |7M¶¢žÊvÂr·(`ŽU½À³%þÞ UQnUô/>_çg6`_ÀÕ¼Ÿh’íûÝØ,7··‹h#†/Â;0•�¯.µ¤ÝÛØÃD’·Ñ'*�Šx A}7hï"‘Ïð·‡ánЂ»�³$€g^•‰"úß×pÿqKÝþ®´0A<Íýàú½ñŸxŽìö=e`6{£ý#T>®¾ŠË Sàß4Âq¤y'ø?¸Lj�é² ò€ÑÁoõ<¼˜§ôbáë�ƒV¨c¾¬>VãŽ7hÜð8�[ÿËã†Û8n| V•ßÄëzÃy<¤y€dÞ! ¿žÌž™L0�kÁ“£žh;ì�PïÍȦ0ìuf@�±‡?:Ó~o~Œ”¹@‰êÈ€¬«­W°‹“-1ìê#T£«» YŒÌeB-ên�£3]Ôàx~«×áo¢žÌ ½¥zÃÎCz%BëXœÙo9ïFâ]õddîÂwSú´z WÃka©zGRê±aŸ™|Ì~ÛU1=¬^OjÓ¤ç㨥_©Ì­Š“ã5ÐÊå¹ÀÀ£Î V¦7‰y:ïua½@ìcø³ç Z¢éX@ŠR7õº;¦Ö––� ;Þ_P�–÷}`ÎՒŵ%ÃYTz¾z¦ n|ËL\�K-Jdh$I ¨Ç"Ó¿#C[�AƒBÃJ/.S­ÛØ,e”µ40#óJD�xH¥¾(±ÅàdÌ8éEWÓÄ[ØsKu.V'ƒ!Áêì�ÿ`ÏaÛÀÑgäÑÕWv^¥AûÈ \}"jw$4Mz^(¯Bó!X+T„ÍpÏÙí_†3½3Ñ£7C´,y߃%…ihp´ãh¦‡pœäý ¸BjwXyž¨ÆÄÈ.c±EŠLYï¿XL.2·xÒð7lÙ½[°Ÿ¨Ì¾Qè^„~<0µP‰y8Ò+c#Ar¨XO^R…žò1¹¤y„�O4% €Â‡fqb7íNMó¼È47+±sa»aÑÐÅ Pž3JYˆ›²ìMQ}&rgÔ£-ø˜Àñô—8Žq9‡À²M@ÔDCE­—íÝ(‹˜ScbæB˪é#©ÂÍŒp3²»ÉUh7`ý­óPq&Ú4æîÀZAî\­‘ùî†ÌYǘ÷Š! ú(õR/â§ix´ËáD•«œg.Ž8ù`çÌÔ9v¯ý0€½…Ð팀ŸÆÃ=sòýø=.™Úz¸m–Oú¥3[ï P—IhA hYÀ•î‚….Š' pDÑ�-d9Œ$e0¦¹ÛÙ<•Æüc6rFæú,á@y7HêÆ™â�yŸåƒä¹ +J!ÄJ<ØÞÜFFxy`nQdØ®¶Ã¤L7 dƒ«mÍÇš ÞÂvd Í{À<žçͲÚÆ>Á_›»»U’DYQ€PY¹ü90¹Àö–e ÂAU¥EVÅŠQÿ˜ñ!àª(ß­â|™g`™Aðˆ øw#!%NÃ2Å*Ù ŠÛ(Ø”EUfÅF¹Q€|›nÀ½ï]jmo£èRlÃ[0¶-ê-ÚLà/Š*!1ˆiU;X“¾Ú®Ò*-áÛ$xÄèT òÌ6-&Î!ß w‹8)ÇtQÁ‡v’m%B¥E±¹mG¤Í¸ 7ãrÄP”Úˆ•€=E0&€CW[ð¥m3@ÄÚH´˜=W»Û;p³ˆ7áè{»Ú,²"Í¡ï‚,Ìîü°å„gò³Å�©ÎÕéHT@tJ‰ˆ“�–qò‘áäÓöH#°×õ:Ý[ÁûiÞ» kçú8Ä=®¶ynHM,ÎàÜìd€´éì6nÜ$m}=¥Î‰a‘½ª˜”0ÙAYp‡<.8Æ0²ý}gÚ�éktÊëö ÿõ™ó0°ã!=ÓÖMHP'‘9£²,U…“VG›>àÓgyÀÌà¸f3b �›CS4úÃu·q$þW¹ß ©ÿÚø™Cˆƒ2$aBsžÐ¤IˆêŒæ­Nü›þÒ .mr VÛ›”"óõAVq`™–Ü Hh^Œ¼Y·˜ýÔìvÓ*$hfÐ3å3$ ͬè4 Y¦_»RiYÑ9òüOYÃÉÌãzÖC:ý×Y•+Zéßv¯Æ‚�«D‹YB-,kaD3ÍZ¼eL�ª’— YËW5¹Jéü—ë2ìPR$¬Ýè°·ÜGAHq®3[ÿè½Ñ²S]ä¥úÓºTŠÂ¬f»”ô‚|2¶UÔ¤ðã»ÐgxVÀÒN[-XÜâõÏܨ *µÈé‡9³Ø&ð·aK­œ_œ`ùc™h[:§ß•,­/-µø®\¡Šèòl ;á›Aʇ=²Àm%–m†Ñ‚èxx«‚js…(m²¼È +öw<ƒžzï�·å.Ä…Êõæ²ÌmV˜»‰ä®d´q�[,d&¡…wlH’³}X"­ ó\ŠÍοsÉH·ôºÅ†² éÈ®[.fW™']Žbñ9G<Ö +½—k[X¬^¦DR%eÃÕÐÒá°sŒ¬²¿Yˆ?“HD£¬–ÐÄô YÙb2ccÜ$»'LG€ ä©À~Ç6}hbﵟM0ïL{¨½Ø;¦ÙZ�¸•™ŒwYº„¤6€Þ`ÓÁJ vØ’*«%4ˆ×{0;Ý®äwV´¤CQ­ ì:Œï 'ƒžRÈÀ."§ñ�!“¤—ëÏîÛ�y=~5I­“M"®FñG#B«Q§yë±Ô£NXP'kä>’Z¡¨e›†dJr¨õ,¶óÎ5¸©4vC‘*Ü!É®ê眚=Ÿ`7(žZ¬’K%¤i�/Fꌒ  p@ëÞ�§oµf�x“®^ £Š§Á·L#Ä(ææ°þø–Bj\ÆMïè( a9]™Â'¾Ùsqe”2x·Uß”–!‰Í*3á’«ÀË$iuá¡|kéëRÍdÎO¡4K5$‡qÞ®’ K p ¨L|®ÐŸsV³$…©¡•{=\CZÔŠâRÀëO¢ öÿ �œÕ”êûƀؔ¦užãÆk ž ñÒY¼XTv,#QX4*¸M'gÐíP¬‡†Þ¨¡=jþ´þÙì¡·efˆ­Ë´ØÁ‡‚„jDi5# ÕŽn=Š“X#ËIo4³Jl‹kA°1S,?zcÍ`FŲuº¨e}Hi‘»½}ôrU*sbi†èÔ8>8À%ÜžžîXr/<|©}6ëS?�<üÄÇHÖJB³;$ÎzÕXÐLO.8e}*Å}YYN÷`Î¥8ƔȞ™–;öX‡ái©[CXdzNì ì,cI¶ÈÎb>V)hट½EUöbÐ¥�y´úŠe-ËAzr‘‘²¬ ÏÆæüy—13\T)�  MftÞj“™ÒŸ“ÿª¢ïa<ð$°Íc@©¦è)q$¶3e¾Ã*axíBgÏàeUÒæ26ÊtB�: aEƒî<±¬–B˜ÄœéÊ|&å­7›U3q©³@I\úâÜ/× yûe!Ö fJˆèw pŠøÑ¾êÏŒL³«Â("@ûq0pßcàÊ9¥:4iø$ÄìÁÔ…<ëbJ#›\ŒÉ ‡J(ÛÚոF™üýÓ![i¥læ1åŠë55´Üžõ†¿²ý艴”�F-½fÛhY�…+脜.FdH"´¹2q„{½}a…fÐ8;èå �c@)õŠßZ÷BÚ…[¼H®,`±\�L BR„“Üx¤ÂΖ�v)v½ì<ú‘ÜßuO#åeý£¥?� ”ç”ó ³l†¸[Œ”aŒ µ&·M¥I2y%ImÌd*6RR*ÌP¥À¡ÜœÈ.𯩰Š guƒ�Pš§ØÂ‹«¹·8†-ˆäm±¤N6#EŽa÷”!ŽÆ ŠN`ÝÓ,‡Ž"Û¬ÀèLžµe;ñ„Gϸåí(aìu¿Êhܤ+×Û,f–)tO)aó¥cÖÆ”µO°lÛ‰óÑ£zs–¯ Že6Ï•+Ƥ¿ÿÖÏ`µùœ"˜¸d¸Z$]ìu¤*[ÓZF->ø /Ç JÉÚ�fðfõÔ)ò•\)ÚÕ@mżØlsã^#•ff£eYÁ°c#c”Åá¹­Œ˜Ú§ÁÆHβ0ªw�}z`–Vq�—¥20V;ÊÀ¸[¦[y˜;Ú¬m•øïî.ý[Å¥1)n%»E“¯blß@ÿÃæwvË|ÍRQFŠE’!/+‹b»(È0+7‹´Ú(ª* Kô?¬¢|§JóMòÕËÐc1JÓ¢Hv7³2,sôé+Ò�0ÛŠÂ<ƒ>ó‚[àWµ½»;8&eþ³^Š<öóÌvÞÛØ¨v+è©Ü aUR•U\…d4Ü-7ËÝb»Ü!“aæ»Xñ®(bËF²›Åi˜)ƒ!<™—;[ðJq©GhŒwÑ“¾–ínÂ[ùæVX /¡mÍ+˜I£ßÚ€EÚâ9¸#œNý6Àm³J6ª­,<�'"!”ø}º0®™é}eŒÉ/3ÆÒpe9©�´_ôìœ;L!SC¬*!§eÄo�±ƒ÷Æ5â„FÀOժǚÐX“ecM¤Á2Ê#üêúfñ•‡jñ-Bª{ô- õ¿üÇÑú¹j€k«¯´ÑI9E)ž/¥“T¨B¤4jl•iê}Öc^c¾|ŒêÖ�ß{tfÇ£}Ô‹ÃàÐŸÓ Në¤+cYããŠ4ÊIhGzsGVÕ“#+ôF¦oÝv&¿\`šÓ´´5ÏmÀÊÿtöhòLd‡3Ú¨ðà�¶ˆüÑÑÒѪ[�qÈ¡$¡8£ÌAäŒ,¬Ã1,½�¹#+ãØ™ji™¾õXåi˜ÍAÂOWTεިx*q�|‰”æ]wQl,ô»¬+oTÞŠÄŸµ4OAݺ¯‚²—L"1Cà³þŸšJš{£s§R_+§¢Z§¢o©ý6Á¸þNwָݬ^^ vÖc�ù!oTEæ�ªÈ–ŽJÝ"»�4[�¼�ÕSä ‘#Ò “éx“YzHÅ*V¥å5¸G.Üc)¢„Qì Ú™aƹ;CÝÒ4CskçÃ~oô‡èbÜÙC Åü�På{Ðá 4®‘#ŠT")&Q[ØÍ¶ÕÂ;‹ØBmà pÇ1Ô.Ùqزkl ¹Ú[[è Ø!Œ½zà( E±êš@èÌ)ÿ*E“pøHD UR:�¨t¹\÷*‡ÄÚy²‹³»**o`î,"Ò×ÈY¨–ÆYè[yJ¢ªþB†_ÐwU³*ᆽþœœ3`�qõù(¶b½€´¼%)ANšOæÊΠyrEmrÅòÉ©[? åP(vàk†G²¶„£kôzû„šq%´'uõ� œÒ„®MªåØ}•U•J½B=[?á²v–¤®>H˜l­“»ú�[Q°H=øyÀ.CØå2öÈÜúQÑ^Ôx`*²`†áÊûãÑAÿp1íhTIj”¸æÿÒhryŠ™Ñ!”‘b£œ�FR°õ»�"Ôî“Äã©tKãõ­Ç½,;QkqÂÌ”–ïYÖ[ÁÃßÿü`KÏ•W«l Ïg?¬´t­ŠQ¢t?- ¤ÈxŒ%Æ{¬°´:ɽ™y`(c å2ÎÜz8ÑŽÆ•€|W0:m£rúÁîcÍpFv»K7¥©ÿ×k¹1"O¡B{#3s§0^ù¢pgAM� ŽØ§m’/q :~‹67h5I¬"+1+“4`( ®¦î±Á9/ÎĹ©ŠÔ©nxˆZÇãñByŒ÷æ�¾1™ëk»+>7;"SÏQGA^èüâÐRœ˜ñPÜbEÝRs¹sЦtÝi C«¥Ëáz5ö€/íÔ1N¬±k*0„5Î šÐ\²j9.¾©‡ïyì1£º¥ßõ­>é‰×ö1)Ã/×5ð±Ã/«Æ›ßŸ¸úš¿i“E—éY$�Á4ñ†ä�¿ðYMÕÒ<~ukÐß#yšfÐ4žƒÒ*7OãsÈýa¹s(jìr±œ]Ö·†�·=b=h æ Çϲ¸>夜ÚÁëÝZ{Ì1Ué Ãs�§-–ó´úÀ}¯°o"W™€óÿæá™0�coHîøË7[.çfõ-eùmHù۫ʵîxgbÙWø9æw'KÉœ¦V³tÄ‘öbDlv³c'*íĹ%æ(Au–T"$UrXð;è„yb}³?aæÍßVáóše#AWÀR·4‘ˆ4šŽ$„šˆF,¶ÚÒÙ{†¾È¾È\f”´46¥Òï#Š“Ô�Óßbb^7#Ö¥&{ÒÉ0›Sðe`20<™v`ûéÄê‘X%çø/ÌÏ U»a³j÷¼QåšÖÔH͹M4Ÿ²D|Êñ¿*KD=HKf‰8oŒ–>VqލZëö†t¬*ÿ^ݪÔHbí#µ&FÅÅîêˆ�¤‹.)µœnÄjkœNŒÁÕqb@UKÜÈàŽNüÃ7‘g�3I}GOg2[2Ë8¡éÿ:�¤"dü¶)&&ãÙ\åÑÓjG:”$p"\«³T+žcI�ú é+TÔ‚øøgH©%Ý9‹/Â4`þÔ§ yÿ$OäAîB^ÝA5øo˜psm #8¢ÈEñvö ÇJå¸ãPZ§ëzĘWQÊi"¨ÙŠèo9ŽU¡ÐÅfÍä'â&&7JªÔ…€,%" `92³,}‡ÂçN‡–Š¿«ƒ+®Œv'®±7ÿÄZVy’ºxyúW€–Æ$\ •žI54MÝy´ý6] l«ùéébPƒqE ›�G¤gÂĦƒùŒ FÆ­Éäb:1)>"ãò*ŸJF£„qÌŠzRgÅäÂÀeµŠIY¸³w•%ž¦I54JßÙ¢ ·ÙÚüÃÁ4¢g² }#XÝ£´@j a§'%)VGÆòá¦Lp^gBµl” Xy�Íú¨ŸéÏgŠkE×@Z¤º. ´Ð8}Yí^h±ŸÕ±$ðQ¬˜bãuÓÙƒúî(sè² Á,³Õ:4/ÚŽ”•ë 9–j‘›"»ýÙdÐ9:Á ?›ãBÌ�Ç8^ÍÖ‚Ñ‹B0FúÔ‘gÿÖë˜UŠ=^ Ë„r«öŒÍidÓ«jWGµ–š�a�~Î%rië®±'È�øÈjÙãÐ~Íì5êŠZl…Þ$-¦puŽÔ×z ADÍ‘Saå™ùÆ'„’øÒC}•X@ç'̪M«P{Ï‚žj¹f”4µF™ÂtÎçxÒ˜æ(`YUú|²TÝø~Í‘q± ™)h&¼^¿R$Û¶JÈTK<6Æc¯k1 0Ï/áP¯øŠÔøNX#“pV ³ð{ݾ" R¦,­½Ã��'gQ�sçDÆSÄ €¦š�t´¶Ä"Ç,ÀBZ:!W‡½yñ€L«÷�UÍú³9S3ö¡¦�[™Äݹ K%£½dš³Aêëb!¥û ~Fï±4ë²ÍWxý,Ö²^ É˺^ÛUìU•Cû# hIM”U[¡B´‰:³Ùx¿O+® “‰øE-O:Ó9Uo<�/ ‹žÔj\¬˜¸9NJÈœÍÚ0Œ=ÃZ¥JYm{GæTbwó¢ÁÓG»X’X'ƒR\g|ðŒ(BE+±åÓù†-§ éÚêL3Z5¡#Äh‚¿Ê*©kµöG}ÊU¯ÌOòLSôu0~¯�Ý'ŒæÖ·h=‘‡D[gê-�þ›-ÿËÊ· /«ßŒb­R(qú—'a‰–Vh¬Vj@*@Þ¹¯ËWÛ³8ÑD&OÍìmwl&¼°· û£ëÌZ–ƒvXwÑ㢠MGàš²é�ùÞ’…âì°²KàQ;tåjEl@ô¦†bltA�ÿ”ʹt�%KØ:®ûIœ©ÉÛ—%8Q1$Kp2 FÓò9ŒT?~çÂ쟥v�Zv�ƒÞzúbåDÔ³^-qF½b9íý?;Š<2ÛÈ’ˆ�íj�º5'{QfW«²pÜW]qêd7G>ªì±8žFJX »”ÖécªVæDùøc‰ç!°ñÈÊ£—¯2K¡ ? b~mmš¬i-Î"Rç%…UÓΔ¼v)©õ¼ÌѱôÞj1ü9ÓY, º�¼ãËV8ÃШÒ,&µü3Ê�Úm*oÉ5WAè—HD{M­†vÚ§jÁè©GE£Ôsª¬M8™+^Û�kNù<–a¼·NÁPy$y4¶$çÏ .Õ: žÜ¶[ŸŒc­‰õwF¤ý“#7è˜-ÄV*ð´f�øèͶ´eÁk!ºJÏ�4nLA¢Â¤íùI…阠"r&:N+Quþ–RÙ‚–GõãQÙUq¾�E19«f½�—H+Ê>æeîa¢¼5ìt•£¶)%}!>7‡âbÒhbØýÊí•ÅVÍË °¾$Ž5ÂÚtŸ…MÙPQW4º&•¤ÙQi<©ƒ+ð)2ºu‰¡%ƒ;ûóþýù±ˆ¶�¦ž)î™$21×lÐ$ô2„Ø]r¸‰ÐM\qÑÕácO’ÔÊ�TÒoizÇ.Y‚i×B·!ˆìH£ÎLÍ!3¥ô&²Š_›Þ¨ ¼åÓ¹¼öŽƒ¦”@a£ƒjÓY0ÃZk�Ù�à1zØÀ‚øgŸJ>BÄõV0Z ÷`á±növv ºCŽÁ�-¥ðX�Œ ©ºÍ\Ξ<¡b$[¥“|Æ9ÜÆ/=ÜRI�ÅZFVÕ¥‰¤ÑÙo™ÕÒdÙ�bfj²ˆAÛ{ ¨ÒB¿`¡Zi¨¥B Òá�Hü¶} Ñ”9e¿DpŠÏÊJ�.§qS<« dT·4~Îê—:>Õ&W •Ö}}¤Ræ,ZÕÎÒðâðÒSîï)cÎ&¼­‹^{à7”å;›ðnvú�rúE¨ïÿÑ5Á/–«”Ïûªâ³³Jë¢K7¶<¶VCºh¢Á‘Kƒ£óÐ`£O�-ß&—KþãS¬‘âŸb£˜$xÂT^#¦ñbj"˜då+=’¿IÝëdM›ÕY^—€ûh‚�Rò›F‚Z³ÌE ¶äµuìÌéD¸¶ ³œÈ-Ótß8e“?¡Â@?-býÙ|™òÜÜÒÄù~ÿÃ2ÒLC¨k!ª‚û¸¸Î¨{:�vTHg±Øÿ^¥„¡ÙèÄd;ÒfEC…Z d;6̇䗋9´ˆ"åó.�©¿Iš•ƒÃÒc¡ä×U_ÇÆY#Κ@i÷Ž–�&krš‰s`‰3“Äø-§çHfzÉ ¶ ŽËN%7û‹^löN?/ ~E“h©´ñïàŒ�vê Ös±óf9–°ó GCèz-FaqŸ]²Í›qÙŽúÿx>›^´d›cx¹Â²$Ûü C¶Ý dU¢‘Ùô-®è¦Ôù£ÓPÖW·•J¹²«¨2}mSçnº€MÜëÏ•ñ£gˆžÚ\EíÐ0†™ÄXî>�O£™-'P€ë㣒æxk3 Ìû€Ñ눥×KGsÆb_G”·C«ì"ѕԵ,Ò«ÆŠþ�sÍÉup“3euêt­�ÅGfzf Ê@&…�¥æ7Œº>¯¸GåÙ¨°çÓþÞ‚üaôù¦£y)UFÿ¡ÙwŠðwPc¯3ëÝçlª¦œŠj2‡JäAÆË—ö8¬2‹t¾9¤e¥�H,«!l¼”¼=ùÔób 5°¦Osã­XÊÕ†ÇI¸@X鬔=[k W…‰ÒÁ:{¥?³¶^*.8E*iH%98øxÅ �xU†-ñBh ´mÀŽÄ9"â(%zúËõoT’ØpOÔ/@|ŒàüeÐzc0?B& èz©zLõL%ý¡ä›ÈŒ÷:J'e¯$b˜Ìråænìr·±ØË•9 ZlÅæxàóÕŠ4•s":ܰg�“J a“¶Šz/OšTèˆjìPÈŸõSéð V̪L>³È]¼PüvÐÛl–J»ýœ¥º"b)e ¹ UmIJ±6’µ1(œƒ4Ôxém±8!ÍÒy�ó$ªnæKÏyd·É“1®ªü®.,ŽK/J’,3T˜[�zûX ïQÏõ5’QlÐõÊ-7X¤)÷yaƒJ ½ÕÎ$q!vªÑ$¹’g(Ô�QžfX* 7Í oµl(ÁÀ΃Ýt€Ì6­­òØsõ}V‰,Ÿfÿòî’áô?SA§Jù˽àÉ› aPsØ›£ã]·pУZƒÞ=ªÒ!=¹NÃ�;„;±JÒ]8;H³�•\{ƒ7ÂçM¯AbxÒÌ€!t¶ŒÒà/?Ê)Õ#šQ„™Ù–�"qŠxV¬1ƒQD.¶.¢]ßXjù)E¾—y§ -\(ÅÖç•”.wV iˆX‚òßÒ¨.yßJ¿7;ÍÖ’�à~Hà€�¼s�·åô&Ñ_jŸ\YÁçO#C­ÓQÑY>•¡3R�M;CéÊûËw‡�Íá¦!”Š3_¢sXCgÎëq³3½"SÞRÔ®Q¿Ø®Uõ³9q™2ücâ,„9îš hý<ðÚ<I«a¡%Í1Ç}�éÏc•ÿ·Ìq%©åK¼f‹Ó˜]®™Ü&q,¦y�Õm°÷†?Ëx´"ÁOáæâŒÑ…s ïo=žOû˜SLëT b•–@íŠS\ñ©ðxt±t�nž¨A¤¡(øò'(ðžßœÚ虿L@ó Üz�ÙT¿±C±ëJ3H—¶ vš ߊã^ 6FœòW%ñÝ뜑Öãˆf€§ö¦c² tUG‡N€r|O:!¶{K%ëõÕðyrj¤V)W˜¼ºÓ�Ô´,1ÍÑZˆç+½u#ƒeíäî‰\¿ÄHc¤ÔRq¬¡£‚¡NJæá8 54´o�–.}FÄõ`‰…ÖÕÏGÌjE£µ–«XFÚ„ƒå­p©–­Móiˆ³1P˵à[“¤aÒ™ƒD6Ò•-¨×T>ïñaà)š]¸dê@+wž·ÇN\r•¦uÖ‡–¦É)­°&72÷ÆšZA‰éƒc.à0õsŒÇYF• ÀfÑås^猟:WZµäì´ji�~J«ö)­Ú§´jÿ¥US§;1Ì�¨ý´7éézWšÐkÛr‡\Ú¨ÖÅüxÒßï »œaÔ S³qâÙŸ4QfŸ¶/¡Ì™å øPw9ó¦"j�<›çý+oñadò¯[ÃoÔ:ÅþÇF¤fþ&m8õbùõ’¤ûØ|šÇÃtTm‰b·IEÚ]}åiÙ+•D�xÚž2.ÙÌ$ŽV Š3Íõzªb¬Ö~¨]k8ô‘û\ÓNo|#$‹%>7Ì™LÌ+Ž3Šë]¯õXMü®…£ÔfÖøZ%M:ªm–âto"‡VÚ`\²«Û˜ËGÎ=Óݹ·oX¹Y‘K�$¦ûc¬ ]3ªébÚ¬Fž“¼ßàT~ Ï^ÊÏ�úïÊëÙß´ÇÜ\4¶&7Hs/VÙr6c°TX.cÿ+ãC;uéÝ\Õ-~ÝîœÒÓ¤*Ôc¿J{ËSQÔdo�rNJŠ�a$ZñèÜv·fmƒ”(›CÄL®(‰ÔËÀiÓçDÐ"³ñ‰”nŠª›y¬ÖR—×·Q$8Î,ãŽ4"¢Ù†²¿QE<ŸÐ7Œ²nKŽ[z°A¿7k/ñÄh¤£¥ÐÍTrRÓ&sÜ$Âu@Û”í FF&&Rr'4Úíêê[#*šài³XpAñ¶žÇm¯gTyâ„UNÉJi‹°@¯}‡t£{ò-U Ÿš ãeØ&êrKÅÃï�‡=®r òaoÿíšuT�„ú.¶�>�sÌ<£è;û²qtŽZ.S%ŽýHªÙ ¹·:3È¥gZJBÜÒt'=xGHQ£q‘�Ó,…‡N½S:6ôžf¦ÀUäÄ"56°?™WÔ,Ë]çC�aêS¶ÛOÙnÿ›³Ý¦6ÙÚ®vÿ€³)arß�+,+#óÊG…¥®þ¯NÆ…äÒŒsáéÚ”8±AoJµ£}•e• †õ/Öt‚•ÐPÙH¸‘H;L$ÎXæ•Ð"„K×Õ­Š8[¦¦Æx)³!ª”r´$$;šÁNÇ‹9Vß&éP/ ð! 2óvu&Dv*Ÿ)/u›2øÚˆ+Ô6©3°ÓíNµÆ¾a!ÙŒËÄš�É2{fHk 5AIsddŒŒ7 ÑS×@ÌbMæªë—y­Ç-?„D>ŸˆUŠsÍþ-Vl‹Šƒ6kE©H¹Øìt@RÁ‘™ÝóÇ¥ä,ÀAèX‹‘réP.8ª„Ç´3šÁªÍ¬¯òÕ`o0Þ ¿îµšL’õŒ´ ÙàŠ+Â-¤(Φ"_oKqÿº=u–ÁJš®ºÅ$BÖˆ‡"ǦvvF¡Mêu×äã¬Dq–$¬û–ü={sÐÈG;¬s$šÝßAbÖ¸miäF=PrnF Žzh‰qòRnô(§Çb$U×1ôÈÆuöç LòÔzew\$„š´¶)R—ËìòRé !Új¢¹ Â×ǰ°R¹”9ƒ±§¤¦g…,kô‰m'õ”‹ ¦k¬NE*U:Ô[ÚôíV{O6î%�L{ɺf2m_HÅŽÞÌž[¼(™æï­Î ~ìœnþ/�W »ÙäbÇÏY±yÛé”?ã7ÜòÂrY…Såf©l*ÀTSñˆõŒ‰hNëpt0gˆ¥ØÓ¹Vp9LB¶2.èecø–•–ê:ÐÈ=f ¤(Ã+ÄÎ1'DtR}âY¯D—nSÁ4aÁŠŒß½§÷°2gMjIã›Òµµ$±öU«Š+ÿ~JÇÝiϲ©Jc|fbÛ ¦xôBôÏËûý‡ä¶]Λ¶˜Yû(ÞÔ=X|ÞT玼0oj¹–�bSÿwr§§òÕ±Žˆû*ù/Þ¶2f¶þõÈ¥jz^&BÜ=,4–Ú1‰+e¹4 ¨þ§¸×&^Z�;K¹ZµdÅk\-�Îp¯>W+„‹HÏ3¹Z³9=ÿR‡«•®KšÏ O¹Z œ~Îé@Wÿ‘[qv¤ýÝœ»:–p4¶ŒãÒºçç�]“Ÿý¡^4GK³) ¯¡NdŒ§‡€díbU‘S’ÝИ&9�oj�#«£©Y9‰Zl6–‡VärÉNÆN•ÔÔr#œ¨a­qy‡µ¤ ŒœL“ó4œ<¯2I¨ÈI/sô5·vUD>³ÊqStÌò¡ŸÿÈÔ–E>WRÁÿñ$è>ú�¦¡mÙHa —:ç�PŒ?AL‘¢‹rαëq̪7Wˆp2�ª4”ÇA«¬0SójuR. ¹l¢uŽYòF‚’6Tl3FãSy—c–dÇ[zG1Ñr þѪÞÈœì’cuXn^LýÓ <ÏÍOU ›ÿPæ8ô×âbœ±þ–‰,o<³%•hŒ#<[îj5Ë]Mœ±NêqƧj}=Þ•}8rÛ›¥ÿ&¾ZS<�º\TÛˤ²t7ì9ùd nø|²‘x=æÒ &nÎtVã“%ðeòÐÿuï'mïYlqk)[¬×Éò9§æûôÓ{ª[Àøx¬o„ºŠ0Ìù½;nŠ;‚ΰ‡\ô�JÚ±7þ£‡Nñ½É\Wøb|ž¼âHqЍ¢0àUµÛ—dYM•M�8s¯LÎùà�$Y -fÃv‘ðty®&›&-TI8iÊX0EyÜ1#ÀóŠjÓ©E÷Ku™)Ì ÿÕÒl8Ç^Ur뼫æˆÄA«RÁ¤£’ÓaF%Ái»ÐêhAÈñ…[Rˆ#˜ûo{ÊfE>¿ iTšäw^*½›$qË5Ëá㇖eZÖ M ¹³¢üQV/èO§Ëød&ÑFÓT5 _ƒQ\ÞÆ`Z‰Ü±!×±=øb±êj™r¼2¾)ÆH…‹zÖ ?àŽ¹HWç¦ÉŒ‰V62 ó5K9t¢R�rèÌ—*6R¥FÒßUÅœïP„¤®×\™Æ¦\q65‹� ´Íi5C!§…îG3·Ä’“4ÏO‰§nÝv&«¯Ò!5ÊseÈÏÞ ‚ûÍi f‹Éd<�n�¹!tL, àþ�«}D”f,®À>Øë©ÿGl„¥Or…sÿÄ‚TÑ!ËÕ ÕCb-dY‘ñÄ'\up„Š“&¿•Wz»Õ�w<¨º»Ð‰ŸÏ¥Ã$=Ô|ðPñy”?pB¥™É€L�}.Mñc3.lÉ•gá©aoˆÅxßc:Kà8H@í¥®BÕål!³£Ùý›y3ÖóX}t°rÙëßQU³Ï´4p1‰3àeQKŸš†˜˜@qz©±Ù¬Tj#2w×(g8øå šÉÚYŒf¾1v™F�3RÝ>U×cQö,àß»Çè/ìKuýÙ‘^Ë)†úèÌx³`ÿh1zKu–Õš:NÙj%튰r#röA#Ō¦btèÒÛbÖΑY íK|ä{Ê,–ŽYšÖx¢£.­†ÃpŒ~2<Éñp5;דƒ@sZ%¡3ZÅKņ÷jÈ_iªUÞ÷Z„³ñÙÉEŽIà àâN§�c± ¿DÎø&syßýtf–1�5ÓD˜mÆMg¦žPl¸æÔ`½8¥yËr*çnø©�Ký›Õ$ë 6qq7 ÑÊv¥Ñ­‹‘V�Ù;…!4'A]Và"XUnáÎ) t¦JÔWÍzÀÂÍûû3sdi˜"ç7öÞSJ8VêIäMHø°,¯° ýÙPëu´¿ððS›O «½½ý…0•óœ¶/ÙüÇ\1ƒé¹•ä!%–+63f žQY!Ay9æùH¦RçU·ÕP=‘í¼›È·Þb�6'Œ“~iŠãOXš`ÈeÌyã$q0#oH‘J³"Œèn1Gûo„µUQ�±r6¾%/Ò'Ip&ÍHTºHT”�IJ¼:Åç2{üYÌçô35C@Hé/ºö'kÚgõ�Ei*I¡žÇ§€•SõÏéT3\ê&Bm" Í µýŸ!ÈHw½u¢Œ:jÃx澨Âj€ Ö¡ð,ë<ŽMéÕô­ $ EÍs}º³á3j2B¤öý;Á†NAgAmäL­·S5•–¤x¯/‹ðË`î†ÙÊԞͰ9¨Q+Æ“„’ø3Cö]Í¿ÕFéòb¦¤¾2±ëTqÆú3Fûcé )²p� ‰‘±ŸËÉj)É–ÂhV©$Mhí$ÜTùW˜¸Á¡q 7bü'px§æº<+ [zv¶,È>¥aû”†íS¶ÿÓ°YKë§|Ÿò}üçû�[Aå¸#ý4f¨-ü�‰Çò¾cª#'©ö7о©)c+×ĆÐŒK" XFÄs‚Àá$Þ¡®Sh!G~0 Æïµ•œY‹9V=˜Ž‡Ú¶¯�|zƒ‰®7ª†®¬ý“Åt2žQù‹Þ‡É@Yåȇ²To.òìù66#Ɔ£¦2ËtÕÕU±f"íÈ…L°Qן×2KM¬Çff:õDcñ.«[bâ�t¤9ýøTX±Mv¥‘Oª|$¯olV[r¥g�9”ÞTÚ²!-nš™ëÎhÑ(eA,Ì5FÏ™ææA›¿©9ŸÓÓ1nýñŸh`z¥ÊìäBµ+•y•cE2Œ%Ⱥ3ªä“�Ö׺ä]ÿÏÞoßï½ÆÞ­o^ì²ÛÆOÙ”•LmÊ´å€öškLõˆµ—~ÓßÔGDVD½*™Y°Æ¯Er¿Åae‚W“Îüè5ÎlÔö^¯áÔ ìÚø$¦³0n�[xªÉ´Z"—Ð+º®O_Ó0Ò*4×}ÀÔlãšì"'ƒ/ÈNPòÓ×;ô~œ»ÑÆyé~?s=Q/Dî èæ¼Pð:j„•· ±ûB™&æzƒ^H< ¨¢Øy¡Š9·ÐŸü9¤ªô^¨xN/Õ2oÉôúf6ÿ)6‘ nÉe¬Ñ |kô5c�¾~¬Á‰{Më1¥zPÆ·8ë‘�@]ôõÃæå„³T¾P&•¹þ¾ñ…*,œ*޾þ!€„!F/üÎ:­¦ì(ê�NÉ�šef—³øœ©%¼nR%Z£ÔåÝôµ]#u=¢CÑçŒ-íe[Ýóï4.˜ ùÁ2‹Ìõƒf¦*�* úú§Æu‹Â0vÞJÌ“üM<Óùoû“…Ä»ÌÒX&ŽÒĤóÁšºƒ‰âŒG³¯ˆ‚¿ØI¹¯$ˆˆª¡'_±_IJÿ•Š_Ù Go< ÿi×XAÝqŸÊ„L„•Ëék‹êú;À�Á /_í_Æ6p–�³äðÍÝ�%ä…�’YO9©Â™” ©0L�^a©KÓð³jH¹ÁýŒÿ !øxÌîVù�w«jxÏÝ]s\bùJ‚ÄF5<‡uK*ûhåfÇ9°xqôµ^œÈ\ÓU’¥#¼²1–-¥5óµ,�W!ìѨú‡Ö5\þáÓåh8² çËNžóÍ¡ƒÿ‰õp°Åa³4wrŽ”+—ÁÑ×¼ôõÍJëè©™:B¸ÍÙ–U©órŽã×/w•¨³ŒÃ’a–/"Oc^œ ¡cÞÈÀÉ�ˆ_ÃÖH^ÚU¤˜)[~) žðÍ)SÂÌçC¢Ø} pŸ_›óÔ4{éîš(t_�ínn—_«ù^Èîœxi橦h®°RJÅçäN�ÇºØ {�Qp—¶yk·4펒ØuŒ98UªèH ªÏÚD�ä1ø‹ Q^2Ñ‹PÅ’µ[8‰¸¡ãéI³˜o1¢š!Og«6f½–¬8XÀ4;‹ùxØ™÷÷�•Ãô“?ªê3£A%’}L‰8#° :Æäªçº�s!œË¤CSɾ@ÒÌo¼"#;2‹–M.QæQ�¢–sð5«�^)¥°˜ëD-éEé°E¥ØxÌ¥4zJŸè¨¢É*¸SÚ[鈓µE­‘ÊÚ‚>9Š0RX9yë¦oqÕ¢ü>y쨌>æ^®nfQ|-pÝo©§ÇVºŽ·VÙ+BM�Èmfš$Èž³¼ Ê�}²2\vk{üf^çÎ`ƒ—…»1tÆo@°·,ÐuÒ òô@×Z~wS`ÅŒ?@žÁÕ´§69D/pgŒf‹!wØ[Œö©|–ÙXkH›ÄÚvòc ½P¥öAìî«"FÀ–Uä–SóV‰ æu|w½™c6)°gv®ÔE¢¢[nLÂ$ä4M•ÌSÐpdµ ŒÐUr ´Û¬ZKŠñtãÕÍ’Ò<»^å_‘R â·=º—ö–6ì¨x^J ^Çèª91®Š:QƒÞJŒõ¤( ÜQc“eƒ6›.ž(«¬MC¸“žAÉøwewŒéÇä†q]›3þ±´!v›õ³’ž›6%CKšqüÈNaÈâ=ÍaV˜ÀÀ•WPg^ ¼°s�”m®¾rˆ@$ð>ÒSJØâ“W¶,–¤ Z›ÀüÎèjE»H!I šf¦ªý‘RM@|7×\ÄÈ1ŒlÎ.é9תá0<@�|ÄÆ›1{Ä%Š 9…~Ê«þž28Ñ1z<^PæDL@±º³,me bÚ`œ² (ŽRk±ËL’O-–¹‡V)¦aW[¥Õ à%2²W£™ …x0©$D6Jï�ÞHeAá�d0†’Ñ¢¯iÞAŽOƳ6‡�ñÂìˆR<67ÎC£ÐÁ¡¨¡ÙGË2j–ºOv(�Y6½]#båIXˆÅsG(7¬«G-«ÌMcÒœµäÁÃ';Ê⎤¾ÄÿÕÃû«”ŸWûJã%üêö&ÀctæÊÆ­QÔœÉZ+ñtfvžìø—VN8KRpãX8t›[67‘¼îÌî±ñ¹rƒèÄöÍ"ž¼Ù¾Y’1<:ri0«ãÈü7d¾—~rY`!mäx"yoaZ~+2/ÕÖ'*ÈõA/PlusZþSÁˆQDà�Èt“7¦ƒ@$,¢Øe�tÃ5d)7°`¬ÆÌÉ+”³$m6¿ÏCgÏЈEç0&Lš÷�Mê�(C’ò£�sàó·ý<9NàÀÞ°%Ä$Ê]º‰ :þ‘HÝÈ‘˜¡åbOív´G_K vìáÚ*™=}-–¾Ì2xÍôß(¥XfªžžÀ h…p²“À˰X¶üe–»Ë¯6}þ8ä[¶_�%i‡uèðh")¦²,°ÉÕNÆS³Â&?�v îêà… ªœœ‘#/Š–Ã�ëÚayØsÀ:«Ì¦µåÃVRn¥±‹­ v J¸$œ�{˜GvƒgäÁjßb|“1t ¿Ìé¢À¯r‚à¡«jêú nœ Õ~ŒãœJ¯@é‘˥̸{8D2ùjй�⩱Â�ñ6ú�¸Å.â¶sî!1l±<¹%³#à×ó†Hh÷dŽ IZ2Äœ”Ša¦‹.5îfÆ—Ì,TjäúJn¾*-øb•Tê‘¢¸Ö™· 6iŽ ¸¥@÷7‹ÙÜÔ|¤ ?JAë<wº3ÇwJll$¢@˜3:=ìÎ0Ê´œ­æå¬‰Ë2Í9 šÙ¤½Z½"½}ìŽ�€dÜ ‹3aéV¬¬ê¼ &‚ÕfÆÑÁœBÀº’EV’²›ß�L‰£æè!"^ìB•‡ÁÒÔ $:FI¢Mþ¯Û ù–�¶¼×nÊÁþ`<ëi² rŸ‚»@þÅ“œÐU¥£ê}°Ú=PRPf‹ÙD´EÅŸímf”KFÚ�ÊnÑØÇ9$™Û“E ¶Qv¡é¡j9 7>ÒëÕ ¤T$YÏ\ y¨Æ†‹Ñ¹.3x–“rý®Œ{¢Õ²9:çs%ÖÄ.’Æß›ŽßöFfe”ù-³€tv‘€ Í ÷TÏ+¹˜b"XG]·‡‰îîÍ)oè^Ϭ4ÊivÏ ³_«7d¦{Fô4Ò™ðÝ2–Õù•ämÊÞh'ì&’‡·8,SFö©ˆ"²¾¶–2�˜£^x“Ò["?×Upá¬xßS)(ÐM8èƒ�;ï›ú®£ƒYò°§Ã¾Ê¸>ž¾Å×ð�5“™õÆ‘{ÎæVšÕ�bò&�x#Ó¹`M•}Dÿ–t44>¹º:g“Äb²ÕÆTŽ6˜—9®Zvl®LN–˜éPö&b–”‰KÌtÃV]knÙÑQµ��Æïƒ½ã9Òp­N˜ªHÖ:n“ÿ ÚEÓñâðˆìj ×PnEDWÔl*¢^Uµ{Îhº¨7)Rá�(ü¹ô‰ÊûVÕ+�æÄîäHØ,Œ�›™+s„_XlB@£¤ew‚AKÇŒŠ¹a';;¡,B7zY^E/kbr„\Óè˜\þÀ Mõxµp#D¥fSk7˜ÃEïóRCL¦cñ†”ÔŽü`êºEÌа3êŠòTÎÞfÒŠQIíç’sÚD Šp|¥Å:üp,$£ZjªY•clþyCÀ#Š]uíy¦¡\6N%5a}qÌsvétˆë}ëät{ƒŽÊÓLéð“}T®Û‹© Ò÷v޶í¡©x†« — §R«¤;rUœ%™àG‚ŸVQfaõJ�» �Ðê0‘oŒ÷_º™BKVí†Ö¬½¡�b/êñ‹­£0¢Šš” Rç¯�X”ÂXóö•ÔÛ1ë`òèPüçˆ×ƒŽë”€lp|Ë‘¨OY/׎g¼³ fWbó[´K[‘VzªN¢Vì‘£šô,OtvÅКVÁ0ûñ楓Ûc í¸8>sa »0Yì«�¦ˆöè´7èuPœî`Nf&–F˜�D";v0­l1ç{މ<9 ÖÆ"ÁՈǩ½Ø �«îôúCRwÙ\ ‚Lø)7q'›\Ø ý�&û»Ôü®>íøI±~Ž*LJˆ†Ž[†˜ƒ<’!ç•8‹Çg ¾+C®ès¢\ÒvÁü}Xbµ¸è„רoñ�2ÚÐ> Në\®ÛBc“¤Ñƒ·à±Q9Óåy_g¹<\,„ê)¶´¤�Ø�·� 9°p±ÇF-SæÆ¨ýuŽ Ý°ÝÀ]é[v*Ü@Ú<•ʤ€3 q–DN~°<1ЇêÐàäÌuuž“¼"]’ßI$­V“¦ÈUÎJ `d÷@$ÉÒ²x»3Rç%‰EèFêe{®ü¼ ¬--cˆŸ+í@vvÚ�<È?¥ø”vàSÚ�ÿ¿Ò¨Ó‘$j£ØWõ‚Q¯×�i£I­B¯“q47lµÑ¹³—‡Uɺ& £­$¾†>.ršuû³·N‚ºÁñšòS΄Zã8c£�s§§˜‹“ÑÁå%ñIsý)#çŒ ÿ­€™JŠÈaÿôu¯n(Ðw˜ùÓÉŒ™@%õüåúnñ[tyªÍ`u¹î?1 K¶X+Û­—¸,qŸŒ…‰ i¾Î0¸tÇ5°8Ì?õ¤™&À…i¹š}½ãô2w¸ON-à¸U#{€ŽÎ”ØlìôC´°tþŽ®CŽ #JBŽÕæT†�ô–d¬¥’5&cÜÚ…=«EÞ-+5–ÆÜW÷/Ë[Ç\ÉÒ‚úTa(‡–Õv (°ë¬MÒ²–3ñi¨w$$©85ú&/yœä°eZ<+dü¶»ÌyV:ˬ¯¼eN3sÇï#Ëùë's>'™°t:ͣʹÁÌŒK¤-8fk1~Žóºº>Ábõ4qŒZ�»3Öâ´Ä¹tRg‹…B¬ÙsBDf$¥™¥°Py–HrTyÜ#«ªòuMuoOƒÃÍF@Á€°ŠdÑ%ËTêfD‘­ÂgØ] ž“;£¶‘‰Þê}¸Ñäѧ¯w}'7wj®Ç܇=‹j?~‰ÃL�ˆ±á̉èl¥ Þª�¦èø#Ç)B1ëSSê�=2‚C55’tfyLÉO¸nª¶7¥®¸Q[,IŒFtŸÄ´,‰‘gp“à@‰Ž�¬uš�Ìã³CáMVKY#í^2Ð’\át %€^ÁÙV™ï½ÃJ.ºd„-FÛ¤á׺åiÏÚL¤œ¢�|l©÷XE²|•™¸cVÄi¶¼iZ£ Û,yçWÖ[ÒÑ÷Gæ–ÓD¤å“uŽÎòX´Ä#Çh 0p]£@Ø#feH« d-—q¾Q”x!rºá�lÍ‘Øei™ò݆ |QT’jæqoŽÜýáb(â:~¹{é{rÛ@7aXP ¾Rq¥Ê¦m¤©¹R»B§¯GF" (µˆž„bE•“:L/‡·e<Ö¡0èPН{”�ÍÁqH)†âÒ[’B¥lV¹ú Q_ê×ñò”°‚#^¦„ÕŒysMˆ–5ÐÆ¦s­skT1ˆ™¦¥2(ÓCq¬ûë ¸n8òÙ…”oÕ"·û³É�®É�n¶?ÉhMeæ`õplý«-ªxÊ á `üˆ¨9>¥ò³7�<òˆŸnø¶aÇê[~7EÆ·.{oU¹û–ŠÒÊ9jÂÉ ¿êlͦ´è¾ÒŒ�•Ükû¡’;‹-½¦#¡³£Ç‚æ]oôˆn"‡Ô9¤ à‰ð�…?3ŒN B–\M¿¿åÙ­[8ž/‹hôŠu"¯œŸ 2÷»ÒËKÆqæˆ* <—AS*n)"н·�Ê\Ϋf¼·8 ¨Æ½Îþ[U€Ç+Ð3Ó�˜( OGQú÷oé2I<×Êœö™Qžyì[#Dc£\-m¬¢¡9-‡òßRGÎ’Ñ¡±áe¤¦A:”$‚QÅ~ZjU_(Fâ./³NêÀqò"ÈrË2`ìÁÆã'�6°×>bIfï;Ç|&î�úï=£“A¯PgœúI´tè0�aôLÑŸ=>–¸ø'a“xÆJшÏA£De°Fôtå5=UÌgk\£Ú E- \ãÖæhJù””J:�x0¢{Y™)²¸Ge.Œ4§À cá¤OYä²S!¦ê ×OIW�`Ðß# C3¦ ô18c4°¬Ã¡©`ìí%Ò��@d@öq°&}Ý,÷Èk øÆMZZ ­/¯#g[c9£ �ef…fÉÁ¬Y(˜¤†@S;ÒðarٜԱeYèð Ý@§¸wÖU¡HbúÈè+JXw*UÕ°=X9ùêè÷G}�¬•Šš§‹Ñ°ýá—TR¥=íÑ¿·‚èKäàútóEƒ< „(ŽeåTÉD‘jZÎ(¾p%TZ Ô•%ÔªsŒ·‡šöM¬Ç�²0b€è²„Xªgz+ˆ¿œv�‡ìL(M¡í?6ú7Žç¤*ì²ó¢JœÎÛTÙq¤áÄS´2¹}µŸ–|ùzSºõ”ªy–âDÌ*û¤NB•sžyï;ÓîìV�B/«¯˜Í�cST-3’/Ï™>bØ6ŠoÝ£g”iДŒ°qNð_‹BñžÊ“s+ȾT‰JF2áMh‡£‘Ǥèc!)¢ó‘¸,ÄGp}ó/ ŽË¯DVÑӹ܈xÖÛ¯ð>”!s®[ôæ)¾< e§|Û~} ÜÈÅYÖ¤v6´TÖ#3²¹ßÇœlü}5S•æ[âZ$R, ¼+õ†ý·‚êˉ�!jØIb“ðZÅ“BΨÈX S…&ýU�(ÕcbhPø%YSy$yÝ Sãï¯Bh 2÷{QVöƒ nQ¤güGÛìÙ!.¤H?{NçEì}–»³ü>«iþ±džŽÚ_74 *qnÅBP.B÷Ãj‘Uø¢úVÇÒĵf3éœrj®¼ˆ]çø¡.:ƒ÷(+¢ä-›�Y9*_§Ô¹¶Òƒ:…¨Ut]©¢P㤢Í×ß× X�‚忤zŽÓJñeŽàߤ´à°Ö_: ycíËšLÌ™Ë)˜ÕtÖ-V‚eiªôØâEO^—¦Š…:¢QáC‘sp�a-,ÊH='^ÉÒÔ%ò^© ÷•œ`Ư,Í£‘g ?‡2AgXc«BIvØ1aDš›«|ÅŠ5ïñ.ò<ìj,·]©ê$ÛŸÄ|Ž�kå£$S€pNÑÝäÍá'ò2üv\û²ä‘d@¼Š*ëB79—ã±'ÙGÓpÏ÷‘°ÏÚM­CQéñìF˜¾ømûÞ£�­'J<x9QÉÉúÍg/à R}zêMûxM³i7,¥gš¬¤Qì,šy¦¥ö53a±…O­ŠnÓ®H‹Êݺá %™³T UöE»*:­'ŠaÅCM-ξ¶‚Ø¹~9¸!s@ªZ”=zǵ£°ù+b1UZ ½%b½tY‹�âN[L[Ε?Ò˾&Í6V€J²œ'ßÅØ‡NW9rÐáM—:p@zÌGðY3Yšü±DÁ³c¤•†ŽÖ8¶ÚÒÏ -»œÕ·æv�a�ja‹¥áÐ:2Ðb�nøNñOuÌÉ~æ²2©É Ú¿¬rÒn¶†q% Öävºet4 î/ WüQëÝ:”„i1ï™HÒµ*TGXÇ3’Á�x ½^ ÷zê0VÆó5Ób‘/ɪH"‹ÒVï ëº%Á-¯pðyà±Ë�€´ä'b$hÅ2šÕ¥ÈÖEK 9¥³a.X>§©h$5"8ÑrYºá…{g¡¯C­ØC%ë™4AîsúÎÈ~vûÎ{‹NnU`Z—yCú ?ŸŽ.Ь™|èl}ÕrEl“4²�ÞÓ[êÃH#cm�¹½åã‡P˜)ü°ä&»XÁ×üìÈ«"(>E^}мúyõÿWä•*øjïOáEŸÂ‹þ›Ã‹b×õC_¿­{~8UZ“™;¾£D™;ïˆz®57 `#¹>QÍð¿¬w‡‹úNpZ6͘¸Ž7ì3£y“Jgñmr¡ˆ" ½ æEÎr¦0íÅ\(ØoÂöébÄLiµÜoB«.à7a]òK§Ì®Œƒe¡ìÏ8ò§7ÂȽóiG-ØL «Æ]˜è%$özÁt¥´½Ê²ËVæHdçó„:ωÝ(bûº+”ÕËnÂ]±B"«Á¿îeatt±P½£Ú:Ç¥f.g£²6 ÄŽŒ°ÊZöHd—�µ,Ää;²Ó›Î3î�ñŒ;ž¨ uÊ_NŠZrGÖŽ =¢‡a]•˜kÒ¶å–ÝÜÒÏ< –Ùs0[…úÌúCLu‚!ãz£üÇ1–Ê9èÀN�G`¹ú˜ŸVñ£ˆþKœµÅyî: ó1®˜=r.ˆ3“Cjre*ÈX©³bØ=Äâml™C¶”InÖf!¤v헧܂Ă½±5±Ð†ÙÜRyŸ�Š3T£Sj÷²Ý;yàû“arËSjâ."ó9¿é¢r i«»©(ßy0t(»ãŽ &¦L…‘Š¡€ +&ÔlÑö©d(pD�GEK€.}’"_‡Á@G¶I© ‹Å²ü8Q{¥GuÃ}_X´·jÅþœR@¨±X`€0U`¥’*7ª²ªœ©R‘›- í“¶sZsÑ=´¤`!yöÝJ#[ô=LŽ®H„NÚäÉ.u&Àå,O/…?á£ak §nÍ=â/óP‰²ÜõP1 £Z.iTÚ»Mñ½º®Å÷öG+¾×@÷ßß+©Ü’øÞ2 œbY2>ï"ŲøÀ²·jQL�zè{hJVäÁ!RÞNzSá&AÚK�Ôk¢RÄîÏŦg—�33àF¦"�Ô,³þˈ‡ /ìJ©ˆ“‹W—û&{«V]ê9º2«”ÖN€­~‹¡&u¼´«ZpÚ"ƒ3–±Qä|°˜/ÂïY?ªU•�Às“|*jŒÓm9Ç»Y'f"#ŠD‰£Z¬u(pù42g=¡½¨m&×;X>lUûQ°´Â”kp0èjŽŽ2—«´ð理>õ§Á#�î^P¸ô_-Å~7LK,4É‘�]!|�΋ðûpL'ƒÞ¼gÝ�ÿÑ´7_L•Zp¬ qÈõnŒ…ôhQÍÁ0’UÜø±’ä’º›al7++ªìÜ#kÍQ&'GIèÈU‘/�á!·Íì‘ag ûaÕO(Å¢wÙ“P­ŽÑ¸¢l C8Tq¢tÙ�ÃÊÝá¦áa]ionÕ<ý¿é+ÇC…W/RCE9>ܲɒ²�É —m‰­ÌÒ»ˆÎ�ÒjÊ„F +²;ÎïÒå½ÑQ:ñ\Buän(5·jEgh—MS €lÐñHÏ:×sÚ¥}ÈïSiÅ‘rÕjàqYo‰M!ÙÓºV§8E«ÓjÆp~,jØ_�K%}ç4­¨Œ\¾Œé‹ŠTÎÆ´ŒžÑX¿»"pŠØH�uOHP¾çHÐ?)¥J÷Ï»­®€h”s\Í‘#„Uâ->zL”¯O¨r�¨{Ø€2è™fmû$|w´fçDù*–ªñê ^ø¼+ÿOOP†ÖF”ÂSˆõ\Ò¼�Ñc•¤,-÷cvæ0¿Æ}BÞh#üÙ›Žq§ ”¯jg@Ë:g?÷ZÝ ÚZ* ¡.)P9œ� Þ}bD4“Ùªå…îDƇîn‰„$¾ÔE=¹8¡ïE¯5§U÷¨Yª¼ ,OÐÈF …™ë?/ 7QÓÂP¶FÂFÕ,Qž7âü¬§TÕƒÙbO›¶‘�Ã"6 ­f_wÜ…©[+’jüÒ…‰Ô,Q°‡±ý´ßI&5–(³4E. ë΢«dâ„H \Z¼‰Üö÷{}NÝE¯îPšÿÅM§A={:•-Üdh¡¿Eu&>ìO5¡°ü��ŽÿD1¥ýóØ«Ÿä¦¸3·Èž¢Ï´ó¬›®]»Ðoö›ÙšÚ¦T†Ñì–2«rÆP"Oû“áua—zªêÌÙ˰R×�ºözËbº9ôÈ%~º”ÈÙsQé"†0¦™�tð¤(Fß[š™ãY=Vi|�ù´Œ­Àï°‘ãÀÁ;%L–Ç9ˆ´ËOHÄ˜ÎæHw8G$[Å�ún�•Œi ù𯻠@dÁ�±ŽO÷� iIŠ#‘¿P,‹4àEn¸…F·£ð²T’‰»6WîR®›Èh‹GÅâÅèÔ éäb<æå§Žm5š)ÿ |Œ¿¬ÒÒK0ê}˜sù̆ٳöÃs‰3‚…űRÌŒÑIŸ­ÈáÎ,VØp �Gûê›�çÀMZg ØêdÁì}ØïõÈëM'9>ý\ŠlÞâúÁÅb+Ä�..& ­qëŠ# +¡—Ö’É¿ùügÿg‘T¹¢ã—¯%�™"s ÷°Þ_gvDʯÖ+ÎÓl)[3º_µh9Ò7,{ëŒe—ºÚJ¸ñ°‹ hщ Ÿ•“ÈH1¬½-Ò3J:�ŽRœŽRåu8Ê'?üO~øÿûüðë1)ÂÿÜÅ€�âúü¬º~×hω“ú)ŒëS×TW=tE†q�;v%ç*Q25±ˆ¡?Õx);ȱN¢gmÜ2�úÍI‹…yê ê¯Ä2ݺLjE–èJ8ä±®&´nuÓfÄ\K%ô ±õÞ�Ç-#4#•hÛgCsŽ’\!WG‚p8²¾2ôÖС¸)ÜãƒtÉ/× úöX 㕚o³^P‚ˆ³|‹ °5‡Ï²L�±ÂÎcj°*;HZoUq�î}3\•ã!œ£0@$…g¦–Zç¸àaМ—Œ>JbwøT)ÅŽÿÞŒõ'Dï(nö7Æ—TBº.J,�4'�±€ñ£�0¸Ÿmþe}RYb]¯ò¯#R$æÝcWõ‚ ³ xÁ} \#éJŒ‚ØÅõ(óHz U—ŽâÝ£ã8¼ÍÊÚ;½º6»§Ö�rl·†Th®ò•Lé²R[ 8Í1ÈL¿�Žh£ýc“ ÜqžQš'0Éìb¦ßS‰À• \”CA:VÚ™Ký‰VK ÆÂ-6º¨ÁÚlIVÕZnÁ6.ˆÒZ#W÷+Ö¶�qN¦ˆáqFî¶[2<éåIúÖM0ujH‰X£þP§�Òyާ�ÉQ€Äó$RdOã99 zuŒ‘ú$˜ÁYì÷¦óª�h�H;@½ RÇâyêËÕbo1ÕØ˜Ô„µöÆUdÛãļ«q?lª¥ÄÆÓ\Zt¶§TKžjRm¬W7±@�2�s‘‹y…YQa‘–Nð-‰ ~"�Y@ùãà¨x¤7A·Èãˆ�¦Ð˸�EiŽzÓ^ðt÷±g&íø•Â—Ãæ‚=¸õvͨìDB5ý#7ØéªÉíYË–2ÿÜ ó|Õ’:Wˆ\ {®B"2JyÙ±¥ò^×­Æ »¦‰ùÍFbá,iàÕ1&VWóU™‡& —!…ä�9œ9›èþ€½ÔÙŸÏL?*�77kB~¸atóf·ÙÀf�—ÈOîeÇòÒ˜M{Y™€ØéÐ@Ã|£?ëÎbçÓz¡D™"wÜ)Ý[Ë9´da>^öÐh¸-èyÍT$vL/«ef œÓà%$‚lrbLgǑ̉A£°åˆè/%X}=õ#Cs§Æ~ò;—½wJ¾¨j“A0Œ�Î(2KÅ5UÕlÅ-ßþ�BzË�LrŽ"ºOø82Ï—zĽÙ-2¶‘uºY:yåœÄ‹8b{‘''DËä„Ú �Çœ`^º1ZŽœ€u¤œ ¯§$'DÆjZ—ÒÊ<ú7ä„û}ŠœPTÎXË*cj�FK儲4�7È j¸§ŒµITX>Và?Sg°ä²mG{([— 0Æ®ÚF© ôó|RAÉ+΄@o¹„ SÏ£V7<òyc{Kmß"ö((¬tãÀw>ì÷0…²j.£|h�CI=…îƒpÚ ÝQ½ #^Ñg¦‹žÝ6ðui´xHi%%%0ûÞáäBÉ;.±’ûc�Eó‡,;è}1Ò4&áŠd’·+é´i’ôV0¬·±YC£&ÿl¡4‡ƒM�¸k*Ò,áúp¦‚€Ë@ß'èñÁ\¯ å¤£’Mó!5pXe7+«Ç*'…>›�Wt+æs´�©&€6EZHÖ\{ì°aMY8å²¢$±S¸D"JRQ#kY–>×�=Å*p§�rÉܲâQOëz~§x”L ó­áx1š“!õU’j€)s¥Ð¤ÎæEåvŸcl÷²bU÷ñ+Ú_s�賺N­ú½×›¿ïav užº�žGΦ0tŨ̘´Xݺ�«báà%£Ô3óAÏ´t'Œs±)ÁYš×åÍL‡K¸ÕZ�P˘­†xÏØ@Þô”‚TTEF@ý´ \ÚÀ‡‹Î´—qiª®êŽ©˜ð\è �Ò¡ÙŠÎB0 Ï'Û²ªù¥q² 5q$ˆ£0ý;:¹8pŠyœÐY²ì'rqЉE)£åA»XÐ�“d•ETþ-F]<°t•:Î0j8vKÖ¸¥.™GÍyAM=r]F±窊tK©O{ÔG7üA ™mh*»£Ë7m÷g¬v„ø£g²QDœ~¢¢Š˜Žñ�mOTøa©¨Å§À“´ž�E¸‹V&Mhž»¥¥2¦ÑB^¸Š-Óð¬�ë[M$Xßò9Í*qß’{�5KÓ &�9jJ8‹‚Ê®'2ù¨4�hÄLªúÐÏ?:ƒ~óï)ßìýýÅ´³Œ'µâ7›áÒiÐÓ¯È}$u3.íU"wSj—ÿ’¡BeÇw¯ lpw­èZ‰šjR’a7ËЕ©Xje“a%ôå±<¥‰ØÊRG2B�H©ÞÐ\sm¦ö²<.,&ÊYz1]†X¿Ä…95ÖÍÃÐÒKoÞ«±Û†¦mZ)§Àm Nê4è�Þz¨¤ÍjýQv„iag:!üŽîz(âðؽªËú"mDMÍØÐ!£§$uçG…\ŸÓ1Õte•›=ŠL,°|s÷[fqfH¹jWI³“-ù˜=Õ˜'å½¹k^0¾+̶¬2EjZ ͳâ˳ã« ú¯Žgü—õ).ëU\Ö?S^K�FŸÊk} ëýOëýw—×z®ü·¨VS$Þãý·Ìç(eUxì„GmzżŠL'¨àn#à´‘3Wr4?(T}®ÖÔp8‘É„Éì�㈰,h¬!uæÝ‘ Ñ×|¾#‚±Ük]uèÉbJa6°!#L¦ž ó%Ï!±JE%u±šŽhH†©ë÷�Á<ÆŽõå‰tÿhÔ·è5)Ð"` ŒÉÚ*¦-0¹Ìj|È,ÁJ9\‹ú“̘³R@hˆolYýE]7ÉL Q¬Æ‘•1¬°±Ls‘"](ùM°–£þ¬›Ú¬å=s*E‰`8k¦,ôKÜw{J®R“6Ú )8Š€“™bøQìu¦Ó~oºæ{+^Ô`Xo'*DÆçæ-ª5 ƒI³¾[î°Fc'«õË–ƒ)±ˆFÉ„’Áµ°@…ž•IS3ÔB˜ºb8—Ç™d7Çä ÚÑe¼�ÙN¬Šˆ�Ò‡õûÊŒ¬ÉXç Ù;(تLÍ hѽAaå#ØrZs8ë aØ@Ã: Ç(Eè숌…«?`µOi„v1yÄ<7©ü/¥¸eLÒ´’¶Üõc V„³B»ÊÊ]FŸÒÑðUŲ¨9¡×kÜ/JZÆû}8ÆÓ·�$ÈNóþT•U!eNo:ì�HKCe§[æÐ`=L]ý·ÕÏe×�[ZD6ÚÔ™ÕœHºù@á_F|ZêÍÒ²kÀ\ÒT³##÷[¥MähÅÙ"Ìæ’9AÑ0ÿ[g°¯ N˜¤V*mVö#||ß™qÂcUßf¬ì¯¤8×ÚñÞ]*fy%ÿ³$Zª�…¶¡~ékÐ87©T¨É›‘ذ‘9­8Å”—GÙUtÄQÐ�ûT(¾í¤²ª°�=5JÇJ›/�Žc‹Bo$%Ö´ðV'›'\°Žv†pj¡›wÞÂÖyDjMÌLîxéyY²0@ÕØÚuÖjÞ*Q“ŠrŸ\œ#³Á̱tÜÖòá©ýê»±p¼l ¶ÖC¢¥ÇS Â^·¿‹`Ò,\VÔ®? &�)À¯70éÈ�C¯ ÈÜpzDØ%S†´ ãPßãòu&Ø&âÐwÍ1޶–é/s4ÌV³&T¸¹µA }¬ÙRÖSRH>²OaôBsèóIhÎUíX]™Á,°ˆ J$…³I1œé²ÒS˜FCòæúúI X¾C™H"aÇ©t̳ ŸËšúÅ呃èÎD´�ÌZ,Ásg[k>E;…©¨ô×OŒ…J[®fA0ŸbÁaÜ÷\›,í�ë)”ž–C­ ä*ûYjVÌõ‘�%hË{ԪɉÂ}ö5U 5l=ÊË[Qf‚Šrògau'PÉCN¡Ø�aîö‰ºy›Çœœâ–u?žvF³ƒÞô�S‹9…KuŽUÁ ؉ºàÅZàøWÚ ýÚÊGåSTŠ€ÃHX=EÒ‡ ,0(³Ö\ŽÙœAö’‘åòŒC‡�ÜbÜ)írY>F¯pël·‘šˆääUˆÝš[¥‰4ª糪ZZ(O=§.0,Ñ>»Š‹ªWlžÃí‚â*ÜÕ:i*k«ÅM{ê=å|®*yÒð¹Â2 ïÉmH”®ó­Æ-N€äØ%ÞJ6Øðõ­a9‰Â²‘*ÚÁ2œX˜fªFÑWøŸE&¸ÌŒÓ-Ñ îA†°"£'ê hVà¯óËîÛõZ²¹Ê†2.V8­32Ì+yþ^ AÄ+%ËàÉQòð‡L„­’¸�Åùkrqy .ø G2 »ÌxÆ~ae, .mª'®ÒÓ4S2CÙwZ¦|·)¼KÇÊâTÿ|†7Ct.œá­9F'9n(^ÅþE¡ùœÔ …‚µ3ŠGw¢Å‘á�=Ýë1sNô¤cT7…àlÌœn8VIÞ ÂÕ|eöåå1s¡ÕU:¦çæ !³j®}eé ·¬œáuеÈe@í�ñà4Ïd‡Pð(Í1sÂé’ã�’$‘6ÃåÊšèY®oºø”7k÷?•ç-t+ÊPÖ%™ÞlðdÂÏŠToæíwî<2Â0Áé${«§lä9Ù=㲂|:$Ì�œžì-²â-oË9Ød`© 'm,‰XxDM7ü|aÙȼÙDðtÉ¿ºt¤½yÎ)9²‘#|œœä)i— IÄ -’$×"õéõÒf�B’>±ZVBŠÄ0Ù@7Ó€3€Hèï¢À)µ(Ã7ÿ­RÐ'¨Q²Ú¢”ׯWuÁhiç'Éè?C2Ò1¡�Œ>^ iý?–©$ñù(9¨u–ü=9¨Õ(QäÊAçƒVÏ|Ò%RO,t¶§ú�Fëò¢:e‰‘²èy¹ÂÚ+‹üžTTh`Ùh™’û¨…7ÖM ]ݪiøSù«‡ÜÐÄèàÒ§ËB™êE (Ágw­K¤eJ¥:Ž<´þ> ¾ nè¸c­ð<3�°:“E&ãÙL§ábno†é‡€3A¯ M`ÇCÌÕ‰oI(È ïIf͸ñ™Ü:xXNÂãY›ª˜^ñÐ0Ì5vaÝ‹¹$/“ 9B\€–°R© –qáè™ •ùÚ‡å>t(®ßº;›˜6`'$ô"ƒ·o$_Év誮:Ó©ñ‚ÑI·"Ë3ózÔCTt?-ui™‹&ß$é¸À�U^Dæ+L<Íé§v»6wëGÒkÊâ™sš¿P­-w‡ "–•͵œ@_y5*[T}픟ù’Êæ§Å!3g&‰˜Z®xÙrµj8XœŽ’h+>ç<�;*Þ•%:9‹HHï숲†êÒÛÅÉ­–aÞše•mKÏ.‰œ~é{‡UÁÒè�E¿ûHÌv&db§<ÈÀŇ}Ê(t³Ÿc1…˜I¬ñ.fñŽmàn6  ?ÆgKC‡}XW2r¢â†›C!rb"ùÔK³¾Ô‰aúí¦Êv:ÆÓ•:ÅÇ{%6'7¬ÑAÿp¡Ë ™Ò0ÔûÌW¦hl `»§†� õò§ ü¬V›¿A»É‡\"àÒ ™OŽ—[Ç¢F&Ü 7‘!ÍÑÔ9*æÌ"Ëö‹x7Ç9K£Rƒ¡°UãÀL[æ´�‹E”1äG-ØÁ ºuDé妘š¹ßt¹ìþVu×µ+�á'…¹F.ª>ãJ¸Ý0‘P ö˜ çîc±X=aó²r “eF C"…7^Ë…\í™Òzo±n”>§àIaœîq-Øvõ•Õ«z²r=³£ÒD…Zº•+¦ƒagýÑb׈Y¦rµÒ:@K% Òú�Û–¼CÏ5gw©G•zÁ>«sJ´ËüY¶:2Lt!x¡ØÁÞ¨n 05ïÎºÑÆ�¦Á[þ�'YiupË©R\óPq±Ê=æÅ!ék*ìŒàê18Ke”{ÈxtËøf)ˆßâÔJè%‡ç‰J �UkUºyÞûÐÛ_ÌõŠ%�vÝõ¼P­,Ǥ)l&n Óo”åJí‘#Ù8+I2WWŠu1 œµ<°Ç£ä\ôP[^ìx$Š JSäi÷Ä×ciòâ«ñ°‰¥—ˤ#ƒO]"?o`Õ&ç6ªÌXyÔÍ}žfÊN¨XR�j1'ŽƒCun†›:#È BeY‰ß'cdöeBw¢ÿC8a1Ì–> GµF=¢,ÀéÌ\͸°ò^‘xÿ=­F‡=òèŒs�!¹XÁ؇FZÚVÉg\hú¡R! L –aޤ?¬I‘|¼¿.&ÿ÷c„ &Yvðb`–JÈ4Ýf—Åf$ u=b24µ˜Í€(tÝÔÊSCÌ{zQpÉöŽu`ê/ÀlMgGðOº¦4RvsD}¥EY–Hù´Yž`ÚlÈH°ãj;yAglñZNxÅ¡ØE¹æ„xå¡GÿfËßfyèVlV%œ‹F‹ ‡Ü‰�©¸áæ‚ØZ6ÛG«2«ÀÍôoýø4ˆú*æT Ä�Ü>L­$N™§[ÞÄšVcK>¥6ø�JmðÏ”œúböŤ8?šÿ†^9’=Ì´5.0kPàF*ÜøWQÖTªc¬5èÄïµEÞN CYCWò¦À8�‡6á©\ŽNJ˲•4Çâ PÊmGÏJäHp‰u� ëét�_‹ç¬%¬²Ã* ê5©ÅCzí„Ú§Milq ]X7ØÝ„u…¢ª&Ñ|Z0o:’ÝËMæ2µ1{,¿õª´Õ"­©$üqdÙ;ù?õ1Ÿ¥¿²MbÔ¢â6“�š¹ñÂrðîòHó7zž¯ï N¼> úúæÔ•V'<ßeGuÐ7Ê*B1U5ÒÒ<‚ÌÃß=þùÁ�ûáoô“Äí�Ž“4è­2û`”S)æè¦´¾xY­~†0>gŽ"›h 6ŽY�¨ù°L£e1í °Ì£Ð�¥¾¾9w`Y”æF,u¨©–ûF½9…>:•â£Þ»EŸE›M]Öìè© ÷¡W§Ç é ܵˆÌ¨JÍÈ•cl¦áæPÎ>ŠótYEÆ�§�®ð|Y¼¦ßÀwíΧ³_¦kão_}¶ôíÚ�¿|Õ×� ~ £«“_ï%×ÎÑÅðð—ÉLwñÕ�…^²­Éí•/__½|©õyx{û3üsÙüÙ[…?[s÷Ï ï~þùww®½¼öøöì‡k/z¿Þ‚_óñµß¯F)õr¡ÎT�·D�/¯ÿT¯w ìñ¶èì"=n-D�¯¾ÞÞ¾ö¸»½r©uåþÛ8Y¹3yñ™øóÅ•_/ÓŸ+?ô¾_]¹ótg.ÿüpw&þ|qïòôÊ×ÓÑæ¥ÎûGüÄÏ8Ô5w 팦©`±&Fþzrã—kOÃ/ÛWîÏËÔ÷²ÁÒ.¾ú3y9¤9à ŽðS8ƒ°az5Ï=þ3Å7nˆ¹üþ]FvíÙËõõ+î|W¬Ü9|´rÞ)5M§i§´UMá×f_ÍëÉ�'O¯=ß>غrÿá"<ǧ5αøâSøç‹»Ówê{O7¿é\{Ñþâ»+É�ǜݭе7½?glÕ'ùÌþ¹ÔR¿¨nOíŸé¬÷|�vñÓëýµá«£Ç/¿yw¥»~ýô/_j]èÛM_ߘý™&A/޽ܽòëõÃíö³9k3ÍS¿= gWÞMWúë7õ©òýëð÷¯®®=�®üþüæè^öí‚>¯`é(&[Å�Ï�À?¿>îü0¼ò1 @C­]¾2§¡üþóW+?O¿Ø?Œ›ÿìmýÇÛP(ð0RÿyúYýB³[ï^Þ~ºŠÍ&W¿¹yÕCOw4 ¨ús'y§þ|ñhu¦ðõU÷—ƒk;kɵ�ÇÅ÷+ë+O@X¹|ëÑà^&+å/»Ý+¶~,WîüúýBÿ¡�Uß]82Ú_·@2W®]ùaôdpíú¹w;SsÈÕð__{8ÄáGËFk.7nO�²%êHÀ?Šž­ðŸÞi²5¹uóó0¿6£{mrõá‹¡a¾�ÑZMýþìL�?›ïœ?¿~®9à}ÝÏ~ÿüÝ/á*Œñ»ë߬<>.�Û>ø"³ p™%ƒ·ßß¹¦0ÛþY¾Ïæ¦ï¾¾±³ª6úmÃ� ?ŸNׯ\ÿžŽV¼9œc4Mú]�ÌzƒÇß}qõÚ»¯û‹Ørm㛿]Y{÷jçÁ <ìͳ'òîÊ0¼ì Ø´W>‡n«Ïß-^î#|ù9L7ðyI‡ý3xó|2ïÞ¹w¶ï/÷i=PBùþHfß ÜâOÄ\¶LÞ}uøÃç4¼¥+#s§ãíß 0xó‚¹&WWVn\Á-ÿûäÝâÛÎMø5¹©·|í¨;u�«?Ñí‰ú³~ãÛ˸g^{zðkE:[¿ñ2=m×¬ÝÆ?×ì®1jGm§«Ÿwx}^gp'ýzõ|ï ЂŸ^¿ªñ`@¡iB8ͳ§tçðɧôJOIÏ%ñ&„Óü¨)i†tҾΗWÕ4×ÜÉÝþü»Íþu jýñäõ��w„“_ÏücÄEE8P�ÑþÑÜ—³wOn•7h)¤$ôt1Ó¡+«�Ûæ|ñþxÇÍ‹Ëp´|ÍÇÍáu¸Ìñ@!z·¾þäÆÊ4îO>ÿþÛûŸÁw²7š±Ë¿YB8_¹Õ¸;qþ|ÍÚàðÅŸçwáx|“À·_Dõsóá ;{n6ÍæÍê»—W^Ü”Œ]7´Kn\V47ùàÚÊô‹qVæuçõ–ùî+°š½‘ÿŠ?ïÜ?ûG±îcøó{÷Úóß?ûìÚ¯?ÝÏåÙxZ¾„ãøÕíU9äau¦ùÅ`°€A߆Aço>¿rÿ³—«+Ó~9[y·x=Æq_qÆÍÔæÁoðjdg ÿ¼ƒÇ½ÉÃÿâ+�•Js{å‹ýƒùÊ @Š/îN®^¹ŸÜÄÁ®L\}ƒãøâÎÊçß}ÿöÝ… î „Šs@†·J ®�;ù~ hÓK`çcœ&2)WîïNoãÈ;øgdGî‚ÈÛæþÕÏÃìàÆ…vÀúxå³›åÛ_\I?¼ÝÜýÌ?Fø,�#êå|ríhås÷@™¿Z!šóî«Éóžø #ùµét;ùÝœ%OM‡#ð¬×Þ^j‘ÒâôãQüy¸~tå»ï¾Š€ñÿú›=�ºx<íð�W=rC`x¯�YíÏè9 6OR8Ì‹7O²í_§Ï×oÀjÛÃôÝþ„ذúK8¬”‘ž� ç{_Ý}GzÁ‰Ð�Яþ2¼»üëOS¤´Wϧ_¶_Þ„‰\û>1ÆY‡¿S?5þcãðˆD²&_j]ÄÄ®0;W¶×Þy¢-@ç* êÉ[â!Vnt/ ºýçÕê+”7帋ׄNMÜÒäÚä5ŒL�^ƒ4P7ŒáR hûWë’!Dñõ§7ðëõøÓkí+®-n¬”ÃÑÏjGV¿lþâ͵S¹íWÖÌ™tBXt€°A¢þ‚íö|¦dÂF®´{—ˆñ Âþä+p™_�‘=ÿíö+øÄ>~6é˜-عz�ýâ2ŒûéÀ2MóLZÁC~÷u²þ9ªVo7qÓšj…øöÐÀk¨òX‚\¶9R‡ �Ÿ¯¬$í—8¥ þé”*˜×Êíë“æògøg}e󲦪Mœý¹~mŒìÚ•M{È„]µ‚r`ÀR’l]®ëöÏ$'ƒ9 Ëïcøõ|8�îÀc( rÃ4ÿæöhøý�¯ß½ÌŸÓ~>]"u^©�ëb¸Ù›Ç·;ÎŽüõs³—ÈÛúƒa6ý=~§  ¿fˆ5ÄzüB§ þéãŸéÊô°^§òùFöÁ~ Ä;Û»}Ûkç‘„oÀÊÜ�&W÷ò1A”hà»ËOL§Ï“kŸõ§Oâ_FûÝ·ô”ÍëkŸ�†í–b?Z1Â4a8µ­�-®_j)lÿñÚ—+‚D#Ù:]lœ®üþú6lÅ>�“íé‚4�íéö>~g†«tãW¤S}B"øórDâòyeGèl¥÷3<nùtQ£ËÚÊãÞ³[×”é¿áÏx¯Ø¼©%áÉV>[9‡8 }‰ŒýOoïA”Òú™9Kõ¬q<"ZJ“»Ð¼Àá€>Õ´ÖVŒ ²D&®‰È¿Þr΀¯·>_9…·f·hSüp´ò¼Oˆ—CÚüðçöo4Í�CCizKõy¦É¿€`ÞZÁtažë£ûÙÁµ LóégFv:ç §ÓáeàrŠmÚ]o³·Ï~ôE=:±�žíÜœ½%µæ…&7<üeöÆ.$ÍŠÌkŸÉ„/n¬40{M“#‰ò9®ÒÝ>‰Ç:ñyx®Vû„´ðë` èðý ø-ïDo"ŸGãÍêäê�ׯx'ä¥Öóùo7¾œ>_�¥çä\Óæƽ{å¼Ó¨,îvð,ݹ­dË;ÕáH7Þhž¥s¯³R½yØ…S5¼ŒòæÙƒéÎuBn·?jÂßÎ&o:£ÁÓÂ\Wîœ1CVÁM¿-nVx¼o³¥ÂªªÈBIô~Øî£o¯¾zCrÇ >|·ÿ6›?þ•Ú¥ä‚`¶‡u;ÐrÑŽ:¥.[ѤºçÏÞÝ9KÁËÚé/Š·–Š€,¼’œ�=ùâv÷Šýü5¼û`²RÍžî«…¼³9ÿâÕeÀ³C…qŠÒ2FªžÎ^oÀ¶üì3ƒžá]» ›tÛ5,�\ôý­¥’°ÆÑùO02cõþõ2°3kcæ¡ÆŠ…?{øçÿ,�áúlå]þV}¸«¾r÷VƒÎ‘–êéÏÓoaÖ+_?GÌüêÚïŸÇÞXMó{õluãuÔšNÃõýÝon]Ì/§F"zð†€˜”Íø“ï™_tj¾²3&iõt,\*o®­Ô¹ÛìRd’$9�gO?C~Éúêäu¾Ê2ãQp4›—õ!|ÞýsŽq{ªˆWW`ÐÕÂ=¯ãç€è] Ñ«O†¡À#J�–X ä`Ik‚‚R§¨cö¢õØÄoVß-¾ýõF·€£ývL¿È„Ï=ŸRg?¡¬O�œN]ù`îé}Þ½zP}F¤¼iðZý±ø±¾þä¦6ìIÃÖ‡·QÏŸŒ�Ü÷ÅO¯_*‚zçÚ«®¢´_¼ÜwU™è¹ñýÛ‰PžOøìÝʵ_¿ý&k<�䛑ùÆãÓj¢º¾´b}%¹®ÚÖo¬®$æ;a§§ÄfòÀ*0…6pF>¸zA&Œ˜KG>\¿¦)–ke¥ì‹îµ«zðftÔí oÂA_Ÿ^4èÅb¦Ξ€ùôÛ�ê¬�øag5±rP+Í�-?k�'¯�äy©uyðf>Á?cþ3Å?ø³¸~%ž�W‘ƒia9î�®Ä?·“%¦¢/^…+ê?ƒlŸ1n²î%~×0òω5qÇ=Â?3ü3Ä?ï®D_h—¯Ä{YºÌVGpFŒ»È@YI¢‡Jv©«Ëäv;Úwè ß‹/û“_¯L.�nÀÏŸÝ<¤ã'ÌW׸mËc?ý 8•oWTÂÀcßþj¥AÒEys�½5|r›æ0}ñÝ﫤$:]u©užyýô.=<>| óš-“o¥E ÿÜX¹=Ùx»²hžÜ¯³êt±ÈNSÏ‹¤%æÒD–M‰fMƒïì}?§ ]jÑÚ¼»ûêöç½oÉSšÍèÛÑp,W>mš�óçÊN�ú+¬Â?ÿD¼i CÈb×´gÜi³Aèpõ²¥òøç÷Ïç´§€j~vÀ”àJüÍÕˆÛÝUüsE³nËv’¡¤ïV>ûîåU2ÖKÑøùuu–ë ˆ±‚_$°šŒ.ue_ùâÛ7hÃÿ �V+ÕÃGŠ÷¡¶õdsu¥zÓíkzöëæ-üw¿YC0¬.~%~ñûÕ¥D“†þÍ›½Cs©T÷ßVHÔ2Ïin™ÿLrí·£_Vš?¡u×jöï¯d7´Â¨!´�=œ�jÃi ™\ÜàÕÕpüõÁ©¢mx¤y?"ŽHß^{:îÞ9ËCètµK}5ѺŽK®Vón÷3}ÜÐj~¹ÛÕƒ¿{¨™oÅ�ãaU½xqˆ�ý ›Œxõ/~šÁxA&BèöÆgˆÈ7¨ï-㿸wõ´Ši„5ág—ß|ÑäAtŽ ÓÈÜó—ü#îδ°îk++;_̈…ÁÕz‹ºÄñâŸ+¸®Wi™a`³ÒH;vF˜«85¸1F¾¢ìe_®Ï‰™>_}z¹I3c­ˆ;S”u51úy†{Ütn,U;-ÕmÓŸÉM �¯´Æ ‰:Úrae~š\Y){×[©nÞÙŒªVaÓÞ¸Š¼ÞR¬ ±!»?€l•ƒ�©6:¢F5¿Ÿ!6/´ËØŠbXAXÒëš_©`­÷“æ~íÊÍÓ|\€Ù™êÏN0ä»ñíéó·W¦Ï§?­N®ýÐY¼I^ ú/.?Þ›ÎÊ—7¦+;›×&›¿~Fg%ÚÑád|SýÜë¾»rïÚº5¾ñ㜠ϻÃÑí'7&£n¶®6—*ŒŒ~ø¦¬Öpke1H;Ér5Ùd«XaO‘_?›N_ÿüÝåÉ“w0†7—žu.¯¯f(æ®*°ñíð²{•~½O륷*n@ØvïÔ’ÝÙ ‡jëœÛ ÕÐ¥f¸Þ"oø{ƒøÅdrû’í+Ùu—A¼ýYU~óî³jãûÓéö›+¤q‚_¹¯Ï:+ÓéóÛ8!»Åè Ü#âHäÿ3jávB)â3%Y ¼ 47Û_]©)5í/k\8ì?;U�@ì?2}¾“\ÿþc>ÄI.Oן{ýÝ«9ºò ßqô*,uoUÓñÎÛóɵ­_W�žíã•`LÄún@ç8þz'–P’8bÃ} (¿ÞÝH]¢ˆ@!Ok™¢ÉµwWÐvýÆ�Ë“«oï¾{w7?XfO~½=»LÃ;zu­ü�ðšÆM@„øÖHë@:,‘½zCëO@Çع›L^Gw®6�«¾˜Ò`ã­P3¯‘åhòúS�.Ð>ô»_Žo|öæèÝå×s$Ökðyò.Y;}~}ø»EZ/þ¹q©á5Ôüq ¿~>y¾Ÿw´Ò rm2l/H??ÙŒ¾�ÒhyxŸú¯¾<P×Aüý³G·&¿¸AjŸùWâx>¿õ�ûG3ŒZ×fÅÒò#CñË×›5 Àý_Ö®´-m-Z?Ïs~D„AAZ”¡Å¢´€–…ƒE�I†� þÿÝk­�‘ öÞûe7 Ò¬½×ø®!P!dØÂöDñfuçeñ/PÞÝn–Õ»g#r­®pŸÙ’µ7S†,À”7 @†ÅnQ /ù8P Œí΄Co©‡Epg} ïl‰�{®áÿÍlÙUmaßca Ç ˆÓ|·�œß®ð%ûJß"¦åì°ˆb�K®‡‚›¤`~_BçⶸïA#Ý£-J}Í^F&ßVvg`‰×¾½µ Î3ÿ‚W�­–úIô}Ð(p¶„à‚q®äø¯ƒ(ãáÁêçZeFæñ+O¹8fSÐ!=Z�ÁÙÄ=$idƒÂP^l’P�Ãy0éÕ˜�gÈ اj]»,C±b­®a…#{?ו°xð³£áÇ…"3åx#0‡tž¢ªÕ0øæ{Ž[9Fk,X*0+XR�`š_]Ž™£=`Î÷ÜéÜø’àŒ¤Ò¥¼åÁ´Þ¶¸Ç·h¬<¾†I¸i«kÆ�wF÷]ž6ra‘•ÓpÆ{3@²?Ya1sÌi,AuÖ† ¾\ÀÂ~PG;¸F�4ƒÅr>_Â×cb7{¾qŒ•îå¢÷.i6NËNNû{ºüTeɧMS%>â ª»Ëkõϲ†‹±Ÿ ".LÓ–ÛÆ·Õ_þûϪûã÷h“�%fz­tmªó~o¥^Wn–èß#|E ã"kiˆ×mš¢S!²S+Ä«¼ŒA»ÁB�€^謻}‰ÝþªÁ¨Ñç÷Éü 9=}‡Ìë·(žœ‡è?C°Ý­G¸š³ÓäÍœ¶¼ÒË»çýÁà ï)ù’�ïSâÝò:ÍÍÂW¼MHs2üŽAé=ÝŸCL1ÏCá�X¿"ôÓP?ð—å©$vïF¶C‚¶±DZPâJÊj!¿œ=“°•ôÊ–ýmA…«YKZ*)9 @†ÈñyDê))õ*LK Ù�´rKg2�1Ý\*«>}¯ 6G¹y'ÏñŘoxÁ´á†ÑŸÎY@ÿeÄi%2ñ›¥¢úÊ æÇ씢#5™ö5ØšÙ‹>ºQ½<÷D‘L9@õQ¼†æÛuAåi!θ"Ïb݇ Xƒ¼¤%µèƒ!ã¡¡ (‡›vóÓœ°}‘›oei¼F÷?eîãº�xyA¤€Ù¶ŽešËj e×ìÿ\Üevœ �Â=¯‰ —T·�Fa¼Ë¬ÍxXï×Û¿¯ÊËkz"h¤$�f¹Ð5‰#+‹Êfê8Ó²¥’Wbd&È8°ÃCo{´ã_êÉ+¡xß|aïM ïRˆÓ§AZ:W’)Þ§lØáÚðMù6% W½ÊFvB¹y.ÄG™m.¬È–TXúÙ­F�Â(§PnsóÇN3Ê)Dj\ �âWàQ°†pgH¡^eßÏãb÷ÛÕŒtW÷üëV¼mÔ æÛtpÖÁ›8èwÇåa‘¼›ýÌ&;¿‹uQ>?߆‚ ÎAùªDøå™ ¡OðXQô‚ž°(b»&è¸Tæ¶“Ÿð—´è¢ý•¾ÄQ|¢%:.ñçu'qGÕ¶…²%-F,@Æzû=µ³3bØ–àOW˜Öls‚öGÞæBæ{èý‹Ø·¼ÜÈÀ;s )ÎØ�ÇcöKæ¤õ“+ÿ�]5˜/–øÒ²·C§ÐÅ%ã°üéMBdhßKO{à�! §Ásû¸àŽ£¿ˆ/ёėx·#˦ ‹nh¢ÔäÞ]ˆîüÿvУTòTg�n ÃD¾R‰{¥ÝCPå  &Å_ߟIm—asËUTU•ÿaO^ ÅO¹!“š%„ì‚f§È 86kœ†Þ|¤8AÞ3\aT·óC‚2²[ð�`ÄÏSPA…¤8Š[[m;þ+ÒàÊ8QÀX%•¶l5À,-Y¤ž¼Æ–K0aÕþ>Š�õ"j&ªhw÷…I6[Ät9Ï®~Å1 9¡ 2o….câÍ Ž"üÀÒ-Å‘ìK7L‰éœbL—vuSKERL¨Í¢ˆp#&4GFUžìÉl‘uZi/ÆÚèOj;Yˆ�>Sɹê~«GÉA¾[Jàp5¢à‹MàÓ\íÅÛ`ÀáuA�H¹Šyv‹Äû6Ùõ:NÑ;9î„8d`Ñ›gña�m{.ªZ¢¿Mu 0µ}÷Û‚…©í»xj�ˆ¨�ž;~çÎñ0çNø°„Pá•ÜÐ\/Èae{1ç‘E«Ã<¾‰6=tÈlÉ@ã%ùd¢Ï‹üÑïQsû»‚ø¶ ݓك Ð`¥’Êî½q"¸³ä®¡¹6ò&ÊŒþª7åßCÙã�L[/ïa§ÖÙ˜â�íOÇÉü_ìOØî8®;-ŒLL nÍw…ö¤\}˜Áží`´²ó¸E� i}{©b)ï7G.æ˜$Ù Ùh¹ü#¦ƒø° "Ï ÝœŒ¶ÜåD™ê¥ÖÄ~šË¼,G뚃ÖX˜6hu³1Ü,}0³ä™ÛJî­a¿Ñʵ˜²ÓcåÁåz³kšH ¼p/‚Œ.žÛBí.¦°ì@I�2�&<ð:*à]o^#�Õb£F •ÏijoàoLŽÒ:±l·&% £È“ò²t�ð~©u1ÖÞä>Ögó3œ�€å�ZªÀ†ØõøÝ�§É¿H曤U{Cª¯öÒ×É+c´Jƾ�ø¢ Av§Aýøû³ÍD”-º‚�­ lŒù'ýõ’öÑ>»p€ýŸ…cuÞ¬°Mb^´Ì œü°¥�gòSó ŽÙ$æý3§¨kÙ$ŒêKöž$»[Ì»A›j)êjVZÊ�‚àoDå>�•7"7òQÇ �=t쎎0áŽÝíëŸyÔxT"¹°ŽPì{áâĈïz«ò[ó%Û—QˆÌÿö–Ä(›RQ_’?Ì”‚¾rûÅ«_ü& QÔM¥EAMƒ™>ÍV¼WW#»À’Ïk÷VÍôó„ ãºþ}@¡B}s9 &ܹòwöCÉ,)+ˆ×7k7náT;´W÷S„t¶“® ‰ÅoÉõuPx5.1eâíyõXE)‹¼áçç·5$!Ž{ !|È�á}k”! ÀÂø½J¢^¬-ñŒ,í—ÕWhnÿÔ²7ò}{c ÿåP|±Ê"ag2=#1�½¥ªˆ¼‰d2EpU`Ôdš �� À Þ&s~bšËš¤Õä5ý©×ß±à£blÚͳ…ª¤šËm㛪â{ø*0s¯ãẅÚyÑ7ĶכánŠa 1ÛÆùbƒ‰Hö³mÃM¸Ømv²Êï,ü4AÁ#Iï•+¢5ˆf°öàÆß"ê¯�‚¢§/-3£×.Û&’D´.§¯¸leiºaº§Í,:¾±îÜSõºÝœ#jˆˆ>olf/6…U B2v¿7�Rzâ4Œˆ¡ÚëÞžñ:>”Í÷¼ ç×Gñz/zŸ�§�ið5¸)Ãv/aY;‘Å2èJßýž‹ÝÇnšq{C °/4»mœ¬¦FCüµÚ÷Rà›ƒƒLç¼–ˆÌÑ{œûÖºqo�¯ó"üü¶±- £+ õ•mÅk„Ÿå1õ $©¢m“\K-�m2èêlÝ\Œ·Äd4xåCû|dfÉÂÂ|«Ó¿‡ð=HŠ]h 僱Tûļ’Ä\9teS½®ß®PhmÙ~Ýä3™9ãñº†ÒGbIL›xeNþ…©Ûdv5@—ÄC¦åå*œ;`ZÀöËÍBæ/ Ê‘j² sÎË|Qï§M1»a?»l!çê~ÎÅeOL»‚e ˌǬ™þ¼œªŠpùʳ.õ|t;yÔ7pÌ*œ&(gXGXùF(–‚ÉCsö)…®5€c}ii²Q-¬„àÍÃf{5qoÞ{HˆišÕ(ê{—&Œù­YÉ+Qf7ŒÍÓw 4œÆÞègÔ3o| !2ô"†_ÛÄytPË­KròY†%%5’ÿeAH4¿8ÍgóˆÓÌYÖöUG€ã91¾.jŽo–ͰØýEuk÷ ¿y†ÛY9žøèˆê”ÿPô›‘Œ× PïRoÌ®‚¯~/±(»½õY� Ôd̶%h? ¿¬©Ê 'h¨ú·Uó‰ï d ÷�¶iïJc�è½£UCp¶ñ‰�kþø7ècöHÒ莙8À‰\Nz4WkøûDˆO?×ÌSbWQ»ûáªà•ÍSÄX;½Rõ@÷ÛÜu¢ü›ÛQÆWÕ€ëÏí–J½Ù¿jžzÈ~,NÆÿ`šá�‚­ÐNÏ]Jô!ï#úpZO¡:ÑNJ ]EÔ¤)À3†*/ò§•-»ªÇÁ {=,ÚQKÜš�×½œ];[´´Aßc�¨ÑKc}Êy›ln+Y^GÄ&{Jy”ø¨uòѲƒPî±Gþ_G?9É ˆG{­3v?™1Φ8\§(:tÃâýÍ„çƒ#¦¯&ºˆÃn•(dz6Bq|Ëb›øb™ý‡Ö ÿ +U!¾’‚Ôâéòhk|âb’XØø7ÍAò_˜°Vþ|j7õP²ƒ0ñv.”£#ÃÑÎ1XâÒ�É¥îˆØ ã™®Òe’ ÖnrFj{nûï�ˆ“>‰Ÿi³N‚]=kG�»;T…/}¼Å�%CD,|D¶G1ß�–›ý$)áNž¶ýüû4êfjí%|‹=Šùß^�‘›‚nëiù¢~ BPà# )[cCÒ™TueAåX�+Ú1<êék˜ðVK�¼nO­h@ØÂ$àĬ?^㪱Cç »27ô$]™Ké~v Eëæª@WüÔ[�¾ÆQì(?ß/G$Se¦8^C2u)¬„¢5œó$äJ~ a$Ž¢È6³]‹1>Ó²YõX‚( b 7cø2�óræ§½Gæè½ÂÆô‹X”-C»œôcÓB%;rÄ ¬“öØŽ8A…«§])аU´êÉU¡R",�îÛ)få3oVÍdŽ�«ÁE9d ȸ{rþˆÅšc-K¬QÜ¥ œœËT/žqñKiDœRºàñûÅØ£x‰5@#ãx¯�Ї®)Ës+¬ãœÆ9vǦI<ä%œr‚èqjÊÑ…Äþ¿»•„b²«¾Nw‹|]RÔWHü¡ cô5zU£í ZhÜ Á<` �î'iÿwì ]‰È´Ý/X 0mÕ\—®`öî€_3R},=“ËÀ �Ç�ðØ€©“ýsm€îð¦NˆÉMôB‚†ªQ"àp�rôÁ��'åt©î‘y"aÉ{h½_"?´ReÇ8nÌ‚À|?åÎÁÄoY‘�œ&r$2#$|Ýã„™_ÁBŠ~J…5ßÛÃs¦mžé{0E³š§À�q+ò+$iÞ/3Bñä×’wYÛqLØ’ìÎV‘TŠ@. ÈãL;ÃOÄ!3¤ŽWìa l?Ç›±oZˆòi1ÿd¶r—PžñA§ü íæ4Î,þ |íXÉ"xíuø<õœù<&tͼ¼›YUö‹ò̆ÝÐ�hˆ"vh„WgW,N’0èp�°‘=ƒ;.ïûtv‰°+l�ÚàfTŠ'ÿ{Iüûùbl}"8ÜÀ²‡0hö¶°a¾½gqr¦º)ÿÏ\ÌÑ®ãâãË4‘L“o=ãr¨?)ºá �lyü÷lßçÉ);øSè\ |‘€gIÖë€Ä à>U0цƒ;UûHÇIFȵe{SØ€ÑŪDltÙ³Ok:ž«ëR…� )Òù 4õ¨I_�·H@ÖB;ÌäqZ‰Ï2ösW­ÜsüßЊ?†#‰W=‘É'´ñk*®.´¦°ùu5Õ›nu¿ê=_nðjÛüSÓŒˆ>ÚóÌÀKÕ pg2SW<ªC,"ÂÏCÜ˨VG¦)JKö_��~žmókQSoŠÌj·N%v6n|Šnî]˜ãÈØ=Ï€ªß¼5>ùÎÕP¼Â÷¬¬a ŠÊ|‡éW,>}Ådijjs.Ê&zÉ$ Ëts,X)A|Êʇ!ðÌ�¡Hµîèö¸ÙH:®F¹Ð†ï�^og2ŽüW+R<±™]w†kÚ_ • jß²¬�³ Ï4B�×.¡_“\|ruìŒR7‚h F#ƒ{Æ)Å”$ŸÞ•|üÊŸ Ęö2~ ›­ÖEyx„Ǣʠ¬cüæ]3�6oÈ€÷Ðu¿�*ëZW³ß¯Ä\œ�½,F1M…„xÉ.dÉ`¼®$AŸ�þW>$¤nB•BfܶzìèdãÂÜdÜÇ&~ Þ=Q]ƒb|‡3r�A»~ΨŠÀ´aØñåý$± Fz/W+î(ò¥µIcžƒÀÚjUPöNÓ¬T”�æe³’Äm8² ŽâIÞ&\ÙûÐ Ì�•ù»õÒtœS*•®ÌgeL?ïâÉ«ÞÜ1A`x†*Z'2G&-�Ó? `»i°IiÇÜ�—¨;ñ‹æ8…1 X0,"S—p–,Ùcµ]nè’ ëª ÅåÿCTHH`Åu—·ñ䫺 l�ct©Q~‰¢¢‘ƒl8õpSï†@ÖÁ¬ X8�EdæÈK�¡˜ï€$X; °vÜS´Òü>a�†z­,y‚“&Ç1¯&¾W·3R[)æòE<Æñ‘ž²æ±3â(è©W�5RýSJ4�ÆÒ¾ÿ$ô:H�9Up�Q¨‚y©WCŒ‹¥¦ð‡ÛÕo…_Ïù§ÌÛõGª¼‚<õµfÒä~^À$§Ño‚a¦9ÆVFÿ¶†4î!c¡çˆï!"‡܈Fäz1… 3qˆSLcB¹s-c'*©¶B�!ó& (½‘uÇþxAo¨¡ô oÐ8@*È€ôN=í'zÔ6nÂÛî³cÞØ.,òÑäa»¦ð ÈÌ~�jîÑ0µ�MbT¥òÄh]TÖúú–‡¨®™JQ0„2*lJÀßlÒ[epÏ <¹¦|Ï|Cm— @L΀Hzr(¹�˜GT¡2詘¿Š'k~ybûÓT2‚¨•OâÉŸ�ÛN“©CË·u-¹šó7�?:ç$âtn¯™pzQÂ�Ô‹r¥žÔ38ˆœ7û2¸FŒº�çÌÓ¹0ññ\“Ÿú<ÇPñkÝ¢ç4º2eÍ*`_XÛ…½;Ìù¾^Q½F˜öA³ÖŽLt2p‘›*̸ÇçÓÀä—[ÈùB.�Ñ�ÜPe˜ìà·hŠιî¾Ï…cÁƒ,n¼É§p«¹ëKÁˆUØ^|.çñ¥ùGÔ’X�€.îú좷ݬ,ÙBgw};jœ~ªèPKÿhc]X|V‹±¥AŸvÛü=ˆ ¥Á+Œj±j&h_œssâMß¶ùZ<ðH^ê;%ÞT ¡ % — ILUß¡ãïh»Ö®4–fý}¯µÄÀÀp¿ˆã%ÑèÖh4(!‚À0àÿŸ®§zz†ߵΗNf »ëúTuP<_[‚7+Cݰ*;g;u‹ã€kÁ <Ëš†à”é+�йø¦~Øÿ[T@Ïä]ÜX¥àåø¿>‡Óq ÎhX¨ˆ7:9÷ÎÚØ0Ï_…Š¢—ã¿ ;îN÷¶‹ÐØ8³X¡F!�c�KBç!‡ã‰3Îm]GV…ØÛ2_Ù]l”'2çÿ¯ŸÜ€ô8røï/¦�FŠkF—ƒÂÔypGyw÷&YäeZé#ÝpþÄ_3øµ>í}v™ô’Íši&_Ðö¶(C¬—…#¯©`¶ØÁ·/kÞ5ÜJq=å¹ÒoÀªÓK“ R›ò¶¿�-IÿÞ?¦(«›Rw ¨&„Û œž’ÞÐhtJ`¼qwØÕÁ X°�øR§¹=+˜Åxo€ôc¿ïNè £¹µÏ�€ß'^’çxgNWˆn³¨=Aø8ò„–!—†e®·¸ÃëzÀ=å…DD –O¨ÿþó¿¯ðJ-Pg"ÔÆê¦@A  )Ò4Dh(Éäp؉Òg¬ÞXÕ9Á¡Ú?ÔvÎO57¨XÒtëbãR­M°�×Z±dyõ5–‰Ìã÷ÓTƒù#v«`ÚÚ’Ë ’Á‡àH0£õí)›°Ÿ´« ¿LŸßX>"âB©F›»šØ��|ÑW\DQ‡7’ƒ¼T”\û¶nsæJô<5õØ\tgxs]Ã�ó÷­E•­¼L&'¬‹Ä vœ^¯Í�ãÞG·6iALú ¦ª‰b†c­gó»4s§Ñ|‘¥O€rïïX«b ý«3èÐ%sÝySå ¯]KóšÛoOS“%‰ }&ExGo^ǽ—§)9àW S>ƒâa‹Ò‡�é$_V‡{M�y;åI¶³©¦’TÉ 2q? h•2_»úÄü‘K[ßvº¥†ãÓ—^Œ ¹Ÿ¹�âHÍþÖkÖ›tŒŠh½þ¯� ²^W RiÅò±9ì‰ä^‚¥F›U<)ûüªDÜpÌ|YÄ5Izå�j�ÂaAÍc?‹çT�CˆCa¯„�–#í�ÏÊãÜ÷GÚb|:ìéØf�ÈW7а¤¿SþÉ=[¶SÎÃ[+�ÇÚ‰ýºØ¸‡6×üà‚ ~ �Ò¾HcÏ˱$ÖÚþ¸Üó;¡‡Sy¾tMwY1꿚êáF¢¹g>M1�‘è°^„‡$v·º©‰Aìã•ëƒÃ¼]J>ÐÃÔvÁ>Aºü4“ÉãP¬—X9Ébb~»Ì^«ìJîáËc›Iðæº—‡�\9~Ï7)¤å q¡~Ÿ5a×)þ=I Êl’G]Vòáiv7ê ãÝRJ(³ƒ<¿Ü)Öf‰É¸KéýÛb ¥â4MsãËã 9Ñ?~ìo·|›v>LEI6ÕS*‘Õø>Ž–Ó­¸þ¸Ä‘QâH5#´ïÉ1$—>ÙÂߤØú7’Oý4lüÐ�GbšÌÙÛx9 àøx.P7óïî¬$1{Ý‹Y…@u�Oáy­ù*QáøìL½¼ B�ZÞŸg)Q™Šn)Ù^¦¨ä¿0â«ûÙ´$6"&Ÿ¢ÄðLJš—èÀÐÙݱ©ÁA5r¢'2¬2_…€ˆÉ«I"³Šá®s�k)Ú¹ ug r ÓÊD¾_.b�ï”�9nƈœ"J¶O%%GDm‚?� †b¾epHíô.sˆîh›‹Çó+n”‡êINòÙÉNÓ¥tCS99$þèå%™Q!¢·7|¨j´yiL`w[éÿ ö¬ ª¥Ø»mãsaCm`\)JK�Éi?šÇIßpø%íÊ.EÄü–´�bW*d̨vÏ\ MHR·Ñ¨Çͳ‹;j5mëcËþÏ÷½V7ô~<”�;n Ýþw–�©4öðŒ=7’ÍàËÖ°Æ þýÇ_ƒpwÚ�"h¼×=1ÌBér`¥2Ûm<—#øªá¸4qy¹Ÿm†kPoœ/wÇ0"~¾÷ão£­7”\ŒQa #õ[dÛàÅ=e# ¿$&[ùÖl®¥ ”œ»S™ „ 8²ä„êþ‘ÖaÁCÊ °.$ ËœKÓâð'µR«À&¥—6 ô¶÷H}«zž(ƒ•Ä2‡­²Ä’ì� H!Ðy*íÅhˆ-:¬dI$ i°0D·~íui§tèJp! ÅW=9#¹ñ#©J†ÓèœÚvÿ’xi$«?�@ÞöòŸ{v^¦lÂâ{ݨPöw”!˜ë…νz‡€º0$–ŸÁau�6ïRøŽ>Ã… $(¨ïÌzëÝ,m¦Ø’/(®À�ýçN$-\²ƒž9�Á‹+¼¹ý¢­ÝWf¿€+Jvs1Ÿ ZÕ´TŒrˇL…˜UË ºbpQdõ'ü2H«%:ÉN>'aÁŒ¤ÝG“9Æ‚e‡§G|¿lÕp:É ¥uÓ`öÛÌo�èºÿó-‰` ­BÅBù‹–£¬‘0.Ÿi>k%IpÖæYã°CWÈ…ù�ã.†µ®\ºý”ºJk‘×|Q^g½¸áUctZ<=Ñ­ÕÊ1,Àµ0vÏâs7÷Cë—¤'¼Vž¤IX;"g¡¤7¤ÎLb«£ü’+§O³.£Ô%Õ0G ®2Ô-L¼K$ƒ" •þ·îÐÐ ˆÛ¥xéÚ,ƒžÕæ`CJ1ˆ ö`ÙJƒœœæƒõ×oµoŸ§~sU .ì�T(æCà&ëNþZôY€ð�DâpäãΫa™¯oíÑpä¤_íƒó aAœ¿8Ü› /ÿý‡)€¥OÂo3lF—ˆ4$O'4ßIÊn=¶f’Ö©ÒÆù�¦êk¬:íO¡Ü¾ šs€l}ñ˜+¨ 5Çl¸0¸¨ßGÆ;áÔƒ-†3Æ»˜ÇŒŠ6"€?ñw=4,¢öSMj&FÖ4çú—™ê§Æë‡OO¥2íOÕXöµS¸¾FiDóŠ ³ #²^ ÒSC˜«BE�s¬�`«ZJ{¹ê=(«¬2q}Ë FCž|ð zöφ�|¯*ŒÐݯ^2©BnI“®Bs>ˆ¾U¼ZÄZî“:`IÞ.²Tª¦®KЫY<«LÚt½#5"Ãd,µÁí�#Eûælºh&ÌŒôßÓ €¾ŠéC@ȦTh©;ðíñ”Iã¯�IDôü«øñ�NŽYM{«’&—Ó^ÖÒ*Ú3™4†Ñ­Û}A5Φpw6 ž,ÿ *Y >C<‘¯6Ç=>³Z­0®IMýæv2£¯iÞãÍöP–Á¯%Õ—$!Åo­jT¥�Õ…”±w�û FµÈW7åñæýXÍ^{Fû×ŒÓÆ!³l9öX0̪i�‡6d‚`Œ$? |Çl.݈šö’ Å¥ìQ“Uš^vAg5ilÊÖÜ8amÿñïÕÍÓTý¿]­Ú™D™wËcžù¼‰™0×À ЪÔ^˜iƒ[çrRQ˜q|b^E 'Ì^VL‰³‰}px3…e$ RŸ�;šßðªrm†)f³¸F­¯.àZe£| kë�¼ï$}ô»(e ižnCq_·aVëãSûëàÁ�Z›Sj’Ùð0 !v³ d>¡éýy‘Eúß]C[HA’{‚‡aW<ÅÕ‘�‹*5…a‹=Q³"ùÝ­ÁÏ#‰r§�U¸3 Ô`. ø£×ç—µTI》w2×*/ºï€Á„xÇÃXÀgWƒj¬ç—×§ŸP!*ßÊá|Zrº‘’-,Ç5îMÕjo[Ù½ _]�ƒüg ŸÁ¿MP·®´Ö8Nö”bÙÍRÃTrÂ(-§É�ø±={W¥BÂHœ¦° zŽ;/Œf‹Âr(§0>Ueì�"¶Èm� Ù)¯[_c‘’Wš-á” ~ÒøäÇd ËyTú²Ùgó³ÑÅõnŸŠCžßLœ&%G#V®ÔRaïP # K°Å}:¢NzÂLÕúZFI<­Š²û·=p£«›[ƒ7ý ÅÀ9í:~•À¸icÆEŒözW®[Y3ürÞò'°+þ ûcÿ¬9N½nGÆ�ñÝ‹tykS@d:¼5û�·BÄŽlÌ�íЦ‚<tH»xs1ˆ�8¡ßxf.ÆœþÔƒ#BA·©Agué ‹ �B±°áðªð,H’T¾™H+ˆ€Œ%…¡ç�¦Ñ²“…@ Aµ[æÒÞ^ž£ t*Ë_îÓM3¬p}Y¹sž¥Rt•Ä ²÷«í6žâP­8<á¼â éH™øé bww[™"„#ˆ$ pW‘ù¿ÿÃy:¤�>»¹$i©[UL®àlò€tÔ PTY­a‡îÞïî¶ÅQR°9¸Ñ?˜ó¶ 3€Þš–Õñã ?S?ŸÞõ;°†¸té�WIÅ„ˆžŸ8ãLã¼ï6RÝenN<ÝšMaµŽ!õÅL7 ¾ZçlB´Oxjý.A-#fž¡ÐšxLïx°PçˆYÈ¿óÚþ½Û¾q#7ÑäËýøºPó VMü�ÔƒêGÁ_‹³g›AÔ2 $Fûý�5ýÛ±�âÅ؃Ÿ ÂtDÔ:²§)­æ¢ÎžçjL¼¡I‘¾VtIy‹dDlö�>F‡}¾éEøKæfMÝ0%ïQ6»zÕŒufS3—ò+Û![´µc PÞáò´#èçLø7ZSæ(ûœ ˆÚ Ùf<'¦9åÇ2_Ó >H º“œ~rIä—º¹*/HxDiÀª&Iy œ©#‹æŒ(éí )d²!ñ²þæE� ]È0éâ´ÓúHh„È.¥—œÙÉÕÔ#60 =1@îÕJIwI‹€ØÚþ�Úç_9Š›<àZ½  X‰4–Õ$ ¦bsÝCU±ƒb~â§dú4ôh°µFräúÀ ÓY_½ñ´ƒf]E€Ž²‡08 .‰‘ûexöνÅcˆH5Fß8¥ûÈK  ¹ÃÕ4X|�¢waˆr\�l€9§¨Á>^ïÚ9”œ·Š6 ï'+ÔÃÉ¥¥h}Iü½Â_¸! ºgâ/˜oLÈ•ö-Ú¾@þƒŽÒ¡Û ÇCyÀš‚üôÍGÏâú~s”ÒÙ/QJÿÜ}õy©*ÉêÚ=Ö7e†”0k�V€—r8zHyéO´+ë\†”®2ƒ7¦µÚñ]ŽÊPáV�j^Å þ‹ �¾rä{ŠpúÊØ}U4óWºöŽÆ0šÆ1´–!ª)ÐÙ>éx„ÓŒ€éK‰‰2°ä©*^dàSÜêý¼zr¡åUò<r¢FvŒ8‘ÔXÒ‘0ìTdeÕ‘…ؘA®D^ÊJŸf¯‚Žn@Àp…<$2ņ߳�ÇÒ¹§° Ì–š@БFEøÉJÔ$Ay%’›Yª/iºXõêt&ò–W±0’f–aé‚… dO¾l1ªöü#�—Eáक�R¢=0(]²I!™#‡ß£çμ°áÄ|,dÀÒ§/#�ŽÚ’púÓo‚^Ѩ’.;fd4 Ù-~÷8!ƒ5pEÖ¦ š»k#Åæ³ìFô~/¢•½Šdv솀€ºßúº©í}ÿ¹5/Ôƒ€yF¦ÒBÔœíò伄*�%(ЏÛ—ìÑxc:EV&×/¤zfL3£�f c¦Ÿ9 L­.Ø}©Ñ‘½gÄXR$¨ªZn¸Ì0H9.û"o;u‘Gð¢ìSUGµùŒØõ °G²’¥aMß‚G¤É�ެ[Äiž'?|i«0þ ¬Éû-ãìV±n�¿»·oæ™¶ój¾Ö{£�Çá‹Ó,ߨ�±¨LAÒì'"¹AKtX‹TðÜüö&Üê7FñìÃ.ÄsO XãÐ ˆ1±gÑ굦ö×aÙè™Åð…œ„z;M §ùèt_ð“m=�¾ÅRŸ X¸ÚœÔ´O*áðMú‡ã‹Š8´TdåfÚñûÔ;4©Eðc;Ÿ_N¦Â…>Kx®Ry®ÄþôÎKnˆYÝõ>½±=ùa¡hõ±�ŠHôÆhB 7/þOJ5°©¼Ð~DÈ�|ÞÛ\údyԛ쥽$IW¢^úÓÿN¯&ŠI°ÁâÈoÁîbŸGú´3>‰¾0Уvˆ¤êèzOcèƒ"ê§)R€ýG6v�‚²³�fvügv,¢5±O…©œ`ä qÔ*ó¶‘IñÿO´»ÖÆê6#‹U­µçç]-r“LÂ,òì!Vk/j6!7œ×m$×)ÛFFg”°i«�þ*Ò\4ŠšF´iP  5#̸Zã"ïÄ3£_TF$ÓüžQøâ$vVÞËꇿïó+$ã‚Ã[d©ÔDJHd+éqŽPäŒ30Óâ÷ k«U”çoö÷ ¨¨+ª9âE-¤Ÿ8Ú—ÿ2?%|ƒùUð-É®ªÖ…KÊCóÙ¥tß ]wªì¼>‘ŽØÂþÌ•2X·��Ķ?,óC¼9ÉDv†?µÈŸ·GøÑ<áUº¬ÉÊ‹çÁÖ»Búh¯žËÚS‘‘ÖÄó[Žç~pã£Ò_ÏÍõ…Õ&Ýg&T(K-*y»€Gg£Ë†9hþH˜7=üõ½Â`JŠ¡ F¨”غa�…bÐ�È‚šE ƒõ².Ý¿Aš"»œ  TÔaHZÛd½èƒëfSåB¼whPÛŸ*¦Æ4‡hœ",a¦O¥ÉÜ®)áćª¹{;¬éË·(?Q¥ ¸v¦o°üƒž�È+µÓ+ÝÔO]¨ÆGŽ<3 Ø,Zæ’íªÖIjåXÀWñ÷Ì�F³}¬ ¾F©ž$yÖW‘•ñœkêÑ­ñ%¯gL,–bŸ„P[8»nõ6ñÃJ­yñé°¸êOdFùéD=º³ÛÙX¡üuǽû5Ë;ûÇ7iòzJ²cè(ÉÞaOøUûÝi>+DÎÖ¦õ k݃êþ –í‰Ðv¤EÆÚÑðly^‹nŒ1üñ¼�­Ï‡a¤5p§ÂÑÍ—p'f{|øÕÓTBri¸À$¼Æ]Gý̵pž¤å3VÐ;ðpNï8N'§'�#Êìäó { TàU|)=,È0ä'hØ"CÓl[Ø{`ÛKWø;÷`2ÜZ‚ÌÅ©¢X;AÒ Ï_°R ð ³C"î84 ~9Fpm ï ÌÐÕdîEõŠê†âOàù+䲬�†’;T+ Rð\^èšéŸã\0/ŠO \Ñ‹æ½Ä rí³]úe‘ƒï»îÄ["–5ÜH¼“ÜdöZ¾E 3 f¾›.G§iÂfãL4 8H8šÓ0kÇeÝ:þ^q¿KÎw/œú¾¦kµ£ÆÀ³‚A”¯„¢Èò:nÞù1Uªg×Z—ý ©”\:²GÒS½1nÝ]Tu˜Õ:r&Bh¾+?…Jt¢ü)5w³)HuÂ%~èòÐ÷xV= [÷ {¨V0[ÇÆÃè„ñ‘åÁLÖZÕd”€,ý@é‘�-PX°3�å/‰U™š÷Ë ëÛù$»šºÝϽ럜u4¶GVò×`Dái–•°Itp¦�¨šAƒÅˆ¥B1e�†D«{íüN“h�aFƒŸ¬–˜ÃÏ„„|PÕŸS3‡¬<«ÏÒ4hˆŠá>Çt?/Iwòd ³›^±à¢eÆÚ‚pSZ-™2ùE!­‚ Å ?Ÿ@¼uÜÙ~XÏ[ºÉn.9îîö(çÄRg)ì³ÓNRï˯:çÝ�7N²äœ”â™�e[�¯ý¨Sùv1ŒÞ¦«å }iI´¸jçuÂk¬ëPˆmÖ‘$N°®ª~fKØÄNô–ûzB˜é¥´˜i ¿ï{Ïž€�2KNSXáNíôO׫8-@´Ý�á©^3ó/`¨NçÇ7Ÿþh{N¯˜Èõ~áúy™+E¢¬j½˜& 4¡i(–ò€š�Ôú§zˆ9B[’i-:s´ïsqÏMœünῚãĦmž©â�MdXC„];—]F±õ áRÑ? @|°øûU*ð¾°Å°X!·¯È0üÅÃ2U„4Z–«Ìàvæû€Ñ«™R\B‚«¼ ”ña¿’c^?¶©mxŸ0Ç×}÷�µv9Y0Àõs>¸Â ݿɤn}úwB”H/˜´ÍÝ@z!;0k< Õµªö{1xZŽÛŸY-ãó¾?Ø+œÖ¶æ:ÝM+6è�áâv©¨¥IŸÄ—˘ôF8:ŠI3Â;Ý%0ÿ•Ë*eTç¦:õ4Ÿ•¡Š„~žæõLŽ��jó˜'›vÒÑV<ákf ï²Ú^ˆØ ér÷ë\Â+¦4™Æóx'vÏIÚ0„øÐû?à Γ‘+UÏõí¤’Â{x•9“êßÎ?N+!ù+`Ü[Ɇª,� ýÄrM߯ÿ8ÓO}î BûO>‰dOð{²‚5jh4î×q¿·ä…ÞŸ9sD|7  §p°°›Ü¶+”MX1²Îl /ÌŒtë.ŠhZV·kð™¶PJQo¬Dð-uýˆ½¿!­Ó{Áðze€…å?¨kÀ’ nO’i±ƒ\|j(*Ì?ru¤ OÒsvÝט}v X³‘�ÀZ³û£‹’9€Ÿàféms†—ø¬ ¦.Þp–ö¼¦#ƒ¥g�ëÛœpñ&fn*/"�ØÏ^Z��aýI;†þ–BÊ5qm”€MˆþÞ^‘’XkSSLȧ킞“åqBoµ{{Š¥‡Tr;†ŽÓ‡Ÿ‘ç\� U…K?«=0m¹«˜qÀ`¦˜³Òƒ<¢hÝ…%V|íÇÅï\šö�ë5¤ÖUêvœ•þ}F+Ð~O|ê’‹?N _39[Fôéi§;ª'É›Ž#m»ðìE#jÐàØVÕ±Òbÿž�uIo‹ëÓC÷鿇1z”ѬâÈ蘌ðªm§`™Br2 gÁje|Ö%s=åŸ 1Y�Wœ ²>ÔpÈC¾æYâ¦hÃ!§B†j‹î{leØnüóÕ2g·Óbzš�£lxç |ýZe{ßÝ•D Ò£jAÓ‹—Ɠ҂Kt†ŠVÜ *÷øÉ› ²ìΉ(4%>ª"ËLנ㲆e}ü¤ÉJo¡ÂOpýå×&wqÚn p܆%ÞãBÊñ’7!Üˆß ¿(£Ä Œ~B‹Ý% Tœ{Õå“®N÷ªI¯¼_‰À=ØÿDm£wßs„«´TF{­&p–F·ºN:ðJMòJÛ¡ÍÌ�ÂŽ%ªZQlÊ迟íqÕuï+'ÍÔŸ­ËxÝõ®÷TÌô½§S=ðóî8üc˜Ï…ã�q„" èoëzëÜŠ¯O³PHiœ�yãÁ­­Í~—ÚÕDð^ +¡â¥ î*™"rªÙlWKÕ´¤¨Ñôaàù9]†ƒ+ñÄç‹þaÎÚ ¢Š÷}Y]Ъ¡ûã�? Š6uØ€ÏÞ:~´$fÙͨfoGC[r3ðR¸x„Õ ï¥›%ì[ÉJˤ¯«ÎËoJV®&d„%/©š¡Šb",™v­AÆå\’õ[MPôêŒZ.7³ìf‘b¥¢IP—41 8 THÝÃÆ¥¬ŽP-U à.Ñ@­ãK™˜{ß©¥C@„Upçá.Ç{æKÕS­Pã ÜcÃ…œ•qvwÖ_-±®•ðºFÂŒÓF’¥@df­h° _�Ýd÷s%ÊÊîë%�NSÓáàxaçsgš{ß/Ç�ÿL¬o�]Tj†d2Õk0=“VêæaZèìQc…�M}ö–�G>„„ŒÎ$eêy¡ïp�vèÁL?£–ÿBÞqŒ¨AJï‚—gXÊûî q�þ+†R‰Ð÷¦EAZJ BVeraI%>8$ó›€?Ën ~7|ñˆþ˜IaŽÄNë€ôWª¼<¯øÔ]º]ÈîÛ{‚$A¯oU æ.ÓNý1ù<딎SN÷ ³Í»’7gfNæ±µ@>ž¨Ú´’ÄWœ‚G¨Ýsiì¢eòùó…�ÈÞ âÒd†Š€6ÐÃÖíLæj—ÈŠ‚?˜ˆÉTUñl2_âæ«­y×4ë�=Þ‰½ç"àß^øùât�ð�Ë?ƒ+¦gIÍá„rŒP÷¦cÿsèµïô‚{ìú†ó#ÕÑ ¬–hKr/ä•ÇaÀöñ‚;¤…B£7[´z¾DÁ)aGÙìÛqâ×U Hý¤¢L+1.aMCŒkëA¨a¤ÓÛ�òíöîâu$-}æöÍE¬²o‰È£Ý"Ô°N’Ý!¾>Å­^$ím\a“#ß®(¾rÃ{x²ËÐX„¬2vª^'<­yš†ê�¤s6iß�´�º¡¬ÞèkD:v<_8ê>”“/gä>M ¨ÉÉôädâÔçmÍ>ѫҎÑËТÁ)@}[¬‹‹¶ �J?ö?W±éÐ)9@¡K(B— ;õàÁNÁMGHƳTÞdV ÷ñƒ ]c®[í‘ð’ïé€|CsƒÜ¿"ÈËíëe·ûwɽˆÖï¼<8ò傪Âñ ${-ïAÆw’tì¯O× ˆ%› "œt©@8ñFÇ¡|‰ø÷Žt÷B¦‹ 'ŒY?MàEúš”c¨-ÍkÄ[]"¨ò.�7%Ïònê{RÎ#[½ésÊ,SE Wg²"~ÙËÂüQ¤3AœƒpgǧÁ¥7b4³i¦Ó`PÌ3YŽ„c4³ƒ˜8Œ~dÞé‰"�q餂Y޾žWˆdh˜-MDæVÆh^SÃ…�h#²‚fÂádæ´»J‚óÚ…»lD>ú_êóiñaê@*¬q½�ÎWcÝMÞ'ƒðJd1û%3�ˆFP,|úÌqtJ XÀg¬êóQ$%Üá–KŸÖ(UÒÖÕ]‘«(î-j9‹‹ÿ<Û£}¯d¢ü:<%ØÅt^ð«Ù�q56«IR˜&„Ê<4†1ÎŰšDºÜ-O¤†$…ÊÊjrØ6äi:ôäÁõ3aPHÞC ‰d-ÎîÌ�ƒ>N¯¥x{D@g!"äBÔ2bÍV�!"Æc:åS²CÔLíLc1»ÍùT3!+�;]¥Õöñu‹ Ñ Ÿíz®0G rCÊŽÖ…ii¸yv´Èïã‡U�94f$+‹@sœ—B )bà ½ s�_&ZGsUÕÌmÆJœØqMʼìâ÷Žð¦›|7nt!¡ïÌ·JÆr¹üR-wáVù‹R!ö­•5šW ®òªN±±á„³aBÐöž<ùsMí Úp?j\˜ÕO ËXŸBVÄ ‡JWöƒt`Ý ^¸öjª6…Ãį­FV.¸÷ŸÍ$òÚ2† T^éê Ÿú ?ÌéJMÃjÀvçT��gô³/Ãó,>À2W–Ä�Fâå’ÆtÁVGSÛS§œ´.-ËÂ%u…›ñ9‡O‡€ß:Ït¦Ð]"m. ¶ ´¼*AUÕôb)ïM…çhŒ®ò~lßÛ³�CÑà½d»«Y"×84Ô§¬‡Cf3 {Ê2ê«tŸ£ÁÐ[ÝEY*Š'¨M•ñíû/3 ”Cfdÿ�T¬S%#Õ_ßLq¬Âª qÉ…¡3¾(T™P<û½¬óð¯GþùédŒQòi,ÈW3t+{cq²7È›£øúÅY7GbëÁ$r£°›Ø/?IÇ$rJ±öYݯ¥Ýòsè63.Š ¯:ºÌ€ùrÓ°U³Eo౯Nñéô´zЛÝÖ ktñi Ôno7Ã�“Þôì´2ÿøoLwŠE3øn˜ôÊN*©)@æY }J÷�h)-:º°'Öœ$n/¥;þ2¬!0Ð’à>bAâ¹I¬�ŽCß\h’Ù~yŽØ›/\Ìb•ÂWWoMŸ´ØŸ…‰„w¸.xPx‰�\ Á2#ëºï§‘8G¤#×%\zƸȢ³ŸK¹~Ü3ÃCåOûº‚¿š ¸Šá^ ö�I~"Ëlï?d!XBk@�´ÄbZ˜þ3t�—÷KΞ5?‘äÚ?çá“­+Õ� Gñ+ÜÕú"ø3 ¤:È#<Ï$¦Æ~ƒ«q,¿6ä7¯â÷Úàn÷m´åØrÁÖJ·˜à›|¥Êiùフ“I¤éiÑý)éäÜãs4«wó%šEgžw]6àPXãÒ�øƒŒPBæ_Ç$¨'EaE„SÈS™GšMÊh(I!µ”­ä“à€¾³?•Äf€F�-ã"iˀ϶£½­Oþ±.ÞË6´íÝ >ª–²éa "¨¡`“$ l ýbŸäж“~ò§ÖR´ù9ûDv“hJqí¤ü+5Šà¹³FCê�¢Õ5Ü bɈ-¸>@zã^qICÖ=©!¹Kã‘ÉY™5´]ת`¹ a+€©�²ÿþIÏ·žG_i¢©œ•ª´‚1Õ543`_¤q÷„ÌY.¹×%:ÑUÖ©Øaa÷ÓýE˜<õÌ·­X´�´U7ƒ¾áÄN¤õˆmsG†w±/ß8À¸FNx›ÿîÂÇ #$nº§žKÚ+f-BàšÑI[ç»=D¨‰Kò1Wüåsm•ɬxVëdHkˆP#Î)}Í ßyT™Í”Ó,3B­äáÔüd÷ÿôõrïÊÕ…Í�DHâ]W…ã9¢Â´²mtˆä”ꇮ™f5:7uGÎi•êõfj6ðEŒZBO‘ˆz?ë+ž¬&K´êó ÎÔb‘;�‰KOXn‚„–g”þ÷ãÊyè¢Qñå1Ÿ¦v5GÊt0Õœ ¾ùM©Ý +. Ý˜³(”^ñ’UÎÙ�FNó ô%È“†Þ‰œ]£'ImlÈÀ¤y¯ �ú³Mç(ƺYGó_'6ý÷Ÿœd"ÍÊ1"ùJÆ¡*}5+ӹ˵ø1P‡ƒߎšõ ;aÌâ/¡WÆ÷rãJäQûˆYW‘L;¶$÷÷t„¼Åç„Oç/�•Ü�Þý*¨;}Ã~0ŸaÞ£a˜QèÒFeºný¸KX0Ùyýä)ÿ�Fõ3‡;ó ÔZÇžHÚC±}íššwÜ�kါɃ·¯¦Çò±´_á'siÑ0Ñ­óÇñ‹Õ¼%¡î•ý˜â”W»Àñf°-c½ îÓ-;#~€¾×œ(ûÑñn®a10ÖÀÇËÙ¢ƒ2B· üÅgÕ13[µZG…MÖ8_òíØg Y>”ØÚÉL•óPÏ4“bÆmL+eD•‰Xq ëî3mUêJ•Ó�5n]þ4úaÏ"ß¹‘‘áà-5Y¬cÖ8s1á#ó½ýÝi±Þ±¬ÒÉÑH¹ãö�âØì”pÓû[¦VmÖ’‰�fò´—KÏÃÎNà’7FççŸLDBr÷Ñ¿t 21r�³iœ§\Þ#d|*”'9Ó—ð•¡«ñÀÎ-EvVeÀPFfhi—iŸÙÈ}¨å4¦~¢0. F–#œŒÒeŽwD�XFö�6&l�Nžºº¼y%Ì‘�ñj·þŒÓ2ò›§3‘Ñ!D„iN£#´P’�I…ä»ï*Z¿Aß-:®d—5Æ‹šuÈ�›ŸõáÒþ£õaj»å~OŠÛ{{(ySP€0wh¸ahÛÙ€æh?¾è�è�Hìô™4|  Ðežóo”g? B�ò¸P Ò/Ê�³­á°Q©|B#˜b°‚\ z�o~u½ì—Ï4ž@|¾XûY’ÞÈЗAÍŠ}ŒÊÊKŸÖòÚnº[ÔÎ ûÔô„ûPÊÉ]«LÙ„'4Ù=P¸‡G°’o×Ùt-OzBG '¦{e¡ªTtWò=ÿîÖ+auÕÔ�ÎÄ&¯r¯úaåG.ž;\X%ÿlí3=„¤ãwÙôòﺈs¥#¢•.å±V-+É,­YÅ”_ͼzˆ¸œ&‹ÎÙÝ‘6~ôŠéá¯GkâÞ;§ÙEìM„ò•~Íß»4Šàá(ѾB€AÜ©RÙ …ã;YåQ‡6Ù_ÄÍÒá¿B/g#§‚cµSXÓVJJ§©xîº ú®8í®1}8¯PvÆçÛYT¤ar= °¥»Ú�I‡¹Â±¢#ö°UÒÃ+ø–ÿlÝ“>IM–ŸXœÓv×á›#®ÖŠœA÷›�EÚXÕÝï›:ù`¤¢(@…‰Y9rÄd> š? ú6W‘²8PÎQ¡÷**ÔæD†útpžjEüÄN;3 I&–4ä§Ð›ïJÕ –<îÞIªöùƒÎÏî4�/�ºu˜hC5•^¥4vÊiIC«æg(T­dj*è}#8›î�‚^p›LN|;SoYQKL¬–\Ødá¨a&pm4O‹B²õ1ÈëMˆÛm-#üÛ�JÕ˜|åWàÚ£èX8÷”ÚZmì6Àf }‡�“ß~‰ÑkmB&wxÀl¸$dNßU!óþÇxm•øY¤'ô§:Bq^Ð*"!ÔÃÐo~÷ýñÑ?¦IËèäæQÇ�°`j7½]Îð™…¢5ÜÁì¥ßQ¹2—ª¤‰œ2Ä-rÄq:ÅÆ5 ‡È9“ ü˜nLè+B� –n4l¾°ÃæÁhÙ¯Ï>¤aëŽæÕ­6ôð“’Ö½¿°õáÀ,MÇÙ݉1êNû©Nô¢ÛuÉR¥•I“Þ¾V5#kËͳ­jŸj#ïïqŽÎvîD)‡#ð�´Ñ’¡• Ît.ËNt>¯!ÑÊ3]µBè2P W¾vaÌt aݧædUIB´à6�zò(+’Ç8ZV›zGFV†�DÙœŸˆ#TÔ a« çí²(c²`,XüóE\¥™ þržhxt2mNü½»‚�Ã_“­™{ØmäèΜ´…P½çS( -rK;Dó¢u¥‘aË•ò©L¶?t;Ø$8n½1“�XÐzEcK‘qc©5fØZŠ÷ãöÆ6‚Ù=­*¥óÂå*¡¿YÝ‘‰¦ê:”’§Â4ª.õËMIIè1 üº-±ôxæäežãœÌ¡^D¤ŽÉJ¢×#Î Èá ÕÒäJÑ�Þ~ó.GæA¦ÀfQ¢à˜©˜¯e¯‡ bÑ'Øå±›a—ÃÎ ÚÈ›’ƈþ¼3ãá´PÜL!g’ )/郑ɄC䎖áÐ 0gÇ‹ž�ÍŸL<]Ãu£S¹ž†u6š+ ñW€•ÜJŠ#©:k&�ªqXkHuÀš!Xç{”_ôº Ö ”i†À… ±È+²ÜÓ�¹�`ܧ¾SÜ þ‰.TëÖdŽr…BÝêÑB´ZzF¥ÐÇ)×Òp8œª "] a±t¤¾Sãøk¤ÈS?GŽBD"ÃJrzÒý¿tõzÿO7K 3 ×PÜ‘e“@¨u¤?íîŠÿ¬üd¢³Ðéšøñ j¶–(<§ ’vSFd}Çôe«_OÜÞ!ŽÃ«Íñï?ûsp‰¥• AZЗ¿–€ÔÍ¢(Œ:XQ(¦(¾ì ÇÊaTá—:Þ[EÄÅÝ9…äG±g#ÿkøÅÁßš+lˆöka0ÚÓ'´n\ÛSaâŸçTâQÕò3Ï ¬mah'â´IËxŽ,%1 ñY’éL’ ±[=ååeA‰DïÖ¾*(h¢p1T¾W§ K¿ÂW1޹9|Ñ…¿©ªÓ"vŒ®®d}¾ú&¤QfKÇÇ9›o�¶J€Îëû=¨ ?Â*­� N@ ­4cØÿþ˜•?¢%F®ÇñÜ©TgÈ‹A/žzQw¸kÕ�8RšÂïÈ)›VXÿ YSA=[âÖ?[²®³j!­rû<•êØvÓ¤ê)÷À5Ø2ؽº7>ÑÞ±^œ{ù½ÖÅ*¬Ý[Ö“$§3›•pV†­˜°ŽtïkïÄVlõÃ$Ã%~œ[œÙE½$ï6dZ¤c§Ø†œ?QøPgË1T×|ËH¦Δ¢Bá‰~ÜJúÝØöEumÅÂ×—zGϵ“Ï ÃþÈ 4H!PŽyãivä�ú›çM/¾[ ¸t#ξÅEº”¾ŒÞÔ}u9uL¥±ÈÚ/ÒSJ«P;Á¬Uê-Oµ™©÷ÅÜà>¸W'Ø+¨DÓÓK)ì²4‹z®%†c�óðfÂú]_?m[Iå$¶½T½�g¡Nâ}»ÕóÂ�A‰c-òtÑ›¤ð=þôë·��³½Ý£V&\‡$Ó�[ ª+èAte, h£â©È0/™¹° Ån?—fW�ËjÍ\Ä™Q$vÁÜâ”»�·E3 ŒNæŒ¨Ë Hq%¢}ÿY`û¥6˜h‘ãðœÑ—MSÑ«4…EÞ�ß�*‡4HðN'ýò×ÿC¥š¼tÕ7µwsCÃKƒŽ)“|?œ/ÁÃU¨¶'k©gIOã¶Î[ ÇûÞþ½KѰþ?©«±“Ü)ñŽžŸ ÿîÔ½”2dxÿüÚÕ4¶’ô�´ø7¹Jip‘ßïG .ؽßL9,|-hþŒŒŸq´«S¹AøG=â^6FÙå™ò4„d÷ìBgG¼²mf©ñÌk2´o44–;_×ÊGŠì¬f)úì—ëòN˜½¸—EwIñT¤wJ–ü4ö�Á.>* )þmß�4õû`¨Ñgüxø¨ÑÝWNâîÃ5å1z,m—3£¥oPX-Ä7hlE$Äv³¾ï06_6[º³vy’ˆas—a3‚Cüè'N�â¸==pÉp#c/³nÖ ‰Dò÷·Œ—ÜÚxêÅÔcÔ×Õ‚D�Ë7X€oyÄt‹¨�ÓZº7«=æôÃõoÙhä÷ô9·soä*)|› 0WÙ¶p‡âf$ÒZ¤ñ3á–�ÔÑÊý{á^ݺ�–ˆq¤ ËЈ9²Ï4,vÜHcƒ »±Ú¥l(”�ôzò|ãfØbE�]&yž½LÉ7 éc¡Öʯî]ñäbÚ€*„è¶Í¡š�!‡ •>daý:‰Ñf(¬)$šÅ�hÆQKQmÔRÒªÀÊ5þÎþì>uÕˆ{ý¡Î¹GœåÄT?:ˆ®aÎ+¤wAª#±ˆ§Õ¾‚†:vØÝ\WŽhyŒ°�ht¹¨h`h/¹¨ jâ… -HEöÞI¨G¿®(ÁÈÊg AÝÁ¤+Ôì57Hø}ùkpþ�~ö«õªÑwÓƒnd§Y¥}êÝv-Ý«�hÉPLR÷Îg –/�Û¿KcŽœD‘Þ®RÀ9«°/¤BêŸ8‹S¡Ç¾\€TÂt@‚‹‰Íÿ^îy_Ÿ¯bè‘;:³E¨Ú(“Þ.R(¯0Ì0œ¿H AÒî´y ·‘X$?¬A+1:8ÆpPÞ×Ü«i“ÓÍú7ÕhÛ¤}¥Fgáp“£¼ÿÃ.# Ù®›ý˧§ÎBô`7Ø:œþ уÎ AîaJÓýfÕN†*Œv^ÍnOýëçÜšÄѾ-l�²íÏÁB—òï@Ãêè)_µ$!ÙruH6‚Ì yöÔÁÞ vvÝ»?ØéXøñEI@¾ ÊDòiÇjG$ZZÎQXJ5æ|‡ö¸²T îjl< [$ö÷LRaDžÝ)²:`,SîÄ3öºoI°øG‘]/“næ­}Š�l¢“U¾©ëˆFƒ#"óË|?>› GÓ,§P´P“§+È¡Ç~ßM¾åd]@}‰:œG¸ú†7ûápSåà–œÅª'èÿts; ŒDTwÐÂZ@ŒxoØoºnH´£?ƒ®`c/êÆü^úLrÁ —‰%ƒ±(AåEj¿¨§S]Jêœcµú¼A÷Nú ¦€šÂ6:ë «Ä6„=tÔ‰îèÓðYø^lGñ3±¯we›Ñݳª (‡¬¢8Òì9)¦)Yšº•É~0°èdjâÊ1û»-Ç#{*Zl^–þµ>Ž$ÙÂW�b¬Ȧµ„ÁÑ4M+?­{·¹Þ“’ç!a}DŠq¢åÏÃßnÓðªcó^c»íA9”8:_µ.éÌ´ƒ Ï–zs¦Ô±òuö™‘LŸiVI g…Þ¥‚€9T¼-»W©èi9çÆígÄ+_KNϸ Õéûˆ’)ÿ¸ŒQBKÕQøiðÌ=8»� KÝ‹! Zµä9Ë$¸¾OÃm´yþÙ©¾™V››*ëa€Žì\K–A|æD�y¦VªK¤Z©ÒÈ6ÃüîõIÕ%XÕý ì÷P­=ÅÕßœ"¤]:þ^—ýú|¦T!gAŽæD¯Ú�Hê¡»Åñ¹‹ÃùïÄîÆ†=êÞ qäþ.æ¯:‰˃}£ƒéçYžž!H2¿‹³¼§o9±ÿ|"|1¶šMOæ&Üü–¤_£÷ „_ë†�4[=ð'…†Ð°ÿl¼ú“¿‡vÿª’}ñ¯w:¨¾×¨µ(UÂs„§¾i: ’%J4QzŽ�³ƒ¢ÿ>H Ð;æA¤O:SàòµRI�lÖ| �qžzz©ÂUªCHA&Io÷%†ªÝQ€%îw",ÙZÊ8þùcDKý,Ì·8ª¹Á]Ý' !Xè!R`k8VÒ5{NB ¥(ìî½6è£êx_Ÿ¯à6ꈹš=µ³^ÔŽT/u19eM‘nV”4¬t.ô·0 š“�YïCðå¯E0ŒÛÂ[›Õ‰øGOMBºhKTT5Ãé]Ú®ÀB3›ÜÚL„Üz%ùØÜ÷«÷fwtõ»Ý^c&ûR ²�q›ÂÒŽ=aœ™t+ãr�ÝáLÅŠ^±@ ÎI§y¼ ûˆé^9Æ ­ú§ÝH‚ï=ADF&¹õË_×´×Ssà´Ž^úåY¢Çüß¡ oÀ5Ø�º?N¹m2q ™¦Ô5‚2ØùN�ªÜd`)dœ”Ð4hç�ì¦Jÿúy÷®×ÕGPLãúMÕ%ó�Ø`ެ Ïöî�ž¼åx·¹VGà«Yx�ÜŒžß’~Õ_Ç_'ŠÎΨ Fl:ã º>xDÜu‚uíªt†‰a¤?ˆh)D'£"н/§1…rê³Bñýó,0ÓÑûú÷Š�Ý'/Zbgðaôž”ÄØñK±½!±­�¼¡£>4M‡¢,6ºX|’ºà6Vlt.°Ï'Òç»� e?¡n±eBJ˜ ±4®øoñAX�„è!ŠÂ`JESÿ%íJ»ÒX¶è÷¬•ÑÐÐ ‚£‰ˆ5ç\½1�(ÒÌÍôÿ_í}ªº›Áá®÷…4tW�:Ã>C�$V�qun�$h$O-*ãXœÕ?I(¬µ9¿�ž³Ë@cïÍÒ ñî=žkÿ¨d“lI]¡´A!Fm`•÷î×ÔºZ ™fy·Ûœ™õø‘-Ë4 ^LfXðÞ ǶÝý¬‚Eôº�ÈR,Y7¬f³™xW´ë̓Ê?êö¨ÒÚ:Ä ¬¹X%UDap©DMŽàÜzlÕÛÈþøá}ÙWÍPNƒÑöÀЫ á±—"bè9oA¥ÄäÒÇÆ ¯¶á5Ç|½å÷Z»Õ˜â�[ûÅ-•tâ{j &Ã|¨x �ß>ŠŒnfýu¸Œ&Šfþuu §±H¸RÊDÒŒs´mÌ;QÝ*ö}N3ðñÜ„è&¥íFö}ˆÃõL¯åt!¿òVw“ÅÞ;ȪÄIï„^�óhŠ^ôÕ$÷ðû_¤Ñåñ ŠpR‰â^�‹Á½\Ó2u°5ÒüЇ­sÞœrÔ1û"Âi·qzkÛ}oí]½" ‹�OßÛ£¼ƒL—G–gÉ”3œþè4ð1»a´‹ý²Z‚A³ë†Ï\€jžìî3[ÊŠkXæ^Þuíº4Ë4Ù�“G6¿L³w1§Ôûv}U}wWF˜é}{šÙNÏ ç·ùL±ªoÈ]>‹m_9J­ý¸Ïg]é›ÂʦÇ”ÃNÆ&'lûÙè–˜-Êær±|S~xH\â�Nà ²yöpÚë¼Ù÷á&ûñ(eë.Á™ï©ÿN©àE6µ ½J‹\ìõ¾R~+ûMå+¹Ž6uØœ«®¦BŒ•_Ë=ës²B¦nFß—âyÁè-fw O=½§Õ ·“èö…%ö$qsÉ0úŸ§Š|¬ƒpn,gïÔùbÆÕ»Ý´}áô'ø˜BrÁÞ�Úëk ib<¸ï_d“Únó‹EC8oPÖiì¸�ΙDÿ»�¯±Îð™ÏX:ðô*çÎ6HÆSÄnþŸUŸ±‡jJ‰±Ë£¥ª0²ì�ÚAСÊDbâõßo|4 eàƒÁïsäªâ<¥rbA|˼¸áì.ûÂ…/:÷÷(Ó5•¾¯œ¹°@‹÷R‚Ó ÈàÆáT$p`±Åûà *îoN!â¢TpáRáwûFÂíËÇQb#tÿÔg‡"?O8”Ãyu¦« ŸÒo‹“é3îë�9­Q÷¢n}í©Y[‘W^”¦ˆaû¨œtÜ´¡”^Èܳ*-!pÎI¦¢ìx±=•w…T!¥'G�=>b³xDöåtÀ\Ýü =eò£…–Z‰å‡g2¾^�‡"¦®`Ò #íÐw˜C0¥mû~*~Í„ ™Ó°Ø&„݆Õl±-ÿ(kEöž3žsíZýÌ}j0¼[/:ûTÁalJwdD•läë@ýxõ1Ýww×b_Sœ|öNYè¿q`½à¨’÷¼ô"d° g3ü )ÿrD±Øhé ›eyò–b¶›ä/ìîó))'ÁlW7jš›èñPTPx«ÓA#êíËqÌÊï�]?ïðUJã ªîÒå‘Ómì�øÜIҟŘ™�1G‘onh)”�jƒ¢½râz)”¾æ€§8è#=â]"0½…”¥rh·~–ø7@EÝ,JØúÙÝ;‰áOöÅAºnŸý•ι�{†B†mûqª;�Ï9Ø[·)�®AÀ§�Ú_1,¤�›yJŸþ‰Ãn²Ë¸£Í(™ßÚ qÏ 4ù5U\Qí«”Ýíï4»›­Ï-´­TÏbX“UÖýì�»èh|RKóúо¬Î†©!�Æ8:=­QJä2ÛO™ç4 ŒÚ.ÿhÕÛ;+n{'ú×õœ¦Ú§ŽçT<{xW:Mªù‹¡‚ —)ökiò:‚¾^m¢^z8²Ü!g«A­5GåÕ_‰^î±Óï»űï¤ KÿøéfÚ½Êî´©?_bÁ¸g$`�u€&ÙKÍq;·ƒ-a?m7NÓ"GŠqF}ïÅáÐe„ØÕ|Åê�Å{=5ÍËdçz­_{^wvÕ\S.E¯¹e{Ãbæ~ wçj?5Ho[Žb˜•”}‘›ôÀ:êeíûæBÈ�éðx†Xc=R–œ^|sÎÒ�Àœ¸WÙô,AM}¯úÿ,€²g7É1”ûtÇ郋 PE0®„ŒY¡Ó‹_¦šêŃZZV?¹EÎ÷J+×V?¶ZêÝ�ãX|ŠÜY9¦~™�Ï3N�‘ƒp³‘óJŸá±3!¥£¡Êž�RݲåUŽs H{2¼+%G;ñÛÙ[Qo?®~<È ¢»ÈÇjé§q,}ˆ¯�†+Q0ÄߪëÎ �w õ’$,|& ºâ»þ±Ï«ã@k¼Æ:¨]ÂÙJ1Ï3 4 Õ¤f’ö >ª`�/G“t¼s9+Éî5÷í�┌*ŸZÙ†V'Wºµ�N‚–K¬§=„xßàl¾òs¯¹7´çuކa‡ö å�-Ãg_–ðÙxE)µ\çú^/´�bþËɰØKE8ÍÛ©Ò4î³úùMRÍ0-ÚGi¤jOýñqJJ¨ärµÐ>ŠsþjšûCuŸMµÌ{�iœpvhQÚ© -ìˆÒÉûãîUl7²TÆóg娲2©ùÀùóÓ_*Šùu¹¿¥W7么€¥£„šR3Â9ø¼oŽÁ›QÍ›¹‰bÀ|Üpf>æ�3cäLÅ´çãV ×-\ŸàÛgõn”[&}~]aƒ\å½#x÷dŸÕO“a¦µ÷§IK”ñž²Ÿü†‰¯ÔÍD1)Þ­Gí‹è„1�$�´æàó±†Ì@Í꙲™ùTiãç.þÇ;Ü,íájLhv>n;þÔÙJjU¼:<7Ó’Ý‘?ßi‡"º†ôoK9íÏ/Ö{Íðx�·¶l\QGÙ_ Ó aý»N¤àì-öÖcJä×êŠïÚbÖ )J|µŒOî“”f%¥‘WùbÛt-&Ô º,A’Û]$h-©”þH„Õ@$=JZf/¦ìøÓ�oß ·©ß½ºË:ä¡´hø%|iÆp’O¦a2qBsG²r¥…Î1€BO�¡úèp'ÖÕÊÞ:€fˆp”¹È<Ó§BÈQAÜge˜›QÝ”M𮕏Amºxb#Íààj$¨0Ôõ»:2ñrxÂ’ôdÛ×[1·@H*Óz>\çênôÁ´4WùX݈|l á˜â]ß=�›|7Ð‚î ¨NÄÀáj ïØâ'›@BÒïMl4rú±hF`\ûìߢ³T4t�ãl�ÙåÓĶòßÓñk?Yšö˜£EÁÚëh«KáÏM†˜Ks�‡�unÒ–i"‰^œ&}¹OøØ/P·£YšÄ|H0äÍÙem¤ñDd¹^„m×¶°×ŽÙjÂk…»·kVC½«DQ÷�O[ÏDåŒR^—l$¼s] Km×.â7.ÿѬ|+,.gõNéjâ!ýžª«ŸŒ›H=Øô ÈTäšaò,fxÌ­îsŠ,YQƃÕZŒ”9ÒO¸ÄDÊQèÂDöQ Z�ëi¨‘©18qCð7YB«Îp·qõhf³ÞßûÀ{ìo§xbàOô³:ñP?à‡Â-˜pµ”eºbp‰;S•…½êÐ[ï\ŠhðMÇø8ºî)„™‰ 4ÇU‚o4UV�SÜS«TJôZÑŸ8ÀðqL««ìø¯11½º÷Ï6�îÎV·_Wß];sæùèÿÔýÝ9)Y>�S¸bôýÔ3+—i`[¼:7ÊÅEeFw8-òäú*InäðwÅ7IVÓáTpÅmÆa�˜vµåÞGX ב{ß®4ë$0Š”lÎVµ“DÏW$$¢Q³þRêÁ%S„ñúAœM½û¤=åÆ�°3";ð}?»[ŽîÓ{&�6nñÎVLÝ{<øøA àŸè"«Ò9ù)]5ÅE7»’g˜MñýnÃmÐÿê�¾ouز¬ò„œŸc¨òk¬®ÿŒ„ر9K÷ºë�\¥¾¹m®iB©.e³âß2ߘ„ÇX,•° «a?Zœ ÂÂÀ,J5ÎÕtjÐÕzHƱäH|&åÙšS(vž£Ç˜²RT"H]ºd©ÀñîÆGÇ¿ã«ãÅáÝ¥g$›•j3€â0‹#Ë´Œ¦!;©‘C²Õ½ïâ†U½† +GT7Ú"‹2}w\ìæOsdÔb—¨=¸Šò±zä%gãrK¡-Z̬u¡Ç›i~fðÔŒüvŠ3º¦2¥í'Ï5:%×›±jÄdcOÙTö€ÁAÆ.•¡hkC±sVÇ»„˜ šÇ\}u Üáp®»8ƒÞCqX2zÚyQÜ»®aª†¸C qÅe‰ ÄeœaI…œYͼýkŠÆÙ�.¶|dúúWVLcèªÛÍ€žÌì@•uúóÏÚ_x‡«ÏROìh �iªw …ºÅH‡ž9xÀð>Wø�ñ³ *fϪêf8êõƾ„לŽ&!§îfl+�ó Ó³eKƨn�SÆømY’uì•9«éyü;p õ8nZñ&Ï`fvAs\¯‹ç±}gÇ‘ÓPìuq  ÷³ìjÂ!»CŒ Qu(©nF"æ+8¯lYËÛ%òJ@ƒ å=ŠÐQ#o¥„¾<;Ì$zšc½<JÀ$Š3»-Ñö&BêGºå_ˆâäfr ý­”Jrµ@ÇÕßûí¹j§×n_¡ýÅ[(0ÀvìŲG:> ƒÝ`çô»øHhõ�­qwìè.ÀWZhc3>þHôËÀÉ8¯/Šñ¼´züJÛ‡pÉ—³ÕáÝdK¶.¾ìäýݱ ÝzJ�µäsÉI쀻ȹel")v¬¥ŠE8AI33ìu ™«ºMݳ¤Óéè…¼.ñ€ž/võ�cÌáq]Íî5Ôµ¿£Ý¢‚øŸ^ß·¤˜Íùgj}�Mjh™™MÂyV Í+LŽÃ«hVÅ:æŽ(nkN×d‰®›ÒÀé,­B¨ºu™ð6:ÅS4 ÞÔÍü)ÿß~¹�A­öøÔ‘ï¾´ZU½3Pë¦'ÜØ¬qB²Â¢¶SAl"8ðãq_Ú¡›ŽV´V…” %vÎeéÁXM_[ÎOø]ÚZðxs›jhÖÕ¢¨rÖùf'¦W�ÒLËå½sâš\\æ-µ S*øó¡« Üš£f¸{&±¹õ¸før¥a”£¬1¹�¬ëÄ£}ç§ÎPÝ[g}KC¼ñç÷î¦3ed_û�§Ãïµz}/Yýø¡×úqQXô¬ò'ÖÝãæ7ˆx< ¿ bl±ÅñÊŽ0˜E¹lQ¡ü„Ž¥_ÄÆ'·‰P °˜‰n²:�5¼¶>¡ 4䜊¹2‰eñ¼á­]~­`ÕènÉ Ÿ#I|!L¢|YÛ�ÎÚ8QJ¶îG¬ÇL…¯œ>ƒ2# yE%β¾–d·”„Žü¬_ÿ =üYqJ¥»iÐæ�s5Ó|½Ú ñ+ŒÕ4kÌ3ˆ‡±›Z†¹ÓÀ¿ |�^sßêÓWáµà·IñþJ“‹±Îî¾¥·ßìEÙm‰ÞO�aF™Î¢ZÒ˜ö¢Písr²ë"#V޾йí*ýB:ÇÏÙì× ¦wÙÏž�öõèT‰'„­#Õ8_„“S‰i8tÆ|:ýšèèòºˆì÷Ð…ÝѨ^\z»mba[S…ß¿Nà ^,~“lÊÑ_ ƒ0>PÁÆ>&IäÂiÍ�xãµ�t–ÌÈî,úoŒkøÜSnJ'&~‚ò“Öølo¯y1j·¼jˆi%@W(´Ùƒœ`� ,lzl¨%/ Ý?j=Mõo.³N*û°Á˜‰T­&¹ Æq´Å·"‰1P”Ÿ¡‹%z:Ín÷.”›±’äªjÂ2œœöQ8ïê)èFš<1H¤¿í§Žø¼&¬r1œ£ÙXâ æ¶û=ã²�Ó¡mœ³åÃ3-õðܬqxé6ºO3oàL“&NhÁ9dé0ƒn3œ ©—§œn·ñI=xµ‰¦špüÓä#+§Ä…–g‡˜íÆ'×zËøè, Dƒ>:Y^‚R4G/»Ð5äbŒËÙ´¾þ»Ó²rý�iاù<ù£+•ÅR#“ §BP¹‹ðÜ%àñˆùáÚøÖ²®­ªµÅ´ÁÅ5Ú–hŠæ1ûÔ¹šm4´Š˜ë­Öü–ÌtH 2-cŒ)4EœÅ7&H§[“ÐÄI­]FÛ·Í$‰Å–²,u‚×OOÚ}xëJðWf­ðçŒýrF‘_ɜҕő¤’­‹£í+Ê�'CD*¤KèS/“:#vJY;žÉ»)�½Õ­?u®“--52«õ?~èä[WSm¹±>wúÑÉÉ·?­7ƒÙ„›µv!7SR´¦Õ1CÉ_c<-t•ºý‰&`^BŸá°5€3˜tRe‘4ƒ±ÍSñj^]—–ˆ˜DÐ MK{üOÝ5L” (ûs× TÇH€.°]£¾HÝ~ëoýçóÎÃßB⢟}jÚA´T‘=7ä£ÑÁü‰µD†Ÿ©ÍŽw6Q~@ÈÌ2‹E“ëXÍÆ�Èvmnܘ´l ’Þ¢äž'oïeŒ'+Ñï�ôßOO�á±;¤½çI`‹àJYbFl¯$÷|ü s�Ûå�¿5CçŸ]Æ{Yô£>¶$¨‰[»?~ÖPLŽDAtÂr¿}ý»+2_@³øØq®Ë‚ß‹KÚ£çW¾Ôg3Gc?ŸØÀ»'�^¡Ì‘†p.ó&’wbvÃ6)Žèƒr‚;ÇRB`�5Sw«o¶«ùrþ»"ªî:·£»øËw ä臫µ#I>Ä7®” àФÒkÿ¯©}f­ôtô„){:,Áhóž—P?~\·Ö"+¨uÏ%ÿÓ”Bú5^“b 3Mõ'5óÃ2Ùâ�9WâÖCr®�÷ù°êÇá KľÜÜl¶íq*ô‘eÉ„à"þ§)UcY=—³r4›T•Œ�òDÈy“2^Å*—M®†"’¾¯O‡ s õòz÷läßo—ò3þã´Å×}ܳ§¦GÈÌVçKϾ85|qjù�%µ0h•€ñ�¥u¿ù�$}·Z›Yݾ»=ôÇ 3û›MÙ?~p[ßkm‰Š[{ÈE`ƒäÑ0°:ö‰Íax<À1ŒÉkÛmжŽ}_ê8u…œz]åmD¢–tÞs##ÉÐ¥K¿¼{µK0df“¨‘+ŧSæåÇÇX't2¢Â;�z–yuK“ÁÜjpgÕío×ÈX!M;Cq÷x]û†¥âzëÛgƒÏxiãWñÌÚŽY ?,c¤�±™¦ZgiYˆäŸtð‚Ñ£Ù¸ßé[UgœÁã[õN¡²G?D™�‚_u³ýµÅ´²}ç³ù£Ló³Ïl£»í�sí< x¶ƒÚÃáMІøè–_Eùè×luYb�ôüç}öÍšoåH¹82oöãH˦�6uÖ2à×\mö´`Цãû7ß̉ny†7­žfPaÚr*̾º oÈýö8óó”þyBzû>Ç@‡Å®q 'í6Ù?ãeÑ£f†îbh�#!Þò1úÊâÛÙyFO�Û‹## ½² ­<IÞ€ftä,“œ úwÿmd ‹ šòû„QîšöQ¼%H˜’øQ€)þ¬ë¦ð¬ÞuëÙVûž·¤ç’ÁS`¨Bèçî0zÒºš®¿v5¹GC »f‚ *ßlÓMñ¡;ü¶�\j_�†�ªhÃ23L$Féø!Õ¾rý`òÉa¦Õ�Õ¾u‰ñŠÜˆq†aôÇøî|oíúšå:ƒ]ýç‡a;í'“ÏXXÁNµ6ÃQ‹/ÏÇi ÀÚÞ^§:ÕJ=vY=ÿ{Vù­kÂìä<�vº0ÉRømbUdJÌÕSÒ±Z“ÍSbˆå jü»³øÜ³_xr9¸ÕêÆ:}Íò¶� Á“ðýÿ9ÁÚ±txB=ù£>øw÷öÕ?׉v¶·0€Ð$å^ýÇÑXçÖuP …ü�½çjK¤éòÞçñ?4I@šÐMƒ"ŽÃÌ(˜¡$ ¸û}{±¿}O¨êŒÎλW;ŠêîªS'שÐ].ÞÓÅÁûÑq}9$[®E‰ô‹³Â¦É>pßœìPòÙt·A\Á<õ‰§Žxmã\;®äý’´J¸—XKJøR‹aÄL¯ð}…§zú’î:áÓðÓÏb3t2bY(—Þ¿ëSÌ^��n‰w`¾Šu[\Ya,h%'V4¡·<¨£-lsw…§¦X@°´ÄÕxÙƒ+bWèXL¦eÄÀûеLa /ÄŒ~!Rô!;‚Œæƒ.yf<”;¢1Zw!8´²FÁ'-–b‡‹Ëå‚{±�¦X¤�kcH¦¿Ö·§`iˆ»¡Å]Ñbÿ9ïxjTrmn´Ð~[sû0ø�#hF&[n|Hšˆ­OP£ü²\xj‰…$‹Vè7©m»P&þ %÷.üB2´vHSC¸¾kSH Î×ë]!R@D~¸•›߯ É¥Í�z¸ê;¯òæåëP¶|ì©'â5|Ä/î!ãp@á>…8å‹–“ã4ã„ËÓôF-‚s£xˆ(·ß)M �vâ‚f¶>tð™Z¤ý4Dk}“)¬¶ÁUÄÜÕó1yUçÖàÔ”ÍVnŠF£$2Ú3­Ðò’D,¶@X#|«ùTäYÑÁ3Æã@Š ýпá>úŒˆR·’ö{»e?-¥søsÆó:•àyBüx‘‚ð) ¯<1ÝÉŸC�Öh½ØÝŒìdîƒø.kC8(îdö®Ð�vH gL}Àm‡š}¹5ö~Ò èô1u{ž…§KR�A $ÇŽv1€¢7bMž=»BÅDÀñ%Âañ‘Ö òÏ•î+:Fz¹Íʽ@û3%¼ù šÅôž�¾éiw"^88üèIëQZ`NÏé 66ÛÂYÎWwú Öú¿…hÌ÷f‘Ô°6¿Y+^>&3dg�úwW¼ ŒÝj.ÉL„£–k/O£¶õ.«ÓÍ+»wRÀçh¿m) 6ï#™ïõ£‚ãkB(bM½[C_ÜS1­!ˆ€Ñô˜Þ\àîˆ˜Íø”ÞyIŸçfb; Ÿa¿áÔPŠ‘z(†Î›Ã"<|ÆqtŒ§·œ’a>ž ôNßžÉ�X³˜d»o_á@»ž(·ÆXŒ­CIš¸ÉˆÙÉú1íºD/ó6]`fÌ�­œD³GDož? º$ú/N·„Ÿ�ŒËn_áÄVlåáM ¨Þ†yÚ•{ÏÅz4mÿGlP‡±Á}×°GžLšU·=.4& øíh$ã%ü~>Ä>b9\8žÇ3v³‡\¥[üÈòºþÛaóí*q�³¡½“ÒÌŽåÅKX‰\›fH©võ0ýÞ`ë[Ý¥ "ŒänäþL�SLK¨1VŽ8r„A^JâórÎø'…íH}û¹zìu襕Æð4~Ckµb�±Øz9�v}ÕÃ@TÙ{‚ÅÚ*{=\ëŸKÆ¡7$&DR×r±ô& ÂPái9ž¤È’bZ|‘ŽÂkZ[v!ziž%£ô‰ßväæÌ$WW†•Èt�g�}ÕJ�.ˆ…„Yoø=>#’è³Yïj4C«Þ‹À®®\…^†êàl£æïn�.¼Î�Sæ´’ÑË ï XBð¸G«.(€úö7Zëäm+´Ï¯Ð>š ·UŒÙ¿’*²¡—cçᛇÛ*zéîÛÀcÚä~¾AÜ÷žÃÒ²/­},©Š)AZÎB—G“zñJ÷w-ˆ´[.K;–è�µ¦ÆI¢ñ¶ãöÝû<ÙŠoÿÆ:<-¹Ç6Xaš72Ä0ìIc’Å$%“d}Þû0ìu:5Rô…ГÇÐÙÆ3lðq—èèD8UãÏÈ)Âg€Sø-»)>ýÍš´éËI›P›­c³� ü¢Õ(·§áL�r)s'É戮®\•vLá—ëƒäÙbŒYçmÓd”“™‹ZPŽ�•Ü-ÞXý¾›�ZíY.xq{Læ|‹ è_*ë�eÚ+'>Ëw·©ß|¹'5™ãérâ’æ�é9ú€¬Õb\*è†Õ/Lï¾Ð”Gš ¥�ã¨ê0,èZ>½¹qÍ}‰=ÍN6U½žÜ±M Ûôù^RâHk˦h†uè&„¦9B–…6'„`vèµ¹o{>ˆl³¯à~ Z©ÈD3ýƒ[ÑN¶Nlóöå:½:"zI¶ p€!]k ×ÃX²{ŸûÞ©ËšÕú¿�¿½ù_ø%ŒPÛšŒ£çÝâ¸sM9šà½¾=<Ö((µK5 7`Dî[bÝ B³ïMšQ‹P¨óP¸ââõ«ìSÕÆÒÖÍ9ˆ¥Lɳ/ˆh¼Iˆgž’rÆòª,)h|·‹¸fö²ÝÁ�5³c„/sÁ3k,Óâ ˆìùý.ç[—³T„m&´ñ”ØãnýZ{öÕy#”í‡$Äk»˜¶Ãr…N[ç*ð¶)'²>•Kt 6 ýÕ…`íDOõQ«Àæ”¶€]¹�ãžQ7÷ä7–~Ä<»lI"zÁŠùû«_QÓ6Ü‚t â \–±Ýš:["lÍ…YJ;÷\eî��|v /\ÕNáAÇKÜoßsèÙŸCôû3ˆ¬NáÿGžü÷¶r·º²©¤S©”’Òµ¼r¦D”襲’I¥áF^wßÈe³x£< ”YÇTÚ“ú¸£Ô£ÿ0•ÑÐTšõ¡Òì›õIÿßÊÔ4©LããõÕœÀ£&\tÌþ¸;l+£�™ò:š(¯Ý¾©L»ÿeN¡l}¦Ô'¦Ò7§t5T¢+÷錒Ҕ´ªd £*€fð0(—Y%•ÇL:…wDž/e«<¦yYòx3YÊçé¾N.Ÿvµ…3TØ@”,€©œ,Æmå¨bŠQ]I«Žêiª•!Ì5‘Ç›†šÄÄ Lˆ…­*›–è!þº·$¤Šúø/Kdù4Š,­ég» `ñë ÄAÜFñÔ›³�z_iu§=å8ù]™ŽM³E‚l˜(ÃaBùÖGA|ø—zssDå%-ÌO Ÿ¼È Áåda¢ù ¬PºÂchUE0ÁpˆOæÓªdˆ.ï3J*V¬He4ÕâÅt¤ G3ÓæÁx2j‚Ò�¤–š ±ÍÙ”¸½·pJ3Æ–´–SȘ±,s©‚i!ßÉÐ?É!T©²N‰Y©âñšÑèëž4þ=C›)©3Ì&€£òFýB!u‡¼tIYF�ÎüϰäW„êêÒvTQ ÆÒ+…¢69ädRÊé›ISÉ(§ÿ©LGýnK9æT-c@¹T*«):¸¡c¥ ÜCYþ¦”¸ž¡ÿ�Js4l‚XOôkçX^Wô4W!èZ ª¦RZZÑu²{PPù@ e(žÏå•,‚âz6EÙcÎbûÇ\€³X³móßisÔWÐæWðJ–ÕKàIYUîÁ¯aѸø}TåË~\éGô\FÑTrÌ{?jBAA˜Y²¿¬ÂA—Ú¯YÌ5€ï¢"ë3h²&uUs–ÌC^”´¥€\ײÀ/”N*«JDøU®g\N%6f€a¹´†¼ËBC¹Œ6Çõ´šO)zŠŠS£)â:e d50þ�멜ºÀ�Ü®³W’üI;L›Y4Ç]Ë÷{˜XQ§Òy(œŸ4Å GŸº©XœÍcu&XCϔΥ¾Ì[MÇKOSeh/•f�Ö²hwÆö¦U¨‘ÍiÄ_lóÇ æ0•Ñþ˜ÅuØi¤,‚ÝÉØœ€ƒÔ‡MSô< †œš®²?cŽæÈg6¯á_ÞîÝÜ:Ëíèä:HˆSŠÌ5¡û2[¬ëºì-5…Ú7bÕä?§é¤SªfwZDTYð1ŸA7�ÿ²EäQ8™UÕ1D0°j;¸´‘�™†ÈeÉ㥵,g�9«‘qPÎþ�¸Ò6cPPw>š)³>ý˜ ûÀ³pWfPoÏÜÊÚ‚±ÔkƒO†D¨=ß`˜BíO�VWÆõ¶9­Cœ81§³ÑÄ\]‰„B÷?à.àžz …¢Jp …ðVuR‡m²º"o¸[’—»£�a âÈÝÑ¿ !-*—ÃÃÚ æp6]]ù˜š“V·9ƒ�¦Ý*I JZæ«b[XsŸcÝKsö1^]Iî›ÿÑmš‡»Jëc ýí ¸;šLÇuPç$ä§ão»{¨u³º2ø÷kJ.S‰ óhî80ÐQly`±ºlP,í´{ú40´ 3 HìÊÀŸ›Õ•­Õ•þ(˜üS.c¦ê`UüÌàgå2=Ëç3]ÇŠº¾·§à#Ë\†~òðŠî©øŠìíáÕþ`År™.éU¥€V¦?Š)ëÇ…êïüü­ø·âߊ+þ­ø·âïWÜ^]i�šý�YwÝ-î×£•;‘Û÷~ÿžsóßC´0û' ºÉüCˆyöγ‡J¶_j\Â×�Уù*žë=�ÙCE[ÛŸGF¦1¬©7�o�YWº‘ °ˆ¿šL7³ãüíÒ"x¼Ü§…¾R±ÁOˆŒÒ©q侦W�¡b AÉ{èú1öþ`|$'Åá(ÊO‹£hÂÐ ’m|ÍXS!I'éýtÂ,ªJÖ$ï�Ýjß²Ô"À©hã}ßϘ})s‡Y.‡¹Õ@à5áz9ñv³ß+Ž4|°-àБC`\G@§:"'±MßKAŽvˆ{Tdü¼õ·/¥nÒ Œn8ð±ÐçK'ŽÛ†c= �i̦� â]ÊIÌ´/­ö½—„ –xøXùrŽÏ�³H²ï½?ä×R6zx01¢â®È÷ðr z$#)0»œl@SkI'™.¤ŒäWñ�$ÉØ�ÒÚø¼¬/DÅ.‚Š úzÈ­°H…~XÀ<œâË/ åT¶9Ì&–-®a64÷×#ÔÊ"AIiþ6RL«Ø?ƒ”´€)Á³O�B°£Øs&Jm\d…RšTÈ67KJ_AʲB»wZ»ö¸VÛ‰�¢3XÛøÝ®ŒÙœ¡;ôÞé& í9÷³=Òô¸²¥CHÆH�ϽŽ]Ý8€X‹“ï&Ó<“áâèÅ™�sÚn$<îƒÌÛv¢6Ϻ“ÉN•·¤TÌëï"!AÊÔÚY²¤ðêÊo·“¡Yºž\Ýý_Þdþ3�±ÆCœ \þ¢Å³b­ý^ê4e`SšT)W‹ *<]57¹©Ü¥ìŠoïç; …ÛÁéû}f=îó'’xPÔÙ�µ!ê¬E¹[#Ø.áñ7±ÑzïÞ?)&ª6œqäz­pNcG¥7 ýlkCœ‹ë„ø-Âo=Æz§tD-BÜ °ÃcíèÃ…cç'åž¿E;è5Ö^¸¤§Î8<~“ýK1rC¹ú¦ÿôvîøB‹jàç±ùœçfZVÜy¡\ó‡žyö×üx®˜•46øX<¸ôa²ª<•žäêþÕÆ;½·s~Iæ4«Ð²Ú˜Ó·lÆ\…Ìã1ˆ¬ûOiIãg@øúæ�`§OœÚF(× Û n®Jň,zó^ÄUªFøœ“™ ç>5Tcgó ¤é[—u/ø¥_ᤱµðñpc”æ÷�ï3¥¬�ÍW1—6z/þûF 6z@&� åÄì«)¬Û`—ZmÀây €AØì·ÀÖü6ØÕ3Ñ:ª à6•FjG +£•ó((—£œ•à'‘ÐB|Ý#éÌKý È /ßK}:B’ðùÞÄ3æ”Ülôß ƒÄÝùíYi†á³ôÚVnÎÑ‹ûÁÐIi?AXœÓö¹dF§ö…*íƒgÞ'óttTÇð$ñh¡^:ÃGÖóñ¯”ŒoüŽÜfK_ã“õÎ gø‰ÈÒ†³åø´F+ï+ÔðPÂÉGpg2Ä—ggÝ0íL{YK%Ýæí¥�ˆÌ† –ïŸ|JÜÞÔöà.ßÃW?õ-qØâ¶”ÂÍã`€.ù˜�­õ#y8®‹87™HSx±î‡¯Ów»â¤ »ö‚F¡•(�FHßó•mo–¦¾¥Í:-<��¸Ñjæî*|=IO‡?ùpú%Ín_ð3¹o!G{_¢ŒG?%“iméAn¶ÖžÂ7——߃ç‘mMYÚò½JŸ÷¡Ó¿‰N>ˆ…ŸLÉønBÍCP{}6÷ۑš8’í|þÊ+xŸÖVdYït{ð>ÞK¬¯y|À0>*ÍìdЮêS»«EºaÏW6ÝG¥5NàÞZArú.f»ŽúÚû]<3]ä:l· Îs»}™÷ÖNèàP€È>e{ýãûÕNóÝuÍ'GÐDÆ=WØ ÌáÍ;£7ó‹Ï;Oðq�S:jb1ÞŒ0?šJÌ÷"6æ_ÂÂspËoÛÓ.Âz‹»øÎ;™)„TÀöòÚ§§ä-*‘¿W!ÿëCÃ÷²Ï&°K)€þþ.x#½†Ó«¸mʶ…M½ïòÓ›:-Ñ[¥ð…ªc6ï»ÈÏ#ñòÊeBÿšjQ  ž ü’†õ ~¹–Ž:ú­~sk«u:«yBÉ–o7,hé¬�ã 9ÚÌÜ>þT§4žÔ›Ü$õØRZd´}×g¿¸@ 8�<àQ'>8$tªtrxîon ¿ FóØZºH<¿Bò«ÆÀ\ð%�E_j”L$Íï«+_¥á �mü¿F)ò>§Ou `1 NóÞY»fó¦·Hœ’·ÈÐÅÑCŽÅî_0ø„AÕÀ·(\…ÿÖQ¹P�Ð ÏÓcÙ —™�O ¿ÛãWÅ{ÓÌ�¾67ÿµhJè¢ÅRàã˜Öå©î_†çE!Ì :”íö^èSQ`‚n y\µiøí1''ªRU—∟-Âï†]Go‚D…î`–Ûmßè3±ÎvzCÂÑ£g6ŽÄß]ü¡c¯lÉ^oÖ�™�9hþ8ü Û´a�Sá�O=šZSFäÃÃN¢ÔéÓ·›lfÎa‹ÁÞVuÒŽÏ~bÎÎjYœQ`@Ĉ.nõN{ù‰#‘±è1Ž,ªôz´5cƒÊ8ñáhðØÉžlXÃB39g°ŸÀ‘Gðó¡”ÊE¦|ÒýÔ�L\ Žep\R­îÃ�áóÈ\H�ƒ¤úW¡;%[x´�¼ìñÂqpáxÁîXí@í5>ýÜÓQzØZˆ¬w‘­·6[™Ì™s9Nº™äÆùñ(ù€w>x˃×åøm�»£_±•ßÛ `î^%zNî]ã»éœÚyÆ%¨qƒq$lIZzH(ãgã’^4£4|˜ó´Ž»&Åp¥RŒ¤‰‘’aa`‡æ½ drOß çû8ª…—øWˆ¶·Ûªe´s�«í‚ EÑ.r ”ØÇĽÚsegÔÙým_Ú–FÓ„ûý¹®üˆ��a@Q"‚Á¸D\Bb‚Áh4ÜP–a€ÿºª÷žÀ÷œóe|\2]]]]u×]U“>®ïèµýا±•¼Ì”+ /³û‹Þ<¤ÐàN©í±´Yƒ‘»k/Àߦ¶H™< 2—óø'_0zÿ•©MÄüñ ]òîóüK4jhÏ"WÞÞÄ&bÍÜ⥶ëJãÄŠø-ƒW/¼ÅÂëÕå"»8Üœ¡ÑÉ3§±÷6*œ�ž�*ÓÝ\wåi¶Ò|«§®êT£«´l2‡pûh”}ªø%l[!Ùæ�«ûãp€Âß~ËEQªH±7dH‰aÅðhb!‰QO”xY/–?ÒBÈóS°�BîœÐ¼PàKz;¡Í�Íê¸XÄ &X½ïög†Ù–¶ô –Ø‹±ªø¸{ð~ ޲žhˆ‹UòK&^ãâJp9dõ›xf¼(˜mr¼cqôËüZÚ¸0”eÊ&Ä »¸ ¶±ðî>ÎÖµeZGAáè¶Jæ 9‡à„ö(¡öP ÉAfðãxë.8x\•@}AŒŽÁm¥�e¯¢©¥¡› ‡ìF¶¯âý}ùã,ܹ=ï$mÓˆ„‰[œÜÿ’]¾ÌŠhb¸pRn¤ £{؆6�AZ÷<ôº`7—ï!Ç3¡½^»dÞ]Â~BGktnr#z™�ñ¼vƒ�§a:Y秘°™ =z€I ý^.Ýúúo‡›Îkà i ªÊ3ÛW]�ç ÞwÍ@»ïFlüüb8`åe†N¿íÙr?wØðhNBd XTšépú'Ü /OëÃvNþŽé„°TÐišþm}KÅnòû�x<7Sy’}�¤pKÛ³—öÐJ!8½ëÃöÅýn…èC™ëÚ͵·�ÄiÒçvã—k`'òB±¹ÜÔÑb® n:Onø%ýc‚övGÞŸi˳§zsš°»Ü×~>uzœØÁ ‡>üd–û5q•fFmAœÈ¼íÛ㊇ÒÑ�“æ��®¹¸_Ò+!»ð:ÒœB#¾ ò8ôè2ãD|C…;;O…rêéê{‘Ú=~Oƒñû—§w7Ù…,¿êÅ‘þ“ôÿÅ…’ô>®º­€Y1Û¤ ’Í&/Ýúꃶ—ÄB¤¢³ž�k1VÍ…F¯}ÄáÆ›àø'Ïü9½!JG/©ÎË ³´øb_Ÿ�Øx3¸%÷/‰({ÛpµøÐ ¨È�¯Ts5¬&QƒÂí Ú ³Œê0 #Ž þ¤e ø˜\·ÓxÙ–Á 3;¥«,0rEõ—¬F†@ä_ö•l›"JHƒ×بÿt†Ó² ƒÉý3 ï¡‘±f^;Sú]¢íªB§çß?Áu[¤ ¹„}¶LãÖ¥×ñnî0‹ÐDìåÉMcÕˆKŒÑG‡�ömA%t›gHQFòäc0kX­ "· �ŽÒüà .¡ñ½Û¿¿"#¬§AøCÄÅ©¦¨NéN‘†³t3¨Qdn�bqêÿÛ&Ö°Q&÷ê|ÙâЦ(W‹@‹å¢5f®ò‚èùÁët'Å÷E(EnÀ§ JÉØ,/‰Ùϱôä“=ì—‰2NRm ˆå€ê ÈL�t8Ð-D÷qÉFÎþž�ß•~ �«ª æÁ¼~—±¼‚{äÜЈ’V‹õu<‚›mQã DԽϞŒ£Žc’Ñ4¥$Æ¥®`|X=lð»�QyîN›‡p¸œ*oÎK1&Q·çXúâ::°I�pÒB TwPú ­“_+2~Y¾›€Ý²ÛžÕ”ôF³#ÚuS žlÇO�õ¿”—î&ÝRð+Ó9"“±¯™íH ˆÜ|Œá»Ìž¡-f’`öœ†8òÃö~cÀ¤²tÁK»dÁŠžA,«0©ç˜$øS$ç$:ÉÞ5 •´ŒLÆ¥)²'#Šb¦W5Fq»¹’ žJÁøÏ º‘�Ü)ÌAó]¢ÙAb|6,Òh eq`ÂèøSmŒ?¹P!7k‡ôË…NAÄ=@$Á†#sržQ®5é4“—6K™|sÚæf�™ím�W¦„ëKKOŸ‚š±ï�:Q�?xe{}b¬ùñݬ1þØxy�TA†0O ?ô†v¨3Tqêó ‹âÈ@ìÓ³, ÊÑF3tF~BXÁññ�}tœD!]PgÕÊOìßI¾�x-˜°y›Ÿ$/ÚaðyÖ-» Œ®3–ÈëåÂk�°Bü �7o5ç1¯™ÄCM7Þ{2¿úÿÞ¿òqFPì.ð\7óní+`n( ±šìt¼Bñ«ä#ƒÈõ5ˆЙgIP ‘é`üÆQ*ÊçÑdêWL €ÊwÀ&Sß¹Ÿ�š ákО½´ÞÂÙ÷ÏëX�ÑÅuŒ÷¯nè1:­÷º<éåðGÈ%\sQf7czÚÁÙN;w)�Ic7óN£b²jçOCÎÐÆ*IZæ®/‡kG–©< ÍOöµ+ÆLáÐÁ…£l)��¯'Í­!Ÿ/Û7sü.MèÕÈ& XRCú½z4±ò¡=�Qp¢À’!$D¿:¹!Xç-Å—§»X(¯89. š¢¤l 2* @ŠDÕ]>ur:ΠO»7‚C4XtˆèIJjM$}DÏ&·BžŸ¤¸CDVCBíý¢Ã†Á蜖¹DØÙ㜳‡"r�«$ïâ\œ¥dta~dKÈ. U…“…v3È£iß}Ê�ˆ}ý&ñ6}à9 äq7”ò Àu5 *ÒµAlÂݯ>ˆqæÍ¢è6Ž1ÏZ,JÃ~#Êa±Â7*q±¹Nãoš¢¯Ùrëñ&‹(79KÐÆ8PP<ü²�:Ùë{ºŽæÀt7‰±®>~á5q¸�°³Ý]j ï;üc ”–<†TiBÆÖjJ eåΧ£ïË#o*["³Îác�1�b\ìaÃéT&‰†©ÁA‡¤+àÏZ%pÔ· S~Ç”®GÜçq<Ãu è„ÁPl�ÌoBŽ’Ri­Éä)3·‰A4d¿§£ÒÙ��tëàe±–F•öá´ì8�ñÖªÐ*³íOÙæ0ø[é•Ûa~;ÅÑÈÕrJ½mE¢ÓÇ+!ÑEçÀ âj¦dómd™‰có#{þ l·¥Ž\÷ŸŠràÅ L’­ ïî$_^Yö ÊýøÌÎõ{ñ3ýÜC–pÞ:f©@lɤWÆãä3œ\5ïóœ¦)½Vt>¿y1‡ŸÞðâ©Xè ó3PîJI“QÓjVii#ü# ÄTZø#RfÒª¶ßüe¼Â K#�×ýgG½u(¬é=b%|8E�“Žúâ<%i‹#!ô•5'R7é—. ã†Æ(誗9ÎØˆx «¹TòÈÿ>h�h'+~ �QÂ�t™‡y‘H�6ÿm’;i0wêç70L²¡jsê$(%LðT‰�ݘ²˜Nü2¤–6~—i<½¿“>›¥dá\Ó/a‚Räûeªq€bÅÐ"\·)Èb�˜»þÚÏ:Ý»*PrÏ�+“ÆhÄXQÑ#&ƒoX“‰þü—¼Î¦ä1O¹ë;aY%)*§ý)'ySÊÅ#± ØèȹÌ8±ã­CÑ.‹ÄŸ÷§¿ž´d)cÎñ¨×äkü®‚¸ÎA4¯)|=[|‹g�ág±¯�:ÿÞLgÚþ+$ª‹}}©)ÇŸš�êï=ÎÍÊ{«÷æXü`F£R1ÜÕíg„È€ëBLm…W6¨1Ül«/ ?œÍ¸W&¿qæð»â왌rJ6,–Á(Ÿb&‡[)?!L̹”Ï)�ÈtÑl>zŽ§Í£$¨yÀÔü(¹få㺜biå¸Òçzu ù<”\*8 ”WÖ ÒöSªÔõóôté¡6ƒ"0ŸB<ÂØ’ÓµFt$°¢9è#*VJŶ©®ÜøcÔÍX ÞÞpfª6�á\*œé Ø#\·}oñ{sÄEú¯½+9 ['8ŒŠ±/ÏO–LjA?”ý´¡?‚ â±ÐLÄ2 ‚†ˆÉÔ‰7€Œi- ª‘œ-G8 J£”³Â„BÛ! yÎŒ,z¯ßÎü½;íQGH*#ùÖ•Gýc® Êõ² �aœTî9V�Ftx§bŒw@ä\X“É´¢¶â—‹V ¸î6ùäî¯΋³ÐãSÙV!ïÿÔÝ0²¾rÓ|ž,ã¾�UÆÄ¹ gzï›ý‚·}ý;š�2âÒ¯\à?dÛCøtïÂ+{‹�+áRAAI¬sÕÉýÌ.ÆG™1‡¾î?Íͤ4¯W˜Ò4½R5%pÝõïÙuP’4«,%’ú¹±€] ºàXŠä]ŠÌ òf;7©¸’L*©ÌªÁ»X&‹oV-£â±QåwN‚[«eøÉ½�VÙ†0EÌA’Ä9)2%·Aåè~ýW*QqÙj˜oCÜLGÛd w?u¤"¶›ÜòÓ†ÃÚj±y³U¢£,Õ^S…™Wˆ§…l,‹ÖÕ²{éý¼ÑC¡Oû¯£‰Û ¦[MŸ'ÈÔ¼“îc›ä)m «-±´HMãCì.™Ø]~åµêð�–‡‹s\¬W.ÿG#?ÝMø¡à¦ü*º èBj½‡€²&Ñrû~H\÷æCy�RW—¡"òK@E”ÊcKWøàɬž„Du±rHt1*<\³!¨±%ÞöB™®ÖK„Kc²´!ò¤ä6q^+—ƒ‰»ëºœ,DÌÓ.ZIµBÅ›2"X<ò¢lE‰[éiG8¤ÝÉã‘_$³Ø#÷sgOêæMj…ß6ähkñ# §Õ^Eãûµó)f+ð�ˆÉŽ6«!þ¬õÈëi~ú#Hšd~œZ¾ï´oá´L³Hø0CT£q×tÃnxžEé’/÷R†ªr°å_Í‚›‹³ o�áÒ$št舦ÒÐuuø ‰rÇ^ÄÐ)l þyä¾Ã õ¶L:± a7Ûz¦Õ3ù½©bIî/‚L\Š~IèøYT(8õÞЉÖ-‹N¶&#0|Êa XcG+‘àž;"†ù8‡… 弄ÞÃY«kD ­¡Ctêy€ÚÅOrlñ|\Uƒ›³óé¤é÷æª30‚§Ê–(ebüØI²ýðüg�F"uœH Ô‚>åÈ)©‹U¡àhbÕ”¶þƒè=u=ŒŒ©!V™ñZ©R~% �6Üø—5³Ì¶|³â•]´&L5h½1q³êWôs•45£Yà†ýŠvÛÍ bs xáöÚLŒ³OF†h¨ñ@�#x£'òóœÃÀÆ ë¥ô/ÁÊ�þ&yŸ^ut�åi$¡ïÓwÍ‹–eT5Ñfe XÏÝ”8 {oäS½—´)ìwP*$¹‡�a6©8‘ú3U&*¤9;Xiˆ?Ýû+,s5ìß"bè¦ÒRXÃÃ8¥£ËçA\˜�œŸj’^#õ«' µuGDý”³õñç/rRœ,³ý™ÅÙŒQnƒj Ç#h˜TIþ8ÈcÙ=ö*VrÔIiÊ¡XØy�ãò?ß Wޟ˪«“sEüc ´1šJÎáúï•4:.’Ö¤±;{öR­_ÃÓÃK"³DçO…÷/Rô' ›·ª‘3ø‰·)ì}#3}ªvM’g»¾Ãv6/9âCëóP¸m;S¼fQM÷’O7ðW“°~õêbˆØƒÖV•¡³µû» fû�« ï|¡±� xo.ང‚ìéZC¾äU‚B]âÑw½ùC ˆ,fŸ=òO”«¿6ˆ�yŽZ'ϯdÓ*I²U?^Ÿ÷vÏ»ÃrîÛ›ºet¨*1º‘­Dï2³i²øó`bË4hÕ�¸ÌÌYvƒ5ú'ÓDçç÷yœ§ˆwÒNÁ—}гŸß/ñ3|+ Ÿdç¶t•"lÊëÆÆ’}£Q¹�YQöE¸ï]™\Ð7À?pù¾Ïù+/yy$!æÌ¦}SåÓÉsF.ÉxyìÀ;4Þ›öŒoŽeMR ü•[??…¨Âö�üÛ›±»4ópÉ>åÜ4ã kñ1!©ˆ›¨¥Âmþ‘¶é K–Ò¢c¡0Qu¹MQÄÉ–¦ Ã^-;ÖTøÀHgÔ›Úúñø›~B/] é\ÑÀ�Ÿt©˜O«Á2Ïžc›&,Qú>º\Ÿ›À"½��|i¢ìvú‘L•¯þ儦 Þ¿Âã·Ð””ÔÅuwRœ%(8š 3±×º¦Ðöõ.½�r¦¢¯ê³é¤X�–�½Aè¦4»€q9¯ê¦8ž%h‹ð;TXÊdèä2‰Hü �ݳ=èm¶û¦�€�|ÝÅS¾1ÕŽ"OI«ëoAGÂïjdýôÃ?¡‘}q�Þobd�ûa£RvÍšhAræÜÐèÎMS*³TÙ9ƒÝ™Œ.sIŸìL¨ ½0£ºúu›UúpË…BKC‹–¢µ3Å¥ÇoÞl]k‚µÿÿ,ú™P”²Ln²q˼‚Ç ]& –#mˆä2]¼�ÍsÍ(¯´LŸ�Žù‰…D‘1MkûTîKØÜC×ÞÛŒz6Á-Ƴ¹ì=³/1:I* ÿÚ~Qxÿ+Îà}�'LÅnœRÄQHHŠìÕ•¤äˆ¹y8³·nýŒK|·¼•Ôò Õú1ä ‰ÉG¾Æé\ïñÝïÆõøðË,9êmÿ—ොŒÆ {ú²©5’A$?AȨ̈éÈ1qcêöûˆ)ßÑæm•–’̆¨ûê1˜Ì&„!ÈÕõ;Yž°;[cê„z†ŠEôì&ígÿ–ÓG=ô‘ÎpºfZñ¥:}PJò6ÅÐ'‹²mï7Ƭ½’UÏÈ–ýv¯¼ÿ™‡MÕ¢ xŽi_ÿ8IüZ�Fužæ¦bÀË_Nw;Ì­ÑåX‡ÄÅöþ cwÓp/–1BÁ¦Shïd7b³›[;d’2EH'0y­EH’ú^ZA>— ߬Q²¥ïf|io!*Lh$ìoóÆœÍÙ'²ÿ]¢™W¯JOp™6r%"‹L™¬z­ 8e—DŒ¹î:‚ù´u Aa“l9¨˜V;L,„ðm6ô…Í©¦iWˆ˜äwRí§Ký.º&x™ªš.¶7Oÿû¸—7Žw°ÿÑ£=Ùàäìïa‘zr¨›ÛA“Á‹ò‹SÛ¸x¥"¬?4ŠNâ1ÜÂ3LŽ÷¾ÙAÆ›ˆMÝæ¢’œvaXHÊÞK;jƒ“•ø¤¯åÅ?¬m€ŠÈõ¾i¸§Á°H‡wû”ÜòÓ­õßk$²JRÆRòúÝš ;ZJa0ÊvžÇÿ˜a„‚Š$”Tì0Šlö’’K_ À¤'÷¸Z^zÐÌé[9©¹\gŽ“8D¿œÄ87»…W¹Ïv9à"zM¹ÈQôÞ¼† A.Q^“”Ä3m’â“|æ­/ [R¼pܸð‰ ?-k £2Ê�…ðg¤) ×)©N "�¦ ž‘/gÉÒZ�)V2äÓú:¸¡èŸŽ)˜0þ\Á­J|�´¿>ù8Øh“áZ­:›¤rm¥©¢f¢Q¶PƒJW«ÚGK@?:j»ÎjEïûÏ�ìLÚ®Å�q"$pjêVj¤£"¿OÿvÔ>{Ô:‰®o†b¡Î±ôãÆM~q؉ëî¥ß.ÝðÃש?%’:/¯ä¥¦v<ÅšcFµ,âôŸÌUÜ›è�à�Cfo¾™¥NoR²{¼à¢ˆïZŠô˜Ï9]´M± rØ`¹$Q‡°¾Zm€šÁùaØoe�ëa’Û!rº�_�ohÚP¥ôZD^MgQ½°˜-¡cjß”t8g‰2S‡²TþQqó9 …´v»�~ÕæŒnî´�—œg”…B×{­¯»Î]!Êæ&)áLœ‰û nrJvWi,À™q÷8ç·`À°KÁ3 »ÁN>hÞ¦%²){iò8ôÉ�è5zœ3µÐ ^=S7i Æ<Ú'M`’›f^QA•c¡]´E¶Ì†g�æœ([Z}8)òÞõ¬pŠ«FKûoφìÑ2x‹vÉ I¾ÔŠŽÙä˜&CUíê&‘:´d6_£Ññѧ}«å~áH„Jâ²) «ü–`�ýý„“¸ùT%ˬzä`U“¸~š-‘m,”Ñ=@ųù*&S!=úy‚ylÔ1öæ}È"C¼‘ jl)÷–WI"¼C­�ÑàT|Bð‡ÄàWu~ó¡‰9†—¯`Ç}³¹²VvÌ‚‰ˇ¬RåÍA!ºVœÚËÒFÑú9Ä®wxßÇv½“9a¬óæ¢ ov%�o\¤Œó:|;o#ç9˜\ßÝù`¶Éÿ w@¦XÍâF“…„Åè–J&€­Ê‹�dú–Zi™ƒrŸu⌉ÆôeÒzJyßÉeÞ§!鈪R ª9¡¾ð¸ à“O--êsŸ2h‘…¡.žÑS�Q€ÙéÎIUT1¨ê¥‚šúò*Èe±“­7¿®¾ØÁ oÕ`¿X†eÕ¸æÒC€¡Ï•ºêê[äEûF ªÈK·OlttüYb²š»òð9m0Úâ3F7wa–hÒÇ2cìe'³¼ØÁîæíwÅô—›?/ð)Íö•ÈG Ž+Ú6—öoV@_£i^=JÛ}_c»®2FùäÏÖØ·5dÕº®žÌœ…åŠÆA7˜-í99Ç´¶8¼¯¯+güÿ‹ª•Êu§Šõê»6®F'¶«­eޤÑRà‰ ð5ÀvÕ�+8iÀBhøNmæ‹´›a8ªØ"q¥XwN•‰¥GY^ò0æÄQUN!k]¬ŠkåÖÅp%,Ëo.Ñ®VhòÖ‰²e@­Ž¦‡q2«xÙ¿/k?i­ÿ)x™Þß- EÔš …Á~˜^¨^¶¿Ó4æåÀnÆ¢]¨ã˜øD˜LVnÈ G)‰É9º¯át׸&kCdi‘ž*à1E¸ML*>:þðX#Vꡈ5øFÙË\ýþˆuu«K…6•¢ëŠÊ„é%T–�Á› GBÔ (׬6…ºˆC~F µ¹`g…ŠëÎÍe4,hà][9ŸÔmü:4ˆ„;³Íze’jÜ‘«÷åk Æž‚Å~†š‚‹BL!1ì¬�ókÃÔøþ%çMvÛm˜‘Š,b Èw1Lƒskfm=‰"ÃsCƒ”ð[dŒ9›ÁÁ-g>å¡x'ƒ Jp�¬ÀA šœ=rt²l#™;›ò²/£4<|ª{™óŸU¢×ÏМº–šéâw‰ÕȆû»¶ Wm'(�e&L«E+jÜY¤aR˜pPÊè}ÿV'Î#§/ \ I ì}õsAøZëðH CÔk°Wi Ä9¶}4ÿ^0$¿~A7Ï&•¶Ø³Ñ/Z3 3öU~&ôð[uL'À5§|Ê¥1Ô S˜’«¸™ä—pöe8¥6)['kų{48Ië«^ýð4‰ Ú; Äe&¾e°à0Aä¨k…{Këê"d¿Œ5aGg½?Tsr›éí”ä[<{™£y ¾Ä³à¨ß Ïötn¹±àb<�“—‡±ï._õ¯ºyJ¬È·!93·/ƒª…TÃ.¾ �5±8ø<Â'tsb‡ùÒû_>S€‚/{+v K!óËÖ»[<áø1½ÓEO3eŠ¿§$ˆcŠÚ›1NÎí`EÇXƒQw:Ùµ0±5/_ É0±—,¿üIŽ^FÇÿžSÁþu+?x+׈q¤ß¿oîRÕ1�žl¬XV�©v­©²Lœ« >š®L½ƒ€šú¦�b²Ò‘qËœìv{Å~¢™èG—yöt–@¤ ß—rG͆ =ý­Ÿ;µ™Èþ†ú%¬+õÏëº÷úuÚ(ƒ ?IÍßÔÍÀXwûì[’zåµüÅu(È—yb:¯ÖñK¼PŽÁ º©°Šâa#1²ˆ³þÈ2WÆÞ° +åÁÑŒV®ëWÔÃ{ëÑm•ÐÂùs‡ Éjþ&-¬XRÚµghÀˆEï¯m‡N.9þ:ç…áZg�ÜÄá÷I\¬fÔ çÌæCjßa½Ø\Ûp{§Z¥åqµNµ¿¼X‡6@¢sRR¸¥¸)LRy�”§K*KüîéX|Y 2Ë%7ÿ&ðîC¿<¹Ñ¯Áß¹šEntZ™~7WÁ8E5(½R»Ç©Vl??gÞà ]W"a+¼,8ÓˆWEhÔ+0Žä^m4á¶l€kráÒhµv9 ø™ZŸÁ¼™L6A¢“ç@Ñe[é&£’Ï�8éÚóõ¬àNi�šgu×â F+:$ó-›p¦ÑˆŽõžÒ¹ùô—jwódÝm `Ÿ¹ÌµÏV …Dåûü°\ùöNÓ‡©ào®S»]r6^Edñ ܶû¬”Kªf:11h�˜cD]&™œ$ÏèSz—¸Ô&++5íSÄÅnôrÊà\™õNë‘?An]qÿŒŠßïÝÁÆ7oŠ_û½>æ’¡”¡U–l§e¨ÄÚ=G ù^^$" ×ߟ9‘ÓMš(z¸Ì}hù×ßD·o¸vºï™Ö+Ȭñ¢I)Cdc49wH©*¢ ØDu£Ù€�µg£T¦Œ<‡Ú)d=GcTã=íZ7Q�ŠuíRb…ÂbâòA\³Äxt•Nn>ž„,faîd–�QÎË4³9gÛ{~!ûQ[x±ÌÞ9¢R­øóø½tHNq²ˆâjcXÛ¡, èGƒ<ÁÜ€‚2²`ÿëºSo§¨ÞÂéÐ�Êq´·‰²Qü š¡ú˜žÿ~9§’›éC­?¥ˆ÷ÙØleˆ5õˆ(³®%Bö|Sȧ�¦bй~g¼¾fP/§È.›!»½ýоu´€ÐX’ˆÈ«ïH«�¶äBt;àv �6X&¨Óï1¨S_¸¡Ëo¢µJy§6½F«Q,ÀBŽöž‹¨“’©0`…©ÌÕ!/Ã3-û½™øMvæýé šcÚz<~å½vÔZ;ÎAfÁIk¢Îƒ†Å~Mð—/ÊCò'jÄ}ô§Yê\ÖÝa÷©‰ó…ÀçMɰZî¿ÎQ×ȹ²([Ò'•(7òÐÛÞ&ßM—Îp“½" µÄY–}ki v{oò™pÈâs’ÜTÕTàeNÉ›—^‡׿ Ñ)Â� ™+èû­Ü8W(ƒÊÇ�ç°qXKɲaÍ c ©`:Z„I£ ‡Ñ1`»w0¨ÐÔÀqgªôdÛp’›G›áìûɦü$Aæº] f[FÛ¯ýÁéæ�Á ¿ñZ�""Ël�LG£Þ87vfo?[Dã|Hö”I\ÿ– !‡äêÈ©½^?‘/]W ‘S¸nôÔ(¤.)øFó ”ZÛÚÞ”yƒÿ“˜ÝÇÉ©ô�ì¾Ù÷#r{�·*R>ãü¯jž¬¿xë�Ko›—ì¢G(gm %b®bû‚¡;tŠ`˜çáo°®ÁGD|ºF£·îlצ¯Níþâ‘l¤Ÿà7ÍØw"œ$›Èî,î-~h —c1ÇB·€�U0ÌÒξZ3¤²Â�"“nQ5Jæ2­¸H‹Æ`ݻҜ&ní|›úáÛ`’z;ÿ•x$gÊÉaÐic,áÕ‹UF &;ŸØ%L‘EéP95R ‰Na ¿1ùSK¯�¿Lj9¦BKta Fn4…9)BVt×0è4Äñá¿À[kŽP ×Íö< Ö‡²`9 ÖÛo³ ,B<âL<֬à9cw,)l‘5ð‹æƒãr÷s�„_?‹›ü“ò�d®¥S`?}[-TÕÏ>Ë'VOʸtE>@¡± §©§þ¤Ù (“ÿQÑ�³›u–p²Ì>Y*Ë ŠÙf’¾@>ÜÒÖyý¦ðYàSð·ÑÉáÐÜeÎ�â {èØ•6Sÿ²ý�ðo ïˆÄNä?¯ð¢» Ÿàñ�Gø.|2r°Ë`BƒT닌‡žì¸›ë¸pJ¦:–tš=}µé”�\‹qêî}Òé¶ÒòÛXl·ÚÅí³ÜúyNíòÛº\NíÛq<�w"�VÁ<;j }ìS{i�Kǽ½^Ö@ð_J¨³¡¡øÈ™:LÌŸÃB‰æI ¶bÊw‹îÛÄ*=t£ènö’ÕD7åüzÈeDÒUä®ÈŒ—aZ&ç²éÐFºâÛäz*UNù?ëÿÌ¡�´´jíÁ%!{KS‡Ù{å¿Gçc(ò…«¥ü@<ëp&ñC3Ô4ãM:ÇS0×µQÔå€U_yt’ºŒ�o%4¯DLã Ñ,˺^aIW¡¼¤É£ÙWW}~3Tv?>;�Ãõ¹²Q´Ë©ZÖeÌ]ż­eX4M«£æêj·}{ïaÚÛðþ?hš«$˜5bÇU;h@zQÑ8Ì�u‰/4÷ }Ô\ª´$0ú }Ä+Éù¨õs: »$ú%’ú¡\G¼–9‚f#ÛPZIIP =K¬âÑ ¯ÖB.Ö»Wý3Ԁ؊•xÈO¨ ºî…3w†Ôêg`‚{ 1I+U›§{ÔÒIÂhçÂjŒ�®nBø#=DÌói! —Œw ж~ÁI Eô²†�Zg¡ Ê˺q“ãô+)Y/ÉÂr¦†ÐûÄ�¥åM®®Ý¤ônÈãb�œ±öˆ(ÉÕ4¸Ù†êÖ»½tðù­ 'î"m8{PU£43zyËþ±¡S™©ˆHJ–æ-–‘S©‚Àó’æÝ6’âWÑÆ- U0ÃèKU÷¡Åë„^uŠsÅzU®¿íÛù²Q8ÝÃì>Íœ_ÃrVçÉì—ÞÁ[éEkt÷Å"˜;Eü”ÑìÀ&1€³á¯È“V ”`¿›+ e…hÍ )3Î…Å�œn#ù,.Wx\yÂ)&7Gçi§¶Sü²ÕÏžBþ`¡¦úÁáßõ# ÷Éãž:EŒçJIFù•8¯*‚¼,Á¼X§�¥Ó[¨ž�rkäR«xPÁ|xT› =è¿ôѳ~Ï{Ä€póyÈc05Ю齉cˆIDCöx9Žc‘TR1UæÙË>—Ð@-íbñž^³Æ`Ê£)Í‚, ×É`IìMf{|0 !1Û³àæöfŽŒJâ¶·êöèaäo½.‘^àSb¶õ6ð2)ŸÓ‹•Tpƒµ$SU Yl+š Õú@/Ô³‡ƒô»øLXq¥Û ÌyLœnvê‡6¥Zâk·‘¹†?6Œ-ÇÖ±p°9Ã�ÙW³Ô\–E¦ÿÛ80%(ÿ�’Š#ç2îWZˆë ÄÕ’ry¤÷{D$Õ!úàf@\÷ó7T@:EIïº))²zãPy�Ê⇪^%+ç;a¸¬ÁgO‡¯0[i$þ1y—†‚ ‚|êB7™Óx¡bøpÄÃ�Þ»òˆî:‚¾=xóâ9806ª’Kéï>q)ª·y¾cýR×/@ÞrƉT _»´ÅÑr!,…Vu.¯Ê]ª´}¨zÏÓ]'“@þ3%Þ¸ŸJŒƒŽ¸P80WIHR@ö³€×�|ôßö»9 «\ ܽÓÍJ ­9A’•1ˉ­¹víÃZlyî°nwZË»Å=t&ÉӀޫU{Æ!êŒná8ûóùmt^ôÇw;½±Ðú¢KI o •&»~N>=Ÿ£j‹�‚üßžIK…@ÈçØqÔ³ ÷øì5[õ¸ª_SOäõ,¸à2Yᑳî¯8K[¯@¶&µ\8/Îöé´G‘�z�¸pµéÃî¦×wêóª©È1!.qñæcbn¯îÆè1M§Fl¥cÎM,h.ºaê´ÔÉýJÙúãÛKÈm †rVš—„Y_ÎtÞØáÏî=b ñá?ú•AM^qVë€l BêM@!ºðãOHû8hþÖSÿ2ÉÛ0ɽfz†QæC.ºåˆ £Øwœd¬�ûÌëÅåïhði,�æÁ¥Ó.cÚâÁ²ýši஀æ>ÃKu'ä寀òqøDÖ߆îaØð ÞìÏøD 9¿8;ò’9©–ö.‚ÄôGV/Çr8ò†™prà•'{Xº^{žæ>>„�ƒ»·ñݦ;î¾ýÒ®µ-�¤‰~Ïóø#†«Ü”Hä1EW£‘•ˆ ÌÀ0Èÿ»NwO÷ ¸ï—‰ º»®§«N½ÚýÊéÀ‰þÎ1óž7 ÷--ËÓ]~*ET—So²>-€íBŸGÝÒ¹îx„ç—>÷p¢)—or0ÅÃ|Ò=l�Ô‡·†Ç»/”†�áM=Ñc³�¦ËäÔ€§)òÛE4Õ�•õ H÷û™“9H$ø|�¨TÄ·ªmX?#–@åÝ@ ½)éQ“Í"ƒ wy5ñžó¸WuÆÖés¯ÜÁyLŸŽb¶Š>qV@왚h¡Ÿ‚±†°æ (‹qVÊÙòZ¹¸7ž�!N+RïŠsò‚OöDV£Ð‘¯Oñ\±Üïó´65PÇz”…ä2ŒŽ¿t)À ìzðMÄ�‘¿ùy².ý‰<ß”ÍÖ¤¡h7µò 7㿟 �=®ßÞŠÓÙq­ù%’¨áš�£À˜3E”¢ÊW:QyF'3éêB»C27W±u�I­Ì:N£Nnµ: C ºqé¿mR`×Ê“«öp<òÜðUŸ2œµUŒÚ©àÌ[PبnÛüÕ{@¬}übÊò…Ç–‰]ý:îÎ&çoóØu8²4Qä¬ÿ½²Im ˜qN´ùèlkîî &› TPˆ Ý„|@U!�÷ë¡•™µž¢�ÿ¢¶bÄ+´´¥Í6Ô�)´TŽKHýŽÞVã…ò}�h¹Ü5óT‡£»šnÖÛ}a¦³�|ó¬éðP¨Tì½¥\»Çã¡âè²Ã_Å·¥ g Â#»JíF•`=EAÜ]]›Ë;…(ùYp“ú(/Ý…ö 8—Iiöÿ.ò]ËÊ#áØ——o‰Ž„j.â…€dÂ{ Å"¶º!â¡!GC=uC¾U|†¦±�Ž�²Qúå~·w¹²A±ü¸†oÎk°#ò1çh�'^¡O€…Ê&x(]+‹Û�MŒ¸¾‚Õhö]Ö¦wY`=Åã¬ïMÃK>œv«špNÏóQºìÒúB�OÄ��wxZ%s´R­H¿û+Mñ¯+J¢Ì@§‘n‚Ô`×ÀN1³Ôx#Ìh.½ŠD€PÖ¸]§üG'�í|ZÒC»YU\¦s­P+‡›Å‰)mGxçS4eýR›èßBÄKØâWÚÂéû[XrÞ-�k\Þd¤I,žÒhÁ�d‰òcoÃmµÑÞ%9ãcU«<„€ò"’ .åV¢ºÕŸ£;¬P¤oý>¦ëYkYsá(Ý… €lú;ÔÁíðq¶'©¥íT쓸ƒ ì(„Àf">S«öô#=b{›i‘”žgÃX{O†w3þ2„‡²ÞpäìßœÉÞ~–âwqÜWÄîYZíäÇ,£¾~fë3àêà(În¦lqEööc#ޝ$t¸‚þR¯óÔÚG5®ï(eæ|æàÍÞ²Oø¿Îøc¡ŸîmèNâ`¥jÑR–Í|šA<Ù2Ù? Òö´§í]ÏB2mo"|ÇË–E|A±„·­iæs¿•T)S «SS„ø ™ š-–§¹ øÆsȸB^7«wÓ$_Ó^~/¶ûë¹7 }åtÿ‰ïY4šj;žqñíbÖ°'P¼ZbLï‹Ó#éÛ»Gª8Hyb16‘¬Š~}m¼9}غ6é‘¥n|‹TÑäÅÏÏçýíêúЧO{pN� ñI&u‰;áŸ-3Ò_üÊ"ëG‹˜ÖÚo�Ÿílo÷™½å6„ßq ·_æÓmà2ýì¬*yõ�JñÖÊ+`–FVG¢3$Tù |„ÛÜ;)š;ý"š=’”O^a‚HŠEà… D£Ò•¹ û ñûÓWûÕ½ÿg‘µý\ÌZw)^ ¬ú5t:ųqEÈ6#½`æ1?ãµ2›·EïΪÅQGÛ³Mnä:ŒÎŽúö“Zö¬À<•õ8uâ‘t g,O®›cë}½¹Ð[îÁTëÙÑ!ûÅnRcÐX½Â¦±*�^S�©¡o*t½¯Sî× úgp�'ÿr„x"&à„J…FKœVÉ=ÖÜv±Ì#³D+ä±ܶ^]�^zWÚ�dòªÿèl¸wJz¤m ¯ô,©_~ÿÌþÛë�x”ŠsY\#cD²8I=ýxa2ɦuÕ˜ÏøA’€º÷ÿ. êÞ’àhc á} ?¼\^/å¡«PÞ­YœwT ÕR•ÏM#šZüÚ'ãØË|e†r ¡(§AˆÇÎŒ»è4] %oö SX†Ò3÷þ1üÅ3Žžºù¡-Yò‹"K›Š3~Éí—Â�OªšŽ']ª»F–@‰™iWãn(ÚO»ói"Gùø.>Ô¤÷ÜÛ{¹3P79‡}²ÔÝåëìÈi8ПYÄ8K.�ÇM8Vey W4é�‡)ØSl!«ªÎð‹ðDÅcMìD³=¡oa«c1/¿ø�ñü}JħÝÛ9=䢩î_ ãW¡Ò£o“puxév�Ð#KGÑj!†J¬BßüÜáÕ§ÆòéÅU+Ñ7OIÔäGüÿ€ÍX@KL’"É? œ;¹FLXlvr0túñôØ1ß¹±¸ \(\ 4©‰ÇBµqè qíh|Ýùä3z~a;:ãí§L|{„�Æé‘…)c:¢¼ý ¼ @¹¹nÞSxÕ"ïUr±0çD5†UJ:Uyi°û•®+|£%¼Þ.ÙÅ0ÖúçVÕ¦Ät�'lÁd&èŽS˜2#|w÷´��Å[£QÌ�vþ˜Ñé�S'¢¶}v\»Ùu�òÈw�—43ŠîyÆ¥�h_-Ǹ�¼z Q:½2yóÔ;Yo«–^3úL zHZž ÂQ�Ô®0e,<.4c]I^dÅ·ñôÌ(íå]a�¶É¿%$…¶’¯e×þÔ«MJ®¨g ùQl­á,ÀMÇS’ˆ¨ÞÚL_°²·ªÊKî�ž^ðž4TE”Í;>·‡ J„ÇÂW\HèÁ£MRP%$BÝ»!‘S—혺`V—»€òô6Î<¦O<7G 0Ä}Ñ0*Z.Y>QÚݶáì]px#²W�,ž$iƒ›æôc¸@¼ÿf«Wƒê‰ó&Û=ðÓrI2j,>܇…$Ñ�KéöÒP’Ä%®’¤ ;;�#ƒ_{ÆÙª‹c3 IÉÆMevOs� ’ª¼„‰ü¦9bû%ä™°^¬dn¢FTÆQ*‚d¸œQmd—šÄ›9¾IP1®xj Ù‹P[HïÃo”mŠèØcgõîzÕÐTUgAW€òNËÇðWBRA¿mžüíFd«:1aÙ�Ï´ôƒ-(n©U4‹Mÿ˜nvÖ×—-7·s� =л?{·#áæß©½iíw�奩ÜZ:;®4w•Qßùd}Î�¸YîzÉòÛƒim1{°)oÍó²|#0,j©NÝ¡P~Q¸vëÊǯa»;ŸÂÍ++¶þ>ØXªð "Ëò·®"Jæ„ÍlÍÂôòRK¥±Ÿ¯Ê‘GP´Ì°ÂEgÇÃÅþ:”á�J­Ÿê»»É–Ä÷ß�àgÞ’‚X nÞ ù½Ã¥‰ƒ@‰+hOèñz�N\ÆXB@ʨ‹ŽH&·& -É«Aks�Èþü¨64">žB¸$i[ѲL)ôap[ä¶m8{Èn îHÈ+>¿}ù@µK°4 A¥`�9d)ªÆtfVç!è=\8Ò˜„ñõõý®~lÛ�) ‚Ï$#�õYõ:fÒ“…��Yh ÅÓ9®=\P¡†Ê`èm¡Âj`ÎK`c™”NsÛ_Hmè­~ï:øbwrü²¾d,€¹Í¹®–i|Í>Æ™�çô˜ÒcÁÄwZ¤º =CÊð€üX±ãL¸ã*Þ�lØ4>~ì�e‘å‡ÅL¸zŽS{“œ51ŒÑéÃt$wÐ÷—Ûàv´‘ÁÓ—¤*ÎF9çáØw7n=ä¥sóSHTêøépsF7‚Q™U¸hä'‡ØW9 ÔlQmÓÝa¼³&túÊ;ÌV´ÂiEàFÜ7Ÿ�ª$™ë¹ì²¯xïKx UsÂòßÂk‰Ühtš<ª¸“³Ç¤#|Å�G~�çèp6s ÷cdë”ágé!aò‡f¹Kö'.A^ Áo›©â2T�ÿU�׊¨c#o¨V!tnÄÍÆm4ç;R<˜ ~Hß§x ²g§qšæxçìh`ŽñNy¤V‰Âè¬LÈ7}õ,º‘ñƒù…ß«!ü^l½¬&8Á#0­™åÞµ‚Êö~Ewø·Vè{—ŽÌ¢Ç�_.D‡IÉ7yÇ×™ª¡)¯ÉßƹK¢Zmh Ä>¹I^Óo~ì…å¥ÕŸé�Ofãr?é­ÁñB+³EÅÛoüxλÃY$yƒå箃"Cæª×é(;òDÁð*¼eug QL•:N 'L`Ü»GU¯Wï.|lž¢‹áÙW–8gÄÆ]q˜²@ t™›€H‡RÚ^tÆS fi§Fè&>¤“ÉÐÉdhÁ†wóKyZr¹‡4&e™NuW@�bΜ�ߊg?'Žþ3m ‡�'­[ƒ Ò(ƒ­eÌÆÍ”%9•ñ%SK.ûHØ3:‘RÌ2ŠóÁ8‚ `²ÎéYß�I$H³‹<å¨4˜°µò'qÁ®B7ívÃOq£ 9‚¤Q˜&J^000…L†4Ÿ;Š™ÁëØ(Ã/²%�èÞšâÓ¦Öå,7³e²Å ù‰ 3­$Q¼Äózõvøvžë_³ÓR!¾w…áë`Ön*TzªeÚ{Ê4xÜ¿ �OjIêÊR[R¹‡ÿ6Õ—´gŒù‡/· b±LÐÿRe±Æp~ð»Ël×dâÙŠ(e:oÌœìùø#xèay0Š¡ 3¨ýMDzÈλ*moGaô�¯õ©I6,bÛ)äNšÖXBk°†jw*¢)Zfñó×gþÌ—î4Ч ¿PhHÁ™oî»jØT^uYS˜ßºBÄOé^„i»K³ÙÐÃßSU³ç«cZ0.ª)ɤ#4ŸYŒT³x€ŒI„T^Úä ¶áÇ_å@<kç)Q±¸8„ßÊQz�øa®ëÙ»ÞU]»«"GJçº4Ms­½ßMq8¯÷SNìv&ÊÿgöÓ^8?ƒ›±FÉë1’;WkYãækf'4ºOúÌYíkÙ!{Ü,ÔÆ¨B51Ðu…õ#£ 0;ªju±1øcç0a[²ïb“K�%Üø×B¤$¼‹g+-�(ØaU ¨¶sšü}m˜ÃË„r-cá坯6=^…Ó»÷è«W'KÓññ·jl©~"ÀНj—¨pÀëoö çÅ´Œ¹¦&(b-÷.ö¶íÙ#ït]â6r3(„'´ªvieË¥ÂxÄ(Ý‹ê ³•évˆ›‰²MÔÕdN¸­,™û¹–™›0×Ü¢²%—ïoûÂü+sm2Ùd1¤bÖ’”ÿbºÂ橽âg:À‹b> ÞÝ.to�ìss-Ô«pÜ¡Hdg#‚ŒÍܧB°¨XK3kzal&.K1\¥’PÞTØdú¶8ê¼òh‚o&Ûg¾ãZ¼ÓŠ‘Ëc*(™|(„LüKÜL"iT,¡” Óî½$ÙMÎ>×¹-Q ¬eÎq#¶‘Ù@(ÿÕ! óï*„¿Ì®¾w*B·2ÙÇÝi§Ô 1•o,˜½˜#šâö“Â,˜Ó±�ùòêÄJwìð5^›ðv‘£2l5#iq­�OßV^jígcV‹~/f}—¶Õ3t¾žÅõý›T”ý�>Ç��óâççÓÞÖHhÃYX‹‚™oQ‚‡¡; wyæAbÉí):âÁrš…\†IT•äVòÕâ/ ¡,¨¬äsf€_A$Ó¨¬ x½DZÉ­6Uô;>\�îU|¸úzsËqZâ3üþY5UnD‹• Ç4Ìì§Ùö¢Äû0—áÚÛ½žôŽjonŽKNŸÞopÿL�ÌÂ<ŒðÀÊŸeZ�ÞùA�äœË"ƒŠIÎÚÄ­°zÞcšì+õ06PÂ6É„Oh"R×ÔÅ—¢ ó~-¤ßeVÑ¿oiÿp¶ñj"åui °"M±qˆ¢ò=æ<á�³Gý³È``iñÕ€E7¥˜=‚L_©·”µ÷|£ÈªR`B:tÓz€,X”å 3­QŽFkªtX>Ì“Ÿ–é-“d“Ï3ܶsÿ�Q°ï\.È ‰§í ›ØŽ*j÷)—eªj �âhÃUÊ�DH¥@=¼„l=êñ-¦ {»fFà¼{e+*):±§Ìdo}Ë©"Òù–Õ·kpA 9sxŒÜ) ·…|ŸÎFN³˜¤}ŽH#_K±¯bÄê•t¶ëGÆU÷B¸¥�*îUŠ 3×�ÕõÎ'ó(#—\_Òe‘¨‚ÎúD` 7ú\�8ôá_WË0EÌRP”\£«o & ×­†CÅèSn©%UÕçÉ+ÀÀM¯]â ‰6™šz{ošS áÈü±þx�z1ò dÏ:¦æÔ˜3GZCàÿH/= ˜i$sг‰üòV#NdóaøHæêáÛÑGo"°ÕL¯T²à=\xÁî†CQ#3Ë’…0s”FT6:™2 �ˆÚ:nÔH ¹(²ÓâºÉ2n—npázXì3«š�Ìõf(8qN H¢hõ‚>^½´ÅQÐ5-¥ŸÖ‚má(.�¢)(eÑì6cGÁ›E y 5[f½7³l\ XèE5äÐúÇ$ùMol½B´Q|˜gOþN½°j;Ÿ‚k8ÎWè“w]âSJ‰SðŽ¢TJSØós&‚xœâ!¦$t°–,(º4ìÐ,¶À²å=Í TU‰Ëÿ¥¼*‰Ñ^ÚBÑ\¢Êæ‰ ó³Fάêò5à[³EÅÇÇB<è¹Ü¤ÆFˆ"~mÐP+q¡%úº£Œ 46ªÊ'ü Ãp�†Sè¡úêõêM]�³‡j1Mô�I¨˜ý摣njSDNp(a'ÈÑ g˜!IbZLõWž5h¶V%:[<8ÆlÑE=:¨OÞ|^/ÛRÀ’à}[õñ}\˜hr7�ÕpÝïƒH@N¦Ê0Ñ›’ĶC߇ÒݸT)? |xèðìáì2ìaA+a2•Ú¨¾Su=�.Cj-;ŸV­†-¸IŸöÆæú\îv<¨¾:ñ-cÃý%>Yu<¼ËN©´hIpF—ì4!IaüY5eL«�ÖbZ5n@õ0hS%ð4{É,ýœо²¶.�1Ø»°�ÓÄËÜvNöXœ÷µ>Yø%ޤp?A�0Ým°d…¾;aëë�éE¨U›Ëæëý_ìÛv¹ÈTÌqW_îZ¶çÖ½dAÚ§]x›éT Îô,À²ò÷¾E· Ý�F ó.#¨e®²díò·×PF¯tš'˜9Ï¢DçfÎC˜r/gü�x_q>ïÓ¥ñW�E .`Œ"ö8ZÐÛ¿©FšI”?S˜¼êK1íÚb»k©E$ÑÖ—pøc{–¥=Kð¦…pûfÁ™të¶MöjŠ E�)n(=ùÒ·$3{ñ !áâÚ #{vçzd¿báÊÍÅo&Ñ8të�"õ17¼“¸Ãˆí ÔU{²�ÁÏÍ® M8$¯fXÑ‹©¶•ÚTùÆö³¨<]_Ëë í;X¥¾ï³É«47°%጖Jƒ[#Úý5ÎRô2¦‡M‹ÂšPèÐ=ðüýÞȶ?#èyîÿžŸ‡oü�ÃöA„Ò˜°]¢Tá~JvIj0P€@Â4È?†uÉ–ÆÖ k2,@ÊŒ×ÂãK¢zù½xÛU·ãïÔŸõ~_ådôW¯} ØÛQ)qùñѱô">§>a&sÄ“Àãã%ª$˜RÛ�?F˜o¡çêÕt0Õ|ú?Ö®l;m%ؾg­|„˜g„ñ„ÁÆÁàØÇCb0³ƒ�üÿ­]Ý’!÷Þ-1«»«ªwUíªv„v'FîÆœ>”M–LÏËm¼©¤þJ忺M®Ø#Ÿù²ÖJ7éîÔÁ˜¤Ï•#òÖÉC1…Li†ÿ ‚•ÀË‘ÏBÎ ˆX„E�Ài)„ºfê=ý:rú¿¹°�Þ�l&¥qôTn8–.™O­c¿~Qv Û”offè¦<l)ÖÅÄ— å5G26«/@sîEÇΤ’‰ DJ¤¡ú:]Õè†áÖoq-=&ÉFýÞö€=ÊXsÞA„tf…úÃ�û ­+ËP ”Á’E°-%'¹V«¦t¥õ³§×�^öò—ž˜>§.'sí.iÙõÓF”Þ«m»“ °í¶WGÑ3çÉ$ùÃil+ÈC[O®Ènmìð{]EwOè+Û~ýbFNrQúG³)Y,XV1Y5íú"�a‰³ÖýÙŠiÓãñ‰n$[Y›©zañoŸ.ÿ ië8Ã|Zq ­5bv¾¡ù:£8¦¡ûFG™m(¸ n…µ7N‹q£¡»ö¬cmºn<ÿ¹*ãкªJÀ¶¿p¬�MÓªgkœxÎ:.íMÔà«ÞÖ¦eh–‹_ŽÈ=ö!]CÇÃO-Á3‰Ñ]"Ë>ÃÀ¡¼þÖQ÷èaÞRp·Pn2RqcFÿNÈ‹c6_•»˜}þËN*¾ÅÑ�qsú2²‚Ùj‚>xŒ/:ßÕÅ"j´‡³ìày&V¡ WcúòçxÈë2ÛOƒ4¤z`:Ʊˆ®=Z ¨)MHfž·™ÅÜ·´-ByÑ»9뽇vY‹XM»ŸXô‚aÒ³Z1à;}°GÐÜ(_  ›¤×:QM¨­ŒŸw';}‰OéN èWþ(¦zʪ7ß^�¤ìUƒlu8J]Yþð$á ^]ëÖêüŠá¡ƒ¸„±·Çñøc\,ßÉS¡éTÍÝǵí±ÐàÉLj ±À�%~9 '¯<[-¢¿êË­iç‹GàÚ) žÇx-ÞÃ]Ü8ë“¿™V?$¡Á¿=£µæþ™òÐ >CEåp. ¿ ÇYíÒ{�+Ç…fS5�8wÔ �èibtÓ¡ÕŒ›­Œ¢[Ú�èÛqñ©Züí¸øƒvÄÕfÌñîûùõÀ«wùcš=»Ì2úÂ%|‚̶D¯ -CC2UE& x˜Ùž„å¶Ïkvâ܃£?ò¨ÑéÉ…F2kqÂjªP“»¹ÙR5ck¬Ü1gm “ßsôþÍ0{?žµýŽ �HžCžÓçÁÀ´}§z‡«¤éE<¯„±õDÕÔ* ¡U]¡íAñè�íÆ™¦‚^Jw3/ö¡½�¬zÎÂÞMéna�£}¬ ÐË@Ï|»¶{«•k¶e-ø¶�fºÜöâWeñ+Ó¯_B7Ó2Îi”\fpr(ÒÝ€ðŽÏJ昿ûŒº%¶öþ?žw>Ùõq-mמ;ÈÉÛÜù�0‚‚€:¥7dQ­W³·Ù9Wä¥] LOÛ"ú›6�¿Ë7†z¾0=Ré‡Ë,½:YÝ&‚°W,’?\~ø ÇBÁ.ää¤}>gq/hyB9Zêžtâ^m¿L.�䲿/c¤ E®!Tþ@è�DZ‰ÚíPù€#ßHÓm×0È´×=ìPI¹šÁ�Â6E„?o�%£î6vݰlïÀë÷çLÄÜ ´ )>û¼•>0†JxˆEæã£f€ß›ße¯ÇÓًѧ]µ96Û'á qÿñŸu©d™±T+úaå;€n+FrÂÞ“=ŸrœÛQ$0öEM¹ÕGÞ6kx˜“ÄÛérΠ’ÓõÙÃøº{òÔ_4ÿó Ïú£ØëÀ@Ñ8¼nØñE/UˆmLæýâ5¶ q.âÙ°g$ô:AŠr¡#ÒÊ€�v!:³9½6¿+ÜŽ¸˜¥LÅ2Ãí¹ßl_†ó{5`.ºW­5�ÝNõ›•àC~4W‚–JÓ—Ç䛨9¿ÖïdFØÎˆ`\ôoÚV²KòYó?7L¸MºýcGB§ðgg× àHÏÌ(ûN÷~Ø@U T¶]gíäT†¼î}ó¥:‘¹yÂñÊEöß‚þDVz ³ý’2%áø²`!¢á²5 á’¤)¬zÐ~Š¥Kh6D‘�ïæ£Çú¢’³Ë7 Ÿ¦ƒ,bÂ~3XfË 4ÕàôØüçyžiUÖ¤Sþ´‘úÝT8‘âµvÞ% ìÎçº?‹Ö^ì6—ý0„¿5qï_î!>~ÐÙ4w‰nv©Ÿƒ 7Sæk¶–0[Ww¶PZ(°7]óôü\3C½œ9}º÷X‘gÙ ¯?Wõ9†Y?íÄ'/ùˆFw­˜]°«Q«qÓ_’›r�™MK¹åĺ­Ï9¥²Ûðã9û{9ûË'ƒq¹ßöfåÍœÄjIZ€ò!ç|ÉžyBäNÍL>ñÄMª¼9ô�«ÀU#à¦Ô2„"ÂÂMYÂ@e˜²Œ0e•ÓÈiäø€\Äu/$•M>1ûè¼/ˆc¬©ÿ™hºU?ê½cϤ÷œ‚U5�0‚¸Äpñá’Â%ƒ‡Ï`Kìs�Üƽr—–3?kÌ"ŸGqLÒ wŠÜFy’ò£)LU Sà;<É„kê½Ø¥åÅ.¹¨c�Ìâ×/›–x?rêfHGœ  ÛýR‡S‘OŒ;Ë\JlÓ ¦E"?·¬èKa§7Ñæ H9ySî0Õ¸ôËO‹UÔÕ ªÜͼ»Çç|d^c4#Ý: ÷^b:FžãEqЬäù¬›½¼X«6ìÐ^¦õýóÏö�³·ÚÅq|¨c-3r[‰Kd]vô4O±6- Ù!Æ“œÿ[›ÌÉhÅ© ‚ '½Åu¤º"  Î~dÁŽfdù5Ô^WB«©q­X4Ö|vz2èlx6Œµ¶³CÑ3�oÂÑuì«5¨*Œ‡¾~Ù·5¿Ä®Ã£ž=žÄ‡Âˆ,~ÿêÔIú'Õï¯ŠŠ »±áÅ[�c?×8›kþ›Ò8Bh¶î+ û¼R§FeiÒø6-E4ÍÁê ›»+5oçÉß{n6Žü´â¹yßDòë2?»Ê2X•çqJl´’uTÇé •¥m_™ÝÉâzÑc‡�<�CDœî#_•-s$¥Ÿc©#ÿÛX*xÂÀHg÷äYäOÂñMµ{.€5DðfÙ�¡�.6áº=Ê·xŠçªr>bòtÖ¶ú‹ÎOÕ0¯‚J€_úò÷tHÓ:Š£ä’qÓ2Ô/¿Fa‚Ò¾ãNÜ)ÀP×"½õj¥ýdîÎÒuÓ|öŒïÓÒŒ¦}iÿñaoæšQá£³é”»Š´Ÿ}¸ßÒÜ.C%•»Ù™ˆv,£tÉêœì[lnù﯈ñÁ [Öú»6“g– JÃ>wÙ8�fø+ÓûR| (öMVd!ÜWƒGºÓõ”]xÌÁÝñ•Bë¿Ð[�Ãç-ãéo#÷¿ïTOëxo€[?;ò�2eÝ®|§å™MkÓ6° e7öRl­A§�@ð½åA#êË„oÏÃE%?L[/Œ>v î`†b“'Ž ßfùtŠ H·ð£;Gd‚T£¿Hš¤ÚÐq¶l0ZŒEÙä‘"ߘ_¿¥?Zý×qþâzaÑGwY¾Úš áËÀ^¨óÿ‹Ÿæ¾7nWh2¿‹™W'aYõýŽ¢³„±þŒm]f+n=:06»yf饱R..þ!�ŽÜ �"«ÍDBƒewˆŸÅ^™•È6CÓ‚ÉàIºˆ‹¨1'±¢úÙÊYkެ}üO«ª1ø^²Ÿ+Jym/®­lÄž-…ìÓþîúyðîÙæ¦2žø•}×Ú­PJq§Çn;L_ºÈß`8{l^éVc ÌGöÄàà°+Òme™¾‰*¹óÃ6èq@AùãGSúr¹ùÐ�H‘={ê,ÁaX´ ˆ¶HH�iÇHÞ>RΚ*ÅY¤Ày§X#«ä¦ª%ê¡x ”Ž:>×V6?'Vì‚=YR'SE“´ùmò‚ÿØ…â¢s2#ó:O¡é6òÿ�‚¾maíí².j«U P êf¾ÏG&†ü9B¦\|h9é×¥B¶©„.Ç`-qls�ËbÁ׸ž“ÿ{®¢¤�}L0OéïǺÕÿìÕêƒÿ´ý>Ø¡)]ú îÆ¸ 8ïõV"°h—ks1LzÆ ’«_w±;•–cÁhÂÊY¸=l)öÌsÝ=IÍÄ#G_NVh…Ô¥øm%÷;DWE_÷ÜêQÅÖ¡(ŠC‡iÀÿ§arŒä©2n‚Áù¶‡Éï)Hf¨ˆ GÝM†Y—} Ý9Œ»®‹äM@ww¯þubE%0ž4ŒßÝLçf{�ì΃݅aN¸€>ÄËo�Ÿ5SÙXÕ[ª‰"¤‰�Ðv[C#N2Ûá‰.ò|ùA)É|7,ë)Ö‹’–¯+U/I'`ã«g~‚Ä‘XÜeË‘úvI2—‚�Ù \žÎ¥ä9–²cEîñ"ZœÿDÌà‡ý<˜ù> u€f~áœî³ÿ¨/о*";EÎiàå1H&œÉgràtvF(ŽŽÏÖèé;–ÊMz Z.¥¢GK¼U?�9hcåã4¶€¦€óLJà`‹0ïç¿fqÂ8wgvˆ¬Îh“±ú\«æ¤Q;Ó´ÈFçÁ¸ýŠÝÞ#¤âÏÞkxîu=ç>Ñ~è�îꔆ» §]Щt*ãÀš [¨ÓÄÑ$�sÆ®N1œ{…b1ÝyÎ >8ŠçjÒ‚©C¬SH{”Ç´ëüL‘N… ¨SꤺIps3èù“w‹çHJ”þ«Ã<qo˜6ÌIî¯_ÜiðoO�¸Ãs‡Bý‡S¢Lwp\V˜þ`„»ž$�2J'%Úb¥-`)ŒÊqÀ¼z.Ŭ¦Ý‰“ã7±€Nxb2"'¼950ÿºþ?QÆÞ  –ÓOé µÚ ¦_˜¥‚’Dª(WÒ�ž2´™W× ¬+6&�òKúŠM榱´Xà˘%î6Sƒ"Ê)9@1cѵԈyÕ,FfÓÒ•âeA¼ã°Ø6IS¶±‚�:ÎúÞ§Ïk³òþ÷VÄåS3 ,×­�xj”Ü�û4hbžÑ#õ鵪ιºÊB†Sx~h‰P¸œŽ›«cA?Î-›]g;vù͘¸3sÀ�sOÈš"Xi óJˆ|[•87ÔI¼;?õfüðÚý;_*’…ðxãõqi­¶°Xv„oòy }²¹“a6me~›Æ¹LHµ.´}ÛÁd�S6ÛœÒ/ŽÏœ Y¾¯¼* Ô)› ;üaLÁ1puüb3"˜œùþ ˈnvò|c'‡Ýò¹ÑI¤®ø9¢üxÀ…‚uúcîCÃ#j•=#LÐ÷!ÜÙþ§óWËÿó¿üŠî:¡€®�é‚‚ûépÆÀ;ld…*̶Ѱ1wÍÖÌ1[%Ÿ`…°å§K*ÔÏÿ†mŽp¬4„Köcݳàýÿb‚Ú�è^ÓZoà¡|²ŠˆJmÅN«;hãUAùñ€vôΣsæÃœM1._¨÷”ˆ0ÍÎ�‡Å ² 6tG¢Ž™�)ª:K�׎µ%XL¶˜§ÉÈhGå˘‚FËWA)V1%©Ècàßß}Ίøÿ `>D-ãöânm–îk3|ö´ä;[‰eÁŒk™ýµ]ÿÖ�[�äÜg×:´ T|æU (?– û�Ï[|ÐàQŽ ÷ltîCÕ ZêÀ†å&/¯Œá;L^ú2<\¬šÒ¨áKžÙBòE‚ØÀ?a¢y*™àü ¢Ò÷Ü•EÑ�ˆ«â¤ 3ÖR?9? YI}ÀÀÜ¡anÈÔÍEH#nˆ{›�®J”n•€0å0ÞTÄO¡+•Ç„ÿøÈ�vñô;g‘,í=j6VÒlóF8³ émab„e7 s.ƒ€½w +è2÷PÀâúßp˜w>ûüίrlŠ�:]–Ñ#VÈÖæÌß‚Ë\è´öfÏbw„⢆D%Ö’#‘$7˜ Q0ÝŽÐ$PWµPÐ2Ô�Þ³+5ý­ã27˜É*X±¥™³ç%0”°4ÂGÕ’Ž1þF_ÅòÆå�ŠuÁi ói´Ç¼:‰á4™E:¨¤y§¡Ÿ}Z�© ,ŽzýŽVs6©µ'“—<8ì‹ôùnCÖt6�ÂÒÙŽÂp4@²��œæŒâˆÝÁZåÊ\xÜ�…PìÏŽ Óÿñ^·¸p˜xÓOnRog¦ïúd±‹¬Êú¼âÃ9–ÔÏã¢Q5õéóÉõÔ®Ÿöi«›äÖ�FX…uº‡*ó©ðK“ÍÇŽE¹ä�‡{¿–4EÖÁÞÌœafÑÍîN€*wXDTg‡ekÈžŸˆ+WÓ Ìî¬f„™�™½VÓ>OwPg¡FpÚÝ¡ÕHhx¼%¨w*1R°�‡5NÊ×Ò³ì¼>7«IpzrÛ\X—µNÒH]Ôý³©3™&c†¦Ç§Ë9|7=޼v9€épƒ‘G·šú(%T0~¶ YÁB-a¯.¾ Öëá0{àÊËDìœÄºOõšlvS°ñé±u>ỉùï¡N>è,é¬à£�3žl^æ�i�ô²VŠÔîÍi[ç˜#ki˜Óír}wƒçB¨‹Ì[>öž—ØpêîÖ£ˆvIrÔû ¹W÷'ç´»Z­A¦L)FÄà  o‡y'ìY3â ³�¤S´’†¨‘aí‹u—ûˆÕ¥ *ä æÍ_L˜„9$·s¤´›€4‡DAüî0/�ž-²e£2üLaRw”ïIUT^fÚ„aê'VêÙ`ac¶:K.'Ã½É £sŠ…–9 RhM¦ü·h‹äÈ+“ÛEÎëzœ�²³Ä9 «xK³âÔ.©;’ëQÞr\Þ9ŽCêV³pÝX×||¼µšeAégQåÕ|²ôÉÕ$øD/û–"ã1\ [tí+Óúä’Ò÷^‚žÐÒïÔ¢ÍøÖB.ðc†‡Žö¿Ú�%5ñ_bcg!½;¹¤di1xëò±•ä%5Rß›~f²òK¦¹s&�s�œ9áô€H£„c ¸¿ÆEâ"äî–bË�â–|ÉÓH^ÂÚe‹m… “«å»± ícðÊ ¡•ØÛÇtÉ'·ï´À$P΃HJ¸{PL±Ão¢�bq-¼þÜõ€üÑ“@ÔñVë %@ìËp#è_ù§ŽMß»SçUì‘Ée˜9d’ŠÐîÒö¨¹•ŸÖ°¡l1Üï°<ò jg7ˆ�9z W„Ä€ëü–)Õ¶âJl̹ƒ~[ I¢-ÇJ •‰zt 5ŸñC#‚šoæP×Êý2£ñײâ‘ÅÖ Õf åJ‰ºm ‚[0ôÔúÁ‰YfmVM§Ù-7‘+ÄJ ,‹®øN§ZP œ±^Cº»H¤ki.s.7f³\sBu2Pn:¤ng”·ÜJ»$—º²Ç>aœ–�½.œœ\ˆfäï˜ÔÙ��þ¹°1¹úîºÐÜÙa[^Ÿ5%¿ÂºÖ¸½ƒù¤™Ò/Äâç¦1K 2Çf² Õ!ºÌ5!“aÿ¥´Ô„¯‚õw…v~“–�rOž )®‡ˆŒÄ@tõzK®üx˜É½{¸Î2-€+&o…dæ ¦ÍSò¡ÐÝÉ:À{ñÿ!íZÛÒXšà÷ó<çG,ì²Ü…`T.F£Ñx7Æ�F#²Ê–þÿ;U=³ &*9ï— ÁÙÙžž®êêû¤’°¸ä�Üš«n½ëòÜjpW‚j0IÌ;`që �9"©wd·eiD룖F*y3—åì`9q~  %ü¨Ü•‡sóÖ‡íégbϧŠ¢?ÿd3–Ø )߬ÊÔˆéT7|ðwØQÝ�hÍËÐþq¥‰ôˆ¥ýž¯ö›tRO0ìÈÌ]â$è9ÛT1?Q2܃Ë�ÄT2êBt¢dÙxû�d~T;z¸æx)1…å6À…)âaDÅ�\{ÎfÙrôßxû4æˆÔÓŽWB÷¬µþ±�}£ê`ö²öIaJëJàâÚ'îÐÆ«¤³ÔD1FajãÃ)™jõ.ج*NÐP¾«gœUk ¯Æâ±8!�wç¹0×jºd ÔbáÄ9’\`�S$öKI†?ø]CêAÈ�­wÝ’!Cá¯:šþçšW³{¡Ó.m¿+k›úŠNj<¼’‹ö%6ÊZ ÞåRE"(ÐÀï¤ïAF~[í—TOR%ÙÒ êì–éÈÿF±l/ŠÙ°e:ïã+뵘±B={ ›pïÌ� VG K@(á*ÞŒŸ!„¬“742ä‡é{cõãuÒº&ªdÝ/'èOc+t´@3]çH}:Añ;)laÜ+#ç“e8µÍï|”ã}“^øeOçcÏ.S®A°¼ƒœiø‰oÌáÃîœÙÕ¤VŸ-à¿¢VIðë¿wþ4{‰Kó#B=á»÷S+ö±—ãì)Tw·2Ž w&gþÂßòýxï4}Ñ jí“$_)×ÙbhÆJðôŒ·‹ P[RSø3×AssÆÙí/ÍÍY¿;fÎhlós6Šmçq´Oñ…Ц»¥×Þ­Bö|B:©Aî6çë•k4Þü»UÛîî½^pµt©Àâ±óØ]iNê¬ÝAº?Ò…Údn„¾A1 ŸÜ\q1qߤŒ*\µû­øiŒŸ‹à.…{Dº@ õRåEÀ«%l·îÚâI¬±Ò‹Po{½·Ú›cœl ‡ÔàкrO¤‰)ð P Ø�àûÒ| %e$û1™›XN …·Ð›fœ‚5ìÄô 0T…‚´ß§ãwVe{×2á„@MO#"ÁÈ}Uí’ªÀ…‘SDÞnÝgfööØþ4]gë 3xÞÛMtPÁ¾5ûÊ^¢j†nj`FÎ{ˆ†¿°âž«Ë­�[&Þ�™Ï]€dåùp_åÐØ 4%¡H¼…øùËÍXI¢ý_jÈ�'3Z>ŒR½ÞÁŸ=Cê×Áf{„þý¢d*Âq35s iÁç�8âÓ$»Ày—Õ3æFè±@6ÕÜ÷ò¢§ ²>�ïÞ|hÄÝ+yG�ÑM©–è7·le€«Ê±*Ä5¸ž¥–F³¸ZïýƘ$ã0s1ŽWOÙ" Lÿ®˜Q ¢–B¨ˆbØÎ$ ”–X�aúÍ!€=i(9/ãZ2ó{’«÷¤¥˜‹hÒiÕÙî“kÎúfp™‹ ªcì|F›9-79ÈØØ±ƒ:Øp�{i¯úx•PïfZøq ö×Tœ1­=…Œ*n³Y1sÅÂûÊÐr“çw™â1Õäéu9t'§ìƒ•ÐIã½Z¯àCgdô]ØQX¤ø›F›°x±M̘�Òj«ùe¥žg|{´aŸJ•°CîÊBgž°“c=º( Þ7&b›ºån«‹GDËiŒ?_ÏEˉ÷Õ/̹u4âªm¥Ø^8:àò¹{‹]gÚRAõÉú–·­Œ‘fiÅ–nÓÝ•V±Ù)wêbªö×´M+$Ø=·ü ø_+Ñ ÉfëßâK¤¹ÐRÖ:L3MÕ;­§Çƒüç +ìŽmÁTc³V(®8Þ�äàAÚiçÈçõ�KÌÞú�^WžÝ’Wlœý~v µ—ļî×üz›«'Zlè}ƒM(ýc'Pûo?FU„Ü ô#ÃÌöý$˜¼_{Ç…5Üý•vIÆöºniÒ;íØ>ï�; Ê °á<&;6‹Eyìw}7„d>u—X?‰P­=œ'ãˆõ+ÿ˜�—š î{÷_‡8Á M>‚�|ès“óüYzß$ñÙ}ÏÙOÞÑžöÏ�?ó/5ýÔ¤o!´¾5qÛ÷çÅ%[W££íLSA¤�§^¥@9-X\呂ˆš0»ìl-¿/�ª<)øBÿòQ‘ ãã‘gämå…›yF+¦ù³=sÈ@ø”*w‰yJðõcÎ_ÑÓ¾"'¡åVÕÓÓVOóêÏú=:”òäpˆ¸»Z¨[[²ðÞþYÕAQÚ**D´7Kìk¸1a�©w¸xÙ9WGÞ�Gw=ŠÂnÀDwÿµ9�?©{@NèA£ ^9Ñà £—î`ÝóüÈF¼ÒDgð°Q e" ¤ènÔ¥V»/ÍÄ´¼¨çñNbÚª}ˆ‚DÝÞQ·ß²·âçSýм�¼¦÷í¯ñDF´ Ñê–Ëð}ô×K¹32þ¬š»³´Sû �߸ßU+ <µÊÝÜniYmpÇ4_ðÜ̼±bbÎ ºZ«Ýý(1cµÚÓ{í}áʨͨYkÃPs5ˆˆ>ò:ºã¯ò aÍë+õú Ëbg‚½¤î�w�IÂ/Œ4S²�ñu`Wq:Ú‰Tœ'¼1ÀJ™è-ÊåIÆIbšhT¯‚y¿èvéK9š ð #³> Ü¨ÙÐìõèç(¦çÝãŸ{¹®–3¶ŸòR ¿hIЯÒ-šu,|ž�T]/÷Ëë#çò)O@+€ìÉ¿ÿ¨¸c1T×ë\G+{§ã•©Š»¶RÁ$ûþa.ƒ …VyâÖþÑí®ÅËðÁ)%fé%iLÁ!‚ׯ°0R›C#‰yžÚǧÓÂË+%dÒ^>GLŸÄ;\pâL—p.üäÍaÆ@z†­´’žx‹�vƒÚýIŠv”îö'›�¢š3ü3rj')F`ýâVmÊ0Ëß¾ÙI‹ˆ“ÀéPÈü,K‰§c¸ócC9Ì¥ûLÿ(ÑUEœßCˆÁ÷b"NM¢i ú7\Їmb} ˃ˆ&m¶ä •— ÕjcCP„¥ÕÛt޶°Ó½ÒÔÀ‚ÈkðG: b]Ikšù90à¡ÇJ‰r‡çh¿¾RRÊÇ_ïÄ2×®ÆØG½2¸8W�|WÍÕtJ9‘ôØÄŽo8W€ÅíL`K6†€c"1- ôãR¥�2Õ0š2�:‘!b(SuÙµ¨>õ´ÀµË×þ˜g�o¸fÕð(Cn(/´w¬z‡¹(/û{w&=»ød­ýÜnφň K˜¹çÇÑçWÂLFAg½3²&˜¿Ÿ�¥,ÁU±6ÑÙ¤#õ.çð¡�i.È9›ž5Øûæú¸Wd[&�˜Ó¤}48KË ÏT#oîôÅk¬¬6u<ŒÑbܹŒˆÔ‡Ê)DIž^a( =(û �_îÅòCžZ±§e‚÷8žLLž¦«�À”[a…d™;¤”áÕc(ÉÍÓh#¸÷p^q/é¯ÿý§ù«ü«I ;Úè¯$ºýýÊ}.lÿ0ð‡ì|¡}NyÓê-×scAuô¾pÆÚ)@×wPdá„ctCB$–#¹×Ûßvfd?dß=ŸÌëQÚ™IGAÂ…y<\š’JädJpyQIÁ÷ÚR¬¡n t*Fb¾O=̼åÆ6±nWºíäí4õ™ô†¾[ù6Q1Û† ã?ÔF†nþbÑ!Îvf;8Ø(|°¬¤ì+*×í¦qVåžáÙ¶Ðköβ-äVˆa´¨WgÄ£Œ¿¨£˜jÞÓDÐ y³��©�—1cgfI(d±{ÚtŠk±Üì�×Woå`ÛËÔêr¯0²ÃÀp�š£1ž6Øq3 H䨨tãÇ£äà_Ëñšš&ÔêNóJ;YÄgB,ENÖ·�“…Æ2ÕG�Rj�¦Ÿëõ Ø º¿�Vm�èÿ�£�°FV^Þ}€¿zÒ){íYÁìÅ$~§£ùV.ní»h´”÷�Z,}gÿ:‘�æI™ ålýÞaÒ~¡’6Ý­ š³Ý9Þg|+ª˜ûóÂ1(»’H¢u1¡øvÖ6ä©ÚNJ«ïY²&!Wê„b'¼Ði%¤tdD JvS5¨Q°Ç¹ÿþ>¼‰£¡ÄGв”ïh´…¶Ø«^x7�æí�Ì£IoôàÀß{EX£¬Ùð™LÞ¥Ø3îF––±×ôluSZ²�S¿°ÓD¥²½6žaZ:„�ž­ ÔÿZZ; lÕ>v¾ÞÒ[ïvi’Q�àðü‰êÄša[ tXÁ {eŽþIA Xös4cÌhÉ6šuH×z1›È¸=T3Ї%­Ã5^e‚ õÓY´Ú#�W" ž‹ˆ"ùyù׿¿õŽþÓ "k2ƒK˨M¨Êm²¾Ô/¢|Š–%o“| ŠÙÔm*OÒÞK¨˜þ[’!7tŽÅÉcûêý�£§ŒºB¾!«—ÑÏ¥i�Ùrý˜N®ø–|Ïøà6%„3’HO:CÚ,Ø=�áµiþÿv£Ôh&þýGæ"oœ‹ág§œb"¿=þòÐ`<¤fe·Ãùéuvîz|ÅÈQ:†íOÐꓜ>Å©…¬°Ï‹3¯9¢c±$¤TŽ…NËÑyží,jÀ²upŽÞžÁ£*ˆ˜›E¤€_kKÍó*³7«èrÜ_£zÝ•S’Ò¡Ì =AÈÁ&ñ:M5­.ô¯ú†•-Á¿!7Êμ!31¸^�MJ«¸ÄàÓ5 &vЪßW Ó9«G¦J,û"Gñ‚ið �ùJ‚·ÐhíÇØƒÉØ &_>/Géœ~sË•w9‘¤|î6=d”HŽ�‰s •¿¸¹‘üòB÷Ùck 4YHòc°/ùü ÀýÇ!Ϭµ�Ck�^_èÑÝ(´þ¶tÈh\æo^n­ MîgoÌ&wiðÂvÛ�W½‘³s�ó7騂ˆŠ7/íô2ßsIk=ñÝ—ryµb0œžIÍd:�µ%‰þÿ0CÊ,ÔÑ4r ›ßy`Ä’Dij±f¹Ã�;ºåÕ‡14 ¤F6-3Øå�Ü�ï2&�JéHâŸ+|Y¡É°_æÞËŒ¿mã/Zø_Þæ�ó�féá¼h_’{"O­œq¥%Ž8õNÝ®'©MøiîY¬Ý™yÌD‡ácö•®sì‡C3g�d`�l8ì8ÿã¾»ÒÊ?©)>ú“e/j×”§/úñˆbª8°•§B6é§|r=Ô?C+ÑOJ¸¢”Ĩ!Ÿbø„ù\ù„„Q!Ô%šç“‚5‹•kE³·çFʳ=³ßU2|õâéƒÙ?½ÿ¬#²ºÃUŒLm²;§064ZÖ6š¤Ñ™zq C#d C}h®ºæwãswèM-ÈÉ�÷Â9‹æçÎ2=mÇý�MT¦Ï`¹üµŽT’7žÁ +]ކ## = "¬§1¨ ‹!¼é¢¯6•AÕjOËšå—ð1‡ìçíÄpAÄm(”ÉóŸ+Åݘx’¥Ñ·Þ,ðÙieE.¿¶äx`© çVš‡+:†iš…q)„¦õ™PP.wuÇ[ì�ˆË@ÈC€Ì@ÿ›±jyRžÊß~>¨ÒÏ”$CnŒÁ„ÜMò!P[Gs„ô†‰;£Aù¨“¹‘[S[ È µ÷’ÜÏ”ï>K©Þj@2öõ0Û=_¶‚gú€cçÉo?=¬ò†›[i’ô\ÃíÚðK]ýÿ b;¨V)£s0âFZgŽâÖ¿ŸHp '£bߟ�§Ï±jãÙ_¦¸RxÚ$ZÕ5Ìr²±ˆ4=LÇ\m¬À ¿¡`w?eÍ×ËÒAÖfªšì29nÃbx+ÿÐù4�7¯C@×ÐAÑG›*ÙDˆ7g™ ^M$’;·íPg`Is?æM¡Gà áeZ¾Ì¤‹ "aTåÚjLbñgHx®ÔÇÜ…èA&&_6Õôp4¨íÌP�2"5<—ùè�!.ÎiâIO‚=ƒêë`O¸fÂó\gnÙÁëc”ŒX£tC0miåFaʸ-éròËÇãVCÏž´•ãIÏì(G¦õ´¤Ö}ƒ£±¡$û�™ÂJÄsΨx3ûn2¡˜FGÃâ¡(¥–¡|\O6}½C¤}z$ĬMÁ¬‚O{Ã�?7UmxTKåßàGÔ í3ü²~R8§h(Õß3Ë€›Ň9ŸÎQÓ¬šAgñW�N+ôëG kõøûÝ .äï³.èr’D{²@°s%¹]e'a•c•_d…*àŽÆ~WÃeÒ9uåÖˆB�ð9” ž©°¥Q½Ój ï>#S�TQÁ¹î£ÄËþsõ–÷/@ÿ¼�‘q+ã‰�…†—§E&°vti¦(nr(N´rÇÈœ´¤à}8… J'#á« “FŒšP{dÝ�ýÏïe[«þÚú5x¬ºICÏe|~ψi ¿(à¿ËÎ"”þqüÊŽÐQ3yuü¨�·3ªk)x±2•d½rgc($“súͲíwWoš#Æl&í\¶wÜ(Ôqè2ý¨þ�+…� ©è/÷[Ÿë¶ ¹?–X ÆVº‹œÏ¢b¿WûP>‹iUüJžÞ#޽¹¥|÷h(cìúé,–[ Q>(a¼Îïí`íF&ˆ»çé ‘JHAåÂQÙ9–¤™C*Åí‰%³~*7‰çËICô…xSq!F»´hÇF|$zÚ#÷®ñcMK1ÔŸBe-ó¨ÃŠ-Â0…DЬC¸�Š;îÉzU‘È;‘TîjMÆé(ˆ/Jy@W“]À üÅý³*ó�“Aÿöþ#‰fàú{QMà±™ ’ÌyìݯO⯘|+?(^9‚6…½on\ÐR¸¦^Ó[jÊ”íy¯fvxÖ‹i©"–f¡ŽY$B�—+i*\…²[ž¸º¥”æk4î³Çþ,ÇWÖ³röÚýT”ëÜ਼• .éµFñÃÎD³Ü¢4L³­?äÿ÷gQÒÂT•¹+´áUÞÛtß³¿üæ±µ:еè¬}øéû%/}ë2 Jp.pià²%ñ‡ŠTú‘ˆ|Ä"íQÿϵiÌEÍÙʇö9–D dwW;™‹ :{.6+½“f¾§]’¨ýÃË»^P;©9¤ ¬® ÏH)“¢$ÇÕrn6 ‘>¾¿à‚¢Žþ´'E;’2P¾0úYŽ¹ÛˆۑìD�ê “Ú�B—à*q™ý\j¤}·x6éjW=r¥†fô†«Í``ØR%›'Ëm¢vÍÒü0÷r?Ǭ±¸?ª?S/>H>FæP£EN6!ù Mƒ%…qã"i¢žue;ÝÓNôƵ%!Ç§Ž­EúŸ�øá5wEj\3Ê „ÏÃBßœ’´á½É˜H¶ÐŒÂG…§¼‡ÿ±w­]‰ôÊú;kùGÔû~AÔÇ»"ꌈˆÐȽ±»y/k¯s~û©ª$Mƒ:3û¼{�OGg°I'•ªJ¥ò¤’t‹Ù½´�ÿy2ÁØû›�Sðk§ýý�›°Šô ‡©´õîCL 1º”ó32ÊáµÖŽô–†ÑPÜ*Iá$˜ÿݶ7êj—Í-£0»ž¶†WÍt—Léä�ûÀX©Øu¿‰Oþ×2½¯ÞkÇŸd >ÏñÉÒî��÷�‚X9Ѷê‚�Z m¾õh!R²Ó^Gpqç‹Ð͈îSmp�¹{ŠÇ`|ˆŽhQ”ê­VÆJ÷4Iœ ^«/¯¤×-l´½tR¡7 7zƒi5ž‚›dj™×áxMyñž†t¼ði“V*`*î>³Iùm¶>í(£âíÒ3I8ZŠs¶±îç§O´h"d­E{òšZ)‚OÂHðÉw´Í!=}¦EpÒMÊéõ_WñøÓëë§Ã N8ø-¸>ÃŽû¢©¦«-nÅ ªíD£Ótƒ¦R‚z\-n`³ŸÍhÛ…‰;ÆØ»Ij\ê¥OÜŸ­]µÀ�Êoùá´~¶Ý(°h(dfb´ „ës+‰¡ÙTz#ík®Çžý‚™FƒrkLç�ÈÇÑ#!‡“‹LHí:VŸxDÿëCñ)cÂe¾~õñL…¼’UP@ÄÛjÊi²ñ~pÙ|¦µ(jð‘V?’À@°�Á8 å0û8úäøs'K;4‡Öxü:çb’}®o:Ä×ã6ÍEˆ33Œ÷ñô÷6ë!.b°€£ ¶ìNuc 4wzçcî&³³s�öógw€L! ®ÎÀ�bwôZ MT¦Ê¡2¶ÖYÐO¢ _ÑpR<öTúÂãgt‚h=Ò$YR®TM±ª€Ñë9{tR>úªF,ÿdÛð"·a t¸0 £˜ã€Z˜qæŠ 3ìœ=n®sgáP9 )h1/ãQ•Uü0æFM*:òF \쌯~ù_aóÞƒÀç2<`$ˆY½a“ͼæ�O@)¿‰NÇã·öáP˜MÄhÒÅ÷Sqç“þZã?1��9ÿ€ï^+ŽÏ Û�:SzžcyÊ×èdÙ=í‘Òð!‡ÒûƒòO¸=VŽ“É¿Þ�>z\r‰äÀ‡VgìÏ¡ᆕD cÓ’m9¬ÍØÀ„KÍbµöjƒæ ÃIe3¤çÈÙ÷ÝŸFS…�…åµß8ó£€mnÀ4ÜãµÙÓ´™odhLbçbØN“¯¥ÁkÊœ®²¥ä,¹wx™\ ß­‰É­ “W}ßrêÅÞv;6ߤŽgb[è!¶ù9.~¢«‹çik+r²]šY¢1ÍæŒ2OcU0*^yÿÎ#Uߎà´žÖ^îÅÓŸ€šÜÓ ¶ƒ¬¤ÑßwøÀ·Ž¬/±ò�Îâ3† X˜1eÎpÌEAÍ>†ã7øúÄÂHË×¢µˆÎÑßÖeΜÏwÆ­w�@𠘬ëÛ¦8Ü] æ_¿yY%œ?œœO'q£�¿�¬Ïé\,õ�æC>}îïz†J{wÄã$NÂ×úf~�¾²�¾üÌë>>÷àÙ*nï^¸ËÐÄLo{æÚ`©zY#á¯ùFšÚ‚˜i«Íy^JÁm—Þ§t|¼W—ãìÝÐQõõ>SÙbÏŸõ‹;yZ<àkÂb†KÈÐ7E€Óˆ…šßÕ›×¾/G7¶^ÎB|Ù‰_ÂKµm•&à?>ã›(Ž úDXx$_BÜý}SÌ"7]˜'µšb÷kûÓ�î’×8Z›º­@gãû\. uÓÎþQø<ÁGôÅlŒ¤ºXg/ßds+^Y²#�>NÎØb2Æ{c•VR$&˜F÷’WZÆ­ÖHÂu;÷/Ýbi;O_DÈk#5"=²e¾xOË,øvh±¯w'øà òÊåŽ>%­�³F³I«é>á@�F?“….–5Ø ü”�|¡+{бð!¯Šž”!âmˆ¥½Í0Úx%†z¶°Çúã3ä-ê_$¦â‡Ž[ð±ÝZ¿?íç׬oÐñèìc§sB�Ë3–> 5YÆáÑv�ÜoÒú8ÅÃi{)í—ŒVÇiØÞî] Q~•UÏ ÇÔ@�Æ™¢¼‘?; "ùwØ` RmD{…R䂘‹Þ …`ÎŽÀÝ™CAŒ)[ÔRXÓX–…àŽF @9cú¹Ã%)¡‹�”$_°Lhý*iÝ>àûYè™v ð�Ó›¸bÖJ:[õ1[E›ÇuŒõÔaT�2oÖóÊbüDLAšþ¾u½Õí’��¬Mõ5G<Íç'\ß[�±lOô§¤óŒïF»Ž�:pœ—ß‘àœ}0 Xd™®â,sβ±.—¡ð ã´o?±á:Ä Š Ò˜Lo-d|,McM2Ý?`Yþ�[Ñœ_À‹w;OûЮÁkLqFmÿŒöšQ ‹mÅýp4yÜZ�S~Üft¹¾›¤i~ãP)B™CæicÞw~En9rÆtƒ»åýÍ<ênN²ì5߃\¯êÍ£]͵ûá)ïpéNìT䑉~x{4¦8}]IüœŸøËe&ù8[뿲—bPe´0øØÜ>¡1’µø™h£ ']gÃÙº¨eGÁ7ƒ‚ºØ‹ão¦v=[#V¨Zªôæ@{È4Ó{‡”�0íj&(Œ§$î4?Ó"•9y®¥a ØíŒ˜ç‡1FƒçÁhaT¡á÷M•_h ÀE“Òcg¾ê NÒgdã/¯~Ó<Ãë­d@Pä<„O!Ÿy&¢s·ÚêpÕ<_àgÝ[Xó¼x–;Oâн¶cš}îÛ`¹�ÚðùbOòQÙc´àB{OÚKëèìÉQ_o8‡¹“³~±4cb“<ôŒ‘Ø’ä+gb’œ1×Å®�”8X‘yTþTgˆ˜Õ— ¯Ä^˜T]„oøÈð%±wºÞ<ßFPöÑ¢Ô�ØÏò ÿ;¥ßÓÔ Âçm]U}j² I5¦¤yS8»/^Üuœä�q!2Xn­ëñ·kâa©423G÷¶y®ã5G#�£·&bqÁp2GËÞ…jÏP÷¯Q‘}Ä+`s§êºX«s{™×¨åªQËU—Åh6oús¥±F#¸gÙÅøbX×$¦=Æh&¼bnyKjÅmv«ßG,†!²çyv|“œ}œëBÿi›ìðÃÃþZ¿u»{tJ=î´yYº¦+Ži±£ë|Ûh:}Íá%Þÿ$‡3ºâa]qƒì�ª|Ïæó�Kw¹s|ú‘™Ç¢˜q7ñºû"JË{q:±ÎOø”ŶE�RìïÎr#~º‚ã¾’ÈÎ�+z ÷´Ofé¬5ßE„+_ØÄ¯Ù¬ýà+b)¹Á®nœRÔoI\E�ñ8‡¢»�—TýݦÇþñ.±÷Ì©÷Ñ4âš‹çŽp#ö#<±8±Ö^(ÊC �„½èj3¦´ûÇÙ»úþp[‹õM¤ÈºÓ^Tz+ j“àëòò] Æî#ž²îÅ8£�à{dçMÕïEÄ®/¯Y¨BÛ]dtɽ•5Öoùù= ê"ó‘„Ï�‚7Þî‡Ò€,×Wq—'a °õŽ¿{«ö(bý�,Šú~p_f|™6j™¢�ïpöž‰ýoÒ~n´ÿfÓÙ?âg‰Ø@Âÿ×Y,­üß{ÒýJbG’éW‘‚¶7’VkkG“öhÖq«nàÍü¶›“ºÞ$”jý±dªÞÑ‚eȲt{¶¿’ØŽ¥KÈø­”g¾'M¼p%ñ/Ȁ߲ ¥¥:—%U—2Š.éŽ&™–)5 ö|A«Ø¶-”ärQ†kC¯Xºær ~5ë `ÈJÅ*ÈÅ"üµeƒþ:J™ÒmÓ©ØŽ¢6@ÊŠ¥dÃ2eÓÖ-ÛV­²U±‹²�Ÿ–\(é~S v±R”LÝR*�.Û¦&›VÉ(í2”-€´e»h[PêJ²eê�ãs”TÙ,ÈP®X±Û°Ë6Ò´+@žó¯ÃÛaü¯$~%A ¸)” %ÇA:Ps [v ÊEª+‰G/Y6ôa�> à݉]±LÓZI`MÔ«k%ņ\FY¶+–2:P�¼6^—dЀcÙ%‡þb¨=ÊSÏß PÞÕh Ò-íâÁ�¥T¨Ê€(epÎ…N­âpô÷´Ç-DZ0¤ø—LÉ›þ-gýQçÜýMl%ñ_R¿ -,mWÐŽ¶UÔj‹Æ)w¯Õ‚yêºJVžápÿ:Án÷¥„ª(Фè¦%�IiiãZJhŠ*)†¬cB­çJ/~kÚ“ZÏÞ®Ô¤N?˜ŽZ÷'/Rwûãi«J^WòÝ�ºjH*”¶% ªB×Ò%ÅÁ UÁ~;R¬Ê¤Ìâ:ʉÿT¤†)2åQXJÆtM#úÑQEu•5$Inü’(`:‘(”MQd%JñÝVÅhIÝþÈÍJç^Øo» U+$Ѧ¾×vƒÀó¥v«Ý#á'ÞŸÒ®ÿ·´Q‡j°n‰˜ã\0�Øbº t�$Ÿ'²lŠÐ— Én%0³AEXfP“%±D^‹C)ê¢*eΉê¥°²ŽP k^CE @ãy~Øךt@ÊYà$zÐkùSi궆Y m`âþ¢ÌLñQÛRݼň§-8tËDÒZ¼•8ë†Ð ’ˆ+%‰òÈü‚i0j^G�D› ÝÖL =Àï¿ôBl±çY·ëŠD)»ýIk4ú›4ôŸ³¢´‘¨ó¶±Å§#ì.’H™3ÃdWWŠÐ¾Á5Žu²;j­3Õ9…¸®ÈVTfõŒ”#º‹²Ð]TñOƒ†·ZÔ„qÔ€²£5ƒ¥J#oò¢wûa õ'¤–7Ú€>0’‚iÒ�2ÁÔu;Ü�HÏðÍu'YÐLÌ(—Íz.‚Êùä¬ê‹™Í˜q/X9”J¨,§W×ã¶qÖìy¿GŸõ@¦=K¤3ÍÛÂãfõ�ÈD©E„iÎ\§s¯hêv” K§À§mI“Nÿ”oÔïHç@Æ4% :F¡âå¿otÄ3Ðe †ýÐ`¿„B¤ iGÊIuøÎ°IÆÔèCj{“6x¦ ¡Ë¯ÐJÑuÞ+˜üK¬ÂÊ ¨úÊ€ :(Ä® ª8eU`�/L„Ë aG)Ùø·R¡¿Žjc: ß Â*Áu^¡ÊûeÐu§¤f,€'P»eØ–u`Y5 €%ºS°G“m„*Žb–Ý,Ò°n ¸Qtݲ´J�„mâðoée€.Šl@Ó´¢¸r*E@JÈSQ&Pšˆ÷ß‘¶å  NÉÑÛQ™€ @0ÀvÚÆj&€VÀ)  ¡ê²AðL‡œ¦].A€*ª‚°C­ è‚Úv@)³ÐaÇ<Õt@¸/ ‘J‘ B﨧Ÿqz+:ZÁ)Aëÿh!ƒŠ]ÿ²(o •gˆE¹†~ Yê0Äbá9b¡ÛˆXÃh8ØK—7Ü™¹àØÚ! �<‘.1gbŠÞmH‘w¡Á'†lYô¨g+سϱûëÔQ¡'+:uèG¿Ó7Ï1¿,¶AEÁ™Ì (P�ŠYχ®.³šT™ÔTÊ�µÒõ¿´×,»þ~C15¬ÊBÿ”>Ú¾€1Þïz>àF@>­nƒ óšNÒ”lá’™Þ,«í¹FáŸ3Ú•Jõè 9Pj¡@jùÐLµaŒq; ?™Â™ÕÉŒyãâŸ'îУÈï6™P¤n!ÛŽùÛ�¦Û8ìÚ6°°E­ ƒÃV ¾i7“@–…µi˜‡å§KÕÀì”�]þƒ6÷TT‚9€Q¥±Û f>êÌœ v6®2}Þ:\_9Ép�=Ó:øm–Ài’w$å�PÂg¾ßÔ …(*ö›ø°}T �ìX£H:k,ËÐéòˆ]Ô×(»ü'&oÙ¦¤[$j1Ž"—¡ eÙü~å;rÀ#àO&W6×,K°ÞÑ,Ì1çŒÙ¨cÚ¿m›èÓ1t**CQ0UP•n&¥sÍž~[IL[/nÐlë»AèùîJ"½¶V¿„TP ÚX[Û�v ?`RÍoZôW"!G`L_‹Þl‚“¤¢÷WŽ‹n€9Z–…9Ê“f*yã±; ƒ•L üNæƒÏî @Îíˆúè¸]É�t°dïcÙk7œMaP9pÿ€ÉWõ°(ufSÀž!4±ç0¹t¥m¸¦…b ÝGɬ$ÆXR(ŠrTÝ.ÈÜ‹qÆ©£íXàåaÈ•À§ˆU)KìThº üjÐ8àT@?ßçÀÄž~$œ?tk€Ø»MÀ¯T©Ð~*©Dñ©TªÀ wðS*Iú‘8™_ÿYIÀxÛñØ…ý1°’8þ~–¾»1g«¥|µ’øÏС«ÿ+ÎNrjc7¹úÙ·µñLÆÞUò¤~wX•·Ïï.œéÉÖt|ðåà$·ÑØ 2w}Йçt«?üÓäói*­¸÷Õm¿xCi“ä…³—Z7ŽÊÕã¼|vQñýT2ov/œðêh‡íÕL¾w—ÌeRUH;ÿF;ÿ�o0õ<µöp¾WÝî索ÛÓedo¾Ôï?¨JËc‰ü¼ÄJâß/Ã>N’\õ÷O’Éäþfõx¬µ‘OÀ7t”<ÿ.™×/l¯V»p^÷r©´9©á�®; ݋ڗÜ3¤ Õýlë:™ÿ¼×Næ·: ÿqżî\¢jjþÝFØIÊGÚCruÕª$åƒ~êsÛÝkPiF{ÝÈb-Écr b´W/ìðñˆ}Ã7¸*ùžàBé4€N¹¬-ÜpGUµ©{‚âQîv'H¶Ä •ÅwJ .ˆ3Ö@y|9šRðjÕí±Zåiöa�H™ï^´ó#Ǧ+¬`%AÔã· 4škM_~Hß‘(;dÎ×@]O_X{Èùë”Æí „o@Á±]‹™pñ\ôݪ–= °tnAqD6Y›ß @LÆEÇlU•ÃB›©!Vfzþ…”°êì.’JùX»²®Ô™f}ïZþˆ™Â aždVQd–Iÿÿ©®î�[ßïÜôÎSU]õÔØ­‡ Åâ~·‹Ú> Ó1ÑÉ'Šw}­'(™Ó%Ž÷G DÉpò.ø€H�à)üÁ™î£{ÔÄõ•æó¸‘?x nsØRÝ:è§MµrÀõWSàRO•ŸbcQ¢�;áå¡xØÍ7Î×YMàÝJó˜k¿>M€m{¨îúïöwÒZä¶ÎÞö¤¹Ãw>êuv«ñRºW‹7•¥…¹]Z¥8“gž ø"0k–:…Š ^´·¹ —žlçÉRáÆ#ÍË$D)¿XkÄ_~R$û÷wþâ ˆý¿ÐÑIV>"õú*"ûK\Kf_‹L¥zÃÑH¤†�„äMGò£fnê牺ޚ­hMÍÒÑ5ç|ž¼¢ŠÈ/UÛ,r1ìíe¾G¾ÎwªËw‚@ß¾ëdäí ,ìò�›Ï¯æû‡c½0ùÄ­mfò�÷R¹¾Z¦·]�¯ëv�)�@Wr1—˜ºuoüÍb¡•#ÄΚî¤'_‹h¾/ðS³xë¶ï™¢³¢+“«Ë/üëv´žŒ�­² =;g|ðÊYoŸ9ä½z Øý¾n19=! ËõUÒýjö)@”|]ÎyÊœ3þá,ód—ãÞ¿tqÆe7Çõ3âæãáÖŒ ¾:B.…[b,’îЇ›ìÁ Š»³0.ÝAÁ[¸½MŸåBÂöûÖÎY]ùò�zè3ï­xÍK°¡�à1覆U‹ƒ- ÑMžìðÁì™qùÙß×åþ]ˆ!Ÿó[Ò±Úˆ[Ù×MJÜÐÑ®®¯´ûj€zˈ˜oC°àÚ9ƒ[ ,3�™ç+”}¶“åµy3ÚEH�܈›¹2cûjˆRjØ�à�J ÀÉë>û6¼›²p={?�ü®¯ð£3fúV°¹–…`S¼DâÎìãñ{\ ­I g¼Œ~±é ä��QdÕ×Ê‘º’žù$ÆE]M/*tF\hˆ–óö*í¾¬j­½µ>¹Õ{´�[¾l7‰ÂMyÑ­è—…ÄgÖ ÎíJ†$ÖÔØð“À„ËŠïÒn—ݺµ˜éÛ\[>“á¨eT=î‡]è�}ÅFêKyûCæÚÝiÂÐKó ³ ÛH9t;Xš¦0cÄ â{›/3"¶®�æ?ëÚ«­�¢Üo@Pf�X1LìÖL|WGÕÝ`鎞…å.ÿ¾‡qA„¹4F ¥äé)ÙìNê&*‰Á2”àÍÓHâl8!’Ñ縋HÕ˧%sØC˜YæiQ,sÁ寯ȳ¯ñVœ…«åÈćY…(V'f-¿Cë‚Æ:¡ÒÐTçizÖ3EÛ×GÑn¶´A žR\ÿ¡_+ÇPx{¶��‚•f„“'I÷É©é0w[?$ K”þÆHû.)¸WýðT+L5]/ê¤îX¦\¾ÄÞ4C:°Œ´\¾¾qé“‘j0ªIOMž4éÝÇfâNÙ‘—)d>‰'æ‰fŠrĘÌÌ^Áõ“A”ÂdóÅò¾çÖô…“Ï7úFLGý@;H3 6,BœfáÍ�(¥8/z"áCµý5¡dgÅ?0ðCö1‡Ä�È}}e²ßïyÑâ±&WzãàÍc»``×JÓ3*Œ˜–¡pUÜ¥åð�i÷0 @·ú-Ñ’“"»o¾Þä/¿÷ÝC»rý€eÄß‘¨ÔOh¿åÓ꟮‘•ùHnZR©’ ½z0úµÀÁàG6§�Ãë…ÓÌ__­É¯ê?�¢`^m&û2É^^hŒnÊÓ#ËD~¶ô¹Qu„ãºs7ºÐ¡ eK8m÷Umç4N½¶¾ j\þ l'Å|gú‰Çfj�™±µÑ ß ¶î×ä�VúÂ=í­ *GŠBŽ�Êo‚¿œp‰(4LSѧ”3*DFw ‹>°8ue1 åØcbS1ëT3FS¡Œ´B”àV0³SM|™—‚¦t‡.ëÕî#Mù³ªx{,A©ˆž‘üÏ CÔÁšG’»õÒN”¢)sw†,¸K»;‘˜5�„>tÔ†×rçÚ»ú˱Ѳ^ªäw-–Wg5…Í�9ƒÎTÞEÇÍlïj/×µGï[ùÆ÷>r±Øâ³éY=µÜßø6¡eíÑ2]ADr˰ë7¬–ª £s TÏ,~˜œÚî�õË]?C‡†®ˆFÖ†Á'ùN:«ñ#Î4¡üš÷yÎ$a�ߤ Ù�¦º¨im˜tª}=>ÑÐZ�NfFLñØC'�ÉÒZrBáûó ØÀÙ *÷¶øu<›¡'ýϘˆ©ÕÇ,e$À? 0¥§âg–"^–¼#ž¤ú¾‡ŽQß´wú•ÚIF«=䲟Fæä7Éu ö?SW$}À!GþÚ#I!e`p$o“ä¢R—B=üW[(X+ª•�Ø�Œpš7þYch(WèOd¯¯ŒäUÉby„só_�Uz§sjPÈ*ÍâEkaªSìÅ&ÃìEŠ¢}UzÙ7ÙTU©5NÀ¦5­¾�Æ…–C€:²Øí-1M1‡8»Õmý]ÂVŠe'Mí|ѧبÿ¬Ou^È |žèdŽ‹Ïÿ&­â›´eÔÆ^µ'[Ö³"__ ­é<�D¡òÍéGÚ.7ÜT;„ë7ÿ­‘ž°~âà{�8”î?Cq¢ôm¿7$9ÝñQbÇŠÒ¦$“¼ùsÔgâCËúK¹Jåh¤•};™WÛeVW¤÷ÖËžBG"3ÚÓ*nÔt²Á­´‚§{Û½iñÐ~ßþ+íœ"ç…Â?_0”*>‹>éÅØ ézxýɉ‘�‹lÄbÜЗT"k«nòxtVG#)®]y¯Ý†e6!º'sÖ²™£¾¹e‹§ž÷€’Þ,‰Ykµ ³¯>6[hÄoÙ¤š¸ƒpß•™ Ýä(�ùû>wÈÁ…§Ö!-¢e}e)ä2à5\p£ç3bC¢a²ÎÉ›¼GÍÞxFrèÑa›bLJ\®¯Nø 1è ¼•íO¢÷Mþºeb'lœó)ö¾*+ƒŒ�÷ª=4#¯kéÙ(â¨âñ¤†?å&è¬à½ nW…»àOë6d5Y†OS ŽZ+)ó*¬ïUËö%òæÑR4fEþžá]NÇr²� ¢�0:‰Y§åÕBLÝPÛÁpršP¾Ìk/H«xNJYj9¹#— Ü÷ßšÜ|üQË`f 'æR ª: Rk\ìæ×�”ÉÊ×g�,2@Mœ¿s…”pÔo©£<å%ÑiצZh=}Es2¯{‚½‘q÷C×l»T'@ˆŸ#`1+à€Š59G Ð7Á|½šHñµåF6Ü%BS‚ºuèO†ì˜<ÏÔ´àÅðÎÌ ýÝÌ$³ ª´?iÔTv@ZÄØ˜F�òfÓüµ^Xc_�µï: ~�Šš~44˜FâÓØ ÚÓ Ÿɸˆ‰¸AŒ,Qâ môkÚ(žMNS´�;Æn^I£ªÈ/ÃMÏ{ ñjf‹q.s™Ü$q™ó5XÞò:­€’ :›N",i{ßÔ—ft•#Ñ]Ö [P³¨)„H¦?ÌÐ[ÓþåVK*z2áK.ˆÄt´çÒ1mâ)º ¦õxmî9®«ºÅäŒã¦Û(¡XWT:Ahhu’ âŒ%c§:ññœx"éÊëýgÚÚé$y åëkŒÁp�0‡*¨êx›�ûÈcz¡oØi–ì÷-{8û·p†ó‡Lî>úÔ2T1y/ßž/vù(n¥(Õ+nàn¦äé¦)̾z8SÂ^–àìtžEI#,G¹ü`Ål©×r˜Ü$)¿‹«h¸Öˆ‚Sîd×E9äúЉÁšfoCQðƦu¢€ ý„àA òèEé “v öhë”.uø½8àK\5ŠZ ƒYë§-4µ€øŽ'=‹\•¯ çRN*ÝÖsÒƒ¯Á2„c—£Á¯²ª}â`É3æÊ=KÙpâ€cè˜L‡#'�«¦íC1fØð‹ÉÍ:ö ÏT)äI PÂÀKŽAžLö&–©ßhÌ¡BL•eJ´;Òû»¾¡êþÀ~’ãÚ4öDgŸó „¢§x~¼‰ûW«½Øý�“¾¤›.솯‰qùØ+Tû—]ä×>‚�»«KhÏŒ¶®Þ8PýQ‰gùe:È":[0À˰ÌS‡ÂmÂæLg†MºÑª¦ÄÓ"@&gÙyz–} TÝ«Ñs>czT àŸà�_S¡g‚™ ÒÙ)·Z‰iG«´hd¥fê#)^KÀÔWPˆ2˜£ðÔÉ¢ äÖê�8¥?–‹{×4L-ä¿öèRË>Ê 'Sª¤çÎUÊI¯áæ‰rˬQ™©/”ø¢©¢5´ãÖ"'ÛŠáË´±É#’i©“#Òœ¤/šøVí~—¤=?­YZúòû¤#TÐó=vÔª‰[Á>鬗“tRñ ŽèÞ˜RÒì¾| ù7—¾\edó $½þ} <Øæqôué–¯‡ß¦¯7ä ìlú¢ã8Ê&2ÿGÚu¶¥’,áï>�?¢ *É0ƒ€ ’‘ `@‘†àÿ¿]Õ=‘={¿ôrvÏÎTwWx+ކ?���õ(9¸^ìùKTºÞÊ*Ét›ø;´È¹ D‡ik�žh®i8g¶4¹ü¯µ&GŒéW9-¤e ìû X3™B颲٣٥eÐ. â¡‹¯ L]Òòp{:Ý~Dz5l¦üù±]œ#µ€5éý•ÚfLih�mµµ@ž —ê[Z>ˆ·_—è_lëW×+™�ð ©Æ'äR*T.swþH#ßAÓ1ý‡v‰ÞÆÔ‚šå4׈]I­�C|¦‹|*yt]ËŸ¨…mÊôRõ×Y^ˆÕÄð�Z1òKÍ•ŸÀ'@¸QpuK`6ã®Q\^[)ï]ËlÁî£õ’ÚŠ%CyV ûÿä›ÎCn¾ÜªÜ¡G”ô˨õ1Ô¼íKÌP9©ª }2³ŸQÝ Ñª ¢�s[”&—¹+ðôÒ¨‡ÀÜŒ¶�‘;³õ¿Gœ(gG »ÿí1*¿kN-ªm�²Ö1dÜSà ù�!Z²žVôYÕz½-kÜ-2Š¿ÉN×¹ÃqQÈÍ¿©ºµ¸59’m©9ÉlþÙñ#¦ºkâ6h6‡ôlû5kÏe³röåþ&¥WU𚃥Æ|±ótJ®#¼p3˜c£>;©!ž£˜ 2ó6°>‘ ·(dú9•ÞjY oPÜŽ“·Î£„b8ú— ÷í‹ á+ý¨Í «i!†ÁgÃTQq2„)ìﲊâ=îµád6ê·á¶â¥ëx߇lù ä)ùÿ\^×S�Ƭ¿¥0nºx¬§™`jÀë(�6ëqyŽj‘†«ê¼Á$’h+íé=•Šù«¼ƒ"ìA+ä%x˪mA+Rµ­ Ÿ»º%mÆPMß^€EF‘N"ö!—°ÀÇÊ…Jªb]\žŠ£R‘kâÆ{Y…JÚãÒf?�¸ÌèòWô¶­³·xž¾ L¡/à/ønþGdŶ3©î÷§�); )iþ¨V“,ruVoÝ_?=`X>Yì  ìƒÀPKÊp¦WðFËÑ7¾oà[{˜œüÑÎàk¹ç1¸*“�ÿ¥èjâ)ë|çk�ÄɃý­£]ëÓÑÃTì&4è£×vxc¼àKM¿®"˜u€}Y·¯ÏÉÁ¦ûjùÜÜŒ‹FH FC#é#Ì8+É®Ä Îs:F…Ñ {]X?ñ¶°¢Ü±w­§ƒ¶;ü™psÝøZþvpÏRÈj�F“jå¬Rʃaæ×xŽùú‹R¥C„ô«@6ÑÛ¨K”Æ_¸MÈÅ•3ÃèP8p åET6qÌŒ¡CÕÞáh¢DjVï�èõ8áÜ êµê>ˆž{Šé%Ä¢øU5G—·G¾L~V2Úµ…„j#.”­ñ¤ü¶˜ÈÕW¥Â6ºò{§‘­ÍáMS?@²¢9ÆòéëÁ°›<àä óV3°H Ä«žàU­Í¥{’ÜT®¶Ù«ÎÏL_fRˆÌ–FU…pï.’ÄDŒ¸ã:e W³áxqºT¢Fò ­ûÑSk²ˆå¥ôŠ9$íBO¾/nætÜ�|ÄÓÁÒO[ákþEÈU]�¯‡õ'^³0¡¡³A®žgC§Ö>×zÒ�Ãæ~�…>Ì™~Bx¤Üù™bÇX'�—¨�Œ\šÇlü¨/«‹RA°›IM=Ð ñ9ž‰Ï5ðQé»É¼Vq`˜ûÀšŽ©‘jðeD$ib+Ç·‘½…�±U®Ð9S™ñé´\ ûƹsc(N…@Ñ^.>þÏ`mʇ£Wä9¦8\‡yF‡E”ÃÊmBwÔógy®öD�ÀÕú�ö<` ª"d“ÎÇ]âdçåF‘#³ù†¥9”ê¼Ë¬/�$þþ%Å3ó|X¶ËpqÅç¦ÆZz[)PŽl´5^$¢ø w‘¶úÚr¸¯nŸ�è`}äÙÛfRr^_QhQIP H ¡>³Y +0'ª’ ¾0è{áuõfi–_›Ûu¼¨ÅçË}âèËâ½ ·a¬iW�† ²yo}àB`بþ ¤�j9Ê…ûWº ZlaœY‰¦7“G˜ÈðÛ¾ŽäTÔà*�LÈ€®`s©aþªðºsãXúWƒ š¾§peY4¼ŸL¯ MŸd³‰dKIäGÔ�ôßMDŒN[LWjñø­X<“¾®µæ¾ñbî·ÎËEÈQ_ŸŠÓî+¶+áeºK� â†Ñε–5D™á Ñ­Û',6¥ß´Û°*[ÌžBäF˜‰$õYHrm8éFA>¹#öö�º¯`3Þ³vÉÒ}£c¶¯�û-Òµ=wÎÿ+Ò‡1f”gf+›ë"’7nPŽasÐ7¥Z±\D£O¹;Ê}W]ÊŒŸMº×·(ÿ…%8 /}]‹N%®Ì©ö÷#sO˜³*µòÛ)+Z�qï«:o{CÑön·d“⃶äZaÆeú‘¡?OíÙS#€ÔÔÁ}¥á¾Z|á­Ï•cmvo´Ä�E<–úÞ7 pi«¿ªzèýB]®l‚Š˜ä"×™- ¢R>ã“ä“0?•WÂm†}E¹— Û—k½ý!ºE y~†:+sL»¨?¤È`}K9¥Ü=À \t–†:hTÛ†rè‡oEºüµø~Û"bæqHˆ¯8’3}› ‹SËŠ¾€Ô*XC»%m1(ŸÄj ¬Fßϰ¥Œ²ã†8ÖÐäüüã§oyrû‘šJJQ®Ô´ 3–|PÒ¸Œ€¦[ë�ë–Qðq9�ô↳U aÈÑy ö`ø"´æ?8˜¤)åAW4í §R®V°Øw5>JM0ðQü…(@£s4é>Ò¡ RKcp⼦8¦Ág¶pTGEÛy¯ ˜zEØu]) ŸµØµ@Y ÙYÈ—2]?‰±�¬Õ¹ªŠêë²6xÖ`’lgY4(ܪ€}i¹Ç5õt?ü¢ÇЧxº[p˜T5`xY~³a,¶uÉ­ÁeµÒnl6¹¬‘-Ù¿l§ÍÊRò êj}:PPfØí._Þ•Ñ€P‡$Ô‚¤Ý¹P¹ðüŒÝÈÉwo˖ЋilR™ ¢Ö ?4]%Úw—¸‚:“�²iM‚.a‡ÙW8RÙ’ŠjªÙÕ‚*¬ûQ†`aÍ¢^k©¨¿ö¸|me[HíK%"1†Ï" *û0¢2ß°ºÀ’~šõÐÔ�ªþœ J/Ïyo`Z X©ºÍ¬ó9á…lCÖ”z¥›•sŠ©Y"XÐ5ö}Æ(²éENêE*®Æ*Ø*޲�?ÔN,•?x��¡çÆr÷8Îd–sO�:Ë”Fâ8ïñªˆquÚ%]ÊI}6èØ€Sí³©+�b(¾)�Oë¤{ú¯ÏÆøWš6!˜¼²YYÛ€³ïöFèö¾ãÀê7ËcÌ-*í£u*ë§ô°®´jåµI¶ýÌýÁ•vk%Ÿ”¹j¸J†+Uº¾!ÍÍæ4h4qƒ}r&íY{DW+ûü…�=úlŒÓ‚:öe†öž›�ŸTt›Y:;Óa¹ð#¥;X^oÍüÉÞ$ÛŒ²�ž�«•þòëj°\Ë‘* eîºCZ]=Þ¥¶u>@}µº›×œ*ÃfзæŸ0Åm+hù1ÆOäªó€Èvû0ÅZxPb^�rÑ�*ªdZÔ ÏŹdóx˜/;¯Œùa�ÊübEÏ=•ç¸C‚¦y.Ž^ù9�†sTÙ *‘}¾f‡IO;?UŽÈŒ­€h�¤[�$!ŽGðW'[”dsr~ñ\+–˜çs£ïûá àGa$ƒ ›­ð:&U9¦|„ͯ^®ú�h›1Ù$ô‹h à[ò0îH{°¾Pöæ]D"A?fѶÂ× `ÍSX3Ö¢áþA92zŽÇpþH(‡îŒÔáz#ÐÖáWVŒÒÈX®þ:‘&žk¨£X¸Ã“R†l ÕùVÒ»;?Ã*hô�Fî½mñŸ’+¦Í6xPÐv@K2TéPuJ]®IE"o GÊ’à…(ºçk _Â$9&Thb‰Õõã<¬ÀðÃBÓÿÄÃy4-ÆBS˜Úg•¥BV£oG›ˆ;±¬…¬åôšlká[Ws)¼+%-Ü nÓ½¾¾�§š=@áôÑTÉQâõ)Éò švW“‰?ißs¬âŠWü¯DÅËó38û,KvâT¤Ð&»Ã‚GdLÒ,4ç–XURˆ¿3 ±O³jCG¦Ca¦¾¾VosŽÇ�Hh:˜±xÎôŽÒïn·Y²'äy<'½À|·-×׳Å:ÒCàûRrý4;HT˜l¼ mÿ•36Ý'B©gN7` ÕRöÙæ|Wë>Ÿ„3sçpf±-Ú Ù¼½Ê¬šlÖ,Ñïp9Pôªzà2äŸ#Õ¹�:¦…ÜX­å[-YW¯æ@jO.mÈ€QdÀ±çn i‡(«µ=ú+ _ u´;UQÒ ·SYòH.‚³=¹eëÄbÏ ‘V¬Í8q�è‚G•Ò D‚·bšáj›#BüniYYÓ3Ë:àù¬O……ëÞÎÏ®o£µºôçrÚ™Þ7Jµ»ï�•úzæÕ J síÜáMë–ÞŒm©\ÏHl;¤½BÅ;@÷–7•æ;ý�Š"½ÇXg‰#Ìš­0ÂQ*Ö@@–g Ã,±ÜË£ÿc<ÜÛ¼ƒrV›p†oݘwjÁ÷b»J~3¦ŸÝ�Î"ì$°…×Küõxâ õ�0p€X¢EëÃ0I{±ªL�[­gB¾Õ ïÞÀkgüÝÎUïÁ+Šê¶í×8?¶s½»# ë©x/&_äjdtè–óZ‰;1ÏË%~]Ú1‘p´Ý}º<¯Éýt8AkqÝ�& +v L¯ÞkÆ””5N1DA[›,$ \3­p¦Nb¯0AŸiÚ%žTçÜlîc—Bî‡E*›1�aHÌÿ‡5o¦Å~+ÐÍ@þºô{퉈îÝЕ;7³eMtË�%F�{i8•6”?¹%v>r øcçþŠxM‰:¾9 J @ØÂËX'0ï{Ξ¬À<{ÒóÍ~ m܃Û:¨Wwïs9)øú¨ÒCrGÉnŸ±×êŽW¯ÁeÓ_EŒ×�BöÓóñ½Â rD†¸ÓåmÃê[¯¦¤¾þ~­åw–~Ç'E¾È¤áÿþ‰jL4~’˜”Tˆ¾šð>\1ìÌ%KÕ.•Ù%Wpÿ—ËuüfN—Tµ¸yŸRÊR›Î-(¦Ÿë®7ZjøcÏ7µ‚”?j0ÌN�{$Œž.¡@wgºš÷…û¶Š!Õ[À\¥<ø" ÏocKfê�P~˜}%ϳ…áEmÇ=H(‚è¿…$�Ÿ�" «j´DÑ;z‘ð¢Ö•ùb´lîÂ38¸éæ³r�Ÿ-““²H#øöÐæ÷fl`Äú³l¬¯³¾’Ì(ÏhXìó¶.⢽>>½SîV�fÂÛh´ù v¶’¯â˜àâBÕÙXÎ;›ýùŒà6§ãÛo/l~¶í]l$êÁŽÖrýfðýÄüHJ”.L¨%ŠZ¾ Q‘Ô¢M¤®4Š&)†nÃ÷sá9¯?–¨ºïèÃÒÿ£î½¶Si’Ñ{­¥wPF á=’ðN€@�Þ{(`úï™uγODd–Áhï¯gþ‹súë•A™Ìð.#UI›qÙ¸ËZ5ÀEßv(ùßÊ0µdE¡-Õ½¼¼ë×ÈhFú˜‚ú9ìÅM"(2ÁCƒ¿·ø°·Ûí½Þ˜ŽÑ©xþ0ú!ö¾Däû�øºj³äÂÉþž,õQ�á�h ØWäÒa{E™à>•\�BèL’c¤�¬?^ÈÞÔ¯È&7ëd”ÔL1·ö´r!™8ôIQ¸Že{7x(1øØL/×èúï;åµPÉò¨ÀDí?JáVÐ û) Gswk,-Æ*é€à�'ASwGšÆ œRÖEðj§Çßw}_}÷É„¦-†oöÃ9¼/1[å]lÖÇ*Hû×Gx} óõÇg Z)NÇÉÿÚ0a‘<†jLºØWµ³äUÅ:@8c&F‡!aêí„DC¬WÇ>(½G‘_F¡ˆðqj¨ËpÉ N”{vâÚó¶¤ÇòìÂ]Ñ?í�W‡(„ÝÓªþq½‹htWn]Îò²¼Ÿ!¨ô¥ê˜ÑprkJ5çkœhu…xmŽÊ¹ˆ´ JîEŽªœ[gd°éÑDuE{�ˆÍÞô ƒ³é)ÑÐÒg„õBWª+¶c[d+®ûóݵU‹¾W)¥-Â¥ÂôA�+0•%SÍ«¶a"¹—!Ø~|GMԛɢ 4éª1Qf´û mYµÝ3ÉiÑ¡MCÕï%€Þ~sz„^ †nøfaÅ~ó)Rà šp-í²‰Ø,3Y½ô¤ŸTɆzhÿ¶úñ™e²ÃT yñz9v*�g½ô|ÍvéaA`Ï!å›ÂsеkÏ¡þDÔ¾ž×æ³ç¼o>fâ¦ðªÓ"RŸ¢á6EíΊ ò‚ÿ]K¹@Jã ÞÂ÷j³™$€ø¡±Ã˜‘ƒý«¸KÉw0R' FÜž UÙ3w¿=|k°‰[¦ê/ àpÐ pÀqãÉ‚½]Z°µ¦ñ˜;xðC0\v®©wÊ•âðý[;svTŒÚ5ÂÑyÖèŒæ²±ODâ­ÃDØ€Î莽˲äÉÏ4Ÿ(t®–íXŸMK0æ²#8À‘Îó7öÄúÁÝßV̘v[R{GEÜ<¨ÅHˆ9hšÙ„¼?qý\aÞñí ç¹n¸Dž ½³l',Ø«¬z,Ÿü!»š¯MÌ�A£(\¿ãb[~J0ÑFŠ™Ê¬.5™óÊ Ž¸Ù"õ‰C[V”CMxØ67uròþ؇æŽtÎùN–{˜(n¿ä‡½zx§<µË§¢ïqÁ°L7Üßн.E]ܘECÒ Â<{”µNÙw¢§'?¤§Y1›‘l(¢Â}yz‘!s›DqÕ�§÷jl$~~Ñû%ÀŠ9b¿G“¤yX¬iÔàŒ¦àà}¹g˜¨eª`¹�`†ú��•¿÷0`f3QMøËGù¢bs®5B“è|Ä ÞøÒN†FÆõ›™ã°[Uïý£•GìäóAsGß®<[ W»-S£e&Iig �‡Bÿˆ›ZÊÀL{s”«¹^XÂð¹A9´”—^ù\O?ýbn?¨éÚϽí¬òü<測Ø-_–—ùKéU.`û–M¨±Fgö.\;Î÷\úz6ɰ”€Î¬Ëfõ×—]éccÖö±�OâÆ‰^ªÌ´®‡ÞîøÒ֭˺�Ŷ_›çÉOÈ52±½zwôþ`ݲ5‘kt~@n£ÉMýàÕ-{a{*[*ä—”Vð«c½yÒGRà;Ö[šWáN‰+�rMוoùŒwÞ¤ÕƒjT ¶>C xkÇ–já™>"3\$Ñ—3&„'}ó¹TÈúz+¡§3Õóqç“-<¢<«ûDp$ô‰>[$6 òþP*Ø �¿œ ùQÌM�ÎÔ§¿º°†Äú\ø‚ÄgÔ�ñnèü½_¥’4µ;º{rœ‰?–RDßæl×x˜�ÞÌ5ÊïVÁžzÝÜÎ\ ¬8‘)7…±�¹ÃA\�ÝSnÌ�j�"zÃO‘õòzîÉžù/{i®=}YÐ*ñ� &¶ŸãÓaIdIœýKÓ­÷ŒZsÅ4ŸF«€Áy{Ã,Yš4™\0ß�ÁÛ–KÛµFÝp:{ì€ì £)´/šßfr¼Î†ØÄ2Uì@ÓòÍZïz€kòô˜ÑÂAdØ¢)ûKp÷†wÑ?ßU��5XªøÓÜ52£-e˜¨�W^lÝ mš£�µ ˜Jt­áW-Û$$t\-Œ/¶”©xÜð žËû¥w¾‰Ó’|;Ùh¨Çn�͹n¹�UIóQÏÉ“|>ÜÞ�ãLÜw¢§Ž‚ÏÚq0ÁeëtÈJÔ;JÏ\ÁœV@[^Ä�Ô¢e0ç•IvÔ SR-  rFÏžeDò8Ãe˜”}—u@l ÃwÞ>6v?b¦œ]Bêc÷(Ãý!AŠy-˜µ7ÓŠ‘¡ãâØ ¶ž0)'¯AŘÀo«Z›ó·ÝñwàöÒ„¤¸sĬ ˼0ƒT¡F= BŠÿ�èUX.2‚O‡Oõò2©eØ ,x?“Á…ð ?›BºÏxcïí ðc`E^F¨"Ú(ÒäÅÏOß^�™ðl=E…OüÁ,¸X´)Äü[¤®=âcÎŒ9dZ¬(G¶µ3µ?“*³"®�ú½Še×!¡fiìÁ—f´´Áµ ‰zÇ ”Ñéô<ÑA£¹ØÀ KpÉâG`¬Í„Ü‹�ó}0’ê‚pNt_HÝ€­±J<$4H•ï‡öΓ7!„6“=M€ °]¸²é„QÀÚ¬ä\–7.0|ƒ'¥ƒª[Š¡‚樅=ƒÄ×u_ÞèõÁŸ”š"8,�))^Ä&z¸Œ4Ƚm@¡Cu¶ ï#1°s¶²¡;HmeGÀ“Zpµ'wW\ѵc¶g±Ôðòí^• Ê”L4„Öµ2‚ºO VâguKŽ‚â$»¤Dwº�Y|ò 0ŸØA Ì?Ô»•{Ót/H ¼{—^•˜ËÂ×@&Nb˜C!bíÒŸpRò‹Í›'ºíØß ¤�nJ"h]> p£í¨Þ(êb[�½�hGBbs< éÚ¥¥b‹!޲Ë*”Ü(Ÿ!3,ú0zí AK­/®Ó˜�\zRˆæÇ%£Šì`’‘oÛ;¯)Mv‡9lŽ@–#0ª}ï0G+Æ+¬n%ƒ‘btu"Gô ä¨wÜޜ܃²|í»ì;xz;Y¦ì7 ˜æº'F$´Þçóϵy¥0ÅÝ>¤�è‚83ûðFfÓR˜nDêÑܘ*žÉ='î¢�|CÚr¹5Hædg�Ú`Hjfk�äÙÆ½’a®ŽXxséùr¶ììX05(zu¯µ0)iöÚÞÒö"ßÍ@8aá)éÉ>¸’*ƒ)ïæ¯é4Ý 2¶š‚»_AÊ»~Ü’ëØ»Áq¥ÐfîGÝÜÌ_{Ä—Dí*Ú›B÷3¸25– qâápˆÇ�Z¯¯Â&!‹W‰ÿ]ÑNÌk‰Z§�/*þpRj"£Û€óåÌ�Õ‚ð1£çšI¥b0�™²#x˜½[°–A‚ ²ìB ŠN^°ýø!š*Æq>#€”£A±K”Wß0›þsu‰�(¼5ük–B‡ég°M³'3ܺ´Ãå�™z1e(…PÔ_àAÒÅÎÕ#a�_>W(©jO†‚EœpM90? ‘Rª;ÖUì³Ú'æöf×ù𾃠HlË ü™*�%¨€M|9qÞÔÇæáRv:½YŠ÷H‚ߎØkö›,ƒ“Ç~>’£A0ż¯Z£óQcä¦ÈHágb½VòÆèNqý³¨FïYV“?±6fO´§Ë;@xvJzÕÄX½ ¹èuD‹'~e§‹ç¸{ôœMa±XËÏùÑ%Ôýé;$IñŒ�." D~¿.i…¹Ô0_©yָ옟ˆ!sðíÍJ_™û?ö­�—ux“à¾ì�’d{BÃù¡£gï\W^°XÉ/¨سíY]’c“âå»’-šº~ef•i3ò@°|�Ù ¿ÖaR™€†Á3m¹´7)€uõJÄ!Q!éiͯ¢ÑÚÞ?ôË[–šÓ,³0oTVM·©]*݇·¥�g[(rŠU5xô×°Ü¢èÉ lIË�}z”ª8º¼måÅEð˜¨}Vyñ®,”œgõ¢ýâ’‚¥ÅÜ+Öa&×(%ì'´’×BÉÝ­¼8�ãÎüí µ“G$„Óå¾öþ>¤w«WÎ[R&µµ²~0hÛPƒuv1>$Iþ•×tß“•´ÕJAÓdE•Ÿ~D·Òg>¹bz÷4ϟͦ÷þÐ�88Ø21. óo®JZ8Úð±éŠ=¼îcS�–ú0€èô•U¡£.�x§úÒì].NæoæòìŸ^._Ü&ï¾s~Ów¹Fѧ#Þ\Yšs�B°Åþ uÁ·JÔfª~>šÔ“Eý•c�7h[R[ôŽ7¥€.Œ¥Öùf¸U±çºeVrŠ?©`‹°”‘Ÿ¸ŸûíA§RžÚq7TÛˆ[lg).“¼¨êgzð�»Ð­z“Ĥ(vÖ,ð4«cÈî†ÍŒ¹»†ŸB”ɳ(�bQ€"üñÅÛag |£Ü5&e öW¬»¡`÷Âmº«¼Îï>™¨#9òÕ‘Z%:(TJ9£¥½·Á+Õ]ôtø³2æI‡Bý§6¡CJpÒñ³×²>jj¯fš2øëåP5�`Sß2È`¤¢J{÷lÔ’05² T‘2q©A¢ÒÊÿÍ'N´ÿ=OüÿÁÌ^ÿßç»ïÛ›Ð��þsÜí›åÝí�Á�]–Çá¨2ÚoŽÒ`¼oÖ‡»êlð¯lV=°ñ|»ý®V]÷¤ùþ.fzûäQÚÜ­7‡Û›ÿà_¶“»ïšx»ýÎé¾{t¸ïÜ×�×ç½kÁÛÃQWÊï÷Ûq{2f‡ÏwÊçv<ö8üçò%¢»#å‹Úc1ø×o÷пG’¾÷{)ÀáðøÝ·7)Ÿ+j÷ø¼v¯ßíóû�¾¤/å�Ùý8úìѸۅ9£þX*fOxÝ>G ¾·û½.»×÷ÄàÙI¸8Ó—ôÇü>¸+w{ì>¯®Hàq§ÝµÃ}±”Ïá÷ø“~|¦?�çówÃ/þ›?�YAf�Gã�>'O xüö¼òô©·7ÿ \¢v»7àxø˜»Vp;|^¯ïößä‚÷º]q‡®ò$íþ”Ïk à)p­?Çí�€Ïпx ¼]¹&ê€ÕyQ¸ß q%øÜhÌK$|ލÞ÷ÀR’xøÙpˆT‘^þ{;årwBHÚ?@ lÿ};ΖÃâè_Hb·7ÿÏÝ Œ¶ÔÝS éèÉéñÞUOŸ°JÝÝÀ¯Îè\Ót;‰Êù¿-øýã†ýœ›ÝÝ8Ç�ÃãòÝîLwæ�»—à _øÜ§_x�Nü¢:ÝM¤Þvz×ëoþÇèî_½ýÝ@õ£á]ÿßwÒq½ž­'wÙÍÿܬGw«ãò0Û.Gwœß]o=¼;LGkö¼þºlVýÙºw˜mÖw›1}e¾i:=wðF‡ÿ¦ç&uß9øÁéÀoøgö'»&€_:¼ô+|㡾¡‡°»œt#­÷†ÝË¿wÒ+øüÀÎÞn¿s¹ä—:ñÿx�<1ö¥‹ý)¿Ÿæ¸qØù“>¯­B}¯C],>�½”^¤ÎÙ©¹Ñ~ãpÉ_Ò�wöÖ)¨òÙUÒhàßÛÌM /ÝM‹€oøn—zÇ]f$� ųýÝ~ºù—Œ¨ÃTÚ'Óíñp·Iã�Ô6ÝôîÆÇõ@ÆàVÚ Fû=Gøú¸ê�$ü°Ê¥àÇ¡éBN„=-‡aŒCËà‹>‡þyãdW2ÜÚ*dŒ1lûèÕ º3ƒ7>ÁÏ)K%"]©¼ÂyƒÏ hðé’?x䇰۽Šȳµó· òs´�ŠèÎö‹ýݶ'fƒÙð0[#°g`ü{­lw?tÙÝþ ͶpÁ�ùîŽxt³Ð�þµG$¦½Ãàæ0EŒÒ�ˆ5äÐÞp¸¿c/B¦spˆã¯<9y¢œì�2Ó9/hØAhpÀqRc”ß{oØŸ.—Ì;n7^™Å<ò(?–¡�S;@P+!€À½A\*øSHGËø� qÜ9µ—yeäi'PáÀžÏÈE‡çä!ì›Dz½ˆÈ3æ™­QbØîŠ›Ã]o¹¼Û.{d(@Ï òr¿17O„‚ü¾ë¤­‘5ªàÓÒ ãÎe×\ Z–Á¡àõ„- hÄ(û†¯Ðá€ÕÉK¼û×h¹´™5 NÈ—/uzꥨSÞ2à’÷&£}”HªÃFÛÝd04ßáÛ L¥e0˜ï"d–áWU©T/ÝÞÈ_IV¸å?c›ãz ÛüW�€à¹óüw>Ÿ¯H®‡xQ|³Z�Ö‡ýíÍq?’†³Áá®?šO=)s¡a8ß�ÖC¼3†¿ã½£Ãq *;1ú³Á¨’ŽÝ �Û»ýèÆãFÚo{ Ÿàó~�ÅïFÿ5˜âcÀ½ÿ÷ï5·Ò•ÑÖ<ÕÌŒ?ýö&xçuîÜ/7(À†/€Ð€šAž=�‚ÿ\wMÒå)€OlG°@èw8øíw^/>Þ»TÊnO¥î— þ¯âñ;¿ÿƒßðŸÛ›ü®‰“9u‡ÿá_0À?8Øíôܘ¢ÿݱ7ÝÞ€53Ü€½ ºÖuïÃRï4|Éöÿõ§Û›ÿžçЧÿ¯Í¬<)-0âÃÞUw¶´Ê;CÃWäþa•;:\«|"Ý�YM¬ò¡h¾{C5<Ý¿½áîµÛ0îïöB°iÌDÝSuù&Ö1Ö«¥º‚ïvácÇ«ÜÊWÁáoxÕ¦Ü3{}î†{FxøO¬Ög¨Ï~·… CÉÛ²í�î«Òçý*gΟûpÏÏ@?Ž6Ñ—6e ã÷Ñnªê0IœSþê,.¯áýª¿¾O aZƒ�¶Š|ŽÖiðŒ?̰í½c0½­}FK_o4eÑ3oÖ…p(3‚±ù`•¯}|ÃÒ<†ñwÁ…àˆÓ¯¸)�~E³«<À@WnøW4[úÓZýÜ:ØŸý‘Å3=í)˜Ô¬ ·Möì‰ðgþœ3ˆçŽÎ” ŧUÞ•­ÃZû†Œ¡û!ˆ•ÍV�®"öê¯ÊlçB0ׯÂ[Æ)ªi1ŽÄjSšã»S«|ç«I3§{„z§>ÁUOñ»ö0á�¶ÑúõOƒp‹†¿V`fùbóMóâß³&D«Ó�ÅÎL¿é;bÁ¨ÜMà:§‡cSÚÆ&c‚ÍþÜfé§|;7;Þ ~Xaøa*¶j€Ü±(øWÓ‚z´Ê _8B=lŸ£»ñò‚@Ó�ü°7²?w£–<[§G’Âæ±‚Ü!Â; ð~kË l³™-$$¬¶!ÿžÁ°Þï½mË›L…_ï:çDø¦¥ãªRêÒ‰hÙâ­êâ‰N–÷|Eô9ä…€2åõjlñ�p`pº½¡÷ЃwûT3ÃLˆ$î:_ð´óÃ,lú3K¼¦.±iö|æzÅ¢À6ä‡ÕJãH�ÏBAóû)LöÄ´@ë¡"h ~7|1˸ø,òåÒ^&±íÖàÉf"§Ž ¡Ácø>3gô@WÈ2òYÑc2‡À%XtCE’À’’Ÿ_Äp‡½Hs€'–«òûfÂÞ0ÈÛü=¬Š™+ªÍT`ÁSZ°–+d¾¾½�{Žy]uˆ˜Àˇ:¸ä¥ŠÛЯ2?l|éy\&β¿¶¤¤@oȈŸÉD3‰ë^’’ºI,A¬öìÓÎz¨Á½s�Wíû<É@ÒœJbÈu†”ðóˆîÎÇŸº‡\ 2½xá~f FÆœ>¨üRJÚÄ–_! K£“¶K«áf–áðl_­ëËG„³«ÎOtyö èìÊ·ÿ‡Ÿnoþ{žóÍ,2mXì$Þv^#ƒÄ(ã,. ‘Æ£0i¦Z˜íÖT6ºž=ÂC(§ç¿× Ÿì×}*·�Ki}9Ò× ÐP±â[¶«ñãR¤>mð°‡PBÄS“BÑMØ1·ý=DZÅ*T×âš§Ø&‘튴›Cœž�MgKoá{uè35¢Ð¦}ÓªŸu;f¶·´¸0ø#S¥£ŠÈz(؛ߛÊË4c„yÇ;0ïÒQH{ï©çxF©ìåïΰ±</’· Y”_Ï.^VìOïAZ`s›™˜ Â8û­eÌý~%áå·ñ-F ×L›5bÙB&áQþõé;·Ægx�ó¡’gÀ·¡ÙSÖd�¥¿X)KÉÞB ÿ¦ªçû‚{ö!#—À§ý!`Áw?ã»-`}÷bÛqèäÂ÷–¶>Æ�½š^Œ_jk¶�µ²†W|Žu•×o½˜€X1Øóá'G¡À[N¤O| tQðóš­fh‰ÎìBö1fÎöÊZ³TÊ\ è‚#¯?¹“£¬8X13á¯=ó‡Åòñ™ÝUq. A}\í³C�#øf�S²Ë ÞÑùÌ–Ø}ê�?±ZOÎìɶ �ýxŠMô+¿ø{ˆ{OW¬A›”Â¥ôç{¶µø"ãÔSÄ)ûµ|¦ðæšö¹óÆן-ÁÒ¥5¿òì\¸\4•s«Ñ÷s xÓ{‰-ˆcÍ✘x#¥ë|Fá»~YX�–¹òÌQÍ?sÒ8]¦Bò›µ(=%�a¹/£�ÂszoòÎ `W “ŸúÎn­JC†áª©™cïÅÄf–ý£à‘…áå��À‡ýcw-€Uy˜96Ýj6ôä×Þøô¡ü™L¥OY Ñ"9�ËÜ¡EGÈÊtƇ§,,iY»¼Ý›B!AÛ_ /¡=µg’DïCuBªò')i^BOz‡W ã¨nV'í‰^°°x·¯aå?COà˜+e줼  yvl¢»M»2s–ÒH–Ó7æ±q]QÇZ86VB¾ÝŸj§ IÓW¨+Í4Pa™(­ˆr o€Ð24*yãË?ºðAêká‡z½ôÊ:h_àPþDòA‘gïÖÐ>¬ì �xÞØ¨x­ú¸±QÐa³¥p¤Gì—�¦"Ñæù2%ÂŽ�©™ °à,É� qsšÑ Á[*?6f.sfÆ•ÇıÔß?m‚]ƒ �l ¼<Ø…vJëNªì2Jk¶xgN–�ÊÒIE'‡Çâö{cùš×J÷Xµ´ä_}w›±>/•ÓÞ(ÀŒdÊœŠã>>ãºÍÔ€ ¸b&Flˆ*¾qð*8kð‡if�X(UÂßo¶þgÌüã8ò¾‚ ÝÚÛû<Åšð>jûU1 ŸÏž»ÄN _l©ü)Ýçé<im\�ŠÎòìóÑÞu"D$ÛH‘ïZû�Ïg!„懗ŽÎÿ6Xª6J±‚þ>ËðS$dægŒ.ž¡êTóedˆç ?D ³-¸Z×/»8‘2ºˆ`ŸhaÖ,®AÆOÉûxï�j™0|×),ß…*“ªT™x¦\&�Ec�ˆz¦z¨3 VEÊ †K™è¾6ëÏÜFÛGtðn�À W¸«æ¤*Låñmï2eâ{—#mòÍî¬_Îy½Zô\Ȧ5Y/'†‹ ò¤#™@åKç4¼7ù¾†‚ÿ�ü9ì;j‹wú£�#1º(2v"B^ösM­Z¿&0QóáŽdUÕi°Î`¨e.ÏÖˆ´1"­¶Êm{凅¼Ö@çö¦_~ÈÔ•¡Ñ/?¯? v1Sj·"!-+Ÿ*¦Ó¶Ý²±w®R†ã�0×O¥É|ŠüþéÌ�Ô´?Lý½ÇDÅ¢3<­c…Û¤ìšv8âíö§cÀøç·ù0c+‡ÎðFoÁ™á{€æÌ§@š#�æH«ŠúÃ’ ®Ðð”³diR�9>:~‘ÓLåú|@/À|š "UvÊ(¦2�Î5}ËSš3I|øy_ž‰zÅ>ñ$P%pÈ#Þj‚�ľíþ‹yýJ’ �t… ™»´x“aæl[çðî×Uô°þYŸN*G Á÷øv«- ëi†~žh],ôÓ-G<¢ËÉ:à&SžE¦,NX,¿”c"ó€ Eü•özRçèc˜SšõVÁ¾hBØd�ž~yÃÓ(\„g±KêpÍ¡§X`83ó° „¿l A¸Ÿ:ûå§Ç±äõ8kÔAU(õåu·Z5÷í"ž5W=Ã&Gi6ÓS—y ³cbGa©½·µcáÀ]ápÝŽ±°ÿ�bûþMDÇÓP6öȼ~~Ì YŸ)!½‘ïa´_~ou±Ê¾£ð¸EÂË6nüqz®Ù§² ¶g œfö™ãóõš"NI¼ÿèf>Ÿ‹i„1L1LÜÀ ïÚ’âg1-Gñ†rëFq_ùÊ‹ýáˆå�ŽXÌ>À­ � Êr_¨ÏJ 0Òß·7¢ÎÞs /Œ*�Ýù�ˆØLÀf3•¯Ú>¢ñÛr¦ÀNÌPvòubÝ=Ç)–\µ ùÌ!ru`Ñð¼1�f¨+v¯ñtTP›Qgzèvt…Ï/ƒÝZ|o·Õ–Ç-»)Ü FØ@>úçà -ÚÀ Z²$?µ)«^¬XÞ¬¿½© ?Þב¥yx2äßwÕ«[HË™–=4þX:¬Ükæì´*á·|€Äú*_ ˜L5ÚwધóÔ-mË'Ï Ò<µ ?gnk lÇËûç$Fr�1€–³1%#%º5=oœ?KVÌ;ÉŸÁ×]eã‚?–v¹?¿Š~Nb¾Ò‡£•·?ñ&I�G›#®ÛÙ¨*–´Ó´)‹ Ožº\[÷=óÕ ¾#‘$MÀ#¯áycúö î)<~9T㔺;•l£q �ü�QÅÞ Yñnqûdï  ¡BQõªÌʆԅŒ'¨¯ÛðÚô3(pû÷;…†v«Âór�9”êÙp{Ã>S& ôb'D¤«0"b-�Ü> ûDÄDLrª&¹Ã¯ñǵ¬Lš¨A'•[´¢•YÄô)�f^›ã>�J˜±rdÿ7VöobZˆ{�*lé €H± ú†�˰]­ÍÉEiÌ®58€\7D±5dc‡�O‡FJ9žç@ z(�Û¸¢²|e)“Ïû&Ū@†Ÿ·ŠýÁ+Ð"jêtþ‰ZÉAñDóè ù«Ów¬‰CÔ(Þ9ر•��X•túNªöºTk4ý?M¾XS'/7ÐÄ} Êq)'& N€5÷9§škñ1œŸþ‚tñ�!Y|&΀®ö�ôˆÂÑ•Ý^‰_íÑÎæ¨Jl„Ít‡Âg3úøÒºoUj'@ªå*vW6ŘHËN‘ö)™–±l9ɽº³À$Y·dóžYÄD¥ØR¡y* ØQ«d0iPÃLqL+:Ðá'|ur®ù“ÛJØ‚!n;¯Ó~&ºüµ`¤�¼lóžAŠÄ Æ×ðv{øæs‡Ï,††š(ô«LÔÓV<ø@}b}¥OÚ{xž*âà:‰´–_–ËÊp°Xý \y2ØAGÆr3Cí„û aH}ð9¾fÛ¿Â þäû ¸Tó€“\¬°*ÑÖíÍ u“-Æ dšÒÙÌê\�þ“™a`Z~÷™EüóÆ÷P°S®Ìì§K›äË?² <Ÿ¥ÀC"lïFyœJ…O 0ÇáHˆŒÙª¥®M.(B-/‹2ù(…S[�îV̺ l~*žW–ö˜�7/ˆc§Ë˜¬¯ÆÇÂn|x_aÌø3H8WD­YuàDáå­ lz9½ þ°ûÕ•`à`ì{Á~ß'#~E¡°ÐYXÈÛ…z¸î0f"Å!`�Õ›YýäJ(Êl‚ýÕõS±¿†V,U”¿À¦,d¯û7( ¸Úƒ”E G·¢gn›RY /Á1{Ò˜úOc}Àxz,¶âD´àä¹~šéK‘¼ÎÓǘé�¸ù¤ 5:¦`š©*´ŒFWæ,Ëx¡ñ1óüÁZ�¦¼3+ÃvùeÕ–Š"sº|6çFLû/ÐÀ‚))|o§²Ãpÿ¼G¯îã°c/ ‡3&YB†ÆLb`ïÒFgX ‚œv›á9“"—Ý=†Øú:UžD”5ˆÛm �Q¼ ¨žÌ®Ç<‡E®R¹í�g†¦�\•°N'5=š~íPì&˜Æ,¢iÈXÐÁäÃÇIšǃì"¤ž„húa`Ìøï(?MÚôšÖ‰YÈÉòLA±5Ts—ÉvfY›~ ×sà°c¶¨R cì&-X!õŒÅø�2ÀEÅ£ì­Ê*8  ¨°8^…z±ëÁ=Ð%.IòÞ!2„UÔÅŽà¼ÂôÖr0O„ì%aáÀL΋H pÀþÃ2;æ ¡»ÜÈÌ–†N'àà„e0o©Þ竟®@^†¥¹eÁÆè q•Ÿ¨!m£ÆMÏ(˜+ ©1~‰}<*ú,{f©Á°?¼î΢+<°Â‚q`2O¹ ŠhÃ*³—zmý×ÂA&ø˜ÎÖŸÅ_ެ‚È¿~­j†p(?T%–v._Ô˜ GâÆGg èuüä ‹ïöwñÖ�Û}(»ÜFÛÆTRÐß{Öü8¿K;�ÇEåep˜i¨ Ïí¸@…íiGNŒ1'zGWQ�rŸI”¸r`€ì pNÆcÆA=AÂq3³­VPðø·ðáO³©Å³Ö“�J¿f°Âw°�ïS[ƒGq©Î†º ,â óÛ¨Jð¯þÓáó4ò{±ŒLm–£P·dÂóó‹4¾Rí[ë­ÄvïÄ®2ao<èO­¥Õ5N¥³‹` ÊkÙX˜Ï©«Níൺ1q 5ÐÔŠ^!²~?`•èãßÖUûDýdŒÂ ìxhøÝùó€½’œÖëì¯V�û)›ò—ÁZ<êŒTX†,æ¨ÅuOÅ¢^ײA÷¤W£•uLŰڒ[ð�@€û°>»‹Wú^üŽ%l›’ë%{Ò5øUסq¦_ooT «  .ÁŽ<žu `A×ë‡$>m^v¯Å– ?ÙwÍÙìE[ÊÀ€ëuí¬ö ¾d›�¯ì\�Ä&—¸&­ò‘%Ê¥š½Òkr€Ê•†¡ìë"šLj9ÁbU”Xñr0?ž”.G<æ’TШ6¤F™á Q‹¹4è¶WXëø™I´{P8>ë<.cî¡88‹É„®ÆÈ‰}9X5Ú@ÉrÈA߇©sÉœ`ɼŠe{0G˜»�î£_T�åœ#V"�Ï à1;cCTÛ÷ȾXÐ,æŽÒÙ@òí=Z¦èF¬ˆÜ_]:y™´¸“¥Ç›g‹�äC~àûE "=î5¼À#ñ”Ò—Yñ`åÀ’\(uÆ ª2ÇÊÑ× ™îJY}u•¯÷šjÑìí�¸Ê ¹–u>ÚíS�‰ú»ö×¶~Î~À|&USXÖ›„ÃÖç NŒøž3?©QKæI¨ 1ûtŽ�G ‘sðœê•È‘øåDäò<ßÈ“àŸ2¸FÔÞù%‹—O p¶~Àëþ�*}åUß/4W›™9+µ®*¦Ò§Öó¤’!ÐHñõ'¿�|àë·£o_PFÑ êŠ)!í­Ï(€¥ûd;wy?\²¥Ÿ²<‹k0ËW3eê1Ð+õ/ê–OÖá8ÐÍÒÍÕo¤ñ ò•HÀVŽÂøêb fösîUäÞC”$ ²Óh‚÷Ì™nµfýÅ9+eÎjU‹†B°óàW’äÒù/«–ú·7ºâÃç ]DUèdMñBöägž~8aùì§,èª+�Wîè§B89p!6IÁfQ)Úq¥—˜>â''©}}1n~Щ† oÕœɽïÏ.«ZÔ!—‡‰ÏÊ´Ñ@>[œù1jž ù‚گѺRþ„$H‚éµÞ��¨Étò'%Ð/«GøN!2ƒGÛ{ý-Üžù¼j=mw¨©gÑV;�±ãúù˪qs.Ó[òm+×PŠ«®›�ÿdÕЏàñµ¦ð-G2{ÈÎA³' 6t¾„ß…ÈâÒ.ùíÆ™ÅžD5�|�@}¾µ7{¹~d#u®d^/HÞ†;l»ÀÛèµ~¦¶Hß�ûÐ4Ÿ}G†‹¬Q÷1¹ÉÚCò“%4®ËÖ·-å��•1ê8ôEpÖ9­Ã‚‘ÐúK—§ëÑ'F÷YUkÛ,ä|+_ÿm ”1uO¸§o~ž6”ó…«šV�ï„QÕê´^›�;C¸j9í� µUø‘… ÒƒC?%�Ïö˜ƒ…HÁ+ámæµjC™K‹+.5¯¯`½*‚Å´k ¤$¦Nô�^êÓXl)žÓ6Õh£›"Ïî\)ªÍÊI UGR¾ÖšïÖ½§Ë¨*1Ç3áèo�Ø–º”ü²+æü“ÖÄïê­úÄkì(ìuB[êü,eg”†jx 6�#zs¼.!™ZY\™Þ„ÄJq�&ÄB’„äy=y¯«7žS‚¾øjxÀ:ϾfçBVµß/ªó‰6ûËôX®®ª„¹@¦Å©§ÐH56áÙrJ…ñ~UŸÚ˜·¥¥2ùªG¥Ò¦L `ýpi"ȼ0Ɉù|\ f†×zt°Â3ý»cæc-4ú{LoiPkËIóñsªO6”¨ƒšJÓ&XIÜn›OÖWŠ©‰ËüêëŠI…ÖVèè3¾¯÷O¿Ùbó*¥‰þj “jo×WHä�ˆ…1âcÉÈMggf&•Œi‹´5üŠ(Ó²¦I²ß»=f9×ë�#uI¼b^k-ð1-øoø!V•cÛ2üPµ²Â ò‚ýí~Òã`àk�öE�ç�ëpØyœèM9ößÔjKÕ(ÐX|òZ¦O SBûT;`™šÐ¢ÅXÒýZœÀj{p¿R""²Ê-Mˆ±·×ø›*ŽsTOÊ6Q|¤'ŸÕNÿkRí,:S}ñqmÑ'cƒ ±®Ú ƒà_Lšoo‚­Ï|ç¬`“ä¦Ö˺¬­W+´�—Á‚Ä;†ð“ß ŽO6%¦P¥^Ü­.6ß{$ÇRñ“ºÍ]ö²oo~‹.ðU«›ÙȵÕµÒÎßž’ú«vÞ “Û›jýI”)ûc ÈŸ%�Bx6¶_ÝF‰îEiw¢QòZ»w‡…˜ƒÙš�¥8jR ·/²\Õ¯K-í=Z5˜T§ëþmÕ™Û¹¥†g<Ýþè¥}+ÅY@Ó5[BÝŸ�¾°í«�Ãh†¤1˜¼nd‚@^ OaóƒÔ}:lù‘¿çU‹WJ¥Š~*GÂ�R3×0ã ¡ ããJnÌq=ܦé©Àúh¡‡!| ÕPŽEuÀ1ïBPùcVJå[áöƘõ±Þˆ¶Í`µ~Ét£Ú1‘ö¹|Š,`°�ÉÐÞÛbÏ;©{o0 ŽÈÓym0JZeÀ |ÔM=%¹�#3ÁY «7¿Xaý,�p˜µ}I:Gï€Ë 6PC•?‡`Á>p:C¨`bØrž� ›ÃeŽ}®¢�°Áý½äÌwM`�ô‰ äÂn»qGF  gfn/Œ¢Þ5I> ‰åHºâÁæÕMZYN‹tò²-F¡ù31jÝëg“‘En`q-0¿“ÞôMp…É_éç’z¢[Ó·g´‚qlÍ#§Í9�ñĹ9<>£q~óÓö@FÁÎSJdH•&�° 3Ÿï–ö!(2´÷¶|x.4œñ‡Ër`¢ÈñøDððŽZŒCŒË<“9ÖÄä>žæ˜_e¬p¢<„PyBñ(&?�zþÂ÷ît›Z¡ìwå!n:%è—�„uý;à÷”±X!6’¸ˆv$sHÿ .¯Oà‹‰„x½ÆÅ~ÁC%ÇL÷³(m"ÁÆ5cQ÷(ij¾‡‹x&©Ùâ ‰ÒgDýGYá,J·Q²TŸ5*³#k/”;>i,ŽKeÑ“'Š'ÁÔ_ â6'ÞƒbîY�–öƆú=�NùžkoÐñ±‚¸�‰Õ¤©Ödzgvâ§­3g'R]õ7O¶P« a:²u¢³1Ý 2…÷4êú5ç‹ìt’õ•Bß›cêý¢u’"v´ @¨–¢œ°“ÌSí63F3o<<ë>Ønzvà©Þ ¸+RºqO$›Jkâ4€îþ¨{î'tÄ ×·—:ÚEfÚŠir´PoR A…GC ’ŽUnœ&ü©@ú´ö¨÷�´Í‡ja!à²4#)Ò§É{ø]ú^�YBçs·ßvhÉ™h`ôÑ ‰Kfâ&?à�?6BØå5àyk˜}nº+«7tw^Nc‰'¥,‰“`Ê`Ò­1qŠª•2üŠreexú'ZëI1ßlÎŽu3'û<ãêÀmqn©-H°XÐ,Ôö½~£à¼^à™å{€EjÍ+¡¯ìÕU6VhwãžW±œµRBdKÙ¦A¯Ti° Ü!E~€Ê¶ ˜Ì`?²OB=fŠ…ÉLqªT ¬©Ül�Æç¬šÔ…"iÀfËãaÇžóXüIq?™×Uß'å+•P-ö}ZM®ÛÌõëDñœ!D�U£ÇQ1I³ÉBj ¬ §ŒQ€Ÿ>gúdÊ`[?1!2ìÇŠêv蓉jyJ…½Z{P¾ "÷“£ªÄxVtŽ(�`‚'é¸pøEÐé‹Þƒ™,Ur]@o’ó"ÖDÞš4{4êêÓÀëR¬N–š’:µFÝõ¯ÔPò,â™…ª’ÆOêþµªæm+/Ã~ @Ô‘Ä&`Š�éÈ"¨oE<Õî™Z›ÞÑH�°«FR¬Õ”ãsÏò…Xz?=b€ÿ§v¶VåMí¾e¶ûUÖ¿Àq©7»K˜YD/Ÿâü³££Xa¾Ý§åŒ$äî}_6ÊöIo¸¶¬Ä _�¢ ”㺳]èÚš=nºyM§ö=“ Åå$ÒíüÂò²ì,ýtØi>ºT�ák}õL($%øCNé=xkö5…ühRUðÏæç»ÐO+�ÉC9GTRÓüè—#ÑMí…wÀÉŽ1x2 <áq³°ãæ,‚‹‡0Ûú›Ò”‡z-?YvØÁE�éSV­ù•Có>¢�è2V¥h9«É°ððð#É\ì¯wKM“r"é·XFY‘¬mÂaeWÐ {ݳž‘XòAlÊλ"SηUk�²<ûÃÌØvè-�ØD3ƒI}Jlfô—$½“VÙpiÌ1b·ãb=7Y£õbÃ%:ü}íN“ã´”ð–µ`ùM�"Wè>¡79F˜**ø’·È£O€ÒÛ4•¶Üáç�1÷pIõ0IÒ[� < ŠxËžÔ’ñéÌäÍÖj´ç„GÿŠ7· ?:©­ïâ6Už6 ˜"ˆ¿Ötv¤¸IE`˜¬^ìàŠ£ˆf^±ïìawØwö;O#±�‡5úrQTuÅöj^¡M¹�çĉiÕÀ#÷Tëæ¢w «�û.®ƒGp „Ö¢gl¨ /\10ù‚‚œÎ•¼jî§5 ;Qz{®›WÇú4¾9N»oŸ:ød Ó�­ÚµJ Åÿ}‡.:áŒY‰ G˜‹0šzh¿9ÒÆók…�u¥û&µu¨*û"žH’YŒá-ÙA0®�{ñMÓ•:`Ú–”¤-äP\·„I±;er%Ä.=¬éÉúRP "0½‰§&£,°(Á�9(žŽ@ÚéÝ@A Ô?K”¯¾©ålϯ-gÚ‰\.…Yd�^QíF’]Z0¡ôÞäþn\¯‰Í'¬afÁZù> e"Ìä`¦6Ãë ¸¯–¬3W€ÉwG¤*I©½EÌ´Ù9;*—5’Î -s°}?Û!w­è@z­Í�Ü�=m-u²{¾8¢”z8©ÂgôqQë½–û…½œù©†Qa´É¢}×R{­^ oaËP%r£¶5ýsAÙíÍ0«?úˆçŒ¶fÍvéeú>DϦ’%äêM>[=]¶5âÄSÄ]!])º Ž?_¦ìL¿%™õw«Øzp(¶a…ù蟒Á¼ëó½;�Ýäbéd»F.j@ão`/Þ2ë,|­ÜŠuU-6¿å ÿßòWp`{TævãÎ]ÙØM%ŽmÓ«¢-Öt.!‰`$>ýlÂánˆç%î4IQ?5ÝÞ,À÷}ÍÐÒ�ªôqEÒÈN7Ë·+"&·ú\“2¢¾oø—Ó@oÂzóÿİÔ]EþÕ}wØl^ ÐhvMÀlûÝR ÿý ì{ú);§šÑGăû�Bãž$nBn�ÐIs Z»eú§4C¿çþ ¦Åð7Íî½S¯úNÀ–! êU©ÂeŠ5ðMa�7â,üFØo;_ï½_ ½ ZMö�J<æ|‰mÚaEÛm¢ºd¨4ýÖ•sÇBRxRLt€NÖq�,ƒDŒ·DÅîÕÌÐÙìa¿ �ö�ÿ€9ªqY….‡ªè¸±SúàUlSö6.,´“µ0‚ùùHïxi—˜Ô¼B$×å`¤Ô;ß�šÒð/Û7ì®iOÛ¦ŠiÏO6N{Í�ñ Ù�è× tœ= ÙÝC”%ROH×+ìB:‡c!gÖÀFä¾ÑôÞ/iëˆ^'½„ܽÝñeb¹R¨ÎÓØ˜Øº ÷K“0H4ÃÛ=_/] ;gTçIYÄÿPÒ ‡R¿~-Û‚yŒß$_Ù¾J�Ƈ´”‰ZÜŽÁ“Æu�ôm ¯A ÅÒYÍ+0l*tâùœÅÕg�ú•>ñjß°¬xG,±ˆ /�xȺ™õ´Õël—$mþÈ^�Ê7¦(™úE1S;pÔèhŸM/ŸŠùƒÓ‚¿ö¬‹lƒ´çøÙL—�Ÿæt¢wLÒƒïYÿvï™,%­Û5n�h½è·cßóœ-,4¾ ;Žu)i…æk#¹k}›zôIMãÊLžV}˜Ë)äAŸí>Q² ¿f‘AjŒV¶>5ÿK 9 䂼ôߪ)!ѽàû| Ðf5¬×¸O›tåè&› 5ÖM¹dh³Ž„ÝòŠE Âá°Èí³‡ÅF nСß;Ô9ê6?P̱/U;xŒ£`I‹»çIéðž�3¼+-*Խʼn�éI€’%'(Ïx™æIU€ù¥'gYó£Ór΋rÍ`æ5$+’¡Á¨Ïôà|è��‹ôh˜7áS*MgËþ ¨Q’šÙ8b}'¡¯c¶Æœ²Ã#–+ ô3sc)4â´?/Ùc3þP��ãƒ×P�ŸùòJ_Õ'„IGÕòuÞ… ·Æ¨xLü¼´`xÎ—îÆ³ûo¢\ ’øDxáJòÍ-úÌõa››:ö`4öö)ÁÄ–@yd̘Á�~&"È%ŽãÙ� „-&Ô‚Ql�ÕžLç'¡gPÓ=ž›\^ÊOW�ˆѭª�¥+ÃþѰmØaˆ§H{³ÃoAÜ‚ãÊÏ^1ëh #Á ã�"VB½åy=3ÖÑ¡U¿ØÄ`û5Jï­2"ö¶n�‹ÉƒgWUƒÃsují_ßç¦.Dl%åSæ‘T7­’ò œ÷0ïR†lÖ2¤#ÌïHD;f|%ºUŒX‚Õa®€*Ìí•‚”Ze32l¸êÅä~×/lÁ¦ ƒBAŒäa!¯-ëF�¥ïZ¤/—ZË›~˜Q\v…å•,Șoƒ`ÉR~Æ †Fü)V`èwm þjrzlîò‰M>=EIèskŠLnÙd@FÄW\)”¢¤�Y…P½¶¥²6}2´3ှ.£˜8¶v`’  Ù75ìÆ÷îœÅÜ6±eLî¼î 1“„Ú8OÇŒ07öËýpœ6¯Òº²–K>f‚03æßl‰ÞºÕ�Ö@Ú 5Ö4ZD ‰Ã唯 Ú[•üŽrV À„%݆™Šé'fï÷iohd[`û¬mB¡ÌKöåþ$±o[˜ñÔ·âQ�ñ‹%ãò­¥®ðK ›Æ’¯ði�ÑÅÕ>ÐÙœ ú‡QHç{ä ƒ"˜9ÃÔŸ×SN"·(7ë]AÑÄœÁ¼ÝSL•.&ð=áéúzq´‹=^­û—Õ@�*_¢g•÷áæ:™qèaèÿ9c˜T{ÃJš LO ²/£ëÅžXÀ1yXæ8Íõ�±•º½áF,°AâØíz¸ÂQE‚Ë�'Õ›$²Þ�ãôÀq?;²^) F^´’wúÉ߃á×N"; %ÝÑú*½$|Q9‚~m™_!ŠŠÈGPdjÔÚŒ5èÓ~9ÊžâöÁ4Û}—?þRœÛ[Éépƒ •CÍÐ-üƒC:í54³ kրȮG`¢#¼ ¯µˆD\×Ã&c©Ø Y�£å_[2\(7bM‚0_€|µ1T /$ÏÉ×ýÓZwG”Ò &õ)õÙ»O2¤±}öKWoz,=Ju¡pø¥n}˜¤Š�ƒ8y&=Œ>îêRLÈ0�eŽB×¹Ôi¼ÕD76•%äûŠÖk1,a™Âál™`ŸIR¥� MõA_K…QÍ&±~s]OQþô�b…Ðh£}¦2Ùž�-K‹­ÚË•fjp]Ć�¥Q) ³€‹&Òɧ˄O{‹5'Ï‚98àŸF®“yLzͦä«RÔ+K–š‚³LH5ä‹ ’[—° çUñ�Î�éø¾^^à ïfÇSßTøS´a›=– -L@)Á¯‘Ÿ@�Œ¸$‚íÇŽÄË>ïŠ2£ŸÀôà (]³J`®YŸ’(X`[ûBÓ·/*›cŒD…·7*³ÃŒ¸¥íZC8¹<ŸrƒÊT3 !4Ù¿�¸@½ ƒâ#À.�&´¶¸ éäÀ£^R²v² ?%ÑÆåúDðë;Æ”ðq—`_È-«(gøèÌ™ÉðÛ†"ÚnÄJ`‡œÿº÷ 1²±#�„Mg&NˆhiÓ:ÀBßÇP¯æÈeCm‘梓>¥úßÉÇB¸-çüQ_[B$¡‘,G‘Ì|üXó”›s‰�ÉtÉ;¶‹½ˆQxU%v•)¢(®º3ÀÇL««‘ügÊo¡gæÕžž±}ýYèy"mNŠ:´M븨2‡³Pô¤”3j 8¿Q°î°f�YÌ ƒ¢±‹ûû¤»òÉNÞΰÛBs5A´K¯Þö'zR÷^”Ð •ÞsÌˆÍø�~Fº£#_±Ï?˜£Íá)mm´ßçV 3¸¨"tÉ›¨Öë`\ã¤bÇü øÉë¥3ºþ¼(Å!±ÒT4#NåÙÙŽ•§„Ðôw—°ôÂ[Ú;2Í™NVZ²Ì´|P_wô‰xï hx�Ñ/jR¶àÇà9«!b¬É·V- àk¶Xö‚ ž©ÉNyŠüHÚ•–ã'®iC>gQ³¡Rþö-WßüƒÍË–žïµüD�~ß Ð‘‡FŠW±w«$‡ðÏvÚë7Må¨À«akLßK<µùëÒÁà~€ÐHnÞÀjO�؃‘#ºRåðÅÒ#úƯK—‹&•�2;Êî?_õw->¤™•�h÷mÛdH‚ûEN0Lù¨"ßáaž^al½õvdMs?€Œæˆgƒ æÏ²1õÜ'ölô ‚<ÌG…ç¼§¬{ï~hÝL[±ßÖ¿!ó‘÷ôwù²þ/U´Š¿ùkÀTnWã6Z?¨•né£í6 ¦Áq&£iæ’éŠV ÕȘLã&™ÔÁÖäǘö×XMh–²÷ŠgÊÏ—®V{x¶~Xº÷GvÏ£Àg�Pé¾g ú˜aÙ†eÞ$Ñj®7ÚÔ6 XëµÕr�¬rá)iüŠ|*#äwÐØíîC6NžÞ™„?õßd¸X~å ³`œ»çƒ 1ÈÈoåÊÅ8K5†ìòƒŒ“C ;Œ¾™õ;€wéw”_âðZug5Ã6·OþaYùyŒäëãºH{q Àp§BQŠ_øEP>øf><_5ˆ-Á¢ ­È\“-µ–£ã'ŒÎÂhc“&Ö\�„ík¸¾à\׬U‹‚ ;½þH-‡¯È…Ërßà E“E&¼ÞÑÅ™áT^:ñŦûbŽ¿6X¢ÌÕzïæã&›]PÉ&íø'`nTužµÄbNœ½3ÝttÝ2gœÿŒfã`2�‘Þ¼Â}Û Ã׊SµÝ7NX–)•<1Ôhqð‡òf­ýʌو±(/ u-ˆ¥)UÔ+ì°Ä"âYqóûý#œ õ?è~’�_Š^e­ Ϫ®(çWË0/95‡ÇòÆWn½È=ʵõ¤X$�o÷ùé‹R zm?¾Æ|l/½t!eÄÒÕ«�{ªO|ê#&å�Ñchh£=ØË)J-¥€#ËüÍó7U€Ðw^ß$Ï41:7ñ�|³á–ó8¨­[[} Ó™¾àµq’ÿGÆð£Øƒ3S˜ Ç_ŒaÚù ¿µI”ía`!¬�ÒÌ,q˜™­£ |¹<�ÜH+ïAü#†;+\’4Üέ8Ž$Å%)(Êõg\ü�ÙŒ:’ýNò>}Γ‚Wx¡§ð‚Z±µ‚‰úõJÙðEÁ„¼_ìéRÀól".¦É£ß>€É—&XŽõ”µ¢±áa`|N™a‰-ÅfS³[Ì’'Vô4¤!@Ñ6’w2]Oü²~ój98OO»+b0˜•t+‡./‹ >}__ 7{3¡ÞuÄeóR]!íºÆE£QñÆtJùÓ×WC}>D7Yô-‰ù£œ7_OŒ-Õˆœ·½\R-;Û ƒ³¥ý›Ú™ ÿKìÃC®2˜îjÅY¤è¸Ë&xf„k a”Ê]«+NWKÛÚJ ì”JX{žaqÂô·¥y:IâD�üíͯÓÿS)þaÈ$?±"?}"ì…×éŠS»<}î.kçMÉâC@ã4t„Vx£…ˆ­Ÿ¨‰j›ÔÕP B�zÑ„BG#kxºõÝÞðV9XÍûüâ^]ÿ4"HR `†´Ùå�"1Ñ‹¦}½ÜÌ|çIìÉöOXwoöš<ó�Äàý㌂$˜Ïc¦¢<�½øhXbÚì1A€“Ž�`{WŒôº–A:©J Whލêü£°àZæîU=%ƒ$?™":Î#…i3X¹Pàê ¨™FÏ[¶»ÄÏ$!Uq#„Es”h�cÛ±òWïÀ¢fÚ)__µ³Ÿ¤Q ŽÎ¨Úé_qfÍ_'EwÊ›œs\~г‰�-‰>¯y¾Àz…³Léö¦eÑß¾]&CáD=Âà€•Ç,C�1%ƒzš!7ŸØ~‘“#3ww¸Äôø£1ô–Ž®>Éoã´‰+n§lõc}¦‘Í.ÉP¥ÆÎ03sÝ�éù#`}5Øl›v&¾k©$¦${LˆÊöW�€©Êa%íA_P2„ò[‰)¦Ê®$~ê+)Y‚Ù\M)‰Áù¢q±w‡ ­Ý>•ê] <^¯~EzÅ w«ãÛðÎ%»O’ê–Ø ½‚}B4Ì 9˜!3–n�ÂúWQˆƤii|™ŠžAЀ‰ëö¤Hh2,ˆ6öATõÆ×,gÞ�S)“xücÍ빡ݦœ÷X 0ó÷CÀ›%ó¹6QEQ ”l‚)&Ô Ü(8ØÚ8o ™ˆùÕZMÖ†Ö@(5 ‹FÎÕñaÞÄ(f¹¾Yi@ïÏ�Më~–78Qf‰ nù–ùBáë×2TýÓ °>«/ÓÔR]qœIcßj&ŒãÞüƒ`faf‹ŽªJ+vµ�ŠzÞÅ\‘lQx[p3”Š™ÐÅžÿ1`Öç΢3?þ'�gšZ÷_%¨G]ËÜ2{øÐYydcOÄÓTI. ×,¢ *È5ø©'4} ­%ë5L]Rlû3ÒlsP6h`×µýá%,pw}—J:®…“THP`éo°Ð@âmS�\K9‘^ Ýó¤ˆL­pÁ�Öé÷vsÎŒµ�q@ø+AEf—HŸ>É”@Aøãd}¨À¢6�³Çê òÑ4O+gE'Bbc†™UÝÙáïéÞùÓ<ú½.W‰¤ðXêÀ>ð¤~;Vë´nÜÏÚvLL:¢aC¤N¦ê¤?X4´�&gJãß\ƒ é5i˜p¿9òÎÆeŸÜ&ôSix®™xº?ü‚Hþiå=IX¬`±üÏäðÌA=ð ¦=üí0{’l·å,ûäC³æÚ’›”}Ô÷v¢0\Òh&{‘͹cÂ;wBÜÙOÉí/ÎŽYY°Ÿƒ ct-T ¥ùò—†4LQöW…´´äë?))½ºÛcƺûˆ›~ôg¯á±óÙðK­Å !´;« ¯wÙ!󉘮%[!Åþä0ë‚…é2_¥aZmöúò²Ì66ætËEÈyÑ�gÜ‹KûO±%[SÃô¯qH¥3›P|à›¤Owý²I~‚MXG×kä=Rx²;hM’e‰V‡] åF5‡`èª@àA_¨ÖðdÒcî‡×¶ö‹Õ·ùÜÓ]l\´IB=sB®»Ì¦© µœŽC†Ñ8´ PĨú‹L»Å¤ÛÞrõדP%7©˜À Jú¥µf\é¦*7w¹á\f#„¥厒ɈqIÂ?Ñ,Oˆ+QÞ¶w֌ΘÔà‡ð1à†“7…ŸíŒb°ÐDœâ­éŸsëXj�»u©¹ŠG—çÓ7KéòWµ¾™ª!(ûOñÙ^Ÿ|…ã”'g’!)l%jNÝä{N4MÀåmK+«å$Øô0SvüýýT8:%Ò×â¨wƒX†Ñ¬ Ëfý…föÛÌé“4Z0OG_žÎ`Xl”­ÆÚþÖÊA»ìô›± g ÜV‘'…½ˆöé'ýìµÀé…d3Ô †v1 ( …;'ÑÓIE)®A^í•I­ÔÓ]ÕM äðg>/Ün¾ÁKór ±ï v\÷µ¯ ‚‹ÍáO3ÛÚ–SY]ï­ WÂ3!Y ®náì|RÓC™¸X·Üo—êy9ʤÜ8ø[æÚÜ¡ˆ†(e€¶¶q¹eYrÂÁÙ~%šÒs²^].mžuPe2Õ•2깈åÐ)oNÑ &3µzþdiÁÏ“ž`ÔM§“ {Ž€M"<>d}#åÖD!Ù…èÐÁ9‰¤ÏpòúU~ Z\?¯S{ëdðx{ó¶0mÖüÄu ÛàRm§w¡Z‚õɵü�Üz…sÆúÞ�Ôf@Ì#pø~™Jçn©T¿÷JRý>Š[L^¼Æþ@?«4Á¤âÓCókNø&ÿÖ6Æ@÷–1?;K‹€¥ÜŠž¶}®0tªaî£Òòë�ù»�æ5Þ$`<WÉA�ü?&€óõ ¸»$±K`í=| î[ë^UßQ·ÿts¡HQT_ ŸÀòŽ<êÌÿa"¶G¶µErÿÞ„s&w‘J~þÒ6«ÕQ%S{=TròÒå˜ÖKïŽ�‘ƒ™()Ÿ££ýÜ@ÂÛÞÚ±ìç/S6×Ô0BC{Jzžèš*ü+–,¥BÚIÙY¾<%è´¬ oü{†Ò„Õd]6ƒÊòC=Élj%û™{.Ù¸8ñ£€²dk\:Ñð�XÎQ‹Lv�O>RkT�z&t¨¡r³Lê6懩qÊ}fÌTè Á'sh‘7#rû¿ùA¹q+ß½µRO®EØû3©.ä®s¶gtÖÓê,ìN‰v0J¬:15±7ãñ¹ôMÏ);‘ci&·7²éÖ{V¬dÎã­™·Ç:ù*JèLÒòY`$É­>YB">t]¯+¼hõ9£’dÖ`í´i!F®íà�7ïÕÄçÙ ïö�ñ&‹íxØÃй8‘Ý)/fŽ(Èö@Rƒ�‹^ª›Üö¡Ág–Hé1Ãe-÷ý;;¤´–cTz…RhÏ Ìq>ûÃ)JTßJ)˜™Åñ�v5Ë0ánõÙp 0�AçŒJY¯5‡üàê9É¢ó‡@ÒÚ$iÉÐ"�"K–%⚺÷ÖzMW5m¡íB´vJ$kjïÈÚ£š¸ãÜšOØN,”X¨®ÿKçO¾9ùHÛòæß ÷úó÷ŒƒÕ€iû‹0E9"˜i#Ȳyéâ± ncžHÚÆ²VõwǯU2H)kóÊ-'n¨`F_ð`çÃHã¼\¶ØÏq~�>Nå HdL•ûã ªòú=:;ãÕ DþgÂ}(µxN¥35µ1œ¾Ÿ'Tà %-™nZùëÑxá˜cü*»¿2Ìì½€ HR¥�ÆI÷tÜ×­ .N‚í' 0èfévñ×.Ÿ$bY…¸ÿA}o3kÕéec¿µ…‰¼·”Uƒ‡Tñ8Õødñ©öÇk(ö ¥ˆ­�P|¯®Zî{p¥[?nï·U—ߣƳU+mDäuÿ¡kÄ�!›æÄÙÛаû•¦-LtvnçþaÕ\’ÒníÛ›è 6É ¿Õƒ÷¸]qvÐÁ•U;åÙJOWŽbÅý­¸©ÕÚW;f_C(«�'`…¼q‰Ì› _ždg’V¥–ùû¡“[�è¡ÄLÓè hŽŸtD¦##à,§¶wP´Û×±)UjRè{6 ¡†± ‹]êÿQÀ°¬öü–» k,GÀ1 eý–É�KXŠEß�ôù2•c®ÕÎt ›£qˆ‚¾AH|gÕŸ¶•ÔšBç8d-·ÃÓºr¾³�?³1sgéàÊŒK$¯ò' !­çIßuC%ìá�U^B7âÆ³W'á½S³GYá©“‹BR¨å‚"õüMô[’m �O½Þ¿Î¬î ·Ó¹ 鬲ú< „�fÿ8³$ïù­HZŒ*¾|]o<£±}JuCHŽ%Ãwß�eë Í}„Ã/úè ³G �ôÖi{YŸœŠÎ±§�“þü³÷žÝÉ+˺èwÆð@ãH É8á€8ç€m °‰ÖÜsŸqÎo¿UÕA-Œýzî½Çã޳滖,ZÝŸªjµö�ZŒ×ÁkØÊ¹òsXø:–\^ˆ%^ow�Ã)I¤¼JLpFñ’µø×í­õ@ˆ˜é¬g€¹[¾Pch+ù£X`\™嵟ÖTž€/vûÛ·TÕìæËB+ëOÍÑYNËR<”¦°š#ï¼½zqµ3ö.sÇÕVôb¿þ¥Ë‹c'½¥äê"Ý(Ö=o}O“ø`e�,ÿwyó"[OÌÿ"û¤ùhÁ\݈Z¯Znóc5sB58�ƒy<12œ57^Ú·ªHìÜ«“)2sñð™CuzŒ9Ô{Ó dÒJQ£¥ò#šD%1}Ÿ]OjSµöÉLQ"Äe¾üÕ÷Ñ«xÅ󅵨å%¡ß›w;Zñ|-'EÃ/ m�†¯ôiÖÞ ík¹Õ׋@Ï[v¡ûvkjçç»ÓÙr×øJ’«Së`Á¦W¼cKøõ»©"žZHºyÖûŸ«Q;íº ž;6ôlyã}m:†?]Š›­èY+ÚŠö_ZÑûÏy¥ËÄ”s-»Ù~Ž;0ôdf{ñ ?-\b¾‹« $üžË~¿w�#忬7]ýW\‹ŠÌZZµ“ɯž“"�ÄÃ&žvù¼8«§wkÑxi% ™l8’„û™„D†–u`ÚEÁ_ü]Máƒk9/=¾®’_×ó_*bS/N+LÒÃò]q9j˜@„ƒž.öÍýzÚ¼Õ¨·Xy]‰Vãûï…u\°éZÔQàÒ!‘8 Þð&X1ú¼Ã+b¢·âå)ê/¾áþí§¦õÖ·3à¦mm›:Š¢ n»»‹—]/%,ÍËlÔýžc¿ŸIkí�§g?ô‡vZùh<õ`‚HÛ«âcÌ·-½½òL-~¬ôp±Å–ñþbíxË/ÉíÞ~žƒÆtRF€üe�o’ו=î??G™XûÙZBA~F‘ŽáFãr}qüöÌïyʽw´üj<ñ¥jE¶«»°èò|ó;‡ÂKW©©Z º¿¾¶fße@Ë›ÓMô9iJ0þ÷?SÃá�U�a憅ˆ×»¸ŒÑüy!K%ÖýùÇd5²`®µüójŠì�?;Í/•‘|@ÏýBwöÒ<ÏàÂ3 í�·Vœ<ú¬üýãÖ“�Øo׫vtSÙ‹‚öÖKTƒßín}~öžXM|PªÖdé{ƤA·z×ø¶f.ð’�néeÁ¾ô ·Àåã: ĶoW@Mz÷Þè¨e"ûRÀ¨³Wɨ ߎâ0L÷á<Í ÁRÔ-Ã�®·F@ JFë¼3õ ]¦Þ´²Ë‹WVä¢0³¿Ëãu�ï/ôú1­87kù­áÝòz�¯2¦0²¹WŸpsÓÙ+Ÿ7y÷n:®·l/e µký.^Šx¾3PO·cd˜=ƒ7ýùZ»¸tÇìG¦Sr@T—·PTõÍöÝÅú •ØW¾�Î PlF_�#}…jF*BÎ|»Œ¸[›í?¼�¨-v^ý5ÊÕËå…}?¬(æh&˜ìÑ {>“C¯a�Oà»o5ØkUÈ£�«âÀç3ìU¢8Ù~…9&4K‹‘¸¬Ú…ÀbrÌ%bæ®ÏóßN�”‰€#KÝ|á.òmz—ø©-½r4þÒ;c+s'ƇQÎÈãvªP›”öÁÔ·7›«[Êù¨ÆVÃþCDæÅ±u 2œÈjíX‘â—ÈÎ1®Å�þy1ð]D>V.w}9ÖÒ�I¤ ‘‘Š•g壨+—�cýD¯›å ZÛÜÄŸ@* î¬Òøh˜œ³6-ᤔÁdaÙX`ŒŒu4÷t+`Œö�¹ª| ÄTk4GÚúûŠþ�ä¾\ðo{ܾĿ]x¼“ÔÓÊNôùŽTi�랯ë¥Êk#fV[¶c ¹'ùUn_¹‘­â S¨´¢OóY´¹ëÑx½cá07`„It|aC[î_ïø@zj„4>&-‰àôÖS<Œ�\-èÛAr]�ye¥S`_L{«dK3±­Ž”×—×ã¶)le3ÅÃ/io¥ �ÜÕÓùJ¤ž^îQÄ@GÑX½Ì‚îÌŠkË{…,Û \Ýø8ÕQåu§ð´ù‹a~ÿï©aÞáì¾C±ò'Ø!±´´9ów��N8jÝçÑð&Ÿ´ ÎÅÑ –Ã/˶7Û£Xò¬ç{ÚŒ²ÝÖ"KëHw–Àæž.ƒª®f7ðPš×Ñ¿º™�̰[ÚÝ¿cùÞàÇ» u3•ç�î#/5j·Ï É3öµ6‹¢(ò,ž ’8à$™ŠPnï…‘}�E²)}gu¬»Ç�áS\ñº´wœñ}F]˜Ïú2B»l�ó 0º-_ÁhvÅ¢Ûo´ôõ÷Dн:O1-Њ 3®Œ\~ö„§9¹ã/ŽÓ'U K6*hañº–/˰I%AÙîr¨›¤–�•íZû£°Ê&Ùà,–H¬¾~Êe˜\ëâyàõAJ1P g5bðbø9ÂO®X_êÈ î¿xÌŸ!ú rsDÍF­Ýº F6’ƒ0MC ýäF‘CSó&k+í\ߣ¾<(nänù<·JùÔn÷¯_ƒ;›`xê0$O±Zû9»ÿLr¼üš3A&ž0D\iE›�ùE Åë$赜æµ|sË'œ=Á½´"l”žY[»Z’ ¸(Ý{ÛƒÛš„{§[ªÝ#P`ß™[éìŽ]¹´ñ6–´•<è,v)8÷€uÊÈc§ !ç-®Ï\©ö‘)“COÇ�z�'©^@*œ›Ö¤�dÞµ�ÔrGàéæöî¶_Ú&÷w•±­Ý>\c4öæE×l’f‚ŒævŒfë�ÙÅ´¾jÙ¯ }©Èk€Z–¼ÄõÉ1£YâùüXä:„¯Í­Þ]3Ñ8¼ú\ŸÓÞðŸBl&¡½(PÁŽ|�Ÿ]ò=­6ÔÖ–j=±ÇEl˜©í»´)«Ü8‚!|JD¶Nv>PÎÎPâÞí�èÓ¶uÑ}+zöxC†¹ua$SÐ,Ccäû�öö Ý™’°Lo,‘iåˆ5[Óì(*ºƒ>7Ž)”%¢4¦PŠíy—à˜vSÒgÇDôc¬“>óž‘]„Á.F󅺓À÷Ñ÷Ïœ`J†;¾R\�ñx½“ñ !� (å`†çŠô‚W…RB7/xÀO›‹§{U Pí),ÚYXŠ××Öž©ˆŒyvù4 %Ö8=Ф‡ФшùÁ±/ëhiQäAOW8‘î?ç½Ñü*D^»­eas@ È­­Ýô¾Ð$3j´5]§³¤æ÷"Ï­Ó4Ç.˜�òÖ°ººWpëø]7eó0ˆd�ÛG ¾’*²&ëLèåeõI# Sš’f*bÝ‘<§M™‘¹l>k îR™r¬òHiü^!ô'rz˜|"Ñ{ÂÀ%Ë�Ìç„PÇó@ö‘NVl+Ý¿L÷̬9Lʯ@“Æ2ŠÝ<ö 1&æxiß©jkV±au2òÕY�[�»ìYäʸ{§ þÏšn5Ølõ>xþ týdPRȦFÌÇ +7ÜçëdxØàl\ 㨠C3 "…¯ú,@´ŸSyJ-"—VÈò£5¼i‡ç!9&eoWëÝPbéë|Ž?f&JÒÒ˜÷Aˆ“Œd\ÊhùÊÂ+¬â‰չYi­¼¿žr%y,482|´ê­�ÇÒ%Z.‹C÷ !ð…“êo½/C‚ÞŠ¥ú¾}}ð 鄈œw@öjTˆÙ³]²ª[éµÜ'ÙEŒPÖÅZú' ߃iŸ‘(2y|Þ|«G:za€1h³0[fpÁsp©`NWâµÍÇK6‚ÉÞ-XÿüIåÇ%Ô¼(Ê/³¼äE�÷ü‡Z­Ý»½Æäp�À¯0T§T%õ¬µ ²¹V‚1·ìÁqü®\9¬ghZqdëìä,`òœáy6G—ƒ ų~Õ­KaÚÏ ¡KV�1ÏDí7ãúT¬󆄂(Àdɯæ6³l‰Á®z·Pí{�òÅÓÑþxsù(é¤rr\%û#S_¦e0tu3�>n€Ñšßó‡Æ2.ño…-®[y�§Àœü”è<*ù LûL“rÈ|ÿ9 qÞ#Ì(r.rµpA.úXÓ¼Óoä\<ÉU¤¿úœ¼Í‡”9%'Ü«nî;,•˜Œ9af¶QMl†61òV�ÞÓ&²ü`Þ¡%is¬Ü´.RKc%—ÎQ©ÐýÜŽ 'ZYLúy­Î®sÈÏMз+‚%u^�Ê©—r¦ÕvûÇIº [Aç]ã€|Å4Ñ×ù(:q©\Ù�,•+¯iÃ\ßæIÓ`³ö)1fÝ_að˜>ÐÜñA8ÌàäÜö¡©ß¿À>WÏ»Í5šÈ‚wLP¼Iik›§ ö‡vþh]lí-¼2c€–zK,‚Öì®{ØÆOnTû×›„Ô9n4_(a6¼>&ëÃæYn)»„y¿S†ó± �`ohVx‡'oéÉÐØáøð¢\Ùzy(WN¢Ëʳy4Oå{Y9"Sv P"vüY‰—Î^䌳V±âÑ?]X%ruÆQ £µeaŽ h¬{Þ‘q°à¥>·¢�ÒÑ=nŽ’õ5Æ­çƒ ^Õy ‘,;‰]ñ|Éì¾u«K’¹'�ü‡{޶?Ð~ðà5À¯@Ôçc˜ÌÞK ¤$pÔèÊú½—o'@ïí&õ"k.8”ÒÁ=Kr_÷tµã5‹I>ž[F?$£�«³2 Gû÷É0ë¥G»Ý¿©°Bˆü2…îa¢s65/ è�‰rÂ> ‡ëܳ—Emùd%'eü‰” ee_žz‡ÎÓ†~â0­"XËähÀæ· FmÅ!ïüµk¯ä!èñ´0+Ÿ›�ðÀ;¼c<}<[8ÖÊQòyT¶Î²w´(xwcÊo‡T�`8oy£¹Š«Ìíþ.FÇ™-¿ðSÐÛÒ­>êUí}7jåŸMM»}]æbpñ‘�v¶wÁ0?Wæ} NvÿF; Üâë€SZ}Äg¬Ú¤¥È`”þôß¾=KŸ2¼}Bý¸Å¿ ¹xrÃ4D¤ó»#+õóbDÌÔçföìy çæBÜ6·R„Zùtñ�{�Àà�ñ#·bôRˉÛGpyFQöHS×§õ;e¶õÌUiýP!]_Mª)�“[ZÚ­ý²ê‰DÏy%8í:ƒ²R€–?=³�ã=º?ÐVw6ߘ²ìAäj§Þ²:;±ÓŸÀ0û~Q£+VJÿ9ð†ËŠa‰§ý×G”á'-]¾;AÀe%k˺bÅRoÑGnòv›øåöü~—}*”>û¶ë#Âm—Bñã“?}”»Åéž+ß^DÉôS{2¹“¶À¡bï|åæQ[KÕ.±g­ósè¾a¢!¼R !ˆ<ù ˆ-w­Áf{yÁÅ}�L¼bÓý@c¿C¥[ôß÷ùv"}³¾ 7$ï< ÀàiVÏ%üBÏð‹·ØïKaÏîž„eoÀð¦6°ˆ·Â³¡Á1 (}¯ïmWH~|éa_Vúþû›´vJ?]$ã-pG`'ˆÐc»åÊíÒ‹–)�jk¹öõ\hO¡°¤ùŸ'a“(Z‡»Òä_zÒNØš5G“£õ€ôSñK ]òWøÖ™žùmŠ íÙ¢uýùqTJ3L´?E°�+ÑŽîÜDûç«ÜßË”§Ž–ÿ�j}Yó¼І³ÙÞRéül_óR‹èÎ˦¥ú¦. ¼>è3ZÛÒÜvë\ÆN9´?G+àŽwÝ㣕þ±8ã£JáG>,Þœ«}cͧoN›Á/‹w1„öp¾�Íì(Jv(gÀÝ¿îÜùæ@ÈŽ.ü&&„hÚ„ùw´]Ïl±ŽÛÅÌÉïbÐþ}6ùÛóÒÓxoóèF÷8f½éäÁ1_-!(¨� feÕ�3n0�*¤x s«àå_ œÜ~~ í4®¡ÙFGEj—oŸS¾ûëªÖ׉jñ‡WG.ŸÚ¾vQŽØ/” Á¼Æ{¾˜Wï‰Nƒafbkÿ7ÂÝ,aôüZ®<ÞTX‘³x÷qíëjÀÚé¹Ó`�ƒù×uöN4"°çG1tÖ�öºŒoðÐk|Þ)½H‰®;<¶’qˆzËwê¤ãÚæq{5™Z¥¤7€�TÌÞ ˜uPç/ƒ‚)‹¿üÄn>×´Ñmª¥åoöÎŽ’éc® üAä�æÙ¬;~1µ¼ž§4eîø—Û™!œB²ô¦/ ÙWŽi­j´ë,ÁÔ)ùÖC;üVÖnŸ¢7èÀoEðŠ¶‹´½½[ppľÖtÊ¥ä3å2Ø×mÒCíÈØb__@}æÉ/%èJüû¬—GµÈ¹ó²=¿»¾Â~“}6jqªT\Û"‚ëõe¾¢#¾=6ØGÇÜUîç§@FÌ©mãzE «s÷|½�W¤½á3[/Pÿ*˜NP±Hå3óšy íâXã\ïÑâ÷WÀMÓž-$~Ø´½{xðTGý¨Š¤Ã1®0“»Ø˜Õ}hûlû]"VZD ù8%3èAø€6;š‰ ›_ĦÑ“·ï·ßÍ2?”*fPFŸ�£Ù3ÊÏ]p ÷l„©êämà�|虜¶UEõ}ó_˜_ž ¼µx <¶´»„Ì­tßM³Ha%ª/`Íçshô“ Ðëä?P'gTÐÙľ·ÁôS�Vb›â+^vÖŠsr¶Ü=žhJÔ80 ¤cu8Þ9÷¡ úû;æ“è­ˆáòø¦ùhÅOqf<ßù"Ãì³ì8¹}ïûwp©Œí+ ‘îê·,íöñõíÙåø”'2./É™7T)�œ<í] Î]ÎSi&ë®þòu›�‹%íNò½AÖ<ȹÎTƒ 'ð:Âfy±œÚêûákŒ'XrÀGDÎþ´C 19ñ‚V¥ù¶@†(ȧÅÞ3›º©åW+,ÞŒ®sý‰W.¡? i> ó¬Ï–°%Gfg}—­O;S*x5nÿÅû‹GÚ®¯…ö¢ø�ŒÊ£À'€&˜Vð˜gA>åÞÞ Ÿ²¯4I³#®ãE`5™Ù“\Šž$—U‹ ô‡Zá>Xc³ðɶ¥ÂT$«®¸äRÊ/Ý©#Ž»Ç8Ð’LÑ}nñ¦¨ˆýø»Šæ²ù™Ú +©aáds;‰àÚ�…âŠ[-u¿zƽÅÑã¹v{[1ÞNW67}Õ!Åñ‹9´‡`of9gñNPeY@zu¯�Cà�ýAÖ{*!°_ç+4ã;þ‹þ‹)Þµ~÷öí»)4Ûƒô£ô|Ôžxù‡fÒGè7Ñ.wl,]µFH�4ZÐðŽ~|½çÐ7AF S ÷ÝRf_cŽ üøK6¿fU�Ÿ#åS … `s·hÔàPY�S6pNÛflu}cKuð{ÕªØ#-ŽÑ=LL.� §—4í¤�_¬ïò%~ó øº*`󔟢‰�ÐÎXÕg}Àˆ>À†áœ!Õ¼ùQ ~³÷7ËBÎWoû[>`=û¸¼<9Kµ$7ßhŽ�ã±Öçv+’€Q�ù¨$”ÌÞªìÖÎiaÿ¤ÿlö¶ØÐëÞ뛨7CEÓÕ^ ÒrÑ:ÈL/.ñí#M”¤&ð|1^?9xs\^ŸèF`_n­[¯í·SåC ø&Ï/(Y8꾉óṵ̋?âW�7˜Nݯ'Ö™÷©í}¬¶S«ë¸R >!€:¶<êowžžâ¥ƒI»[¯TŠíÔõqE§„‚žgáGêã2ÅnžxŒÂôÂ.¡ x6°´GÕÛ%P"ït‚ \ë?çon»Éûy'^;¨ËN-®Ù{ úèò›q;îm�ʸ¢) È:}SŒÑ‡rekk·qÆSÒºïl³îì“ç|5„nZ`ŸÃ[‘¾¸Ü¢òIkr´áõªö®ÒsÜF{>�˜¬k·/·Mþ‚†øÌ~êc㙞ƒ�ûâ¤Æ3+ÔC§Öøúo|™&qlþ?:øHná–Â�×±Þe³Å^í¥u*@‹[¤�êÞ~þ¨z³|Ë^šd/‘€DÉ/·§ 5Ù:.WÂÒ¼ß0]@ )æûpðš[c/-ôçg«Àá‹–JB/zÂÃzèÖY šX*³ïœÒ’!fS{«Ùr¼7k 4×oO^„%¹\î¾F.û¸ü } íÉÐW}ÁLÖëhÓ·Œ/÷=þzZ6Ü:[ï5ÿ0Ðñ¶-Õ— ·³©‚Ÿ�ÇÊöâ‰Öô¥õg„ˆ¬­�L�žoóáa‹[Rm@În·:ø\Áη٫gÂtô»¥—ûc¶”ÃH‹ÞøMñÕ¸†\yнõÜi®{9Wf)ÞÈ{éé ƒÎ:-²Â‡ ½Ì]RÚŠÍåÖc²œÉâ×¼ç7¹©º¼oq«ù{mkã�å¶Û¼NÌ…¸<ßw4Ö,›~ßjÚÚK‹}e™-ë¾3«¥z�rΨ…oR5J¸¤w)º"åÇnM»°}J¡hà¸b_=óÖÒ-κ��G�¢·Šê ö‰1°*yúüît³8…’´©Z¢å;z� ’pˆµ:š6ª-><ÀfíŒpàÎ\'ls €vÙÂÆöY^dæÜ7`pÝ­©EN/�8ÍJÏ¥Xœ™­úÚZÅ?>»+>Nv×Ü÷mïnwh1*çô·'Ç7ЩÔÄ2~ćMà)-¶ˆ-�¢¶>ƒĝָÏË¥Û—»ÜÞ³ºw›ðX°ÔÙD:]²Å‡ð; âaµÌýDËŒ‡4õu™Í8†{–k„Ô0gò̹2hvßz1\~ C œíqBãÑáØK±:<{­[6*Ì«ð¼ù¨…êýÄü ¸Ž#ñ¦¼c×6Iû8£Ù§0�< ¨÷Ú«2Õ¬“Láû-!æ«Wü“¡$ÒZ ŽWôHÑ)çÖŒ]¶6Iøáa@1¶ø f¶òçMÊO̤œ�¾Žx™ÛnØ(f–ÿø`Ø£žc&¸¶µyÅ:O�©%™AJyá§š4³��%­Èlg#]d@�ÕtˆiЩ:B3ÿÉç‡$á�„îh‚€H‡è ®é9à„­«Oäk�š¦�“#r¼ºÝç$û¨4Ûf¯J¢ÆQ©Y¸:öAgj¬Ý­øïâçP*æ}αPáí9wL>‡*ôªÿ ÙÇZäâÁ½ãËxekÔ¬*Ü"ùÍîC;“”`™{Ž��Õ¥‡±è ÔzaE{>å4_8dÖŽ4…¾2�25£í#š˜õqÅ… :M#¤-·òH¸[-ú΄�-Ï†Ž’LÀ··/M¢-2@P„íø‘:E=Çêq‹úÍÄü)‘ð 3�»#xA†a~* !‘Rd¤Ù¢m¤ã ¥/Šj‡C¦aaÃ2Ýðqx!¼xe Øvð€ â<`›xàªÕ7½ê ®¾õÿÕ�Zý¿FáQ»×ìÀ�±×¨vÆ÷ÞƒÕ«5µ^#üÞÆ³íÿl„«½zØk '�ј€ÓµVµ×lÔSal}ЩÂ}‹¡GÓ ›ð`' =6Ao³aÃÅÓÀ#|Ÿý¤k ¯‡#÷Ùè:\€×˜þeD‚�‘ÃF2&µÏ±ÂF†?+“Á#¼¬.ýÌÑe¬© 5«tºìgog-ëüS>ˆõaê]ô�µ–ãO—wñ¦à'R&ÄnáCsy?Ãzå?ËrpXÖï…Ç@×Nÿ¯†öÚÍÖ~WaÓŸÔ º¤“ï�~ß ÷ßéão{„–-\­�'ÕN¸^WSá½ÿ¨5:ìü(ÜèÆ‡á@g®Žˆc:u™FÆIE½Ã㮜Aœ4ëL1&FiöÓôË�ÛDQ×F{&¬YÜɈ'Ч›’ö¬oÔ8¶¦saáOÄî…˜°ðn°{].k>á !æ¬öm.™ŒhÜBíòwì²dW ô¾Úî�F…«áÿl€Kµfx“^ø/¤ó£ÿ4Ѽ)HnêŠ8º\XùA=Ì5ʤ.ëü¿× öÈÉÚ²GãêgžÝ·H< Lý¤P²ÛM¿'’Q¼5CÏÇ›[sí štQÓ�yí1p$læñ6ó˜í^8û{ÕÞèl7úKàjø 8ÄG«ûÅ”îÃc6¹ã´ ]d†žS\Ð…Z0Åu>rS\œÁÎ)¾Ï 3»L’8+$À¦ë]:‚ ù>Ëæ* [¡ŸYÇ‘4#0¥¾Wœ–êkÉCÒ˜ ùûÿ‰ædLNJüèÿѪ˜¢ûLö|Û"eCµäS—帄˜z@\�T½=B ßîMÈÊ‘Ï 08ÜiŒÐ)´³�û}DQä¢%†Ê Œ€Ç~k7› �{ˆ…Qx8arôÒ�£6K Pó†ð“Bl§é4 ¥—N Üš-.fì´*  ˆûW}õêA¬ˆJÑã , €|9!mSŽ�5+m•ò5A>Zx~n Ÿ,–Z°P—A-Oúã6ç•×®7Ìa€Û…ß½~—NŒûàïû˜Œî(«÷ÿbÞ¦Öè�A4Æ8,õÕ7ÇÇæ[BÙû)²JêHs7å|$½·,a'ô`Sª¦°ƒ+Öuêú £u6Ä;„Ìfp|=%Žp:ìHög¤ = ØLÁ6S×-É7T$°†8ë`Ñ qT�YÞÛãZ<1ðú5PXÐÅZà4ÈAö¥²ªêŒ—Óýœ³S·’ªJÕ°‚lÌ}E˜SÊT"UÉq*Kq\6A!)Ì•qåUÍÌ(×ȧ侨ê/ B€ÉÁþO³—Å9Ä^¿Ã9îÉft8à{M=k!+ÿîO€Ì½ð¨!TtDV VÛýž"¾Eà÷Öç€7½’«Å(Èd I5q„É“Fö«†f}=åN�©EhÇ  ¨+ÜU|ÃH‚…¦*ÒDΰ¼’gFèk`jÎÔî¯N~†‡Øn†ÿ(Bô,œÖppÈEˆDÿìj�]$_÷G¹Î)Ã6(ÀÅ™ºß3r !ß©;9¿gè‚ �q«?iBàŒÖlÇu p+a†ü&½Nû³Ax<Jä_íN€w˜Ð8\ÜlŒQzx’AwItSÚJ•X¦’”��TrK lEòBNHng¥Ø™>˜ôãsô9ú—ÈÛ‡Â!y�ïÉ%ÂHe°‘5¹ �v­Šàm„Ôèc=ŒQ GŒp˜2bÀÇW¹¶”�ñ€§rý®˜Š<òÄôYîë“´r>> ùò+IÌàL£+ àS±é´Mv¹ŠüÁÄ™¹¬mˆõ•a»Ù7]Ÿ ‰4 Î“€s¡0¦«žWý›rà¦e…ÿ—²ZoüG¸ñµV8�‚è°Þx&ãÿ›7=ª-<ahµÞþK0~Uàñ//Jö½†Ìa^eÌ‹‘WÛn4ñË s!.u�Ÿï˜é{ÌX˜!'3 ë „ô¬ÀymÞØÀ ]`)ü$Ã+ñ'<ûqíÿh‘§sMKÝ��´ëÁÍqÄÜ�^FíìÛs¼tP:ZœôGsÒLôó\ÙØËå·­ôÂûmæBÏmý­ö\Én®ú›—èéá;ÛæùúóG§ø¾µ¸øQÚ}è;{É“=[/¯îÎ…2±\ßYÒÞv*ô0z,u€ºÂ:…Ýû?À‡ŠÊ©p¡^¿Ê�vZøÙ\N©½^�å|q¸i= »þ,ßk\‚pÂùǬ‘rM›ç|ý}ž÷¥Ë0ïkX¤¤gkº�A“Ÿ†ð)#•0|˜õlV—€)اA4jsEù“”+£+@Z†Ú$Ø™Ÿ3TÓ p¨.€�ùÕL„¦Á¡T5Æió0Æ8ºÐŒ™ýYÖÉÄ&·f~’NF#5›âïEÎÖe/’˜Ïå²òFpo“w€#Ÿ�Æ€ì;ÈðÁ¨[e=T,Ó©+F9éqLndžñ««æ·g¸ë%‡¦Ý­��uÖïr§ó“Ýħ}›—ývû�ÌMa=Ž}Pîw�*z¸üZ^®…3áò_áQ¿Ó®‡O໌ƒÐÜȺí²Ý¬�Á]¼€íî€Y…6Ø?*ù…OÃùðjø1,­\‰ÿ¯`&+\ c�ðO¥Áí~§>£2ˆ‡ÿXd÷Šº �! |̺f؆±P]ÐÝcuÁ¢“Ý)Øz&·WÈaÅË5vü[,Ò_×tð8ÕÊ2Å\Ƥ¢éß�uÁÙ÷Zww ‹*‡¹œ®ÃÓs–“ËíærT׳œí\Ö-ä\7£;Xt {ÏÍÚÛTC³°’B•ËeŠÛ–£;6ÖÚrÙ=ÝÚ1tÛ‚6íœ<{înqÛÌíaŸ¶uª Êê¡ìûoF» ÷ n‚pötƒ›q×tuª"�m§˜Ûuö€7´fsY ÆgB_ ™¢efu‹j¡Y¸Òvövà–Ü\È4°Æg±Â O³ŠÛp—½½£ç°Æçµ]‰½ß)“väÝ‘N?õ~è¶íf îpÿB(eÿçú ù¥>H÷3wa^‚þÂ%�`ÈUð¿ÜMÐiæ ÄËf(�¶svÍ�BlYm 6Œ2]°•6ËæHšfK¥ñ4r¶%Ú#Í6P³O|�M6ô\ØÖMÐÙ_èæ ^o…AVñV=ç†mƒ4߀¾Ø†Ã5T]gO²)WŸÃ0cÛl÷�íš–»tÛýoØ ChŤßI³ 9TmÀìñC©!`hIǼF­ïÕùQº‰fPIù­ZW³Ù)µ …é°©D•üiù9^¿ê0E¸e¹p ×Oi:«÷*lã‘¢`Ì× °Ú½/Ó BüJY–s¿Ï�OMÝúE�,À’!."¥Ì,XjíÏuåU¼rPoÂXìSÙªp ôö÷«öO …Ø‚Îßá¨ñ´ˆ3Ý<¦›�QçdxýAÿý�òn ã¡ ,ÇÛÄÀ¯#SrŒ²dùɃL“uþËçðª`Fá-¥*XeŠ3ÖõSÃ\qX]Îú2CΔ‰€S|.#®¬éˆ¤¶áÏåáuëW¢'FÁ˸†¨ æ_˜dÃÙ¨ŽE~ĺ‹ùªqµYMÎu ¶Á¶ª#ì "VrW39²rÉEiª(Ì¢˜ÒˆþD‰�?tÕ(:_Ò5bߟ¶¡dû¹\»Š&paÊ6UJ°-�2¨¶Èù¹JµÉäuKÓTjTL™™¬å|Øe“kë6º} =r ¹Ä}SÂ>éU(\ëTG£v-ÜX|d*’‘…J1�ÏŸë¢LIPûÀÐO©}I^± ª¥ 9 àbk ¿dûb+ÂaÃ5äð|�<žÐt?Ãjx4hÔÚï0%ÝIóâ(]‡Ó4™ýóç:Âdʲ©îó€3ORD ;8™1£Tÿ~.�ˆŒ¤/¦’Ù"»Ëž(©O8ì¨Ö»í^{4öªú„Y¾¹7Wi2iO;ssX8±l/¸¹~°*LUµ½ÜôŠJÚ”À†—‘B*™™UL›àª¯(ÒIIÄæIÉ+…þ íÔ©�š[ 9âúíŠê™.L­ì¡´Œª¡TK«ÆŽx:mt ø¿ m+Ì¥!3Œð1î‡Q1¤±‚æÀë¿Uß°ÎYýÄ“Ýp¡fµöÉe‚AÐã¡.ÙL.€c³}�Z>dæÌ¼r¦ÙÈSí2Ù¢ÀBî&¤µ•õ‹Œ2mNLm5„eä SÉ=]ã ^<Ê’~¹ÊÿH2­>ÒÁ)+ ‡“±%ýÕ9 TŒÉH„-«¦Ÿ•tƒj<4s´ÖªzÕ¸5Иzø­¬¡š:Nq@¬ > Žãz+ÆÒC»Õ:] N±Ï«� K±™~�ÒPÌgVˆ™ü) /Û®b§$€0 ]e¶–Îgfr9�Ó}U…rg‘%¨Ñ�#Èé�Ï~ÑŽêèS TסDÅ1]—t—Áš©[Á70LÌ‚âÜã^Àðøï™1É‘ Ęë�*6õI 9æî—°ôj‹yb·bÎ2W%©8*>P…Üð‡i| ߦ •ã3–Cò)ì"¯‘|°¿Ìš+ECNb3pÉCJP'°|�Ba± Uç ËÍÊ#çr*èˆM)çS@ÉJ->ft…�SZ`Y·3%Ö•N:Sæ%8­Á²Xí²×?Þª?ñ©:ð’üV*|ÑïàÏP1¾ãឈ:ŠcúSx/E¦ÓÔÍô98‡B~ èOÉvSÅY9�ßñ‡…ã ×y<ÖyÂÔ#À2/ýþ>j€ëfºÂ]6?Êç¥*ó&ä\p°¥tKtˇÍr²”ÄúþRXzfemñ,!þ¾ºÁIøÁ~ 9Þ‚ÊaS§ù?rˆ^#0H~œ¿õ4ƒ(‚f Çp ow}'õ“}eïÜð™g½0Ÿ:K� Cø™_ŒÂ‡¦"j®@’–ÏM¡�_µÆ5^aYh¶˜:JH/̱aòœ¢©¸\áóy—ü7sxFÇP_¿R&ÝØg‘Y&Ó‰ïŸ1ÅËô›µÀïÊÚŽ¼Ë·Ý¦ëŠÌ›à8øÊÑd$¸ÝîQVF1Eï“a¡Q£�пý®dª½¿Ãƒ©ÌšœAž›Š/³…©’ÔÊ¥ÞàpD$IBüÔ”ÕQ¿W¦äÔBž¥Ô¹f   Ž%iÙ\Å\‚I±%«Þ¸]›@ ÎÉÇ>¥EȲéû üõ³zÙ |ÊñK)ý˜ñ%µà[ÀÀ ” «òÁI†œÇm4àL{ƒG…ÓÛ4¬@ýÃÿªzíÆøoôètn-øIY°PóßåüQ#˜ÿ’ÞÉ ¾„ ¥aÊâOI]i�áþŸ[øy……î´?ô}†Ì踔@�mJßž™ÑHàeÁšÙÉà˜ A+1…£ìsÉ[^Ÿø˜ŒÆü‰é‰„jŠ�͆¡TÑ{Ûƒ[è­9%Bk?æ€K¨¾˜Ó‰–úkòJ`^UÛ|…3¿õ@Î$ô³³³Ü©ÈÈ0nü¡!ív蟉ŽÄkAïú}ö#ô[é²ù¿|¦Ž™ùŽT»ÛmÔÛ Z–Àc¹úoTm±PFJâ¢�öùϦûÐUtIy“ÖüúÆ”p¡ ¾¡ ˜½PÀ+N“µ©†«V*)zð-=óË˦ß)•"jÄ¢šR¾Ãë,!‰°|F«éO}+ñå< & ñŽÓ{µ&Þ8ŸÖ'z%•@—rblI™;�y zgZ>un¤ªŠS¤”vÃu Ùû¿@þÐ3£Ô…ªuÐq×Ûxp|ž�¦;¡—f¥àñ Špà2ñ¬]™Éaï¾<%õ1+Æg(I9b>‚Ð 2¦âBT†Î´¿òi¯œ! u(o+ùFØÆk ¶a aÍH¤i©(Ò¯Õ&˜ ™¡¡?ºÚ)ƒì¯&�ù’“—ØCñ^T RW½™²ƒ"*1E Dâˆ`[hŽ9S夺‚Cj;3¼wx†÷ž*Füd‚C_ûù�“PÙi³Éx,LJàæ­Ó¯áû¦ü}7vE­:âé|wü½Í »¶­ð‘‹¼5m±x9E&IPS!�`íôTc‘ Ÿ‘ù|õE^†©w¾3 '‚½2õÐT s�Uûâç \IW)ßf¡Æ¼Úâã·Ó¢e´jø‹)Lér 5tU;T™®uXHZÆ­ÓdDè†%kÂt  ®R¶žüªì=SÈj¸Óï¡ê ˆ‹¨JÂ&•<¥ÃW£¬™Ò<3×+ ˜Ï ;õPÀ‘ÊgI�1gOçæSæóÙ©é·â–ºÄ꤈ôWež�êª}•á/lÌet¶sD0²Ô°ˆÛS&–WÖ°*ÝŸô0D¯ce¬Û7D­šq¾£f�G¢d=ÓU ²šâU n¨²¾Ü®p@SÖ·—¡i}ž‚73ëtfd2 ÑMEøý÷”Cr­†{ÅQC)MOÙì)/131È]X  bž\Ž­ÜúÖjt¨ízƒe)Ä¢ƒÉT‰¿#Ó ”á­þ}ÿ{:µàÏTðß„£Rµ†¯qÏûÿj0Ýì5Æõ½O\/¤�Øš®Ä “²,€)ÌJL0�e˜!�™ïû!}h*½x-ÎárÄià æø³yÕZŠï¥›ÔC>E]µ¤©U3�2çH_˜?|Qú6å,“°Ï{ã¯i…‘ótÓ§ŒæÀü“â%%þ0,Ì(:™â©7l*EÆYR¬€X?ÒYü¤*FˆW3¸À¨�‰• þϧ¼ð¼2 ã\˜©Ž|:…Ȉ×–tñ3 Ž2]q5ìBk6<Ò¡=ª€&vßÙ�‹ð/~¤©�Åð\èn.´6Òé¿0nö§X Û¶®ÛvØaçv®X¤s®›Éà÷EñŠ��0žrð‡]C\ø.Ý¡™©áø~áÝÅâ\ÀOÜè:ý�fŠô_XéÍôŸ@WÿÉŸßøïÿ}ã¿oü÷�ÿ¾ñŸß¸1ª÷k� DhÕfc.tt”¹¶å}°‰kqgÒ³bÇË•mµy¡i«ƒ»íáV`?v¹]ÖVŸK“éM~ÓÉÆ ÖØnûp=v²°añëD‹Ø˜Øÿ¾ÅÕë½±¶–9ñû˜Çf�»ÇÃ9e˜?ŽmÆxIL!áÖÖÑ^ÂÕn¢±ã1¾ôÎ{èï¯{˺¬mǨËB4à9ÉcÍïù?ê7 “u_¢íR÷>±Z©f¾Ðù§à0mòu;"i_Ãçu…~ø#êôÏFÜLüÍvoóÝÄÚng'v²z”ãýùݸ¦$‡ÜÅ’Æ7è–ëÎ~)v\ì§¿}×€& êæ ÃžçjW×0Ì�•ÈeìdçÌQïùæjysc]œ°g¯&Öb‰½øÐøf3¸'Dô «nÏàu<^²7’±}<Ík&´³XN›Ûæ·A�Ÿ]ПsÀMÑ‚™XrR‡þOèYð@bi>VOìÞŒ•z¦#(h?(¹´�6öÓ`dJ©ß3)ÊÈz E_3_²ÐŸ¸þ¥�_ºÜA›ÚªTöi¦Ð9?j.âÏ·düèj8ŽÿQ§�YcDgOйµ�XÕ·² Þ{æì>òŸ¦æŽí^¬Ü;_¢¡åì;ç»kqNQ)¯`I¢š¶t’g}0¡Í\ˆí'û›ã©M·ye�ئì&½Áóùh‘ÜÿóÂð±A=¥ÝÞvlo½bÑSã=èYð`ˆ‹à -{¥±ØœL{Ðeuï. AC]Å"DÙɉ¸Òobjs0›=�6a¸ØKkçgú¦æE¶ç o¼��ìè—~�L ‚cp" a8Íä¾À>|oøx²×Ö+ó‘¯Öww d¦¿×­~Ò óOc€M=Á±˜}PdÃX¯¤!܉:™ŸP]�ýŠ0êõ(íM1€ŸTŒÄ?cmæB¢ûïg¬û¼ç0†¸0»ó>ͦºß\!цâØTçió±8(|\ÃÆè‰;®÷e³šò�‘ œk"Fª ˜‹M‡)va˜GÀ³ÿN,ço°1NÓir~GL|òk}1q˜’œrwe–þgƒ FX �IQ û4ÉX�íÂ(@FÂï)ª? _�’ÿ@QÖØ74•R ø5Nñ§Ä1ÿ y�¯Ñh„ƒfAVlìŠ*§ãÑsdfPñ'Âþ2¨˜0¡�EÓ?Š* ƒ|‹PD0ÛoÒ™zßÞC-†™ÆÅA¢¥Å¿øMÌð›�×¢äK¾·ü¸é|Üã`üJúZOªù_Š¥LýÉ^G>`„u®òps¤X°Küä f¡)ľzw0 R‘# Íæ@‹,;7O嬗¯5�o6§‹¢Y wCß;ý<šëÈð!¹…m;PÍÁÏAÅ`nÌÆ¾�SÃ8µ¨±‘9�igÿL›ƒ�úÉŠàõvÜ[Ÿ]ùSì䋸H7†>2*bw4)š˜¥~2îk6ƒ%讆½?jÅ1K`*âÛt� Åó[Éî#í�ø· i¶™�¿‚iI,¨¡xìÕÓòÉzìiŽ€ß\[:˜çeÊ-ÒjbÕúmú&¾BðóKžvV¾AªSòXO@Þh.y_±êhDluþwŠÅ7$gwQ�i}aœ’Èà •ZJˆ±ÈkIK ƒñ»,ÄÚÚÕ§òÿÃÚ•¶¥í|í÷½®~ˆ�@ ¬J¥"´X·b±X­ •ŸYBBßÿ™sf&3 IÀþŸ71Êbf9Û}îs†¿- ._,@%-^¹ *ˆºW¸|d½v]¹�uƒÕ<;»ÚÀq#÷òg!ðG�É6¸sR±¦Çõ_öÝ­Ù4hÑ­€�í.b>×4ò"VZ©™dïQaã— å÷–Ìó϶¯×Ñi}Æ]ˆXZ·ÄBA‚y§¥ÊEx²›îAVií[¥è4T”c*l¡$Ì1ħ=KÃ2ëá*qðATi[†ºh¡KVë•`¨�%\à¨E£+—‘•Óúj¬r øÁ÷M“}­,]#ý¨u@”hw/ì²ùQÏnÈ�-B¤ÈlfwÈVM±­¶ñ¹CÜy€máÉðƒþÑ¿óÏö�EdÓ.,…¯)åêâó’XP;dw9bGâMò/ÈgLßvº°ô“q¦´eZ‰eK{à „H±ûCJSMmÉ�˜ï¨8‰~—4bn%_Cd01lòkÚ„–ÇNøIˆ¬ýåÓÃ'Z³W1·ÄÄÏ.‘96E…Ÿ ]»¤$×JâÛ£¾<6Î3A4'Ä�ÿŽ:ô{©ñèyâЛֆ;ï3ÇÄ5ßS‚æØ�†>¨‘¸˜ïŸSKµe.|¾Fês3Æiâ¸|LR_ãKâÊšýTl' Ò±u{â…;þ,€ŽÁ¨ÃñEÖ¥ sœVÆmÇàB>Swâ”EuŽ2iëþ ÉYìú´Q�ݿՔ]Ÿ–tlýq;Q¼RTZHÄrë@ö>&åZpD>"ÆÍéR3K€â%ýHI(•"‚N“²Gɰ¸>< Ϭ3¦Š&Ù6-÷�Ãùd YK5Ì×}hâRØÅ è®�žs±?%úì øÙ¦q =qx'>�lw]TÛÚ÷ 'Ã|„ ü,`fñ%LC:”êÅ�ð³ÅÏü²zãŒîŸ•È]AÖÕΓPQKEÀ.¦ÁÉi2N• É ¢ÙÜ¡ˆÀ®(¨eKBnB¢q¦ÏP/8îËÄ@Å$”ƒ}Z±ÖA5|àoøÿ˜>s>oRø=;hˆÛï�D Åèœ�¼UÂ!9‹€Ž#ï3ÊXó†�Ê8k}UÝ*‘¬€NÑ<°¯©lñ¢wõ¡Š8‘<™- ÿšY×%ïs.µKM 1æÁ}$—Xù§´}Z0R�…b],Õ͇i=R í5Ov1”*.ÝÍŸª‘JŸ; 2ä%$DÜ ¥ù²ô§t¼ŒÿCT‡ ÓˆôÀèKµ�N£ãéèò“ Ǚ̦NáL’°L… Š7VÓ~-ÂÓ~’‘‡ÄoFpÉrÕ±}FÞž¨IØfä¨Xw¹�ŸáÞãw›©"¢¬5D®ÐiêåÇ�…"{ûärgÈF&rphdë‘’ ¡ãÂh‰7"I�8_¬ê%ì®ÍÞ6®ê„¬�r¼¡Ã|C(~kh�8ÚûwáƒÓž\öθqIˆ¬@á& ÜÉU…¯ÇNÒð”š7¸z¹m°éDÅè"„Üq„µÊÜÅQÁ—Á†Û�dC´öv"2®2¸Z~´¤ ·ìGn*óÕÆn�N î…[>0 »Þ„ožöCA”ZA1äïÁ°’bòÁà á1è `fȾFX B¼ö|s›ÑÈ~/,‘ùÄf%v�F6]¸qúý;U#ž]Ki¼ºp{ã%¦äh¡ŸƒÑ˜GÁyShçOü}®ZhöweiP·–gù1sÊï\(¤»JÅyžƒ=±ŒÑ…©½ø¹ 8È=�LñÃ$lvƒs{ù¹±„ -ÜAÞ9̧y®Uk‰n¨˜[²i#ç à$lZq†ú²«=ø&žg€…‘0¿ó»¡;’ h ]iä@a¼@¼ÔÃx)˜«C?'žSr{�HZNøHAîA–CLm±I£w¼¶ò‡Áçõ=-`òva6 ³Õ8+ð€_¼3òiáRùZçîì6” ï¸^Hþ9]„í\¢íÊšãþq >A�RË^û<o?D¢œ£§ø7±‡}EÈ#ò@ì&2Ŭàæù⨻BHCâ"ŸØÒg7¸\ÄêÊcì8~Õ±Ju�€º÷Õ"S‰"H:W°“�: ñHÀ÷3'ÙÖð‚JŒ®�¡À‹tà‘%(ÂÿÐ_¢ÊMè%Ãõ¢Tˆ�=™»ä©?Ð]ÝüeRñ³-ù¯(¥e § “Ha³[+Î(ˆ:“�GûÿLKÁ�%Rå­áß]5 2]½·Pn,r\¼mµQSp¤¨Ó ›.~,®Ë §qceƒ#[¾é0LfØ“}ßÔñ¡Ci¼‚–ó|ÿ´’* ü£ÚÈTàÛwRØ€Äy6$bZ Ê %'KOû¹N¥ŸVòÏ‚C¢‹æ¾ <^ì,´8J¶Fä`À#â÷íøððe4d=U#Ÿß™y߃Aæþñã&CdèidçÚÖÖ€ <�ze¬v]¦uó%'þá ªßåR×¾ÿÎä¢Ub ½H”l†Q«¸:‰«©¨5œ5­ ?ýõ« ìeÉÃ×.?ü–£-Q¯Aâ)VB¾‘µñ+ÂZ~ìAËÝ$Ë „åÁ’¨��JBÂ0a¬®NÈ<*Ç6˜+ÔÙ˃JìÂ]RV‰4l:õ(É‘s�{æ>¨Æ�fèNÚ©†eØ�<ˆX& î™Ìu*®|¡—¿BϸàëÏE¾ãŠ]EÖÎd#³ÍN+çä› w�Ì™w78óa mX#àZ‚ÝØe,½7ÛÑx¨¿©ïArïm~ê˜�Ý èÁ�S�ž—låâ¦1¹~ÜÈ3È‡äŽ k}2v~¨½ßœÏ¢û§¦® ðWKoIŒ—¢ý39bØ×'~yÃPÏŒG˜më'É«ùe@>«¾QoƨVI>йž#°VØ,»� Ô—tu?ò}Ðè�VÅ“·ÿWÜŸO—Ç}[`Ž’‡ZICÞBÁ ðo¸&�âñãb‘õÍXŒC“f,Ž îo¿çº>ò²[yZaƒµø bÎÈgŽ'“ÂòøÉÚ‹Ÿ=6'%µ@TL¿qP9L‰â*T“·éMåØG�>á.ÓFã þ&L4]g6¿,,`C_Ó¶"5-¹$r¹|`'Åï#yÎp'íÚÊ•ñíÞèFeó8Ú‡F‡Û>ÈC¢Œ‰ömØ©È|;*ˆ ÊÈÅ‘Qr*]ϧ ü±*s䡈ª™ÍÊ'íôû�<Ó¯ƒÑJ¨ªí*¨˜nor\d3Eö”6dsnà;±ÑaägÄjQñ�ȼ )þ|â`v‡ðBô5ïã"AYÈ–ƒ1ÍÔ„2¹$S¸IØ0Q”—ÉóQiw‚—7{Þtà—E‰2N!|_ؾ=(‚ uXnYHösJªN 1oߎÙ�˜"5…AÔº?�Á\*4~¡ŽÛN¡"Í÷™¿¹H¼xÿøùAu�ßêç²¥“_·-Õ…{ ÿ£@꟡Lnø> ”Ç„¾€É¾Û¿)e¾F� êÏ2Ýõ²ÎÑžÑÜPbKFùÈŽ&8™dÛYY¶2†ö�]âáhò¿�lPÄ‚3õ»éxi(iŠBŒ°¿ ÖÉPîñeFØz¾t#' ›ë�:9®ÏÂGnPB¢är™a5ár~3l„ÖÅQÇ ´R œyu¢˜˜pá¥#áƒ[SD2ŽZÅaÛ}¦ø`©³, RiïWQÀ³Žö�Wdé�(6ú¹K©x �êgGê#í¯vYÎǧv&y¼Ä®# &²VÕÁ‘€ñ}BñØ E€^äPÄížõuE5[ˆ(‡öò¶âûw˜—‹lP° º I=¾æC¸78 Ä,²‚L‘ñ-]¢€,9ÛbRäöý²,¬f æ3�²öÕyŽ3z€žþø¡ÏÞÉÏlõ©m§¼ø¸9,?EŸÛ×Ï÷äŠÇâÙñ‘9Õš<�öÁIÆMvÖ&j\èdn<÷f×D_G�Hj‘Ã�8öðˆm{|¦ì¢PF¡# Ã,ÀàÉÿîÁœ.ã¦�Î}Æûni’ r½MÂKºÇ™ô›"÷uóÒ�†ºX<¨ä-§ úb´ŸE�ˆÑY£ŒMu –€´¿ÆÁ6"FmŸëfÕ�xZü•~ëæsV¸�ødˆ+_¥Ãž|Ç”:–l<¼h%åù“4¿—_Æ1 rx ’Ü*,ŒÃt—ÀÔŸx3ò¡¡µKM ôÆÙ(Y(neÎQ\ˆËŽúÏXõQvMê$ó*äü(Œ˜C�e„9Ë¢C)éèGÍ8üŒF!èÑÓãQ3HcÒ™Š:¯¶@Bô7Öí˜ßŒÄÏDašjP$ß6êPÏ0>ý"Œ%a:%¬õ ¤ôÇͯ £hTÏlbÎ~ýNo¦œÕ-ÄC�^íNÌÔèãÚ`6½G$ÿ:)é.?G*X�ìr$#çÆJ …[�1ÔS‘˜kT—·"Ñ(Sâ‚â„N˜@x2姈3mÌ!*)ÂdŠ^š–,X¾‰ñ%˜7§¦ÀræÛä¢~^L”iBf—¾*!gí£Ëî�´k2›âæ^S–Ž/N”¢“õËÔ6q¢¨»:Ÿ®“”¶³3½e›8El–M€¬E8B‹%1ºû2Ïb2]xíệ„•—Jü3Ö�Q~ð–ù�ÙIÈ?±ÝŸ<„pG ‡Á7¨ÆeÑn nÌMƒè™{݇aÉ^W7ëf#Ø,,‘¯°´¡@¾c›Ýò’ÌÈŒ‡€´LHYÛ{øën LÄ·OœZ-©…7¡föF'oŽ�0›L_owÙýÛ<£Æ{Ž˜]ˆ›·˜„…„¡4ˆa4žØùþ�€á—=¥’ ß®à`\»çHpð£i9;å�p&-cu¬æÌ£ó©ØÍÐF !ó‰])!´Ç�Î'Pe=N›R„é>äõ³×—R«9ø±¾?©ª¯>§K»´bG<†¸Âæjýt�õ[”�Fö±ñQ(¸Ý„IÌÑŽlSE åÉ‚áM7âý;j-9b¶[W|Š$}¬Q( \'¦n?Ç»™ ¾B¼ZbúLP”°vÕ™o�®–àËxt„øòOÊÙ’yD©°KSË÷Ÿåx󖵌d:9PÑOb@·Ã0áb9VÏ?V,—°Í­Ã\\çVt˜þæïù» .ˆµþÌÚͬÕL €ýþ‡°Í’°¦[ÈýÞÿ äí‰Ú†äL°fËÓÉËãòyö+œv×gä9ç¬Jž tdÀ ¬ìˆÜ´x‡;ל+rj;““7íÍì¨¹ƒè>ó¡#,¨ê†W¯‘ÉnÁƒÂF=ɳuÛNð’ufêJEÙŒ¬*’s”›Ö[Øl8 I¢Žlô½@&I@Èxµ9-Š7Ýü¨ÖVaT¿ðF‡ßžäæD!³'ʯù¯¥à }&<¬Ó `&�Ù ƒr™$à„Àìá]| *¦Ã¤•¥»¾�Ï“ûÈ.ýQÈÑSõ8Ч¡ü>)dÓÎZ¿tݼz¼P ž8ˆŒëigËÀù^Á¶•’�Œê])k6à'²£èå —Q)?ñOq’ ¥&ÊüÄIfëÉnñóýXñê ÃXn*¤ƒ×’_u¹Êì£ j¬iÞÈJW©S\d×Hî /y ø™â<¾7“¨›FJªÜ1¢»+Ið3&Yí6lÆÅ5"a;e›Ü1V>Èë˜6šÆÂêÍõ*uP¨µ7áQüfÀ×Í[¯|�’;È0Iì0v!€Ø‹‡í’›œÅ`AªàѼ¾JxQ¿«ÓÂÞÛZ0f7Œ§èQ7¾ó!èãÛ„’°T–Öþžó0Êí͆¹ÄÖEñí$�»"ZÐé!ƒ@. #Éon_�EGµŽ¯³ëJ|Öuã9'ÂB ï,µ’}L¥g}+5øþwOkŸf™óØiƒÃ@Â7°¤AšÝÊ‹1bVqØ6b5C+î½Õ$^§H¥™]bÑa„JjP{X“aþÙKîÕ³çÀCRþUÎqΆ©MQEj•À×™¯ÆKÅ;Ä3‘k#¯âŒØ¸Õ܉6}‚ñ-Eœ¤âv£ßódðc�´ê&"`vú¸Îœ‡ðêñ¼†Ž‹êB)Ô¢ÐCœ²º}K*T-?”Âê7eT�ýŠ‰èª¿À¼Ÿ´Ç��”¿åMó5W†Ëm"²Ó•h 9 2L€)2.‚²ë°ãÔxñ�œ’$óc&ÉŽ>Ìgzyå¬÷§G¿Nç΃UÜ##¸T¤ž>!4æ>D>>Í ƒ?H›ÇD�@ŽPc ŸÒ†�ÓØJÊéd*°‘Ý‘�Š� y²NæT�š¤ÜX,$Ñ<qâÂü Šøg”Ä7J”ÏŸ¿EöÔÛg»0Ž#‘ÀÃ3‹Ñykzx6/+a«‚Î×!n1õ`ñcv¬ˆÂî2 §Šp)`HÊcÐ!¦LŽ7)“/òVÌá'96“&ÉÔÖs*#ßµÅ>\(_cÎLfL+Ô¤—~T7ÅÒ'›ùd©òûÀ9ÃùÔZ½ –ÝÁh¹Ûg‚äû,dÜ ‚´ÀíÕ(¸±PÎOw‘k©6€5§Ö�¦0󪙰Ù^Èfû½PËÃØvIõÃëä%ag¶7®L+™Žºã gˆ6d~¤êh�?Q9L²NÕ@ÂLüAÅR3«)ôÊI<±.(îϧ’R½8ýKtÊ#åRÁB‚€ÂòñÄ&¯_ô‰-rw¹ ¦…Ø_ÐØNç©ªŠ¦I�ŸAö.xn„@®v]×7!È›@(&:�n ýòeðm’uþµº´Œ\É6[í‡Ù|b^L¬§¿'Îôî÷Ÿ¿¼‚m/¥û?Sj%Ñít,j’J”Ü�‹“ä ;Å³í¢¯A2�#@.Õ.yíMTYšp ó˜V–B÷4¸T®‡t5Q6é ëãW²î$n­^_ ˆí˜ÄÏwUúÉ="AƒGÌ 4@õœaL†IgñŠä=‰"<ßœ;.Ûš­IŠš×î9‡&,äÍ$åVp?ãíBDð{|6 îü eÜÇÍ|€X><åÂŒ^9°Ÿ›zAi &e(JÑj|ÍÂShð<¯ü‘éÓâ㛩z¿‚¡Íqïß…<>6�ÍÄí½SÇczK䆆>¾ççit Úòo—)þŠOFÿ¯7¸xrÄ}&|yºþÓÓ)'OD0½Fç>ë-ÐÛæžLú[tXÓÞ“OùÜÓÅÙ}¢±#<7\ð¹ñŸ[«éëSɬ¥ÀQ„N…Ž÷4{æ:™\m$åFnM$3 ˆàM‹aã·cxAÿ£:FØ–Ù¶´Û'zñ<3»ù•xY6v•c;“°• ¼ýi…z3KÑ“QÄÑ!'"aŠ‚¹îBÁ/^ö}kúHhv™ÃO¶µ£X Ók·hM€‡Rëe?ö×xYä‹SsV9Z�v"GV3m??"öÞÕ(ÔM%}r¬qv6xÛH Œœš@D̆)ïß!X_•&õª‚¦u‘Pwdæ Û5Òž‘ºŠ²ö±jð‚.AõáöÙgÕì‡ÿˆA)kÔÙ«+ù$5xW�öFJ­9©jnÚrMVh³[t©ñì‹e«9ZÕU‰æ øÙ��xiòDä& ã»+o ‰Ú²Á,£7+GútD%΀‘½Âø¡‡_NO/c¯Up–ñÂæç)¼ê�+¥Ø~Ä‘÷4õí¼}~Âf‡bÛÿ0?¥_Ç$ò9#cȲI‚€§áè*?a¾ÆPQaÎ^ÉgÄ×èÚD*[œÔnˆ–‚)‚9kzÅ!�I‚Šjúo#&‰ø•9~Ö`â$tDéƒ;a—år‡¸DÏÔ°¢Ë~ÚL«$ëä�lðÞœ‘©!âöéÓ3™� l’²Ib,{ [,ɦ}¶iÄ1idз½dÿ1êd2 #«Û·™`?Ú�hI‹ÀM®§7ÛªÅ7:ÜÐÓ$.±r´8Æ#0‘€eNÖm>G."Ô“EUé¸J5‘íf°¤Àqgÿ²·ÀtUŸï_ØLyÒ¼qæ=¤5ÐK30]Àâò�qy[™­=>g[KóŠ,?õú7º­«¿ê{ïáØŸ=8y*¯(z­Î8†š‚q@U9QM2�kRêΛzŽ ÷'»:x7ObŠ üú.è%/1WŸHà¯~s%˜ºç|Fž$çB ¬brïðâÐK³šå.¤Éâ>Ötî@ræe÷`åž~ÿp­ `w5 ©w? Ëu~:¶+“žpŸTHµŸ ë­2eí*?gB‡ýªÉ€Š2JSOÈ•aývðè•m|Z k˜¬¥IB�àžÅÄD¡ÙbA»œõ2§ÅäÛ`§~’|÷4tV¿G.sù;¥ÎGðo¡‡Ia¶ mÛôÖZuD…9C§Ik-™�MüI²(F’¶ö’˜Çd=’£îõÆá)-í-+—Âj‘^Ò¤8º±×†Â½2» {„Å|å§Ý8”gB6Ždê¶4º ¡ûDžÞÕj|Í�™È‚L~¼(õó °ÎÖ@�zNÐØŠá¯-“,UcJ.C…+Ù „d£5¹L‘ŒêÖMâ`)7Љ;µv|™Ä9òŸ)vÏûwaB&o"b»œ_k» h0pÍ =°%À`v<ª/t•håkjÈ$a*QÇI‚Ë.–Ò!ÆŸXt;q’äV§½žÛ ™þÒ�_l�ü­‹ #Tõ�Ó¾ƒYðh‰Õ×ÚqèÑ×1I€z¢Ö{ÿ³Á‘½ƒKýü0 ñ&Òm0åOþt“Ä›8i …Ä=S²0MªíáZT ° ap@=n¦`0†(v|ü7´ãü�õ'r)ÃëÆ_ŒæÉ¯Ý%Ihp?ÍàLñÒîûD`ŠüÄ,TŽøk ÷zp~pbH(��Y¼D+EC±SK:Ð~é­=+‚ÈW 6ÌÔÛ:S±åçq R�%›äñ�ÕÉd´'îÑŒ¡>À©ëŒžŒõú5íYM¶šß‹pQBàFïˆ ¬½—ûúc‰’jø*,gך,Ñíaƒ{€xŽõt ™‹Áaj{{/‹¯Îýd©ÞÙ϶¾×r&nîûÓ²;ÔUø§wÿ<#ÖC|;À¶i›ˆ‚Z¶ uÂGØE%@‘�>Lb�AàäÕðõ$ùFȇÉ2+ó¼u¶°çè†Ì'Çé!Ž/öãùß�vÑ%þ×�ó‰y^0§Ã²r×WŒ7+€ñ”LÅÌ\ãá*^ ª(­ü¶¦:3NÖ ˜�àø#]/¯½…?ÃÿùÄÁ±âऱÒ%½j.Ñ+uÜT3…þ—S?¯&Ñÿ²Œƒ2`Žƒ‘nÍ*§Ë!¾Ž �®ý´WÂq¦î \‰„÷ŠÀ¢–|p¡}ÜÙTÇçâ3ª,(5xKgŽj‰æ„‡\Eµ^¹{ହm#zº“išD[s®–ÐÔÙ*5„µA{Ž9-ákäá›Up>Žr�CÔƒ¤khN%Hײ©[\®¦Zd%íõ*§FìgðìÔ”}ZZ,û|OÆåyÑ)5GõÓ1¾êtÊšâtö�æçì“«;ºZïµÝy»wüŠ ‘Ù|™!XKV»dá7JKzúQG´8ÏÚ×IÅŸy Ðñˆ“k}cq3·z\\Ö §neaµÜ©N DdÍEÀk…³žà>$nœ“ù\J¸€?d“ÝscƒÚ9X9î Õ_ÉÝþÁÓŠ|íd;‘ì$ÅË�ýA–Y™<æh-&­©ˆÜNX,epa'!„y8F÷:þ¼eº„·-¦ é|×)2ÌÌT{⛩ØÀ‰,´:�M:# |8zBD ‰ ö„áp ‹µÁÀ¥¡�p´¡ÃèÅ\Rà^‡ò’yg6^pdso›‘¹€7¶sORð¶!ÛÛ• ÈêSVöèúmHü"7´¦Uç,d+õ‡ìNï è]mí,i˜v¸H?2ƒ¡Âi‚l�0ތśš[CL�ʽ€OžVÝ`ã*Œ†{Aû¦xî‡@'o;ø'Xé¥LbKxDe%�\¥¢€4Ö!{1ÖM‘ì”ó¢î0IÕá ™IÀ쇽«5Ú3^uŒð‰›ñí?ÀÜLAlõàå›É�°|BàgØ@ø×!Ü,M‹à1gÁCÙÔD¾ÑGøŸ8—Ûn-2ÖôëóáQ Nd^nÇß“SÛÍÓüvó;::�ê¦,´cw¸LàòªüZ€‹FêÁâ&©Ü·Æ]z‡¯²˜Ç7g6g½’Áæ,?V¡(ŒmŠdòkAgº ›�.{“Qa—Nqì×ý2ð»÷X§ÀííQ7åPî!lP¦7âaÝ�ãb’¨¬®Ù›¯©QDóˆP[[ Ä߈yœ,ÍŸ6qÚ©µ9ržgXaF$©ë.r�«W4‰P‰ÅNèèÿg Òõ@�Väµ¼ab‰G)£ñ¬¯<ŸVË·7À†nÛº DÈfA­.±‰Ðú•ÍZÅNpDÅ’j1.–G'SH´Ý™4W/gV biXkÞØd=”W¢ÔÊ3¡Ãר$agà’ôÜݧA„vvøöIJa¦è {˜í^söXðoØg´­ZÿJU'gu¢ÔÜ$ƒÛDrÔý¡�`�¨lNü9‚Ë\ùÕ½[(ă|À£Fk›jƒÖŒ»«ÄepœÆ¾—샮<›ÓÈ „M—Ê[#r»KÉœÅõ,-@Ò¤õ–b@KñŒLE/¤ùó3—¹kpŠ,Ÿ£Pøœ‡Ö+:ñ ›Ý© I/2Á½Ù#ê­]Ù³2'H"²%÷À?!ä‚§…Ș�]ͺ×~ü*¡$Z*šÛ]€,¹ü }m­Ãÿvb‰mïš4i†Æ¼^&Î%b·ð>jêæJâË’w®¿?ƒÓv´4«€`øÐ ‹¾‚½müŒ¾÷ïd¶8J3mš©à=Ÿëõ» ò6á?]$ôYèÔhêüa‚öwåWj816µÉ4¹@„„é3f“a&œkƒ{È1v´ä·’µ"u[Áƾ| i~Šœ¬2‡ê“8ÖáfG†j.û 7ª ôcœøãõ&b¢‚…¶ Ì ÖQÚ°‰SÔ ^ÎMgIQϨ!êS¸“úÆ J’8ß�=Ëø\wÍGÃ^MÃkSr*�ø8 Ft�¯¡JåÀ@ÂòRÈûÛý³Ÿ$íÓ¾!ùÃÌå$Ϧ&0I{¥%Ù…º.G£žå—¦ˆ\�Ês ­›Òbø»§&_®À»™-ÐÙñba3Åê«È<åȜǷHŒô·lìœí¢›xT·µh—‰»«vƒAP³Àv^—Ÿ»a*Ú_Ì~⩉h§ˆO ?–êý¹…™¸‡„ã.žÊ¸ÅÌqÊ\ ™Ï‹ê¢æd}ÝÉì’‰+ü¿Ì™ ïx·œØQ)>Ò$‰[Á‚!B÷£†³iàë6Þ‘÷Õ=ÛA˜?¦¯šcÔgÖŠ|Åsš}ÐЊd~î±.›ârçrã8Ê¥öQ#vñ¡K˜e‹ÛyŠ‹b“ÒÒFÍ®rhõß&‰<ÈÐp”r5eëG�54…!žœðépk̯ÏMƒN²IÖ”GÀ;²±sf^ÐÅ+ÄÖs X"þÀø«i‚Dzr(uãœ`qYðªŠ�d6àMZ>¾›AT¦"ÖG ôb�a,+²�Ö!úm¿ØS�%ÿ›™%oº[ø"4gÍ7V{B^ÅÖ™·@ë뀠_º(à0LVÊ‚Ø�h7ðŽÓJ À­µ@@Cý6b;2bS‰þ¢ú,éƒD±¸îŒÌT¥ Sƒf@©‡¨%ô0uî¡î€/R-½ViÎ�šXd&>Mܧ ›“’;cd†S¸TW'Ù_]Üg0!Nòe´Nð ‘*þ<ý g”çk)vǬSÊvÆç‹è�Ý·f„#ŒlêöÁ(J3òlVS€Cj¸púb>ŸÈ+ÕO@Û˜aàÀ±Ýé.�6XïÀa½…::ÒgLˆ#ô\…ã`v­.¥é"C·œYƒ–k„ŽË�‘¼œ>¦7GØp©OÇz·-²rC †™Vª+}Áß|‚ pf~˜ Ñ·4Û]F÷%GÄ ¶ÁlˆŒzóãK…=y`Iq 0µ^YgÙ1ê{mćéÛ–|Àº9 úôÞAf0tðœ_M°�éäHËÚà_d~æÛ›-ìÈÞËÁöÍJðM�.t5±÷¤Ôºk—y ‘ÆH]*ÜÈdÀ0L»2E—Ê?ÖWn¤>‚¥€Ôqž>h»ê„3@dˆ`1Ì•í™9ì-Þ¿[×ÏuEqsšIûô¸”BÚ,Bgxè–:‹IÙ‹ZDJù0#U8ìoðµ&‘çüÓ¯™œ,=èÐ¥ñ â,¼Âs6Ø,—‡6i$¶kÔKÔ‰<— ä¨�ýêŽ'òZÓtMm‰Q]‹}:Ì9q”6ÀŸF œ]ðÙZ<+�¹÷ A.DG(‘t_\ð ø?Ïãͨóë¿K1tj„Åà6®æéÊÿ ñððñ7gmrš˜àwKÅí+ÏmFÈ8C�æQ~oÅ|è&Ñ9£.°+_²ˆ¨ó‹?–'ª~AG´xfú¾ß®}ãŸ'àhÖç9ÙÈ�ƒk±þAß´Éó š™W q8Ê™¥vN;³T@õŒ¯Ä¹Lü\ÿ-Çùtø˜qç ªq¡f%€ü�jR4onþm ?KR:¹ìQGª¸�®Î‡Žé3Kýläø)”¼ßðÜ%.á…9»Î÷:P¿8æìÆ)/Î-G­ÑS¨Ý¬>Ûs&=¬yÃ6ÒrS‡ Øó‚†ø¾TRÛŠ¦Å6Ö§»”Ö¾ë&ùøÛ6pÖ8j៉uo®ìÔ׬./³¼ÖEXë È=d-!ÏWÍANÓå Z�‹HÚ3ìö lôž(ú<÷ù›Dß�*{T¿]{’´×K­âªËžRN.µ^9µªå%†ifëi¼û²BAª:‡a3ÍYs ñ�Èps•ÓÚWû)mÒ?HÌCdSk÷k5nÌÔ¿Ju¦,`53lþðÕ, ¿2جÃkÑ�9û‡�óÔˆw›ïCyehK¥u€ë ˜cÈSl’¹T¸hð‡êJ³6À/›P/ÿpa\Œ+ZJ‘Guk¤X2ȆqÚºãî;ˤrb ‚ND™Ê¸?ÙƒBk¾ô´/Y>Œ€VFñ–%ºëïÌÑœ*‘áo,§°�~GûmwW\”qSO¡cš�PeÆŽ3üoxÁÌѵ‚¦®S"ã®>ð]` �MC/O¾qò“g°“užm%@�Ôx´ÔÝÿŠÓÃÞ¼ eì—·]ð$¹4ÑóTã~¶Æñ<§¥çRé>—Šx]$Räy4HüFÄ~´§Ð©3i¥‰W"AN½ ú¥–Clƛ ^/Þìe¼ì…4{ŒŠó÷–Š¿ ^ü#œJ~»ÿ Gt6²Jõ¡?¡11UˆcLÊiÐØ§œ’a"¡ ®ìw×òS‰7˜Ør:ì¸:''òiáDQ*µ.ù`¢8øh«ž‚˜5®Y£ÛÞ‰Ó¡)¼7á³±Ø iÎo o“O°Öçÿƒ†sC°{W€cRš�O´²fé¼7’ßsø‡e£§ÁÌwY!ÀT|õ¥ž¢ƒ qWOÒ8böðœ 8�ú\È2IU+ѾÀ¶tÉ®©îs•טñ; HíÖ­€ãrdpF6¸ÏƽʨïßùDp¨/fUwê“;/Sû{áÇ�«‰¹(\\[?½s‘þ¶¡Ï_"®ûcƒ%>!:ÔóôûqÀ«Cáx[ƒWÄŒL N½$EÒÇm£™ P`ωYKòzÙ,x>ˆ�®ö ð}ÆÚø¥œÂAÁQ"[ã‚J… B]�¬‘kÉ2| ضÁÚP;z•@‹æ|*rÂH² :@€@à™-Æçeì*NI»”Dø£,ðr+°gt¾Uõ÷ñ‚ÆúdÎ=Ç:\úøa£¹o­h^Ÿ&÷ËŸ˜‡Æeà¿sÏ‘üÐýŠ—BpæÙ9 d)²Á¥¨¶—àG”"ή}Ô³´­%ÔOÀ*¥¼5‘_?8?CÒÊlîÁi)–ïm€åq»+Ó�ÑE‚Fat)¬çÓaÝ[¿ŸªÖóÑsÂQÚ-²5poÆ/ÙÈU—HŸ“–�ƒÞdùÖ¦ÊÐÃ}y\nB‘ü=ð^Œ1ˆAŽ=-÷ý)— Yú�ož Ÿö qlu…Ã$35«�†ºT=˜�…ÿ3¨PÓÔ§ünêï^‹Ì'yÔxÂæ„»9Mˆ™ uÌj¢RCG W�-Àô~?9F³/@šõFŃ¿žÿ%õi”u½×¼Ï�·„Õ¢Zæñè쥓'Öéw6>k¸K†liÕ·¥i áGCq?¿%í!Èýµaí&À)µ!äX®à”‡:y©ñ¬ÈÊì4ýB ´ÉT|1’ázèý;ëiÕ^-ò'ŠÅ•Q;½Ôn+i\mP +ºàD«æÁNk,BAm‡1ò™ä£Y�¶s²ÞO{¨Ñä�� ŠéÌ££"D_ýnÍ�üü+ê.4¸pÌ™Ð]üWؾÄ${wDÓ¸U‹oôTTŸ/¸˜°=î8O)÷Š÷âR­»Ô‘¬;Cø$è9rñƳ¬üíA|*x ïúÊîìRmÙ–4jô—£™·.t÷ïRëé \(aAqñpsƒ jÌA/´ š×‡ÄŽuqJܰOÅ?ßÒ3‹á,Ùè«sþ OöÏ!MIâ·ÚƒWpݨ>k/§ÿË€·�YÊB¶ÌªðËÅàðãü Í:,Ð<ˆ²�r#ªÏ�Oê_mò78 0O7:%;^ê)êa2Ycu_�TrU…b%DC¯ö\D3X Ž¨â}ÁöKv"L²rýþ­šy·?ðˆ‰ •×x©^?!®�}tU©5m8Äê@�&TÓn\YÆaHG§ùKâÐ͆Aß oÁü&¼ -µQÕpðÜ\ï!Ü–†K‚�LËöù�ÈK•°c¿>>Úoïg�zÊ¡àYO_KÖ²Û­§ÖïŸOËu×VœN=¯�TJÙ§š�À@‹Á7+"¯U�åèaƒoT½ã;±Þ— §üÅ–ãÛ.LîñÿQ«ro–žL }V8ž­{§©£ÃÆä~2Ž�ÃÊ AÞ <èq.÷uF”Ž�È£“¹�šƒ†,=ó;êçÝAÓ$˜®3k�Ù>~–MÂ/Ã9ɧ i· ®ñMÞLe\âÎ+Z§gj>=.pâpžìþ±¦B—1â°r…1^ ¦!:dŽ.ò7ní�w–.‰ã£ßexUQ�¨Q"å9±cbŸ¯þ2™›Û 5¨G÷Ä)ªõ¢Ä H9 ””8»µ _V lT“Þ”l)ÀŽÓ©h蟠A™—‡ bZG9ô vÓ…Æ<'kí ÏÉ2/ÿ×Á³Â Š 3oŤ=0¥²¾W$šìx¼ ì¸ò_¾Åè>ÃÒ¼%Ø© –ÄSÑNŒgã›8tôGŠ9I/yüt½œvEÕ 6©:�Â97mœXÌõ ð‚àœʯñ{ŒÕ󌶥NÉcGC—ÜÝ@h�žÜ{t#ÄÌÀ×pœÏ.\þÂe —•OÝîg0.IT‹_–^pbyÁÉijÓ4íA_g†{þ0Êhmû¬H÷Èá̼¼œYç«…ê.÷çÀ 0Xl,zr”É qÝ¥–fžÆ¢0àt$Nrå°cà œ5¢&«öá�'œq‰dPv?Œ¥ÚÍ£Ë$d/Â5!æ‘yUs,,š„ÓW§Ï¯by>�L`ï<Ü“ê.�C:gÆïöÓBËc¥’D/æÌ>ýú ­“”" ›3„†P·7!e@qXK³$‹ùPñËF.—H”ÍivW »¢âÂ[À¶Ó`Ÿ­£öÙB wÄ>s�qA\�ÜùÆz*râl½ìVȱ‚af2ëÐû»åþÏÇ=GÚ5wÒ¿Ú¤sBñ²_@ñWÆqûr9ÅMv'Ü‚V^¹ D_(Q܃é5|ýq Kš¥ÁIç¼D\îo ô+g^ØhQ7sršÀ©^S»})ûÆö,#ÅÐkç÷˜ŽÀ(s§3˜%(óÓ`�DÖ…’,Ì|[Ux‡Ã|Zš£úÔxœÀ…xeÎYbýt¿Ò§|¦Ätˆ»!ôr1¹B\ªåz`­ÃÏç«Ùmáx*Ôñ&Æ–6¹J»ÒÔðî jØì°âvš€ÞJÅ—ÕûN¥#û§ M™_¼M8†²Ò7â¨:% ª;ZQîpö‰*Ì]êHP=%t—gùj&1zµž'µÖSŠ›:�lÒÏ+TÐ1þÅänùèôéHvp¿|¨/×Íp0�%\„wYm}XÁÙN¯PAPÇb0 �XuèÓCèà&8³ùiæ†?¨ØMÙ¹dc‰¦J]�•HTSµ%[0BÙ[°àì*Ã8Ñ­Ü.ÌEHÆ 4„}n5.Pä¸ ½»�g¢Çp™ÀÅ‚Ë-vâÐ9èQå8÷”'‹£ç¯E'WÅ<Ù OeÀg©i€ç-š[>²ï\t™rdÄ“�ø‹Öq&Û2‰l¬ˆïrñj?ž¶œùþ21Ä»Ùü~1À¨…„;EóÓØµ¯';Ù�W­%¾iÙÈwˆú'þ‡§Šyá!ú {òd©YejkîŸv“©­>•Ã¥,›ùZx~/å§Îöi_Á‚;|î ™öŠ’jf~Á ªŸmêRýÝÐÃ&IϯbKq4®L•£´b2Ïñ´l³_O¡ «B÷XN” p«§ý Õ Š~�¤{Úü�>Ù2np¸›ë MžŽÅ›„q)è±|c�‰6ž^£z4D])Ó))æÐG¾bFÍúá¤8Þ”42ûj †Ÿ‚ëÆh¡üÌìV>H+¡‘xb¿²èHï¿Ð;¡ É«D9œ—Uûô–L¨ˆdÎ)޵ÒÎøpÄîpÔ8V»u|�û:tÞª¾X)ÉaBÀ#XL8ÒèCáÅQ:í�¬îL€2S›ŠïzG\dꑌ½´ÝÒlØàÆZ¥-@8ÐêuÀ|rûaä8O™.À¼ý1ûB~-)°�DÖF‹T>óŸ�\úÄ=€ûdªY{^y‰6‹+™�îAL.|jEôùÉŒŽ‡E»Y¶™ÚOCÜ”Í ±ñD¹Íϯ©N_qo:£T‘ ‰¸}çí×ÔyÛš� z¹ îT¸[KYDO5œÀϸöñW�Þ§ 2Tew04(Üpç’³_¿5v>zâ°£š©¯•$>tÚ�»,>~ȸø7ÿ¨ẗ½®ƒãjß.¡0¢BD‘ñ€0Òþ¢R·eBŸWnÛîqae QÊ} ûË,Kkøûèݸü®Ž=À{Á£/‘¸¦ó·à¯èf`VŠú4̈†â —šYÎðE»( Lçúì;¡È×éZ;™ç¾yëÊaåhŽ¥·½Õ¢ë†âDWÎðÍ¿rt5Uoå–ÀU6=› ð+µNÔ�… Xt©„ÏLPlµ¦(A 2}…ß]Ž..‹R¼!…Ú¨xqŠÓ%8¢Ð„Ö’õ»ÕZ»4ºN°*n_@qª¯˜� Œ•ZåÑeèÐb1±\k´X�;“+b#æåáÛÀ RîÏvó¢ð{œÜêæ´”ãɼ‰Ø…üßÿ4µ×™æ‰¤Í¯4Çz~5ts¯ZYáÝ|êæ]»?<7…ƒÛ¾`§ å4¾`î�TWÖùïs2g3³ðñuÙèéê²W>I›ãcI­`JŽòkípï¾³ ÖùÄo“ Û�R²¸WÃÏEBñõ3ءީDÿ ²°àlk™w4ïàéh OHP>Rp·¢Ö)Ãõ]å7*sXMøJ -=b«ßl¥µ×O'¡ †8²«$‚9/%™_=“©?~°z`»0n’YJ"ê� p·�ÜN£ù�Á8)šO4ÓSztî�‹ïJʼºk¬énˆÓËz&lÌgzÉe9a²?Ž&È÷YyB¨‘é0i�‹¹C¡0›¥@¹Á,zp“ N õˆÓÞVKÛý3<Èl·ÎSRÿÅmóu¨]´1=Qûd�÷²Béß«ì×c-£TW@ËŸ%ñXLS�KÔíÂ?'çMúÖ^0`bl!¤ësÎ÷ÖIÞU÷'E™ˆd¥7‚›]›v!ÞÑjC.DIÏæ¤|2óŸJ­ÓŠËTéýº—jîÿÉÒd©Ïíó_�@þñ!µN8I&™¤2ñ¦îZ�Í?±¸íïA·68BJ…X:W“HÃæ¡ô°¨-ô[©Së¾7£ÛóNÁMÔ°SlWØÏP¾NÜŒØ-Zƒn¢:Ô­¶÷H<ô˜qÜâ]f©5ºj_Ê8�.£òR8\‹Á·éÜu®ÆÌ:¡ºá'SU—´¥Y”ºá�Çò‹I1`zÙÕöÞ¢}éÆáqß:IO§=/:lãáRÐ^ŸN¼�²”’ò4=í—©1‡µPþóaå¹5*à¯IÑ|H¸¡'XûriZ¬`yÕ‹;àÔ@FèÔŒœ:gñSÕ[{S15ÞĬ€£`‰‰¡âÄà”çŒå©1+†×©VR7^�˜²®�œ½¨Q‹­AÇ Fú?-jÔ¸äá¹'!†GÁ:”Ä…^ý»â•i’§Ì:dèI¯ë¬7tLˆOŽ]Næüñhˆxî¤Ï?—ž;O‡Y„û¢ùRàm§=�Ÿ{î=÷Ì¢9r“ø5äâyÿñié“ôòuýC÷:—RÔ#“hý¾L‘ÏÓÐ}öB¡,çìÆë³Ï"DmW¦¬ÅAçNaÍÒÊ ão)®q­â=Ù¹Ý>„ Þû4Þ*݆Ÿñ’ãAœ­EIˆùWÊŠp¤ ’§jy äÞëSÉ]A¤�œºa$X‹§®r:§�º+[qA¬},z‹¢z�.€gR©\Ô3ÿ½Øòìÿ=!ƒ»D\°Äbž^%G#¤úAã¯c8ªbhÒB³8$d8Ð"hÕ9”?ä!Ô.aËÿ^>ãá®al.0`¡Ïè%á 3džNGx¥ÓÖ• èö`,hFoËY¥zq;ö ³F6?eàÂX=,5 D/ˆ{‘®Ô𗵂±,N£îvd+fž"ëI_+ë�º”jÖþÉâ¾ì“Qÿüd?–zœ%[z ¤f ´Ÿ#no›C.ùö§HÐ…'q´¾˜¬œDq’ÐêÅgÙ¯èA�ݼëŠÌ¼mºPžÝDaxÛõè ‚!­Lî2³…2¶�Oßœy)UtVjqo1œ 5g•Ë�ħ |VUºÂÎÙ0K÷1$çhª‘ ÎlĨ]y<~Š�z™,7Ó˜¡^à•ïß!0I<¢Û‰o‰Ts`¬!'®…@œy ‰/x¼ŠM>øóÔœh‹ì=ÍLÓËQºç}”ˆX®JÐäf…¢ ÎÞ§«‘‡.¹X#„©LÒ,»M8òÝPàÌNèѹ™ó|YcÄï�Ù%Ÿr‰x¯¬KÛ‰AyæüV?lKòÂ�+ÀA'žã«Zµ—ÇÉÅKÚNÑ»Â×¾feÏ4ݺø/Ÿž_OK+û?å&7ÿp­“p°T];«Ï‡Ä}üâ‘^�þ)œ”ƒ~uÅçéé¸È’’q5m>®sÈùÕ_ã Œêý»À±ag"›…HE[[öœyÇBžlÇÁ™{­K55x}=Y®¿Ž‡|>(PøJ• ª ªs,ªÔ¾®¿79·ø�ppçp|N;tpbhïß½qp·†j¾æîUF`Tl˜Ößd%#Æ5[”]"£[�ŒëÏg.]8®g(07.X\ºŽÏ;dÓbÜ¿üüðã "n—¯°O¨Q; „ÙÈ×wCˆYHƒŸ‰qŽì1œVvO–jüL¯~ú ¸ú–Úm%¯Tg´ÒºÔ”„U#ÃL þ³Ó7 ÞMÊón¦Ìsž<Ó›Æ#U`âêc0(cOÝ®±©”Ô¥?05ÿP8OÝÐÝ›š?RÁ2¯™q$FEõÖ™‚Ý2ÓlÄá@.UŠ ÃÁœ•Šî`6°HBÿÞŠ½ý?9ˆË’DH¡Í�¢‚hàiT´Ïvúíá²²YGÿœ]i[âJý~Ÿg~D „EFGGG¯\QG¯^Ù Ëÿûœî,0èàû%60ÕݵtÕ©ª÷°T¡&вµOïÛU´E[qª(>Y f(ñ±�“‰Y—˜º«‹¨Dqªn*œºMSI §È²?��ÜÕ;L‚€‡gkt½ êµ€Fc_T cj®}mp¥ºF(çÇ&%eVÎ÷þìÿ™$¶_>ŽSÄûø$]/ùªâ€u ¡oa¦ºÊ^¬<ë2t%F™0H ûm@5üZ+ èùÏÈãN ]uV¯-x¾ÎâéâFpIàÅ%ŽK —$dÏŒ"ÈÍ`ìú7åq±<ÙÄ܃lÒ—HCÿÄÙsä=å-Û 7´€jT×ye ´wí*Vå€fQ*!Ç� ÖJ|úëƒ5—¼"kÅöûîz÷Ýé21SN–Û¼]Ç%‡Kïè`¬‘âƒr+ b%½3:ö”[73ê3õ÷T/æõ§I¬ÛX+ÛjC±䵿ǯay¶Î™/Ì•CMèöz„ÆŒ´ hÀpïORTÿî~ãEÌÙðʸühÙYäh0wZ�^'�ƒÄ�ô/wñ"¦vÞ¤åZ-a\�2€ ·ORõLÒ|HÐdŸšQâ¯N­+–ûÜQ©Æ‘Ô(¾NT}Ú°¢iw“VR*ìñötáBieâV¦‹“%Lªß¦+߇“mîó¡¿»ö8‹¸‚>A�¿š¤áñÄU¨VÒ°¤®U(ªr÷^—ë ÐÓ¨‹¼ð¤‹jÃ^z”c8N„ýB¤`¥´ØL+¡#àÍuL‹Ã«Ç¶N¢VMpÄSŸ;ºKOýƒ˜«ÞY‰‰²3 :>�t8°"í~§5pcæyŠ!R:2ìúCuFø“}Z­õ–ÚÍÞ|îO­<¹“Øß3% ËâF>hõ¼$O«¼Ð™âÜÜÍ)vÄ�á´JéC†Ÿç¿Z+�?iþ°l:`$ˆÛŽk?åNçé¸EO‰˜³eBìú�>FÐ(µBHïWzÞ'ŒŽ�§~’á<™—)>�Ðþ|2¾+ß(ŸO§óÏ•‚ i’3’½q4z¹Ý0Äô¬äÙ~¼0;íTÈÁ)´ƒ²„]|®ã%ÁsÏ™p$�ÚÂ6>YjA˜tP|ùf¨Ô5Þ9»þݸí¼ÙQ: SÐrn’ ¹<¿âPuÜIR€`z¶ä{»×ɼ¸ýÚ…ZôÇ?ÙÇèeê_&[Fò¿çœoÇ1\5�Žò@ehD5Ãõ>\ûèÀFZÒ‹9ËžB|/­·;ТhÀùàûæF ¶xv¶ºº:øÙ§LSÕrBÒÚ'9)Ä�Bî5á˜|ؤ¤à˜ND/w„}Öº_;-à»m,O�…5Ž<‹è^Ä™ÑG˜ÒíqkYè %R؃ÁÍÓá(ت£¡a‚7o†�ÝwnP¥`�^]ܧÓv÷� †º Ù–ÏÝq1+Ÿó“æüÈÕ¾~þ.ÌÇÞüÍwÆã—�TŽYüƒB'La²¹gUn;S˜§:µ¹8)`«š£¥�ë¹ËÝÂ'+=ÓØuýü–V³¥íOàz¢ó(½Ê2Ýè½–<»ŸFd¦OÑâö󗡸¼hu0Ò1zÅeêÝ¢>õ�Cµ–he®x´—¶ê£ë{ô Ô_.àq¸lÌáµ�ûo‰Mðb«ZZ䟑òìýŒF…À<ªÆGç÷‡B¡8õ»Åh Õ…‰—¿œÛ¹ê º›¶µáåS¢ãÞµM}X<œ¿NšÃ“ÙäèÇÞÔÕ-;2¼,¿>BÔݳf€À6›–Ý�Ô4¡ êvh[nW×y´�’îžþ0—e"—ƒ­hñdOٳź®`oúd'Çå–Æ%q’´U2Õã€8"y%¼§ö£C¤"?k1ÆÆ½Y‚½�+o Ì& \1Î"Ìvgߢ3ñd¤¸yÜGøS�«}r’7b#ûªlÕ�xœæÀ…`Á û€glL½O™SBŽ;E¯³¢®À°:ªæyNXb:œ$æB‚-ÑɶPŒ°¼7CÖvüÿu`&|?²›ŸßÏøã„\�îkÌn©LÃÒŲä$¬›Ž¶¬bÁ ¡Þ<Š5¬a’,�±•.|/¬šAaÄ)¼†üGÝB)í4a–aÌ^Ȩ,wÛÆFçÿ¥lì·@FÁí(Ò#dÜÓP¦Oª¥y¹+æ¬ì!» ÝÓ*'b>ÊÆ Ý9Q­tQo ícÄÔhïÅ~÷Äâr@Ìò³¤ÇR?{ÞllûF�D1àÞ÷›i¾\Ò¤‚áJļ—@»œ÷¯ ÿ ¦Þ¸èü•ª}ÃJÏïØ6°Ï„uCH…ÃÐŽå»”£Â~¹G1IùâîÕ´èÀI ÛSÍ,Ä8¢Ä¿L,‡ßøôW U˜PD¯€œ3`Liw"¹ç…çW¤ ÑØ¬ç�CâõkŠþ�ÑbS/f8�öC÷Ï?ÅÉ¿’�ŠÝ@»Þˆ¼I`…)À(ÏVÄRùp¶Œo’ñˆL'Á³¬»ß¼3e°Kb,¹±ÈdfñÄœ7~sÕP»´°C€‡ RÖ¥8¾[o[±¥8@N ‰¨X—3­4xì’Â#Á…4C5]rZU³âZéøø%ÌsàM‰’åÑ_Ü«‹~„ŸGÿªyƒáÒëKÆ…B>ýîùÍIB÷^0f­-ŽøÖÍ©.è_/Ùë;m¨.,§Èò¨ç[XmŒâ½ørøýïHkKåw^ż=3HR|’:Óã“TÞŽ…ä· ÐèêXÍjn¡Ì§�"öM6„§‡`‘ÏϺÙ!™«óõGoÏÏòì pJHˆED+<8I&þ÷ÞSÛ{K-}O´%{èðÄ´ä.Qé6ž×ˆ¥rû‹�¹º?®ê<žb‰båFn;Jc‘§ÄˆˆrŒ×ñµÜMa¬xŠù :Û¡)ÆË4ïghÇŠÕŒd¯w ¶hêšK2™#•¢~Œ-…á\ Kä ð´›×¾]š®Èd¢hçðøE+ˆ™#¾Èá™L2_<Ëétì�˜¯þ2Euß â…–é·-ú{ÝØQ#ʼnì´Ìd²Ì(XLú}|LIHË¿U½ç€÷ªûLž3U3ð¸¹Â“Œ4ñ¡˜cJXŒ¥’¾~~~™6šGO°ÒúÇíöiãq$ÏÌ ^¼ŒæÔΡýqûÏ¡ æ­>vN£¢!V‡\þ7þiL¯ýTu¢ì/†ŠÂÇÔŸB8ª�}2—’?´³9ânƈ»¹¢Ÿ»â8žÉ<Á{ ŜЦ厯ÈS8HÂ*ä¢*ó‡ù>õZT‹F)”ƨ»<â}67m%©ôïµÔ ¸0£‹Z¥44E\¾Šž Y•ÏÃuc²¸ªh�‰îs�H§�^8}‹ß"Üü(b‹�ÅÞãŽé�f)5ÛRmÊ`$ï+± w’p�F–†K ì™ø©ÎÅ£2Œ¢ÉÐÔ“yšä-Ì jz±º ~B$Õ�…¼î‰ÖÅë©«¬]Ê'»Ë¹ûÚ^bpSIqp—8ÿm÷åˆïÍþY+ti{ž$y‹2\¤�ÅÚÝ?¿K�k?£“Tye-6LÕ�(ÏÛÒs3{�¤ƒú]KdòĄЕ^ìûô�¯ªŸÀt+ÁNð óQCdrD’|2û³ŸóžÞŸT¦Þ †j5MÝ¢ª—ø3Íó¤Ð‹GÝß":ID�AX‡D†Q…›^wù°—1,_F>Ö]þ‹f9huƒÌÒ÷³ôQð]º‘)?ÍžG&Frûr¤[$SïpçŠYw8gë/ÇCŽ8q¡§ý ßÓè¢ÙˆÅ�é20Œµ[cûœIwN´X’u´–Q™ôÌÁ}ÆûGÛü}üDÀÔºÛˆÍg߆ŒQè¾x£°ê- 0kyÔ¡ ƒBÙ®Á”®¦±ÊQÕ=‚åï¯[á[Aš»ª\ÿ­oIîZ�Yæ3yxeÄyàmF^‚ºB™7/n6†vÇ™-ÝIœt& ".î[Hƒ¨U“²$àãU.*é¾:S,n×lZo–Û\9 pº„u?ºR'fS“ìDºO)YB•±2ò8îöë뫜3 cÌ#§•nIô© �ýy9·{ѺFÑ:I�†Ýû|¾g潨‚Ôª ’É9a$K‚;ü9Q•?~Ÿ•ÍjEVÚ'™M2˜ußuEäµ_„3-ùçwžêJó Ä_Z)uø |³%Ž)÷}ÉXd1É]´ôÊ072ÒíT©Ò°Àµ.=}Žð¦Ëz°�-Y1­Nÿ´SÒ•9þTÀKãý“mÌ Ä In�zû�a�~YcK.ï*ë<»±?†b¦&;.·K À<Ë‘Xš,í�òÉ·òb£¿ÙÝIæ(�Ýýf'3ürßF1èÏ[ãÚp “ìúä"âÕ?ËÇg£hï3цÌÌüÝYy—“T³¨´§�V¸æÝ©¡ú—¥5À=´N„¡ôµÀò¨wifˆI¢Ì嬈ùy±Æ¯ùYœhÉS¾ô]Ƙ˜O}|jÞÜ3ë4ºÚ5ì™@ÈŠ’þªÌPo~¦Ya®œ/øÞÊÔÈä1LÍä¸gÃ+Ûž Ý=s À“Äe<Hi—‡É¤Ÿ¼køµVÔº |¹"SÞ–Tð�.¡þèìêd-ËO’l×;']-²3ŠÄ²Î—¹ü@œ'bHâDõâ¶ÅçI|Ñ;~!i®!´�˜Ó:&öæîâïÙ¾ ¡ž¾ßÀ÷B„»Þëž±w•õ}·.#k´ýT&Ň @þØíwaûCr…öêYoÜ# q d.°–5›Ë>"ÓÈIòÇ.Pûs€Ãôç«ØÊÖg¾Šoƒ5F³ÜLl ]ŸF¾M,ªãѰTšS¯!ÔyE†=è¢].~°dÎ/mdDNäöÅF…ðžœÏã]'ªE²�„ÐhFŒ/§Uq¬v…É&ô}Uhþâ,"NL%CüØerr4GàøCŠ‚’q$±uà‹ ØÙìæœ‘<û¥–P»½76°åóþ6 æ üÉÓ!C¨þj†Ü{ëårá­Âc”sO÷�x2±kàiérîµä…ÏQþ‘N½ ýOQ7Ô@F æär:2tÅ1$ò­/l„æyR9Ê�Ä—‚!ì¥ô¨ɧ® â²x9] ÓÝŽ¿ô؈ê6ª…¿ô3^ùÕìÞ&Nœ'ĈynÕÛ¸È6’rekVL.Ž—be¬ÒîÊÄnüÎ/ï\>±ä“ŒäÃórÜÐÏsS¸žJB£7PYêa¡Uîõ¸Jµ¾*0yê~/£íŒëÀ-?l ¦~h;¯Ç('ë�/¥P+Ÿ3#LaÇå­6I›èç‡éX,ÛEO¤ÜBHýk•Äã%èáO»Å˸ÿ´;|P¦u�Û=ENô‚JÕKcašT·bY’ñð­´Û¶ñÒ‚�‚:Øâ€€÷è EKóîË4LÒ’›cIÆáÞ?Õrɹ×@UIÇâž<‚'_¡FÇK\¢iE ž[R€(ß l¼7À3Æ|²‚!N:í®*¨Xh°6�¬wF+ -AFChï…œq¼Wvà½G#j6�»oêJù5'gÅ0J²8šK åôŽÇ)7‘iCÓš78Ž�ÂOGSŽìzÜ»÷…j|Th×úܪëÌvgàœ%„ÊüÖLY, �ë´°œLžË�lð> ÆzÅEèß›Èh»áŒÅÏÒ¡¸„ɪV¯-dÖQ°œ%y•tõs•§Ë1W?›õ±(±¶]£žx¯×/çÐjb4”üQÈ'¦Ì\ø™g©T=�d=F�I‚vUŠõ¢‹~tQŠ÷@,øXŽÊœÉ®Hga ^Eƒt×énÖ@ã‰vL\¬ZÚ™b¤¿Ê ^2Rav\Cô¼4‚xÓ)À(ã4ÖŸìmq�![¦¸ä&ž~-8$ƒÂQ<¾ú‰óY¨£G€[÷Ž{…÷þRȱ“+a¹iˆ6•vë-lßÊÎ'QkˆÒÎ:·76:@MèÞâ\²,\ô-±s¿ˆ- ø½äMÛ, ô�²Z)rÕvÅí@†¾åøb9o wx°»m%Ei©ó”°dž}£ e_n¹ÚJÜ”ccŒ  æ.^r �!byŒÎ�$y\|^È'ãHta •ž PPÊÁ�{jâûÍj"…¯u°Ï&« ´3 b³±üÎöVX%|ùûYSAéVZ&ò—fÎ9k(¹dÙ¾p„D/?qjXus$o·÷ÕÊ\ܾŠ[ô0†¥˜ûK1Áå�ñ£¤œN!Z¦:àûŽ”¾ò‹Æxâ/EÊÚU*ºg£5«GÄÚüg¨mp˜Öõ³Ý~&¬ |ƒÌ)׺ûs…�›×+¤g0gÙHZíÈÜB÷ÅÖ3èzƨãiô97­&w.6–ÚŠ={ úåI>õ"Gé+ÄGS~‚ù6þÁT?{No­%]emV›�ô¯žFV=å:­ •ZùbšRj”n»þ¦}VâD+±¶x_mþzi²Z *Éç¼ThËr¢®@ƒé}ËÄË”gR©QpŠü ½±€¨¬ÆêœÕ£207ªË™øC–¤œ Õ¥µä >ã Q):I«�’L'lQªÒdÀÔHSˆ‰$øæ ‰¸¶ÏñÀ–|]š£Š…£‡[ÉŠã‹Î;€n)¤L½Q{pMESûtëý.Üo8%®Ø8¼Ú)(åѶbr¨7BFÓ ý­¶8~n?«4�zÝAj¯ {¤lZj�9SÊ€˜mµ_ÅwÛË’�ìÙòªçUk¯xžsªŸÿXÏ1XüýXqˆ/æ”÷-t)å}Q.Ù€´_½*&iš(_V;'�Â~a«æ¡A±¸õ~ÂPBýì]YW"A“}ïsü]PX,²(n(.-¸ï´¶[‹ìÅZ,gÞæ·OÆ�̬*Ônû›yœ"äž÷ÞˆÌZ=ªÒ³ÅJçî úxþÞÿ,fÝØÝ=Ë~%5Ñ3„œ©(Œ_B»c8f[c¶œ0Ùû­ˆCÿ�h¸HæoFç�fÄ2—Éò÷ÈÐщ¥¾KfpÉŠÅŠ‹ø &…±í½³�@ÿ7CÓ·øq�ò³„wï™òÿ.kçH8H(lGwy¹ÏK/U…­–xÁÝ@I‡Qâv}oà&^î�♤ÈhË T�téÙÀDww8Ç%7uwí<=mDÏÍ|,C´ )k¯çÅ YLØrï†Rq£ãzx¤mä?GÄþ±ëôØdîü½hjmÔPX‚á\�1öCìÄU~!¨œï�'hþLbAƒ1m–.46³â_ÖHüyB‘�ó0�‡k»~Bå )Ã�ð{²��Zæ‚~:ôFŒXôÏQDÕµëEd,™Õ¥½ë {‰ß½.ÙQL¸ûœÌ ƒŽ õ¥ŸÿØ7ÐÍݵagÄ‹1ú§‚Cõn½3Þ~¶©×’cƒÓµ“™7¯’_øöZÛúq<ÞiQŽvxÝN¯&�ú™ =è¯7{ÎáKÔ¬®3¹©Õ�Pú5>ŒßœLùùF©J#¨¥²Öð¨�‰v¦Å-Çq÷K½±quhuû§ûmüFüúwU”“°GåuÜV.GÜ{×Ê˘'íš¾ hâgGãC“¶F¼£¶®âe0pì2±yÍ.}}EÌG|BÏ剺³ãjU¼8 ©ûÔ3´uî$#ú|ÌF…þUbœï\E»ëíh£ó¸ö³"Þ-Óxï¢bÌÊ=H5ƒäkÆŒùD”x烔ݟFßíusˆ£“(ÜÙ¡�BcÏ$y/æîõ³1\Ï11p…ŽƒEQbµ/fæaŠÂÄŸ¿Ãs£Ç—©ñøŒ‰=Õ¯»»­ÇwNŽ#FË{êÑàE¹]oXêÆ’,ŸELŠ59PbŘ½¤xáe»ž(#r@Tò|ØN¶lýö”²8¦ðó~BCîXºžtë ˆ�ÐLz¾Çr0ô9˹‰²HµçȰɀìH$Ú.QV¦ã´I‰öèÌÐsu>žxc‹eIDÒ!S3Á±¤ƒ™Y˜(GOÓ�9‘ºp(—N­ ùSæ¾1Úž€y¤è7Mb:’J â*Š�¬Ö“p< ßüGÙ0{¢ÍÍhƒÎ¥4ê3Žc˜=”LOøöý£8JXµH)ˆ¥0‰cC=º ÆP�6™ý‰Ié“ìÖóÆÉw>àR�Á5Ì`o˰ÏV<¹ICÓ¤ÎÅè]G b‘!½ ‘D 7šÐ A^Ä¥'àm’ó8µº¿ˆÂRˆÞ�%%�î®}0fÆpÂÃ%@µ€O¡­*ƒ& ÆUÞM²!5Å>‚œ„¯ûô,º¶�‚œLhõÀ¾7hÑ2)‚Ô¶`õËËþkÞä6ˆ–2K¥6i*áz½«v$\�·A᱇ã6J9ÍTjS¸2d} £ÆºÎv=?TŠöY»+ÊèƒPžsèxqL¼³äP~, ýÍ[½n²Óóü/öøCì�öø‹É %ƒÁÎ F4|^r”ÕZYQz^T{hÄ”¹¹›±Ÿ’f"/‹ V°ûç­5#³ß¡'õVÍ…wO»÷²??ú‡@·ažú­×rŽ(kšcš¦;aÞ&JªªÓj¯{(š€v˜“âr¶yˆåƒØäi³ÔM¯ˆœ\ 55z|V‚ûðµÓ„¸É(Ÿú;£ÔPÙnò;±Ù–¤¢6o§šDÉ™i;€’#ž*lœ&DŒ·"ÅkP¡l¶*Bn·¤nQwx¨D´§èWng!#ñL˜§ÏœD¥=;*5Ȩµ¤E´cf˜~bS_ §Ûâr·Ä=]Öq;ïö1Ã19òˆ@Ú¹‘V ЭN˜> ü) þ¯wóÓÏ–AŒÿ¡›;ƒöƒ\¹ÑÜŒ–<ŒR‹�1µ‘º «•,~y�˜ ßÄBÎM3SÀ,¥ÔVXB€9g€PÑóŒq$|ë¾a(áþ9%ÚüéÖð× èö+Ãå/<§Á‹²¿&žÒ‡*ŒOivvÁ¹¡T¨ÙÞuü¾;*oa4TÀ§$=ÿÊR!Öà.OÓâ~¯·úh�\µÂ”ç¸82’�?�OEñáè`4 3’5®N¢±8‘2ßaÍt¬îƒÁ…N_:ðîõZ Ç`¿¹×¡ópzÐØÝ‹—¼‹®ó¤xàrróTqîWB-ö:ÓíQXw°cŒE_o§¢×ý>f[ýú–{ˆFê©vÖÇW0âÖÀlGöë7áR5¦6±L‡-yûD ûÈ]UEp”ï$ý~ŸšÌàýº"·vŸX#|ž(°+Ò…çoš¶�È.AL} ±¬°]/˜ ¬”Û"àrlפH5£j**ñ¬‹è§½ ^H :ü˜ù(_£ÿ„žkžuﳤ¦Ž¡â­ž¦ˆ`i6À D^ÜÞ0ã’m�0­`1q•:l3ÝF~îJÛ,9{§_¿•ê:U*[cÀò°Ø ZÃcM/úz´epr+R㸓ðè…XÎ\bã_Õ1¹cC¬ ð J'úôN•#ì¶Æ\DÌ>³Š•ýÂI9*À9p- ‰ýª¤ñ=¿þN” €t™˜†A*Õf1©¸~D95#U³ïƒD+MDëB:¦ƒ¸Ì ÷‰—º çH²V´!20Á]ˆÔ×�e�·ÁÀ¥ªÆŒ€�€34«só¾ù€Þü‘jºŸhªð&‡è+- ¹jÀFs³Í(ÞY R\(BŠ%t¤Š-¨”ŠV玜¡‘9ŽüMiÖ~‰_Ó 2Æe Z*Ë A@øŠƒÉÂ7¸G¸uŸ{,¥6l¾~‹4¸:™x€|dß>°FÊCžLà èäƒø p{øJ¯´<¼ãXoëh°VƒR„bK�Û…™Cv[ä»Ñ†…oÎèbZ‡“Æ�YðÉ�FºýÓ#Ò>C¢)w3v`f)�•êÝX¹™„sèÛ›Ü�+†F¹û�N ñšÂ D«ûånM4䲌q¤ ¼Id…3¸ ¯«¦ä]nJ¦Òð æxrVOàŠ‰îàÈš f4iá›×¨›ÁãÒí�4$Š5Mè^â×Ò½Þ¨7oðãì§ål“Q¾7À›Mú€üðgmxÔÎÆº {47˜2Ô<,Æ4‹4e`Gº-Ê K¸Úm9á·èÿáÏ:Ò™ôÇÌÿz¨å/‰Ó|d‚É5Å¢9CÈæ,/Ïÿ¨…å�½ßÿÓN?í�º¡™Ž¿|¡#ŸucEíñ/We_Œäl]§C+» Ê.=¨7�2‘$´‰@|EGÄ€¬·"Uz¹þpþÞƒ�ùúP£œnp>fÌ"ÄFú׺” ß�½·ìl?#€†!ü½ÌòbÏo>z{Xï€w}H~%¾»qùóUƒ¹.æõ¡&�Qd4• �3ˆh·g¦Þn�ðŠsôFM®bíñF·¥5@\²°DOÖ1§j†‡e«˜�î*y"Ó·spä•S߉Úý1V=}Uùç'¡i^Ê^õwz,y)y:¹@,<Û¸p”� ?á=·× �Èdvðfô®'ë3:ï¤*ë_†K!Ñòíß.8©¿Â¤üƒg¸#¯tI�;æ·ìÃ’PhJÁƒŸ'×4)Õš|äuü±':\™ Òù”‘�R¨7¾¾×÷ë¾'ÒÍuÉÿlº/Í]rUZ�´?—ªÃÚF>†�xš€Çe5‡æÈÓz<ŒˆtM“…oW¤Z°ùsGd7Ôõbit–ppÍÿhV¼4.fw¿�J{œl2mÜ®5** … Tî—KÔ2ra:ß«C\—˜$R?DûÕñ¸àØ~¾ Žª¬‹+c¿€­æŸv€hoegœºúcÜE“ËãCÁ95>eƒWÉ.b-t ýªF ‡"�MfkÌPZà Ÿ:Líé¹b¬/=ßPÕ2RtžžÖAºd¢Ë" Ê›ƒÕWŸ˜«6:\ØÚùúßùœ)ÍÜ@ª5Y¢ º¡wiòm‹~$©”Å)sÂú”¥­D¤¦°d± ò$˜¾FA-«øöúb³¡� ¡ý¨æ%h=l¶Û’Æië¬ „iG›IWÓá‰3¶.[Þ8Ò†pø~ì—w•†“^éìÔ—»Ý�ÛeXL'Ï&¡i:Á,p2BÑÞ–gD,w�_5ÄÂÁšjGÎk¶gXä�3ÿ^™¬¼Ê°ñD‰ Z¥wôÃ9¢£Ï¹¤-:`´¹w3D«¡ !(«629Äjqp\¤gNDí?íŠÈmeáÛÏæÉ“}v¶~~L±ñiô¢,#¯P3 £ËµIZŸOdÄ4^ Q¬L±hÅڬ복G^‘XèP´½%Ÿªµîä|äyEwûCÖ7~=•±!˜V÷e¬aI êAb¿¢Ét\î *'·Óˆ�“Ÿ f�Š‹°¯Q¾V`Gê‚ÝãVl¿$eõ^UæR�’‘ßl¦*’È?–UBÉ,æGó}ccûìžêûé«�ÏDó#3s¡RWÖH)Ž,1ÑÀ2O‚\ÚªÉ "¯˜D(õ¤P`÷k¬OuÝCªvÃ_mãpEÀ•ýÚQÚ‚+Î2˜ch|á½éHõ ÁT„§ÚT¤Ý5Öw,ÚäU¬�Qÿ\ï{zˆ�år¦/%~šú4B ÎÑ0,"±O!1Óè_%]K^ìbL;¢"fTëpµhžÆÁôç¥zÜ„Ø$2µ=ßÇvòÒmö*éù—Q�kìÌ—_s”n²oœ�­îWà›©_­2žÌîüŠÜá»a+È8ŒÓUŸ„’d>‹´›í—Üæ«ÀKÓ¦’ ª}_C›DTàüŠ/?ÁìÈT �üÖ)–sæ,Û¸hÔ”]4uz2r’2r0ƒ˜M;­w=¾bÏÎÒ¡ ð´a÷sžYîþ4FôäújÃM(ˆ. ¥,§lãºë�™À# pz¨´t¼ŽUqÖ¼ú}Žºáó‹NàÎ8Ÿ‘Ez%B�$ƒ@&TI#…-h±tˆq 3pE¯Ð­Î~µ7ÓÎ-&±+pgu±#ey3yþ÷`$çãÀ~ä5U,^Ø,Á©Š—¡†¡ CåºG„á·xgþ¢F½QÛ´ø—é!Ðq«èv—É­­Q9?¨lÌu JK^PˆÊй#òhJY%zÅâ©xâ%Ã[L¾Xœ.`¶i9µèÓÝòEÒpšZ‡²d8à Y<ÀyæÕH/‹-½ñº:më…fX€ ¤VõYòZ|_™˜×bñüQM)×G½‰¬êJI¬è¾²N;ìêtÈD=Ë%–6\M”$()€ùAõ ¸Ë·ª9¦bú�!ö^ºz›»çbR ]íÌ€cÁ ð®X`xO³Þ+‰k›CŽÂme‘œK÷�Z«ï^~ÄWX±uU�KΛlIL+ÑÉ#ZªHÁ5ZÛs5~TŸû{èŸThQ>uVÐï�g8á—¸J½Šó¡BA«Gñ2qd«£W0ΛºÄwµP7ñ~ÿ®âl½] <7Ûho¿¾N§ýã†üðì —¸ó˜vR_Åw‹6âÍ×{Å7‘˜¾^�tžpÊÓ¸rÆ%�”Ë;Ê“õ0¿†õ¢¥áµ‡–¯h~+XíIrVu®²“šÄ8!ã5ˆy6ãy •G÷ÞÞdÊúÛêyƒYŽÞŸ�@ÁÖb^Ê�?7rXIužV¶º½ÕÇäTB“xiâ+vkz¿(ØÙé-;�ØÀ‰öû.wÚƒæ2â!š‹çûpÙ„QbuËIˆ²×L±h­ËB̶‹•Àgþ'[ ØÑ±„häV¢À@×Bw©_ó‚ý_øæ¸ûåÑ0ñ+nqÚŽqW|ƒ†>È"Ë®x×¾ ´ÇìÏ5�ï(�¸³ãûW4/Þæ˜²è—1F‰|ÿ—nEgZ,ô=tÛX®ŸyM""Wï} hÞÈd%:"­Áò£Ïúž”ÿ½~sÃÇ“ga&. Àã/ç0má%`Dª ÙPñõáQ¯Þ–õ!£f;s¿Å\/rþÈx¿ÕB*‹û¼”z�%)µ/v›Hë÷1m¶¡lÙx»RÏ i§ ÷•¿Æ&øéÈ#$:•gq–ý‡ÂŒž[ë×ág…ÁL²-UfTxbŒ�`>‹øŒ¿¨/˜ddíî¨>©ªRÛ}Nž&d}¿@fÛgÖµm§Ï"çoªÚæ œ‡¤¶µFgôÃÙ²Õ—­ABó,ûÞ«åÁ Ö§\‡ª�´m˜ßžÛé­v½ÝçüJuB¯‰Œ¼1J¼ˆm0£?Óéñô¸¸:�Ç–ñŽÎTÐø&½‹ú¢á-êÀ²ìw”‰¦a�<×ç<ŸçÑu¿Ö¥¹µ#wµíÍ�¥§Oœë»ùúól-|󖉘 Uòè“UyH€òYR5ûè·¶ÂþײŸÁÕÁÿ.V¬­»§ÁâgÉ+Ë̘‚}ö-#ùÍýtØÈîµ×Yå–RTs¡ï3ýÄÓp"rž§Êë⿾¯xµ«œµüž(lwz»É_ǃþ<.³Ù<í°(ëno~V,Eðgoªeþo-O2͇’Ëe#ö¨NçV"1«}þ/-­ãn=ãÝíêdsæù€À¯é^jØ«êÍ‘\qÊt:[�¨*l~<­DŽ{Z¾/qn!Oºâ¥Ñ’¢¯Wð‡ÅÒŸ²œµFÖ_¢glTó¾ýö:�ïWß—s¹ïËÿÃÞ•w%²,ùÿ9‡ïP…ân[û¢ ²•ŠÈ¾)¶-B!Å.è{÷ž9óÝ'"ªØ´@èö¾3gÆö^H*#cÏ_Fe–(*"sÃð*¯Øí+§-‰¶‰ÆnG¯çøØ?£Z¿Ã0)æ„9f*𙃞9øÿO¦ÖïÕª¯Ì5ƒx=~ÿU¯Öy«›YsÔÖÌc¦Ñï½2y«kŽÃýNÝëQeŽcŠ7g^ÏÑô2cÙeu{ö™^îÿ úñÓ�Ù±Lƒ :sÈ‹Œ¤ Œ¢i ‡×Ðc†¦i\ÔФHHáD5R9ÞPu>¢á»aл.hx]3¸PD4TQàDC“…é¯gÑCS€»áeâT•ã@º*kªUU-Ìiš¬…UI©º.rØÓy%¦KJ{Eè5¼$©ªh„e�Ó™STUŠqr„çx*êä ´ô¨ÔêæÂ†Êk$eN÷U¬ øPH7tà¤Å8°AuMtùé†Ö 5ªÅ 6pS U’Á>t ‰†,Hœ,"¥”Š‹ÀÕëx† §„8�&a¥„#œj¨²<½ªè` ÚGB¤ÈƱßÑOË´�‚ߺÒ#}�ӹةת×1=.:šNª0³ 5Ó>Œô3á7«SOšÿÆLózþ›±E æÈÀ¤>d…ÉÏ�ïŒ:sÏIE)÷�÷ŸÐŸóØÝq‹ñðª¤Á ât˜e;¡^¿[íüÍlð»AbxèQ^aÂqøJîç_9©óúd$³ W`΂#I�qÊJ²DÍ+»‰ùeØÍ?˜¯¼¤)Œ¤ (9’.0µj­i’ÊÇÀ+¨)“Ò Ú0ÖW‘„ñ Æl4ÌÚënŦäé?ÿ«`ö˜m㤒SSÀ@Nä˜3`Ê *ÃPœ¡ŠgMÍ8‰‡&ï8<ÀÙ’%²9è'Û€‡M…Ç‘D`7ÿÄ•Y“ÐÐðxeh{sâ!A <˜qѼw'>:ñtäÁ#"ªÌ°æ\°Å‘_O˜±gÇ–�½˜Ô¥Îjžd‘Ñx Š èŒ&bPxA.7õlrfÁ•Pe�[YŒbxÈ` Úvz‹ÀTàÔ1”!ÙyAÊ 5¯ì¦½–�ÝüƒŠ rÉ©Éþ+Ó5«£·¡Y·'1ê þÔqØ$'l³�’eÔ‰ƒ.'PöÑ%P3Fi :æâŠÔrÎ* ¹ØþÓdÌõãÐg¡¿aTTÍ^ç©)SÞ�ü§S@ÅðIvNNPXuùxà,HÌè�‹#˜¬®žË°z¡{UŒÕ� ó6N`[�KçYA¼¢aʯG¼-H¢ÁS[/c�d}*(qéõ ªÏæ¨ú/“š£×þÐôzvüþJ®‚×åŸ~ÿ.¤: /å‡U«c½žñ…c/ÆÃý·^Ýê=‡û;™(룪*RÄzu$Šô»]³÷:òzÞFæ°nÕ^™'óÙê1G]è¥n6³WÇ‘aìDZ9óõm‹kÔü—U3³a¦þ6`Fæ+äE8Tk&síÑ Ž0æ_µ&²ñzº�päØWD‘5`ssF3‡»×Ã9N¦tû¬ˆÌBfõ\ªHºþiéŒב�›‡0‘%]dU±ëH(x¨ŽŒp±0Õ†TC¢.søÕhHÆ %Ä…ÃXr2½ë|Œ®k S:_“°Ž„*QV¡žÒ$UÓ �S ¬}ðU…N¢šJaUÈEIå ¸U¡uWDïŒ a}T˜jFCe¦H@EŠˆ€uŒ£êPÖbÓ ÑÑ_‚M·õ_bA´ EB]§Ê¸é2–\`ÅW¯g¿„ RÖð‡ þÀšªBNðWÈUª�A®$Fx ¨äÖ•*بëÀh5lC] Ú¨ZD§w¤éšÔ¶ð)„µ'¸FŒòÈ7•w4ªò!$ª«T�v"Í~X^?rêG›ƒ]@r9!ÄMª&* �w§€¤n, E^€µeŠ�øY„¹Ï¼BÓôàÛ´lÑůüàüJë ZV‰§´bUäºÒÚ¨””–x–c#‡fÍëQ¬Ÿ‰ì2í.«¾—fÙ›ê-ûpùëypxß¹�§âbe,j+ ¼[-vçì©ÆFò"Äi›Ößùî0/gÏt"V÷mÖÞr¾Ük”3/,†3(¶¡´ØhDÒÇ¢­r.-UåL§¼R6Ð̸r�ûÆ&[º-<Ãbm´™é=ûôÐ¥e è¿ø‹ì޾�n2É…¢Ð̱0´õN±© pì¶BÄè¸,nËšHl:>³Þ~±ÛÏwißùÞŽð—yÙ5ÙQ”íøò‘zKδ¸1-6†ÃÀÞ³mÿð5[w¢ppÕÞ� :nÄñ3–½¨X”^ðŒ·|úqÅ’;…F�®²ùÊtáØ“t÷Õƒ�=Nþ%œ–•V Tô�'å2>Àµ¬ÁË1¸!2Íc?+ŽæÂ+™ÔpØÆ6ëáNHñ„ÅÄo¢Ù‚Ú­+ƒÂS™=ƶÈS ~ÓmfýmPÿ*Ns8Æo¿ßF~¹“x¬‚”—:»=HW!?š& Q–£ï–õ6û£žîBÆ]o£ú2»£4ò@iÖÙòN¯HÌ@T�Ô›[­LÖ'gšÛ�Q†p¾ß-S¬½På©å\ŽR•3ühZð1hëH�ôõÝ6½ÊÔ×!xJBŠg”­M"ÿYȃc;báô'•óY?‹™[’‡>ÛE­´íÇÈámUi —O`æöó­I|ˆ­zT?ªÓ„�œÙ˃…‡M°a/5Î Ê81‡3¥ÄÎ[d!e}á·9ž–bnóØ—íSþ€æ/–=zPø•b#™—ä‘V'H�ùÔ¸#âÕ?wªäXš:þìñáÈñ.qgŽíêg}ç%©éó‹%Š+ˆWòãYxoÒ ØÎÁìÛl“­v<( Lªè½ @)Óö�§¯Ëv†c‚Î0Ã$¡´r&úÊF›wmMªÛ°dõ E˜†Iy SçæÔ›ÿ–xSèaòwJN4�„õìY!P=4®A¨±‘I½½°lLß…ùZMn]F‡~àsŸ'E)Ï® ½·oQ®8I yfOТ=N_„ ½U× Ã“»A:šõq&(`æöãCɤ Í¥ï#2kš”ª$àƒo3Ã’Ô0F)ÂnûˆÜ? ¿ì¿Ø“cœ¾6j@\{fÓ¤¦—òN·=NÀ§4`¡¯„áÁ_—À,¶�C(C¥s„ØÃ{¸ç$2s’V~¦œÁ™Òxç`„mô½Õ=+²'}õ‰V4Lô'¥>ݤ)ïp¤I] 5)]�m›,˜¬|¦Í 㥙jÈŠ»ÎÍþD[ˆu÷´�¡è~öM‡wIµÆw2”Šh&¼}„ã E€ióNõŸÏ¦+,Ûí­ªïz½ž™~À’TôØžÊû¯›GÈ6§ú®žNlèô]UKêNú©îÖ Ê¢®õ;¾™} ³D�02åW~®¥lf‰°$·†§r§¬¦¡hYÔ‚’ÊiKißÅÖ¨ƒ«T³ÁèÌš~*=mAΜŸ; —²ÜŠÔN¾ŽY¢q&—o#£M%ŸFÔx XÔ¦UAÄ�³F<î×~¾Ä^×�ÿ ‹ÐÁ yŠ@¹Ø-ñž“‚þ¼þ#~SlÉÝt°ùjK$ž‹07Û-Ò›Jª© !@çJð äœÉ|¥âgù­ pœ]h˜´–ÎE«NG€fÓ1M-¸=Uz¢ò¶«b»Ú^™|91DóTyGümæ·™ÿ´™€!¼EL_çiI�¶^ªÇÑ:MêøÍÝà » Øí~7H�hy, -(=¬4�T|7X9ºŒÀ·Žù8¢À;¹¢Æ{ø[`ˆ£¼ð–w(G³ˆZ „‘Æûãép“=Þ.<±¥ ¾JH MèÞ iQDøä–eýÙýøÍ­¼ñÎ�Ef´ø°ƒhb¨6&¡ Àýq¦²Ð]åS½Y$[ý/áøØ–îa¥só:�›¶œy)Û+t¼×l•1ß̾™}3û‡˜4ˆ?Â}Ð O·ˆœEm|t·º‚>Cl‚gePhÙHv§EµßBìz¯žÕ½¾ƒîà,×ò’ ê·ì�ÚK‰/ Û‰YìNžwݰw\–@kÇZ›ªïâ´ þC‡›Ó­áSq©[U—”ÊÀl�53 ŪË0+ø¥[g'åâ>o·N?ª®Rh•_Ô±@³¥c¾™}3ûfö%Ìxa¹•Ô^�+Ò íSDMÜ!;_nƒTìE-Ú_[n´¡ ÄæTmÆ-Åö Rù ¢`©›­Ë‘�Ø®7ã—¼²¿”YÀi0B‚AÀÜz~Íê±[:4YÙ½ž1¶?ð„n­uê}\iAq"ëW³u}}¶j‡£ÙZc¾™}3ûfö[̦÷Ì+Ü1Û;.Aûä~áæ©+júA@�çæt„׳ÒÌŽYiWóÏÆØŒÇ¸ËÐ:ûpý#¸&Òâ¹T[jg+UÄÑ)‡Y`¸�Ãðw�Y­žÆÑöYÿN¶AǦt@6]‰A³EˆÝ5åNá-±h¹1àV"ÝQZBùŒÄãÊGðäþÉ—±vÓ®¾ogo.q©WÞI™Ùu_xx‰/I¸µ9Z¸¹c“Ðiõb"ê†bH¶Úae‘ŽÝÉ‘ ª v6ûL ž<ë—ùë)0óOª2Ô  ªªY%t³8¤¹´p´ýÁ’§cŸ`½û‚\ݹ¶Õ–]R¥—-'™Ú¿0%ëâ÷Ìü,7¯è±Œ6›çS &ríâ Ór¢ÏHâµ;–½1Ò‹¶"nðщVEßI~Õêšµ.�møz…��¹é`°ìA°˜|—Ys+l3G‘v Ö�Jç'Fýå»×Á1ƒ³…óŸlá/É)€í¦›Þ€¥ �QïEŸWØÖÇ¿NòqcÝÕÉE+új«.eîöó� KÐMÓMQÜ?[2úŸÁ[Ž\k…êeÏæ®õ—-0sÑÂõ9¨½G.Àïa—,ÍÃöصØÌßÀ.·Uåý¦¯ëª³–fŸ8i™fs˜ê€•PÕ 0½žßDU·T¤bïwPÕ­cV³ÁÕÆæ•/ o.Y¸ë·Wræe«î¦hæìÙîo/ØÌ]Ô1ÐÏ㿦lÝ*ÇD®$øÄRk³ÔN,0óð¾‹ßOã�/`qeíiQ¦\Ø‹pjI™Q¿�ãã¬W+©Tkün%{l?¬¶òŽK{”NåW]sl3�—<Ùâáú1=E»l·Žï‚xR“^õèÁëYdˆÛéÆ'¸äÙ–ZpB‡'XR­fXP ®Q¸üÞîì7³ofßÌþifc˯vèü]>ßò:¾;^õØx²åµÆ˜©>]ËXS sn—¡Bðj8L¿ÔòkÉÒæ1¯…ø|ÅÙò‚Êñ’í›Ù7³of«ž-ï$u·ce÷û€vYŽŸ¸?é FU�~ÿl p,ŸÙU7æñ®D ¥¹v½;&ôõz\ëàÖÆ}x ƒëÇtl¼FMè³Ë—›ùuóÓxý/:ûföÍì›ÙºÌV¸Í]¡zózcNpãT[ �x <ûœ÷Ü‚â n�Ëóù¹\éž¼Û…Y¼¤Ó³£ëTòÇÎMÅc~ÂZ±a˜n�ú?Qüç™IÁü#ý~Eê�Ýé¾›+íbLx³Å–},÷ޤ£m]œûDÖ?dõšxêõp—æÃHžçøL+ÙŸ¦¼ÜEØòfä•ew¥ º¸�ðáóÔ]ü¦tiÌn¼Fa`zÆó€0'6£ò¡HZì§¢=ÃM‹Á…ÐÜñiÒMŠ-oâ×”?\³!£”€5Îð%h3K×zO÷;¤ ûµ±ËR†/ô¥óEµ`.íô&C#}MŠ ö;•ë¾™ÉâßO¼ê‰Y¥üQG"™T6;s&�RÓ^â/¿¶Qe<á?9:ˆ³'!-ANä.üá"òÙ/ìÙÌ>z Ž/кJó¶é+ ˜EÚ¥.ž€&±'š�)}J‡Xך…¢�Ù;aÏÛÆ„h¯‡ä ‰RÈÌù€Ã=úç!¥ZI›ÄÖçâÖš’L r Àº 1IL�­ýäõDŸô,ÑŒIïT«÷µÀÜiÒé£3�\½ÂîVâðRM°¥r¯8Õg?w•ëÌZ=VfÀ—’ˆøŠ@R‚¾$�¤2}+ñ’ˆøŠ@R/à I$Äì 9Á³¯$õâ|E ‰˜}I IgAùã@RïÜ X9�{lTN&ßùv€Ï½»‚o'3`λÃ{#{´Ÿg_^þ£D_Üö–Í€ß3˜Vô%é´–Áö‘äÑøQŽÙ@¯oµý×Ifì^ÅjKq3…ôŸO'7ûgðÌ-äœó�tn[׬ÁÓÍËîB±™A;[ØÑÖvêw£ oD8ü®/oW\ì¾ÅŽ«R­½x‡¿½È"?–|VÚÔN2.VÞ{bGGðÙÈW-å�—'Vg‡¯¾ ì™\,zpDÙ€Ô|`ÙÓ Á·-ʱŒÃ_"Á½*\K¸:cŸÎÿ¸ƒ ×c¶Õ®2˜ÌÏ¥ÎöOݬ= H.V Ú½à3dŒªÔ¿Ÿ7¤WT¥N¼‰££hñü;ò“— \;9"Ò�Ì|,ÙÜ#§�À¢�3fIóh‰™óÇbCäY·Î9a6(¶™îŽRx/QÊ»‘×i,•§ø§ 6óÓ—�“3EŸD¦´*ï™L•*²[—!×d› îÇdÃgö Ý'Ûÿ°wem‰üÌþ~žg¾ÃÛà†¸; ˆŠ+›ì² Ê® ˆêíùì'UIºÓÝilhÞó_7L�Ý©$•_jÉRí^¥°•¾|f¶2cÝ(ìµÑrLÈÁ9‚ØîòØ dÂÚ¶÷zKžýÈÕxߢZɯ/*jr ) ÐîG­ RšD× ¼g­!œgÄb/É]ùëõíiJQ}ÊSر§à.™o_ø„,¢Oäã/Mö\ÒË‹ÄN;»œØII#;�Xir[t­G e|5{-8òz µ0[©<Ðêê5/¢{t!§ ÿƒüoÉÑ{Ûø~½âBø˜�”Þ¾¦Oý­á#j]kOpF¢?Ñç­PY{ò•«ƒMöôиVŸôd§»ÉÉRb—µüþeYÏOµˆd�ĦðÂ@,ö2q{dµÀ‰%‹zf¯EJÌ6Çýƒ—VO{¡­§“6ž#—ïÜc—£"4¦5ʪ¯SˆYõ•«y<Ók¡aÖÕ³�®iVGóç‘û¹Kb¶8ŽOë·ÝJ_H&úÁKš¸;á=ÜîÃM5KÈúJyf¹ú:�˜U_‘Øt #ÏäõÌŽa1'ư?rÓk™JìGŽ«ÄzêHêyÛÜù^½£]%ø²ç·ËLSËæ”Ø3uó'‰-íæÌ[/Ïf–%|göí‡Z¦³ÁqF¬rÒã ©­Ž…Fh~IlÕ<u¼Ùòѣ棘[‰Ž:çmù¸nc2¹é׉¼J6ðêÈf›†.VRJÿ‹Æ'åô4°¦ó®:ÄCm¸îá.žró ª÷úßrµÄ'ˆ^M�çXÊ´Å/[mºÍ¿ùJÑ‹›­Ý'ú_ØwÂÃÙjCëÚfS×é¡kEÙýb!1«— 0Fo¸Onº5sCcmŒ{éʽ?WHËzñ˜nuöèŒ$Ž<€½îíæÖžè tîï¿/¸Cµtü4NçS⎩Ç…|Ôñ½]WêðDïäÙ¤¤`œ¸)¥GxáWOuãß\™T ºÉžÑÌHÑÒ²2º6j•’¾„70žtC–%®}oJ/1t[B{Ôe]"¥ÓMC XqkìH¸WER Jt1&)á@f@¡ ˜Úî°{²›d;“š¿‘Æ¹€á|ýýÃSÕ¡¨oŽIÙü‰V ÷PxÁ͇ƒ6T$½~ŽÓ!02þ(Ï) §hœc¢»Û)ê;ÑÊt-‹€Eø~�-ƒ€Þ]¬T­*©uNë„­¤íÍhüb¸©F-ƒÚÝv‘�¸M±QøqtÉ‹±PlÂpz? }…دñé)1 4Çha¤Z‘SVð¥á->Ò1­ŽS¹;|õ †õ;eÃÿÕžŽ\6�´2’ÞôÔúâÓûÏÏÓN›ÅØÿйiŒ‡KDÐv% %FÅÄ”¹�ÞÉø²£n®Ž|‹3WW®A`Þ%x9¨qŒ{ˈí룻�.4¶§ùD+LÀhÒi+­_6QˆS–7†®aâàb[’ä¹�A9m.s•¦¯ˆëTµ—3 éÕÞ/ÆX.§!Úÿ£AõÐG;Ç�ðä9¬º‹ª§ ÌN«ª§-ê$QñÔÅïZ× TFFí$|D`׊0�E?h·‘™®û‡“&û.>®£Þ<]%L<Œ3…KÙYï½vŽ.Eý^«Ú©Íµe Dï~¢>£—Ž;Ôœ}G/»‘–·˜<Ãa†ƒr¤=^3Ó›ä鼋÷É“¯8‹Ç;\="ÇOÒœ»xy YÌ9®$?ë¶k …¹)òB¨›ÕØ: ¯·¸±ÝÑŒdÌpÛ¹h•ƒ‰/Qh@§Æ LJo¿¢ib<íl"«i¸H ¡IZQ3Ђìóó.'¡Â7Y-�¿£¹'­Ä0·³Jì³I°Òu“/C %xüü(No¦åUóˆƒ_¦+„Óh⬙½Ãȸ߿�u2:ºÒšò Ý[~‚§VÍéÕ±ªàR2½ÖÒ#wÇÑ$}ÐJ‡7|`ÎP»“jÆ×ög‚ó,4my£9Å\ßMMÉØ¥S£VÚYCv˜ÌM¦ke)12#›{ÄRi'øºgÍöI-ÔêéHd%ž¶½Š#ä™�ã§w‰µfmó‹Æ#µ‡èÚ‚§Sãì8�ÁEí‡Â€ð9øá“¢2ûIy& –!ZŽÔU-B0qQÔŒ`ûÝMd6«j¸tPGŽÒ\ÕIøˆÚ‡|¬œî­i|bG­¹ÅWï Ä&“F¨¯ïH~j._g•¡ŒÕPy²û›(5’¸Hîõ˜þÔŸ¨å˜&Öô4¾ÅÛ¸²÷Ö�ë1ûÜÄÇ1Õ¯ÌäÜÄyIsE¹ÝÑ„5\J“)ÆTÔ üBØ~žL'P ¾X‡AÀ�Q '”ò�··4”Ž£P|f÷(d?º—�0ÊnH©Ó@bmí¯Üä~ÍèÔŸ¨Mo‰7 xâ´›=f•»y¸kr‚ïR^QµxƯ8ø7TÂø×I†ù­ü‰é1"Êé•uŒÙB�]T£ÊòQ†q^§ŸÃÍ[åÊõ �>*^ã&?£8scUV«+ÞwBÕÛ­ ü)yjOšRŒ§¯R[‚…©óù´ÙÓ“ZÛF™ÌÜX“ƒ™6¸¸âbô ÓVãŽ0s¥ ‰°C£í'wGtr�®“bšöFu<|4(¸bxÿ&�Ú—à 5N¦ŽEµFc,�¶ªM½—Ù“qGßMÈE“s¨à„1ù‰ïGÇuÌr“ùrû"XÎ_ù¡eÿ}8y–Ó;ü:á,  Ø^éßAú©Bì3xæršyQ‚wdÁQjB�D¸·Ži_.¢?9†r_N®PR^–HþaJPa��Øõ2•­wÔ{üa³™Ö½ª}¸ØV<ý†ê¼4õ¾®æ¢Zk¡B!ó~qòÄÊæÊ*ȳ.’r‚Ó™ o$$k8Ña£k4 Ž©º)ß1[Ä–ÂÕc#Öz²‰Ö È&uÄœ"Uu …p‚Úgú¿1§[Ƽ52×Gþw%ÈXÿdb½Þã .Iî SÓ`ÕŸ¦æÉ1§BC±ë>²£y^¢£“¯Ÿ\M?¨2 ÷L´`ì¹pœ.OÍ•HeaÄV³ŒñŒ¹à¸ô}nÒðõdFnn^m|¯ö àˆæL£Y¸`Šáð�Ï[þ¾¯û€Ù–ˆú'„Z5¿7™$µüNgytw@Nµ0á)Ø9Si�ý,ß{NQÎcTb¸8±ïi²Û{›‡}š±¤(kþ×zÇK€œÝGœ¹•F°ˆ à’ŸQ›¦…¸Z¿mÄ H=ZÀì¤y–—æk,>;ÙG y¦¹RGàØcúBžç•è×ëg?K' Y5Y¢CPêä¿ÈVF‚¾Å4�dV°YØ>Rí Òe48¨‘ þ=]@ É �wßy–A–*ÌÄ=Í+LaW�–I…òl =–„³¡"ǯ;4�,™.žL¼‰�GK àŠ�•öó™b äh߉6ç°4�¹Í“h>y¦*ŸŒGðÉhÝNX:VÊbÊ4®pô­H>ZéšÓ±îåHbЃqŸ�ã‹LRS†bòÇ.OÁ Óéöv¨#†éaa•…È&3Ĩ©R©‘ÁˆÈØrW¾Ð鳄™dj`*Oœ«wñƧnÄ|§h±t¬Žó�bLžsSÈw*Š *®Û mb_ÅÐÃP�+ˆÜãËCXÏ`UèÏ0‹Õ’�ÎkböÞð~�ƒ ei&Z–PsZ{^͸À3Ì>_Åqe¸Ïà—¤WŸN'püª¸…å‡üIó…No˜¶L  Pú�R\l<ñ�4™ƒÑŒ®e@Ú[âä*:XV“&O lÂ0¯´{=ÀuGK�«M�ë¸ÌåÏËÄ Khí®–±•Ï¡Ëò%³·dÜhÒÓÁM¾¡€s¤ú§fHUóáÚË‘jÊ�JqtF5M}TÖÍÈã«,GªðÖ�!Rg’°�Ü�øbIì/ fÊ6µMì¼ë1O�º¿·ïëÞ.Ñ,Td‘9ž ÐÌìvn¶·i"©Úp·Âƒb…úBËžü¯’„w×ùƒ ±cˆÞP_#@-G ‰Ã µOvZ ßZq?ó°Öö¾�¥ÄÞÎ\I_}¿~EƒµÆ¬Sñ²)äK@èoNÔ`úF²`qÂ&²œ±œ­“–”lï±à•¶Ì;ýóéój6?Ÿþ1ÀÜMùWt³²î¡A2G±†�à;ÍZ†¾ðuïß÷nCÕxòáÀ¥ÅU:òB8#�¢¬¿•ËH9Íwéúš8�°C¼zŠ‘=êõb †Ë©ÝíÖÈ;7‚ÄÇ&=�yÃßç®ý’G¹“6 Ú­i «÷�ÃżC¬…¥•“ÕC~Î?\¾LÓ¿$6�˜_æ¼xOÃYI š‹¥óBøu"˜ •S»eÅpCaž‚j1¸ +‹×Æ�8Ã�àOéÄ-"7|.½Â WÅñrvq ¿+D{I”òp êE »•ÑU¡é ¦nßsç„E¬ÙÈ«)¹¯ß Ä O%…14^>å—K‘ í÷ÖCÑPÏ" Oo¾´ñTñÐHfLEq©x „$—XÙ}rÌý[Ž}”µ€Cèúë4 „ªœ¹Q^˾îíÛ/(+&ÄrŸ­ ¬˜Åµñù !jÑCᦷVÇpO{Àl¢Ø6^x· M¨ëƒ.˜Â­0²•A�°‡]³3ܶž•g†¸Ö]ÿýKÖù9»Î§“1âÄ\]ŸgÒ®›'XŽ»�®ó4æ?�»�®ëm�iãn£ëÆ0³AÞëÀä ]ÿýË äíÈ3Û�7tý÷/'�7t] jâx¶ÛÑ͘ÞUFÖ‡AåûHÆ.ËQ N…¤)’^ÿÈL�S1sS ¡:`Þ¦¢5Ï´Œ˜ÂúÌÙCCæŽÖ<™a¢ÿ<I ;óÊ„œ¬4°Õ¼d炆Y+[Ã>Y!±Í©l˜©µºdá|9 RïxšŠâÚõò§í!¿|±HÆ¡™îe…@ãÔe+§d !ë�‘T�˜¸eÕwu�¬3‘•zuóÊnÒ2§jDjº;—ÝΡ!4DŒ­çXvÃ8T#s‰ Ÿ‡Gõon¤èÌP§Ç´KÐ.A»í´KÐ.Ak²6ñÆ/sèá¡\d·Ä™Ý•‰Ú1œ{ÑvðÆšß/í—Ýu|5Ò½¸`ÑM» mðÎ&ÏžîÔWQó`‰Áöù¾Ë¬ýgûNʾXž§lçÛ'ƒÈJ‘nŸäÖ^ùF i ½“wÒ­5Zž…ä árÂ=ój(dóÌ0ÖzOØ8Ú�¼Sb×ëÿÇ­k,ã–‹qKÐ.A»í´KÐ.A»­íí á<­­Í édñ ƒýÍ ºñ—*\ É.bnâPeû'Ÿ%¯(ü``–çEˆíAç!Jã’-j41Ò:ü‹ †7¬ª—ùÅŒfæÖ ãŒÐÃͨ»¿4°JÁà¥R'€ÐFNGCÂ,Ì;³ÍÝìo¤Ž7 ûG$íBz¸HbÞEþÐ#S–mÊžNz…kB4J˜cb2D9h™YÄÌ¿„�!hÀ˜ÓšçÈw2öÕ1Ã(üõ^5…ªÃÕ‹á%ð·À ´tÄln$ÐpDÄ|V’¹¼f˜H“ÚÙìÀHo\Ikžƒ Ò<Œþ¶(bx©—ÿ�ÃC¬:;nî3È2(ÎržúU‹6R£Îùf îV?öùŠã%&¶W?iÃÊŽƒµí�Bn&Mô�](?fùÆæß¡”³ƒCŠzvöC�âASó!ÅxÐÆvßlÆ^ÚhgÏs¦ ´ÍiãéóÂïÕ�a–=ƒg‰ù‰~¼©Öw?^-~³-#KîÍ·äe>ä»Oùj;�Ä^À!_¦?œµÌ Êæä™\•ñóNW»fŽñãl·÷à_dR-ÆÖpÒ”%h— ]‚v Ú%h— ]‚–Mœý`šdS^râÑæ~ÈLNEíxzä†9.éI·œœm0Ã]²Ì·ׄ†b†®Æ9iênQQ‚¡¦²’HzÙS´;ŒGsÄñ95ÿ9<“„S\ÄÅF5œ$L'- äR8.…ãR£/A»í´KÐ.A»íÿ+ÐÊ£Œ[�¥{(ó± 8�iˆ²½ˆÓÑjüoÍ9³( ]Ü9�ƒÇ—/ÿž7dþuñ‚–A®–A®– ]‚v Ú%h— ]‚öï Ú^õ±±i4ã‘1L½*z:/éì(rÐM;q^;'Ÿ+Ûù¬Î¸Î"±Ëã¤h>†51›rLf€Ñy™ƒl˜ á–Ì€ýÂËNÈ"t¢Ý=$22ÈQpÄŒcckdªÏnÈEë­ž]g<Ð!œi/ž¹R¾l"}4ãZPn0X¹�'Ë­�'côI{MÖMÔ5š7ù&€™‡ÕXï]Ë&OY=07ùÈ ÉE+³^jÙInD•�öäX”V}}l>ñ…t¢SÔ˜!cË¢s­ åsm=­ßøËŸæHS=^§Äb™}×qøá~/ÚXM�ZɱÇuìºL(‡«Í{åO¸Ò¤"�ŽÜQø~²|BP¤¤”£Ãäª駺K¯Ñ š~ {àro¼¦¡ Yò߃¨*‡Ý¼}Qk4Uëïå/)GuÍ‹³ït«ð^$<«eÆ£,”Ir²ú|±í ll”(ŽJå÷"ò 1Ü»-žeÙ©ÕÉc8_b½Á�R.¯÷üôc¸uçÿêªûviU¼¾œÊŽÃá <¾ùý ÿyïŽ"Ÿ®f)ÿñœÍÅI+NYSŽÓõ¬rú§W í~q»Î¯F~BöüÎþ{ãÞ‚ŒÐyªîió€ÄxãuuÓØß)A{²¼Q”]Âw´ª£{OLk2%f‡?H‚4þ©¨ážü÷»ærß}û‘Ë÷?„Ø\œÊÃOJ[ ÝÝð‚[´ó¤`5®'‘f$Hé÷ý¯ƒlr™÷:¶G Aþšã}¨î¹Ž¿\EÞžn èDL=]ùI—zʽKol…­󀌒Ú|ÁÈÁó_˜ýÜâíîë¦ÔÝ ,úÄ™‚< •V¯ƒí½ÛòfKùÜÍzøç[[n¿?âÆ®ãæ ØÌï_+Ãpü™ƒØ�ÐpCþ¥Cà”WHÁúñ›?¤½M`Ìg—E€àîV\‡)> „NLÞ òCñí^¥Ù�@‹•ñŸJ�… 6Ì�ÿ’AYdRA»Œ€à9Tâ8úÌ!P‘˜Ù Ù¤à64ê£l”þ¸¤¬yï /oOgPf| "›ý\»óÊ.=k´Î‘‰ì/h¨°C‚ Ž.ü[à8UÕMtã„¡o1ÚÊgC†) QÞ|øÏ‡ù§J9 N7uHK3 ©6oUµókêÜÕ¦›‡_®‚NuC®@¼ò„“�´ ¦›ÖRæ.o˜x ÕŽŠÂžl’¡8"RC™|¹Jj+€Iï~"Ô†L”Á[ä„Rúòý1s†~|AF3rõ™–Ž&ÅTø»A9Š¢\7}5Vç�,±õÎ!íc!þ­]Ñþ&*`fŠ>�X‰¢X�áìtìiøÀvShü/{WޔȲåÿ7ÂïP…+¶ ‹Å¢´  �€ˆ"" Rì úæÝ˜˜ùìsÎɬ•¢ñÞx1Ým&dÖ©³üΖUR,æ@òˆÔЪY‰¯FuhVåç8Ó´;<Ýìhjàr1°Ax3”}¯îèOW�+øá¢¨ãLÑÀÃé‘þ”pžVÜ b·u,ð!g\x©dtŽ’¸½ŸN)ˆå•ˆmô.ÕùÍa[s2“•T')Û‡ÄÙ\+©'xdºUrú{-èt6ËÛ‡‹¦3KVfÂÅŽØŒ¬¢cêhØAR€W·¯ÃÆ b2¾šA¬í_ÁKß �7+€pJ²X_ohÂAIy4á´ü‚5­!Ã,Ÿ_4}c[­×ø"akfТM=”Í̧™¸6ųÕ$\8-’Žgs¶¦¬…[_”¢˜˜_À”¢(j|Yã&Dñ*hyLY! qö%LY!jñ’j�(µ8±ùQjгå€e‚ËË ìŸ{ð˜ê!ìP "RòÏÀÇ‹"•³èÏA^qu=ÍŒW1¿†.«¨ñet¢ÆªèÒNªˆ¹ºV'f޹Ψ+Ö )åEkŒAS…â†G×ÐN›í)kšbΦ×óºmPÜK�×C†ÒŒ4¯6¼*S9û¬Ð¦•Άóëns5@hÕ¢¹ÝÉYÃÎ?gU|¼³j’—2ä²bþó:›áIÚVÄ=nK›z9S#frô¥¢ÏTÕ®UÛ‹Bû¾LÉN«¢bñ>`�èCù}Ó"ƒ,mÈeÄü›t¦‹'zb0Nleˆé=`eˆÀÌœ-’kÅñ8¶cÒ qcØ=@~X¤µãÇ3�þÕ>À]jˆ¶ƒª%1�ðGt9C¾æèôc!ùÈ"€é“�òmÎLA¼E„$T›!¡1 ÍbJƒÆ4S…Ç·¼}Ž´b�¾ËkÙ¹�Îf$ÊE˜2él5¦ìt¶´!ypü¦ˆ%4ÀŠšÒô¤‹g+1E,)Û7+ ë÷ÖÙ L)›$ß”a“dU¦´}Úo`ŠXÂ�òÑõ;êì[˜"–PÌï`Š—ßñî´2S*¶èowVC×ï¢3[è›ßÁ±¤Ç™Òïì­Ì”êè+¢KÃÖ�-ÅŽßÃÔœËkË1õ½KÚöÍJèú£³/25µ�¹ SÆÍ¸™R8û¦Ô}�ÑõGg«´±xåõ;˜"–ø-cßÓ[ÿc ÿÒ5ý�ý‡l’|Koý77ü+tŒ¿­Îþl’,ÚðË~Äo¦³?›$‹×ôü/d¾g?â7ÐÙŸM’¯uŒtög“ä;þYyñ?Cg;{;å^~~ Út%\Ïþìkü'÷èåWìfcö=óÿ”ζ\G;5º?Bù‹‹w�û2X‹0bH‡�Ʊº¯Áy~zÕã»8õaM©}’ïÐ]L®mú«š°ê7·~D÷5M‰bÈ›·ú3‘‰ãÕYcgfÙ ’‡Újø@§¼ïÁú®ý]»WW£Qüqêð¶Úx÷É@aÿ¢¨3•…HS¦W{ôåÊPRër¥{Í`|n4ûÛP <•iFŠ:“›FxŸ )˜Ñ�@JÂÀd1b–™=R­¥„mu¬ŒÐäG§ m±~¤ÓÛØjD›=Yò6ÀdõúìIh‡Y+0ð/m �èè{Ž�z:diË£x—É\ûv*ž§V~C³­V¬”©×‰*?•Z $šÍ’s3ˆY"[�q+\ëη"æt_üh.à$3ˆÍ¸½)ÈšFŒ+I(1}6€ª%hçBu®F‹‡·`×ùF±$6?ð|SÔxj8gEo€¯kÌ�·…)úvÖ¤å… wMj??ÜK·±äùRv�cÍåŒb•¦€žèÝOœ ØÕ:¡|Ñ(sr€Ù(Ž©SçL»ÎM(‹ÙÕd€%Â×Ù¾ÔŸcM%¡´b÷ËÛÕÞšKEÑ™�¯„œ‹ÚušØ2éÈ4²0€]ØJ4oŽœ3íjKlYÓÈË™âªÛïÛ[óúÿ(ÊËž¹˜w?�.:øßo~OèPÚêo 3‰}%tª UCƒÆWQjk€C‡¥5YèèTBí4}©°mÕñ]©nÕìd[u¬Üî|Svš®:¾³Ýù®ìÔŸkMª::Y—ä¸È¦oýÿõ–½ïqb+WS–î´�\±eÙm(ÐøJM`bÖ\b7ÎÙľZkÁñ Æu¶[žÔú6$XÃ’ñÒ7X�wž63³X#¶`b]º/&×Tbш-�RFgtÂKCŒŠ›¶zù"D¿±²)�Y”!ÖEÈàדÔÿ¹é°*B–¬Ïì}oº¤ZbZòõúÌbdW /]„àÓ¡í:˜¥2Ätp\ÁF�Mw0vE~udßH^»}›½ìÇÝ ¿Z­/RΣNé±ÔÛs\ìŸ?êGÅ—¨íèŸp–9ˆÒØrÔÝ<Û�^£Úh}ÍêSÇE:üèwHgÎHX#6£ý‹s»Ñù#ˆ©Ž­F\g‡×Ι$æ³6À\ShUc,fŠj®5û{½_Æ"¥³€\¦‘ÊÙ—ä2I¥Xs¶\§Óž„±ePj©Ö\buçLb´Ø–Ø\”Z`yˆíÊ©DßÖšžfÆT¤ØËe!±¯Ë5åN‹ÉvÎs_b‹¡Ô42Ç!–ÔbÎÄV@©­–6Åi7Ò··¦œ1ï”,˜!´°ý¹L#-Ò.$W¢9ÞpÎTŒ=±y(5ÁÊ"8.±Ê§Ëœ¬u9à (5™ÂÊK›âÇYž5©If®¶ ÉLb÷Š”½zûܽM¿XM¬¯Íœ¢‰VÂýyþ¾WRmÈè)HðbûJ<-ï¾Ò·Œû:¥°¬|—ùq×ÉŽ|TnúFš%>ø(úTÅù¦îÀî^á …4¾m£ßÿ¢¯�§…ˆ©‡µÏD–E�gVk(ìÉÈ@&¢mÿQnûY¥�1±g9û’HV¡£ÛŠ„Š5ªh§º]È‹õ´c³þYÀ³¤ˆ"ZÓ†•¤v ÞÃÐ [ó¯C¿mwÀI®Úà3oQ€‹§¾¾6®ø^2ä:0?ÌùºÞPN;Ьî½HnƒÊ(ú´Ó2Œn³@ûŸV#dÓ7óU<[8M4z&ÖjÂi¢á××3áÄ”?t2€ÿt&›¾ó„X¹îçàÀ`о”žÍêiŸÊDÚ¤>Ù|êgÁÉŽ^˜Îæs1®œ¿¶µ#H£ô@ç™ÚMgÆãÎA�8ƒ¥&#ûˆÜèxT� ´¤43e!�Í“æÍ+ûÃ-ùòà`=´²Uy”ØØL`8©’’oFÛ6 …‘xîU˜I X�»ƒ¡Õéy¿ ãzCâ«Õ�öÊ£�*û~|Ræ(s¸GÄ¬Õ /Á6>f®Œ7œ=C�>^).�d¾ ã’T¦˜ L{“ Ç·(öüNs'F{gù¥rV@ûþ£Ò~Gþˆ9|Ià§ÏVQœ½3ò]QŸÖËÙÇYe–¯#h 4iñÅ4¥-‡£ïŸ•u›5XJèN ·1=ã7f‘e3‡©Wº»‚œô ±2ù^¥tDRãè6Ù�9©ÿ¢ËS;­›ÍBâ+ɼU†)}N~ë~j™œà³ ‹&C¡¨fa¹6ùQEñèà]˳ä@ÅÌmt\õÉG²#ר¥ÖM{SËr4Âà¸×ËP­Fþ£e9]¦a#r»YÈÅ%,l³å8å3z©¶¼€´¬›ÍÝ=ä / \~¥ g¤ìd•�B¡ÀXŸô¬iëœHËÚóPØò¶*°’p…èÔÑ}w^ÌÖÙ/�¦˜Và¦BBŸÌa1—¯¦TÖVk ]N‚V_õ1åýó:ól�êÊ)Ò™xôéën” pL:‘¯Ö°í%XTœUÙ½b !ÝŽZ)]ü0ž”ŠÊø¢ó¤.$ê—SÒ籉R ³ôb4€±H±P¬…Z3Pw^Ê&(R'ŒèRç�:5htÐA²73K/ôÍÄÕ•tÛ½Hê§ juÜ]Öp"á늷%P× ­u¨s ÅûèñÂêí†`ÇÄ\›Sµ�"?Ë|¬a¹Y�­OëòÑ Gö5¼÷, bºÎÏZl¤Ë�Èím|7e]>—¤j›u%•&\_*” ÕeW 3_‰bKè¤Êõ5Hñ¦qôé6uŸ4¤5C•È“¹¾ê0Õg §–We“ÔÊb,æ 9°¨&5Þˆ�Ç¡�&ðé™[‰54ÐjÝFGyÎ<;^€»\媌)ë’p,wÖ›ÎûUŒ÷2_R W1OUµ2,Æ£ 91-Åó)Ñ1”åñÙZMV#ðÜ~žÔÒ“ cX³êùyçw$^Á�å_»Øë58>’ ©E•‹•Jª; 4Ð7{¹›8½ðÖïÑŸ¥vŽþEšj©#ÙqQðwÔ³ª¥-<é 3Î^´ÓÎf€j‰T½Èt¢äÅ.Jå4„ £§©Kšå–:¦îo}�§0ˆº,æÎAZd›‚ô9àK€à+EV^”7d¥jäZUíÆ~�oÆ)Ëa„å A~0H^¢ÕÌøô©µñß•Êï{¯ûφ®MqìÆ¨¦=•aª×]PpˆnòLêM±&¢ÓT^JIêb »÷ã•ÃJ¿ yõázª\±³¡Éຄ¢­õ‹�4í©pHc}Úϸ3=ʈ'cy0C�^¼� åÃèƒÔ“‹Iq×÷QŸ©ÝVιAÇzTZ…vƒ2¿2’š�Å‘d•&´€‰O‡$1zã¢x3©*¥ëAj<±œ£E_CãÇ;= Û4.’FÊ�RWXñ}RÂÑÒ£òº¶yã³·¹…eK™üše§)Ï6¥žŠïµ¡ò0Kò[íQ€˜³j1CŸH#^ýSÎaÍG·|¦^DÛ$�1g€²u5|ÎÒÉRoÀF¸ûFmu �&·¡åð¼Ü@عh@®8ÅÝЦ¼••žHë˜û”^@®œ*Wåﱉ�V¶ÆNºëkËúQºþLĈD+äwzÜ]T瘅õ®÷¶H³ ¸ÍÀnÒ TV:üØó†LÌcÔ˜ÖF•–#޵Á©E™ Ü‘½wŽáûfOÑòñ9?6xö9ÀùÈ8ËÂx—Ñ=÷Ú|äwôi¤­(νýüç{Çu�yQ,¶h«Ü ŠÏ�ʹ¢¸àNÖqµýñ°Ø <ø@ÿßKüï™ð´¾v*¤®¡Ð¯µ“Ú¿¸1ùŽëk»[[¥,|z"¸}å­-§ðSX_ÛÚÂ�òãZ§ß¯¯)À?üWÞF†Ÿorç­þf$ü/‚ßO+bo2.ŠƒÆÛÄ7€æXîÔ?„×F«ó&©¼Ð‹Üh �7�Œà<{×øø­¯]6þÕ©7rWAþ “ÆG}ØŽ'£Z½!Áx2 G¢Bãßõ6’Y_ü5Á#…úð­^ûhE®Ñ™Û:Î8õõ5—€?na IøÄ[½ÿ)7r�Éðs\±›Ã·!ß4&¹á öj—\.ááæ¸Ó}.Äaáumû…·áÇúÚÃ|wh8Z(áá.Ás,¸�…ã Wðù}BÎ {ã�@ÀuuÅ".KÇqÿ±7(¹¢ðãõ_†%—;î»"øpIô;èŽÑç_0ºÝRàx}-î÷†]’ßçòŽý�€ÇóÇW_ý®pôØ‹ï<á@$q]úŽýî8|î ø¼.Ÿ?*E€v Ž…�á�"?u GK.¿ïV\⊨Çå »à¸HÜïH�Xiâ@žó 3� ãt=G‚(pކ£Á Ò µ pá”FªPb,¡—°Ëå z@~Ї¼K qðØí÷ù«x&/œ÷Øu`•sâ~?È XÀqÔúÑ ýÆ5pvuMØ Òù‚a8^Õx/ÝH7 D./ýî°ÎÇ€(±³õµ°,#*®ú�Ú!‚Hú7Ñáè/!òÙéËéÆ!ÄÖ×þGèÐãÂQqtä‘|BÞHaÖ`öÎ`MéØC(?à¿Ë0·Æ¦“aÍëöÿ±p#ì Î;öÞ-IÞ€×múÀT?8x‚ÏãÑÀ�Û n�×%°¥’‡¯P¢ÓÇë�?B 4ú'\ø#á_<.DɬBœþ |‰á—zಿÖ×Àò\ü£3€8°¾¶Ô•fû‰ß•X{¯<ÂüÝÃî*#ŠÞ`Oêßw¨ Éb:WvlÎv«Òíû^{”œe—A±–ÁMÓŽ¼½ÀM­(V®«-*Þ’™d°¬�˦?Ëž·‹5ÏÛc‡Ówè:t9O}Tý[ÚOö6rì´ãñu_<×¥ÛQæ˦-8ËèkŒ K¤û'¾ í*áµ{¨ë –Ù~¤-j­ùƒþè}ÑSÑ3XŸ@nù'žÂiúìÉ×½š¨k„cvîP+MT‡¬#‹e�™®Ý“Z±“Ü(Ý©š”i¯ z“�†XsT`Q-Ë6¡:²/Ïhwë® Õ² ëÃ9µÎÈY,æD�‚î¥l â_[ÖÕ%fuµwXL-Vó4_k<ŽmÊ\¤ÁY�S,·ñ²IGE׉I­öL/¬Œ…&`ÛTrÊ´þ øy‰m+ i7 ìÞBœ%òT£’ Ù bqV¾ßq»2[ƒÒ·Ý Ë4´9ïÚ$lb)>TÙç S!)=î~Tæ �> @]ý(U£¸.«nçþ»4ºÒ#ª¬ÖeoÅ«L‡x¤ÞCc™Ì¼úŒ8`I ÛŠþ9ÖÑAÒ_‚›…“`óQn‘Q”ŠºGjZÁçD¦�F8­³@¬à9óŠñN%ûêØòîHS …â} í`Ó=TxâÖD£5pgµÇ¥ñ;‹ Åþ9»ÔP(>äxï!%¨‘�,éXîNﵓë\Ô ønˆ/§OÔ €w³IÝ…ÜòQ‹£œï«Á©À:Ï!{oŠ�Ry¦N@8„�ctá’2).§‘X£«ÒqÈè›%Þª¾ ×=ù+é–¢êöZµ×w®3�²+þ�‚ÚÈ(X€f 8så@q‰m„ ÚÑïÏ:ª:D‘ëŒ(¢):Ümñ";6z§¦• ±mD‘‹Z(ܥȲ‹Å®­fS¬jœÑ¼2»s·9z|á… Ò#õ‚dr6rt•sÖü)œ÷†Ï…ïþ¹êYÞlæ]®gÀ¹W�›mGþ¤Öd¾àÕçÚ�ßó61ˆ@ÔPÂÈÞŽïÜA9Ø…Ó¾¦Y|íž ž”Øíƒ‡XžÚ²Š†ü"5E Óñƒñ�Wï€ïJ‹ƒ‰îoŒÊ6{ᓤZÙ�ÇðÅ€›¦kt%Y,–ÀÏâžS‚¥ò’ QŽ­¥9 �yÚþ`X€c¡-e³‚G �üø-;|Ó±)€oÞâ5ˆÛ÷ÍR?%äBÖ U(ëÞžìÊgÏgÌÖ~ЧÍÿcï:Û’gšöw�ì`/`AET�.EEéHWD®ÿÿî̦nzÂ}¿×ó<ù#IfgΩ;I6û-îì%~ À|ýýý'�˜é�QùûŠoÌ�?uâiÑÊ3Ç%G×Xûá£BÓPÿ'J¼f<$iv˜§{ñÒñ6¥³{txÕçQ¼E,“Ög¸ÿ*ó5$Vwß³(ÿàF{*Á^l$²‡wz¢|ß½ eÍw.�Ùé†Ä’Bx,15™¥ûÅy5q2�ÑÁ\&åÁùfå(w¿ÙºøÞÆâ •ÄÊox-fœÊTÈuç›w3lMN./%…˜'´Iy”߈�j¡Öœ~ò‹Ÿ¯ž—ÌN/“@8ËQΞ|J<¬®H\ô÷Ú³ü5•y+&e_ŸÖ`YëdhÚ8Ýød2pÁ s²'¦'托ãŸfôÛ·»ùx$ø8Kµ}ü-÷ÈÝÜW`�º‹Ã>Ô‘L-E'Ul®Ñ½B#ž™^£{…Œ³+¨ÀàöåìE åó­r6#ýèöO‡;;Élˆ!Q'àÔ_@L=žNCwİPdtÛ¬p¿wÜLb›¾öYé¿hÕ$«+6X™^ÑLJ £U¢�H+/RtN·(?,Ü Ë?±í„ŽT /�Rá_>ò­wç&ÆûÆ3K:d¼]kÃàhw!Õ™Ë`aíàpAÎA2Lu.µ jsZX]q3!æ$fZÓº2UÆ7Ý™ª4$—¦*Ÿ »6Ui^›ËÑÞ,]BÀ`"í´@òæR†|°-X*ö¼°í…mGZ˜ÌÊ£"Þî„Gâ«gCßFðöÙW:zùdj^Ê׸Keƒ¼õw ‡î*G-:HŦ¦¡Ù"ÊÍõ‰VImÝ�¦¡�ïž*ï5äq²Ìí·÷À�.Zñ]/RÙZsS†µÎ,j˜¾âcÔU´%›saqì|ÓÉ4Ž€s:�SO«-Ê`aEÿÌ6HÌ«+n@b ·$]M¦¥dÚt¯¢ 11ç 1ð e9Z ¾é¾¥�`�¼„–°ºâÚT¥m.E ÔÎÜŒ¿¿±´”€��ò@K†q1óï ^ÚåŒ\˜Ä—¥&ãJØz ¯ÅEÚµO_ñü¦dÏÑïC#.? �Ž»q›Õöw?õYƒÇd Ä|„gúìáãÀ4CÂ;³=»ñlÜ}}¤«"‰˜ZF”_ htùv©ºÕ·õÐ4¸ß¬Ý”´}UQË'":¶—Oè ÌO^�®ÎÜÃ]OºW3×*0£·~‰¡êÖ/kX(z¢iÐ×€'[*ø.°i]eNŒ.w‚�Ín•3ŸöÉêz@ç�>-†¯¢ZhFòaûôþ­¥ïÊüúùWŸ¼×§b“ÄØ¦„•»Ô•ª|a\"&,�«n¯«Y%÷ïö;¼õè·fárO_^äºZE|ç|÷a�¢l3Ãr^ƒQ+˜]Ñ'P¡Ìô…w�õ *ÅEœ‰IHà˶˜tIH4fÂÔº"Ä73Å·õÕï§0v¯5TÆӡ뻘ðÃÚ‡ªIbQ. :ÊY�5ˆué(˜6 Q3z$ŽÅÁ"ëîèLàõ…¯ã…Ì�4/Ô¿—�ËcÀ #4•�Cˆ•£*u³ÓB–�l3%ËS I4Uª³ œ˜± Dª.•É )VÈ0à0“éMI¶'OíÆ8ÃJXA2e€™^¥¶ÐC‚ =„úÙo|\•ÌÉf`èmX¯*fÌž¢Ú6dO+œ0ªPÞ\0V° &˜!ç£#ίŒ,@żÖT©ímjÊ€› ìiÆ33½æ-¾—⛵›2oTEšÌ íhyac ­䜩ñ±9€]`)¤g3¦õ™Y\„—Zã<®®¾½æÂÄŒ®1ìˆKTI¨ÿÍkßµúnm3ABCf©…²'="/M�VW~Z—™®Ö3[ãJ"øeN[q§ÂzìÊž|þ®ïU‹êwsxÑ÷5Ü¿ÔÙCÛ<ôˆÓE7«ìÌD`˜ø”óC\êŸy V<øîrûíýaosŽ3|X¯KóA:c�%ڣȷ˜‡ì™¶¼Ä3-4‡…G­�ÛÃjŠ*öt]óLþ<µ®¥ÞäꊴP¤éÂÏªÕ 0yÓЂÓ˜µÙÔŸTM_µ}È;�º«="¶«+VÑ5Æö»W(¦VW(+!6x1œGÅÔ·C[À¡ÑÖŸlÇ?ä뻨ÿ™x%Þ*R gÕU¥ógáƒ]ø|ñqÚÌrµn‹)x�ìÌ&Z<è(À”‹lžÔbº`…aD|Ò×+f÷Pl±¢0¶Í€rÑ>u,E701äÕ�Óù@`fÍ<f!uÆ—‰ižþàd0ZÕé2° ³ÇÃqo[¾œ :ÔËÄ´R4oªTn[‘Ê—ôl*R/;éàì8ù €®�£˜iûÊ¿ë,YáÆßR€#ÙI´9×ÀÉ¢†{à ¦lÎ5pŠ× Ü'$”¥ÇVŽ®€“ —%‡…‹¢Øqœ"oºMCå'˜ÆR€S×´.€“™†{à4kZ§À)LÃ-pz%•#àXÓpcî€Ó�î8Nm.€3šîØNË4g<ݱ œŽi8Nß4gy&l8#Ó° œ�™°9pŠÝgo&lÛ?sœ0á_ pêþ™ àd~÷À‰Ó�e§;«sœ|ºã8ÄÌɤKgÂïlÒ¥i—œjºã8)Ò.8‚œÎVàä‘Ö5pbZpL¤uœ,¹NiÝ'˜ÆR€Ãïˆ-¡?"�´Ë›$Kè�x�%¯±ä5–¼ÆÒߨXE|å�ÓW½×vþº‰Ød–^Üø®³7ïºw™µ3ºÞ=ö~€®˜NnM„øEzoÆÚŸåû[ÝÉì®ïßÖ×ÐýÜàß:ÐþÈ¢|™ki‘k«Âý5Ójëù+ËP˜(ÀÄ^Øöúg^ÿÌëŸyý3¯æõϼþ™×?óúg^ÿÌëŸyý³ÿ­þ™÷`–÷`–÷`–÷`–˦÷`–×XòK^cé?±±d…¶½ïT(™ÔòíDaþ®�•^�MÚjmêÉ`)Õ-‡)mß´L[C-wr¬ �%ë´uzŽÎ´ð›†9m_ôv:LÄ¿™»ÃüÛk Þ§>nCG7ƒ]ø·$Ñþõµ&5ßÚ]%HŽþ+O>àO&- pá1!Q-Í7z×{ª´&wïÒQœ›Ö Ù¯fô豜ý»ÝŽ ¬—èF¸¦ °"rfÏA-)¹H·¿9I$FëÃzdàí®Ùᩌ½ÇþmNƒ6ˆôÛD‘X�à f‰Ÿ‚™® �Õ•µÐýŸæaâ%Ðö]íWAêþ»Sº?]p‘ÓA 6eÁ>f[�3C£ý”Ô$&¦Aþ–äIh8}z£LLN¢V?J:káXè‚J<Ì5®ºž¢Y¢uáæg{¸¿¿¥ßÈfRš¯ ÜëäËêÊüf'¹Oá„ÃM�ŽhDL0þZ­†ÿÒìT’mâk¥ ^ùh¾DB™4ŠAY�VWˆ$ú¯RBÞΤ±¹ðW¥ 3H4R ´ßʾó…¯Â��€o ¸‚ FÙÐÁ¢C0C~õLGÃpbèQÎæ ß‚ŒÝ¬&*W -(DbÝE“˜ 앎®Žø¦ˆ½Òu�ûÐŽ`&‰¤ë+¬uÍõ(ÔÎÚÜ?ØíO€ûÝŒU×OŽ[ÿgjG–<@[˜m«”� ûÀq:/‡‰H÷@åYþ©‘Y6º:ÖŠ”XIMщũˆY±¸øÕÎ÷{Px‰½q›;OBÔXpŽ8}�ð“>–F‘§ºõóp!B}!™pê‡�Í�Ü¿Ã3Šœ3^JXNT®_͉UÂ"±:·¹›MË9KæOéb ÃüaÐw�ÏÎ|g�Hn.¥’ý˪°>�ö=æ7n>OlÑ=b~é7ˆg¸¿ð•Ľ…ÆoUŽ‹œ”èD ö·Í�ø.áì—ëûÝ�à÷„û+‘FÜ«hüVB§¥{`8ÒƒYÆo�„ô�ˆ]¿ºV…¨ñW³í�ßÖD"!#FOάÁ;w½lUpµœÕõz9Âñ­·u_h´ÛŽÃ§cÌ<¿úÂìÁgF¥_w¯cF{±ã½Õ•àKmÀ}í½×&œyã×%!�¬GŒ’Ðß‹…f¹½8³Ï9Š¿Žv§ïF{Éi,ÎÊÅH@‰9•‹ÙcÜÉ’\g¾`Ô¯Ḵ•2Æ„Útabû�~]b6­T#8.ÃÄÈ^cbªÍI`ü„E ~UŠ”¡.0’o:‘‹aDÓ�¬ÉU÷ûõ‰9°RÆF%wrcb¿1«VÊì™)À–*x̶»éäÄ€ÄñgŽÛš¶R¹‡Íêû¨�mâ^*—ÜKVWt©|_îÎÃ�—ßµÿgHÂÒcˆLÉ"I\v� §~ØŒ‹lü^ORô3Î�×X?4Û{Ÿ4gÝènçì`zÞÁGcÀr�sð�ßèÁ×î›°éQOO?;¨í¾‹g¶àê¤ì¼a÷|4Ÿßõë £ð,•‚U7Œ®®ˆ ¼Á¯{ø­bø· ßè&Y›ÏŠ›ü÷ã_Nó¾çEú„éyd3€ËR &MHüæñå…|Ë)8áz)_)ÞPç'G‹ä@| ]ƃyKVÜËÉØƒïÁ`ÕAÈæZ\¸äëð´㌜=r´ ‰¤%³.R�…•l†D¹‰2QT$Z`E~á1ý¼=Ù»H«èĈìu ±‹Fà‡üP¸ ?\ ˆ¥Ü>Ñ%ëO{Å…Ñ>1ˆ¯¸lòôüvVéóO’3¿‹¡ÑIìÙ·ÞùS ާ�Œ.ÄZÂI¢á;bî„“DCßT ÷uÒ=»éwïööÂÝßõ·IžxÀá "�,9oÿŠÒN,n3H‰íuб¸,öKrÕ×òX— ÙÜ|> ´ 1þ3tçõX{€´ gÍŒ@¶t)ñÈ?šhK]Y$Î,J3è¿‘0yµGþ}ÊÊÈrþÖ!ß{}W¸ ¾^É^-ø�ñ £aùkLÍ †ÇwÄT ÀWìëÂ5ÂYn?`f¨Cl«}Ý�¯Ý§‹IBxç…�““\ÓèÎ’këI y\‘¸‘«Ë;µàÞ\øf\'Ü:Ôö^¶§ß„âÃ@PøqçÑ2Ί_½7ÂÙ Wðƒåösô›êãiûA'Š“= ÃGñ‡ÍwÙ·ú™1 ù™8bc€g²‰Nÿ ´>ˆáøÛô¼ä÷Hþ $ñ<$lúJ©Ô/ä¤L°yÀœ„yJHG£~8]�Ÿ( ?¦Îe·Ú˜§ žùçyá¸p&5�L÷�ÉÉ�òÙ×:Ï#á64K7J„Ûã:R„åž[=jªP|Hd »uI¯ð=²ž\`!JGWW 6@Ì.͵¼H—9šP¹ÌoƒÈ�~åY&ÿÊ$ˆD.6QQ¸¸,£iØ`jýì {Ðõ=�ïûøÍ0°ž,ñ�Q˜ü–lCÁÇÝþ`~r€”åh¥Fò”ÒŤL“Å=4OÆre‘Vqz>W…m1çŸ+%.ü±Ý�V!C¾Cª# ¡ÁÈÜ-üÖ_#{Ñ–ï9Ú“ž6mÑ…€3�sötI`1EkÀ±c„™)Š ©1Û9¦Œ“yyÄÈ…½ ‘ñt)'1ñUŠ)÷ÛÁýTG¸ˆ¿5`�˜Á(#xÐ f£ŒUÁÎë=º÷²ÝÏ’¾?-!~Üf08ª‡å9I<Êc¤ŽÂxÄ*@Y¤ðÀšÁš;Ê¡mÑ^c]OâñO]DáÚ'¦ÞQ( ÇË �t`Ó H%’†•é_¨‚e¶M’U"Eè ßùª�ÚVmS×2é f¾Rz:4ÁQ§|Ì1’ûyb ³œ�¬ ²´%äÀ\Ôª5‰h:·-Üo§UÂ�ï;¾çèvƒ¤ÄrJf=€Ùwz³~ñ¬N�0o¾< f¹Þ"ñîü›ÖÄX %s©êP×g¼ªOçüý†Bjþd,æHrh‘js–<ܶƒ øô¤X\P›¡œä€*úâÑ6=:F•�˜÷i„†OÂÓÆIÅ:› 0Þ_L&xJÒ÷üpôÁ…5Ö‡ý¸SºÙ¤?‡|2Ç/ÀQ è“JjAÒÚnª åvI*H(¼\7`D[g¾d«z¶�owƒ�pb›‹ï{@§Ãï[�¥Aª.–²T÷ÐÜót"úM˜‚mÒ)©¸G¢Ý+N:ùé%™T¡obâ¹I¼Ž‹™{ؤÄaû âð ª°3‚Içæ›�‹½Æk°q÷èWNý©cŠ^ÂPFZœÿm¼ƒ/4Ř«‚d‘M?É"MP%ž÷>ˆ“¤¤¢Y«jW…mz&a�¾ØS™•O¸­i,.ÕÀ“þ<æÞɦø!Mløy€4êž(¨ÖÔ•F.ËZ­J†Êžã$Žˆ ö,˜Ó}ÏHÌÉâäuúT�pÛ% ·òˆ×@•ÜbÊÃ8Œ ER¹”Pä¡5Ë÷Tx“Æú4G¬ù®+ß#A ìì;—2¤Ã'”î+±æÑ5a~«0Àèµ"Œ áOæ 5ã§YªMÎß­cû†ß·`I ;R¥ �˜2«[ýJö»Óià†ntv¤È9Rô•B5æzüÞVfz¯˜ÈôâûƒB#K7µ`–Ày;¿p ÑõMcÏNaêÉw$ærüä&~⤠«m�:G9]š'âž<çpI2ùØÛ²“l^Bƹ ™3ã”ø�Ð=2ÓÙš�ÜÓ ¤I˜VWcP|œ¤¹íТ îöŒÞN¦åwœ)æA\S"!M•p9“O5„9!ÎejSùžn®8¾z&ÿ¶ÃX¸h²à'õÑ>$ ‡Aýƒnà³\¼0»:óß]MàäµÐèá—8Ö(YÂÊz–WšÔ„�Y$ú’´ÿQ.¥rÉë8N:+÷Gñ±…Å ½“žCæç2¤ 纠€�b¤q¿s3Håo¶hq‰Æ[¤¸8Üà¸×A…( ×Ë�…æaoN’çwK|´”µß÷ä!FŽCÃõ'ræ”g”sp˜Ðxk·E¯¾lS~c(W¢ÃyýÌ7Á=þù1+—‘>2‘Šc<@€ëç}—}˜µœÇö)u⓵/Ñö�ΗC8žül\Ë}ˆ·»dð“2�ù A=±Ñ‹±9±>!í§K°ÐÉ�¡S>ì(¸crï.�‰O¶ûSXc]9{G+6ä-^>SB<)ì Ñw“¤£Ë™ÌÁ³7Ö:‡(#OÖâ oq\ƒ�}ò1v¢NWl”lÔÉÿE›dº»0gÏmÒyû.Ó»Ü)}œù®»Øô¨¼êߟÏ6B\—1NþøH®¯Á“;ä÷ES f‡=ðŸaͪ¾ÁÔP51‰Ó­õ Øâ‰!*6ŽŸi¬ªyÞGÒ÷øÑ�¤^´�«ƒ>v¤I\36iêý¾—ª�u’GÅj ùvŽÌh£<¦çLÒx€Ì=Î<°ÌýÛtµŽnÍ9s è£1þôÝ žè©oñÓì0³ Ý{¦�·Ž¨P½ê”üµÁžøÐ˜ HP^R;;î“1|×™“ß*J{(C|ñ?§=Ô$ýRÐä °²†ö�sO'“Ž:X¡¾$ÓŒÁ[.~O «Ä7‰¯ù„{ðŸ½ÒCâã Ù›Â<֨ʃ·LܱÒºcU˜b6�+Š\6ã�“Äà¤Ùóó!¹ÏOæäá­ÍîCþˆfÖÍ@A~¢Z‡³àGFvA òkPV±ŽW1[ƒPE’ I®÷ ‡÷ˆ$ÃìÔÓÎwaú( &FÁ$�„ydþ0“Òq牮�ccüÏl„¥B�1m©@@-Uˆkùí¡ð'²ÆI`ÐÑØHju'‡žÚA»Ÿ1ø ��ô�‘�q|ÔcíAœ!OcÏY¬Ѧ�ALíwlH¦«KQA\áÍgü]EÑ·®¨™%ýCHÖCÖŠÆuÆó—ÇŒˆ4áMÁ¢¡,y_N(P{(àpˆlúiì_ÓTö¤ë·—£¼ð\ ž­MäÐHƬ»ùÊW§7¼l•cæ9ÒÛßåñ¡g5²ßRBŠ:«Eü–«Î¶órè‘W7®Q»Øú‹´Ýyˆ®ÕC¥ÊZ×?™FGò$E÷œÑ×r&›ã«|}yú7teù%ÖŸ�'¶ ÔQ@Ý •V� hC7¹½1;7×;Ámô]²ûÐ}ŠÜt’RÞ4K*;»:jjD†™­°ÉÃf·ÛßLz&r»ýÍðêáâ]ù/æÃêþ§´Ý�6B×��'Ë ü”d‘ïü4öÓØ?»±‘üvÈâ¤ôg‡påé'„¬þ«ü áxý‘íà¸tZ°§õ7¼Ë|î%K¨g™ómÉßùÍ@ ‚œÛïTß;´tuü«YS¯`¸N¼ŽcŒGÙó¦]ÁsÛa9ÖyïwÞžùoï@ŽWZû`½Àõí»\Þ¦£v·ÐÝG|QU© nÚŸ—CˆŠ 0o,lÕ± ?�ý4öÓØOcÿöÆà �è7vâÙf|�>6lÒ*>¶yc‰¹$«�>¸áæVl’Âm@¡š£vtÆC5jG`Ù|Á®´?Ž '3,/™ÚÃwyTñ¬FSULÿ3݃ŸÆ~ûiì§±?Ô˜I´A·g˜ÆâÑÆò’e¼1�ŒeHðûV- ØòÒD�O0…;y …æ/¡0Jò�VÙ¼e€€Û®p–ÝM˜¶¥õì *®IàZ�y¼ñ�pl¿“KBŰ`óë}µ‰õÂ:‰ ÿ»R*¾§•šoÅàyëd¢KÏ…a²ýÒiæZâ5ÏοáGZWîì~Ýó+MjP8ÊEÁìS¾ªÔèÛ}ƒŸMcy-µ‚YÑëëŒpžßú§£llØmŸ[>”–î2츒¿ÄG^‹['©Iõ´4õÿ~Êyi»Xkû[ enÓPR«¢KQ?P&é‘ýñ1µÄG [AI0×ê´†ÇãÊP´ü._`…Ñi'�ÏŠϩ"ëÊš–´”¶�¬y-HÍcŸ®³l—°gÜRåî@êl/.ÝW ; œ8¾y¼ºsj,Y—LƼ8X¶TJTÓcÝ©x7r¿5Õ ¼p{"4FKè]¦a —8,ÄÖÝd¼Ïù“Ý­¼§ý0fC÷ÎÛ0‰Ym§1Ò:…õÝ\NmJ»5hi·lOŽƒ<&jõDMñºCö›¶°bM6†¢7¿¾={¯ ^[q#á%?J[´LhÅðŠ�½í^ZÚÝ-´¥ƒéw–C¬t/L̺ uZ-:-Þåå%ËN‹v9�û5†¡y¶ì²FŽçÙ²ËdÎÌ:� jr!µªÙ_}zþ˜­¶eå� Å8g¡lä°ƒi…9[ †iƒ²8èf¤*˜`,`ê|Ší'Xilq®P'X³†rÁ^€ä�ï2å3÷¨0 ÓHoÍÿ0hŒÞcu‚y‰8·¨Pû¨Ð8{îQ�]æõ3Ý¢B¦ *´].”R’tä C×´úÛçZ²¨¸ ¥jIгð¶ïuÚyÐt;;}[í=Ç eÚ<ñ��&ÔuD©ÐÙåEodj�hÉéýÕÁ/ésõ3çñ®÷øEÒö¹Êü…<ûÅû*´³Çœ"ï!†(r ”†`KÑïD"¡ïày{²*5š¯u‚Íê­Ô[¯>n/n®yíÖßuZ¦.éïÔP HcÞ�aѳÿ8¾7ôWB¯X{ÏP£�´(ÉtÅexí¤söâÕ�OŠ7§þbД|{¥~Çv¥ÄÚZK¾X“ƒÙçö7vtº1Üð“™8‹¸.BÏDiË’´pÎiË’´ g¢´eIZ´¬ÞP’òý–÷³}àåRÅÓŒº°2êÃmŠÇ³ÒÇ‘~˜�Ò+·ðš?hÉ6ܽ;Õ9,‡Ò‰Ì9­FOç‘•ˆç®»7qmQ×�ÌYÙ÷Û¿ðÛãÄÖf’@¨¢ê¤ã3ø|6=‚|[*LÓ;AÒöÝq‘ºóûžÓÂŒBp£[­oü{*Љ‚Ö ÔqÔoÛïiÐ@Ý)­ðŠgïv§iÇ Ç ÄÇjO:Æ©QÔé–WVQà \7•­F¦*«g�•™0h ùX©‡qÎØ³™ZïËRâöªÌ0UKF¥æÚzaF“®º7DQ—jLqDoTDña cJ‡("-@ó¶Å1e†(;™`êÚSÌ‚ÞGëã�*zhÖS“w�iYÎ í·5 µ² Ýöã9Â$§¯¡³Ñå¯,ή¢:^dÒÄÑÄjë;Áü¹ª¥êрܕ¶É€ü•Œˆ¯¡ñ¡îR1ø-É,㸚žòdì2�¡<\#(r#‰„=Ø_Â|ÅßZžzË…�rÓò’’ìqDz&‚${-/ !ÉGÔ hgŒ„8Ór’Fb¹ •“Ü0’>ª#œ´0#�޲¸Œë;umåGLÑ][9ÄãIö8â!¢C$ÍÄ踀8•ʸ7–¯Vÿ{‡þ™;t©ØbçÏü{Òt…®IJÛáòP Kø²½hÐ¥ú`3¸TîÀféR ˜¿‘Tn`%x”mÍ«›™B!C�˜�)2„�Ù³3…B†ÖPìLátD®–ûü·ø=û�Þ ÷©ß;CÙ)žÞ"ÿ¹c;± 5‚ÔòRëò°§-í2vñܶUÊ£sFðqÇ3ÈìD¨»:ŠŠ&`Èõ:`êÁ˜…©ù=)çM(f”Çðs3É8|„zHϧ§“ž¨'©úÁíx"䋜%º,�íð”Æ(ŠÒ¦�%ý$ä¸U$ñø^föH6HmIU–ãc^®¬ù;mý¿Œ›Ó4ib¿g¸ il6B¹”[°Þ†©“*ϽÀéh`à�D>I±*·«ˆÒššo $rbæS„›ÅOGSrn¡Lõþ�Êúã«òD·MÓ‚d¥B9Œ/{0¶ùÇ\G(¨{«=é I„“¹Z¨’™XOXø´ˆÄÕQæ¢kÁqOQ~Îé|Zö¾)evv¡Å o'»ÆÔò­°�ðU(o2|yí쨗dçA³˜¢éaHÁìÒcTo/Þã:b)¤éÒÁÖ)^PçŒM’©}i ³d敤Vë6³Žòç©H¨1¦¡^É^@É)•(ûh†©®­+ÍÓn»|£é¸’ÏxNÂ_C¢Ôù-ýfæ�÷ì#3#Ÿê nhÑÙÔ(®Ò'í…U�‡€xïä_ò;]U‚êd„2©�,@÷7Öw+Iݹ\Nî©"3ËvÜ`«ˆžo߯}­#Õ�Àªw%cv÷y…fkQ :‚;ª�ÌäFËCí®›Xë>ÊÛÚ šÆ 2S6¼¬&éu†É#s%÷Ò[�‘fS^.iæ17ŒD÷ k8É #q7Tá$7Œ´í(dsÂHÌ:™†lÂŒ¤ÛÎi²™2ÒlÀÆ#”ù!›IYúž²9ð‘ôq€]ÈæÀGÒø´sB6>’š§�²9ð‘ ªs²9ð‘ÀÔ9 ÙøHËKÖ^Ò0³u(DF&s¶8¡©³È “‘6ç蚌˜E7s�ÄɈ‡;ù#k2Z^r’?rHFÚM“ “”Òz—cÁå%ñü‘%™Çè ’‘6}㚌˜{ ”?²$#­vMFèR æ�,Ɉ™:¡ü‘%‘Æœ…l—xtÏkqë1ÿãmÿxÛn¼mí:Ø$Ö2dÒ$#µ¯Ò‘âÉÈÙe{²MFj~c:R<É™Ö$)žŒ¤êdšŽT¸Òq2’ª“i:R<‰Ywótä¼d$=4˜½ýÞºÿ5�Qô¤Y쥮ç;Èþ³€½?$êm‹¸YÐØÍó¦UWjô;�4ýÛ¸+†¼1^•ɤ±â¶PWfó´†ò®ÔŒ“Í4WÛ¥1YÝçÈÂ3ÄŠ¤ðHXÁŠ(Îô+¯.º2×ÔRüsºb‡³? ZëÆ‘bÚù“=§1Y÷ÖQ±.Ž“±Å‘2»Zí)ósÛHùÛ ])Î@ë)Ö�ɬ¤Œ·ØwªíváNrw´)_C ß¹3lרü‰»ìÝÝ•låx×ÍÂkºÆÒ‘Ó�Ù0´�ØÜ®ÌƒâüÆò^ZüÀ‰Ì1Âb$bFAnKEXÞžD8Ÿ-æó™‰,ÄgŽãM{y¿ôú.=µÓ”ÏSõL†¼ßl•1‡é’Ë^~çbÆ×pMÖ"�ÍUZ�?wR�«èÂüaÒØâd�u¤¶CHÑ-Ë™i¹,ÏŽï‘//½1�+¦U¬�9ÎøB�9aZöÇÒ¬6á‚]qÖ˜•ýrŒ`5� ØŸŸpç8ÜrbíÜPa'Ö0;jÀÿw=Gqùk|&îÄ ñ™ Š™4†$òÏ’W÷BÙíjµwvž³'N'†%Iw1±3ƒâ�NlÌœN–ׄ­“½;«æbá�ˆo³³!ƒ"¾T$äˆÅÔ,`2gsa‘X¬² EÇ‹5¦K;{ß©„‹C¬áÜÑvÙ˜Ÿù6ÿŒûè@â3úÅË^ RÌ4`a_Ԏϲòé·Rb¬˜x� Ç®c× •µYc #E´ aA¤ü]кAŠZŠ•_i)™ÜÙóìeWÿý0ÇSÙyqâ4/dÑm'X¨1‚fÛaˆª“­jÌm̪٭Ïp9ëLÞÐctܪf¢“\·ì)Y\ e>Îþm #åßÚyHqZŠ”§ë+¨¥Z³DÊ¿”¶…�ò·b''ªl�” hm#a3V±EŠræK“ùnV*fºç¢1Ki/ µùWc'áèg¶±Ê(èwÚ'É8W�˜ÕWŸBÉ|z�[�Ô\Ð]1[�q—<¶•¦€»2G‹ú›ç®ãWîÊÜÆDÜ•ÿgïÜ¿ÒV¢=þ;kñ?«¶ÚZ �WµU@P¨‚ÏVë!*Š@AÏ9]wÝû·ß=“„Èk&ˆ=={�.’™�y~÷žO‰]bèÎ+•–ææû³‘»ƒa`Ü¡¼ §e’“H÷�"pÚ`9as(/Âi=äÄM‚ AI±‹ˆç fî[EÑ"Ù Ý*]¹ìÆ|DdÚz^DüôŒYD¸7b,ƸDd·Š&ðÄ’‹ˆ¼–ž‹H= /"A1‰ßK"2ɇ&£?±ä‘WÖ3ßh›m“ã+"S¿ïZD^ä¡É¨û *"¿‰ž¹˜cÜÚ¸ŠçãOQB÷�"ò¢MF"%Ö}§ßCÏ|QDy1|ùîp<6>FÏØŸòbØÐLIφQD$>bˆW´í%"ÑŒy…î\T„KÏBÎk7cÜ"2y=ã¦"#"�E¡"ãz�ŠŒ¬½1cQDdj(‚YD^NÏ‚74!ôŒ›ŠŒ˜E´ŠhÑê­®ÊÍǯ?ÈÿHõÀÇ|·6÷G­uiï¾¼ö³øææ™sj„_ ÆÜ;Áù°Z´G`_öYª(6²ÜÆ�4ÏØlì<~6_žºØzÆÇ8ÃÇÿÆã«äqpB3O-òž'ú£Öޱv7Æ9S¦+Ž,3å…'m„™bOÚA¸Ò(œôz«³s½·?fÙ~%êýÓÞH{§ðNȳ—_�yº W`Ûžf‡]�/Û6œÐýêŒv¹øÓ~m°óÁC)0æ<ú~Õ-ÓXjå¹ïvŒgO¹_t¤fÑ,׌©­«K3滑¡[‰ŠvG¹°µSz\}¾yÕhÛaÌkïj¸¶ô EÛÁÆÈÖÆ·*#e_ôAO³ýÐ~ã—s­#ñâ¨w!_UÙû…— (v¸`‘IFcþ›†é>·R±}—QÅþ±BX¦ãüW¤—°Œz'þ0t1í�°¼öFÌ[XB?ü1–û¹»}yè&,aå U=Vc¾Âøÿ¾á¹õ=a› �˜ÄÍŸM#�ØNÙròª0.(Öˆ©L/<`�TÊ‹<&R±å¤™Ÿ_>ãÜHDc^Þi¿ÖžÂsŽœ"ò"Ïm³Ä'ž"B¶;C2EDp»ó§nw¨ŒDY÷=‹°³K<"2}VD¦ñÜ6Ÿˆ ëÙx,Â´ØÆ£í"úÿ±ˆÈ«=ç("Ó|n›MD\õŒWD�mÿÇØvxáÇ7LÆ8D$P‚õl"|äuõ,PDÂÿ/ËBˆHèÿ o¤Ð�GD"¿ÂdÂ(‘W×3O³$rä§"¬Ñ6‹ˆ„6FDX%hJ(Däwѳq³cT„3ÚF´Šh5Šˆ ZE´Šh•ŸŠLAϼ[ˆhÑ*¢UD«ˆV­"ZE´úÒzVD­"ZE´ŠhÑ*¢U.cˆV­†\¯ˆVÙEÑ*¢UD«üTdDD­NE ZE´ÊKE¦¯gœ"‚h•]D­"ZE´ÊOE£mD«ˆV]¼O¥­"Z D«ˆV­òS‘Éë™�B´Ê."ˆV­"Zå§"#"‚huÂ(Ñ*¢U^*2}=ãD«ì"‚hÑ*¢U~*m#ZE´êâ�x*…hÑj°ˆ ZE´Šh•ŸŠL^Ïì¢UvA´ŠhÑ*?D«FˆV­òR‘é마 ZeD«ˆV­òS‘ÀhÑ*¢UïÄS)D«ÿf´J_mõþ8‘¨¤oFäÄÛ¡pT�Ø·œxoø9 «Ÿ1þÐ="׳Al|¤ÕÝ™ÉͬW²gñ˜Ôú<;ùµ¸QeÛ6æÚgÄX”(OH¶ƒ�1¿@™7 cÌËl¸(Óyf¼÷³²ü˜mÉ÷Úy|É¢_ Éh _²=Úf2ÆØŽ†î‘[öÑô l½€+°å0æØŽßÝñ÷Dô%‹^‚7þðÆŸ«°\‘WMû¾q›éÔñXøW_f‰Ç_}íg1ÎüâpŸ,ñ˜ç·™Q»bÿ1(Â_±'îPXŒ‡‚~Þ‰çÆßDÛ46Ŷäy*‚[±Ma ð9”PÂ26‘‡6± þ½?”ð�ù4.`»Ã%â1ÿ7n3Uï¼ÚÆðÎk€C‰à�W¼óÎÞyÅ;¯¸ÝùwmwðÎ+ÞyåüQ »ˆü.zæ{ÔUÏ�m{Šþ¨…]DðG-ì"‚?jù=ôÌ»…ø£–WDø£D«¼TdúzÆ)"ˆVÙEÑ*¢UD«üT$0ÚF´ŠhÕÅ;ñT Ñ*¢Õ`A´ŠhÑ*?™¼žÙ)D«ì"‚hÑ*¢U~*2""ˆV'Œ"­"Zå¥"Ó×3NA´Ê."ˆV­"Zå§"�Ñ6¢UD«.Þ‰§RˆV­‹¢UD«ˆVù©ÈäõÌN!ZeD«ˆV­òS‘A´:a�hÑ*/™¾žqŠ¢UvA´ŠhÑ*? Œ¶­"ZuñN<•B´Šh5XD­"ZE´ÊOE&¯gv Ñ*»ˆ ZE´Šh•ŸŠŒˆ¢Õ £D«ˆVy©ÈôõŒSD­²‹¢UD«ˆVù©H`´�hѪ‹wâ©¢UD«Á"‚hÑ*¢U~*2y=³SˆVÙEÑ*¢UD«üTdDD(Zm|J¼íîÖð]EÈÏø�)¹¯ì�µfLÆ"A´q²aÓÉlÌÏ猇 Zc¡!š÷ÞÉð:ýÝ�O?‹onžC¬”H5c1Æ,'CÍŒºóŒŸ�È ëÑWN&¶ß$rˆ¼Fä$QYjàNxR‘㟹~èŸT«0SÒ7¸Ý‰2Sþüí8žý£xŒ¾X{2¯ÕŽÇ˜Þ™=é—`ûX®YÄ×j�ÔläµÚ*tæÖÞö˜”8þ™·=V;+ªÿ.rB5c12ìóh&_Ø7b,ZØgÉöDî}xß­æ®,cŒØ¾ãwío#3å¥b�è€;ÊS.¶.oã±Èl*L¬Á1SFŒE£˜L“6hx|Œ±Ï”›´ÞfCÎ2Ï">ÛÅ€VYö,ˆoo0eİ7w�’D{¶Ë.áà´Ñ ýÔ*‹±‰î(zæ‡ðÙˆÔk껈¸è¿ˆ Ûþ/±m&á}j•ÅŸˆü› 7y%= !"ÁzÆ "ŸZe2Æ&"á$ˆQÏ&BJ^WÏüD$´ž…„$ì"ò{è™›YNHâ."“~j5êÍ[D¸$ˆQÏøD„‹x³crzæË¶#= ŠüŒ]Dþt~fŠW´í%"‘Œy…î¹cúÒ(‚_D&®güTdDDâ±È?›E´ED­"ZE´Šh•MD­ò‡îˆV­†3†hÑ*¢UD«ˆV__ÏÜÌ"Ze_÷ˆV­"Zå§"ˆV­†D«ˆV}ô Ñ*¢UD«SFˆV½PáâˆV­"ZE´ŠhÑ*¢UD«|"‚huúz†hÑj˜õŠhѪ¯1D«,"‚h•]D­"Z Ö3D«GˆV½PáâˆV­"ZE´ŠhÑ*¢UD«|"‚huúz†hÑj˜õŠhѪ¯1D«,"‚h•]D­"Z Ö3D«GˆV½PáâˆV­"ZE´ŠhÑ*¢UD«|"‚huúz†hÑj˜õŠï*B~6]~æþ4„$I\T…y¦àN˜}¦üûw¡f nwp»ƒïßĘ–m¦@L{!_UË[¢<[ÞÊ/[/†vÎ$ùþÃu^:>¹ZƒÔ㙑êV—è±üÌú‡µcéøôa1£išRëkfª’=IE06n ÖFJ�”�ÇüJUeÈØÚ1·±ÒãZ^)KšÉ_•Ƽ̮¶ú´m¦oUR7Õ°3%ó ¦™ÒX¸™Â4Ï'­O CÌ”ßcÒº™µŒ æJ”™<Ïf Ÿ1�™ež1NZÆ™â4æ¦*¯2iiÊ4æ©*¡gŠƒ¸pMù±ÊGQÚ±±1äü{”iÒ ��1ö™òb“6„ÿ ž´t®´ß–«›óßÏî÷*W4U®–Þ­0�ˆÇÌS�jº·R?:ëõ oõD¢2 ¡PwµD[_ë3ë ½]š‚;WÖ±ŸM¹{´%ÓÌt„ÏÊžX½¾½O¬”^ÂùÕ¹ncsþ >>\ôg÷îšÝ¥³ÖU·ñåC]Y~T/äfC½ïõ6n/h«`9™íJëo¯ý�µÓ %{?û½•éåºßn)-‡íù>½{§ŸÏ[Õ³írñ'ToO³S`L»ƒÚ®•áØûczÌ?3DÛ,ÙÇ3ïŸ'.¾~üLë 5+<åvàT�tìR²­X©½]pB�ÚšÞÊ�Û7£™v̇&ÝvÊ—ãÙƒ.�yôigŸš�™­?—/wÈJ:“Z ½2H•gó�;3µ}OW@½ÂTƳ„¡gAeàØ6¬¾Ç¹yšmÈÍη¬Ô:ÎìÎ≞:Ø¡¾£> á–i, 8=hkþÎé<¡‰¶�²§¿þ0$èNý¼à8;ÜVCi-V¦ÇHŸù�é)ÿ³†l\eYz(mnRhVùTºô£íôê´ýTDI¬¢“Âõ#�‚Œž¤¾Ï³³i¥Þ:\â°‹¢©Axp*]º�wœ%ócFË·�†–jªN4·AR—$t¿ZsÎl"ë3_Þ]Z•ÎአêÒ½ ~óÌôÓÄO œQ·ôæÍ…áìŽ;8�PÙveÃñ0ÙoñPvùºMP{.+ódE6�¡·]Ý-Õ{‡cœw= =± NM<„žZ«$ÞÞîèÔ1›l„9½m„=ÌÊ?ðlMcÒ–èû¨óØ£tcõrR˜[ÉÕ·7ÒýÏ…ué2õù@™)]¯Pc_?:½“GjØcÙ):¸EúaÖÌéàÌÔíqk'X8ò]?/©O¢=Õ¹Í6Šô#ëlÏŸŸR·îôw«ÚüPP°pN7�½oÏÝYó+uj­µ�vl£éŒóÆ">·URûÃ>A�Ñôá'o×ãyÄ !„én�C/wᥞ2qGÙƒ‰˜)ª´�¦cÜX<ÜO¬Î�Y3—ö.Êá_ŒÙÓ(�xgŠoFüøê™;×ã½ç[|Øñv(žíº1=–é�.í¯v–a‡â³�0׸ïâc�Ž#éa§h{"{w4”ª¸ì§Œ³öQ[¦Wiœ”½ömUÿ>16¯í2ÝÑxÊÃbÀ®.LOI�ÄWP»Í�$Ú&fv3W掊Î.�”ÛŒtL‰Æq°ì%ñýÅÀ¿”«é伹ζ®*öÞiˆ8Õ>:[$ŒÄ¨ÿ¹�¯õ Y' ¿çŒuÜ…¡©ÆEM=¯¶ˆCG?’º²U•|l‘w­Òö`Å5È�-tbsÿÂväã|¸`ÁG:aÛDÕ•l*,—aøØy•‰å½ÇÇÒÇu&”�EÁŸ/dì¨$-¥û½^oëÝlK{Ýn¼øVÚk¿?«Ê…ËruK�}#+K-¹»ÝZ£¾�ª&dîïΜRG3ë‹‹ëÐgï6ÏêàH¿$äû½Ù3#ûúâû†Á#JofKfA‡í•9Ȳp,íý|S‡�¼»#=¯ÓP ¯Á©»…9ÚÕø|)eUywݾ1.õ°óC·.õŽ8ýÒ!ÍןÝsD±-Ù¼nß÷èQó*p~»Ó¬Ó ÌWå’nž¸›oêÝ”ï¥ÛËØò ©è! CáÏÌæüÓ™Ôo•ùtúd*¯'–ZG7õqóßÌ,©'=‘(ÝCŸÙµ˜“ŸæjVËk*�é´ã̆�‚ÐŒ®Ý Í÷«Öh·érúæÑ fi¯NPgg�>ŸvͦC ¬ »#×6@|øøùߺ^רíÿ}ÀÑ®Ûïtk·z¿ö—.ôôþS§³ÿÝÜÜé.ý$ˆÊùÜÜ‚ðYˆÇææÈ¡Ã^­ÙÒ{ñ˜uò¨ðÏúšë<·Íöm®óœ‘È?ISEQHŽB»A2å;��zû „÷Íú“p­ß6ÛÂò .ô£¡ßz»AJæÈyRö@zîÆcËú_ͺ¾¿™Ï]¡¯?Õ;­N¯ß­ÕuaÒýn6—ôêwÄL<öø«OJ õN»^{hŽ}ýÚ|稙i=K ä?QèCFÚøR»Þznèûz¿óÜ«C³o:í'á°ù¨÷—ö;�5XŠ”L ßvÖ vŽãB2nÕú…ç^Ghwžâ±ÿ� äÛÇ¡ÒÂ))žRaIÌ--ÈŠ,œÃÕW³é¢ªªÉ�|²�KBZÊ•LZ“’yø/­ld¥¤XT²É\þªI‰þÕÄ=®ÊZQÕDQR3ñXQIg“’"'e5£¨jJ)(E5—Tɧ’Ìæ3iò-•UsÅ\rCÎ(bŽ'U9�”•¼”Û( ±�RPsª¥6 ´”Tä äØ 9ò©¤œMB¹\QUI-¨Ä¦Zófý3pFÕŒúC_´ µÉæ³yM#v4°¦IjRƒK[…øŒ¡_²É¤¬¥ ?è ê.A‹µŒ¨È2ÌUr¥4\7“΋*ä’ Iµ¨(ÐFM+�W%é|z@SÔ¼Fÿ’›kJ‚5j}öª’,R¯z#üê< 7ûwD‰xÖêõç¨+ ÆŸ[O}Xw=ª™ ŸMPâ^­}« �¡«÷à8uˆwIžšÐU&‡¨Í¶®7ˆÍÇÚƒNô5CåÊð ç`(®l90K�L�F=(‘K¤M7BuôÿK·Â·‘ú]@ÿƒ°ÀµzØH#Y–‚¢¸k’í¸KØ´AqÙÖzu'[†%gwóëKr†Žìµ(Ðby,qøÈÇGŽùϸ[áO2^°k@¹±+Ä5 Fäs^ÈçÉÌ»v¤s·ï—Í0ôÌÁ ¤�ãÕ¸´ ¢Y÷.jÙ¥ñ.f‚ÄŽ<UÕ,0” Ï«ÐpûùØpÍEÿ‡Ñ牘 5E`ZÍCCígoè¤Ú•î¢ÁljPZæG¥Å„»ð¬ÆüQ†”¢½ ,Ç�T9¥Õ!w6µMÔÐÒÜ7’'ÜêŠòº¯±,ìöí¦fÁÞvh–=¤R¦2©£:5^¨¸‰MU®G{Å�¢¥û„ ô (Ã5ºE¨•r†=T]¥§uïª<›³k¶+Üæ$U�<Á %æÔ`æBZHéáÌÆÿ嬽G#©üsŹaEéOÐ�q×ÔP•3a9[ªÑPØÂXñ üÚGåMâÎiÓf?ê… ÝB)…e®.¨XÍè\peÑ0ËN�ŒÈä|pæõŸCJ?šP5 ‘—tÃF%�­~nV >BÓ™Å3JŸiWS}xdá+(¢ÚñÞ¢f�&·X:† ©Ê mÑCB¹&Íí€Þõ{ª$xÀèªíPoõaÄÚ+®¶¦!.â1ãfÒn_9KxØCã¸+r#¤“�QqAâ3<á@'‚þQÀг"›�¶˜k°h©º“1yÁŠ«<2žK´?wHË*<@ðl ûºí1^ùCò,s2“×P�j‘-­ÝØÒò (—ûžþaˇ¹!˜ý�WU˜…ö˜/­ê±¶8×8]’Z }•ª4SbI&kž)ûÇ “Î7wX r®^ Ç'®ÉQ„‰j:ÒÍìÙ�9š¨”ÓL öjH?7õ9ê±ÈH‹0æp”[0¤4 !!±0¹†æ+M¡ƒ ‹ âq_}Þ·8ƒE¯Pm âÍc½Ùu 3>#�¶Âw»öàõÒqF¦6)ïÈéŽö‘hÐyèîR&;rüø+:ö8=+62ÖK wÜRç'‘”2ÿU<ÐeT°VAžòÛÇDz‚MOHó$?ø1§ŽBãcNÃ9O©ùµi†� a÷^­@©E¬ìÆV>°íÖY¦¢ˆvOkºvq±ºò¥tÙµË?H7~¯/ô–¹¯ì›w+ÿCèFÌðøSï"K0Û˜e~Ïn†—áÛ9CÂG�^ŽNM�œ©¡ð÷Üž2…œÊøÔ™;(t¼HçE÷ æ;Rôöý™5*ˆû±n·AîÑì�áÓƒ(’ÏǸXÏ?´ß@<]‡G…é3¤S¸ÒjTŸÐÍÄ…‰Ö#|À$?õÓ Ã¨^L–éØWâÂVì’™d¦†” Ä‘.­ÏÅQ:¡ãÈÏrÂÇŒЉvÓ�–ÉÜÑn<>íO´‡Ážñ^Ýöw�$WŽTjÃVmÝõëxñJ1(»M&2\nT#¦iríhYM:´ŒZgkþœÉ¡T¾ !�©©!å´è¤Ùc·ß?‚Ø ña¼†04Tüøêmß6Ûá O½ä>¾�–1… sú¼>,ô¥BÆðÆËÈðAf¸Ï,Ž@›ÙvëÎ�Ãrêáé­œ— 㾦´Eû€yD=—Á©Wø|U;J馳³'evB˜‡Îö’•~^9ujÔA`1“íø>«J²É…YúLëi’„z²·@84åé÷Û8¾Çݛׯ®[ó×ý~ýŠ4²Ø[š9•æ…šáØe9ÿƒ2=£¾ÓT N¯TÜ‹Èp±šÏŦIr ¿�ûvÝb×üãa¼ï÷oâÏm×µõ&~wè÷Ë~„ö1¶/Oê³D ]¦c®òðfáK¨Œ[車hV>¡Jb[¥XKä¼ý[kä‡ü\/A�A?üê7#gCœúΉ•Êéñ5§—:Hò2 n}WQÔÜ4õŠnˆÿ êol¶øÒ)DÀ;¨$oëätl�çJš:²3a}áW£æÆ'€> 3¥’xE¤üD;ª|‹.þ EyîO(äÃwß�ÿÓ‰wn0ýµYñ{™€~ù×�0¹ú¯±]ptÙ¾�)oŸ6‹¾ÓÏ»=ìv]{â‰8ZÁ3±_¡'lwã—Ïíöç/ï÷û~ÿhØT<»NâäôêP=->· îùåõÐ./-ú÷Øvן͹uŸ°Ö^øþæý¥ÿ¹´€Þ:¼`î?WíÇÅïX_ºðÂÞpí»vqɹùiuÖ៲ ÞÞÜœûúÔýs¿þ¥Þ}9‡÷Ûe�Y�¼dQZ¤/[vÖ-² jÌ‹–•/ZV/Ytü¢eÙ‹Šï¿¾hÙÙ�b4ዸ—ƒ2þ-ÍkyÝëðË›C×ů…ÞÂïÚíjïx„þlë5È® Ô뱡—_›ÇêäíŸ]Ý܇Äk9v@Þµ,üs=ŒxI±ðû�7ŠþÌ£h¦Û_iozone3_508/docs/License.txt0000755000000000000000000000070415051766073014627 0ustar rootrootCopyright 1991, 1992, 1994, 1998, 1999, 2002 William D. Norcott License to freely use and distribute this software is hereby granted by the author, subject to the condition that this copyright notice remains intact. The author retains the exclusive right to publish derivative works based on this work, including, but not limited to, revised versions of this work Other contributors: Don Capps (Network Appliance) capps@iozone.org