NetPIPE-3.7.2/.hg_archival.txt0000644000000000000000000000013611433312522016153 0ustar00usergroup00000000000000repo: c7721a361573d86c5cff6fbc61457a1f76ac27df node: 2fa8df9493847522274a61f8a5bf770a3f6c82a0 NetPIPE-3.7.2/.hgignore0000644000000000000000000000002611433312522014666 0ustar00usergroup00000000000000syntax: glob *~ ./NP* NetPIPE-3.7.2/.hgtags0000644000000000000000000000067211433312522014350 0ustar00usergroup000000000000004f11b3127b58b8b8e82615d3e18bda7b2ee94516 NetPIPE-3.7-rc1 5ec01b2db8922dd19826003ee9a0c17f5b4e2603 NetPIPE-3.7-rc3 ed436b6c0924c212360d8985a62cc699c9e2f86d NetPIPE-3.7-rc3 e32e07936de51f9dc98f99250a05e211fa603aa6 NetPIPE-3.7 92f7fa506a3e300ee03dd8139d122e27753ef90f NetPIPE-3.7 30025f824ab88346d527cf5f15cfd9aae417ea76 NetPIPE-3.7.1 68707b94a1592ea2e5351911279fed0768e64e6e NetPIPE-3.7.2 14db560ce8b42fc3e6526994243cd58936228116 NetPIPE-3.7.2 NetPIPE-3.7.2/bin/feplot0000755000000000000000000000221311433312522015052 0ustar00usergroup00000000000000#!/bin/sh outputs=$* echo " " echo "Plotting $* to gplot.ps" echo " " index=0 for ofile in $outputs do index=`expr $index + 1` # echo index = $index OUTPUTS="${OUTPUTS} \"${ofile}\" ls ${index}," done OUTPUTS=`echo $OUTPUTS | sed 's/,$//g'` #echo "outputs = $OUTPUTS" echo "set data style lines" > .gplot echo "set logscale x" >> .gplot echo "set xrange [1:10000000]" >> .gplot echo "set yrange [0:100]" >> .gplot echo "set ylabel \"Bandwidth in Mbps\"" >> .gplot echo "set xlabel \"Message Size in Bytes\"" >> .gplot #echo "set linestyle 1 lt -1 lw 4" >> .gplot echo "set linestyle 1 lt 3 lw 4" >> .gplot echo "set linestyle 2 lt 1 lw 4" >> .gplot echo "set linestyle 3 lt 5 lw 4" >> .gplot echo "set linestyle 4 lt 2 lw 4" >> .gplot echo "set linestyle 5 lt 4 lw 4" >> .gplot echo "set linestyle 6 lt 6 lw 4" >> .gplot #echo "set linestyle 7 lt 3 lw 4" >> .gplot echo "set linestyle 7 lt -1 lw 4" >> .gplot echo "set linestyle 8 lt 7 lw 4" >> .gplot echo "set key 80,90" >> .gplot echo "set terminal postscript color" >> .gplot echo "set output \"gplot.ps\"" >> .gplot echo "plot $OUTPUTS" >> .gplot gnuplot < .gplot ghostview gplot.ps NetPIPE-3.7.2/bin/geplot0000755000000000000000000000224211433312522015055 0ustar00usergroup00000000000000#!/bin/sh GPLOT="$HOME/.gplot" GPLOTPS="$HOME/.gplot.ps" outputs=$* echo " " echo "Plotting $* to ~/gplot.ps" echo " " index=0 for ofile in $outputs do index=`expr $index + 1` # echo index = $index OUTPUTS="${OUTPUTS} \"${ofile}\" ls ${index}," done OUTPUTS=`echo $OUTPUTS | sed 's/,$//g'` #echo "outputs = $OUTPUTS" echo "set data style lines" > $GPLOT echo "set logscale x" >> $GPLOT echo "set xrange [1:10000000]" >> $GPLOT echo "set ylabel \"Bandwidth in Mbps\"" >> $GPLOT echo "set xlabel \"Message Size in Bytes\"" >> $GPLOT #echo "set linestyle 1 lt -1 lw 4" >> $GPLOT echo "set linestyle 1 lt 3 lw 4" >> $GPLOT echo "set linestyle 2 lt 1 lw 4" >> $GPLOT echo "set linestyle 3 lt 5 lw 4" >> $GPLOT echo "set linestyle 4 lt 2 lw 4" >> $GPLOT echo "set linestyle 5 lt 4 lw 4" >> $GPLOT echo "set linestyle 6 lt 6 lw 4" >> $GPLOT #echo "set linestyle 7 lt 3 lw 4" >> $GPLOT echo "set linestyle 7 lt -1 lw 4" >> $GPLOT echo "set linestyle 8 lt 7 lw 4" >> $GPLOT echo "set key graph 0.4, 0.9" >> $GPLOT echo "set terminal postscript color" >> $GPLOT echo "set output \"$GPLOTPS\"" >> $GPLOT echo "plot $OUTPUTS" >> $GPLOT gnuplot < $GPLOT ghostview $GPLOTPS NetPIPE-3.7.2/bin/gnuplot-netpipe.pl0000755000000000000000000000276211433312522017336 0ustar00usergroup00000000000000#!/usr/bin/env perl use strict; sub run_gnuplot { my ($str) = @_; open(G, "|gnuplot") || die "Can't open gnuplot"; print "================================================================ $str\n"; print G $str; close(G); } ############################################################################# # Plot netpipe bandwidths ############################################################################# my $g = "set terminal pdf set output 'netpipe-bandwidths.pdf' set title 'NetPIPE Bandwidth' set ylabel 'Bandwidth (Mbps)' set xlabel 'Message size (bytes)' set key inside left top vertical Right noreverse enhanced autotitles columnhead nobox set style data linespoints set logscale y set logscale x plot "; my $first = 1; foreach my $a (@ARGV) { $g .= ", " if (!$first); $g .= "'$a' using 1:2 title '$a'"; $first = 0; } run_gnuplot($g); ############################################################################# # Plot netpipe latencies ############################################################################# $g = "set terminal pdf set output 'netpipe-latencies.pdf' set title 'NetPIPE Latencies' set ylabel 'Latency (us)' set xlabel 'Message size (bytes)' set key inside left top vertical Right noreverse enhanced autotitles columnhead nobox set style data linespoints set logscale y set logscale x plot "; $first = 1; foreach my $a (@ARGV) { $g .= ", " if (!$first); $g .= "'$a' using 1:3 title '$a'"; $first = 0; } run_gnuplot($g); NetPIPE-3.7.2/bin/nplaunch0000755000000000000000000000142611433312522015376 0ustar00usergroup00000000000000#! /bin/csh -f # Example: nplauch NPtcp -h remote_host [options] # Works with NPtcp, NPgm, NPib, NPpvm set NEXT_ARG="no" set REMOTE_HOST="" set REMOTE_COMMAND="" set LOCAL_COMMAND="$*" echo "$LOCAL_COMMAND" echo "$REMOTE_COMMAND" foreach ARG ( $* ) # echo $ARG if( $NEXT_ARG == "yes" ) then set REMOTE_HOST="$ARG" set NEXT_ARG="no" else if( "$ARG" == "-h" ) then set NEXT_ARG="yes" else if( "$REMOTE_COMMAND" == "" ) then set REMOTE_COMMAND="$cwd/$ARG" else set REMOTE_COMMAND="$REMOTE_COMMAND $ARG" endif endif endif end #echo $LOCAL_COMMAND #echo $REMOTE_COMMAND #exit # Now launch the remote executible using ssh ssh -x -a $REMOTE_HOST "$REMOTE_COMMAND" & sleep 5 $LOCAL_COMMAND NetPIPE-3.7.2/dox/README0000644000000000000000000004776611433312522014563 0ustar00usergroup00000000000000 For more complete information on NetPIPE, visit the webpage at: http://www.scl.ameslab.gov/Projects/NetPIPE/ NetPIPE was originally developed by Quinn Snell, Armin Mikler, John Gustafson, and Guy Helmer. It is currently being developed and maintained by Troy Benjegerdes, with help from several graduate students (Veerendra Allada, Kyle Schochenmaier) Release 3.7 adds support for OpenFabrics infiniband verbs module (NPibv), and should work with the OFED-1.1 or OFED-1.2 release. It has been tested on IBM eHCA hardware as well as Mellanox pci-express infiniband adapters. The openfabrics verbs support is currently lacking any support for the connection manager, and all connections are set up via TCP sockets. This means that RDMA ethernet devices will not work. Patches to netpipe@lists.scl.ameslab.gov are encouraged. Release 3.6.2 mainly fixes some bugs. A number of portability issues with 64-bit architectures were taken care of, especially in the Infiniband module. A small typecasting error was fixed that caused segmentation faults on Red Hat Enterprise and Fedora Core systems (and probably others...). The bi-directional mode was also tested with the Infiniband module, and a subset of NetPIPE options are now supported. Release 3.6.1 adds a bi-directional (-2) mode to allow data to be sent in both directions simultaneously. This has been tested with the TCP, MPI, MPI-2, and GM modules. You can also now test synchronous MPI communications MPI_SSend/MPI_SRecv using (-S). A launch utility (nplaunch) allows you to launch NPtcp, NPgm, NPib, and NPpvm from one side using ssh to start the remote executible. Version 3.6 adds the ability to test with and without cache effects, and the ability to offset both the source and destination buffers. A memcpy module has also been added. Release 3.5 removes the CPU utilization measurements. Getrusage is probably not very accurate, so a dummy workload will eventually be used instead. The streaming mode has also been fixed. When run at Gigabit speeds, the TCP window size would collapse limit performance of subsequent data points. Now we reset the sockets between trials to prevent this. We have also added in a module to evaluate memory copy rates. -n now sets a constant number of repeats for each trial. -r resets the sockets between each trial (automatic for streaming). Release 3.3 includes an Infiniband module for the Mellanox VAPI. It also has an integrity check (-i), which is still being developed. Version 3.2 includes additional modules to test PVM, TCGMSG, SHMEM, and MPI-2, as well as the GM, GPSHMEM, ARMCI, and LAPI software layers they run upon. If you have problems or comments, please email netpipe@scl.ameslab.gov ____________________________________________________________________________ NetPIPE Network Protocol Independent Performance Evaluator, Release 2.3 Copyright 1997, 1998 Iowa State University Research Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ____________________________________________________________________________ Building NetPIPE ---------------- NetPIPE requires an ANSI C compiler. You are on your own for installing the various libraries that NetPIPE can be used to test. Review the provided makefile and change any necessary settings, such as the CC compiler or CFLAGS flags, required extra libraries, and PVM library & include file pathnames if you have these communication libraries. Alternatively, you can specify these changes on the make command line. The line below would compile the NPtcp module using the icc compiler instead of the default cc compiler. make CC=icc tcp Compile NetPIPE with the desired communication interface by using: make mpi (this will use the default MPI on the system) make pvm (you may need to set some paths in the makefile) make tcgmsg (you will need to set some paths in the makefile) make mpi2 (this will test 1-sided MPI_Put() functions) make shmem (1-sided library for Cray and SGI systems) make tcp make tcp6 (for IPv6 enabled systems) make ipx (for IPX enabled systems) make sctp (for SCTP enabled systems) make sctp6 (for SCTP6 enabled systems) make gm (for Myrinet cards, you will need to set some paths) make shmem (1-sided library for Cray and SGI systems) make gpshmem (SHMEM interface for other machines) make armci (still under development) make lapi (for the IBM SP) make ib (for Mellanox Infiniband adapters, uses VAPI layer) make ibv (for OpenFabrics Infiniband devices) make udapl (for OpenFabrics uDAPL) make memcpy (uses memcpy to copy data between buffers in 1 process) make MP_memcpy (uses an optimized copy in MP_memcpy.c to copy data between buffers. This requires icc or gcc 3.x.) Running NetPIPE --------------- NetPIPE will dump its output to the screen by default and also to the np.out. The following parameters can be used to change how NetPIPE is run, and are in order of their general usefulness. -b: specify send and receive TCP buffer sizes e.g. "-b 32768" This can make a huge difference for Gigabit Ethernet cards. You may need to tune the OS to set a larger maximum TCP buffer size for optimal performance. -O: specify send and optionally receive buffer offsets, e.g. "-O 1,3" -l: lower bound (start value for block size) e.g. "-l 1" -u: upper bound (stop value for block size) e.g. "-u 1048576" -o: specify output filename e.g. "-o output.txt" -z: for MPI, receive messages using ANYSOURCE -g: MPI-2: use MPI_Get() instead of MPI_Put() -f: MPI-2: do not use a fence call (may not work for all packages) -I: Invalidate cache: Take measures to eliminate the effects cache has on performance. -a: asynchronous receive (a.k.a. pre-posted receive) May not have any effect, depending on your implementation -B: burst all preposts before measuring performance Normally only one receive is preposted at a time with -a -p: set perturbation offset of buffer size, e.g. "-p 3" -i: Integrity check: Check the integrity of data transfer instead of performance -s: stream option (default mode is "ping pong") If this option is used, it must be specified on both the sending and receiving processes -S: Use synchronous sends/receives for MPI. -2: Bi-directional communications. Transmit in both directions simultaneously. -P: Set the port number used by TCP to something other than default. TCP --- Compile NetPIPE using 'make tcp' remote_host> NPtcp [options] local_host> NPtcp -h remote_host [options] OR local_host> nplaunch NPtcp -h remote_host [options] TCP6 ---- Compile NetPIPE using 'make tcp6' remote_host> NPtcp6 [options] local_host> NPtcp6 -h remote_host [options] OR local_host> nplaunch NPtcp6 -h remote_host [options] IPX --- Compile NetPIPE using 'make ipx remote_host> NPipx [options] local_host> NPipx -h remote_host [options] OR local_host> nplaunch NPipx -h remote_host [options] SCTP ---- Compile NetPIPE using 'make sctp remote_host> NPsctp [options] local_host> NPsctp -h remote_host [options] OR local_host> nplaunch NPsctp -h remote_host [options] SCTP6 ---- Compile NetPIPE using 'make sctp6 remote_host> NPsctp6 [options] local_host> NPsctp6 -h remote_host [options] OR local_host> nplaunch NPsctp6 -h remote_host [options] MPICH ----- Install MPICH Compile NetPIPE using 'make mpi' use p4pg file or edit mpich/util/mach/mach.{ARCH} file to specify the machines to run on mpirun [-nolocal] -np 2 NPmpi [options] 'setenv P4_SOCKBUFSIZE 256000' can make a huge difference for MPICH on Unix systems. LAM/MPI (comes on the RedHat Linux distributions now) ------- Install LAM Compile NetPIPE using 'make mpi' put the machine names into a lamhosts file 'lamboot -v -b lamhosts' to start the lamd daemons mpirun -np 2 [-O] NPmpi [options] The -O parameter avoids data translation for homogeneous systems. MPI/Pro (commercial version) ------- Install MPI/Pro Compile NetPIPE using 'make mpi' put the machine names into /etc/machines or a local machine file mpirun -np 2 NPmpi [options] MP_Lite (A lightweight version of MPI) ------- Install MP_Lite (http://www.scl.ameslab.gov/Projects/MP_Lite/) Compile NetPIPE using 'make MP_Lite' mprun -np 2 -h {host1} {host2} NPmplite [options] PVM --- Install PVM (comes on the RedHat distributions now) Set the PVM paths in the makefile if necessary. Compile NetPIPE using 'make pvm' use the 'pvm' utility to start the pvmd daemons type 'pvm' to start it (this will also start pvmd on the local_host) pvm> help --> lists all commands pvm> add remote_host --> will start a pvmd on a machine called 'host2' pvm> quit --> when you have all the pvmd machines started remote_host> NPpvm [options] local_host> NPpvm -h remote_host [options] OR local_host> nplaunch NPpvm -h remote_host [options] Changing PVMDATA in netpipe.h and PvmRouteDirect in pvm.c can effect the performance greatly. TCGMSG (unlikely anyone will try this that doesn't know TCGMSG well) ------- Install TCGMSG package Set the TCGMSG paths in the makefile. Compile NetPIPE using 'make tcgmsg' create a NPtcgmsg.p file with hosts and paths (see hosts/NPtcgmsg.p) parallel NPtcgmsg (no options can be passed into this version) MPI-2 ----- Install the MPI package Compile NetPIPE using 'make mpi2' Follow the directions for running the MPI package from above The MPI_Put() function will be tested with fence calls by default. Use -g to test MPI_Get() instead, or -f to do MPI_Put() without fence calls (will not work with LAM). SHMEM ----- Must be run on a Cray or SGI system that supports SHMEM calls. Compile NetPIPE using 'make shmem' (Xuehua, fill out the rest) GPSHMEM (a General Purpose SHMEM library) (gpshmem.c in development) ------- Ask Ricky or Krzysztof for help :). GM (test the raw performance of GM on Myrinet cards) -- Install the GM package and configure the Myrinet cards Compile NetPIPE using 'make gm' remote_host> NPgm [options] local_host> NPgm -h remote_host [options] OR local_host> nplaunch NPgm -h remote_host [options] LAPI ---- Log into IBM SP machine at NERSC Compile NetPIPE using 'make lapi' To run interactively at NERSC: Set environment variable MP_MSG_API to lapi e.g. 'setenv MP_MSG_API lapi', 'export MP_MSG_API=lapi' Run NPlapi with '-procs 2' to tell the parallel environment you want 2 nodes. Use any other options that are applicable to NetPIPE. To submit a batch job at NERSC: Copy the file batchLapi from the 'hosts' directory to the directory containing NPlapi. Edit the copy of batchLapi: job_name: Identifying name of job, can be anything output: File to send stdout to error: File to send stderr to (most of NetPIPE's output will go here) tasks_per_node: Number of tasks to be run on each node node: Number of nodes to run on (Use a combination of the above two options to determine how NetPIPE runs. Use 1 task per node and 2 nodes to run benchmark between nodes. Use 2 tasks per node and 1 node to run benchmark on single node) Use whatever command-line options are appropriate for NetPIPE Submit the job with the command 'llsubmit batchLapi' Check status of all your jobs with 'llqs -u ' You should receive an email when the job finishes. The resulting output files will then be available. ARMCI ----- Install the ARMCI package Compile NetPIPE using 'make armci' Follow the directions for running the MPI package from above If running on interfaces other than the default, create a file called armci_hosts, containing two lines, one for each hostname, then run package. Infiniband ---------- This test will only work on machines connected via TCP/IP as well as Infiniband. Install Infiniband adapters and mellanox vapi software (OR OFED-1.1 or OFED-1.2) Make sure the adapters are up and running (e.g. Check that the Mellanox-supplied bandwidth/latency program, perf_main, works, if you have it. For OFED, make sure ibv_rc_pingpong works) Compile NetPIPE using 'make ib' for vapi and 'make ibv for OFED (The environment variable MTHOME needs to be set to the directory containing the include and lib directories for the Mellanox software). OFED should build if the libraries are in the standard OFED install locations, if not, edit the makefile. remote_host> NPib [-options] local_host> NPib -h remote_host [-options] OR local_host> nplaunch NPib -h remote_host [options] (remote_host should be the ip address or hostname of the other host) Other options: (this documentation is out of date for ibv) Use -m to select mtu size for Infiniband adapter. Valid values are 256, 512, 1024, 2048, 4096. Default is 1024. Use -t to select the communications type. Possible values are send_recv: basic send and receive send_recv_with_imm: send and receive with immediate data rdma_write: one-sided remote dma write rdma_write_with_imm: one-sided remote dma write with immediate data Default is send_recv. Use -c to select the message completion type. Possible values are local_poll: poll on last byte of receive buffer vapi_poll: use VAPI polling mechanism event: use VAPI event completion mechanism Default is local_poll. uDAPL ---------- Make sure the uDAPL interface adapters are up and running. Compile NetPIPE using 'make udapl' (May need to change the path to the uDAPL include files and libraries in the makefile depending on your uDAPL interface adapter. Defaults to /usr/local/ofed/* remote_host> NPudapl [-options] local_host> NPudapl -h remote_host [-options] OR local_host> nplaunch NPudapl -h remote_host [options] (remote_host should be the ip address or hostname of the other host) Other options: Use -t to select the communications type. Possible values are send_recv: basic send and receive rdma_write: RDMA write in place of send/recv Default is send_recv. Use -c to select the message completion type. Possible values are local_poll: poll on last byte of receive buffer dq_poll: use dat_evd_dequeue to poll for completion events evd_wait: use dat_evd_wait to wait for completion events cno_wait: use dat_cno_wait to wait for completions, then dequeue Default is local_poll. For the best latency & throughput numbers, use local_poll. To demonstrate the CPU effienciency of uDAPL, use evd_wait or cno_wait. Interpreting the Results ------------------------ NetPIPE generates a np.out file by default, which can be renamed using the -o option. This file contains 3 columns: the number of bytes, the throughput in Mbps, and the round trip time divided by two. The first 2 columns can therefore be used to produce a throughput vs message size graph. The screen output contains this same information, plus the test number and the number of ping-pong's involved in the test. >more np.out 1 0.136403 0.00005593 2 0.274586 0.00005557 3 0.402104 0.00005692 4 0.545668 0.00005593 6 0.805053 0.00005686 8 1.039586 0.00005871 12 1.598912 0.00005726 13 1.700719 0.00005832 16 2.098007 0.00005818 19 2.340364 0.00006194 Invalidating Cache ------------------ The -I switch can be used to reduce the effects cache has on performance. Without the switch, NetPIPE tests the performance of communicating n-byte blocks by reading from an n-byte buffer on one node, sending data over the communications link, and writing to an n-byte buffer on the other node. For each block size, this trial will be repeated x times, where x typically starts out very large for small block sizes, and decreases as the block size grows. The same buffers on each node are used repeatedly, so after the first transfer the entire buffer will be in cache on each node, given that the block-size is less than the available cache. Thus each transfer after the first will be read from cache on one end and written into cache on the other. Depending on the cache architecture, a write to main memory may not occur on the receiving end during the transfer loop. While the performance measurements obtained from this method are certainly useful, it is also interesting to use the -I switch to measure performance when data is read from and written to main memory. In order to facilitate this, large pools of memory are allocated at startup, and each n-byte transfer comes from a region of the pool not in cache. Before each series of n-byte transfers, every byte of a large dummy buffer is individually accessed in order to flush the data for the transfer out of cache. After this step, the first n-byte transfer comes from the beginning of the large pool, the second comes from n-bytes after the beginning of the pool, and so on (note that stride between n-byte transfers will depend on the buffer alignment setting). In this way we make sure each read is coming from main memory. On the receiving end data is written into a large pool in the same fashion that it was read on the transmitting end. Data will first be written into cache. What happens next depends on the cache architecture, but one case is that no transfer to main memory occurs, YET. For moderately large block sizes, however, a large number of transfer iterations will cause reuse of cache memory. As this occurs, data in the cache location to be replaced must be written back to main memory, so we incur a performance penalty while we wait for the write. In summary, using the -I switch gives worst-case performance (i.e. all data transfers involve reading from or writing to memory not in cache) and not using the switch gives best-case performance (i.e. all data transfers involve only reading from or writing to memory in cache). Note that other combinations, such as reading from memory in cache and writing to memory not in cache, would give intermediary results. We chose to implement the methods that will measure the two extremes. Changes needed -------------- - we need to replace the getrusage stuff from version 2.4 with a dummy workload ... We have a working version using DGEMM internally, email netpipe@lists.scl.ameslab.gov for more info. - the ibv module needs to have better documentation, and support for the CM NetPIPE-3.7.2/dox/netpipe.10000644000000000000000000002577311433312522015423 0ustar00usergroup00000000000000.\" -*- nroff -*- .\" .\" NetPIPE -- Network Protocol Independent Performance Evaluator. .\" Copyright 1997, 1998 Iowa State University Research Foundation, Inc. .\" .\" This program is free software; you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by .\" the Free Software Foundation. You should have received a copy of the .\" GNU General Public License along with this program; if not, write to the .\" Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. .\" .\" netpipe.1 .\" Created: Mon Jun 15 1998 by Guy Helmer .\" Rewritten: Jun 1 2004 by Dave Turner .\" .\" $Id: netpipe.1,v 1.3 1998/09/24 16:23:59 ghelmer Exp $ .\" .TH netpipe 1 "June 1, 2004" "NetPIPE" "netpipe" .SH NAME NetPIPE \- .IB Net work .IB P rotocol .IB I ndependent .IB P erformance .IB E valuator .SH SYNOPSIS .B NPtcp [\c .BI \-h \ receiver_hostname\fR\c ] [\c .BI \-b \ TCP_buffer_sizes\fR\c ] [options] .PP mpirun [\c .BI \-machinefile \ hostlist\fR\c ] -np 2 .B NPmpi [-a] [-S] [-z] [options] .PP mpirun [\c .BI \-machinefile \ hostlist\fR\c ] -np 2 .B NPmpi2 [-f] [-g] [options] .PP .B NPpvm [options] See the TESTING sections below for a more complete description of how to run NetPIPE in each environment. The OPTIONS section describes the general options available for all modules. See the README file from the tar-ball at http://www.scl.ameslab.gov/Projects/NetPIPE/ for documentation on the InfiniBand, GM, SHMEM, LAPI, and memcpy modules. .SH DESCRIPTION .PP .B NetPIPE uses a simple series of ping-pong tests over a range of message sizes to provide a complete measure of the performance of a network. It bounces messages of increasing size between two processes, whether across a network or within an SMP system. Message sizes are chosen at regular intervals, and with slight perturbations, to provide a complete evaluation of the communication system. Each data point involves many ping-pong tests to provide an accurate timing. Latencies are calculated by dividing the round trip time in half for small messages ( less than 64 Bytes ). .PP The communication time for small messages is dominated by the overhead in the communication layers, meaning that the transmission is latency bound. For larger messages, the communication rate becomes bandwidth limited by some component in the communication subsystem (PCI bus, network card link, network switch). .PP These measurements can be done at the message-passing layer (MPI, MPI-2, and PVM) or at the native communications layers that that run upon (TCP/IP, GM for Myrinet cards, InfiniBand, SHMEM for the Cray T3E systems, and LAPI for IBM SP systems). Recent work is being aimed at measuring some internal system properties such as the memcpy module that measures the internal memory copy rates, or a disk module under development that measures the performance to various I/O devices. .PP Some uses for NetPIPE include: .RS .PP Comparing the latency and maximum throughput of various network cards. .PP Comparing the performance between different types of networks. .PP Looking for inefficiencies in the message-passing layer by comparing it to the native communication layer. .PP Optimizing the message-passing layer and tune OS and driver parameters for optimal performance of the communication subsystem. .RE .PP .B NetPIPE is provided with many modules allowing it to interface with a wide variety of communication layers. It is fairly easy to write new interfaces for other reliable protocols by using the existing modules as examples. .SH TESTING TCP .PP NPtcp can now be launched in two ways, by manually starting NPtcp on both systems or by using a nplaunch script. To manually start NPtcp, the NetPIPE receiver must be started first on the remote system using the command: .PP .Ex NPtcp [options] .Ee .PP then the primary transmitter is started on the local system with the command .PP .Ex NPtcp \-h .I receiver_hostname [options] .Ee .PP Any options used must be the same on both sides. The \-P parameter can be used to override the default port number. This is helpful when running several streams through a router to a single endpoint. The nplaunch script uses ssh to launch the remote receiver before starting the local transmitter. To use rsh, simply change the nplaunch script. .PP .Ex nplaunch NPtcp -h .I receiver_hostname [options] .Ee .PP The .BI \-b \ TCP_buffer_sizes\fR\c option sets the TCP socket buffer size, which can greatly influence the maximum throughput on some systems. A throughput graph that flattens out suddenly may be a sign of the performance being limited by the socket buffer sizes. .PP Several other protocols are testable in the same way as TCP. These include TCP6 (TCP over IPv6), SCTP and IPX. They are started in the same way but the program names are NPtcp6, NPsctp, and NPipx respectively. .SH TESTING MPI and MPI-2 .PP Use of the MPI interface for NetPIPE depends on the MPI implementation being used. All will require the number of processes to be specified, usually with a .I -np 2 argument. Clusters environments may require a list of the hosts being used, either during initialization of MPI (during lamboot for LAM-MPI) or when each job is run (using a -machinefile argument for MPICH). For LAM-MPI, for example, put the list of hosts in hostlist then boot LAM and run NetPIPE using: .PP .Ex lamboot -v -b .I hostlist .PP mpirun \-np 2 NPmpi [NetPIPE options] .Ee .PP For MPICH use a command like: .PP .Ex mpirun \-machinefile .I hostlist \-np 2 NPmpi [NetPIPE options] .Ee .PP To test the 1-sided communications of the MPI-2 standard, compile using: .PP .Ex .B make mpi2 .Ee .PP Running as described above and MPI will use 1-sided MPI_Put() calls in both directions, with each receiver blocking until the last byte has been overwritten before bouncing the message back. Use the .I -f option to force usage of a fence to block rather than an overwrite of the last byte. The .I -g option will use MP_Get() functions to transfer the data rather than MP_Put(). .SH TESTING PVM .PP Start the pvm system using: .PP .Ex pvm .Ee .PP and adding a second machine with the PVM command .PP .Ex add .I receiver_hostname .Ee .PP Exit the PVM command line interface using quit, then run the PVM NetPIPE receiver on one system with the command: .PP .Ex NPpvm [options] .Ee .PP and run the TCP NetPIPE transmitter on the other system with the command: .PP .Ex NPpvm -h .I receiver hostname [options] .Ee .PP Any options used must be the same on both sides. The nplaunch script may also be used with NPpvm as described above for NPtcp. .SH TESTING METHODOLOGY .PP .B NetPIPE tests network performance by sending a number of messages at each block size, starting from the lower bound on the message sizes. The message size is incremented until the upper bound on the message size is reached or the time to transmit a block exceeds one second, which ever occurs first. Message sizes are chosen at regular intervals, and for slight perturbations from them to provide a more complete evaluation of the communication subsystem. .PP The .B NetPIPE\c output file may be graphed using a program such as .B gnuplot(1)\. The output file contains three columns: the number of bytes in the block, the transfer rate in bits per second, and the time to transfer the block (half the round-trip time). The first two columns are normally used to graph the throughput vs block size, while the third column provides the latency. For example, the .B throughput versus block size graph can be created by graphing bytes versus bits per second. Sample .B gnuplot(1) commands for such a graph would be .PP .Ex set logscale x .Ee .PP .Ex plot "np.out" .Ee .ne 5 .SH OPTIONS .TP .B \-a asynchronous mode: prepost receives (MPI, IB modules) .ne 3 .TP .BI \-b \ \fITCP_buffer_sizes\fR Set the send and receive TCP buffer sizes (TCP module only). .ne 3 .TP .B \-B Burst mode where all receives are preposted at once (MPI, IB modules). .ne 3 .TP .B \-f Use a fence to block for completion (MPI2 module only). .ne 3 .TP .B \-g Use MPI_Get() instead of MPI_Put() (MPI2 module only). .ne 3 .TP .BI \-h \ \fIhostname\fR Specify the name of the receiver host to connect to (TCP, PVM, IB, GM). .ne 3 .TP .B \-I Invalidate cache to measure performance without cache effects (mostly affects IB and memcpy modules). .ne 3 .TP .B \-i Do an integrity check instead of a performance evaluation. .ne 3 .TP .BI \-l \ \fIstarting_msg_size\fR Specify the lower bound for the size of messages to be tested. .ne 3 .TP .TP .BI \-n \ \fInrepeats\fR Set the number of repeats for each test to a constant. Otherwise, the number of repeats is chosen to provide an accurate timing for each test. Be very careful if specifying a low number so that the time for the ping-pong test exceeds the timer accuracy. .ne 3 .TP .BI \-O \ \fIsource_offset,dest_offset\fR Specify the source and destination offsets of the buffers from perfect page alignment. .ne 3 .TP .BI \-o \ \fIoutput_filename\fR Specify the output filename (default is np.out). .ne 3 .TP .BI \-p \ \fIperturbation_size\fR NetPIPE chooses the message sizes at regular intervals, increasing them exponentially from the lower boundary to the upper boundary. At each point, it also tests perturbations of 3 bytes above and 3 bytes below each test point to find idiosyncrasies in the system. This perturbation value can be changed using the .I -p option, or turned off using .I -p .I 0 .B . .ne 3 .TP .B \-r This option resets the TCP sockets after every test (TCP module only). It is necessary for some streaming tests to get good measurements since the socket window size may otherwise collapse. .ne 3 .TP .B \-s Set streaming mode where data is only transmitted in one direction. .ne 3 .TP .B \-S Use synchronous sends (MPI module only). .ne 3 .TP .BI \-u \ \fIupper_bound\fR Specify the upper boundary to the size of message being tested. By default, NetPIPE will stop when the time to transmit a block exceeds one second. .TP .B \-z Receive messages using MPI_ANY_SOURCE (MPI module only) .ne 3 .TP .B \-2 Set bi-directional mode where both sides send and receive at the same time (supported by most modules). You may need to use .I -a to choose asynchronous communications for MPI to avoid freeze-ups. For TCP, the maximum test size will be limited by the TCP buffer sizes. .ne 3 .ne 3 .SH FILES .TP .I np.out Default output file for .BR NetPIPE . Overridden by the .B \-o option. .SH AUTHOR .PP The original NetPIPE core plus TCP and MPI modules were written by Quinn Snell, Armin Mikler, Guy Helmer, and John Gustafson. NetPIPE is currently being developed and maintained by Dave Turner with contributions from many students (Bogdan Vasiliu, Adam Oline, Xuehua Chen, and Brian Smith). .PP Send comments/bug-reports to: .I . .PP Additional information about .B NetPIPE can be found on the World Wide Web at .I http://www.scl.ameslab.gov/Projects/NetPIPE/ .SH BUGS As of version 3.6.1, there is a bug that causes NetPIPE to segfault on RedHat Enterprise systems. I will debug this as soon as I get access to a few such systems. -Dave Turner (turner@ameslab.gov) NetPIPE-3.7.2/dox/netpipe_paper.ps0000644000000000000000000064241611433312522017073 0ustar00usergroup00000000000000%!PS (but not EPSF; comments have been disabled) %DVIPSCommandLine: dvips Paper %DVIPSParameters: dpi=600, compressed, comments removed %DVIPSSource: TeX output 1996.04.04:1006 /TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} forall round exch round exch]setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ /nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ /sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ 128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N /cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add /gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{ dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1 adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2 idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg} {adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{ adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{] }if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict /eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V {}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail {dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ 4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B /@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{ /CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{ 10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B /@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale true def end /@MacSetUp{userdict /md known{userdict /md get type /dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{} N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{itransform lineto} }{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{ itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{ closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N /txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp {pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray} N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict maxlength dict begin /magscale true def normalscale currentpoint TR /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts /psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR /showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{ psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict begin /SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial {CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR }{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath }N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{ end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin} N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{ /SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end TeXDict begin 40258431 52099146 1000 600 600 (Paper.dvi) @start /Fa 50 123 df39 D44 D<387FFFF8A2B5FCA214F0150579941E>I<17 03EF0780170FA2EF1F005F173E5FA25FA24C5A16035F4C5AA24C5AA24CC7FCA2163E167E 167C5EA24B5AA24B5A15075E4B5AA24BC8FCA2153E157E157C5DA24A5AA24A5A14075D4A 5AA24AC9FCA2143EA25C14FC5C495AA2495AA2495A130F5C49CAFCA2133EA25B13FC5B48 5AA2485AA2485A120F5B48CBFCA2123EA25AA25AA2127031537FBD2A>47 D<15181538157815F0140114031407EC0FE0141F147FEB03FF90383FEFC0148FEB1C1F13 001580A2143FA21500A25CA2147EA214FEA25CA21301A25CA21303A25CA21307A25CA213 0FA25CA2131FA25CA2133FA291C7FC497EB61280A31D3877B72A>49 DII<010314186E13F8903907F007F091B512E016C016 00495B15F8010E13E0020CC7FC011EC8FC131CA3133C1338A313781370A2147F9038F3FF C09038EF83E09038FC01F0496C7E485A497F49137CC8FC157EA315FEA41401000C5C123F 5A1403485C5A4A5A12F800E05C140F4A5A5D6C49C7FC0070137E00785B387C01F8383E07 F0381FFFC06C90C8FCEA01F8253A77B72A>53 D56 DI59 D65 D<0107B612FCEFFF8018C0903B000FF0001FF04BEB07F81703021F15FC 17014B14FEA2023F1400A24B1301A2147F18FC92C7120318F84A140718F04AEC0FE0EF1F C00101ED3F80EF7F004AEB01FEEE07F849B612E05F9139F80007F0EE01FC01076E7E177F 4AEC3F80A2010F16C0171F5CA2131F173F5CA2133FEF7F805C1800017F5D4C5A91C7485A 5F49140FEE1FE0494A5A00014AB45AB748C7FC16F816C037397BB83A>II71 D<0103B5D8F80FB512E0A390260007F8C7381FE0004B5DA2020F153F615DA2021F157F96 C7FC5DA2023F5D605DA2027F14016092C7FCA24A1403605CA249B7FC60A202FCC7120701 03150F605CA20107151F605CA2010F153F605CA2011F157F95C8FC5CA2013F5D5F5CA201 7F14015F91C7FC491403007FD9FE01B512F8B55BA243397CB83E>I<0103B512F8A39039 0007F8005DA2140FA25DA2141FA25DA2143FA25DA2147FA292C7FCA25CA25CA21301A25C A21303A25CA21307A25CA2130FA25CA2131FA25CA2133FA25CA2137FA291C8FC497EB6FC A25C25397CB820>I<902607FFF8923807FFF0614F13E0D9000FEFF0004F5AA2021F167F F1EFC0141DDA1CFCEC01CF023C16DF9538039F800238ED071FA20278ED0E3F97C7FC0270 151CA202F04B5AF0707E14E0037E14E0010117FE4D485A02C0EC0380A20103ED07016102 80140EA20107ED1C0305385B14006F137049160705E05B010EEC01C0A2011E913803800F 61011CEC0700A2013C020E131F4C5C1338ED1FB80178163F04F091C8FC01705CA201F04A 5B187E00015DD807F816FEB500C09039007FFFFC151E150E4C397AB84A>77 D<902603FFF891B512E0A281D90007923807F8006F6E5A61020F5E81DA0E7F5DA2021E6D 1307033F92C7FC141C82DA3C1F5C70130EEC380FA202786D131E0307141C147082DAF003 143C70133814E0150101016E1378030014705C8201036E13F0604A1480163F010715C104 1F5B91C7FC17E149EC0FE360010E15F31607011E15FF95C8FC011C80A2013C805F133816 0013785F01F8157CEA03FC267FFFE0143CB51538A243397CB83E>I<0107B612F817FF18 80903B000FF0003FE04BEB0FF0EF03F8141FEF01FC5DA2023F15FEA25DA2147FEF03FC92 C7FCA24A15F817074A15F0EF0FE01301EF1FC04AEC3F80EFFE0001034A5AEE0FF091B612 C04CC7FCD907F8C9FCA25CA2130FA25CA2131FA25CA2133FA25CA2137FA291CAFCA25BA2 5B1201B512FCA337397BB838>80 D<0103B612F017FEEFFF80903B0007F8003FC04BEB0F F01707020FEC03F8EF01FC5DA2021F15FEA25DA2143FEF03FC5DA2027FEC07F818F092C7 120F18E04AEC1FC0EF3F004A14FEEE01F80101EC0FE091B6128004FCC7FC9138FC003F01 03EC0F80834A6D7E8301071403A25C83010F14075F5CA2011F140FA25CA2133F161F4AEC E007A2017F160F180E91C7FC49020F131C007F01FE153CB5913807F078040313F0CAEAFF E0EF3F80383B7CB83D>82 D<92383FC00E913901FFF01C020713FC91391FC07E3C91393F 001F7C027CEB0FF84A130749481303495A4948EB01F0A2495AA2011F15E091C7FCA34915 C0A36E90C7FCA2806D7E14FCECFF806D13F015FE6D6D7E6D14E0010080023F7F14079138 007FFC150F15031501A21500A2167C120EA3001E15FC5EA3003E4A5AA24B5AA2007F4A5A 4B5A6D49C7FC6D133ED8F9F013FC39F8FC03F839F07FFFE0D8E01F138026C003FCC8FC2F 3D7ABA2F>I<0007B812E0A25AD9F800EB001F01C049EB07C0485AD900011403121E001C 5C003C17801403123800785C00701607140700F01700485CA2140FC792C7FC5DA2141FA2 5DA2143FA25DA2147FA292C9FCA25CA25CA21301A25CA21303A25CA21307A25CA2130FA2 5CEB3FF0007FB512F8B6FCA2333971B83B>I<003FB539800FFFFEA326007F80C7EA7F80 91C8EA3F00173E49153CA2491538A20001167817705BA2000316F05F5BA2000715015F5B A2000F15035F5BA2001F150794C7FC5BA2003F5D160E5BA2007F151E161C90C8FCA2163C 4815385A16781670A216F04B5A5E1503007E4A5A4BC8FC150E6C143E6C6C5B15F0390FC0 03E03907F01FC00001B5C9FC38007FFCEB1FE0373B70B83E>III<14F8EB07FE 90381F871C90383E03FE137CEBF801120148486C5A485A120FEBC001001F5CA2EA3F8014 03007F5C1300A21407485C5AA2140F5D48ECC1C0A2141F15831680143F1587007C017F13 00ECFF076C485B9038038F8E391F0F079E3907FE03FC3901F000F0222677A42A>97 D<133FEA1FFFA3C67E137EA313FE5BA312015BA312035BA31207EBE0F8EBE7FE9038EF0F 80390FFC07C013F89038F003E013E0D81FC013F0A21380A2123F1300A214075A127EA214 0F12FE4814E0A2141F15C05AEC3F80A215005C147E5C387801F8007C5B383C03E0383E07 C0381E1F80D80FFEC7FCEA01F01C3B77B926>I<147F903803FFC090380FC1E090381F00 70017E13784913383901F801F83803F003120713E0120FD81FC013F091C7FC485AA2127F 90C8FCA35A5AA45AA3153015381578007C14F0007EEB01E0003EEB03C0EC0F806CEB3E00 380F81F83803FFE0C690C7FC1D2677A426>II<147F903803FFC090380FC1E09038 3F00F0017E13785B485A485A485A120F4913F8001F14F0383F8001EC07E0EC1F80397F81 FF00EBFFF891C7FC90C8FC5A5AA55AA21530007C14381578007E14F0003EEB01E0EC03C0 6CEB0F806CEB3E00380781F83803FFE0C690C7FC1D2677A426>IIIII107 DII I<147F903803FFC090380FC1F090381F00F8017E137C5B4848137E4848133E0007143F5B 120F485AA2485A157F127F90C7FCA215FF5A4814FEA2140115FC5AEC03F8A2EC07F015E0 140F007C14C0007EEB1F80003EEB3F00147E6C13F8380F83F03803FFC0C648C7FC202677 A42A>I<9039078007C090391FE03FF090393CF0787C903938F8E03E9038787FC0017049 7EECFF00D9F0FE148013E05CEA01E113C15CA2D80003143FA25CA20107147FA24A1400A2 010F5C5E5C4B5A131F5EEC80035E013F495A6E485A5E6E48C7FC017F133EEC70FC90387E 3FF0EC0F8001FEC9FCA25BA21201A25BA21203A25B1207B512C0A3293580A42A>I<3903 C003F0390FF01FFC391E783C0F381C7C703A3C3EE03F8038383FC0EB7F80007815000070 1300151CD8F07E90C7FCEAE0FE5BA2120012015BA312035BA312075BA3120F5BA3121F5B A3123F90C9FC120E212679A423>114 D<14FE903807FF8090380F83C090383E00E04913 F00178137001F813F00001130313F0A215E00003EB01C06DC7FC7FEBFFC06C13F814FE6C 7F6D13807F010F13C01300143F141F140F123E127E00FE1480A348EB1F0012E06C133E00 705B6C5B381E03E06CB45AD801FEC7FC1C267AA422>II<13F8D803FEEB01C0D8078FEB03E0390E0F8007121E121C 0038140F131F007815C01270013F131F00F0130000E015805BD8007E133FA201FE14005B 5D120149137EA215FE120349EBFC0EA20201131E161C15F813E0163CD9F0031338140700 01ECF07091381EF8F03A00F83C78E090393FF03FC090390FC00F00272679A42D>I<01F0 130ED803FC133FD8071EEB7F80EA0E1F121C123C0038143F49131F0070140FA25BD8F07E 140000E08013FEC6485B150E12015B151E0003141C5BA2153C000714385B5DA35DA24A5A 140300035C6D48C7FC0001130E3800F83CEB7FF8EB0FC0212679A426>I<01F01507D803 FC903903801F80D8071E903907C03FC0D80E1F130F121C123C0038021F131F49EC800F00 701607A249133FD8F07E168000E0ED000313FEC64849130718000001147E5B03FE5B0003 160E495BA2171E00070101141C01E05B173C1738A217781770020314F05F000301071301 6D486C485A000190391E7C07802800FC3C3E0FC7FC90393FF81FFE90390FE003F0322679 A437>I<903907E007C090391FF81FF89039787C383C9038F03E703A01E01EE0FE3803C0 1F018013C0D8070014FC481480000E1570023F1300001E91C7FC121CA2C75AA2147EA214 FEA25CA21301A24A1370A2010314F016E0001C5B007E1401010714C000FEEC0380010F13 07010EEB0F0039781CF81E9038387C3C393FF03FF03907C00FC027267CA427>I<13F0D8 03FCEB01C0D8071EEB03E0D80E1F1307121C123C0038140F4914C01270A249131FD8F07E 148012E013FEC648133F160012015B5D0003147E5BA215FE00075C5BA214015DA314035D 14070003130FEBF01F3901F87FE038007FF7EB1FC7EB000F5DA2141F003F5C48133F92C7 FC147E147C007E13FC387001F8EB03E06C485A383C1F80D80FFEC8FCEA03F0233679A428 >I<903903C0038090380FF007D91FF81300496C5A017F130E9038FFFE1E9038F83FFC39 01F007F849C65A495B1401C7485A4A5A4AC7FC141E5C5C5C495A495A495A49C8FC131E5B 49131C5B4848133C48481338491378000714F8390FF801F0391FFF07E0383E1FFFD83C0F 5B00785CD8700790C7FC38F003FC38E000F021267BA422>I E /Fb 42 122 df<123C127EB4FCA21380A2127F123D1201A312031300A25A1206120E5A5A5A12 6009157A8714>44 DI<123C127E12FFA4127E123C08087A8714> I48 D50 D<140EA2141E143EA2147E14FEA2EB01BE 1303143E1306130E130C131813381330136013E013C0EA0180120313001206120E120C5A 123812305A12E0B612FCA2C7EA3E00A9147F90381FFFFCA21E2D7EAC23>52 D<000CEB0180380FC01F90B512005C5C14F014C0D80C7EC7FC90C8FCA8EB1FC0EB7FF838 0DE07C380F801F01001380000E130F000CEB07C0C713E0A2140315F0A4127812FCA448EB 07E012E0006014C00070130F6C14806CEB1F006C133E380780F83801FFE038007F801C2D 7DAB23>I<1230123C003FB512F8A215F05A15E039700001C000601480140348EB070014 0E140CC7121C5C143014705C495AA2495AA249C7FCA25B130E131EA2133EA3133C137CA4 13FCA913781D2E7CAC23>55 DI<4A7E4A7EA34A7EA24A7EA3EC1BF81419A2EC30FC A2EC70FEEC607EA24A7EA349486C7EA2010380EC000FA201066D7EA3496D7EA2011FB57E A29038180001496D7EA349147EA201E0147F4980A20001ED1F801203000716C0D80FF0EC 3FE0D8FFFC0103B5FCA2302F7EAE35>65 D 68 DI71 D76 DII80 D<90383F80303901FFF0703807C07C390F000EF0001E13 074813034813011400127000F01470A315307EA26C1400127E127FEA3FE013FE381FFFE0 6C13FC6C13FF00011480D8003F13E013039038003FF0EC07F81401140015FC157C12C015 3CA37EA215787E6C14706C14F06CEB01E039F78003C039E3F00F0038E07FFE38C00FF01E 2F7CAD27>83 D<007FB712F8A29039000FC003007C150000701638A200601618A200E016 1CA248160CA5C71500B3A94A7E011FB512E0A22E2D7EAC33>II87 D<13FF000713C0380F01F0381C00F8003F137C80A2143F001E7FC7FCA4 EB07FF137F3801FE1FEA07F0EA1FC0EA3F80EA7F00127E00FE14065AA3143F7E007E137F 007FEBEF8C391F83C7FC390FFF03F83901FC01E01F207D9E23>97 DII<15F8141FA2 14011400ACEB0FE0EB7FF83801F81E3803E0073807C003380F8001EA1F00481300123E12 7EA25AA9127C127EA2003E13017EEB8003000F13073903E00EFC3A01F03CFFC038007FF0 90391FC0F800222F7EAD27>III<013F13F89038FFC3FE3903E1FF1E3807807C000F140C391F003E00A200 3E7FA76C133EA26C6C5A00071378380FE1F0380CFFC0D81C3FC7FC90C8FCA3121E121F38 0FFFF814FF6C14C04814F0391E0007F848130048147C12F848143CA46C147C007C14F86C EB01F06CEB03E03907E01F803901FFFE0038003FF01F2D7E9D23>III107 DI<2607C07FEB07F03B FFC3FFC03FFC903AC783F0783F3C0FCE01F8E01F803B07DC00F9C00F01F8D9FF8013C049 90387F000749137EA249137CB2486C01FEEB0FE03CFFFE0FFFE0FFFEA2371E7E9D3C>I< 3807C0FE39FFC3FF809038C703E0390FDE01F0EA07F8496C7EA25BA25BB2486C487E3AFF FE1FFFC0A2221E7E9D27>II<3807C0FE39FFC7FF80 9038CF03E0390FDC01F03907F800FC49137E49133E49133FED1F80A3ED0FC0A8151F1680 A2ED3F00A26D137E6D137C5D9038FC01F09038CE07E09038C7FF80D9C1FCC7FC01C0C8FC A9487EEAFFFEA2222B7E9D27>I<380781F838FF87FEEB8E3FEA0F9CEA07B813B0EBF01E EBE000A45BB0487EB5FCA2181E7E9D1C>114 D<3801FE183807FFB8381E01F8EA3C0048 1378481338A21418A27E7EB41300EA7FF06CB4FC6C13C06C13F0000113F838001FFC1301 38C0007E143EA26C131EA27EA26C133CA26C137838FF01F038E3FFC000C0130017207E9E 1C>I<1360A413E0A312011203A21207121FB512F0A23803E000AF1418A714383801F030 14703800F860EB3FE0EB0F80152A7FA81B>I I<3BFFFC3FFE07FFA23B0FE003F001F801C09038E000F00007010114E0812603E00314C0 A2913807F8012701F006781380A29039F80E7C030000D90C3C1300A290397C181E06A215 1F6D486C5AA2168C90391F600798A216D890390FC003F0A36D486C5AA36DC75A301E7F9C 33>119 D<3AFFFC01FFC0A23A0FE0007E000007147C1538000314306D137000011460A2 6C6C5BA2EBFC01017C5BEB7E03013E90C7FCA2EB1F06A2148EEB0F8CA2EB07D8A2EB03F0 A36D5AA26D5AA2495AA2130391C8FC1278EAFC06A25B131CEA7838EA7070EA3FE0EA0F80 222B7F9C25>121 D E /Fc 1 50 df<13E01201120712FF12F91201B3A7487EB512C0A2 12217AA01E>49 D E /Fd 27 123 df<121C127FEAFF80A213C0A3127F121C1200A41201 1380A2120313005A1206120E5A5A5A12600A19798817>59 DI<150C151E153EA2153C157CA2157815F8A215F01401A215E014 03A215C01407A21580140FA215005CA2141E143EA2143C147CA2147814F8A25C1301A25C 1303A2495AA25C130FA291C7FC5BA2131E133EA2133C137CA2137813F8A25B1201A25B12 03A25B1207A25B120FA290C8FC5AA2121E123EA2123C127CA2127812F8A25A12601F537B BD2A>I<1760177017F01601A21603A21607160FA24C7EA216331673166316C3A2ED0183 A2ED0303150683150C160115181530A21560A215C014011580DA03007FA202061300140E 140C5C021FB5FC5CA20260C7FC5C83495A8349C8FC1306A25BA25B13385B01F01680487E 000716FFB56C013F13FF5EA2383C7DBB3E>65 D<0103B812F05BA290260007F8C7123F4B 1407F003E0020F150118005DA2141FA25D19C0143FA24B1330A2027F1470190092C71260 17E05C16014A495A160F49B6FCA25F9138FC000F01031407A24A6DC8FCA201075C18034A 130660010F160693C7FC4A150E180C011F161C18184A1538A2013F5E18F04A4A5AA2017F 15074D5A91C8123F49913803FF80B9FCA295C7FC3C397DB83D>69 D71 D<0107B512FCA216F890390007F8005DA2140F A25DA2141FA25DA2143FA25DA2147FA292C7FCA25CA25CA21301A25CA21303A25CA21307 A25CA2130FA25CA2131FA25CA2133FA25CA2137FA291C8FC497EB6FCA326397DB824>73 D<902603FFF893383FFF80496081D900079438FF80000206DC01BFC7FCA2020E4C5A1A7E 020C1606190CDA1C7E16FE4F5A02181630A20238166162023016C1F00181DA703F158395 380303F002601506A202E0ED0C076202C01518183001016D6C140F06605B028015C0A201 03923801801FDD03005B140092380FC00649173F4D91C8FC01065DA2010E4B5B4D137E13 0C6F6C5A011C17FEDCE1805B011802E3C7FCA2013802E6130104EC5C1330ED03F8017016 034C5C01F05CD807FC4C7EB500E0D9C007B512F01680150151397CB851>77 D<902603FFF891381FFFF8496D5CA2D90007030113006FEC007C02061678DA0EFF157081 020C6D1460A2DA1C3F15E0705CEC181F82023815016F6C5C1430150702706D1303030392 C7FC02607FA2DAE0015C701306ECC0008201016E130EEF800C5C163F0103EDC01C041F13 1891C713E0160F49EDF03818300106140717F8010E02031370EFFC60130CEE01FE011C16 E004005B011815FF177F1338600130153FA20170151F95C8FC01F081EA07FCB512E01706 A245397DB843>I<0103B612F849EDFF8018E0903B0007F8001FF84BEB03FCEF00FE020F 157FA24BEC3F80A2021F16C0A25DA2143FF07F805DA2027FEDFF006092C7485A4D5A4A4A 5A4D5A4AEC1F80057FC7FC0101EC07F891B612E094C8FC9139FC000FC00103EC03F0707E 4A6D7E831307177E5C177F010F5D5F5CA2011F1401A25CA2133F16034A4A1360A2017F17 E019C091C71401496C01011480B61503933900FE0700EF7E0ECAEA1FFCEF07F03B3B7DB8 3F>82 D<0003B812FEA25A903AF8003FC00101C0913880007E4848163C90C7007F141C12 1E001C92C7FCA2485CA200305C007017180060130112E0485CA21403C716005DA21407A2 5DA2140FA25DA2141FA25DA2143FA25DA2147FA292C9FCA25CA25CA21301A25CA21303A2 5CEB0FFC003FB6FC5AA237397EB831>84 D<147E903803FF8090390FC1C38090391F00EF C0017E137F49133F485A4848EB1F8012075B000F143F48481400A2485A5D007F147E90C7 FCA215FE485C5AA214015D48150CA21403EDF01C16181407007C1538007E010F1330003E 131F027B13706C01E113E03A0F83C0F9C03A03FF007F80D800FCEB1F0026267DA42C>97 D<133FEA1FFFA3C67E137EA313FE5BA312015BA312035BA31207EBE0FCEBE3FF9038E707 C0390FFE03E09038F801F001F013F8EBE000485A15FC5BA2123F90C7FCA214015A127EA2 140312FE4814F8A2140715F05AEC0FE0A215C0EC1F80143F00781400007C137E5C383C01 F86C485A380F07C06CB4C7FCEA01FC1E3B7CB924>II101 D<14E0EB03F8A21307A314F0EB01C090C7FCAB13F8EA03FEEA070F000E1380121C121812 381230EA701F1260133F00E0130012C05BEA007EA213FE5B1201A25B12035BA200071318 13E01438000F133013C01470EB806014E014C01381EB838038078700EA03FEEA00F81539 7EB71D>105 D<150FED3F80A2157FA31600151C92C7FCABEC0F80EC3FE0ECF0F0903801 C0F849487E14005B130E130C131CEB1801133801305BA2EB0003A25DA21407A25DA2140F A25DA2141FA25DA2143FA292C7FCA25CA2147EA214FEA25CA21301001E5B123F387F83F0 A238FF87E0495A00FE5BD87C1FC8FCEA707EEA3FF8EA0FC0214981B722>III 110 D<90390F8003F090391FE00FFC903939F03C1F903A70F8700F80903AE0FDE007C090 38C0FF80030013E00001491303018015F05CEA038113015CA2D800031407A25CA2010714 0FA24A14E0A2010F141F17C05CEE3F80131FEE7F004A137E16FE013F5C6E485A4B5A6E48 5A90397F700F80DA383FC7FC90387E1FFCEC07E001FEC9FCA25BA21201A25BA21203A25B 1207B512C0A32C3583A42A>112 D<3903E001F83907F807FE390E3C1E07391C3E381F3A 183F703F800038EBE07F0030EBC0FF00705B00601500EC007E153CD8E07F90C7FCEAC07E A2120013FE5BA312015BA312035BA312075BA3120F5BA3121F5B0007C9FC21267EA425> 114 D<14FF010313C090380F80F090383E00380178131C153C4913FC0001130113E0A339 03F000F06D13007F3801FFE014FC14FF6C14806D13C0011F13E013039038003FF0140714 03001E1301127FA24814E0A348EB03C012F800E0EB07800070EB0F006C133E001E13F838 07FFE0000190C7FC1E267CA427>II<903907E001F090391FF807FC9039783E0E0F9039E01F1C1FD801C09038383F 803A03800FF07F0100EBE0FF5A000E4A1300000C157E021F133C001C4AC7FC1218A2C712 3FA292C8FCA25CA2147EA214FEA24A130CA20101141C001E1518003F5BD87F8114380183 5C00FF1560010714E03AFE0E7C01C0D87C1C495A2778383E0FC7FC391FF00FFC3907C003 F029267EA42F>120 D<13F8D803FE1470D8070F14F8000EEB8001121C12180038140300 3015F0EA701F1260013F130700E0010013E012C05BD8007E130F16C013FE5B151F000115 805BA2153F000315005BA25D157EA315FE5D1401000113033800F80790387C1FF8EB3FF9 EB0FE1EB00035DA2000E1307D83F805B007F495AA24A5A92C7FCEB003E007C5B00705B6C 485A381E07C06CB4C8FCEA01FC25367EA429>II E /Fe 8 122 df75 D100 D<903803FF80011F13F0017F13FC3901FF83FE3A03FE007F804848133F4848 14C0001FEC1FE05B003FEC0FF0A2485A16F8150712FFA290B6FCA301E0C8FCA4127FA36C 7E1678121F6C6C14F86D14F000071403D801FFEB0FE06C9038C07FC06DB51200010F13FC 010113E025257DA42C>I<903801FFC0010F13F8017F13FFD9FF807F3A03FE003FE04848 6D7E48486D7E48486D7EA2003F81491303007F81A300FF1680A9007F1600A3003F5D6D13 07001F5DA26C6C495A6C6C495A6C6C495A6C6C6CB45A6C6CB5C7FC011F13FC010113C029 257DA430>111 D<9038FE03F000FFEB0FFEEC3FFF91387C7F809138F8FFC000075B6C6C 5A5CA29138807F80ED3F00150C92C7FC91C8FCB3A2B512FEA422257EA427>114 D<90383FF0383903FFFEF8000F13FF381FC00F383F0003007E1301007C130012FC15787E 7E6D130013FCEBFFE06C13FCECFF806C14C06C14F06C14F81203C614FC131F9038007FFE 140700F0130114007E157E7E157C6C14FC6C14F8EB80019038F007F090B512C000F81400 38E01FF81F257DA426>I119 D121 D E /Ff 32 121 df<157815FC14031407141F14FF130F0007B5FC B6FCA2147F13F0EAF800C7FCB3B3B3A6007FB712FEA52F4E76CD43>49 DI<91380FFFC091B512FC0107ECFF80011F15E09026 3FF8077F9026FF800113FC4848C76C7ED803F86E7E491680D807FC8048B416C080486D15 E0A4805CA36C17C06C5B6C90C75AD801FC1680C9FC4C13005FA24C5A4B5B4B5B4B13C04B 5BDBFFFEC7FC91B512F816E016FCEEFF80DA000713E0030113F89238007FFE707E701380 7013C018E07013F0A218F8A27013FCA218FEA2EA03E0EA0FF8487E487E487EB57EA318FC A25E18F891C7FC6C17F0495C6C4816E001F04A13C06C484A1380D80FF84A13006CB44A5A 6CD9F0075BC690B612F06D5D011F1580010302FCC7FCD9001F1380374F7ACD43>I<177C 17FEA2160116031607160FA2161F163F167FA216FF5D5DA25D5DED1FBFED3F3F153E157C 15FCEC01F815F0EC03E01407EC0FC01580EC1F005C147E147C5C1301495A495A5C495A13 1F49C7FC133E5B13FC485A5B485A1207485A485A90C8FC123E127E5ABA12C0A5C96C48C7 FCAF020FB712C0A53A4F7CCE43>III<171F4D7E4D 7EA24D7EA34C7FA24C7FA34C7FA34C7FA24C7FA34C8083047F80167E8304FE804C7E0301 8116F8830303814C7E03078116E083030F814C7E031F81168083033F8293C77E4B82157E 8403FE824B800201835D840203834B800207835D844AB87EA24A83A3DA3F80C88092C97E 4A84A2027E8202FE844A82010185A24A820103854A82010785A24A82010F855C011F717F EBFFFCB600F8020FB712E0A55B547BD366>65 D<932601FFFCEC01C0047FD9FFC0130303 07B600F81307033F03FE131F92B8EA803F0203DAE003EBC07F020F01FCC7383FF0FF023F 01E0EC0FF94A01800203B5FC494848C9FC4901F8824949824949824949824949824990CA 7E494883A2484983485B1B7F485B481A3FA24849181FA3485B1B0FA25AA298C7FC5CA2B5 FCAE7EA280A2F307C07EA36C7FA21B0F6C6D1980A26C1A1F6C7F1C006C6D606C6D187EA2 6D6C606D6D4C5A6D6D16036D6D4C5A6D6D4C5A6D01FC4C5A6D6DEE7F806D6C6C6C4BC7FC 6E01E0EC07FE020F01FEEC1FF80203903AFFE001FFF0020091B612C0033F93C8FC030715 FCDB007F14E0040101FCC9FC525479D261>67 DII73 D78 D80 D82 D97 DI<913801FFF8021FEBFF80 91B612F0010315FC010F9038C00FFE903A1FFE0001FFD97FFC491380D9FFF05B4817C048 495B5C5A485BA2486F138091C7FC486F1300705A4892C8FC5BA312FFAD127F7FA27EA2EF 03E06C7F17076C6D15C07E6E140F6CEE1F806C6DEC3F006C6D147ED97FFE5C6D6CEB03F8 010F9038E01FF0010390B55A01001580023F49C7FC020113E033387CB63C>I<4DB47E04 07B5FCA5EE001F1707B3A4913801FFE0021F13FC91B6FC010315C7010F9038E03FE74990 380007F7D97FFC0101B5FC49487F4849143F484980485B83485B5A91C8FC5AA3485AA412 FFAC127FA36C7EA37EA26C7F5F6C6D5C7E6C6D5C6C6D49B5FC6D6C4914E0D93FFED90FEF EBFF80903A0FFFC07FCF6D90B5128F0101ECFE0FD9003F13F8020301C049C7FC41547CD2 4B>I<913803FFC0023F13FC49B6FC010715C04901817F903A3FFC007FF849486D7E4948 6D7E4849130F48496D7E48178048497F18C0488191C7FC4817E0A248815B18F0A212FFA4 90B8FCA318E049CAFCA6127FA27F7EA218E06CEE01F06E14037E6C6DEC07E0A26C6DEC0F C06C6D141F6C6DEC3F806D6CECFF00D91FFEEB03FE903A0FFFC03FF8010390B55A010015 C0021F49C7FC020113F034387CB63D>III<137F497E000313E0487FA2487FA76C5BA26C5BC613806DC7FC90C8FCAD EB3FF0B5FCA512017EB3B3A6B612E0A51B547BD325>105 D108 D110 D<913801FFE0021F13FE91B612C001 0315F0010F9038807FFC903A1FFC000FFED97FF86D6C7E49486D7F48496D7F48496D7F4A 147F48834890C86C7EA24883A248486F7EA3007F1880A400FF18C0AC007F1880A3003F18 006D5DA26C5FA26C5F6E147F6C5F6C6D4A5A6C6D495B6C6D495B6D6C495BD93FFE011F90 C7FC903A0FFF807FFC6D90B55A010015C0023F91C8FC020113E03A387CB643>I<903A3F F001FFE0B5010F13FE033FEBFFC092B612F002F301017F913AF7F8007FFE0003D9FFE0EB 1FFFC602806D7F92C76C7F4A824A6E7F4A6E7FA2717FA285187F85A4721380AC1A0060A3 6118FFA2615F616E4A5BA26E4A5B6E4A5B6F495B6F4990C7FC03F0EBFFFC9126FBFE075B 02F8B612E06F1480031F01FCC8FC030313C092CBFCB1B612F8A5414D7BB54B>I<90397F E003FEB590380FFF80033F13E04B13F09238FE1FF89139E1F83FFC0003D9E3E013FEC6EC C07FECE78014EF150014EE02FEEB3FFC5CEE1FF8EE0FF04A90C7FCA55CB3AAB612FCA52F 367CB537>114 D<903903FFF00F013FEBFE1F90B7FC120348EB003FD80FF81307D81FE0 130148487F4980127F90C87EA24881A27FA27F01F091C7FC13FCEBFFC06C13FF15F86C14 FF16C06C15F06C816C816C81C681013F1580010F15C01300020714E0EC003F030713F015 010078EC007F00F8153F161F7E160FA27E17E07E6D141F17C07F6DEC3F8001F8EC7F0001 FEEB01FE9039FFC00FFC6DB55AD8FC1F14E0D8F807148048C601F8C7FC2C387CB635>I< 143EA6147EA414FEA21301A313031307A2130F131F133F13FF5A000F90B6FCB8FCA42600 3FFEC8FCB3A9EE07C0AB011FEC0F8080A26DEC1F0015806DEBC03E6DEBF0FC6DEBFFF86D 6C5B021F5B020313802A4D7ECB34>III<007FB500F090387FFFFEA5C66C48C7000F90C7FC 6D6CEC07F86D6D5C6D6D495A6D4B5A6F495A6D6D91C8FC6D6D137E6D6D5B91387FFE014C 5A6E6C485A6EEB8FE06EEBCFC06EEBFF806E91C9FCA26E5B6E5B6F7E6F7EA26F7F834B7F 4B7F92B5FCDA01FD7F03F87F4A486C7E4A486C7E020F7FDA1FC0804A486C7F4A486C7F02 FE6D7F4A6D7F495A49486D7F01076F7E49486E7E49486E7FEBFFF0B500FE49B612C0A542 357EB447>120 D E /Fg 4 107 df<007FB81280B912C0A26C17803204799641>0 D3 D24 D<126012F0B3B3B3B3A912 60045377BD17>106 D E /Fh 28 120 df<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80 EA1F000B0B708A2C>46 D<1507ED0F80151FA2153F16005D157E15FE5D14015D14035DA2 14075D140F5D141F5D143F92C7FC5C147E14FE5CA213015C13035C13075C130F5C131F5C A2133F91C8FC5B137E13FE5B12015B12035B12075BA2120F5B121F5B123F90C9FC5A127E 12FE5AA25A127821417BB92C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F00C7 FCAE121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B2470A32C>58 D64 D72 D<007FB512F8B612FCA36C14F839000FC000B3B3A5007FB512F8B612FCA36C14F81E3379 B22C>I78 D<007FB612FCB712FEA43AFC007E007EA70078153CC71400B3AF90383F FFFCA2497F6D5BA227337EB22C>84 D<3801FFF0000713FE001F6D7E15E048809038C01F F81407EC01FC381F80000006C77EC8127EA3ECFFFE131F90B5FC1203120F48EB807E383F F800EA7FC090C7FC12FE5AA47E007F14FEEB8003383FE01F6CB612FC6C15FE6C14BF0001 EBFE1F3A003FF007FC27247CA32C>97 DI<903803FFE0011F13F8017F13FE48B5FC 48804848C6FCEA0FF0485A49137E4848131890C9FC5A127EA25AA8127EA2127F6C140F6D EB1F806C7E6D133F6C6CEB7F003907FE03FF6CB55A6C5C6C6C5B011F13E0010390C7FC21 247AA32C>I101 DIII<1307EB1FC0A2497EA36D5AA201 07C7FC90C8FCA7387FFFC080B5FC7EA2EA0007B3A8007FB512FCB612FEA36C14FC1F3479 B32C>I107 D<387FFFE0B57EA37EEA0003B3B3A5007FB61280B712C0A36C158022337B B22C>I<3A7F83F007E09039CFFC1FF83AFFDFFE3FFCD87FFF13FF91B57E3A07FE1FFC3E 01FCEBF83F496C487E01F013E001E013C0A301C01380B33B7FFC3FF87FF0027F13FFD8FF FE6D13F8D87FFC4913F0023F137F2D2481A32C>I<397FF01FE039FFF87FFC9038F9FFFE 01FB7F6CB6FC00019038F03F80ECC01F02807FEC000F5B5BA25BB3267FFFE0B5FCB500F1 1480A36C01E0140029247FA32C>II<397FF01FE039FFF8FFF801FB13FE90B6FC6C 158000019038F07FC09138801FE091380007F049EB03F85BED01FC491300A216FE167EA8 16FE6D14FCA2ED01F86D13036DEB07F0150F9138801FE09138E07FC091B51280160001FB 5B01F813F8EC3FC091C8FCAD387FFFE0B57EA36C5B27367FA32C>I114 D<90387FF8700003B512F8120F 5A5A387FC00F387E00034813015AA36CEB00F0007F140013F0383FFFC06C13FE6CEBFF80 000314E0C66C13F8010113FCEB0007EC00FE0078147F00FC143F151F7EA26C143F6D133E 6D13FE9038F007FC90B5FC15F815E000F8148039701FFC0020247AA32C>I<131E133FA9 007FB6FCB71280A36C1500D8003FC8FCB1ED03C0ED07E0A5EC800F011FEB1FC0ECE07F6D B51280160001035B6D13F89038003FE0232E7EAD2C>I<3A7FF003FF80486C487FA3007F 7F0001EB000FB3A3151FA2153F6D137F3900FE03FF90B7FC6D15807F6D13CF902603FE07 130029247FA32C>I<3A7FFF01FFFCB514FE148314016C15FC3A03E0000F80A26D131F00 011500A26D5B0000143EA26D137E017C137CA2017E13FC013E5BA2EB3F01011F5BA21483 010F5BA214C701075BA214EF01035BA214FF6D90C7FCA26D5A147C27247EA32C>II E /Fi 82 123 df11 DIII<001C131C007F137F39FF80FF 80A26D13C0A3007F137F001C131C00001300A40001130101801380A20003130301001300 485B00061306000E130E485B485B485B006013601A197DB92A>34 D<121C127FEAFF80A213C0A3127F121C1200A412011380A2120313005A1206120E5A5A5A 12600A1979B917>39 D<146014E0EB01C0EB0380EB0700130E131E5B5BA25B485AA2485A A212075B120F90C7FCA25A121EA2123EA35AA65AB2127CA67EA3121EA2121F7EA27F1207 7F1203A26C7EA26C7E1378A27F7F130E7FEB0380EB01C0EB00E01460135278BD20>I<12 C07E12707E7E7E120F6C7E6C7EA26C7E6C7EA21378A2137C133C133E131EA2131F7FA214 80A3EB07C0A6EB03E0B2EB07C0A6EB0F80A31400A25B131EA2133E133C137C1378A25BA2 485A485AA2485A48C7FC120E5A5A5A5A5A13527CBD20>II<15301578B3A6007FB812F8B912FCA2 6C17F8C80078C8FCB3A6153036367BAF41>I<121C127FEAFF80A213C0A3127F121C1200 A412011380A2120313005A1206120E5A5A5A12600A19798817>I I<121C127FEAFF80A5EA7F00121C0909798817>I<150C151E153EA2153C157CA2157815 F8A215F01401A215E01403A215C01407A21580140FA215005CA2141E143EA2143C147CA2 147814F8A25C1301A25C1303A2495AA25C130FA291C7FC5BA2131E133EA2133C137CA213 7813F8A25B1201A25B1203A25B1207A25B120FA290C8FC5AA2121E123EA2123C127CA212 7812F8A25A12601F537BBD2A>IIIII<1538A2157815F8A2140114031407A2140F141F141B14331473146314C3 13011483EB030313071306130C131C131813301370136013C01201EA038013005A120E12 0C5A123812305A12E0B712F8A3C73803F800AB4A7E0103B512F8A325397EB82A>I<0006 140CD80780133C9038F003F890B5FC5D5D158092C7FC14FC38067FE090C9FCABEB07F8EB 3FFE9038780F803907E007E090388003F0496C7E12066E7EC87EA28181A21680A4123E12 7F487EA490C71300485C12E000605C12700030495A00385C6C1303001E495A6C6C485A39 07E03F800001B5C7FC38007FFCEB1FE0213A7CB72A>II<12301238123E003FB612E0A316C05A168016000070C712060060140E5D151800E014 38485C5D5DC712014A5A92C7FC5C140E140C141C5CA25CA214F0495AA21303A25C1307A2 130FA3495AA3133FA5137FA96DC8FC131E233B7BB82A>III<121C127FEAFF80A5EA7F00121CC7FCB2121C127FEAFF80A5EA 7F00121C092479A317>I<121C127FEAFF80A5EA7F00121CC7FCB2121C127F5A1380A412 7F121D1201A412031300A25A1206A2120E5A121812385A1260093479A317>I<007FB812 F8B912FCA3CCFCAEB912FCA36C17F836167B9F41>61 D63 D<1538A3157CA315FEA34A7EA34A6C 7EA202077FEC063FA2020E7FEC0C1FA2021C7FEC180FA202387FEC3007A202707FEC6003 A202C07F1501A2D901807F81A249C77F167FA20106810107B6FCA24981010CC7121FA249 6E7EA3496E7EA3496E7EA213E0707E1201486C81D80FFC02071380B56C90B512FEA3373C 7DBB3E>65 DI<913A01FF800180020FEBE003027F13F8903A01FF80 7E07903A03FC000F0FD90FF0EB039F4948EB01DFD93F80EB00FF49C8127F01FE153F1201 4848151F4848150FA248481507A2485A1703123F5B007F1601A35B00FF93C7FCAD127F6D ED0180A3123F7F001F160318006C7E5F6C7E17066C6C150E6C6C5D00001618017F15386D 6C5CD91FE05C6D6CEB03C0D903FCEB0F80902701FF803FC7FC9039007FFFFC020F13F002 011380313D7BBA3C>IIIIIII<013FB512E0A39039001FFC00EC07F8B3B3A3123FEA7F80EAFFC0A44A5A 1380D87F005B0070131F6C5C6C495A6C49C7FC380781FC3801FFF038007F80233B7DB82B >IIIIIIIIII<003FB812E0A3D9C003EB001F273E00 01FE130348EE01F00078160000701770A300601730A400E01738481718A4C71600B3B091 3807FF80011FB612E0A335397DB83C>IIII<007FB590383FFFFCA3C601F8 01071380D97FE0D903FCC7FC013FEC01F06D6C5C5F6D6C5C6D6C13034CC8FC6D6C130616 0E6D6C5B6DEB8018163891387FC0306E6C5A16E06E6C5A91380FF18015FB6EB4C9FC5D14 036E7EA26E7F6F7EA24B7E15DF9138019FF09138038FF8150F91380607FC91380E03FE14 0C4A6C7EEC38000230804A6D7E14E04A6D7E49486D7E130391C76C7E01066E7E130E010C 6E7E011C1401013C8101FE822607FF80010713E0B500E0013FEBFF80A339397EB83E>I< B500FE91383FFFE0A3000301E0913807FE00C649EC03F0017F6F5A606D6C5D6D6C140395 C7FC6D6C1406A26D6C5C6D6C141C17186D6C143817306D6D5B6E6C13E05F91383FE0015F 91381FF003DA0FF890C8FC1606913807FC0E160C913803FE1C913801FF185E6E13B016E0 157F6F5AB3A24B7E023FB512C0A33B397FB83E>I91 D<3901800180000313033907000700000E130E485B00181318003813 38003013300070137000601360A200E013E0485BA400CE13CE39FF80FF806D13C0A3007F 137FA2393F803F80390E000E001A1974B92A>II97 DIIII<147E903803FF8090380F C1E0EB1F8790383F0FF0137EA213FCA23901F803C091C7FCADB512FCA3D801F8C7FCB3AB 487E387FFFF8A31C3B7FBA19>III< EA0380EA0FE0487EA56C5AEA0380C8FCAAEA03F012FFA312071203B3AA487EB512C0A312 387EB717>IIII<2703F00FF0EB1FE000FFD93FFCEB7FF8 913AF03F01E07E903BF1C01F83803F3D0FF3800FC7001F802603F70013CE01FE14DC49D9 07F8EB0FC0A2495CA3495CB3A3486C496CEB1FE0B500C1B50083B5FCA340257EA445>I< 3903F00FF000FFEB3FFCECF03F9039F1C01F803A0FF3800FC03803F70013FE496D7EA25B A35BB3A3486C497EB500C1B51280A329257EA42E>II<3903F01FE000 FFEB7FF89038F1E07E9039F3801F803A07F7000FC0D803FEEB07E049EB03F04914F84913 0116FC150016FEA3167FAA16FEA3ED01FCA26DEB03F816F06D13076DEB0FE001F614C090 39F7803F009038F1E07E9038F0FFF8EC1FC091C8FCAB487EB512C0A328357EA42E>I I<3807E01F00FFEB7FC09038E1E3E09038E387F0380FE707EA03E613EE9038EC03E09038 FC0080491300A45BB3A2487EB512F0A31C257EA421>II<1318A51338A31378A313F8120112031207 001FB5FCB6FCA2D801F8C7FCB215C0A93800FC011580EB7C03017E13006D5AEB0FFEEB01 F81A347FB220>IIIIII<003FB512FCA2EB8003D83E0013F8003CEB07F00038EB0FE012 300070EB1FC0EC3F800060137F150014FE495AA2C6485A495AA2495A495A495AA290387F 000613FEA2485A485A0007140E5B4848130C4848131CA24848133C48C7127C48EB03FC90 B5FCA21F247EA325>I E /Fj 22 120 df58 D65 D69 D73 D78 D80 D<903801FFE0011F13FE017F6D7E48 B612E03A03FE007FF84848EB1FFC6D6D7E486C6D7EA26F7FA36F7F6C5A6C5AEA00F090C7 FCA40203B5FC91B6FC1307013F13F19038FFFC01000313E0000F1380381FFE00485A5B12 7F5B12FF5BA35DA26D5B6C6C5B4B13F0D83FFE013EEBFFC03A1FFF80FC7F0007EBFFF86C ECE01FC66CEB8007D90FFCC9FC322F7DAD36>97 D99 DIII107 DI<90277F8007FEEC0FFCB590 263FFFC090387FFF8092B5D8F001B512E002816E4880913D87F01FFC0FE03FF8913D8FC0 0FFE1F801FFC0003D99F009026FF3E007F6C019E6D013C130F02BC5D02F86D496D7EA24A 5D4A5DA34A5DB3A7B60081B60003B512FEA5572D7CAC5E>I<90397F8007FEB590383FFF 8092B512E0028114F8913987F03FFC91388F801F000390399F000FFE6C139E14BC02F86D 7E5CA25CA35CB3A7B60083B512FEA5372D7CAC3E>II<90397FC00FF8B590B57E02C314E002CF14F89139DFC03FFC91 39FF001FFE000301FCEB07FF6C496D13804A15C04A6D13E05C7013F0A2EF7FF8A4EF3FFC ACEF7FF8A318F017FFA24C13E06E15C06E5B6E4913806E4913006E495A9139DFC07FFC02 CFB512F002C314C002C091C7FCED1FF092C9FCADB67EA536407DAC3E>I<90387F807FB5 3881FFE0028313F0028F13F8ED8FFC91389F1FFE000313BE6C13BC14F8A214F0ED0FFC91 38E007F8ED01E092C7FCA35CB3A5B612E0A5272D7DAC2E>114 D116 DIII E end TeXDict begin 1 0 bop 284 109 a Fj(NetPIPE:)36 b(A)h(Net)m(w)m(ork)f(Proto)s(col)g (Indep)s(enden)m(t)i(P)m(erformance)f(Ev)-6 b(aluator)919 350 y Fi(Quinn)27 b(O.)h(Snell,)g(Armin)g(R.)f(Mikler)h(and)f(John)g (L.)h(Gustafson)699 466 y(Ames)g(Lab)r(oratory/Scalable)c(Computing)k (Lab,)f(Ames,)h(Io)n(w)n(a)e(50011,)f(USA)1273 583 y Fh(snell)p Fg(j)p Fh(mikler)p Fg(j)p Fh(gus@sc)o(l.)o(ame)o(sl)o(ab.)o (go)o(v)-150 908 y Ff(Abstract)-150 1150 y Fi(This)52 b(pap)r(er)f(presen)n(ts)h(the)g(design)f(of)h(NetPIPE,)f(a)h(new)-150 1250 y(Net)n(w)n(ork)32 b(Proto)r(col)f(Indep)r(enden)n(t)i(P)n (erformance)e(Ev)-5 b(aluator.)-150 1349 y(NetPIPE)35 b(maps)g(the)h(p)r(erformance)e(of)i(a)f(net)n(w)n(ork)f(across)f(a) -150 1449 y(wide)45 b(range)f(and)h(presen)n(ts)f(the)i(data)e(in)i(a)e (new)i(manner.)-150 1549 y(Its)27 b(proto)r(col)f(indep)r(endence)i (allo)n(ws)d(for)i(visualization)f(of)h(the)-150 1648 y(o)n(v)n(erhead)33 b(asso)r(ciated)i(with)h(a)f(proto)r(col)f(la)n(y)n (er.)60 b(Using)35 b(Net-)-150 1748 y(PIPE)26 b(has)h(led)g(to)h(the)f (disco)n(v)n(ery)f(of)h(a)g(deep)h(plunge)f(in)h(A)-7 b(TM)-150 1847 y(p)r(erformance)23 b(for)h(certain)g(transfer)g(blo)r (c)n(k)g(sizes,)h(whic)n(h)f(is)h(ex-)-150 1947 y(amined)e(in)g (detail.)35 b(The)23 b(p)r(erformance)e(drop)h(is)h(also)e(sho)n(wn)h (to)-150 2047 y(exist)32 b(at)g(certain)g(blo)r(c)n(k)f(sizes)h(for)g (FDDI.)h(Both)f(ab)r(errations)-150 2146 y(are)27 b(not)g(detected)h(b) n(y)g(other)f(b)r(enc)n(hmarks.)-150 2246 y Fe(Keyw)m(ords)67 b Fi(P)n(erformance)e(Analysis,)76 b(Net)n(w)n(ork,)g(A)-7 b(TM,)-150 2346 y(FDDI,)29 b(Ethernet)-150 2706 y Ff(1)135 b(In)l(tro)t(duction)-150 2948 y Fi(In)44 b(recen)n(t)f(y)n(ears,)i(m)n (uc)n(h)f(researc)n(h)d(has)i(b)r(een)h(directed)g(to-)-150 3047 y(w)n(ards)f(ev)-5 b(aluating)44 b(the)h(p)r(erformance)e(of)i (high)f(sp)r(eed)h(net-)-150 3147 y(w)n(orks.)62 b([2)o(,)37 b(3)o(,)g(4)o(,)g(5])f(The)h(design)f(of)g(NetPIPE,)f(a)h(net)n(w)n (ork)-150 3247 y(proto)r(col)g(indep)r(enden)n(t)j(p)r(erformance)d(ev) -5 b(aluator,)39 b(has)e(b)r(een)-150 3346 y(motiv)-5 b(ated)23 b(b)n(y)f(the)h(need)g(to)g(assess)e(the)i(p)r(erformance)f (of)h(com-)-150 3446 y(m)n(unication)31 b(b)r(ound)g(applications.)47 b(NetPIPE)30 b(helps)i(answ)n(er)-150 3546 y(questions)25 b(that)h(surround)f(net)n(w)n(ork)f(comm)n(unications)h(inher-)-150 3645 y(en)n(t)42 b(to)g(these)g(applications.)80 b(These)42 b(applications)f(include)-150 3745 y(\014le)d(transfer)e(and)h (graphical)f(sim)n(ulations)g(for)h(displa)n(y)g(in)g(a)-150 3844 y(virtual)h(realit)n(y)g(en)n(vironmen)n(t,)j(suc)n(h)e(as)f(CA)-9 b(VE)39 b([13)o(])g(appli-)-150 3944 y(cations,)d(whic)n(h)g(require)e (frame)g(transfers)g(from)h(a)g(compute)-150 4044 y(serv)n(er.)49 b(While)32 b(\014le)h(transfer)e(applications)g(allo)n(w)g(streaming) -150 4143 y(of)k(data,)i(a)f(graphical)d(sim)n(ulation)i(requires)f (blo)r(c)n(ks)h(of)h(data)-150 4243 y(transmitted)29 b(at)g(regular)e(in)n(terv)-5 b(als)28 b(to)h(main)n(tain)f (full-motion)-150 4343 y(video.)38 b(The)28 b(size)g(of)g(eac)n(h)f (blo)r(c)n(k)h(and)f(the)i(n)n(um)n(b)r(er)f(of)g(frames)-150 4442 y(p)r(er)38 b(second)f(are)g(enough)g(to)h(sp)r(ecify)g(a)f(minim) n(um)h(net)n(w)n(ork)-150 4542 y(throughput)27 b(required)g(to)h(main)n (tain)f(realistic)f(animation.)-67 4695 y(With)33 b(the)f(applications) f(in)h(mind,)h(sev)n(eral)d(questions)h(can)-150 4795 y(b)r(e)43 b(ask)n(ed)f(in)g(reference)g(to)h(the)g(net)n(w)n(ork)e (comm)n(unication.)-150 4894 y(F)-7 b(or)36 b(instance,)i(ho)n(w)e(so)r (on)f(will)i(a)f(giv)n(en)f(data)h(blo)r(c)n(k)g(of)g(size)-150 4994 y Fd(k)g Fi(arriv)n(e)c(at)h(its)h(destination?)54 b(Whic)n(h)34 b(net)n(w)n(ork)e(and)h(proto-)-150 5094 y(col)j(will)h(transmit)f(size)h Fd(k)i Fi(blo)r(c)n(ks)d(the)h (fastest?)64 b(What)37 b(is)f(a)-150 5193 y(giv)n(en)26 b(net)n(w)n(ork's)f(e\013ectiv)n(e)h(maxim)n(um)h(throughput)f(and)h (sat-)p -150 5292 810 4 v -58 5346 a Fc(1)-23 5369 y Fb(This)i(w)n(ork)h(w)n(as)g(supp)r(orted)h(b)n(y)g(the)f(Applied)g (Mathematical)g(Sci-)-150 5448 y(ences)e(Program)d(of)i(the)h(Ames)e (Lab)r(oratory)-6 b(,)28 b(U.S.)e(Departmen)n(t)i(of)e(En-)-150 5527 y(ergy)e(under)g(con)n(tract)h(n)n(um)n(b)r(er)e(W-7405-ENG-82) 2025 908 y Fi(uration)29 b(lev)n(el?)43 b(Do)r(es)30 b(there)g(exist)g(a)f(blo)r(c)n(k)g(size)h Fd(k)j Fi(for)c(whic)n(h) 2025 1008 y(the)34 b(throughput)f(is)h(maximized?)55 b(Ho)n(w)33 b(m)n(uc)n(h)g(comm)n(unica-)2025 1107 y(tion)25 b(o)n(v)n(erhead)e(is)h(due)i(to)e(the)i(net)n(w)n(ork)d(comm)n (unication)h(pro-)2025 1207 y(to)r(col)39 b(la)n(y)n(er\(s\)?)70 b(Ho)n(w)39 b(quic)n(kly)g(will)g(a)g(small)g(\()p Fd(<)g Fi(1)g(kb)n(yte\))2025 1307 y(con)n(trol)25 b(message)h(arriv)n(e,)f (and)h(whic)n(h)h(net)n(w)n(ork)e(and)h(proto)r(col)2025 1406 y(are)h(b)r(est)h(for)f(this)h(purp)r(ose?)2108 1560 y(The)22 b(answ)n(ers)e(to)h(suc)n(h)h(questions)f(are)f(not)i (alw)n(a)n(ys)e(straigh)n(t-)2025 1659 y(forw)n(ard)j(and)i(easy)e(to)i (obtain)g(with)g(curren)n(t)f(net)n(w)n(ork)f(p)r(erfor-)2025 1759 y(mance)29 b(to)r(ols.)42 b(The)29 b(t)n(w)n(o)g(most)g(p)r (opular)g(to)r(ols,)g Fh(ttcp)f Fi([3])h(and)2025 1858 y Fh(netperf)c Fi([2],)j(are)g(based)f(on)h(the)h(TCP/IP)d([7,)i(8,)g (9)o(])h(comm)n(u-)2025 1958 y(nications)24 b(proto)r(col.)35 b(While)26 b(netp)r(erf)f(has)f(the)i(abilit)n(y)e(to)h(map)2025 2058 y(net)n(w)n(ork)20 b(p)r(erformance,)h(comparing)e(net)n(w)n(ork)h (proto)r(cols)g(with)2025 2157 y(these)30 b(to)r(ols)f(is)g(di\016cult) i(if)f(not)f(imp)r(ossible.)43 b(Finding)30 b(the)g(ef-)2025 2257 y(fectiv)n(e)d(maxim)n(um)g(bandwidth)g(using)f(ttcp)i(is)f(an)f (exercise)g(in)2025 2357 y(delving)d(in)n(to)h(proto)r(col)f(in)n (ternals.)34 b(Kno)n(wledge)23 b(of)g(the)i(appro-)2025 2456 y(priate)33 b(bu\013er)h(size,)h(alignmen)n(t)e(address,)h(and)g (proto)r(col)e(set-)2025 2556 y(tings)26 b(is)g(required)g(to)g(ac)n (hiev)n(e)f(data)h(transfer)f(at)h(the)h(e\013ectiv)n(e)2025 2655 y(maxim)n(um)g(bandwidth.)2108 2809 y(With)58 b(the)f(v)-5 b(arious)56 b(net)n(w)n(ork)g(t)n(yp)r(es)h(a)n(v)-5 b(ailable)55 b(\(A)-7 b(TM,)2025 2908 y(FDDI,)34 b(HIPPI,)f(Ethernet,)i (etc.\),)g(it)f(is)f(di\016cult)h(to)f(select)g(a)2025 3008 y(net)n(w)n(ork)j(infrastructure)h(whic)n(h)h(b)r(est)g (satis\014es)f(an)h(applica-)2025 3108 y(tion's)32 b(bandwidth)h (requiremen)n(t.)51 b(The)33 b(design)f(of)g(NetPIPE)2025 3207 y(has)e(b)r(een)h(motiv)-5 b(ated)31 b(b)n(y)f(the)h(need)f(to)h (select)f(a)g(net)n(w)n(ork)f(in-)2025 3307 y(frastructure)k(for)h(v)-5 b(arious)32 b(t)n(yp)r(es)j(of)f(applications)f(and)h(com-)2025 3406 y(m)n(unication)21 b(with)h(a)f(CA)-9 b(VE)22 b(virtual)f(realit)n (y)f(en)n(vironmen)n(t.)34 b(In)2025 3506 y(addition)d(NetPIPE)e(pro)n (vides)g(for)h(visualization)g(of)g(net)n(w)n(ork)2025 3606 y(p)r(erformance)40 b(and)g(the)h(information)f(necessary)f(to)i (answ)n(er)2025 3705 y(the)28 b(ab)r(o)n(v)n(e)e(questions.)2108 3859 y(This)h(pap)r(er)g(presen)n(ts)f(NetPIPE)g(and)h(some)f(of)h(the) h(results)2025 3958 y(obtained)23 b(through)f(its)h(use.)35 b(In)23 b(the)g(next)g(section,)g(w)n(e)g(presen)n(t)2025 4058 y(the)32 b(NetPIPE)f(driv)n(er)g(and)h(its)g(underlying)f (principles.)49 b(Sec-)2025 4157 y(tions)27 b(3)h(and)f(4)g(consist)h (of)f(results)g(obtained)h(using)f(NetPIPE)2025 4257 y(in)h(a)e(v)-5 b(ariet)n(y)27 b(of)g(net)n(w)n(ork)f(infrastructures.) 35 b(A)28 b(summary)e(and)2025 4357 y(conclusion)38 b(with)h(answ)n (ers)e(to)i(the)g(questions)f(p)r(osed)g(ab)r(o)n(v)n(e)2025 4456 y(can)27 b(b)r(e)h(found)g(in)g(Section)g(5.)2025 4792 y Ff(2)135 b(NetPIPE)46 b(Design)2025 5029 y Fi(NetPIPE)30 b(consists)g(of)h(t)n(w)n(o)f(parts:)43 b(a)30 b(proto)r(col)g(indep)r (enden)n(t)2025 5129 y(driv)n(er,)39 b(and)f(a)g(proto)r(col)f(sp)r (eci\014c)h(comm)n(unication)f(section.)2025 5228 y(The)24 b(comm)n(unication)g(section)g(con)n(tains)f(the)h(necessary)f(func-) 2025 5328 y(tions)35 b(to)g(establish)g(a)g(connection,)h(send)g(and)f (receiv)n(e)f(data,)2025 5428 y(and)h(close)f(a)h(connection.)58 b(This)35 b(part)f(is)h(di\013eren)n(t)g(for)g(eac)n(h)2025 5527 y(proto)r(col.)g(Ho)n(w)n(ev)n(er,)25 b(the)i(in)n(terface)e(b)r (et)n(w)n(een)i(the)f(driv)n(er)f(and)p eop 2 1 bop -150 -90 a Fi(proto)r(col)20 b(mo)r(dule)h(remains)f(the)h (same.)34 b(Therefore,)21 b(the)g(driv)n(er)-150 10 y(do)r(es)30 b(not)h(ha)n(v)n(e)e(to)h(b)r(e)h(altered)f(in)h(order)e(to)h(c)n (hange)g(comm)n(u-)-150 109 y(nication)d(proto)r(cols.)-67 263 y(The)f(driv)n(er)e(is)h(based)g(on)g(the)h(principles)g(presen)n (ted)e(b)n(y)i(the)-150 362 y(HINT)40 b([1])f(computer)g(p)r (erformance)g(metric\(See)g(App)r(endix)-150 462 y(A\).)c(Just)f(as)f (a)h(computer's)g(p)r(erformance)f(cannot)g(b)r(e)i(accu-)-150 562 y(rately)18 b(describ)r(ed)g(using)g(a)g(single)g(sized)g (computation,)i(neither)-150 661 y(can)31 b(the)h(p)r(erformance)e(of)i (a)f(net)n(w)n(ork)f(b)r(e)i(describ)r(ed)f(using)g(a)-150 761 y(single)26 b(sized)g(comm)n(unication)f(transfer.)35 b(NetPIPE)26 b(increases)-150 860 y(the)32 b(transfer)f(blo)r(c)n(k)g (size)h Fa(k)g Fi(from)f(a)h(single)f(b)n(yte)h(un)n(til)g(trans-)-150 960 y(mission)39 b(time)g(exceeds)g(1)g(second.)71 b(Hence,)42 b(NetPIPE)c(is)h(a)-150 1060 y(v)-5 b(ariable)36 b(time)h(b)r(enc)n (hmark)g(and)g(will)g(scale)f(to)h(all)f(net)n(w)n(ork)-150 1159 y(sp)r(eeds.)g(Unlik)n(e)24 b(\014xed)h(size)f(b)r(enc)n(hmark)f (tests,)i(NetPIPE)f(will)-150 1259 y(not)32 b(b)r(ecome)h(outdated)f (and)h(inaccurate)e(as)h(tec)n(hnology)f(ad-)-150 1359 y(v)-5 b(ances)30 b(\(see)g(Gustafson)h([6)o(]\).)46 b(T)-7 b(o)30 b(increase)g(the)h(univ)n(ersalit)n(y)-150 1458 y(of)25 b(NetPIPE,)f(information)h(is)g(measured)f(in)h Fa(bits)h Fi(rather)e(than)-150 1558 y Fa(bytes)p Fi(.)37 b(The)25 b(de\014nition)h(of)g Fa(byte)g Fi(v)-5 b(aries)24 b(more)h(than)h(one)f(migh)n(t)-150 1657 y(think.)-67 1811 y(F)-7 b(or)31 b(eac)n(h)g(blo)r(c)n(k)g(size)g Fd(c)p Fi(,)h(three)g(measuremen)n(ts)e(are)h(tak)n(en:)-150 1910 y Fd(c)21 b Fg(\000)g Fd(p)31 b Fi(b)n(ytes,)h Fd(c)g Fi(b)n(ytes,)g(and)g Fd(c)21 b Fi(+)g Fd(p)31 b Fi(b)n(ytes,)h(where)f Fd(p)h Fi(is)f(a)g(p)r(er-)-150 2010 y(turbation)39 b(factor)h(with)g (a)f(default)i(v)-5 b(alue)39 b(of)h(3.)74 b(This)39 b(p)r(er-)-150 2110 y(turbation)25 b(allo)n(ws)f(analysis)g(of)i(blo)r (c)n(k)e(sizes)h(that)h(are)e(p)r(ossibly)-150 2209 y(sligh)n(tly)c (smaller)g(or)g(larger)e(than)j(an)g(in)n(ternal)f(net)n(w)n(ork)f (bu\013er.)-150 2309 y(F)-7 b(or)32 b(eac)n(h)h(measuremen)n(t,)g (NetPIPE)g(uses)f(the)i(follo)n(wing)e(al-)-150 2408 y(gorithm:)-150 2612 y(/*)27 b(First)g(set)h(T)f(to)h(a)f(v)n(ery)f (large)h(time.)37 b(*/)-150 2712 y Fd(T)i Fi(=)27 b(MAXTIME)-150 2812 y(F)-7 b(or)27 b Fd(i)g Fi(=)h(1)f(to)g(NTRIALS)30 2911 y Fd(t)p Fi(0)g(=)g(Time\(\))30 3011 y(F)-7 b(or)27 b Fd(j)33 b Fi(=)27 b(1)g(to)g Fd(nr)r(epeat)231 3111 y Fi(if)h(I)f(am)h(transmitter)397 3210 y(Send)g(data)f(blo)r(c)n(k)g (of)g(size)h Fd(c)397 3310 y Fi(Recv)f(data)g(blo)r(c)n(k)g(of)h(size)f Fd(c)231 3409 y Fi(else)397 3509 y(Recv)g(data)g(blo)r(c)n(k)g(of)h (size)f Fd(c)397 3609 y Fi(Send)h(data)f(blo)r(c)n(k)g(of)g(size)h Fd(c)231 3708 y Fi(endif)30 3808 y(endF)-7 b(or)30 3908 y Fd(t)p Fi(1)27 b(=)g(Time\(\))-150 4007 y(/*)g(Insure)g(w)n(e)g(k)n (eep)g(the)h(shortest)f(trial)g(time.)37 b(*/)30 4107 y Fd(T)d Fi(=)23 b Fd(M)9 b(I)e(N)i Fi(\()p Fd(T)e(;)14 b(t)p Fi(1)j Fg(\000)h Fd(t)p Fi(0\))-150 4206 y(endF)-7 b(or)-150 4306 y Fd(T)34 b Fi(=)23 b Fd(T)9 b(=)p Fi(\(2)17 b Fg(\003)h Fd(nr)r(epeat)p Fi(\))-67 4510 y(The)34 b(v)-5 b(ariable)32 b Fa(nr)l(ep)l(e)l(at)i Fi(is)f(calculated)g(based)g(on)h (the)g(time)-150 4610 y(of)39 b(the)g(last)f(data)h(transfer.)69 b(The)39 b(in)n(ten)n(t)g(is)g(to)f(rep)r(eat)h(the)-150 4709 y(exp)r(erimen)n(t)g(enough)f(times)h(suc)n(h)f(that)h(the)g (total)f(time)i(for)-150 4809 y(the)26 b(exp)r(erimen)n(t)f(is)g(far)g (greater)f(than)h(timer)h(resolution.)35 b(The)-150 4909 y(default)20 b(target)e(time)i(is)g(0.5)e(seconds.)34 b(F)-7 b(or)18 b(most)i(mo)r(dern)f(com-)-150 5008 y(puters,)33 b(this)f(pro)n(vides)e(a)i(su\016cien)n(tly)g(precise)f(data)g (transfer)-150 5108 y(time.)36 b(Giv)n(en)22 b(that)h(the)f(last)h (transfer)e(time)i(w)n(as)e Fd(tl)r(ast)h Fi(seconds)-150 5207 y(for)28 b(a)f(blo)r(c)n(k)h(size)g Fd(bsz)t Fi(1,)e(the)j(v)-5 b(alue)28 b(of)g Fd(nr)r(epeat)f Fi(for)h(blo)r(c)n(k)f(size)-150 5307 y Fd(bsz)t Fi(2)f(is)h(appro)n(ximated)g(as:)90 5527 y Fd(nr)r(epeat)c Fi(=)f Fd(T)12 b(AR)q(GE)5 b(T)k(=)p Fi(\(\()p Fd(bsz)t Fi(2)p Fd(=bsz)t Fi(1\))14 b Fg(\003)k Fd(tl)r(ast)p Fi(\))2047 -173 y 15629760 10784529 3289088 3289088 26970521 19866091 startTexFig 2047 -173 a /gnudict 40 dict def gnudict begin /Color true def /Solid false def /gnulinewidth 5.000 def /plotlinewidth 15.000 def /vshift -40 def /dl {10 mul} def /hpt 31.5 def /vpt 31.5 def /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow { currentpoint stroke M 0 vshift R show } def /Rshow { currentpoint stroke M dup stringwidth pop neg vshift R show } def /Cshow { currentpoint stroke M dup stringwidth pop -2 div vshift R show } def /DL { Color {setrgbcolor Solid {pop []} if 0 setdash } {pop pop pop Solid {pop []} if 0 setdash} ifelse } def /BL { stroke gnulinewidth 2 mul setlinewidth } def /AL { stroke gnulinewidth 2 div setlinewidth } def /PL { stroke plotlinewidth setlinewidth } def /LTb { BL [] 0 0 0 DL } def /LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def /LT0 { PL [] 0 1 0 DL } def /LT1 { PL [4 dl 2 dl] 0 0 1 DL } def /LT2 { PL [2 dl 3 dl] 1 0 0 DL } def /LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def /LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def /LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def /LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def /LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def /LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def /P { stroke [] 0 setdash currentlinewidth 2 div sub M 0 currentlinewidth V stroke } def /D { stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke P } def /A { stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke P } def /C { stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke } def /T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke P } def /S { 2 copy A C} def end gnudict begin gsave 50 50 translate 0.050 0.050 scale 0 setgray /Helvetica findfont 120 scalefont setfont newpath LTa 720 301 M 6273 0 V LTb 720 301 M 63 0 V 6210 0 R -63 0 V 648 301 M (0) Rshow 720 886 M 63 0 V 6210 0 R -63 0 V 648 886 M (1) Rshow 720 1471 M 63 0 V 6210 0 R -63 0 V -6282 0 R (2) Rshow 720 2055 M 63 0 V 6210 0 R -63 0 V -6282 0 R (3) Rshow 720 2640 M 63 0 V 6210 0 R -63 0 V -6282 0 R (4) Rshow 720 3225 M 63 0 V 6210 0 R -63 0 V -6282 0 R (5) Rshow 720 3810 M 63 0 V 6210 0 R -63 0 V -6282 0 R (6) Rshow 720 4394 M 63 0 V 6210 0 R -63 0 V -6282 0 R (7) Rshow 720 4979 M 63 0 V 6210 0 R -63 0 V -6282 0 R (8) Rshow 720 301 M 0 63 V 0 4615 R 0 -63 V 720 181 M (1) Cshow 990 301 M 0 31 V 0 4647 R 0 -31 V 1346 301 M 0 31 V 0 4647 R 0 -31 V 1529 301 M 0 31 V 0 4647 R 0 -31 V 1616 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (10) Cshow 1886 301 M 0 31 V 0 4647 R 0 -31 V 2243 301 M 0 31 V 0 4647 R 0 -31 V 2425 301 M 0 31 V 0 4647 R 0 -31 V 2512 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (100) Cshow 2782 301 M 0 31 V 0 4647 R 0 -31 V 3139 301 M 0 31 V 0 4647 R 0 -31 V 3322 301 M 0 31 V 0 4647 R 0 -31 V 3408 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1000) Cshow 3678 301 M 0 31 V 0 4647 R 0 -31 V 4035 301 M 0 31 V 0 4647 R 0 -31 V 4218 301 M 0 31 V 0 4647 R 0 -31 V 4305 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (10000) Cshow 4574 301 M 0 31 V 0 4647 R 0 -31 V 4931 301 M 0 31 V 0 4647 R 0 -31 V 5114 301 M 0 31 V 0 4647 R 0 -31 V 5201 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (100000) Cshow 5470 301 M 0 31 V 0 4647 R 0 -31 V 5827 301 M 0 31 V 0 4647 R 0 -31 V 6010 301 M 0 31 V 0 4647 R 0 -31 V 6097 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1e+06) Cshow 6367 301 M 0 31 V 0 4647 R 0 -31 V 6723 301 M 0 31 V 0 4647 R 0 -31 V 6906 301 M 0 31 V 0 4647 R 0 -31 V 6993 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1e+07) Cshow 720 301 M 6273 0 V 0 4678 V -6273 0 V 720 301 L 120 2640 M currentpoint gsave translate 90 rotate 0 0 M (Throughput in Mbps) Cshow grestore 3856 61 M (Block size in bits) Cshow LTb 6570 4796 M (Ethernet) Rshow LT0 6642 4796 M 216 0 V 67 -682 R -135 30 V -135 -55 V -135 -4 V -135 26 V 6250 3979 L -135 -43 V -135 -58 V -134 174 V -135 218 V -135 20 V -135 245 V -135 183 V -135 187 V 5036 4789 L 4901 4616 L 4766 4419 L 4632 4165 L 4497 3865 L 4362 3465 L 4227 3045 L 4092 2612 L 3956 2191 L 3822 1811 L 3686 1461 L 3553 1189 L 3415 956 L 3281 788 L 3142 651 L 3011 557 L 2866 484 L 2732 432 L 2608 397 L 2339 349 L 2069 325 L 1799 313 L -270 -6 V stroke grestore end showpage endTexFig 2463 1376 a Fi(Figure)27 b(1:)36 b(Ethernet)28 b(Throughput)2108 1680 y(NetPIPE)i(uses)g(a)g(ping-p)r(ong)f(transfer)h(lik)n(e)g(Ho)r(c) n(kney)g([11)o(])2025 1780 y(uses)20 b(for)f(eac)n(h)g(blo)r(c)n(k)h (size.)34 b(This)20 b(forces)f(the)i(net)n(w)n(ork)d(to)i(trans-)2025 1879 y(mit)39 b(just)g(the)g(data)f(blo)r(c)n(k)g(without)g(streaming)g (other)g(data)2025 1979 y(blo)r(c)n(ks)d(in)g(with)h(the)f(message.)59 b(The)35 b(result)g(is)g(the)h(transfer)2025 2079 y(time)i(of)f(a)h (single)f(blo)r(c)n(k,)i(th)n(us)f(pro)n(viding)e(the)i(information) 2025 2178 y(necessary)27 b(to)j(answ)n(er)d(whic)n(h)j(blo)r(c)n(k)e (size)h(is)g(b)r(est,)i(or)d(what)h(is)2025 2278 y(the)f(throughput)f (giv)n(en)g(a)g(blo)r(c)n(k)g(of)h(size)f Fd(k)s Fi(.)2108 2431 y(NetPIPE)41 b(pro)r(duces)h(a)g(\014le)g(that)h(con)n(tains)e (the)i(transfer)2025 2531 y(time,)28 b(throughput,)f(blo)r(c)n(k)f (size,)h(and)g(transfer)f(time)h(v)-5 b(ariance)2025 2630 y(for)23 b(eac)n(h)f(data)g(p)r(oin)n(t)i(and)f(is)g(easily)f (plotted)h(b)n(y)g(an)n(y)g(graphing)2025 2730 y(pac)n(k)-5 b(age.)34 b(F)-7 b(or)24 b(instance,)h(Figure)f(1)h(presen)n(ts)e(the)i (throughput)2025 2830 y(v)n(ersus)e(the)i(transfer)f(blo)r(c)n(k)g (size)g(for)g(a)g(t)n(ypical)h(Ethernet)f(link.)2025 2929 y(This)k(graph)f(is)g(referred)g(to)h(as)f(the)h Fa(thr)l(oughput)i(gr)l(aph)p Fi(.)40 b(F)-7 b(rom)2025 3029 y(this)36 b(graph,)i(it)e(is)g(easy)f(to)h(see)g(the)g(maxim)n(um) g(throughput)2025 3129 y(for)25 b(this)g(net)n(w)n(ork)e(is)i(appro)n (ximately)f(7.8)g(Mbps.)36 b(Ho)n(w)n(ev)n(er,)24 b(it)2025 3228 y(is)30 b(di\016cult)i(to)e(analyze)g(the)h(latency)-7 b(,)31 b(an)f(equally)g(imp)r(ortan)n(t)2025 3328 y(statistic.)2108 3481 y(A)f(graph)e(that)i(is)f(easier)f(to)h(read)f(and)i(analyze)e(is) h(the)h Fa(net-)2025 3581 y(work)k(signatur)l(e)g(gr)l(aph)p Fi(.)47 b(One)31 b(suc)n(h)f(graph)g(is)h(sho)n(wn)f(in)h(Fig-)2025 3680 y(ure)j(2.)56 b(It)35 b(depicts)f(the)h(transfer)e(sp)r(eed)h(v)n (ersus)f(the)i(elapsed)2025 3780 y(time;)23 b(hence)e(it)g(represen)n (ts)e(a)h(net)n(w)n(ork)e(\\acceleration")g(graph.)2025 3880 y(This)27 b(graph)e(is)i(a)f(new)h(and)g(unique)g(w)n(a)n(y)e(of)i (viewing)f(net)n(w)n(ork)2025 3979 y(p)r(erformance)31 b(data;)k(the)e(k)n(ey)f(is)g(to)h(use)f(a)g(logarithmic)g(time)2025 4079 y(scale)g(horizon)n(tally)f(instead)i(of)g(the)g(transfer)f(blo)r (c)n(k)g(size.)53 b(In)2025 4178 y(this)38 b(graph,)h(as)e(in)h(all)g (graphs)e(presen)n(ted,)k(time)e(is)g(plotted)2025 4278 y(in)31 b(seconds.)46 b(It)31 b(is)g(v)n(ery)e(similar)h(to)h(the)g(w)n (a)n(y)f(computer)g(p)r(er-)2025 4378 y(formance)24 b(is)h(presen)n (ted)f(b)n(y)h(the)h(HINT)f(p)r(erformance)f(metric.)2025 4477 y(Although)i(uncon)n(v)n(en)n(tional,)e(this)i(graph)f(represen)n (ts)f(p)r(erhaps)2025 4577 y(a)36 b(b)r(etter)h(approac)n(h)e(to)h (visualizing)g(net)n(w)n(ork)f(p)r(erformance.)2025 4677 y(All)26 b(the)f(necessary)e(data)i(are)f(clearly)g(visible)h(and)g (easy)f(to)h(ex-)2025 4776 y(trap)r(olate.)41 b(The)29 b(net)n(w)n(ork)f(latency)h(coincides)g(with)h(the)g(time)2025 4876 y(of)g(the)g(\014rst)f(data)g(p)r(oin)n(t)h(on)f(the)h(graph.)42 b(The)30 b(maxim)n(um)g(at-)2025 4975 y(tainable)36 b(throughput)h(is)f (clearly)g(sho)n(wn)f(as)h(the)h(maxim)n(um)2025 5075 y(p)r(oin)n(t)28 b(on)f(the)h(graph.)2108 5228 y(Plotting)33 b(the)h(blo)r(c)n(k)e(size)h(v)n(ersus)f(the)i(transfer)f(time)g(on)g (a)2025 5328 y(logarithmic)18 b(scale)g(for)g(b)r(oth)h(the)g Fd(x)h Fi(and)e Fd(y)k Fi(axis,)e(as)e(in)h(Figure)f(3,)2025 5428 y(rev)n(eals)31 b(what)i(w)n(e)g(de\014ne)g(as)f(the)h Fa(satur)l(ation)i(p)l(oint)p Fi(.)53 b(This)33 b(is)2025 5527 y(the)38 b(p)r(oin)n(t)g(after)g(whic)n(h)g(an)f(increase)g(in)h (blo)r(c)n(k)f(size)h(results)p eop 3 2 bop -128 -173 a 15629760 10784529 3289088 3289088 26970521 19866091 startTexFig -128 -173 a /gnudict 40 dict def gnudict begin /Color true def /Solid false def /gnulinewidth 5.000 def /plotlinewidth 15.000 def /vshift -40 def /dl {10 mul} def /hpt 31.5 def /vpt 31.5 def /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow { currentpoint stroke M 0 vshift R show } def /Rshow { currentpoint stroke M dup stringwidth pop neg vshift R show } def /Cshow { currentpoint stroke M dup stringwidth pop -2 div vshift R show } def /DL { Color {setrgbcolor Solid {pop []} if 0 setdash } {pop pop pop Solid {pop []} if 0 setdash} ifelse } def /BL { stroke gnulinewidth 2 mul setlinewidth } def /AL { stroke gnulinewidth 2 div setlinewidth } def /PL { stroke plotlinewidth setlinewidth } def /LTb { BL [] 0 0 0 DL } def /LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def /LT0 { PL [] 0 1 0 DL } def /LT1 { PL [4 dl 2 dl] 0 0 1 DL } def /LT2 { PL [2 dl 3 dl] 1 0 0 DL } def /LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def /LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def /LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def /LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def /LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def /LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def /P { stroke [] 0 setdash currentlinewidth 2 div sub M 0 currentlinewidth V stroke } def /D { stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke P } def /A { stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke P } def /C { stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke } def /T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke P } def /S { 2 copy A C} def end gnudict begin gsave 50 50 translate 0.050 0.050 scale 0 setgray /Helvetica findfont 120 scalefont setfont newpath LTa 720 301 M 6273 0 V LTb 720 301 M 63 0 V 6210 0 R -63 0 V 648 301 M (0) Rshow 720 886 M 63 0 V 6210 0 R -63 0 V 648 886 M (1) Rshow 720 1471 M 63 0 V 6210 0 R -63 0 V -6282 0 R (2) Rshow 720 2055 M 63 0 V 6210 0 R -63 0 V -6282 0 R (3) Rshow 720 2640 M 63 0 V 6210 0 R -63 0 V -6282 0 R (4) Rshow 720 3225 M 63 0 V 6210 0 R -63 0 V -6282 0 R (5) Rshow 720 3810 M 63 0 V 6210 0 R -63 0 V -6282 0 R (6) Rshow 720 4394 M 63 0 V 6210 0 R -63 0 V -6282 0 R (7) Rshow 720 4979 M 63 0 V 6210 0 R -63 0 V -6282 0 R (8) Rshow 720 301 M 0 63 V 0 4615 R 0 -63 V 720 181 M (0.0001) Cshow 1098 301 M 0 31 V 0 4647 R 0 -31 V 1597 301 M 0 31 V 0 4647 R 0 -31 V 1853 301 M 0 31 V 0 4647 R 0 -31 V 1975 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.001) Cshow 2352 301 M 0 31 V 0 4647 R 0 -31 V 2852 301 M 0 31 V 0 4647 R 0 -31 V 3108 301 M 0 31 V 0 4647 R 0 -31 V 3229 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.01) Cshow 3607 301 M 0 31 V 0 4647 R 0 -31 V 4106 301 M 0 31 V 0 4647 R 0 -31 V 4362 301 M 0 31 V 0 4647 R 0 -31 V 4484 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.1) Cshow 4861 301 M 0 31 V 0 4647 R 0 -31 V 5361 301 M 0 31 V 0 4647 R 0 -31 V 5617 301 M 0 31 V 0 4647 R 0 -31 V 5738 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1) Cshow 6116 301 M 0 31 V 0 4647 R 0 -31 V 6615 301 M 0 31 V 0 4647 R 0 -31 V 6871 301 M 0 31 V 0 4647 R 0 -31 V 6993 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (10) Cshow 720 301 M 6273 0 V 0 4678 V -6273 0 V 720 301 L 120 2640 M currentpoint gsave translate 90 rotate 0 0 M (Throughput in Mbps) Cshow grestore 3856 61 M (Time) Cshow LTb 6570 4796 M (Ethernet) Rshow LT0 6642 4796 M 216 0 V 5850 4114 M -193 30 V -181 -55 V -189 -4 V -192 26 V 4925 3979 L -182 -43 V -180 -58 V -215 174 V -220 218 V -191 20 V -221 245 V -212 183 V -212 187 V 3117 4789 L 2950 4616 L 2786 4419 L 2632 4165 L 2487 3865 L 2364 3465 L 2252 3045 L -95 -433 V -80 -421 V -66 -380 V -47 -350 V -41 -272 V 1896 956 L 1870 788 L 1855 651 L -12 -94 V -21 -73 V -4 -52 V -3 -35 V -6 -48 V -1 -24 V -1 -12 V -1 -6 V stroke grestore end showpage endTexFig 204 1376 a Fi(Figure)27 b(2:)37 b(Ethernet)27 b(Signature)g(Graph)-128 1520 y 15629760 10940832 3420651 32101498 27102085 48678502 startTexFig -128 1520 a 1 setlinejoin /M { moveto } bind def /S { show } bind def /R { rmoveto } bind def /L { lineto } bind def /B { newpath 0 0 M 0 1 L 1 1 L 1 0 L closepath } bind def /CS { closepath stroke } bind def /S { /fixwidth exch def dup length /nchars exch def dup stringwidth pop fixwidth exch sub nchars div exch 0 exch ashow } def /bwproc { rgbproc dup length 3 idiv string 0 3 0 5 -1 roll { add 2 1 roll 1 sub dup 0 eq { pop 3 idiv 3 -1 roll dup 4 -1 roll dup 3 1 roll 5 -1 roll put 1 add 3 0 } { 2 1 roll } ifelse } forall pop pop pop } def systemdict /colorimage known not { /colorimage { pop pop /rgbproc exch def { bwproc } image } def } if 1 1 scale 0 setlinewidth /drawtri { /y3 exch def /x3 exch def /y2 exch def /x2 exch def /y1 exch def /x1 exch def 0 setgray newpath x1 y1 moveto x2 y2 lineto x3 y3 lineto closepath stroke } bind def /filltri { /y3 exch def /x3 exch def /y2 exch def /x2 exch def /y1 exch def /x1 exch def newpath x1 y1 moveto x2 y2 lineto x3 y3 lineto closepath fill } bind def /cliptri { /y3 exch def /x3 exch def /y2 exch def /x2 exch def /y1 exch def /x1 exch def 0 setgray newpath x1 y1 moveto x2 y2 lineto x3 y3 lineto closepath clip } bind def /imgscanrgb { gsave translate /scandy exch def /scandx exch def /istr scandx 3 mul string def scandx scandy scale scandx scandy 8 [scandx 0 0 scandy neg 0 scandy] {currentfile istr readhexstring pop} false 3 colorimage grestore } bind def /imgscanbw { gsave translate /scandy exch def /scandx exch def /istr scandx string def scandx scandy scale scandx scandy 8 [scandx 0 0 scandy neg 0 scandy] {currentfile istr readhexstring pop} image grestore } bind def /showcaseisoencoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /minus /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /guilsinglright /fraction /florin /quotesingle /quotedblleft /guilsinglleft /fi /fl /endash /dagger /daggerdbl /bullet /quotesinglbase /quotedblbase /quotedblright /ellipsis /trademark /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /perthousand /ring /cedilla /Ydieresis /hungarumlaut /ogonek /caron /emdash /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] def /showcasedingbatencoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /a1 /a2 /a202 /a3 /a4 /a5 /a119 /a118 /a117 /a11 /a12 /a13 /a14 /a15 /a16 /a105 /a17 /a18 /a19 /a20 /a21 /a22 /a23 /a24 /a25 /a26 /a27 /a28 /a6 /a7 /a8 /a9 /a10 /a29 /a30 /a31 /a32 /a33 /a34 /a35 /a36 /a37 /a38 /a39 /a40 /a41 /a42 /a43 /a44 /a45 /a46 /a47 /a48 /a49 /a50 /a51 /a52 /a53 /a54 /a55 /a56 /a57 /a58 /a59 /a60 /a61 /a62 /a63 /a64 /a65 /a66 /a67 /a68 /a69 /a70 /a71 /a72 /a73 /a74 /a203 /a75 /a204 /a76 /a77 /a78 /a79 /a81 /a82 /a83 /a84 /a97 /a98 /a99 /a100 /.notdef /a205 /a85 /a206 /a86 /a87 /a88 /a89 /a90 /a91 /a92 /a93 /a94 /a95 /a96 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /a101 /a102 /a103 /a104 /a106 /a107 /a108 /a112 /a111 /a110 /a109 /a120 /a121 /a122 /a123 /a124 /a125 /a126 /a127 /a128 /a129 /a130 /a131 /a132 /a133 /a134 /a135 /a136 /a137 /a138 /a139 /a140 /a141 /a142 /a143 /a144 /a145 /a146 /a147 /a148 /a149 /a150 /a151 /a152 /a153 /a154 /a155 /a156 /a157 /a158 /a159 /a160 /a161 /a163 /a164 /a196 /a165 /a192 /a166 /a167 /a168 /a169 /a170 /a171 /a172 /a173 /a162 /a174 /a175 /a176 /a177 /a178 /a179 /a193 /a180 /a199 /a181 /a200 /a182 /.notdef /a201 /a183 /a184 /a197 /a185 /a194 /a198 /a186 /a195 /a187 /a188 /a189 /a190 /a191 /.notdef ] def /Times-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding showcaseisoencoding def currentdict end /Times-Bold-SHOWISO exch definefont pop /newfont 10 dict def newfont begin /FontType 3 def /FontMatrix [1 0 0 1 0 0] def /FontBBox [0 0 1 1] def /Encoding 256 array def 0 1 255 {Encoding exch /.notdef put} for /CharProcs 1 dict def CharProcs begin /.notdef {} def end /BuildChar { 1 0 0 0 1 1 setcachedevice exch begin Encoding exch get CharProcs exch get end exec } def end /PatternFont newfont definefont pop gsave /saveit save def gsave gsave [360 0 0 252 52 488] concat B clip 1.0 setgray B fill 0.002778 0.003968 scale -50 -50 translate /SCincsave save def /SCdictcount countdictstack def /SCopcount count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath /gnudict 40 dict def gnudict begin /Color true def /Solid false def /gnulinewidth 5.000 def /plotlinewidth 15.000 def /vshift -40 def /dl {10 mul} def /hpt 31.5 def /vpt 31.5 def /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow { currentpoint stroke M 0 vshift R show } def /Rshow { currentpoint stroke M dup stringwidth pop neg vshift R show } def /Cshow { currentpoint stroke M dup stringwidth pop -2 div vshift R show } def /DL { Color {setrgbcolor Solid {pop []} if 0 setdash } {pop pop pop Solid {pop []} if 0 setdash} ifelse } def /BL { stroke gnulinewidth 2 mul setlinewidth } def /AL { stroke gnulinewidth 2 div setlinewidth } def /PL { stroke plotlinewidth setlinewidth } def /LTb { BL [] 0 0 0 DL } def /LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def /LT0 { PL [] 0 1 0 DL } def /LT1 { PL [4 dl 2 dl] 0 0 1 DL } def /LT2 { PL [2 dl 3 dl] 1 0 0 DL } def /LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def /LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def /LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def /LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def /LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def /LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def /P { stroke [] 0 setdash currentlinewidth 2 div sub M 0 currentlinewidth V stroke } def /D { stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke P } def /A { stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke P } def /C { stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke } def /T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke P } def /S { 2 copy A C} def end gnudict begin gsave 50 50 translate 0.050 0.050 scale 0 setgray /Helvetica findfont 120 scalefont setfont newpath LTa LTb 720 301 M 63 0 V 6210 0 R -63 0 V 648 301 M (1) Rshow 720 502 M 31 0 V 6242 0 R -31 0 V 720 768 M 31 0 V 6242 0 R -31 0 V 720 905 M 31 0 V 6242 0 R -31 0 V 720 969 M 63 0 V 6210 0 R -63 0 V 648 969 M (10) Rshow 720 1170 M 31 0 V 6242 0 R -31 0 V 720 1436 M 31 0 V 6242 0 R -31 0 V 720 1573 M 31 0 V 6242 0 R -31 0 V 720 1638 M 63 0 V 6210 0 R -63 0 V -6282 0 R (100) Rshow 720 1839 M 31 0 V 6242 0 R -31 0 V 720 2105 M 31 0 V 6242 0 R -31 0 V 720 2241 M 31 0 V 6242 0 R -31 0 V 720 2306 M 63 0 V 6210 0 R -63 0 V -6282 0 R (1000) Rshow 720 2507 M 31 0 V 6242 0 R -31 0 V 720 2773 M 31 0 V 6242 0 R -31 0 V 720 2909 M 31 0 V 6242 0 R -31 0 V 720 2974 M 63 0 V 6210 0 R -63 0 V -6282 0 R (10000) Rshow 720 3175 M 31 0 V 6242 0 R -31 0 V 720 3441 M 31 0 V 6242 0 R -31 0 V 720 3578 M 31 0 V 6242 0 R -31 0 V 720 3642 M 63 0 V 6210 0 R -63 0 V -6282 0 R (100000) Rshow 720 3844 M 31 0 V 6242 0 R -31 0 V 720 4110 M 31 0 V 6242 0 R -31 0 V 720 4246 M 31 0 V 6242 0 R -31 0 V 720 4311 M 63 0 V 6210 0 R -63 0 V -6282 0 R (1e+06) Rshow 720 4512 M 31 0 V 6242 0 R -31 0 V 720 4778 M 31 0 V 6242 0 R -31 0 V 720 4914 M 31 0 V 6242 0 R -31 0 V 720 4979 M 63 0 V 6210 0 R -63 0 V -6282 0 R (1e+07) Rshow 720 301 M 0 63 V 0 4615 R 0 -63 V 720 181 M (0.0001) Cshow 1098 301 M 0 31 V 0 4647 R 0 -31 V 1597 301 M 0 31 V 0 4647 R 0 -31 V 1853 301 M 0 31 V 0 4647 R 0 -31 V 1975 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.001) Cshow 2352 301 M 0 31 V 0 4647 R 0 -31 V 2852 301 M 0 31 V 0 4647 R 0 -31 V 3108 301 M 0 31 V 0 4647 R 0 -31 V 3229 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.01) Cshow 3607 301 M 0 31 V 0 4647 R 0 -31 V 4106 301 M 0 31 V 0 4647 R 0 -31 V 4362 301 M 0 31 V 0 4647 R 0 -31 V 4484 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.1) Cshow 4861 301 M 0 31 V 0 4647 R 0 -31 V 5361 301 M 0 31 V 0 4647 R 0 -31 V 5617 301 M 0 31 V 0 4647 R 0 -31 V 5738 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1) Cshow 6116 301 M 0 31 V 0 4647 R 0 -31 V 6615 301 M 0 31 V 0 4647 R 0 -31 V 6871 301 M 0 31 V 0 4647 R 0 -31 V 6993 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (10) Cshow 720 301 M 6273 0 V 0 4678 V -6273 0 V 720 301 L 120 2640 M currentpoint gsave translate 90 rotate 0 0 M (Block size in bits) Cshow grestore 3856 61 M (Time) Cshow LTb 6570 4796 M (Ethernet) Rshow LT0 6642 4796 M 216 0 V 5850 4928 M 5657 4827 L 5476 4727 L 5287 4626 L 5095 4526 L 4925 4425 L 4743 4324 L 4563 4224 L 4348 4123 L 4128 4023 L 3937 3922 L 3716 3822 L 3504 3721 L 3292 3620 L 3117 3520 L 2950 3419 L 2786 3319 L 2632 3218 L 2487 3117 L 2364 3017 L 2252 2916 L -95 -100 V -80 -101 V -66 -101 V -47 -101 V -41 -100 V -27 -103 V -26 -99 V -15 -104 V -12 -98 V -21 -108 V -4 -99 V -3 -93 V -6 -201 V -1 -201 V -1 -201 V -1 -201 V stroke grestore end showpage count SCopcount sub {pop} repeat countdictstack SCdictcount sub {end} repeat SCincsave restore grestore gsave gsave matrix currentmatrix [1 0 0 1 231 565] concat newpath 0 0 M 0 17 L 163 17 L 163 0 L closepath setmatrix 0 0 0 setrgbcolor grestore newpath 229 563 M 229 585.111 L 396 585.111 L 396 563 L closepath clip newpath 0 0 0 setrgbcolor matrix currentmatrix [1 0 0 1 231 565] concat /Times-Bold-SHOWISO findfont 14 scalefont setfont 0 0 0 setrgbcolor 10 6.11111 M (Saturation ) 67.284 S 77.284 6.11111 M 77.284 6.11111 M 77.284 6.11111 M 77.284 6.11111 M (Point) 31.892 S setmatrix grestore gsave 1.000000 setlinewidth matrix currentmatrix [5.65685 0 0 5.65685 158 626] concat newpath 0 0 1 0 360 arc 0 0 0 setrgbcolor closepath setmatrix stroke grestore gsave 0 0 0 setrgbcolor gsave 0 setlinejoin 169.17 620.558 translate 146.094 rotate 1.1 1.1 scale newpath 0 0 M -20 -5 L -20 5 L closepath fill grestore 1.000000 setlinewidth newpath 184.939 609.959 M 231 579 L stroke grestore gsave 0 0 0 setrgbcolor 1.000000 setlinewidth newpath 120 617 M 336 732 L stroke grestore grestore showpage saveit restore grestore endTexFig 186 3088 a Fi(Figure)g(3:)36 b(Ethernet)28 b(Saturation)f(Graph)-150 3381 y(in)i(a)f(near-linear)f(increase)h(in)h(transfer)e(time,)j (e\013ectiv)n(ely)f(the)-150 3481 y(knee)i(of)g(the)g(curv)n(e.)47 b(The)31 b(time)h(in)n(terv)-5 b(al)30 b(b)r(et)n(w)n(een)h(the)h (satu-)-150 3581 y(ration)24 b(p)r(oin)n(t)i(and)e(the)i(end)f(of)g (the)h(recorded)e(data)g(is)h(referred)-150 3680 y(to)j(as)g(the)h Fa(satur)l(ation)i(interval)p Fi(.)40 b(In)29 b(this)g(in)n(terv)-5 b(al,)28 b(the)h(graph)-150 3780 y(monotonically)g(increases)g(at)h(a)f (constan)n(t)h(rate)f(i.e.,)i(the)g(net-)-150 3880 y(w)n(ork)19 b(throughput)h(cannot)g(b)r(e)h(impro)n(v)n(ed)f(up)r(on)g(b)n(y)h (increasing)-150 3979 y(the)28 b(blo)r(c)n(k)f(size.)-67 4132 y(Using)i(maxim)n(um)g(e\013ectiv)n(e)g(bandwidth)g(to)g(compare)f (net-)-150 4232 y(w)n(orks)g(\(or)h(ev)n(en)h(w)n(orse,)f(nominal)g (bandwidth\))i(is)f(m)n(uc)n(h)f(lik)n(e)-150 4332 y(using)44 b(p)r(eak)g(megahertz)f(ratings)g(to)h(compare)f(computers.)-150 4431 y(While)i(it)h(ma)n(y)e(b)r(e)h(correct)e(for)h(ranking)g(certain) g(applica-)-150 4531 y(tions,)26 b(in)f(general,)g(its)h(accuracy)d (lea)n(v)n(es)h(m)n(uc)n(h)h(to)h(b)r(e)g(desired.)-150 4631 y(A)40 b(giv)n(en)f(net)n(w)n(ork)f(ma)n(y)h(ha)n(v)n(e)g(a)g (high)h(maxim)n(um)f(e\013ectiv)n(e)-150 4730 y(bandwidth)34 b(but)f(also)f(ha)n(v)n(e)g(a)g(high)h(latency)-7 b(.)53 b(So)33 b(a)f(net)n(w)n(ork)-150 4830 y(with)f(a)f(lo)n(w)n(er)e (latency)i(w)n(ould)g(p)r(ossibly)g(b)r(e)g(b)r(etter)h(for)e(small) -150 4929 y(messages)24 b(ev)n(en)i(though)g(it)g(has)g(a)g(m)n(uc)n(h) g(lo)n(w)n(er)e(maxim)n(um)i(ef-)-150 5029 y(fectiv)n(e)34 b(bandwidth.)55 b(This)34 b(e\013ect)g(can)f(b)r(e)h(readily)f(observ)n (ed)-150 5129 y(when)g(comparing)f(A)-7 b(TM)33 b(with)h(Ethernet,)g (as)e(sho)n(wn)g(b)r(elo)n(w.)-150 5228 y(An)n(y)27 b(ranking)e(based)i (on)f(a)h(single)f(n)n(um)n(b)r(er)h(do)r(es)f(not)h(pro)n(vide)-150 5328 y(su\016cien)n(t)32 b(insigh)n(t)g(for)g(accurate)f(net)n(w)n(ork) g(comparison.)50 b(F)-7 b(or)-150 5428 y(net)n(w)n(ork)31 b(tuning)h(and)g(comparison,)g(w)n(e)g(recommend)g(taking)-150 5527 y(the)24 b(en)n(tire)f(NetPIPE)f(signature)g(graph)g(together)h (with)g(appli-)2047 -173 y 15629760 10784529 3289088 3289088 26970521 19866091 startTexFig 2047 -173 a /gnudict 40 dict def gnudict begin /Color true def /Solid false def /gnulinewidth 5.000 def /plotlinewidth 15.000 def /vshift -40 def /dl {10 mul} def /hpt 31.5 def /vpt 31.5 def /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow { currentpoint stroke M 0 vshift R show } def /Rshow { currentpoint stroke M dup stringwidth pop neg vshift R show } def /Cshow { currentpoint stroke M dup stringwidth pop -2 div vshift R show } def /DL { Color {setrgbcolor Solid {pop []} if 0 setdash } {pop pop pop Solid {pop []} if 0 setdash} ifelse } def /BL { stroke gnulinewidth 2 mul setlinewidth } def /AL { stroke gnulinewidth 2 div setlinewidth } def /PL { stroke plotlinewidth setlinewidth } def /LTb { BL [] 0 0 0 DL } def /LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def /LT0 { PL [] 0 1 0 DL } def /LT1 { PL [4 dl 2 dl] 0 0 1 DL } def /LT2 { PL [2 dl 3 dl] 1 0 0 DL } def /LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def /LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def /LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def /LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def /LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def /LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def /P { stroke [] 0 setdash currentlinewidth 2 div sub M 0 currentlinewidth V stroke } def /D { stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke P } def /A { stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke P } def /C { stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke } def /T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke P } def /S { 2 copy A C} def end gnudict begin gsave 50 50 translate 0.050 0.050 scale 0 setgray /Helvetica findfont 120 scalefont setfont newpath LTa 720 301 M 6273 0 V LTb 720 301 M 63 0 V 6210 0 R -63 0 V 648 301 M (0) Rshow 720 969 M 63 0 V 6210 0 R -63 0 V 648 969 M (10) Rshow 720 1638 M 63 0 V 6210 0 R -63 0 V -6282 0 R (20) Rshow 720 2306 M 63 0 V 6210 0 R -63 0 V -6282 0 R (30) Rshow 720 2974 M 63 0 V 6210 0 R -63 0 V -6282 0 R (40) Rshow 720 3642 M 63 0 V 6210 0 R -63 0 V -6282 0 R (50) Rshow 720 4311 M 63 0 V 6210 0 R -63 0 V -6282 0 R (60) Rshow 720 4979 M 63 0 V 6210 0 R -63 0 V -6282 0 R (70) Rshow 720 301 M 0 63 V 0 4615 R 0 -63 V 720 181 M (0.0001) Cshow 1098 301 M 0 31 V 0 4647 R 0 -31 V 1597 301 M 0 31 V 0 4647 R 0 -31 V 1853 301 M 0 31 V 0 4647 R 0 -31 V 1975 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.001) Cshow 2352 301 M 0 31 V 0 4647 R 0 -31 V 2852 301 M 0 31 V 0 4647 R 0 -31 V 3108 301 M 0 31 V 0 4647 R 0 -31 V 3229 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.01) Cshow 3607 301 M 0 31 V 0 4647 R 0 -31 V 4106 301 M 0 31 V 0 4647 R 0 -31 V 4362 301 M 0 31 V 0 4647 R 0 -31 V 4484 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.1) Cshow 4861 301 M 0 31 V 0 4647 R 0 -31 V 5361 301 M 0 31 V 0 4647 R 0 -31 V 5617 301 M 0 31 V 0 4647 R 0 -31 V 5738 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1) Cshow 6116 301 M 0 31 V 0 4647 R 0 -31 V 6615 301 M 0 31 V 0 4647 R 0 -31 V 6871 301 M 0 31 V 0 4647 R 0 -31 V 6993 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (10) Cshow 720 301 M 6273 0 V 0 4678 V -6273 0 V 720 301 L 120 2640 M currentpoint gsave translate 90 rotate 0 0 M (Throughput in Mbps) Cshow grestore 3856 61 M (Time) Cshow LTb 6570 4796 M (FDDI) Rshow LT0 6642 4796 M 216 0 V -941 127 R 0 -1 V 1 -9 V -222 15 V 4 -36 V -160 29 V -1 2 V 2 -14 V -220 -4 V -1 8 V 2 -18 V -157 -3 V -3 25 V 3 -21 V -222 12 V 1 -15 V 2 -16 V -155 -11 V -3 20 V 4 -26 V -221 -2 V -2 19 V 7 -62 V -157 2 V -2 18 V 3 -26 V -216 -39 V 2 -15 V 11 -90 V -165 61 V -3 28 V 30 -240 V -235 110 V 1 -7 V 10 -80 V -156 -5 V -1 7 V 18 -136 V -209 -89 V -8 58 V 111 -751 V -237 531 V -7 46 V 33 -230 V -207 -90 V -11 75 V 3429 2616 L 3032 3903 L -2 12 V 10 -66 V 2900 3356 L -3 21 V 15 -88 V 2792 3099 L -8 41 V 11 -58 V -99 -558 V -16 67 V 2 -8 V -99 -232 V -12 47 V 13 -50 V -76 -476 V -27 79 V 6 -21 V -93 -179 V -2 6 V -16 44 V -64 -374 V -32 66 V 49 -102 V -62 -173 V -2 2 V 1 -3 V -87 -197 V 0 -1 V -49 66 V 2095 930 L 0 -1 V 0 -2 V 2033 771 L -4 2 V 6 -6 V -60 -73 V 0 -1 V -1 -2 V 1956 573 L -2 -1 V 1 -2 V -16 -58 V -2 -1 V 0 -2 V -13 -63 V -1 -1 V 0 -2 V -6 -32 V -1 -1 V 1 -2 V -5 -32 V 0 -2 V 0 -2 V -5 -14 V 0 -2 V 0 -1 V -1 -15 V -1 -2 V 1 -2 V -4 -5 V -2 -2 V 1 -2 V -25 -5 V -9 -1 V 5 -2 V -4 -1 V -52 -1 V -1 -2 V -2 -1 V 0 -2 V 0 -2 V 0 -1 V -1 -3 V 0 -1 V -1 -1 V -1 -1 V 0 -1 V -1 0 V LTb 6570 4676 M (ATM) Rshow LT1 6642 4676 M 216 0 V 5870 3661 M 1 -5 V 7 -43 V -161 24 V 3 -18 V 3 -20 V -227 36 V 2 -8 V 8 -48 V -157 0 V -3 15 V -1 11 V -221 1 V 1 -8 V 0 -2 V -157 0 V 6 -34 V 1 -7 V -227 37 V 1 -2 V 0 -5 V -168 73 V 9 -59 V 6 -32 V -218 -22 V 4 -20 V 1 -10 V -177 126 V 4 -29 V -2 17 V -212 -57 V -4 24 V 5 -26 V -148 -54 V -6 37 V 11 -65 V -209 -72 V -6 34 V 7 -40 V -177 121 V -7 41 V 5 -29 V 3312 3169 L -5 29 V 0 -2 V -223 376 V -7 45 V -1 4 V 2915 3277 L -10 51 V 0 1 V -99 -304 V -13 68 V 0 -1 V 2665 2653 L -17 74 V 2 -10 V -72 -344 V -3 9 V 0 -1 V -87 -452 V -28 85 V 1 -3 V -72 -245 V -1 3 V -7 16 V 2267 1523 L -11 24 V 1 -3 V -51 -217 V -2 3 V 0 -2 V -52 -272 V -1 0 V -52 75 V 2068 963 L -3 1 V 1 -2 V 2027 777 L 0 -2 V 1 -2 V 2006 672 L -1 -1 V 0 -1 V 1982 560 L -3 0 V 0 -2 V 8 -64 V -1 -1 V 0 -2 V -12 -58 V -1 -1 V 0 -2 V -3 -29 V -1 -1 V 0 -2 V -13 -28 V 0 -1 V -1 -2 V -8 -13 V -8 -1 V 1 -1 V -3 -14 V 0 -2 V -3 -1 V -5 -6 V -32 0 V 1 -2 V -9 -5 V -2 -2 V 1 -2 V -1 -1 V 0 -2 V -2 -1 V 0 -2 V -2 -1 V 2 -2 V -2 -1 V 0 -2 V 0 -1 V -1 -2 V -1 -1 V -1 0 V LTb 6570 4556 M (Ethernet) Rshow LT2 6642 4556 M 216 0 V 5850 737 M -193 3 V -181 -6 V -189 -1 V -192 3 V 4925 721 L -182 -5 V -180 -6 V -215 20 V -220 25 V -191 2 V -221 28 V -212 21 V -212 21 V 3117 814 L 2950 794 L 2786 772 L 2632 743 L 2487 708 L 2364 663 L 2252 615 L -95 -50 V -80 -48 V -66 -43 V -47 -40 V -41 -32 V -27 -26 V -26 -19 V -15 -16 V -12 -11 V -21 -8 V -4 -6 V -3 -4 V -6 -5 V -1 -3 V -1 -2 V -1 0 V stroke grestore end showpage endTexFig 2025 1376 a Fi(Figure)32 b(4:)45 b(Signature)31 b(Graphs)h(for)f (FDDI,)j(A)-7 b(TM,)32 b(and)g(Eth-)2025 1476 y(ernet)2025 1750 y(cation)27 b(sp)r(eci\014c)h(information)f(in)n(to)g (consideration.)2025 2131 y Ff(3)135 b(Results)2025 2378 y Fi(Figure)28 b(4)f(sho)n(ws)g(the)i(signature)e(graph)g(for)g (Ethernet,)i(A)-7 b(TM,)2025 2477 y(and)33 b(FDDI)h(net)n(w)n(orks)d (using)i(the)g(TCP/IP)f(comm)n(unication)2025 2577 y(proto)r(col.)42 b(All)30 b(the)g(data)f(w)n(ere)g(collected)g(b)n(y)h(executing)f(Net-) 2025 2676 y(PIPE)d(on)h(t)n(w)n(o)f(iden)n(tical)h(SGI)h(Indy)f(w)n (orkstations.)35 b(The)27 b(net-)2025 2776 y(w)n(ork)38 b(in)h(eac)n(h)f(case)h(consisted)f(of)h(a)g(dedicated,)j(noise)c(free) 2025 2876 y(link)g(b)r(et)n(w)n(een)f(the)h(t)n(w)n(o)f(mac)n(hines.)67 b(A)-7 b(TM)38 b(comm)n(unication)2025 2975 y(w)n(as)31 b(p)r(erformed)g(via)g(F)n(ORE)g([12)o(])h(A)-7 b(TM)33 b(in)n(terface)e(cards)f(us-)2025 3075 y(ing)20 b(the)h(F)n(ORE)e(IP)h (comm)n(unication)f(in)n(terface.)34 b(Comm)n(unica-)2025 3175 y(tion)27 b(via)f(the)h(FDDI)h(net)n(w)n(ork)d(yields)i(the)g (highest)g(attainable)2025 3274 y(throughput)35 b(follo)n(w)n(ed)f(b)n (y)h(A)-7 b(TM)36 b(and)f(Ethernet.)59 b(Ho)n(w)n(ev)n(er,)2025 3374 y(notice)30 b(that)g(Ethernet)g(has)f(a)g(lo)n(w)n(er)g(latency)-7 b(,)30 b(implying)g(that)2025 3473 y(Ethernet)24 b(can)h(outp)r(erform) f(A)-7 b(TM)25 b(for)f(small)g(messages.)34 b(Eth-)2025 3573 y(ernet)26 b(latency)f(is)h(on)f(the)h(order)f(of)h(0.7)f(ms)g (follo)n(w)n(ed)g(b)n(y)h(A)-7 b(TM)2025 3673 y(at)27 b(near)g(0.9)g(ms.)2108 3826 y(The)i(reader)f(ma)n(y)h(b)r(e)g(alarmed) f(to)h(see)g(that)h(the)f(signature)2025 3926 y(graph)k(is)h(not)g (univ)-5 b(alued)35 b(a)f(function)g(of)h(time.)57 b(This)34 b(is)g(not)2025 4025 y(an)25 b(anomaly)-7 b(,)24 b(but)i(an)f (indication)g(that)g(a)g Fa(lar)l(ger)h Fi(message)d(can)2025 4125 y(indeed)e(tak)n(e)g Fa(less)g Fi(time)h(to)f(transfer)f(b)r (ecause)h(of)g(system)g(bu\013er)2025 4224 y(sizes)g(and)h(the)h(in)n (teraction)e(with)h(the)g(op)r(erating)f(system.)35 b(The)2025 4324 y(phenomenon)i(is)h(rep)r(eatable.)66 b(One)37 b(susp)r(ects)h (that)g(it)g(indi-)2025 4424 y(cates)22 b(the)g(need)g(for)g(impro)n(v) n(emen)n(t)f(in)h(system)g(and)g(messaging)2025 4523 y(soft)n(w)n(are,)33 b(since)g(a)h(sup)r(erset)f(of)g(a)g(task)g (should)g(alw)n(a)n(ys)f(tak)n(e)2025 4623 y(longer)26 b(than)i(the)g(task)f(b)n(y)g(itself.)2108 4776 y(In)c(order)f(to)h (examine)g(this)h(further,)g(Figure)f(5)f(presen)n(ts)h(the)2025 4876 y(saturation)31 b(graph.)49 b(It)32 b(v)n(eri\014es)f(the)h (latency)g(order)e(and)i(also)2025 4975 y(sho)n(ws)f(that)h(for)g (messages)e(up)j(to)f(appro)n(ximately)e(8)i(K)g(bits,)2025 5075 y(Ethernet)g(has)g(the)h(shortest)e(transmission)h(time.)52 b(It)32 b(should)2025 5175 y(b)r(e)k(emphasized)g(that)g(all)g(the)g (exp)r(erimen)n(ts)g(w)n(ere)f(executed)2025 5274 y(on)27 b(dedicated)h(net)n(w)n(ork)e(connections.)2108 5428 y(The)49 b(results)f(presen)n(ted)g(in)h(Figure)g(5)f(w)n(ere)g (signi\014can)n(t)2025 5527 y(enough)38 b(to)h(attempt)g(v)n (eri\014cation)f(b)n(y)g(an)h(application)f(that)p eop 4 3 bop -128 -173 a 15629760 10784529 3289088 3289088 26970521 19866091 startTexFig -128 -173 a /gnudict 40 dict def gnudict begin /Color true def /Solid false def /gnulinewidth 5.000 def /plotlinewidth 15.000 def /vshift -40 def /dl {10 mul} def /hpt 31.5 def /vpt 31.5 def /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow { currentpoint stroke M 0 vshift R show } def /Rshow { currentpoint stroke M dup stringwidth pop neg vshift R show } def /Cshow { currentpoint stroke M dup stringwidth pop -2 div vshift R show } def /DL { Color {setrgbcolor Solid {pop []} if 0 setdash } {pop pop pop Solid {pop []} if 0 setdash} ifelse } def /BL { stroke gnulinewidth 2 mul setlinewidth } def /AL { stroke gnulinewidth 2 div setlinewidth } def /PL { stroke plotlinewidth setlinewidth } def /LTb { BL [] 0 0 0 DL } def /LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def /LT0 { PL [] 0 1 0 DL } def /LT1 { PL [4 dl 2 dl] 0 0 1 DL } def /LT2 { PL [2 dl 3 dl] 1 0 0 DL } def /LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def /LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def /LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def /LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def /LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def /LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def /P { stroke [] 0 setdash currentlinewidth 2 div sub M 0 currentlinewidth V stroke } def /D { stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke P } def /A { stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke P } def /C { stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke } def /T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke P } def /S { 2 copy A C} def end gnudict begin gsave 50 50 translate 0.050 0.050 scale 0 setgray /Helvetica findfont 120 scalefont setfont newpath LTa LTb 720 301 M 63 0 V 6210 0 R -63 0 V 648 301 M (1) Rshow 720 457 M 31 0 V 6242 0 R -31 0 V 720 664 M 31 0 V 6242 0 R -31 0 V 720 770 M 31 0 V 6242 0 R -31 0 V 720 821 M 63 0 V 6210 0 R -63 0 V 648 821 M (10) Rshow 720 977 M 31 0 V 6242 0 R -31 0 V 720 1184 M 31 0 V 6242 0 R -31 0 V 720 1290 M 31 0 V 6242 0 R -31 0 V 720 1341 M 63 0 V 6210 0 R -63 0 V -6282 0 R (100) Rshow 720 1497 M 31 0 V 6242 0 R -31 0 V 720 1704 M 31 0 V 6242 0 R -31 0 V 720 1810 M 31 0 V 6242 0 R -31 0 V 720 1860 M 63 0 V 6210 0 R -63 0 V -6282 0 R (1000) Rshow 720 2017 M 31 0 V 6242 0 R -31 0 V 720 2224 M 31 0 V 6242 0 R -31 0 V 720 2330 M 31 0 V 6242 0 R -31 0 V 720 2380 M 63 0 V 6210 0 R -63 0 V -6282 0 R (10000) Rshow 720 2537 M 31 0 V 6242 0 R -31 0 V 720 2743 M 31 0 V 6242 0 R -31 0 V 720 2850 M 31 0 V 6242 0 R -31 0 V 720 2900 M 63 0 V 6210 0 R -63 0 V -6282 0 R (100000) Rshow 720 3056 M 31 0 V 6242 0 R -31 0 V 720 3263 M 31 0 V 6242 0 R -31 0 V 720 3369 M 31 0 V 6242 0 R -31 0 V 720 3420 M 63 0 V 6210 0 R -63 0 V -6282 0 R (1e+06) Rshow 720 3576 M 31 0 V 6242 0 R -31 0 V 720 3783 M 31 0 V 6242 0 R -31 0 V 720 3889 M 31 0 V 6242 0 R -31 0 V 720 3939 M 63 0 V 6210 0 R -63 0 V -6282 0 R (1e+07) Rshow 720 4096 M 31 0 V 6242 0 R -31 0 V 720 4303 M 31 0 V 6242 0 R -31 0 V 720 4409 M 31 0 V 6242 0 R -31 0 V 720 4459 M 63 0 V 6210 0 R -63 0 V -6282 0 R (1e+08) Rshow 720 4616 M 31 0 V 6242 0 R -31 0 V 720 4823 M 31 0 V 6242 0 R -31 0 V 720 4929 M 31 0 V 6242 0 R -31 0 V 720 4979 M 63 0 V 6210 0 R -63 0 V -6282 0 R (1e+09) Rshow 720 301 M 0 63 V 0 4615 R 0 -63 V 720 181 M (0.0001) Cshow 1098 301 M 0 31 V 0 4647 R 0 -31 V 1597 301 M 0 31 V 0 4647 R 0 -31 V 1853 301 M 0 31 V 0 4647 R 0 -31 V 1975 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.001) Cshow 2352 301 M 0 31 V 0 4647 R 0 -31 V 2852 301 M 0 31 V 0 4647 R 0 -31 V 3108 301 M 0 31 V 0 4647 R 0 -31 V 3229 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.01) Cshow 3607 301 M 0 31 V 0 4647 R 0 -31 V 4106 301 M 0 31 V 0 4647 R 0 -31 V 4362 301 M 0 31 V 0 4647 R 0 -31 V 4484 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.1) Cshow 4861 301 M 0 31 V 0 4647 R 0 -31 V 5361 301 M 0 31 V 0 4647 R 0 -31 V 5617 301 M 0 31 V 0 4647 R 0 -31 V 5738 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1) Cshow 6116 301 M 0 31 V 0 4647 R 0 -31 V 6615 301 M 0 31 V 0 4647 R 0 -31 V 6871 301 M 0 31 V 0 4647 R 0 -31 V 6993 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (10) Cshow 720 301 M 6273 0 V 0 4678 V -6273 0 V 720 301 L 120 2640 M currentpoint gsave translate 90 rotate 0 0 M (Block size in bits) Cshow grestore 3856 61 M (Time) Cshow LTb 6570 4796 M (FDDI) Rshow LT0 6642 4796 M 216 0 V 5917 4461 M 1 0 V -222 -92 V 4 0 V -160 -65 V -1 0 V 2 0 V -220 -91 V -1 0 V 2 0 V -157 -65 V -3 0 V 3 0 V -222 -92 V 1 0 V 2 0 V -155 -65 V -3 0 V 4 0 V -221 -91 V -2 0 V 7 0 V -157 -65 V -2 0 V 3 0 V -216 -92 V 2 0 V 11 0 V -165 -65 V -3 0 V 30 0 V -235 -91 V 1 0 V 10 0 V -156 -65 V -1 0 V 18 0 V -209 -92 V -8 0 V 111 0 V -237 -65 V -7 0 V 33 0 V -207 -91 V -11 0 V 248 0 V -397 -65 V -2 0 V 10 0 V -140 -92 V -3 0 V 15 0 V -120 -64 V -8 -1 V 11 0 V -99 -91 V -16 0 V 2 0 V -99 -65 V -12 0 V 13 0 V -76 -91 V -27 -1 V 6 0 V -93 -64 V -2 0 V -16 -1 V -64 -91 V -32 0 V 49 0 V -62 -65 V -2 0 V 1 0 V -87 -91 V -49 -1 V -35 -64 V 0 -1 V -62 -90 V -4 -1 V 6 -1 V -60 -63 V 0 -1 V -1 -1 V -18 -89 V -2 -1 V 1 -2 V -16 -62 V -2 -1 V 0 -2 V -13 -87 V -1 -3 V 0 -3 V -6 -58 V -1 -4 V 1 -3 V -5 -83 V 0 -5 V 0 -6 V -5 -52 V 0 -7 V 0 -7 V -1 -74 V -1 -11 V 1 -11 V -4 -40 V -2 -14 V 1 -14 V -25 -57 V -9 -20 V 5 -22 V -4 -17 V -52 -26 V -1 -30 V -2 -23 V 0 -39 V 0 -47 V 0 -18 V -1 -91 V 0 -65 V -1 -92 V -1 -65 V 0 -91 V -1 -157 V LTb 6570 4676 M (ATM) Rshow LT1 6642 4676 M 216 0 V 5870 4369 M 1 0 V 7 0 V -161 -65 V 3 0 V 3 0 V -227 -91 V 2 0 V 8 0 V -157 -65 V -3 0 V -1 0 V -221 -92 V 1 0 V -157 -65 V 6 0 V 1 0 V -227 -91 V 1 0 V -168 -65 V 9 0 V 6 0 V -218 -92 V 4 0 V 1 0 V -177 -65 V 4 0 V -2 0 V -212 -91 V -4 0 V 5 0 V -148 -65 V -6 0 V 11 0 V -209 -92 V -6 0 V 7 0 V -177 -65 V -7 0 V 5 0 V -155 -91 V -5 0 V -223 -65 V -7 0 V -1 0 V -161 -92 V -10 0 V -99 -64 V -13 -1 V -128 -91 V -17 0 V 2 0 V -72 -65 V -3 0 V -87 -91 V -28 -1 V 1 0 V -72 -64 V -1 0 V -7 -1 V -114 -91 V -11 0 V 1 0 V -51 -65 V -2 0 V -52 -91 V -1 0 V -52 -1 V -31 -64 V -3 0 V 1 -1 V -39 -90 V 0 -1 V 1 -1 V -22 -63 V -1 -1 V 0 -1 V -23 -89 V -3 -1 V 0 -2 V 8 -62 V -1 -1 V 0 -2 V -12 -87 V -1 -3 V 0 -3 V -3 -58 V -1 -4 V 0 -3 V -13 -83 V 0 -5 V -1 -6 V -8 -52 V -8 -7 V 1 -7 V -3 -74 V 0 -11 V -3 -11 V -5 -40 V -32 -14 V 1 -14 V -9 -57 V -2 -20 V 1 -22 V -1 -17 V 0 -26 V -2 -30 V 0 -23 V -2 -39 V 2 -47 V -2 -18 V 0 -91 V 0 -65 V -1 -92 V 0 -65 V -1 -91 V -1 -157 V LTb 6570 4556 M (Ethernet) Rshow LT2 6642 4556 M 216 0 V 5850 3900 M -193 -78 V -181 -79 V -189 -78 V -192 -78 V -170 -78 V -182 -79 V -180 -78 V -215 -78 V -220 -78 V -191 -79 V -221 -78 V -212 -78 V -212 -78 V -175 -79 V -167 -78 V -164 -78 V -154 -78 V -145 -79 V -123 -78 V -112 -78 V -95 -78 V -80 -79 V -66 -78 V -47 -79 V -41 -77 V -27 -80 V -26 -78 V -15 -80 V -12 -76 V -21 -84 V -4 -78 V -3 -72 V -6 -156 V -1 -157 V -1 -156 V -1 -157 V stroke grestore end showpage endTexFig -150 1376 a Fi(Figure)27 b(5:)38 b(Saturation)27 b(Graphs)g(for)h (FDDI,)h(A)-7 b(TM,)29 b(and)e(Eth-)-150 1476 y(ernet)-128 1579 y 15629760 10784529 3289088 3289088 26970521 19866091 startTexFig -128 1579 a /gnudict 40 dict def gnudict begin /Color true def /Solid false def /gnulinewidth 5.000 def /plotlinewidth 12.000 def /vshift -40 def /dl {10 mul} def /hpt 31.5 def /vpt 31.5 def /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow { currentpoint stroke M 0 vshift R show } def /Rshow { currentpoint stroke M dup stringwidth pop neg vshift R show } def /Cshow { currentpoint stroke M dup stringwidth pop -2 div vshift R show } def /DL { Color {setrgbcolor Solid {pop []} if 0 setdash } {pop pop pop Solid {pop []} if 0 setdash} ifelse } def /BL { stroke gnulinewidth 2 mul setlinewidth } def /AL { stroke gnulinewidth 2 div setlinewidth } def /PL { stroke plotlinewidth setlinewidth } def /LTb { BL [] 0 0 0 DL } def /LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def /LT0 { PL [] 0 1 0 DL } def /LT1 { PL [4 dl 2 dl] 0 0 1 DL } def /LT2 { PL [2 dl 3 dl] 1 0 0 DL } def /LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def /LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def /LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def /LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def /LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def /LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def /P { stroke [] 0 setdash currentlinewidth 2 div sub M 0 currentlinewidth V stroke } def /D { stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke P } def /A { stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke P } def /C { stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke } def /T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke P } def /S { 2 copy A C} def end gnudict begin gsave 50 50 translate 0.050 0.050 scale 0 setgray /Helvetica findfont 120 scalefont setfont newpath LTa 720 301 M 6273 0 V LTb 720 301 M 63 0 V 6210 0 R -63 0 V 648 301 M (0) Rshow 720 969 M 63 0 V 6210 0 R -63 0 V 648 969 M (50000) Rshow 720 1638 M 63 0 V 6210 0 R -63 0 V -6282 0 R (100000) Rshow 720 2306 M 63 0 V 6210 0 R -63 0 V -6282 0 R (150000) Rshow 720 2974 M 63 0 V 6210 0 R -63 0 V -6282 0 R (200000) Rshow 720 3642 M 63 0 V 6210 0 R -63 0 V -6282 0 R (250000) Rshow 720 4311 M 63 0 V 6210 0 R -63 0 V -6282 0 R (300000) Rshow 720 4979 M 63 0 V 6210 0 R -63 0 V -6282 0 R (350000) Rshow 720 301 M 0 63 V 0 4615 R 0 -63 V 720 181 M (0.001) Cshow 1349 301 M 0 31 V 0 4647 R 0 -31 V 1718 301 M 0 31 V 0 4647 R 0 -31 V 1979 301 M 0 31 V 0 4647 R 0 -31 V 2182 301 M 0 31 V 0 4647 R 0 -31 V 2347 301 M 0 31 V 0 4647 R 0 -31 V 2487 301 M 0 31 V 0 4647 R 0 -31 V 2608 301 M 0 31 V 0 4647 R 0 -31 V 2715 301 M 0 31 V 0 4647 R 0 -31 V 2811 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.01) Cshow 3440 301 M 0 31 V 0 4647 R 0 -31 V 3809 301 M 0 31 V 0 4647 R 0 -31 V 4070 301 M 0 31 V 0 4647 R 0 -31 V 4273 301 M 0 31 V 0 4647 R 0 -31 V 4438 301 M 0 31 V 0 4647 R 0 -31 V 4578 301 M 0 31 V 0 4647 R 0 -31 V 4699 301 M 0 31 V 0 4647 R 0 -31 V 4806 301 M 0 31 V 0 4647 R 0 -31 V 4902 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.1) Cshow 5531 301 M 0 31 V 0 4647 R 0 -31 V 5900 301 M 0 31 V 0 4647 R 0 -31 V 6161 301 M 0 31 V 0 4647 R 0 -31 V 6364 301 M 0 31 V 0 4647 R 0 -31 V 6529 301 M 0 31 V 0 4647 R 0 -31 V 6669 301 M 0 31 V 0 4647 R 0 -31 V 6790 301 M 0 31 V 0 4647 R 0 -31 V 6897 301 M 0 31 V 0 4647 R 0 -31 V 6993 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1) Cshow 720 301 M 6273 0 V 0 4678 V -6273 0 V 720 301 L 120 2640 M currentpoint gsave translate 90 rotate 0 0 M (QUIPS) Cshow grestore 3856 61 M (Time) Cshow LTb 6570 4796 M (Ethernet) Rshow LT0 6642 4796 M 216 0 V 6551 4548 M -201 -54 V -217 49 V -206 -6 V -207 -28 V -201 -24 V -205 -9 V -210 -15 V -207 -2 V -203 -19 V -204 -38 V -204 -15 V -203 -19 V -207 -24 V -192 -66 V -206 -6 V -196 -70 V 3106 4067 L -204 -15 V 2735 3874 L 2557 3761 L 2400 3576 L 2249 3365 L 2093 3198 L 1959 2971 L 1818 2778 L -95 -289 V 1613 2263 L -65 -285 V -87 -208 V -50 -229 V -63 -175 V -35 -181 V -17 -170 V 1261 896 L 1237 791 L -18 -82 V -14 -73 V -11 -59 V -14 -43 V -6 -47 V -6 -31 V -5 -32 V 0 -16 V -7 -16 V -2 -16 V -12 -16 V LTb 6570 4676 M (ATM) Rshow LT1 6642 4676 M 216 0 V 6557 4520 M -217 20 V -200 -29 V -217 45 V -206 -31 V -201 -29 V -206 -4 V -207 -26 V -213 29 V -206 -9 V -204 -38 V -204 -16 V -201 -28 V 3887 4299 L -200 -35 V -205 -9 V 3299 4129 L -185 -92 V -193 -62 V 2747 3827 L 2575 3694 L 2425 3483 L 2274 3285 L 2115 3128 L 1978 2915 L 1868 2648 L 1765 2391 L -92 -254 V -83 -235 V -60 -239 V -56 -205 V -39 -190 V -37 -162 V 1363 964 L 1349 842 L -20 -98 V -16 -75 V -11 -66 V -3 -56 V -17 -38 V -13 -40 V -2 -29 V -5 -29 V -3 -14 V -1 -15 V -1 -14 V -16 -14 V stroke grestore end showpage endTexFig -150 3128 a Fi(Figure)35 b(6:)52 b(HINT)35 b(Graphs)g(for)g(Ethernet)g (and)g(A)-7 b(TM)36 b(based)-150 3228 y(comm)n(unication)-150 3481 y(uses)24 b(small)g(messages.)34 b(F)-7 b(or)24 b(suc)n(h)g(an)g(application,)h(one)f(w)n(ould)-150 3581 y(exp)r(ect)38 b(b)r(etter)g(p)r(erformance)e(using)i(a)f(dedicated)g (Ethernet)-150 3680 y(connection)19 b(than)g(using)g(a)g(dedicated)g(A) -7 b(TM)19 b(connection.)34 b(The)-150 3780 y(ideal)k(application)g (for)g(this)h(purp)r(ose)f(is)h(the)g(HINT)g(b)r(enc)n(h-)-150 3880 y(mark.)79 b(The)42 b(comm)n(unication)g(in)g(HINT)h(is)e(a)h (global)f(sum)-150 3979 y(collapse)27 b(of)h(t)n(w)n(o)f(double)h (precision)f(\015oating)g(p)r(oin)n(t)i(n)n(um)n(b)r(ers.)-150 4079 y(Using)j(the)h(same)f(pair)g(of)g(SGI)h(IND)n(Y)g(w)n (orkstations,)f(HINT)-150 4178 y(w)n(as)e(run)i(using)f(the)h(Ethernet) f(link)g(and)h(the)f(A)-7 b(TM)32 b(link.)49 b(In)-150 4278 y(eac)n(h)21 b(case,)h(the)g(links)g(w)n(ere)f(dedicated)h(and)f (the)i(con\014guration)-150 4378 y(w)n(as)32 b(iden)n(tical)h(to)g (that)h(used)f(for)g(the)g(NetPIPE)f(tests.)54 b(The)-150 4477 y(HINT)35 b(QUIPS)f(graphs)f(for)h(eac)n(h)g(con\014guration)e (are)i(sho)n(wn)-150 4577 y(in)28 b(Figure)f(6.)36 b(The)28 b(Ethernet)f(con\014guration)f(is)h(able)g(to)h(come)-150 4677 y(up)22 b(to)f(sp)r(eed)h(so)r(oner)e(that)i(the)g(A)-7 b(TM)22 b(con\014guration,)f(and)h(as)e(a)-150 4776 y(result,)j(the)f (Ethernet)g(con\014guration)e(pro)r(duces)h(b)r(etter)i(HINT)-150 4876 y(p)r(erformance.)-67 5029 y(The)35 b(graph)e(sho)n(wn)g(in)i (Figure)f(7)g(depicts)h(the)f(di\013erences)-150 5129 y(in)44 b(net)n(w)n(ork)e(throughput)i(for)f(blo)r(c)n(k)g(and)h (stream)f(transfer)-150 5228 y(mo)r(des.)54 b(NetPIPE)33 b(sim)n(ulates)g(streaming)f(data)h(transfer)f(b)n(y)-150 5328 y(executing)i(a)h(series)e(of)i(sends)f(in)h(rapid)f(succession)g (without)-150 5428 y(ac)n(kno)n(wledgmen)n(t)21 b(at)i(the)h (application)e(lev)n(el.)35 b(In)24 b(blo)r(c)n(k)e(trans-)-150 5527 y(fer,)28 b(eac)n(h)f(blo)r(c)n(k)h(is)g(sen)n(t)g(to)g(the)g (receiv)n(er,)e(whic)n(h)i(returns)g(the)2047 -173 y 15629760 10784529 3289088 3289088 26970521 19866091 startTexFig 2047 -173 a /gnudict 40 dict def gnudict begin /Color true def /Solid false def /gnulinewidth 5.000 def /plotlinewidth 15.000 def /vshift -40 def /dl {10 mul} def /hpt 31.5 def /vpt 31.5 def /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow { currentpoint stroke M 0 vshift R show } def /Rshow { currentpoint stroke M dup stringwidth pop neg vshift R show } def /Cshow { currentpoint stroke M dup stringwidth pop -2 div vshift R show } def /DL { Color {setrgbcolor Solid {pop []} if 0 setdash } {pop pop pop Solid {pop []} if 0 setdash} ifelse } def /BL { stroke gnulinewidth 2 mul setlinewidth } def /AL { stroke gnulinewidth 2 div setlinewidth } def /PL { stroke plotlinewidth setlinewidth } def /LTb { BL [] 0 0 0 DL } def /LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def /LT0 { PL [] 0 1 0 DL } def /LT1 { PL [4 dl 2 dl] 0 0 1 DL } def /LT2 { PL [2 dl 3 dl] 1 0 0 DL } def /LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def /LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def /LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def /LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def /LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def /LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def /P { stroke [] 0 setdash currentlinewidth 2 div sub M 0 currentlinewidth V stroke } def /D { stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke P } def /A { stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke P } def /C { stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke } def /T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke P } def /S { 2 copy A C} def end gnudict begin gsave 50 50 translate 0.050 0.050 scale 0 setgray /Helvetica findfont 120 scalefont setfont newpath LTa 720 301 M 6273 0 V LTb 720 301 M 63 0 V 6210 0 R -63 0 V 648 301 M (0) Rshow 720 821 M 63 0 V 6210 0 R -63 0 V 648 821 M (10) Rshow 720 1341 M 63 0 V 6210 0 R -63 0 V -6282 0 R (20) Rshow 720 1860 M 63 0 V 6210 0 R -63 0 V -6282 0 R (30) Rshow 720 2380 M 63 0 V 6210 0 R -63 0 V -6282 0 R (40) Rshow 720 2900 M 63 0 V 6210 0 R -63 0 V -6282 0 R (50) Rshow 720 3420 M 63 0 V 6210 0 R -63 0 V -6282 0 R (60) Rshow 720 3939 M 63 0 V 6210 0 R -63 0 V -6282 0 R (70) Rshow 720 4459 M 63 0 V 6210 0 R -63 0 V -6282 0 R (80) Rshow 720 4979 M 63 0 V 6210 0 R -63 0 V -6282 0 R (90) Rshow 720 301 M 0 63 V 0 4615 R 0 -63 V 720 181 M (0.0001) Cshow 1098 301 M 0 31 V 0 4647 R 0 -31 V 1597 301 M 0 31 V 0 4647 R 0 -31 V 1853 301 M 0 31 V 0 4647 R 0 -31 V 1975 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.001) Cshow 2352 301 M 0 31 V 0 4647 R 0 -31 V 2852 301 M 0 31 V 0 4647 R 0 -31 V 3108 301 M 0 31 V 0 4647 R 0 -31 V 3229 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.01) Cshow 3607 301 M 0 31 V 0 4647 R 0 -31 V 4106 301 M 0 31 V 0 4647 R 0 -31 V 4362 301 M 0 31 V 0 4647 R 0 -31 V 4484 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.1) Cshow 4861 301 M 0 31 V 0 4647 R 0 -31 V 5361 301 M 0 31 V 0 4647 R 0 -31 V 5617 301 M 0 31 V 0 4647 R 0 -31 V 5738 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1) Cshow 6116 301 M 0 31 V 0 4647 R 0 -31 V 6615 301 M 0 31 V 0 4647 R 0 -31 V 6871 301 M 0 31 V 0 4647 R 0 -31 V 6993 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (10) Cshow 720 301 M 6273 0 V 0 4678 V -6273 0 V 720 301 L 120 2640 M currentpoint gsave translate 90 rotate 0 0 M (Throughput in Mbps) Cshow grestore 3856 61 M (Time) Cshow LTb 6570 4796 M (FDDI Stream) Rshow LT0 6642 4796 M 216 0 V 5832 4500 M 2 -15 V 0 3 V -222 8 V -2 14 V 3 -24 V -158 14 V -1 3 V 2 -14 V -223 16 V -4 33 V 4 -30 V -161 29 V 3 -23 V -2 17 V -223 17 V 5 -37 V 0 -1 V -157 -2 V -5 40 V 3 -19 V -217 -32 V -2 15 V -2 12 V -154 -17 V -6 49 V 3 -28 V -221 4 V -2 15 V 12 -93 V -165 58 V 0 8 V -3 22 V -216 -39 V -9 67 V 15 -117 V -161 32 V -2 17 V 4 -30 V -221 4 V -8 60 V 15 -113 V -160 23 V -6 46 V 6 -47 V -218 -21 V -6 46 V -12 93 V 2835 4321 L -21 158 V -5 38 V 2622 4261 L -29 216 V 17 -131 V -147 -69 V -20 152 V 10 -79 V -208 -97 V -31 237 V 50 -373 V 2132 3953 L -57 400 V 112 -753 V 2007 3363 L -84 513 V 24 -156 V 1838 3434 L -18 102 V 36 -205 V 1690 3041 L -121 676 V 101 -581 V -137 -97 V -46 241 V 49 -258 V 1407 2603 L -96 446 V 142 -637 V -69 -306 V -49 167 V 50 -177 V -76 -413 V -13 26 V 8 -20 V -33 -274 V -8 10 V 12 -28 V -28 -319 V -4 1 V 30 -47 V 1473 687 L -7 1 V 1 -4 V -80 -81 V -2 -2 V 0 -4 V 0 -68 V -6 -1 V -4 -2 V -16 -64 V -5 -2 V 1 -5 V -42 -22 V 16 -8 V 32 -10 V 1259 400 L -16 -2 V 6 -6 V 30 -19 V -34 1 V 18 -7 V -44 -11 V -2 -4 V 0 -5 V 22 -5 V 10 -5 V -10 -4 V -44 0 V 41 -7 V 9 -5 V -55 0 V -82 -4 V 11 -5 V -30 -3 V -2 -2 V -12 -2 V -17 -2 V LTb 6570 4676 M (ATM Stream) Rshow LT1 6642 4676 M 216 0 V 5815 3193 M 2 -10 V 4 -22 V -160 13 V 0 4 V -2 12 V -232 57 V 8 -45 V -8 47 V -144 -72 V 3 -16 V 2 -9 V -234 70 V -8 44 V 11 -62 V -160 20 V -40 219 V 32 -175 V -247 144 V 18 -100 V 7 -40 V -171 77 V 1 -5 V 19 -102 V -273 291 V 43 -241 V -3 12 V -144 -64 V 8 -48 V 1 -2 V -265 244 V -8 43 V 39 -218 V -190 188 V -31 184 V 15 -89 V -230 52 V 7 -44 V 33 -188 V -181 140 V -21 124 V 16 -100 V 3153 3289 L -20 113 V -2 11 V 3003 3253 L -58 334 V 37 -216 V -240 110 V -1 4 V 20 -113 V -181 140 V -10 57 V 15 -91 V -207 -75 V -23 129 V -1 7 V -140 -95 V -12 70 V 8 -50 V 2038 3196 L -58 320 V -7 43 V -71 -475 V -39 206 V 45 -236 V 1739 2807 L -70 341 V 52 -261 V 1588 2779 L -47 225 V 47 -232 V 1421 2548 L -78 336 V 134 -561 V -84 -247 V -89 314 V 84 -305 V -86 -383 V -85 229 V 89 -250 V -47 -243 V -78 170 V 74 -170 V -47 -302 V -68 105 V 105 -170 V 1511 660 L -8 2 V 21 -15 V -8 -107 V -3 -2 V -14 3 V -53 -36 V 7 -6 V 22 -10 V -5 -57 V -6 -2 V -2 -2 V -53 -16 V 1 -4 V 32 -9 V -20 -25 V -1 -3 V -15 -1 V 0 -11 V -40 0 V -7 -3 V -17 -11 V -25 -2 V -4 -3 V 13 -4 V -9 -3 V -19 -3 V -5 -3 V -50 -2 V -11 -4 V 17 -2 V -39 -5 V 5 -3 V -16 -3 V -2 -2 V -5 -2 V -16 -1 V LTb 6570 4556 M (Ethernet Stream) Rshow LT2 6642 4556 M 216 0 V 5836 648 M -190 1 V -189 0 V -206 12 V -181 -6 V -206 12 V -175 -9 V -195 3 V -211 16 V 4109 667 L -207 12 V 3735 664 L -196 5 V -197 5 V -179 -6 V -214 17 V 2775 675 L -188 -1 V 2422 658 L -202 9 V -177 -8 V -189 0 V -177 -8 V -55 -76 V -58 -60 V -42 -49 V 15 -53 V -91 -18 V 10 -29 V -10 -18 V -24 -13 V -10 -10 V -6 -6 V -8 -9 V 1 -4 V -6 -3 V -1 -1 V LTb 6570 4436 M (FDDI Block) Rshow LT3 6642 4436 M 216 0 V 5917 3896 M 0 -1 V 1 -7 V -222 12 V 4 -28 V -160 22 V -1 2 V 2 -11 V -220 -3 V -1 6 V 2 -14 V -157 -2 V -3 19 V 3 -16 V -222 9 V 1 -11 V 2 -13 V -155 -8 V -3 15 V 4 -20 V -221 -2 V -2 15 V 7 -48 V -157 2 V -2 14 V 3 -20 V -216 -31 V 2 -12 V 11 -70 V -165 47 V -3 22 V 30 -187 V -235 86 V 1 -5 V 10 -62 V -156 -4 V -1 5 V 18 -106 V -209 -69 V -8 46 V 111 -585 V -237 413 V -7 36 V 33 -179 V -207 -70 V -11 59 V 3429 2102 L 3032 3103 L -2 9 V 10 -51 V 2900 2677 L -3 17 V 15 -69 V 2792 2477 L -8 32 V 11 -45 V -99 -434 V -16 52 V 2 -6 V -99 -180 V -12 36 V 13 -39 V -76 -370 V -27 61 V 6 -16 V -93 -139 V -2 4 V -16 34 V -64 -290 V -32 51 V 49 -79 V -62 -135 V -2 2 V 1 -2 V 2179 860 L -49 50 V 2095 790 L 0 -1 V 0 -1 V 2033 667 L -4 1 V 6 -5 V -60 -56 V 0 -1 V -1 -1 V -18 -93 V -2 0 V 1 -2 V -16 -45 V -2 -1 V 0 -1 V -13 -49 V -1 -1 V 0 -2 V -6 -24 V -1 -1 V 1 -2 V -5 -25 V 0 -1 V 0 -1 V -5 -12 V 0 -1 V 0 -1 V -1 -12 V -1 -1 V 1 -2 V -4 -4 V -2 -1 V 1 -2 V -25 -3 V -9 -2 V 5 -1 V -4 -1 V -52 0 V -1 -2 V -2 -1 V 0 -1 V 0 -2 V 0 -1 V -1 -2 V 0 -1 V -1 -1 V -1 0 V 0 -1 V -1 0 V LTb 6570 4316 M (ATM Block) Rshow LT4 6642 4316 M 216 0 V 5870 2914 M 1 -4 V 7 -33 V -161 18 V 3 -13 V 3 -16 V -227 28 V 2 -6 V 8 -38 V -157 1 V -3 11 V -1 8 V -221 2 V 1 -7 V 0 -1 V -157 0 V 6 -27 V 1 -5 V -227 29 V 1 -2 V 0 -4 V -168 57 V 9 -46 V 6 -25 V -218 -17 V 4 -15 V 1 -8 V -177 98 V 4 -23 V -2 13 V -212 -44 V -4 19 V 5 -21 V -148 -42 V -6 29 V 11 -50 V -209 -56 V -6 27 V 7 -32 V -177 94 V -7 32 V 5 -23 V 3312 2532 L -5 23 V 0 -2 V -223 292 V -7 35 V -1 3 V 2915 2616 L -10 39 V 0 1 V -99 -237 V -13 54 V 0 -1 V 2665 2130 L -17 58 V 2 -8 V -72 -267 V -3 6 V -87 -351 V -28 66 V 1 -3 V -72 -191 V -1 3 V -7 12 V 2267 1251 L -11 19 V 1 -2 V -51 -169 V -2 2 V 0 -1 V 2152 888 L -1 0 V -52 59 V 2068 816 L -3 1 V 1 -2 V 2027 671 L 0 -1 V 1 -2 V -22 -78 V -1 -1 V 0 -1 V -23 -85 V -3 -1 V 0 -1 V 8 -50 V -1 -1 V 0 -1 V -12 -45 V -1 -1 V 0 -1 V -3 -23 V -1 -1 V 0 -1 V -13 -22 V 0 -1 V -1 -2 V -8 -10 V -8 0 V 1 -2 V -3 -11 V 0 -1 V -3 -1 V -5 -4 V -32 0 V 1 -1 V -9 -5 V -2 -1 V 1 -2 V -1 0 V 0 -2 V -2 -1 V 0 -1 V -2 -2 V 2 -1 V -2 0 V 0 -2 V 0 -1 V -1 -1 V 0 -1 V -1 0 V -1 -1 V LTb 6570 4196 M (Ethernet Block) Rshow LT5 6642 4196 M 216 0 V 5850 640 M -193 3 V -181 -5 V -189 -1 V -192 3 V 4925 628 L -182 -4 V -180 -5 V -215 15 V -220 20 V -191 2 V -221 21 V -212 17 V -212 16 V 3117 700 L 2950 685 L 2786 667 L 2632 645 L 2487 618 L 2364 582 L 2252 545 L -95 -39 V -80 -37 V -66 -34 V -47 -31 V -41 -24 V -27 -21 V -26 -15 V -15 -12 V -12 -8 V -21 -7 V -4 -4 V -3 -3 V -6 -5 V -1 -2 V -1 -1 V -1 0 V stroke grestore end showpage endTexFig 2159 1376 a Fi(Figure)f(7:)36 b(Blo)r(c)n(k)27 b(T)-7 b(ransfer)26 b(vs.)37 b(Streaming)27 b(T)-7 b(ransfer)2047 1506 y 15629760 10784529 3289088 3289088 26970521 19866091 startTexFig 2047 1506 a /gnudict 40 dict def gnudict begin /Color true def /Solid false def /gnulinewidth 5.000 def /plotlinewidth 15.000 def /vshift -40 def /dl {10 mul} def /hpt 31.5 def /vpt 31.5 def /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow { currentpoint stroke M 0 vshift R show } def /Rshow { currentpoint stroke M dup stringwidth pop neg vshift R show } def /Cshow { currentpoint stroke M dup stringwidth pop -2 div vshift R show } def /DL { Color {setrgbcolor Solid {pop []} if 0 setdash } {pop pop pop Solid {pop []} if 0 setdash} ifelse } def /BL { stroke gnulinewidth 2 mul setlinewidth } def /AL { stroke gnulinewidth 2 div setlinewidth } def /PL { stroke plotlinewidth setlinewidth } def /LTb { BL [] 0 0 0 DL } def /LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def /LT0 { PL [] 0 1 0 DL } def /LT1 { PL [4 dl 2 dl] 0 0 1 DL } def /LT2 { PL [2 dl 3 dl] 1 0 0 DL } def /LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def /LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def /LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def /LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def /LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def /LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def /P { stroke [] 0 setdash currentlinewidth 2 div sub M 0 currentlinewidth V stroke } def /D { stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke P } def /A { stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke P } def /C { stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke } def /T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke P } def /S { 2 copy A C} def end gnudict begin gsave 50 50 translate 0.050 0.050 scale 0 setgray /Helvetica findfont 120 scalefont setfont newpath LTa 720 301 M 6273 0 V LTb 720 301 M 63 0 V 6210 0 R -63 0 V 648 301 M (0) Rshow 720 1081 M 63 0 V 6210 0 R -63 0 V -6282 0 R (10) Rshow 720 1860 M 63 0 V 6210 0 R -63 0 V -6282 0 R (20) Rshow 720 2640 M 63 0 V 6210 0 R -63 0 V -6282 0 R (30) Rshow 720 3420 M 63 0 V 6210 0 R -63 0 V -6282 0 R (40) Rshow 720 4199 M 63 0 V 6210 0 R -63 0 V -6282 0 R (50) Rshow 720 4979 M 63 0 V 6210 0 R -63 0 V -6282 0 R (60) Rshow 720 301 M 0 63 V 0 4615 R 0 -63 V 720 181 M (0.0001) Cshow 1098 301 M 0 31 V 0 4647 R 0 -31 V 1597 301 M 0 31 V 0 4647 R 0 -31 V 1853 301 M 0 31 V 0 4647 R 0 -31 V 1975 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.001) Cshow 2352 301 M 0 31 V 0 4647 R 0 -31 V 2852 301 M 0 31 V 0 4647 R 0 -31 V 3108 301 M 0 31 V 0 4647 R 0 -31 V 3229 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.01) Cshow 3607 301 M 0 31 V 0 4647 R 0 -31 V 4106 301 M 0 31 V 0 4647 R 0 -31 V 4362 301 M 0 31 V 0 4647 R 0 -31 V 4484 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.1) Cshow 4861 301 M 0 31 V 0 4647 R 0 -31 V 5361 301 M 0 31 V 0 4647 R 0 -31 V 5617 301 M 0 31 V 0 4647 R 0 -31 V 5738 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1) Cshow 6116 301 M 0 31 V 0 4647 R 0 -31 V 6615 301 M 0 31 V 0 4647 R 0 -31 V 6871 301 M 0 31 V 0 4647 R 0 -31 V 6993 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (10) Cshow 720 301 M 6273 0 V 0 4678 V -6273 0 V 720 301 L 120 2640 M currentpoint gsave translate 90 rotate 0 0 M (Throughput in Mbps) Cshow grestore 3856 61 M (Time) Cshow LTb 6570 4796 M (TCP/IP over ATM) Rshow LT0 6642 4796 M 216 0 V 5870 4221 M 1 -6 V 7 -50 V -161 28 V 3 -21 V 3 -23 V -227 42 V 2 -10 V 8 -56 V -157 1 V -3 17 V -1 12 V -221 2 V 1 -10 V 0 -2 V -157 0 V 6 -40 V 1 -7 V -227 42 V 1 -2 V 0 -6 V -168 85 V 9 -69 V 6 -36 V -218 -26 V 4 -24 V 1 -11 V -177 147 V 4 -34 V -2 19 V -212 -66 V -4 28 V 5 -31 V -148 -63 V -6 44 V 11 -76 V -209 -83 V -6 39 V 7 -47 V -177 142 V -7 48 V 5 -35 V 3312 3647 L -5 34 V 0 -2 V -223 438 V -7 53 V -1 5 V 2915 3773 L -10 59 V 0 2 V -99 -355 V -13 80 V 0 -2 V 2665 3045 L -17 86 V 2 -12 V -72 -400 V -3 9 V 0 -1 V -87 -526 V -28 99 V 1 -4 V -72 -286 V -1 4 V -7 18 V 2267 1726 L -11 29 V 1 -4 V -51 -253 V -2 3 V 0 -1 V -52 -319 V -1 1 V -52 88 V -31 -197 V -3 2 V 1 -3 V 2027 856 L 0 -2 V 1 -2 V 2006 734 L -1 -1 V 0 -2 V 1982 603 L -3 0 V 0 -2 V 8 -75 V -1 -1 V 0 -2 V -12 -68 V -1 -1 V 0 -2 V -3 -34 V -1 -2 V 0 -1 V -13 -33 V 0 -2 V -1 -2 V -8 -15 V -8 -1 V 1 -2 V -3 -16 V 0 -2 V -3 -2 V -5 -6 V -32 0 V 1 -2 V -9 -7 V -2 -2 V 1 -2 V -1 -1 V 0 -2 V -2 -2 V 0 -2 V -2 -2 V 2 -2 V -2 -1 V 0 -2 V 0 -2 V -1 -1 V 0 -1 V -1 -1 V -1 0 V LTb 6570 4676 M (MPI over ATM) Rshow LT1 6642 4676 M 216 0 V 5811 3387 M -190 10 V -188 -4 V -186 -18 V -189 -2 V -187 -8 V -185 -22 V -181 -41 V -185 -21 V -183 -33 V -172 -89 V -174 -78 V 3625 2968 L 3468 2815 L 3304 2705 L 3155 2533 L 3030 2289 L -31 -501 V -170 -50 V 2692 1606 L 2577 1442 L -78 -211 V 2389 1105 L 2346 917 L 2302 773 L 2282 647 L -28 -88 V -6 -74 V 6 -55 V -6 -37 V -4 -26 V -7 -19 V -6 -14 V -9 -9 V -1 -7 V -1 -5 V -20 -3 V -3 -3 V -1 -3 V -1 -1 V 0 -1 V 1 -1 V stroke grestore end showpage endTexFig 2400 3055 a Fi(Figure)27 b(8:)36 b(Proto)r(col)26 b(La)n(y)n(er)g(Ov)n (erhead)2025 3334 y(message.)34 b(Figure)21 b(7)h(presen)n(ts)f(the)h (signature)f(graphs)g(for)g(Eth-)2025 3433 y(ernet,)37 b(FDDI,)g(and)e(A)-7 b(TM,)36 b(for)f(b)r(oth)h(streaming)e(and)i(blo)r (c)n(k)2025 3533 y(transfer)28 b(mo)r(des.)41 b(In)29 b(streaming)f(mo)r(de,)h(FDDI)h(pro)n(vides)e(the)2025 3633 y(largest)i(throughput)h(for)g(all)g(blo)r(c)n(k)g(sizes.)48 b(W)-7 b(e)32 b(surmise)f(that)2025 3732 y(this)23 b(is)g(due)h(to)f (the)g(large)f(net)n(w)n(ork)f(cells)i(used)g(b)n(y)g(FDDI.)h(This)2025 3832 y(is)41 b(imp)r(ortan)n(t)g(information)f(for)g(application)h (programmers)2025 3931 y(lo)r(oking)18 b(for)g(a)h(net)n(w)n(ork)e (solution.)34 b(If)19 b(the)h(application)e(in)n(v)n(olv)n(es)2025 4031 y(streaming)33 b(data)h(across)e(the)j(net)n(w)n(ork,)g(FDDI)g (presen)n(ts)f(the)2025 4131 y(b)r(est)28 b(solution)f(for)g (transferring)f(data)h(via)g(a)g(dedicated)h(link.)2025 4489 y Ff(4)135 b(Disco)l(v)l(eries)47 b(using)e(NetPIPE)2025 4730 y Fi(A)25 b(driving)f(force)g(b)r(ehind)i(the)f(dev)n(elopmen)n(t) f(of)h(NetPIPE)f(has)2025 4830 y(b)r(een)d(proto)r(col)f(indep)r (endence)i(and)f(the)g(abilit)n(y)g(to)f(accurately)2025 4929 y(compare)37 b(di\013eren)n(t)h(proto)r(cols.)68 b(The)38 b(resulting)g(bandwidth)2025 5029 y(graphs)28 b(for)g(MPI)h([10)o(],)h(the)f(message)f(passing)f(in)n(terface,)i(and) 2025 5129 y(TCP)g(are)f(presen)n(ted)h(in)h(Figure)e(8.)42 b(All)30 b(data)f(w)n(ere)f(obtained)2025 5228 y(using)19 b(the)h(same)e(mac)n(hines)h(and)g(all)g(comm)n(unication)g(w)n(as)f(o) n(v)n(er)2025 5328 y(a)34 b(dedicated)h(A)-7 b(TM)35 b(\014b)r(er)f(pair.)57 b(This)35 b(graph)e(demonstrates)2025 5428 y(the)22 b(e\013ectiv)n(eness)g(of)g(NetPIPE)f(to)h(compare)e (totally)i(di\013eren)n(t)2025 5527 y(proto)r(cols.)p eop 5 4 bop -128 -173 a 15629760 10940832 3354869 31312117 27036303 47889121 startTexFig -128 -173 a 1 setlinejoin /M { moveto } bind def /S { show } bind def /R { rmoveto } bind def /L { lineto } bind def /B { newpath 0 0 M 0 1 L 1 1 L 1 0 L closepath } bind def /CS { closepath stroke } bind def /S { /fixwidth exch def dup length /nchars exch def dup stringwidth pop fixwidth exch sub nchars div exch 0 exch ashow } def /bwproc { rgbproc dup length 3 idiv string 0 3 0 5 -1 roll { add 2 1 roll 1 sub dup 0 eq { pop 3 idiv 3 -1 roll dup 4 -1 roll dup 3 1 roll 5 -1 roll put 1 add 3 0 } { 2 1 roll } ifelse } forall pop pop pop } def systemdict /colorimage known not { /colorimage { pop pop /rgbproc exch def { bwproc } image } def } if 1 1 scale 0 setlinewidth /drawtri { /y3 exch def /x3 exch def /y2 exch def /x2 exch def /y1 exch def /x1 exch def 0 setgray newpath x1 y1 moveto x2 y2 lineto x3 y3 lineto closepath stroke } bind def /filltri { /y3 exch def /x3 exch def /y2 exch def /x2 exch def /y1 exch def /x1 exch def newpath x1 y1 moveto x2 y2 lineto x3 y3 lineto closepath fill } bind def /cliptri { /y3 exch def /x3 exch def /y2 exch def /x2 exch def /y1 exch def /x1 exch def 0 setgray newpath x1 y1 moveto x2 y2 lineto x3 y3 lineto closepath clip } bind def /imgscanrgb { gsave translate /scandy exch def /scandx exch def /istr scandx 3 mul string def scandx scandy scale scandx scandy 8 [scandx 0 0 scandy neg 0 scandy] {currentfile istr readhexstring pop} false 3 colorimage grestore } bind def /imgscanbw { gsave translate /scandy exch def /scandx exch def /istr scandx string def scandx scandy scale scandx scandy 8 [scandx 0 0 scandy neg 0 scandy] {currentfile istr readhexstring pop} image grestore } bind def /showcaseisoencoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /minus /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /guilsinglright /fraction /florin /quotesingle /quotedblleft /guilsinglleft /fi /fl /endash /dagger /daggerdbl /bullet /quotesinglbase /quotedblbase /quotedblright /ellipsis /trademark /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /perthousand /ring /cedilla /Ydieresis /hungarumlaut /ogonek /caron /emdash /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] def /showcasedingbatencoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /a1 /a2 /a202 /a3 /a4 /a5 /a119 /a118 /a117 /a11 /a12 /a13 /a14 /a15 /a16 /a105 /a17 /a18 /a19 /a20 /a21 /a22 /a23 /a24 /a25 /a26 /a27 /a28 /a6 /a7 /a8 /a9 /a10 /a29 /a30 /a31 /a32 /a33 /a34 /a35 /a36 /a37 /a38 /a39 /a40 /a41 /a42 /a43 /a44 /a45 /a46 /a47 /a48 /a49 /a50 /a51 /a52 /a53 /a54 /a55 /a56 /a57 /a58 /a59 /a60 /a61 /a62 /a63 /a64 /a65 /a66 /a67 /a68 /a69 /a70 /a71 /a72 /a73 /a74 /a203 /a75 /a204 /a76 /a77 /a78 /a79 /a81 /a82 /a83 /a84 /a97 /a98 /a99 /a100 /.notdef /a205 /a85 /a206 /a86 /a87 /a88 /a89 /a90 /a91 /a92 /a93 /a94 /a95 /a96 /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /a101 /a102 /a103 /a104 /a106 /a107 /a108 /a112 /a111 /a110 /a109 /a120 /a121 /a122 /a123 /a124 /a125 /a126 /a127 /a128 /a129 /a130 /a131 /a132 /a133 /a134 /a135 /a136 /a137 /a138 /a139 /a140 /a141 /a142 /a143 /a144 /a145 /a146 /a147 /a148 /a149 /a150 /a151 /a152 /a153 /a154 /a155 /a156 /a157 /a158 /a159 /a160 /a161 /a163 /a164 /a196 /a165 /a192 /a166 /a167 /a168 /a169 /a170 /a171 /a172 /a173 /a162 /a174 /a175 /a176 /a177 /a178 /a179 /a193 /a180 /a199 /a181 /a200 /a182 /.notdef /a201 /a183 /a184 /a197 /a185 /a194 /a198 /a186 /a195 /a187 /a188 /a189 /a190 /a191 /.notdef ] def /Palatino-Bold findfont dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall /Encoding showcaseisoencoding def currentdict end /Palatino-Bold-SHOWISO exch definefont pop /newfont 10 dict def newfont begin /FontType 3 def /FontMatrix [1 0 0 1 0 0] def /FontBBox [0 0 1 1] def /Encoding 256 array def 0 1 255 {Encoding exch /.notdef put} for /CharProcs 1 dict def CharProcs begin /.notdef {} def end /BuildChar { 1 0 0 0 1 1 setcachedevice exch begin Encoding exch get CharProcs exch get end exec } def end /PatternFont newfont definefont pop gsave /saveit save def gsave gsave [360 0 0 252 51 476] concat B clip 0.002778 0.003968 scale -50 -50 translate /SCincsave save def /SCdictcount countdictstack def /SCopcount count 1 sub def userdict begin /showpage {} def 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath /gnudict 40 dict def gnudict begin /Color true def /Solid false def /gnulinewidth 5.000 def /plotlinewidth 20.000 def /vshift -40 def /dl {10 mul} def /hpt 31.5 def /vpt 31.5 def /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow { currentpoint stroke M 0 vshift R show } def /Rshow { currentpoint stroke M dup stringwidth pop neg vshift R show } def /Cshow { currentpoint stroke M dup stringwidth pop -2 div vshift R show } def /DL { Color {setrgbcolor Solid {pop []} if 0 setdash } {pop pop pop Solid {pop []} if 0 setdash} ifelse } def /BL { stroke gnulinewidth 2 mul setlinewidth } def /AL { stroke gnulinewidth 2 div setlinewidth } def /PL { stroke plotlinewidth setlinewidth } def /LTb { BL [] 0 0 0 DL } def /LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def /LT0 { PL [] 0 1 0 DL } def /LT1 { PL [4 dl 2 dl] 0 0 1 DL } def /LT2 { PL [2 dl 3 dl] 1 0 0 DL } def /LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def /LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def /LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def /LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def /LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def /LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def /P { stroke [] 0 setdash currentlinewidth 2 div sub M 0 currentlinewidth V stroke } def /D { stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke P } def /A { stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke P } def /C { stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke } def /T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke P } def /S { 2 copy A C} def end gnudict begin gsave 50 50 translate 0.050 0.050 scale 0 setgray /Helvetica findfont 120 scalefont setfont newpath LTa 720 301 M 6273 0 V LTb 720 301 M 63 0 V 6210 0 R -63 0 V 648 301 M (0) Rshow 720 1081 M 63 0 V 6210 0 R -63 0 V -6282 0 R (10) Rshow 720 1860 M 63 0 V 6210 0 R -63 0 V -6282 0 R (20) Rshow 720 2640 M 63 0 V 6210 0 R -63 0 V -6282 0 R (30) Rshow 720 3420 M 63 0 V 6210 0 R -63 0 V -6282 0 R (40) Rshow 720 4199 M 63 0 V 6210 0 R -63 0 V -6282 0 R (50) Rshow 720 4979 M 63 0 V 6210 0 R -63 0 V -6282 0 R (60) Rshow 720 301 M 0 63 V 0 4615 R 0 -63 V 720 181 M (1) Cshow 956 301 M 0 31 V 0 4647 R 0 -31 V 1268 301 M 0 31 V 0 4647 R 0 -31 V 1428 301 M 0 31 V 0 4647 R 0 -31 V 1504 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (10) Cshow 1740 301 M 0 31 V 0 4647 R 0 -31 V 2052 301 M 0 31 V 0 4647 R 0 -31 V 2212 301 M 0 31 V 0 4647 R 0 -31 V 2288 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (100) Cshow 2524 301 M 0 31 V 0 4647 R 0 -31 V 2836 301 M 0 31 V 0 4647 R 0 -31 V 2996 301 M 0 31 V 0 4647 R 0 -31 V 3072 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1000) Cshow 3308 301 M 0 31 V 0 4647 R 0 -31 V 3620 301 M 0 31 V 0 4647 R 0 -31 V 3781 301 M 0 31 V 0 4647 R 0 -31 V 3857 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (10000) Cshow 4093 301 M 0 31 V 0 4647 R 0 -31 V 4405 301 M 0 31 V 0 4647 R 0 -31 V 4565 301 M 0 31 V 0 4647 R 0 -31 V 4641 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (100000) Cshow 4877 301 M 0 31 V 0 4647 R 0 -31 V 5189 301 M 0 31 V 0 4647 R 0 -31 V 5349 301 M 0 31 V 0 4647 R 0 -31 V 5425 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1e+06) Cshow 5661 301 M 0 31 V 0 4647 R 0 -31 V 5973 301 M 0 31 V 0 4647 R 0 -31 V 6133 301 M 0 31 V 0 4647 R 0 -31 V 6209 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1e+07) Cshow 6445 301 M 0 31 V 0 4647 R 0 -31 V 6757 301 M 0 31 V 0 4647 R 0 -31 V 6917 301 M 0 31 V 0 4647 R 0 -31 V 6993 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1e+08) Cshow 720 301 M 6273 0 V 0 4678 V -6273 0 V 720 301 L 120 2640 M currentpoint gsave translate 90 rotate 0 0 M (Throughput in Mbps) Cshow grestore 3856 61 M (Block size in bits) Cshow LTb 6570 4796 M (Aligned Blocks) Rshow LT0 6642 4796 M 216 0 V -1 -575 R 0 -6 V 0 -50 V -98 28 V 0 -21 V 0 -23 V -138 42 V 0 -10 V 0 -56 V -98 1 V 0 17 V 0 12 V -138 2 V 0 -10 V 0 -2 V -98 0 V 0 -40 V 0 -7 V -138 42 V 0 -2 V 0 -6 V -98 85 V 0 -69 V 0 -36 V -138 -26 V 0 -24 V 0 -11 V -98 147 V 0 -34 V 0 19 V -138 -66 V 0 28 V 0 -31 V -98 -63 V 0 44 V 0 -76 V -138 -83 V 0 39 V 0 -47 V -98 142 V 0 48 V 0 -35 V 5205 3647 L 0 34 V 0 -2 V -98 438 V 0 53 V 0 5 V 4969 3773 L 0 59 V 0 2 V -98 -355 V 0 80 V 0 -2 V 4733 3045 L 0 86 V 0 -12 V -98 -400 V 0 9 V 0 -1 V 4497 2201 L 0 99 V 0 -4 V -98 -286 V 0 4 V 0 18 V 4261 1726 L 0 29 V -1 -4 V -97 -253 V 0 3 V -1 -1 V 4025 1181 L 0 1 V -1 88 V -97 -197 V 0 2 V -1 -3 V 3790 856 L -1 -2 V -1 -2 V 3692 734 L -1 -1 V -2 -2 V 3555 603 L -2 0 V -2 -2 V -94 -75 V -2 -1 V -3 -2 V 3320 455 L -4 -1 V -4 -2 V -88 -34 V -5 -2 V -6 -1 V 3088 382 L -8 -2 V -8 -2 V -79 -15 V -11 -1 V -10 -2 V 2860 344 L -16 -2 V -16 -2 V -61 -6 V -21 0 V -22 -2 V -85 -7 V -31 -2 V -33 -2 V -24 -1 V -41 -2 V -45 -2 V -34 -2 V -59 -2 V -70 -2 V -28 -1 V -138 -2 V -98 -2 V -138 -1 V -98 -1 V -138 -1 V -236 0 V LTb 6570 4676 M (Unaligned Blocks) Rshow LT1 6642 4676 M 216 0 V -1 -450 R 0 36 V 0 19 V -98 -95 V 0 -43 V 0 69 V -138 -77 V 0 -18 V 0 -41 V -98 100 V 0 -105 V 0 -69 V -138 58 V 0 48 V 0 -6 V -98 -2 V 0 -49 V 0 27 V -138 -14 V 0 -66 V 0 22 V -98 -55 V 0 208 V 0 -118 V -138 -26 V 0 -77 V 0 -13 V -98 32 V 0 23 V 0 10 V -138 48 V 0 -84 V 0 22 V -98 -59 V 0 19 V 0 -19 V 5441 3758 L 0 22 V 0 -86 V -98 98 V 0 4 V 0 4 V 5205 691 L 0 65 V 0 -65 V -98 3260 V 0 37 V 0 1 V 4969 3653 L 0 51 V 0 -12 V -98 -336 V 0 56 V 0 3 V 4733 2993 L 0 71 V 0 8 V -98 -396 V 4497 2251 L 0 90 V 0 -2 V -98 -201 V 0 -8 V 0 -1 V 4261 1722 L 0 -1 V -1 -1 V -97 -235 V 0 4 V -1 -1 V 4025 1184 L 0 -2 V -1 104 V -97 -205 V 0 3 V -1 -1 V 3790 861 L -1 -2 V -1 -2 V 3692 735 L -1 -1 V -2 -2 V 3555 603 L -2 0 V -2 -2 V -94 -76 V -2 -2 V -3 -1 V 3320 455 L -4 -1 V -4 -2 V -88 -35 V -5 -1 V -6 -2 V 3088 381 L -8 -2 V -8 -1 V -79 -15 V -11 -1 V -10 -2 V 2860 344 L -16 -2 V -16 -2 V -61 -6 V -21 0 V -22 -2 V -85 -7 V -31 -2 V -33 -2 V -24 -1 V -41 -2 V -45 -2 V -34 -2 V -59 -2 V -70 -2 V -28 -1 V -138 -2 V -98 -2 V -138 -1 V -98 -1 V -138 -1 V -236 0 V stroke grestore end showpage count SCopcount sub {pop} repeat countdictstack SCdictcount sub {end} repeat SCincsave restore grestore gsave 0 0 0 setrgbcolor 1.000000 setlinewidth newpath 309 499 M 303.75 499.75 L 300 502 L 297.75 505.75 L 297 511 L 297 511 L 297 511.524 L 297 512.872 L 297 514.989 L 297 517.82 L 297 521.311 L 297 525.405 L 297 530.049 L 297 535.187 L 297 540.765 L 297 546.728 L 297 553.019 L 297 559.586 L 297 566.372 L 297 573.323 L 297 580.384 L 297 587.5 L 297 594.616 L 297 601.677 L 297 608.628 L 297 615.414 L 297 621.981 L 297 628.272 L 297 634.235 L 297 639.812 L 297 644.951 L 297 649.595 L 297 653.689 L 297 657.18 L 297 660.011 L 297 662.128 L 297 663.476 L 297 664 L 297 664 L 297.75 669.25 L 300 673 L 303.75 675.25 L 309 676 L 309 676 L 311 676 L 313.98 676 L 315.98 676 L 316 676 L 316 676 L 321.25 675.25 L 325 673 L 327.25 669.25 L 328 664 L 328 664 L 328 663.476 L 328 662.128 L 328 660.011 L 328 657.18 L 328 653.689 L 328 649.595 L 328 644.951 L 328 639.812 L 328 634.235 L 328 628.272 L 328 621.981 L 328 615.414 L 328 608.628 L 328 601.677 L 328 594.616 L 328 587.5 L 328 580.384 L 328 573.323 L 328 566.372 L 328 559.586 L 328 553.019 L 328 546.728 L 328 540.765 L 328 535.187 L 328 530.049 L 328 525.405 L 328 521.311 L 328 517.82 L 328 514.989 L 328 512.872 L 328 511.524 L 328 511 L 328 511 L 327.25 505.75 L 325 502 L 321.25 499.75 L 316 499 L 316 499 L 313.392 499 L 310.016 499 L 309 499 L closepath stroke grestore gsave gsave matrix currentmatrix [1 0 0 1 91 582] concat newpath 0 0 M 0 48 L 195 48 L 195 0 L closepath setmatrix 0 0 0 setrgbcolor grestore newpath 89 580 M 89 632.294 L 288 632.294 L 288 580 L closepath clip newpath 0 0 0 setrgbcolor matrix currentmatrix [1 0 0 1 91 582] concat /Palatino-Bold-SHOWISO findfont 14 scalefont setfont 0 0 0 setrgbcolor 10 37.2941 M (Examined in Detail) 123.634 S 10 23.2941 M (in Figure 10) 75.446 S setmatrix grestore gsave 0 0 0 setrgbcolor gsave 0 setlinejoin 290.971 591.761 translate -13.8407 rotate 1.2 1.2 scale newpath 0 0 M -20 -5 L -20 5 L closepath fill grestore 2.000000 setlinewidth newpath 221 609 M 272.523 596.306 L stroke grestore grestore showpage saveit restore grestore endTexFig -150 1396 a Fi(Figure)36 b(9:)54 b(P)n(age)35 b(Aligned)i(vs.)63 b(Unaligned)37 b(T)-7 b(ransfer)35 b(Blo)r(c)n(k)-150 1495 y(Throughput)-67 1833 y(Often)22 b(a)g(programmer)e(uses)i(a)f (comm)n(unication)h(pac)n(k)-5 b(age)20 b(to)-150 1933 y(a)n(v)n(oid)i(w)n(orking)g(with)h(the)h(details)f(of)h(setting)f(up)h (connections.)-150 2033 y(While)g(ease)f(of)h(use)f(is)h(clearly)f (gained,)h(naiv)n(e)f(use)g(of)h(these)g(ex-)-150 2132 y(tra)32 b(proto)r(col)g(la)n(y)n(ers)f(adds)h(comm)n(unication)g(o)n (v)n(erhead,)g(th)n(us)-150 2232 y(reducing)k(the)g(net)n(w)n(ork)f (throughput.)63 b(This)37 b(proto)r(col)e(la)n(y)n(er)-150 2332 y(o)n(v)n(erhead)25 b(is)h(clearly)g(eviden)n(t)g(in)h(the)g (signature)f(graphs.)35 b(The)-150 2431 y(MPI)27 b(library)g(used)g(w)n (as)g(based)g(on)g(TCP)-7 b(,)28 b(but)g(clearly)e(an)i(ap-)-150 2531 y(plication)j(program)d(pa)n(ys)i(for)g(its)i(ease)d(of)i(use)g(b) n(y)g(sacri\014cing)-150 2630 y(latency)g(and)g(bandwidth.)48 b(This)31 b(sacri\014ce)f(drops)h(the)g(aggre-)-150 2730 y(gate)d(bandwidth)g(as)g(w)n(ell.)38 b(The)29 b(tradeo\013)e(of)i (ease)e(of)h(use)g(and)-150 2830 y(throughput)f(is)h(curren)n(tly)e(b)r (eing)i(in)n(v)n(estigated)e(for)h(TCP)g(and)-150 2929 y(A)-7 b(TM's)32 b(AAL5)h(application)e(programmers)f(in)n(terface.)49 b(Nev-)-150 3029 y(ertheless,)30 b(the)h(o)n(v)n(erhead)e(asso)r (ciated)g(with)i(a)f(proto)r(col)f(la)n(y)n(er)-150 3129 y(is)e(no)n(w)g(easy)g(to)h(visualize.)-67 3282 y(The)e(design)g(and)g (use)h(of)f(NetPIPE)f(has)h(rev)n(ealed)f(in)n(terest-)-150 3381 y(ing)41 b(net)n(w)n(ork)f(anomalies)g(and)h(tendencies.)78 b(In)41 b(particular,)-150 3481 y(NetPIPE)g(demonstrated)h(the)g (signi\014cance)g(of)g(data)g(blo)r(c)n(k)-150 3581 y(alignmen)n(t)c (to)g(page)f(b)r(oundaries.)68 b(This)38 b(data)g(is)g(sho)n(wn)g(in) -150 3680 y(the)43 b(signature)f(graphs)g(for)g(A)-7 b(TM)43 b(using)g(aligned)f(and)h(un-)-150 3780 y(aligned)29 b(data)h(in)g(Figure)f(9)g(P)n(age)f(aligned)i(data)f(blo)r(c)n(ks)g (yield)-150 3880 y(a)f(maxim)n(um)h(throughput)g(that)g(is)g(only)f (sligh)n(tly)g(in)h(creased.)-150 3979 y(Ho)n(w)n(ev)n(er,)22 b(note)g(the)h(large)e(plunge)h(in)h(p)r(erformance)e(using)h(un-)-150 4079 y(aligned)27 b(data.)-67 4232 y(NetPIPE)32 b(has)g(the)h(option)g (of)f(sp)r(ecifying)h(a)f(starting)g(and)-150 4332 y(ending)24 b(transfer)f(blo)r(c)n(k)h(size)g(and)g(the)h(incremen)n(t)e(v)-5 b(alue.)36 b(This)-150 4431 y(option)46 b(allo)n(ws)f(for)h(a)g(closer) f(examination)h(of)g(the)h(dip)g(in)-150 4531 y(p)r(erformance)39 b(due)g(to)h(unaligned)f(data.)73 b(Figure)39 b(10)f(sho)n(ws)-150 4631 y(throughput)25 b(plotted)g(v)n(ersus)f(transfer)g(blo)r(c)n(k)g (size.)36 b(There)24 b(are)-150 4730 y(three)g(distinct)i(regions)d(in) i(the)g(graph.)35 b(On)24 b(either)h(side)f(of)h(the)-150 4830 y(c)n(hasm,)j(the)h(blo)r(c)n(k)g(transfer)e(is)i(at)f(normal)g (sp)r(eed.)41 b(F)-7 b(or)28 b(blo)r(c)n(k)-150 4929 y(sizes)38 b(of)h(appro)n(ximately)e(59)g(K)i(b)n(ytes)f(to)g(72)g(K)h (b)n(ytes,)i(the)-150 5029 y(throughput)34 b(is)g(a)f(dismal)h(5)f (Mbps.)56 b(Also)34 b(note)g(the)g(c)n(haotic)-150 5129 y(transition)h(regions)g(b)r(et)n(w)n(een)h(the)g(t)n(w)n(o)g(p)r (erformance)f(lev)n(els.)-150 5228 y(The)46 b(single)g(data)g(p)r(oin)n (t)g(of)g(high)g(throughput)g(inside)h(the)-150 5328 y(c)n(hasm)34 b(is)h(at)g(a)f(blo)r(c)n(k)g(size)h(of)g(67.4)e(b)n (ytes.)58 b(The)35 b(reason)f(for)-150 5428 y(an)g(increase)e(in)i (throughput)g(for)f(that)i(single)e(measuremen)n(t)-150 5527 y(is)39 b(not)f(kno)n(wn,)j(and)d(the)i(cause)d(of)i(the)g(p)r (erformance)f(drop)2047 -173 y 15629760 10784529 3289088 3289088 26970521 19866091 startTexFig 2047 -173 a /gnudict 40 dict def gnudict begin /Color true def /Solid false def /gnulinewidth 5.000 def /plotlinewidth 15.000 def /vshift -40 def /dl {10 mul} def /hpt 31.5 def /vpt 31.5 def /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow { currentpoint stroke M 0 vshift R show } def /Rshow { currentpoint stroke M dup stringwidth pop neg vshift R show } def /Cshow { currentpoint stroke M dup stringwidth pop -2 div vshift R show } def /DL { Color {setrgbcolor Solid {pop []} if 0 setdash } {pop pop pop Solid {pop []} if 0 setdash} ifelse } def /BL { stroke gnulinewidth 2 mul setlinewidth } def /AL { stroke gnulinewidth 2 div setlinewidth } def /PL { stroke plotlinewidth setlinewidth } def /LTb { BL [] 0 0 0 DL } def /LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def /LT0 { PL [] 0 1 0 DL } def /LT1 { PL [4 dl 2 dl] 0 0 1 DL } def /LT2 { PL [2 dl 3 dl] 1 0 0 DL } def /LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def /LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def /LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def /LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def /LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def /LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def /P { stroke [] 0 setdash currentlinewidth 2 div sub M 0 currentlinewidth V stroke } def /D { stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke P } def /A { stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke P } def /C { stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke } def /T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke P } def /S { 2 copy A C} def end gnudict begin gsave 50 50 translate 0.050 0.050 scale 0 setgray /Helvetica findfont 120 scalefont setfont newpath LTa 720 301 M 6273 0 V LTb 720 301 M 63 0 V 6210 0 R -63 0 V 648 301 M (0) Rshow 720 769 M 63 0 V 6210 0 R -63 0 V 648 769 M (5) Rshow 720 1237 M 63 0 V 6210 0 R -63 0 V -6282 0 R (10) Rshow 720 1704 M 63 0 V 6210 0 R -63 0 V -6282 0 R (15) Rshow 720 2172 M 63 0 V 6210 0 R -63 0 V -6282 0 R (20) Rshow 720 2640 M 63 0 V 6210 0 R -63 0 V -6282 0 R (25) Rshow 720 3108 M 63 0 V 6210 0 R -63 0 V -6282 0 R (30) Rshow 720 3576 M 63 0 V 6210 0 R -63 0 V -6282 0 R (35) Rshow 720 4043 M 63 0 V 6210 0 R -63 0 V -6282 0 R (40) Rshow 720 4511 M 63 0 V 6210 0 R -63 0 V -6282 0 R (45) Rshow 720 4979 M 63 0 V 6210 0 R -63 0 V -6282 0 R (50) Rshow 837 301 M 0 63 V 0 4615 R 0 -63 V 837 181 M (400000) Cshow 3647 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (500000) Cshow 5943 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (600000) Cshow 720 301 M 6273 0 V 0 4678 V -6273 0 V 720 301 L 120 2640 M currentpoint gsave translate 90 rotate 0 0 M (Throughput in Mbps) Cshow grestore 3856 61 M (Block size in bits) Cshow LTb 6570 4796 M (ATM) Rshow LT0 6642 4796 M 216 0 V 135 -548 R -2 3 V -3 16 V -2 -14 V -3 11 V -2 7 V -3 -12 V -2 0 V -3 1 V -2 -3 V -3 1 V -2 18 V -3 5 V -2 8 V -3 7 V -2 -5 V -3 -13 V -2 -2 V -3 3 V -2 25 V -3 -30 V -2 1 V -2 16 V -3 -22 V -2 -4 V -3 15 V -2 -4 V -3 7 V -2 -15 V -3 1 V -2 0 V -3 35 V -2 -10 V -3 -41 V -2 20 V -3 5 V -2 0 V -3 -19 V -2 17 V -3 17 V -2 -33 V -3 12 V -2 1 V -3 -9 V -2 -3 V -3 2 V -2 2 V -3 19 V -2 -19 V -3 0 V -2 -16 V -3 27 V -2 -9 V -3 2 V -2 -6 V -3 26 V -2 -14 V -3 3 V -2 -2 V -3 -13 V -2 -5 V -3 17 V -2 -1 V -3 6 V -2 4 V -3 -27 V -2 -7 V -3 15 V -2 8 V -3 -12 V -2 11 V -3 4 V -2 -20 V -3 -1 V -2 9 V -3 0 V -2 6 V -3 19 V -2 -17 V -3 -16 V -2 8 V -3 -14 V -2 6 V -3 1 V -2 8 V -3 2 V -2 -17 V -3 5 V -2 23 V -3 -19 V -2 12 V -3 -10 V -2 0 V -3 11 V -2 -20 V -3 6 V -3 12 V -2 -17 V -3 8 V -2 11 V -3 1 V -2 -5 V -3 -4 V -2 5 V -3 0 V -2 -5 V -3 -8 V -2 7 V -3 17 V -2 -34 V -3 39 V -2 -26 V -3 10 V -2 -3 V -3 4 V -2 -14 V -3 2 V -3 1 V -2 -4 V -3 14 V -2 -19 V -3 3 V -2 -5 V -3 24 V -2 -13 V -3 -3 V -2 5 V -3 -8 V -2 10 V -3 5 V -2 -13 V -3 -12 V -3 4 V -2 19 V -3 -8 V -2 8 V -3 -19 V -2 7 V -3 -2 V -2 -2 V -3 13 V -2 -21 V -3 14 V -2 -18 V -3 -3 V -3 6 V -2 1 V -3 0 V -2 13 V -3 -7 V -2 -2 V -3 8 V -2 -9 V -3 3 V -2 3 V -3 5 V -3 -2 V -2 -7 V -3 2 V -2 11 V -3 -7 V -2 1 V -3 -6 V -2 14 V -3 2 V -3 -9 V -2 0 V -3 -15 V -2 24 V -3 -25 V -2 7 V -3 -6 V -2 8 V -3 -8 V -3 1 V -2 5 V -3 8 V -2 -14 V -3 13 V -2 -9 V -3 1 V -2 -9 V -3 1 V -3 4 V -2 5 V -3 -8 V -2 -2 V -3 12 V -2 1 V -3 -12 V -3 2 V -2 -1 V -3 -10 V -2 5 V -3 1 V -2 -1 V -3 -1 V -3 5 V -2 -4 V -3 12 V -2 -13 V -3 -7 V -2 5 V -3 -5 V -3 2 V -2 -11 V -3 2 V -2 12 V -3 -8 V -2 11 V -3 -8 V -3 4 V -2 -16 V -3 0 V -2 5 V -3 1 V -3 -2 V -2 15 V -3 -21 V -2 2 V -3 12 V -2 -9 V -3 3 V -3 3 V -2 4 V -3 -8 V -2 6 V -3 2 V -3 -2 V -2 32 V -3 -1 V -2 1 V -3 -12 V -2 9 V -3 -10 V -3 13 V -2 -11 V -3 2 V -2 -17 V -3 -6 V -3 19 V -2 -2 V -3 -6 V -2 -10 V -3 9 V -3 7 V -2 -14 V -3 13 V -2 3 V -3 -12 V -3 8 V -2 1 V -3 34 V -2 -38 V -3 20 V -3 -18 V -2 5 V -3 15 V -2 -18 V -3 16 V -3 5 V -2 -13 V -3 -3 V -2 8 V -3 -16 V -3 11 V -2 216 V -3 -3198 V -2 -256 V -3 291 V -3 -134 V -2 375 V -3 -174 V -2 -135 V -3 -161 V -3 0 V -2 -14 V -3 528 V -3 -459 V -2 165 V -3 28 V -2 -22 V -3 -264 V -3 198 V -2 -161 V -3 55 V -2 164 V -3 18 V -3 229 V -2 -207 V -3 -151 V -3 52 V -2 -303 V -3 251 V -2 0 V -3 36 V -3 183 V -2 76 V -3 -390 V -3 313 V -2 -219 V -3 24 V -2 57 V -3 -82 V -3 36 V -2 259 V -3 -441 V -3 227 V -2 -254 V -3 281 V -2 40 V -3 -91 V -3 77 V -2 160 V -3 -319 V -3 105 V -2 -319 V -3 143 V -3 312 V -2 -183 V -3 204 V -2 -131 V -3 39 V -3 -98 V -2 -74 V -3 105 V -3 -137 V -2 164 V -3 74 V -3 -133 V -2 -179 V -3 208 V -3 -271 V -2 409 V -3 -182 V -2 211 V -3 -271 V -3 73 V -2 -226 V -3 226 V -3 -159 V -2 356 V -3 -370 V -3 475 V -2 -245 V -3 40 V -3 -149 V -2 50 V -3 -240 V -3 484 V -2 -387 V -3 385 V -3 -347 V -2 860 V -3 -829 V -2 104 V -3 -257 V -3 257 V -2 -137 V -3 205 V -3 -154 V -2 295 V -3 -436 V -3 225 V -2 -135 V -3 168 V -3 -284 V -2 319 V -3 -153 V -3 257 V -2 -234 V -3 -22 V -3 52 V -2 -95 V -3 80 V -3 218 V -2 -219 V -3 180 V -3 -216 V -2 49 V -3 -177 V -3 41 V -2 40 V -3 388 V -3 -451 V -2 159 V -3 -73 V -3 103 V -2 -326 V -3 326 V -3 -255 V -2 231 V -3 76 V -3 157 V -3 -313 V -2 103 V -3 -188 V -3 -1 V currentpoint stroke M -2 -61 V -3 294 V -3 221 V -2 -199 V -3 -240 V -3 383 V -2 -345 V -3 166 V -3 -329 V -2 788 V -3 -515 V -3 56 V -2 -257 V -3 191 V -3 -27 V -3 -130 V -2 121 V -3 559 V -3 -536 V -2 255 V -3 -398 V -3 0 V -2 -36 V -3 221 V -3 -221 V -2 191 V -3 -13 V -3 215 V -3 -230 V -2 -113 V -3 305 V -3 -132 V -2 30 V -3 -113 V -3 1 V -2 47 V -3 2 V -3 -136 V -3 33 V -2 231 V -3 -99 V -3 -143 V -2 119 V -3 232 V -3 -414 V -2 205 V -3 -222 V -3 221 V -3 -185 V -2 15 V -3 303 V -3 76 V -2 -463 V -3 386 V -3 -164 V -3 -155 V -2 -60 V -3 377 V -3 -131 V -2 -186 V -3 53 V -3 165 V -3 -355 V -2 347 V -3 1 V -3 17 V -2 275 V -3 -349 V -3 -141 V -3 378 V -2 -428 V -3 220 V -3 -159 V -2 526 V -3 -462 V -3 351 V -3 -442 V -2 71 V -3 211 V -3 -161 V -3 270 V -2 -286 V -3 0 V -3 49 V -2 -155 V -3 15 V -3 301 V -3 -133 V -2 -123 V -3 123 V -3 -395 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -2 -1 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 87 V -3 -87 V -2 -1 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 -1 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 -1 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 -1 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 -1 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -2 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 -1 V -2 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 -1 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -2 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -2 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -2 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -2 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 82 V -3 0 V -3 -83 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 -1 V -3 199 V -3 -128 V -3 -71 V -3 82 V -3 -82 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 12 V -3 3487 V 4903 794 L -2 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V currentpoint stroke M -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -2 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -2 -1 V -3 0 V -3 0 V -3 0 V -3 1 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 4 V -3 -4 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 78 V -3 -78 V -3 0 V -3 -1 V -4 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 203 V -3 -203 V -3 0 V -4 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 1 V -3 -1 V -3 0 V -3 0 V -4 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -4 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -4 0 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -3 0 V -4 -1 V -3 0 V -3 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 -1 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -4 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -3 -1 V -4 0 V -3 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 -1 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 -1 V currentpoint stroke M -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 -1 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 -1 V -4 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -4 -1 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -4 -1 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -4 0 V -3 -1 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 -1 V -4 0 V -3 0 V -3 0 V -3 5 V -4 -5 V -3 0 V -3 0 V -4 -1 V -3 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 -1 V -3 0 V -4 0 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -3 0 V -4 -1 V -3 0 V -3 0 V -4 0 V -3 0 V -3 0 V -4 72 V -3 -72 V -3 0 V -3 -1 V -4 73 V -3 -73 V -3 0 V -4 0 V -3 0 V -3 3539 V -4 18 V -3 -3 V -3 -119 V -4 65 V -3 49 V -3 -236 V -4 -9 V -3 248 V -3 -6 V -3 -269 V -4 276 V -3 -7 V -3 4 V -4 -4 V -3 -405 V -3 406 V -4 -312 V -3 272 V -3 -284 V -4 123 V -3 -35 V -3 193 V -4 43 V -3 -161 V -3 97 V -4 -340 V -3 150 V -3 259 V -4 -204 V -3 -130 V -3 197 V -4 -69 V -3 199 V -3 0 V -4 -3 V -3 -522 V -3 524 V -4 -128 V -3 129 V -3 -246 V -4 241 V -3 -351 V -3 343 V -4 10 V -3 -45 V -4 -231 V -3 88 V -3 192 V -4 -294 V -3 20 V -3 260 V -4 -299 V -3 292 V -3 10 V -4 -2 V -3 7 V -3 -3 V -4 -2 V -3 -303 V -3 305 V -4 -214 V -3 139 V -4 81 V -3 -165 V -3 155 V -4 -399 V -3 400 V -3 -284 V -4 77 V -3 214 V -4 5 V -3 -7 V -3 -55 V -4 -7 V -3 -567 V -3 481 V -4 -217 V -3 78 V -4 -386 V -3 666 V -3 -4 V -4 -158 V -3 165 V -3 0 V -4 0 V -3 -345 V -4 345 V -3 -1 V -3 -219 V -4 -223 V -3 432 V -4 1 V -3 -922 V -3 654 V -4 269 V -3 9 V -4 -722 V -3 720 V -3 -373 V -4 -9 V -3 381 V -4 -781 V -3 750 V -3 -485 V -4 519 V -3 -490 V -4 493 V -3 -915 V -3 749 V -4 -547 V -3 705 V -4 -19 V -3 -435 V -3 -630 V -4 646 V -3 -100 V -4 536 V -3 -1 V -3 -3 V -4 -793 V -3 278 V -4 513 V -3 -1049 V -4 63 V -3 47 V -3 948 V -4 -4 V -3 -296 V -4 250 V -3 -728 V -4 603 V -3 -331 V -3 177 V -4 -339 V -3 158 V -4 220 V -3 -193 V -4 430 V -3 -304 V -3 18 V -4 -377 V -3 227 V -4 438 V -3 8 V -4 -3 V -3 -476 V -3 -332 V -4 455 V -3 -372 V -4 -129 V -3 190 V -4 214 V -3 438 V -4 -316 V -3 326 V -4 0 V -3 -410 V -3 104 V -4 -408 V -3 711 V -4 -445 V -3 444 V -4 -657 V -3 85 V -4 -197 V -3 768 V -4 -758 V -3 -132 V -3 421 V -4 -361 V -3 829 V -4 -632 V -3 493 V -4 69 V -3 -480 V -4 99 V -3 222 V -4 16 V -3 -346 V -4 564 V -3 -537 V -4 207 V -3 -76 V -4 -326 V -3 591 V -3 -556 V -4 217 V -3 366 V -4 114 V -3 -264 V -4 -135 V -3 119 V -4 -272 V -3 293 V -4 20 V -3 -435 V -4 139 V -3 -168 V -4 81 V -3 13 V -4 320 V -3 -352 V -4 386 V -3 65 V -4 -351 V -3 -237 V -4 253 V -3 149 V -4 116 V -3 39 V -4 78 V -3 -149 V -4 179 V -3 -520 V -4 0 V -3 455 V -4 -823 V -3 888 V -4 -367 V -3 -88 V -4 1158 V -3 22 V -4 14 V -3 -9 V -4 -5 V -3 14 V -4 -1 V -3 -24 V -4 4 V -3 -3 V -4 2 V -4 -2 V -3 9 V -4 -6 V -3 -2 V -4 6 V -3 -1 V -4 -6 V -3 9 V -4 -4 V -3 0 V -4 -2 V -3 5 V -4 3 V -3 -10 V -4 0 V -4 4 V -3 -9 V -4 20 V -3 2 V -4 -12 V -3 7 V -4 -8 V -3 5 V -4 -7 V -3 8 V -4 5 V -4 -10 V -3 4 V -4 3 V -3 -4 V -4 5 V -3 -5 V -4 6 V -3 -3 V -4 2 V -4 -3 V -3 -4 V -4 -2 V -3 2 V -4 -2 V -3 3 V -4 -10 V -3 10 V -4 5 V -4 -10 V -3 6 V -4 -2 V -3 -7 V -4 0 V -3 6 V -4 -7 V -4 -2 V -3 10 V -4 -2 V -3 -10 V -4 4 V -3 -3 V -4 5 V -4 -3 V -3 10 V -4 -6 V -3 2 V -4 -2 V -4 -3 V -3 5 V -4 -8 V -3 1 V -4 1 V -4 -6 V -3 1 V -4 19 V -3 -20 V -4 3 V -3 1 V -4 -3 V -4 1 V currentpoint stroke M -3 1 V -4 -2 V -3 -4 V -4 2 V -4 5 V -3 -4 V -4 -2 V -4 2 V -3 6 V -4 -9 V -3 5 V -4 5 V -4 -8 V -3 0 V -4 1 V -3 -9 V -4 -3 V -4 13 V -3 -9 V -4 0 V -4 8 V -3 -1 V -4 -6 V -3 6 V -4 -14 V -4 11 V -3 -7 V -4 1 V -4 -11 V -3 19 V -4 -17 V -3 9 V -4 -10 V -4 -3 V -3 10 V -4 -5 V -4 -3 V -3 9 V -4 -14 V -4 1 V -3 8 V -4 -1 V -3 8 V -4 -10 V -4 3 V -3 -1 V -4 10 V -4 -15 V -3 18 V -4 -19 V -4 -8 V -3 13 V -4 -13 V -4 -3 V -3 10 V -4 -8 V -4 8 V -3 -10 V -4 15 V -4 -8 V -3 6 V -4 -5 V -4 -2 V -3 -3 V -4 2 V -4 -7 V -3 -4 V -4 10 V -4 -14 V -3 13 V -4 -6 V -4 -1 V -3 -11 V -4 3 V -4 -3 V -3 1 V -4 6 V -4 0 V -3 -4 V -4 -9 V -4 1 V -3 3 V -4 -4 V -4 -5 V -3 11 V -4 -4 V -4 -3 V -4 8 V -3 -1 V -4 2 V -4 -10 V -3 3 V -4 4 V -4 -2 V -3 3 V -4 -4 V -4 -3 V -4 10 V -3 -8 V -4 -3 V -4 4 V -3 -7 V -4 7 V -4 -5 V -3 11 V -4 -12 V -4 -2 V -4 7 V -3 1 V -4 -5 V -4 0 V -3 -7 V -4 9 V -4 -16 V -4 6 V -3 11 V -4 -7 V -4 -6 V -4 5 V -3 -10 V -4 -4 V -4 1 V -3 1 V -4 0 V -4 0 V -4 -4 V -3 4 V -4 -3 V -4 0 V -4 3 V -3 -4 V -4 7 V -4 -11 V -4 12 V -3 -11 V -4 10 V -4 -17 V -4 13 V -3 -4 V -4 -16 V -4 3 V -4 -8 V -3 4 V -4 -7 V -4 -2 V -4 -6 V -3 19 V -4 -11 V -4 7 V -4 1 V -3 3 V -4 -2 V -4 -12 V -4 13 V -3 -5 V -4 5 V -4 2 V -4 -4 V -3 -5 V -4 3 V -4 0 V -4 -1 V -4 8 V -3 3 V -4 -2 V -4 5 V -4 -3 V -3 20 V -4 -2 V -4 2 V -4 4 V -4 1 V -3 -1 V -4 3 V -4 -12 V -4 8 V -4 -11 V -3 4 V -4 -3 V -4 -6 V -4 -3 V -4 9 V -3 5 V -4 -9 V -4 -8 V -4 4 V -4 -3 V -3 8 V -4 -13 V -4 -1 V -4 5 V -4 -3 V -3 -2 V -4 0 V -4 -3 V -4 3 V -4 8 V -3 4 V -4 -2 V -4 1 V -4 2 V -4 -6 V -4 -5 V -3 9 V -4 7 V -4 -12 V -4 -4 V -4 9 V -3 -8 V -4 9 V -4 -5 V -4 -10 V -4 10 V -4 -1 V -3 -3 V -4 -1 V -4 8 V -4 -2 V -4 -4 V -4 -6 V -4 14 V -3 -9 V -4 1 V -4 1 V -4 -13 V -4 7 V -4 0 V -3 0 V -4 -6 V -4 -2 V -4 4 V -4 4 V -4 -10 V -4 8 V -3 -2 V -4 -7 V -4 11 V -4 -3 V -4 -9 V -4 -1 V -4 3 V -3 7 V -4 -11 V -4 6 V -4 -13 V -4 7 V -4 -1 V -4 18 V -4 -12 V -3 7 V -4 -12 V -4 1 V -4 9 V -4 -2 V -4 -17 V -4 -1 V -4 -1 V -4 1 V -3 1 V -4 4 V -4 4 V -4 -3 V -4 9 V -4 -19 V -4 17 V -4 -1 V -4 3 V -3 -9 V -4 2 V -4 -11 V -4 18 V -4 -14 V -4 5 V -4 10 V -4 -9 V -4 0 V -4 5 V -3 -1 V -4 -14 V -4 1 V -4 6 V -4 8 V -4 -12 V -4 0 V -4 2 V -4 -14 V -4 14 V -4 -11 V -4 -6 V -3 18 V -4 1 V -4 -1 V -4 7 V -4 -24 V -4 11 V -4 -3 V -4 0 V -4 -9 V -4 7 V -4 -8 V -4 12 V -4 -3 V -4 -1 V -4 -10 V -4 8 V -3 -8 V -4 2 V -4 7 V -4 -9 V -4 -5 V -4 2 V -4 9 V -4 -16 V -4 8 V -4 6 V -4 -6 V -4 -1 V -4 -6 V -4 10 V -4 10 V -4 -16 V -4 -5 V -4 15 V -4 -8 V -4 -4 V -4 5 V -4 -3 V -4 -1 V -4 -10 V -4 2 V -3 11 V -4 -9 V -4 2 V -4 -8 V -4 -2 V -4 4 V -4 10 V -4 -7 V -4 2 V -4 -7 V -4 7 V -4 6 V -4 -18 V -4 13 V -4 9 V -4 -15 V -4 8 V -4 -2 V -4 -2 V -4 -5 V -4 -3 V -4 5 V -4 -1 V -4 10 V -4 -11 V -4 -6 V -4 12 V -4 -7 V -4 8 V -4 -14 V -4 5 V -4 3 V -4 -1 V -4 0 V -4 -5 V -4 2 V -4 12 V -4 -17 V -4 10 V -5 -11 V -4 14 V -4 -14 V -4 4 V -4 -2 V -4 -3 V -4 -3 V -4 4 V -4 -4 V -4 6 V -4 -5 V -4 6 V -4 -8 V -4 -4 V -4 11 V -4 -9 V -4 4 V -4 -3 V -4 -3 V -4 4 V -4 -1 V -4 -7 V -4 0 V -4 5 V -5 3 V -4 -20 V -4 0 V -4 -1 V -4 -13 V -4 9 V -4 -1 V currentpoint stroke M -4 0 V -4 3 V stroke grestore end showpage endTexFig 2025 1376 a Fi(Figure)27 b(10:)36 b(A)28 b(Detailed)g(Examination)e (of)h(the)h(A)-7 b(TM)28 b(P)n(erfor-)2025 1476 y(mance)f(Dip)2025 1748 y(has)34 b(not)h(b)r(een)g(fully)g(in)n(v)n(estigated)e(at)i(this) g(time.)58 b(Ho)n(w)n(ev)n(er,)2025 1848 y(the)28 b(p)r(erformance)f (plunge)g(do)r(es)h(app)r(ear)f(to)g(b)r(e)h(link)n(ed)g(to)g(the)2025 1948 y(TCP)g(so)r(c)n(k)n(et)g(bu\013er)h(size.)39 b(Changing)28 b(the)h(so)r(c)n(k)n(et)f(bu\013er)g(size)2025 2047 y(mo)n(v)n(es)33 b(the)i(dip)g(to)f(a)g(di\013eren)n(t)h(p)r(ortion)f(of)g(the)h(graph,) g(and)2025 2147 y(aligning)24 b(the)i(data)f(to)h(page)e(b)r(oundaries) h(e\013ectiv)n(ely)g(remo)n(v)n(es)2025 2247 y(it.)77 b(Other)41 b(studies)g([4)o(,)h(5)o(])f(ha)n(v)n(e)f(missed)h(the)g(p)r (erformance)2025 2346 y(c)n(hasm)33 b(b)n(y)g(not)g(ev)-5 b(aluating)33 b(enough)g(data)g(p)r(oin)n(ts)g(or)g(alw)n(a)n(ys)2025 2446 y(using)27 b(page)g(aligned)g(data.)2108 2599 y(Another)j(graph)e (of)i(in)n(terest)f(is)h(the)g(comparison)e(of)i(FDDI)2025 2699 y(blo)r(c)n(k)19 b(transfer)f(on)h(di\013eren)n(t)h(arc)n (hitectures.)32 b(Figure)19 b(11)f(sho)n(ws)2025 2798 y(the)33 b(signature)e(graphs)g(for)h(transfer)g(b)r(et)n(w)n(een)h(t)n (w)n(o)e(iden)n(tical)2025 2898 y(DEC)g(3000)e(w)n(orkstations)g(in)i (comparison)f(to)h(the)g(SGI)h(data)2025 2998 y(previously)19 b(sho)n(wn.)33 b(In)21 b(b)r(oth)f(cases,)g(the)h(transfer)e(blo)r(c)n (ks)g(w)n(ere)2025 3097 y(aligned)29 b(to)h(page)f(b)r(oundaries.)43 b(There)30 b(are)f(three)g(di\013erences)2025 3197 y(that)c(are)g(imp)r (ortan)n(t)f(to)h(observ)n(e:)34 b(1\))25 b(The)h(DEC)f(FDDI)h(has)e(a) 2025 3296 y(p)r(erformance)18 b(dip)i(similar)e(to)h(the)g(A)-7 b(TM)20 b(data,)g(2\))f(The)g(latency)2025 3396 y(for)g(the)g(DEC)g(w)n (orkstations)e(is)j(smaller,)g(and)f(3\))g(Regardless)e(of)2025 3496 y(the)k(lo)n(w)n(er)d(latency)-7 b(,)22 b(the)e(maxim)n(um)g (throughput)g(for)g(the)g(DEC)2025 3595 y(mac)n(hines)39 b(is)h(m)n(uc)n(h)f(less)g(than)h(that)g(attained)f(b)n(y)h(the)g(SGI) 2025 3695 y(w)n(orkstations.)33 b(V)-7 b(endor)24 b(defaults)g(w)n(ere) e(used)i(throughout)f(the)2025 3795 y(exp)r(erimen)n(ts.)66 b(There)37 b(ma)n(y)f(b)r(e)i(some)f(in)n(ternal)g(parameters)2025 3894 y(that)30 b(can)f(b)r(e)i(adjusted)f(for)f(the)h(DEC)g(mac)n (hines)f(to)g(impro)n(v)n(e)2025 3994 y(their)f(o)n(v)n(erall)d(p)r (erformance.)2025 4338 y Ff(5)135 b(Conclusions)2025 4577 y Fi(NetPIPE)31 b(readily)h(pro)n(vides)f(the)i(information)f (necessary)e(to)2025 4677 y(answ)n(er)e(the)h(questions)g(p)r(osed)g (at)g(the)g(b)r(eginning)g(of)g(this)h(pa-)2025 4776 y(p)r(er.)48 b(Also,)32 b(there)f(are)f(v)-5 b(arious)30 b(other)h(questions)f(concerning)2025 4876 y(net)n(w)n(ork)38 b(p)r(erformance)g(whic)n(h)h(can)g(b)r(e)h(answ)n(ered)e(b)n(y)h (care-)2025 4975 y(ful)29 b(examination)f(and)h(in)n(terpretation)f(of) g(the)i(signature)d(and)2025 5075 y(saturation)f(graphs)h(generated)f (b)n(y)h(NetPIPE.)2108 5228 y(NetPIPE)i(encapsulates)h(the)g(b)r(est)h (of)f Fh(ttcp)f Fi(and)h Fh(netperf)2025 5328 y Fi(and)39 b(giv)n(es)g(a)g(visualization)f(of)i(the)g(net)n(w)n(ork)e(p)r (erformance.)2025 5428 y(Most)g(imp)r(ortan)n(tly)f(NetPIPE)h(is)g (clearly)f(a)g(proto)r(col)g(inde-)2025 5527 y(p)r(enden)n(t)30 b(p)r(erformance)f(to)r(ol.)43 b(It)31 b(is)e(v)-5 b(aluable)30 b(when)g(compar-)p eop 6 5 bop -128 -173 a 15629760 10784529 3289088 3289088 26970521 19866091 startTexFig -128 -173 a /gnudict 40 dict def gnudict begin /Color true def /Solid false def /gnulinewidth 5.000 def /plotlinewidth 15.000 def /vshift -40 def /dl {10 mul} def /hpt 31.5 def /vpt 31.5 def /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow { currentpoint stroke M 0 vshift R show } def /Rshow { currentpoint stroke M dup stringwidth pop neg vshift R show } def /Cshow { currentpoint stroke M dup stringwidth pop -2 div vshift R show } def /DL { Color {setrgbcolor Solid {pop []} if 0 setdash } {pop pop pop Solid {pop []} if 0 setdash} ifelse } def /BL { stroke gnulinewidth 2 mul setlinewidth } def /AL { stroke gnulinewidth 2 div setlinewidth } def /PL { stroke plotlinewidth setlinewidth } def /LTb { BL [] 0 0 0 DL } def /LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def /LT0 { PL [] 0 1 0 DL } def /LT1 { PL [4 dl 2 dl] 0 0 1 DL } def /LT2 { PL [2 dl 3 dl] 1 0 0 DL } def /LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def /LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def /LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def /LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def /LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def /LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def /P { stroke [] 0 setdash currentlinewidth 2 div sub M 0 currentlinewidth V stroke } def /D { stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke P } def /A { stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke P } def /C { stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke } def /T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke P } def /S { 2 copy A C} def end gnudict begin gsave 50 50 translate 0.050 0.050 scale 0 setgray /Helvetica findfont 120 scalefont setfont newpath LTa 720 301 M 6273 0 V LTb 720 301 M 63 0 V 6210 0 R -63 0 V 648 301 M (0) Rshow 720 969 M 63 0 V 6210 0 R -63 0 V 648 969 M (10) Rshow 720 1638 M 63 0 V 6210 0 R -63 0 V -6282 0 R (20) Rshow 720 2306 M 63 0 V 6210 0 R -63 0 V -6282 0 R (30) Rshow 720 2974 M 63 0 V 6210 0 R -63 0 V -6282 0 R (40) Rshow 720 3642 M 63 0 V 6210 0 R -63 0 V -6282 0 R (50) Rshow 720 4311 M 63 0 V 6210 0 R -63 0 V -6282 0 R (60) Rshow 720 4979 M 63 0 V 6210 0 R -63 0 V -6282 0 R (70) Rshow 720 301 M 0 63 V 0 4615 R 0 -63 V 720 181 M (0.0001) Cshow 1098 301 M 0 31 V 0 4647 R 0 -31 V 1597 301 M 0 31 V 0 4647 R 0 -31 V 1853 301 M 0 31 V 0 4647 R 0 -31 V 1975 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.001) Cshow 2352 301 M 0 31 V 0 4647 R 0 -31 V 2852 301 M 0 31 V 0 4647 R 0 -31 V 3108 301 M 0 31 V 0 4647 R 0 -31 V 3229 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.01) Cshow 3607 301 M 0 31 V 0 4647 R 0 -31 V 4106 301 M 0 31 V 0 4647 R 0 -31 V 4362 301 M 0 31 V 0 4647 R 0 -31 V 4484 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.1) Cshow 4861 301 M 0 31 V 0 4647 R 0 -31 V 5361 301 M 0 31 V 0 4647 R 0 -31 V 5617 301 M 0 31 V 0 4647 R 0 -31 V 5738 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1) Cshow 6116 301 M 0 31 V 0 4647 R 0 -31 V 6615 301 M 0 31 V 0 4647 R 0 -31 V 6871 301 M 0 31 V 0 4647 R 0 -31 V 6993 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (10) Cshow 720 301 M 6273 0 V 0 4678 V -6273 0 V 720 301 L 120 2640 M currentpoint gsave translate 90 rotate 0 0 M (Throughput in Mbps) Cshow grestore 3856 61 M (Time) Cshow LTb 6570 4796 M (SGI) Rshow LT0 6642 4796 M 216 0 V -941 127 R 0 -1 V 1 -9 V -222 15 V 4 -36 V -160 29 V -1 2 V 2 -14 V -220 -4 V -1 8 V 2 -18 V -157 -3 V -3 25 V 3 -21 V -222 12 V 1 -15 V 2 -16 V -155 -11 V -3 20 V 4 -26 V -221 -2 V -2 19 V 7 -62 V -157 2 V -2 18 V 3 -26 V -216 -39 V 2 -15 V 11 -90 V -165 61 V -3 28 V 30 -240 V -235 110 V 1 -7 V 10 -80 V -156 -5 V -1 7 V 18 -136 V -209 -89 V -8 58 V 111 -751 V -237 531 V -7 46 V 33 -230 V -207 -90 V -11 75 V 3429 2616 L 3032 3903 L -2 12 V 10 -66 V 2900 3356 L -3 21 V 15 -88 V 2792 3099 L -8 41 V 11 -58 V -99 -558 V -16 67 V 2 -8 V -99 -232 V -12 47 V 13 -50 V -76 -476 V -27 79 V 6 -21 V -93 -179 V -2 6 V -16 44 V -64 -374 V -32 66 V 49 -102 V -62 -173 V -2 2 V 1 -3 V -87 -197 V 0 -1 V -49 66 V 2095 930 L 0 -1 V 0 -2 V 2033 771 L -4 2 V 6 -6 V -60 -73 V 0 -1 V -1 -2 V 1956 573 L -2 -1 V 1 -2 V -16 -58 V -2 -1 V 0 -2 V -13 -63 V -1 -1 V 0 -2 V -6 -32 V -1 -1 V 1 -2 V -5 -32 V 0 -2 V 0 -2 V -5 -14 V 0 -2 V 0 -1 V -1 -15 V -1 -2 V 1 -2 V -4 -5 V -2 -2 V 1 -2 V -25 -5 V -9 -1 V 5 -2 V -4 -1 V -52 -1 V -1 -2 V -2 -1 V 0 -2 V 0 -2 V 0 -1 V -1 -3 V 0 -1 V -1 -1 V -1 -1 V 0 -1 V -1 0 V LTb 6570 4676 M (DEC) Rshow LT1 6642 4676 M 216 0 V 5769 3334 M -1 4 V -1 6 V -216 -29 V -4 24 V -156 -3 V 1 -5 V -219 -14 V 9 -46 V -6 31 V -145 -66 V -12 71 V -4 17 V -221 4 V 1 -8 V 3 -13 V -158 5 V 2 -9 V -3 12 V -218 -16 V 2 -10 V 34 -178 V -194 196 V -1 3 V 2 -9 V -229 48 V 5 -32 V 1 -4 V -147 -55 V -14 79 V 0 3 V -217 -26 V 4 -22 V -11 62 V 19 -840 V -159 750 V 24 -128 V -210 -59 V -19 100 V -7 34 V 3193 2978 L -10 50 V 11 -52 V -218 -15 V 4 -21 V -7 34 V -86 -325 V -9 38 V -17 76 V 4397 399 L -1 0 V 2643 2139 L -5 15 V 12 -40 V 2541 1779 L -126 382 V 9 -31 V -77 -246 V -8 23 V -2 4 V 2202 1678 L -15 36 V -2 5 V -87 -168 V -4 9 V 3 -9 V 1995 1309 L -19 34 V 29 -57 V -82 -122 V 11 -20 V -10 14 V 1864 942 L -16 18 V 6 -9 V 1808 835 L 14 -16 V -14 11 V 1773 681 L -9 4 V 0 -2 V -20 -81 V -1 -2 V 1 -3 V -22 -86 V -8 0 V 3 -3 V -13 -44 V -1 -2 V -1 -2 V -9 -47 V -5 -2 V 1 -2 V -23 -19 V -2 -2 V 1 -3 V -7 -23 V -2 -2 V 0 -3 V -2 -9 V 0 -3 V -2 -3 V 0 -9 V -3 -2 V 2 -3 V -2 -2 V -1 -3 V -3 -2 V 1 -2 V -2 -3 V 0 -3 V 1 -1 V -1 -4 V -1 -1 V 0 -2 V 1 -1 V 0 -1 V 0 -1 V stroke grestore end showpage endTexFig -150 1376 a Fi(Figure)22 b(11:)33 b(FDDI)24 b(Blo)r(c)n(k)e(T)-7 b(ransfer)21 b(Comparison)g(of)h(SGI)h(and)-150 1476 y(DEC)-150 1725 y(ing)36 b(di\013eren)n(t)h(net)n(w)n(orks)e(and)h (proto)r(cols.)62 b(Using)36 b(NetPIPE,)-150 1825 y(w)n(e)27 b(ha)n(v)n(e)f(clearly)g(sho)n(wn)g(the)h(o)n(v)n(erhead)e(asso)r (ciated)h(with)i(dif-)-150 1924 y(feren)n(t)37 b(proto)r(col)g(la)n(y)n (ers.)64 b(While)38 b(ease)f(of)g(use)g(is)h(gained)e(b)n(y)-150 2024 y(uniform)e(proto)r(cols,)g(net)n(w)n(ork)f(bandwidth)h(and)g (latency)g(are)-150 2123 y(measurably)28 b(sacri\014ced.)40 b(W)-7 b(e)30 b(also)e(foresee)g(b)r(eing)h(able)g(to)g(vi-)-150 2223 y(sualize)j(the)i(di\013erence)f(in)g(p)r(erformance)f(for)g (other)g(net)n(w)n(ork)-150 2323 y(proto)r(cols)26 b(as)h(w)n(ell:)37 b(tok)n(en)27 b(ring,)g(HiPPI,)g(etc.)-150 2651 y Ff(References)-108 2867 y Fi([1])41 b(Gustafson,)h(J.)d(and)g(Snell,)j(Q.)d(\\HINT:)h(A)f (New)h(W)-7 b(a)n(y)21 2967 y(to)44 b(Measure)f(Computer)h(P)n (erformance",)h Fa(Pr)l(o)l(c)l(e)l(e)l(dings)21 3066 y(of)f(the)f(28th)h(A)n(nnual)e(Hawaii)j(International)e(Confer-)21 3166 y(enc)l(e)29 b(on)h(Systems)f(Scienc)l(es)p Fi(,)e(IEEE)f (Computer)h(So)r(ciet)n(y)21 3265 y(Press,)f(V)-7 b(ol.)27 b(2,)h(pages)e(392-401.)-108 3432 y([2])41 b(Netp)r(erf,)28 b(h)n(ttp://www.cup.hp.com.)-108 3598 y([3])41 b(ttcp,)28 b(h)n(ttp://www.epm.ornl.go)n(v/)p Fg(\030)p Fi(batsell/NB.h)n(tml.) -108 3765 y([4])41 b(Krivda,)91 b(C.)80 b Fa(A)n(nalyzing)e(A)-6 b(TM)78 b(A)l(dapter)g(Perfor-)21 3865 y(manc)l(e)47 b(The)i(R)l(e)l(al-World)f(Me)l(aning)g(of)h(Benchmarks)p Fi(.)21 3964 y(h)n(ttp://www.e\016cien)n(t.com/do)n(x/EM.h)n(tml.)-108 4131 y([5])41 b(Huang,)24 b(C.)g(and)g(McKinley)-7 b(,)24 b(P)-7 b(.)24 b Fa(Communic)l(ation)j(Issues)21 4230 y(in)d(Par)l(al)t(lel)j(Computing)e(acr)l(oss)g(A)-6 b(TM)25 b(Networks)p Fi(.)e(T)-7 b(ec)n(h-)21 4330 y(nical)18 b(Rep)r(ort,)i(Mic)n(higan)e(State)g(Univ)n(ersit)n(y)-7 b(,)20 b(MSU-CPS-)21 4430 y(94-34,)25 b(June)j(1994.)-108 4596 y([6])41 b(Gustafson,)46 b(J.)c(\\The)h(Consequences)e(of)i(Fixed) g(Time)21 4696 y(P)n(erformance)17 b(Measuremen)n(t",)i Fa(Pr)l(o)l(c)l(e)l(e)l(dings)k(of)g(the)f(25th)21 4796 y(A)n(nnual)44 b(Hawaii)j(International)f(Confer)l(enc)l(e)g(on)f(Sys-) 21 4895 y(tems)34 b(Scienc)l(es)p Fi(,)h(IEEE)d(Computer)g(So)r(ciet)n (y)h(Press,)g(V)-7 b(ol)21 4995 y(3,)27 b(pages)f(113-124.)-108 5161 y([7])41 b(Stev)n(ens,)93 b(W.)81 b Fa(TCP/IP)f(Il)t(lustr)l(ate)l (d,)91 b(V)-6 b(olume)79 b(1)p Fi(.)21 5261 y(Addison-W)-7 b(esley)g(,)27 b(Reading,)g(Massac)n(h)n(usetts,)f(\(1994\).)-108 5428 y([8])41 b(Stev)n(ens,)28 b(W.)h Fa(Unix)h(Network)h(Pr)l(o)l(gr)l (amming)p Fi(.)e(Pren)n(tice-)21 5527 y(Hall,)e(Englew)n(o)r(o)r(d)f (Cli\013s,)i(NJ.)g(\(1990\).)2047 -173 y 15629760 10784529 3289088 3289088 26970521 19866091 startTexFig 2047 -173 a /gnudict 40 dict def gnudict begin /Color true def /Solid false def /gnulinewidth 5.000 def /plotlinewidth 15.000 def /vshift -40 def /dl {10 mul} def /hpt 31.5 def /vpt 31.5 def /M {moveto} bind def /L {lineto} bind def /R {rmoveto} bind def /V {rlineto} bind def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def /Lshow { currentpoint stroke M 0 vshift R show } def /Rshow { currentpoint stroke M dup stringwidth pop neg vshift R show } def /Cshow { currentpoint stroke M dup stringwidth pop -2 div vshift R show } def /DL { Color {setrgbcolor Solid {pop []} if 0 setdash } {pop pop pop Solid {pop []} if 0 setdash} ifelse } def /BL { stroke gnulinewidth 2 mul setlinewidth } def /AL { stroke gnulinewidth 2 div setlinewidth } def /PL { stroke plotlinewidth setlinewidth } def /LTb { BL [] 0 0 0 DL } def /LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def /LT0 { PL [] 0 1 0 DL } def /LT1 { PL [4 dl 2 dl] 0 0 1 DL } def /LT2 { PL [2 dl 3 dl] 1 0 0 DL } def /LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def /LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def /LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def /LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def /LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def /LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def /P { stroke [] 0 setdash currentlinewidth 2 div sub M 0 currentlinewidth V stroke } def /D { stroke [] 0 setdash 2 copy vpt add M hpt neg vpt neg V hpt vpt neg V hpt vpt V hpt neg vpt V closepath stroke P } def /A { stroke [] 0 setdash vpt sub M 0 vpt2 V currentpoint stroke M hpt neg vpt neg R hpt2 0 V stroke } def /B { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M 0 vpt2 neg V hpt2 0 V 0 vpt2 V hpt2 neg 0 V closepath stroke P } def /C { stroke [] 0 setdash exch hpt sub exch vpt add M hpt2 vpt2 neg V currentpoint stroke M hpt2 neg 0 R hpt2 vpt2 V stroke } def /T { stroke [] 0 setdash 2 copy vpt 1.12 mul add M hpt neg vpt -1.62 mul V hpt 2 mul 0 V hpt neg vpt 1.62 mul V closepath stroke P } def /S { 2 copy A C} def end gnudict begin gsave 50 50 translate 0.050 0.050 scale 0 setgray /Helvetica findfont 120 scalefont setfont newpath LTa LTb 720 301 M 63 0 V 6210 0 R -63 0 V 648 301 M (1e+04) Rshow 720 770 M 31 0 V 6242 0 R -31 0 V 720 1045 M 31 0 V 6242 0 R -31 0 V 720 1240 M 31 0 V 6242 0 R -31 0 V 720 1391 M 31 0 V 6242 0 R -31 0 V 720 1514 M 31 0 V 6242 0 R -31 0 V 720 1619 M 31 0 V 6242 0 R -31 0 V 720 1709 M 31 0 V 6242 0 R -31 0 V 720 1789 M 31 0 V 6242 0 R -31 0 V 720 1860 M 63 0 V 6210 0 R -63 0 V -6282 0 R (1e+05) Rshow 720 2330 M 31 0 V 6242 0 R -31 0 V 720 2604 M 31 0 V 6242 0 R -31 0 V 720 2799 M 31 0 V 6242 0 R -31 0 V 720 2950 M 31 0 V 6242 0 R -31 0 V 720 3074 M 31 0 V 6242 0 R -31 0 V 720 3178 M 31 0 V 6242 0 R -31 0 V 720 3269 M 31 0 V 6242 0 R -31 0 V 720 3348 M 31 0 V 6242 0 R -31 0 V 720 3420 M 63 0 V 6210 0 R -63 0 V -6282 0 R (1e+06) Rshow 720 3889 M 31 0 V 6242 0 R -31 0 V 720 4164 M 31 0 V 6242 0 R -31 0 V 720 4358 M 31 0 V 6242 0 R -31 0 V 720 4510 M 31 0 V 6242 0 R -31 0 V 720 4633 M 31 0 V 6242 0 R -31 0 V 720 4737 M 31 0 V 6242 0 R -31 0 V 720 4828 M 31 0 V 6242 0 R -31 0 V 720 4908 M 31 0 V 6242 0 R -31 0 V 720 4979 M 63 0 V 6210 0 R -63 0 V -6282 0 R (1e+07) Rshow 720 301 M 0 63 V 0 4615 R 0 -63 V 720 181 M (1e-06) Cshow 956 301 M 0 31 V 0 4647 R 0 -31 V 1268 301 M 0 31 V 0 4647 R 0 -31 V 1428 301 M 0 31 V 0 4647 R 0 -31 V 1504 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1e-05) Cshow 1740 301 M 0 31 V 0 4647 R 0 -31 V 2052 301 M 0 31 V 0 4647 R 0 -31 V 2212 301 M 0 31 V 0 4647 R 0 -31 V 2288 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.0001) Cshow 2524 301 M 0 31 V 0 4647 R 0 -31 V 2836 301 M 0 31 V 0 4647 R 0 -31 V 2996 301 M 0 31 V 0 4647 R 0 -31 V 3072 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.001) Cshow 3308 301 M 0 31 V 0 4647 R 0 -31 V 3620 301 M 0 31 V 0 4647 R 0 -31 V 3781 301 M 0 31 V 0 4647 R 0 -31 V 3856 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.01) Cshow 4093 301 M 0 31 V 0 4647 R 0 -31 V 4405 301 M 0 31 V 0 4647 R 0 -31 V 4565 301 M 0 31 V 0 4647 R 0 -31 V 4641 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (0.1) Cshow 4877 301 M 0 31 V 0 4647 R 0 -31 V 5189 301 M 0 31 V 0 4647 R 0 -31 V 5349 301 M 0 31 V 0 4647 R 0 -31 V 5425 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (1) Cshow 5661 301 M 0 31 V 0 4647 R 0 -31 V 5973 301 M 0 31 V 0 4647 R 0 -31 V 6133 301 M 0 31 V 0 4647 R 0 -31 V 6209 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (10) Cshow 6445 301 M 0 31 V 0 4647 R 0 -31 V 6757 301 M 0 31 V 0 4647 R 0 -31 V 6917 301 M 0 31 V 0 4647 R 0 -31 V 6993 301 M 0 63 V 0 4615 R 0 -63 V 0 -4735 R (100) Cshow 720 301 M 6273 0 V 0 4678 V -6273 0 V 720 301 L 120 2640 M currentpoint gsave translate 90 rotate 0 0 M (QUIPS) Cshow grestore 3856 61 M (Time in seconds) Cshow LTb 6570 4796 M (DEC 3000/900) Rshow LT0 6642 4796 M 216 0 V 6037 1717 M -527 893 V -80 4 V -81 5 V -82 7 V -83 10 V -83 9 V -87 16 V -89 23 V -89 20 V -96 35 V -109 61 V -120 83 V -136 114 V -115 73 V -78 0 V -81 5 V -76 -5 V -81 6 V -79 1 V -72 -14 V -87 18 V -78 -1 V -80 3 V -79 2 V -81 4 V -78 1 V -82 6 V -81 6 V -83 9 V -86 15 V -82 8 V -90 25 V -98 39 V -115 72 V -81 6 V -88 20 V -78 2 V -76 -1 V -69 -17 V -83 9 V -74 -4 V -28 -96 V -129 117 V -72 -2 V -32 -80 V -58 -15 V -92 19 V -59 -19 V -119 67 V -49 -6 V -57 -11 V -66 -19 V -91 -15 V -116 -44 V 886 3089 L LTb 6570 4676 M (IBM SP-2 8 nodes) Rshow LT1 6642 4676 M 216 0 V 6993 1654 M -52 103 V -76 151 V -76 151 V -76 151 V -76 151 V -76 151 V -76 151 V -76 151 V -76 151 V -76 152 V -76 151 V -76 151 V -76 151 V -76 151 V -76 151 V -76 151 V -76 151 V -11 22 V -80 14 V -76 -3 V -84 18 V -78 4 V -79 0 V -78 6 V -78 3 V -79 -3 V -77 2 V -80 6 V -77 -6 V -79 5 V -79 3 V -78 -5 V -78 2 V -80 7 V -79 -6 V -77 2 V -80 6 V -80 -4 V -69 -15 V -87 20 V -81 1 V -80 5 V -79 3 V -81 2 V -80 5 V -75 -5 V -79 -3 V -73 -7 V -75 -5 V -79 -2 V -68 -19 V -72 -11 V -69 -19 V -71 -13 V -65 -26 V -64 -29 V -61 -31 V -59 -36 V -50 -48 V -46 -59 V -44 -72 V -44 -56 V -37 -76 V -26 -84 V -26 -92 V -28 -86 V -20 -78 V -14 -118 V -12 -103 V -19 -114 V -10 -76 V -3 -97 V -4 -121 V -14 -127 V stroke grestore end showpage endTexFig 2132 1376 a Fi(Figure)f(12:)36 b(An)28 b(Example)f(of)h(a)f(HINT)h (QUIPS)f(Graph)2067 1626 y([9])41 b(Comer,)54 b(D.)d Fa(Internetworking)f(with)h(TCP/IP;)i(Prin-)2196 1725 y(ciples,)41 b(Pr)l(oto)l(c)l(ols,)f(and)e(A)n(r)l(chite)l(ctur)l(es)p Fi(.)d(Pren)n(tice-Hall,)2196 1825 y(Englew)n(o)r(o)r(d)26 b(Cli\013s,)i(NJ.)g(\(1988\).)2025 1983 y([10])41 b(Gropp,)28 b(W.)i(Lusk,)f(E.)f(Skjellum,)i(A.)f Fa(Using)i(MPI)p Fi(.)f(MIT)2196 2083 y(Press,)c(Cam)n(bridge,)g(Massac)n(h)n(usetts,)g (\(1994\).)2025 2241 y([11])41 b(Ho)r(c)n(kney)-7 b(,)30 b(R.)h(\\P)n(erformance)d(P)n(arameters)g(and)i(Benc)n(h-)2196 2341 y(marking)k(of)i(Sup)r(ercomputers".)f Fa(Par)l(al)t(lel)k (Computing)p Fi(,)2196 2440 y(V)-7 b(olume)27 b(17,)g(1991,)f(pages)g (1111-1130.)2025 2598 y([12])41 b(F)n(ORE)26 b(Systems,)i(h)n (ttp://www.fore.com.)2025 2757 y([13])41 b(C.)83 b(Cruz-Neira,)96 b(D.J.)83 b(Sandin,)98 b(T.A.)84 b(DeF)-7 b(an)n(ti,)2196 2856 y(\\Surround-Screen)44 b(Pro)5 b(jection-Based)44 b(Virtual)j(Real-)2196 2956 y(it)n(y:)33 b(The)22 b(Design)f(and)h (Implemen)n(tation)f(of)h(the)g(CA)-9 b(VE,")2196 3056 y Fa(Pr)l(o)l(c)l(e)l(e)l(dings)26 b(of)h(SIGGRAPH)e('93)p Fi(,)g(A)n(CM)e(SIGGRAPH,)2196 3155 y(August)k(1993,)f(pages)h (135-142.)2025 3480 y Ff(6)135 b(App)t(endix)43 b(A)2025 3715 y Fi(The)32 b(HINT)h(p)r(erformance)e(metric)g(w)n(as)g(dev)n (elop)r(ed)h(at)g(Ames)2025 3815 y(Lab)r(oratory)27 b(to)j(gauge)e(the) i(o)n(v)n(erall)e(p)r(erformance)g(of)i(a)f(giv)n(en)2025 3915 y(mac)n(hine.)60 b(It)36 b(\014xes)f(neither)g(the)h(problem)f (size)g(nor)g(the)h(ex-)2025 4014 y(ecution)h(time)g(of)f(the)h (problem)g(to)f(b)r(e)h(solv)n(ed;)j(it)d(measures)2025 4114 y(the)31 b(p)r(erformance)f(of)h(a)g(computer)g(at)g(all)f(lev)n (els)h(of)g(memory)-7 b(.)2025 4214 y(Figure)37 b(12)f(sho)n(ws)h(a)g (HINT)h(graph)e(for)h(a)g(t)n(ypical)g(w)n(orksta-)2025 4313 y(tion)43 b(and)f(a)g(small)g(parallel)g(sup)r(ercomputer.)81 b(The)42 b(graph)2025 4413 y(plots)i(the)h(QUalit)n(y)f(Impro)n(v)n (emen)n(t)f(P)n(er)g(Second)h(\(QUIPS\))2025 4512 y(v)n(ersus)37 b(the)j(log)d(of)i(the)g(time)h(it)f(to)r(ok)f(to)h(obtain)f(a)h(answ)n (er)2025 4612 y(of)k(giv)n(en)e(qualit)n(y)-7 b(.)82 b(The)43 b(use)f(of)h(the)g Fa(lo)l(g)g Fi(of)g(time)g(w)n(eigh)n(ts) 2025 4712 y(smaller)21 b(times)i(more)f(hea)n(vily)-7 b(.)34 b(A)23 b(w)n(orkstation)d(starts)i(quic)n(kly)2025 4811 y(and)42 b(th)n(us)g(has)g(a)g(higher)f(initial)i(QUIPS.)f(The)g (sup)r(ercom-)2025 4911 y(puter,)23 b(on)f(the)g(other)g(hand,)h(do)r (es)f(not)g(reac)n(h)f(its)h(p)r(eak)g(QUIPS)2025 5011 y(v)-5 b(alue)30 b(un)n(til)h(m)n(uc)n(h)f(later)f(due)i(to)f(comm)n (unication)f(o)n(v)n(erhead.)2025 5110 y(In)48 b(general,)k(the)c(area) f(under)h(the)g(QUIPS)g(graph)f(is)h(the)2025 5210 y(net)31 b(p)r(erformance)f(and)h(is)g(summarized)g(in)g(a)g(single)f(n)n(um)n (b)r(er)2025 5309 y(called)36 b(the)i(Net)f(QUIPS.)f(A)h(more)f (complete)h(discussion)f(of)2025 5409 y(HINT)29 b(can)f(b)r(e)h(found)g (in)f([1])g(or)g(on)g(the)h(HINT)g(homepage)e(at)2025 5509 y Fh(http://www.scl.a)o(mes)o(la)o(b.)o(gov)o(/H)o(INT)o Fi(.)p eop end userdict /end-hook known{end-hook}if NetPIPE-3.7.2/dox/np_cluster2002.pdf0000755000000000000000000024615511433312522017054 0ustar00usergroup00000000000000%PDF-1.2 %âãÏÓ 12 0 obj << /Length 13 0 R /Filter /FlateDecode >> stream H‰”WÛŽã¸ý‚ù¾˜Ý’¢nyÊdfi`7h$³ØIh‰¶µ#‰†.íq¾>UdQ–lwO7ú¥!KÅ⩪sNýõ뻘'‘LX&c_?¿ã ÿú{÷á gE”%ðx Ù×’ÝóHäîÉ‘½gd_‡î…Àðqxv/y†Þ ÿ# å_‚Psåâqé±·£-mã>N„{ü“*‰Ý‹ïïÝo*JÎ?ºà#ŠãÒgs0]eº‘ýb†AïŒûJˆϾŽJÇûØ1f¼ž¥žþÅ<õ0ÔÝŽ=š~kûVw¥a¶c?×Ýô}j¦a4ýà‚É8;‡ûðE¼H-3é_ýü"©Ä'ð²{ ÑAzx$ᡟ û:õé™î*ö¯Éì'Í>íMç‘‘gDŸOL¨Ä%6'ñá‹\\Î&¤¸ _~lÍÀ~ÖÛëÑö'(“gL Ë,Yá?R¦¾þçZ!ö";_«”׃=jöÏQ†ýÚÕO€z=žÜ×ù¢Ô/Ü(åëÁ;i*Ãû’Ç™?–û­nö¦iÙßtÓÜ1¼ÙKàŽ%œ áLíó¹±Z—gi>ŸšªØ¿ýS«ëæÏþY¬ðÈÔ µÑÕö/’jô&ÚÙ'BòвÊ"¿,ë¢O_h¾"†‡q´˜m[Å«ô>n†±×åè‡W]–fÎDºDBÈ-àŒl5«Æ»q'‘Ÿ‘qNm©TNå|蘦q-ý¸Þ1=°w'ÖNÍXû8q¾b©Òìċ †¡þ¥CoK`!Û³áGµwáZI᯵ì>åÙ&Ž”HéJãÞ@f£?,‹ÞàJ…€I~•PiÛvêêR5ðWsT lõï¶§Ê?×8êjxxºXÒ”6u[H—[è8t´¬¶3бºaÓ`¶SÓAB¼¿‡ó{3Ý—{Ìen¾yR é!‚nPiA·ƒL¡º¯XÝŸðH¼Êê’/_‰_T#N=z"‚Sz ÒßœX2SoOxÚqozÃ|½Ìv[—5ñ«ä 1ã2`”ä o¬©Í,â"“$ñ—æÔÄHäcïH'л~Ýý©¡¶uöw3>><þt&PºpqU”˘ämëxáß [Dò é† 4KWžPNÞ†)Wa î -ÞÛi·?L#³[üÊÊ©ïQ¿Û¥~+ñ†QÌæQI µ#ánêM¯{Äñ ꦮf1H¿ÌŠ9SÃ:è$ÐÓÁnÇ#ÂÑè@¨œX?ul:À0AÇ<á)%Üêö¢˜5Mʰ‡vQKÛmëÝÔ»¶"—¯’ÿÚ5có×Ðü FÇ ÓLŸåÿ…óDÄ:Ïê gÊå«Òô¶šÊyøTÝfÿ,Î’¸Jî•vsÉúq²-RRÓMk‡‘° ÀñÆ¥cÐÎÐm¦aĉØž¥gò¹‡°‹¢ù)ÁA”)§šµº2Xâ™Xv¬Ç=«L‰=¼dŒÒN‡ÆT7GƒçA5#•±¹8(Q¶Ó›Æ0ÝÚ©ssÒØø³5-:+ld]âñ8©.ü×?9¾T2Ì›È ÿ%tè®±ø¯ª‡ol8è2Ž]7<ºnb!s /Š‚˜Éáìa‚ œlÕįѰ´ðå…Ëw›<7¸¼Œ*‰=£op?ªªÌ½[N¼H7Nƒõs’ä ð Ä>"-bðá¢}ö.ûê ÄsêfýëzLjº™ÞxúE&<ÊÞ•u€²ü§ÑýÎܨF‘Í62Ϊv7µ$¨U‡FÁÂýˆLœË{qÔdµ<É©m?}8Úþè‘CžLÖà [L ¡7€o]Ûr& )(z*ü õW¬ˆ°¹@ uUãa8HóO¦!K¾Ú$ àlQ$';‰€ÚölÒ’‹KR·‚£Š“Ü¿ẲÞOmÌx4¦cކv*÷oTLR²$ÊŠÀ v4ó?^É‹ue;×"Þ9±^WÄëãMo7ñZiW²ºÎÊøÐ­Z]îÁë`aáì_kvqi“ï(ÞhÕLë-‹;潨¨yA!… }‘!M‚urKÖÂÜ&âm›&ç9ÅÌ…È.ì-Þðå¡¿`·®ôO© P2AuA¶ÀÂÅõ¸0IlÕ×ö€!,LWnS˜kuÙü*s¥$éÁ°\)Ð:¡ç1´Œ~¯Û©eøåXWÀ×UJD6{hùӌٺvòFÉË^ú&°ã qïGë~ÊÏŠ²ü<|¸ðèÐ>³©óÛ¤»°³l¥=`ãSóUzÔ¨hT!.,¼3µâêŽ842˜¸of¬ÿWÅnhkè Û¹"Â+æ;<½Í‘Y´-/¨_\^-°aKËlºìm °4°Yœ†Þ¿:L ¦º#i‘ ·uÓ_ÕÅ[ ¬k—R¼X!¶™@˜û®<ž0ÝMsò¤ŽÛ%n \Ú7Í㧇›w” àa*ç"(øÀv2¦TMå)0S óðŠ,Ãbf~c¹Ii6w~Tgj[÷è–Gs@´¼jcÏâPƒàŽ+Æ~†3ªƒˆR^Pø€õ‚fÒøõm/D\°àíótÍ1ç- ½F~¸Þž 6†à§Ú¦—[sq³rq»ÙÆ8>ý·¸“ÿeÚc röœ"aâ@øŽ5Àe¶`H ‘qá_/z,.Ô,”2%¸úà¥zs°=´€o_7T#Ìk‡ûv‡xó¤›ÉÓáM®KcEðåEPŽKý½Q"Xa¢·¬G<ÎèÉóüB êM¯ûÚç«g,Š(¹TЙZâ ÏOø¡ßCfí¶õŽf5ô&º¯è‚Ê:;qÇêñæ¢ìW2Ì£&ëÕ\ ÐåAœˆ¢6ºÕMâJŠb ’³Ç—›â¨:ƒˆâŒ˜ÚY [[gýö“s|ón)¯¥ ã©&çñßYXXÜÍ ÏŽdGQA ô¿f›ÞꊙÎN»=̈¯^c«DÀ6HÌ3ÃÈŽ`*ïFp ÅÎÚê9h}æ<‹)üÎtÈLNfp,`¿ áÁ U`¤:·Ù×® 98H`Ò6ð¢åî6 §“K±#£Åßf›ÄEÎ,¼–S(#p׬¯ðŒ*±\t‚|øÂ™ûyûŽr’Q0‰ç¼Ádç¥T¨!¶¶s06ÝÊ6vw¢ÿ_yÙì¶Aø ò~ÿr¿y¼ÑúöŸíʻ߬¸F°×yq*a6e¤¿nî6N¾Ý¢ÎŸŸëÆûñpëÄâ% ‹þç_’òpÍ{· J+e­¸­4·Î دëŒR‡!+þ-Å‹NLw]Ê/Êi3LµfÈêÞÕ!„W»y?'±*;m·¬}Ï=Æ^œÏ9«yÃÁÂÌ«+„6‘n{§Ùuð²äáVdÞÁDŸv*ž€=Ô¾tœêÔµ¤EjÚÉçƒãfÞ ÿ€qÅ•ƒðN¾pKæwëJ“@»ßú|šo­•;äsß8‰^þù\›ÓT<Ñ$m&£8¿I~Û0š“8ÖlaÌ»: 2¡e^ÑÕåE' Àªß‘ìRàùMFQ(Lc{wbÚÌò‡~òá’Ÿ›÷@¹–ïöÖ®°ñV¹h¤ûö…CjYzi^z¸k q[)\ïV7Ó¹p¼ìê\ö9!H"´Ì«00é_¶ÿ  ¨Ñ kã–~)ú Ÿ«Š;©Cîä#Jo%Þ\„\_ý¡Ë«”Ÿ©TXf–rIÅ‹ÜißÿƒÞ:€O]ÞŸšˆY!M›pßBÊgŠ×–2IYçÅ¡ÀŸÓ%¼ee½,Iq$¶cÒ„>¥~NÍìu{{tá®_a2ª¾Q’cRGy6.5˜,F/3¿æŸO#£ïú™`éçdØÉPN5v»ZH®æºËÙ‹•HAªL2?ø›ÉCiGß¾àîŒo43®‚J¥¼gCW¼ áW¾mAi\±lˆ»*ˆ¿ÅŸì¹oÚ%§ŒL0ê|q“vű©m=8ÀVÏ—‡¥Ýé¡7—Yma ï¾ú……¡ endstream endobj 13 0 obj 3854 endobj 4 0 obj << /Type /Page /Parent 5 0 R /Resources << /Font << /F0 6 0 R /F1 8 0 R /F2 10 0 R >> /ProcSet 2 0 R >> /Contents 12 0 R >> endobj 15 0 obj << /Length 16 0 R /Filter /FlateDecode >> stream H‰¤WÛrÛFýÿÃ<øÁÙ’à¹`À£"_äJ”RÅÚKU’‰ˆ@€ €¢•¯O÷L”,îÚ/9ÓÓ×sNÿxûÆÄ‘f‰ŒÝ~xÃþïîÙ›÷ŸË¢DÃ×wð5»-Ø9Dê¾Ù²wìvûç‘2ü탟’Ìâç)ºnûµwlXZvßåëeÏúe»mXÕÀwÞ‚4øJ°Â•NÉŒJLâÍT=[çkÛ±¼³ì®kWlضÞsÇxÿ\ˆHê`Dd11IF¾ˆ(eŸ¯þb7¶ªÍŠÅìæ²gÛjX²Ä¤ìúGtôæR(ÅVvÕvOþ¦åè\,É®–©òvó¦dJº³2¡8 S2vÞî8vîN¨] :üé$ögÕÀàùkôòò ëëvè#øii{ëbòÛ°¼gÃÓº*òšr ø<~¡ÝÇ‚‰(Þ4Æz×vl±©ê²jîYQoúÁvý+ HøMÞµˆå­àœ3›KxzLÁÌzâ³+#ˆÑxûuÍÛQ Ž–mcÙ"/|yº«ñ+r£”ôy~7´î§_?¼~˜TçÆ¥†êŽ^ø27-ôÄühŒ—úGªi…Sn¨*R‰Ì[èáv±|•€kµÞ †ù\S` oïÊ$¸¢A>¡W5‚ìE½^æ BÏFOÁòºoÙ¦ÇöjV‡éë¯`h23ÆóX•pÀ¯¯<䢛yWõm³ë‰›KÖÙ~SíÃBùWoÿá’ÀYÄJЀzZd™?Zfbj‚g€îÖÒ˜çÉè 8šo‚ž\ͲÍ3%¨ÈÒ“0Xºïlerf&ýŠ3ܸl} -NòZŠ”$æéÎk|g±éƒð°G{¨%aà-ŃL˜ÉƒÈ_6ê5#åO½8QJޤ/UÚOí¦c½õÑñ.‹,è h^ªËàC^ÁX?B„L‘w%µ.â-‰h¼oqº^†b‡aá]oUÊ_ÀÖíÇÏ>ns"P¡Qa‚ðørû˜5ê7ðú#yúû»PõØg÷çÄQƱÞUÝ ]7-–6ÑSsJ¹ƒÙ+**w~agµI( ÇkúT¥GeW=Úî÷œ boQDÁ ¯aÖ±­`l& )÷ºQð@DF’ݲ-6”¼n·Þ´Ëâ/_.ƒ–€’ÝÛ²{U=T­: jPpIª!w3îÈU&8‹ò ã(K%bšß"÷ùxDp(Å…@ªÂ19¼òÑ8…Ëòò1o†üÞ†&X“ü}RŸ ò¥# Ä£âÝA(2¦ÞS•RS|~o 1ñ© -¹L‰S%“†¾(,4Æ^?ÃF… éKø˜Š±ÊY€ª·RrJÞ×§þ§¶il1°¯?ù¹ñ ÛRj‚ŒCÈÒXíCJHmv‚29Qx6/é® RF'¢J’圊LŠÐ?di o¬N¦ý¶¶M_`%Þj£Ïˆa’‰b‚yÓA1…J@ïâ‘^¿ÇA˜}ç&rO?9à©Á›âÉaÄNä,«û%(¦ÜVeP`ûðÿ‡…¹Ú.a‹ýs³Z´ì®ËWÖ1Z†kçâi€áöŸ¬¯þò+¯mòEíØl*‡È¦Û@Å(‡fêL‚£ë®²CA\?lÃÂRvdX ̰nIlÛ¶{…Õ•[ôi›÷^¦%"ã“Ò>+èØ‹:˜4´{"øïeU£.­{û ^Lç%Q: ›KÂC Níà;4™-bZI—*CüTlïò‰Ÿ½~wÂebSC¯°; /êºýí)•aèbúÜwùzÙ»²eB œ=BtœÂ¿ªó„†Õ9'ûÁç‘‘A=xm¬,Fã'®ÇËçâÊ4yT. ¹‡Øãfœ$Aбíe¯–äæ$yªtÈ— +@[I9âe¶·æÅéèŸS‹vµÚ4Uábsª F™µÂ–úŠ Ó±CB‘Z2¦;6¥ž‘¼^ &MàTáYâò*d¼Qûä~Ô5 ýÿåÁxÜŒ ãë]ƒ[‘‚¹Ï„þƒU ™bj³ÀŒA M6‘ÉÞ) եʒÑ0ë˜4P~ ö¬ü)+POl°PÜÅ»èîÿî½ÚvÜ6’èì?ðѹ›ÍæåÑ ìÍ`=¶ÛY`Ãà”DD$µ¼Èž|}NwWñ"FãÝ 6„Å®®:u.ÆzoìÌÒýÃþ?aZ‡>+Úëô® kÚ{pùMo+¶1Þ¥çPG–DB¨ïgn_‰,A:äºfÙvÔ$ÞÑo2šb|~ÚÂ'ŒÎ•ØfÒk¾MÀDgÅŠÎúç­U~æktÅb0Žá€gÄ·÷miâ%»ó†CH½n_nwFš}äa@Èõ:Iât*:xäš=¤Ã’5ù(Rl… ºýÅLDXɱñ0¬yÔ ƒ9uRá=ßä1sƒ‘PÍfÀ\ÈNÎ^<{ýâ jÇÓÞ/7/8)b„nz΂^åŠ$YOM?_8 5¡&‚yÊ5É®X× -„7CÄœVÝ_á!¤OGDš-ÜRŒ4 X\W×T…Wl6“$±žƒY, :¦ZZœÑàüzSnøLÓðèÁÌÌMÎ.Mƒµj©ûÒÀÏ‹ÑÍ¥[ë'å0_œÃû©¶q._Lu(¹1íˆHõÃG\P¥È<ë]“.x–s™òÕ*)¨ß%Ò äoªðD¨‚ˆ:;ÐR;§ûó»[ƒ¶·µ÷±.¿òW¤íà¬o0殯•ûhêW‚Qž•áJFŸ&24o€w·o²ßMk³] ÞÏhQjÍ2I›²âXfê}×6[0Ÿ-.OûÔëÛ´î6Xƒè¦T©AóàöRsJ¦Ü5!óß΂‘}zjŸÐjUúLºÂÌÐüqiAþõuO=ª“"#ñI`–mY™c›C_VåNZ`®Óª€Ï0À¢,™:Qg k~øóWþ¤èÖ -ÒÖ»àóû·?þ뇯Þßüç¥Ã«˜n¹ð&¬”*‰‰“½¢>–mSW6äB¨¬¦[ã†z%ðk8Àç^>›@8’ ‘„h`UúÕ\ތͨí¡h!®  ‹·–)æýy4Äœ`{Å ¶‚c§Ô5Ú)伋^ºÆOÁÕ÷Cû½Ì£äÛž‚.ë[ç¹ýhbÿ³G1ºM-1ûJ š~xŒè=±ä]@× o³O·–ˆŸ€%hæ#`ÒÑ)˜þ}óæýO7¯>¸d!.ß’¹kĈÌÙlC¿ÐôÂËøJѯ±µDæ;ø PDôš› ÃH5[ %™“ºr[ƒÑ€Þ»Â¨zëõCm \yÐQC Sø%½ïÌ÷U“—›’CÅ™›‘®âÀ 8`r·@›‰4]¼-ê¼øãØ — }³Ù›S´Åã·rìêÓML“WÔq¾¡â-ä×I=|λäœÓôMÖìWö>wW !æ] I}¤uè ß*k!ž¦o;Úcœ¸=+ýè¶ÊX<¼jþbÓ¤ !Ô/Aì{£ˆ´I(/R쎰ãWÀáKqÐÌcëu"&ªC™?Ïv>þ•uÙ¯3»Uô×χÿg†¶öø¦7ÑÁí¾Îý„ŽF R:¦J8¹gOd9ôY>£PMPmÑñcºDÓ„Û⿾¶âá_.ɾ”¾$Þˆ„ ¤v•1!ä» ÚÁÈ…ÓgŒ¸ó¯¼4Ï-e_§–ޤˆp¼î±}ÚuvïYÊê]ð²^ *; Ìöª¨À öМúóÇŠ˜_‹€(#…)>˜_Ì4Æ&96„6DìÓírõ¸6[7Øz-Ø^û oX„Î4Û.áÊ»w®PªÉ8·G®…Þ1ÀæÜ{uáèÜcà1©xìßÿ¢JÒ×®ãߣîPŠpÊç¶Îîàu‹0âUˆM?e‡ï‹U´µiM¦ú¯¨'ÎÉPL8îiHtÆŽí]“Û‘¹)1D×dÝã§86zìܲYº››6Ÿ°ü"#¦% ؽP!Úå{ýâöùÌGºj|}ZÍCŸ§¦é.IíôyqÅiÆÔ@<ãkT¸e8¥Ö‡”¥­˜K°tžÂ\!ìâ%AüÉûíÙëÆÙ{ðn±”¥‰|Öoß±ŒNõ1ŒI¶Tè³’˜$±À<¦Ú1cÆÚ¢@Hi¹·ŽsÓ6ÕãÌ>çuäÆà9÷ØM—išÄd7·wƒ‹æCF‚[ªtHë R¸±~wªÇä z#eø”ÿ½9r>%y­Á.ô3„H»\6R -–¯GÛÉ(çy˜Ÿ‹ü§ôŠë:cd¥ÇBö\e×·%ÌFÌD«ÕS–Ø=Å>ß™„c_T¬HÂ?ŒF?ž‰9£Î‡´O«Ü‰ø#!‰#h³> /ProcSet 2 0 R >> /Contents 15 0 R >> endobj 18 0 obj << /Length 19 0 R /Filter /FlateDecode >> stream H‰ÄWÉrGýýCæ@OÍZz=ÌÁ3y!Z ™¡ËhÂQè.5ìÑ @èëYK/ @R'‡m º«ryùÞË>~ˆÃ " £yüå%øO»!n?R˜ý~ýᆌñ >ç?gY ŸäJ" [EîînÚ†”zÕÊöøyüÿÆ8 Î5æ^L“ȾHÌ7øÈ ãæ¡ÛŒdA2Ýxò0…']D¿øïXêo¨àÌ\Â8K˜}Ӈ߂ü—eÿ#º#’äMU©6ײ${Õvº©I³&=$ââJǰ ¥æä8ˆbØœ¼Ê³&]/ëB¶‘{©K¹*Y·Me~û½Y÷Ù*¿-BóËyAi(|IÊí“*ßÖMÙlŽdÝ´D¶ÍPäoŒR²S-©›B‘ƒî·DÖ$µÿkÎ~ü;öKÐÄÞm«tm‹Åc4ŽÇð„+ž®†* ä®Çšºë[½z™vx’ë³H±mö,¸Ž‡ñâ¾ó”/‚sóûUߘŸRÌþåë'/ÂO” e*"WD]C _îMm\ãe™O/‹£Ì¾øI×Ã3ô\ö¤j̰Uy_ €áñ_×cA¶«®{Õ®e®ºé‚Ó¦…!sˆ”»ú}½ûÙœñë=TÑ#qè°S;ÙÊ^Áý­’é"ó^ïÜï;q{L›¡ ÝÐU²–eкk›M«ºÑ‹E¨à3üÖn<":u†Ž'½˜Bû˜¯×ËÙb ó˜d!s˜¼«s½Óõfœ8šZyû‘Oó u1ŸFP|ã<6¯ 3Æ™CF¾û£lêEÀâT6?•Æ¡Ÿz¦¡KËw‰Í€ùÎpfWAÞ!µ¸¹Úkù¾xžøxD–ºx°×•u#¿pÈ'z*`§‚YÆ ‚¨ómÛÔH0†Q?UºFÖC ×ÔVˆåxŠTd¸”ûÚFžá0rÐäMÙ¬À¯AqA8ñ [«¢êÃrE³'Câgãæ© ;NC— éR±—u5ÎåN®t©{­Œ¨‡7ä[ô<ø È7|½¬U&–µ²ÒzÓ„œ¥S&C­sÙC«¯,­¶ˆÏD:8Ö ¡Nl÷[!{IúãNÁ«È'e©JrwûÙtâtsÚTÓ÷×Ôjéþ^±\Èaâó”»h:]`­Æl°®Zölþöô--cê Æ·ô¿Ë·„ipŽûTOÎÅK*Ѩ“ -×ÜÝÂàþ TB>ÉUÓb§Ž×ó­`îú²$óbϼ;ƒªìt©Ð6Âø®ÕF!oÌàa›MûÔ‘ƒ³†fD©‰f1 ‚øÔá§«¤Û:Œñ“U7úó•ÂcžÖž#o(Ùpû¦)/,Qâ†!±ük Ĥë=ŽÞ@_áHP-‹ÑtŽÑ0îÝ…ÌóWÑ¡‘ÕD¿àcš½_ußËÈËÁ·?Ê\@ÀO…“mÍ Ve(WwXž»½U-Œ«&Çô²ÌaîK½\þ~÷ëÝg»´Ãh¨’«IÕC©ìVñ¤Ô®³S».›Ã¢ÍóЩðæ:Iüz .«6[,#Ä9£*­Üí𰓺9û$ŽC@AÇ%3&‡-DibÂüáDhx©äÞl%xS’Êa/„²½,GšN”Äîð{Ûl²³æLÌÁBÙø‹C÷‚ß\´!ÖVA§2ÒÿŽÙhÐj–ˆ½I 0‡oQM¨×Þ¦'îBۥƹéõ þ¿ ;ÄùRHè¸+Ei:iL%Ÿu5TPm°˜[sPÎDÃÊ $Ô† ä^êR®ÊsH¤‰7FT¤åÚ œÌ¯:»»ø<ÓDxé>vgdºc׫ âýˆù¤ëáù¾‡ËsYû€× á)m½³daãã <Ì< ;½™Øïƽ³¬&4ÔfQè{/ËR)õÓûG]\YÅs ªUä€Á ­TõTв}‡ ç‹%-NÓù¹ÿx·ž-Ž9ÙŽ"ò4µ,É‚³{qóÂ+‰"ø›æ*ŸZOÉÏUŠfax¶R‡E¥Ø¦ø—U S¢|Äc’ø$ûVõù-`=ïKH²^Go›‘,;Ë<¯-b1s¡C@ÎDqÚ5ìáëýr£4XFq.óЬaü"K†™»%¥.6 ×DáH›‘/ºúÍøQYÎ0E‰ùkû M2¯—Y*ÜÞ1@ë²¶ÆX¡¿+Uo]£­Z˜-¸Î ºBOÒHÀ(¿°"õòÙš ob3ËzÓä–9Ô×Ð/Ahú¤3Žðw×T@¹Úë—+ ›ËÑ«e¼µæ©×-4sû®x&Ø…º9`5PSàßš€ü8¨òléî_u{¥à¶úW}c¹dªç«Û ¡·°Oœ^éºëÑ9|y¸7Û% FåÄþº–‡Ð±Ô·u iÑýEÿd»Ô×ÊõëlÊRqQt„ˆdµÛWöø"§Sêø æÎé&X°Ñ¯"<2=–ÏO"—2zuXçÆ’ƒ<¢¡€"¶ýdˆ™¸$¥xÏâ“´ 7ûó—–̽þ‚׈À3U,“×àYÌZ#}û¢$8µÑÈPMœ-_iˆ¹ÕùÓ‘èõ|CÚhjÌý²Í(š)ŒÆ™sŸÑ¢®eÞ í):úzªÆ ¾|² ŠÈM=Myâk«+ào‚ÖèÛÕ3”ªÛÁà˜ UaW  Нñ¢æŒïK&LJ®Í°ë|;Ö©o?9±:ŠsƒŸÐ7ç–Q#9w~&Ø« ³týÝP®ñ¡^#jÌörM: hˆKV9súã›8biÖ°¢hØ[+ù÷xÿHJÙn&º·¹B­%¬sÎÀÆ3næ„Θÿ†âìD\lô…/f¶^m»#Gô ò|L‚Àn’MòqÖ3k ’™52Þ(ªmqM‘\^,+_ŸSÝÕ-RÛ‹ì³e©«ê\cåV‡‚ÇŸ÷䱬q™Ñu§{@žQ»Š±&OûX×°E9Ë=‚¯ ³64¢+Ûvª7ÁdËÆb(“+"3ÀŽ úÏ G@ÊvÈäºv$Jò“P±ýòç_þâ0`'yÍùÄiäˆýF]I-·m;òz]Žs9¡=ì·º º™e ëüyð]f/N‹G$£ùØwÏ»OÅX|iîjÈÍÀù53ÀIXóò,äÁɯXÑ./ZÊ<>]tÕš›A__µµúEåWhVÝõ w€•mw0úúàV-ê]¦ ˜§:sƒÉ!~§6ZX<Œ¤}Ñ » ›…垊õõ‹.5ùíü gõªgŠU?Z)$pËÔô˜B`ënõQ*xõ˜àþæöë÷ÛETÏÓw$uÿQI=qÆop*m…h»¬ÁÄ’G ·n¶zG©æÜBéº+ò,U¾ê×Y¨Ô»òYs¬) óÒî8Æß·mýTÍ’üú€RQVUùz¸Fx÷K+¥\šøÖöãv¯‡Ñw‚à˜é!þ£‘øà¶n×øÓǾ/ù †‘îðyâ0"VYÐå2oÖ®Hx1L3íÖ@3xád Ú|©~„›“È€Ë!˜U ¾k¨P;L0£ÀæböѬÃÜc¡ÎådÖzÜkÝxž­0wsæBd„¿®žŒäßþE ~›ŠfœvAéáT¶}ÁRdÈùÇþ›1 ®L¶º¿¹ dðØ©Ùè¾6j2¯Be¿«P„k9±Ór×™©G°ZµØ„»‡ð÷0³£„ѱ&ý‡Y<–òªÏE*Ìæ¯ýþísøªê ¹l›!3ô½¹­ë¶|°-ô_#OíL¤N¯B•§GÉÝc¹õN•Ä—-ÄòÑÿ¸ùç[–¾^åó„ÒcM¸ƒ}vµ1¬¤gñ;]Íd.†.çQ—^Ñ3x™º¯‚»YþÁþn«Ç‚šÂg‚_ÃËÂÀæÃÛ@2«uöÉþ™¶ñýb.2'c" ù¿ ÜÈ s>¨ØÞC{fûª»¤C…ØÛO 'š* ´Æ9æ;  Qª\\ %S JG\€N=Bë†6¨L{®F(,ÄËÕä',öÅþ¢ ‚ÂÝ9ž_<;¢ùd1 Pn‹¾(!r ª~DQöˆfG†.$=÷^Ž^Ë yÆÚi^ûÍž ΢+ þ¿Û E«¡úöëWê¢óáëtgž@jñ~ŠSä!Sâ×Ì4ú¥c Æññr‡RˆTî*’(6Y€Ä`pˆ)Ì«@|òŒŒ)WYäšã|‘F×v0k‰;Êb0Íb]WÃÖóc1Œ¯‡é…ØÇÒŸ.‰˜‚~ÜQ—Û¦­ÛÇÃI‡ûé»»g©j:ó¾l–’•‰v"Xeè&OºÉ“µc¿- ö­7˜+;æwˆWvÿW“Ogñ4âѶÕ#™ÓÐáÿéúgÌ»®[öS¯°<õv†1Ãûã@¨_ RÉgµ °61®Ghÿ¦Ç+™ Èvßœ+×ÞºÏhƒ-VêOÁ4åÌ.=M]Œ£†ã·ÓH›’y|]w\yÆÙÙì+Ì7ž¼#wGRJ¦.•:mÖÓÃ-·ú/„‡È†6¹1ÞZ¢žaìálç CÇŠLH^_‚??ýh _ .l©þsÉi&¢]®k„0á]$Ì]D(ÄÆÁ¦@ û>£_ãúqÛM#Þÿ´ JAmG ”3”… ;²\%cñ¾!ÀµM_±#z7šÔ¥ a6ZšÛJÂl~ÀŒë$6&üX³ {ûéy±.RÉ…gðU†m;Õ±`VGͧh"A¥mê7ú²ö‰$Œ<7||i-rvzGéƒíZh軂ÂjXýì&(kH+vÁ½/ÏWoóÍ~ê¼ûÍ)'„rκJ´ÕÅó‰ Y¨hŽ£y(ÙEw²m™ƒHõökæ òà­7Mõ #øÒ?>›§Ã§ QòSq ‚¿pGlš DOÀ¡çu{‘s»òÏÅÑêú±4L}G$HÝϱ"Èä¬òˆ$s’*•“<À¾C¬àÇd×?&)Ã~8‚1Ãéöw<æRØ®‹aiò+8À¿Þÿì .9ÃM˜„ŽË¹ Ìø¿_§Ýº úA9`­ù~þÖ6 f°‚MÖTl¹ QxwŒŽ„{­Œ]”¢,Ç[ùŒÃòí$É™Ãw7_ ›ƒ³òô¡â·àÓwâeœýÒYÉ€¶ó%v%Ù2úö¹Úž;pÙ/=ѹ2“PçÙoêÈ^q>6wJM°FMœ9]€ìÿe€“5P v˜´t>¸€9 Ï„òqI&‚ùÉžøîf°Y)’æÿÓ£_¼§å©“çÌ&'¾©;•É 2ku_mFãÜ‹äÒZS™;ÔK¥”´á)Â{¥Æ7¦ÂžaÅÀïð=û©×}/vù*¶ÁÙ7J‚N9õÏÀRgAe Ú¾éõÄ<û]¸Q*OÏÁfäÂf›Y“Qü»ª¬ˆdâ~†‡™Y«£ÙœC"Ì d±H ÃØW4»›GÍ©#"ok±3ŒB 磻ž$ -D8Ò‹¿aWÔ5“X¼9Ђå‰–P8ä%ÍÜîÁµ¼3—Q8#{tôÒù¶“·6£Fî‚Bn•ïd×Eï=¸×ãx@rkm`7§ö$IN*©°}À²$Q,NËÈ©,ꪡûª®M]£rìu]# N]Û¸p˜Ìöx ªŸïÿô?Èwú endstream endobj 19 0 obj 4931 endobj 17 0 obj << /Type /Page /Parent 5 0 R /Resources << /Font << /F0 6 0 R /F1 8 0 R /F2 10 0 R /F3 20 0 R >> /ProcSet 2 0 R >> /Contents 18 0 R >> endobj 23 0 obj << /Length 24 0 R /Filter /FlateDecode >> stream H‰¤WÛŽÛFý‚ù‡~ à]xè¾³ûq}™d6ñ%;³°p$J¢C‘2Iyâ|ýVßÈ&E8 Æ0D²ûtuÕ©SU¯ï¯$OJ AèþíFæ¯Ù¢«W7é$ðz¯Ñý ]ã„(ûæ½@ÿ@÷ŸáÃ5¡f'zuƒ! u`)ÖJ†mX)í¶ñ„$èý§Û7? CÞlêfŸU«ÜbJÀlÑܧç]»Eá‘‘Ošç_HÓÄŸÂ)ãnÛmµjò¬-ª­[/°¹ö‡ÑÈ#p'»ie¿ÂÖOü·»o~|ýß›»Ûÿ½³»ÕhwìÏ„î¼#)Rï´iê=*ºÖ﬒N|À•õ÷ö[ëa¬xXŸb·Î7Ù±ì£v#ÇÿÎxŒ›”yP¦0uë~ŽÔÙÕ ›…åXàQøå=Z#*$‚ME‹¾]V&ð~MV´ùÚ_)eãÙð8‘§6RÖír´Ïþ(öÇ=êvM}ÜîÇι yÿph­qõ4ü€g‘ûhqŒ!xtáENaT§þ–”QåÖÙ“Í(C‡žDÊeíÜ7x‚(%s‹6u¹F…cd?âŒ/zÏÙ Œ]§% WaŠyïÁw>Ó&œféÈI¿R*Ýmb`͵]õâÀÛU×”ÎGiŒ:IKÑ(x6«|ð‰NΘC uÆ)öË퇻noîíN‰Ïœ F¦ŠöQâÞ¡è5Ù>ïò¦Eë"p0:ö%© þãXøÍUÝ¡]^L €‡‘.o»6q™®ÐèÚ­zB’°Ôa3ÕÜgÐG·ç¡þ[jDÎHÕ:H‘¢Ò[ Zºb_ü™¯_^Ð#ªN9(ys­¼tŒt oùªËÊo¨®¼7˜L"ªaé q¼ªeei€¾/¶ÙCÑõQ”'"©òB¸MZØý¶6UÞ¡UÖ¬[H£›b{Kqçãtðñ’Ä¥ž+8Ñ:õ÷d¨ÝÕ`dÖùZçm$8&ÜO¦¥*Åžhë¬i›Mn䄊ïÜîtH“vaÍHOÐe/†¿Ceݶ†Ãy¶Ú€ÇF·hqŒKT°O§Òûm“gÄÂpϸÝeÍõ€À@2[E*´±CdFãvúÅMér˜îÜG¡í²¦ƒ aë{†ì5\ÔEºÀ¹#Eǘ§!Wu_¼OB¼%9I ¬}ÈA·IЖ&¯ÖùŸ_ëc Î[;mÓ£ÒšRvqì…!w kò/ÇÂ08C;UðÚïy”°Ö¾‰9ðq²pRMËPràFŽÖY—™ ´yÕ…ò ÿŒ"fàMàiw¬Æ¡.Dà!õ!éUø%z€ê ) ` ea  x¯ààDóÁjí,ƒˆ´¯rœúônëcr¹ª×y2ÓÁá=mT탿Ä$/âöÒáÍ4À/}Æ©ð—‡&è§½”·eDyPΰ¶íº Á+ b¨VYWÔäBs)¸:ɪBÓàVµ×ŽE”ô–PêòOH€D7 ¡»z_oó*7iÜ~k»|;Ñl¾Ó¹¨çfÒ.‘^|túp®õ9Û}ÍÇÕŸ EX)zhÀ^§¿;QD€2 ÉÙdèþͧ'[‚iªrÄ>eÌ—ñ2ÿš—¡d¬êêk^¹9ªÞ æXUÆmE·àþŸ“®'vX™ípÒóCÖ4ÌR)O"P·|o(³ª÷FD»PС ö­Ž]×Çðšž”pßd¤æ§Oò©÷Öõce|Ge˜:¢ñ`a¤Tûsüh4LõÓÈC©Š'!¯ôF8q­Öõñ¡4×4¶—Y¡°á¦\øÆH-0™õŽg#z39jä÷Ó©b(Ɉáûk¹àl¸!›¤ôL‹-Cž+…¯Ú7¡£0m[k«ê´å2 ë§[®} ¶Þª+È ÒJ´Î7Ū°®s&é4‘…ʸN½ç¡øÙ6CmYlwíxÆÓža%œô´¢M“Žx&‰H±½¹…þÂæú|Ü?Ô&˜LRX«Ðãb*='6¦Gi»î¾µ?ÖUÓŠ+„f^1ïßÞQ "êÿë¨õ†»¾Õe6[0.FWý0%ƒú!ñµ/ËÐÜ {0å¶Ÿ®©<ÏÂi" ÷Úo/ëëݨû”4,¦$4 c…³V@Y‡™IÀÎNE½ Ä¥æP{X˜ÍRN<ÂDÑOeˆúKB­¨ 5†7-ülÎ̺Ÿ¦hyM Û÷[íò ìF÷&>„1Ф@j Oa¡‰aa> ^6Œ‚k ì¨ÍLæ!—š^bðµY‘Paé”ZörkÛ‡²xh²¦æB/b˜çž.SO¹¿·(Фïšéåþì/vÅ"íç&LµÏ6ž°Ä i¯>5õiWLù‚®Ø. þ\ÒŸ­6wå(wi'݅힃Ʀû,2Wp½„ÉBO‘‡ú´É ÓC=æeéfj&1}CnªfªX/”Њ"t[­ Ð´¡N[¥ã:÷G‰«ý-~…ÞuZyMôÌ{Ñ­¿•uµuòs¾Q©žNAÆŸ(at‰|DÄ"'ÏAä4F„§D©žƒ L„O3ˆZ<qŽqñÚèÅ~†VwÓwûSªÝM^í'ì»›Ø0·Ÿ¨Ëgø5ŽŽ7Ç_µž¾zš œu!â?þêÂ7Ärü5¾ÚôÞõæüÖà'®®¸ÛÖ¯ /¢EÆ¢a…{ŠÃl>»§èóÃ#<îÿÕÔ¨Dv€èÈŒvž‘©ñ?Ÿ·:бQÈ9üÏâË“‹Ÿ9€ña§U{v .'¬s!¿­G†Ÿ8U& @9¢ç@ŒY-ð"K¹ê-µ&¢@V.‚…®ÝÃÊ9H9‚L—àEPg M{H‰@¦d:%cé¢{Ë>kä<£»œ9.¡F?‡Û#Ù b™µìªY+—YË/[+GÖªeÖʧ85€Øµz ^D€s†ê2ÅK’4˜’t\¡hda}V[‚? ÓÞpÿYÜÊîX ;â ö8YŠÍ’q’̓'|µ \,0\.“ËÐS³u²•‚b¸†:ÏYz{ ÄËêTð¼¶Ø·)Ëõ#jÞö꿃ީôÆPîUƒw Ø4GVc©Rñ>i~‰>.`ئdË„n_a`oU>šYÖ$úí©Ilt„°Œè$.¸ ùvÔk_*þrh2™´$>ˆ B?l’dcÜðË-û2s?¬Ïk Œô±D1¯Çš ˜¦„y”Pî .Ï%‡‚E×ÙyÒ—t ¼†QÌý°j0JÈí87ûRa¤`ʹ%Ø)J @„o·U¢´Úaî‡Õé`…oQy)RÎ+0H?´r#dÄûŸõ²¿çÜŒ{ g·An„Œù`£,‹ Š{J0/ëkºÿú ¨C°N WjÇ™é¯3ø¶±þÌñY÷ççòkù±üž>œxî§IXò«Âåßñp˜·ÃmœAf7üXfË“ê ¾mô¶l3#ìÄft+ísÈa›ê9cj„Ƹ8Îø:Ü1gš Wê’aV—a|ýj3&vCplh+ÃÍZ2·qÊíàgLY;c·Pdž}°kè,?g?˜ò‚ÎËsŒÈdzCóÕ ÃË/?·Dv>Zm¬)D…©tÆk£³¦ôzdGöê´aµ@’ãÏèÆxョ¶@£#$rŒÈ²œZ¬^^qòÖÑ¿ù¼UùhfY“è72‰3 b€ü9º&;:•³ŽÕ£8®\S³öYeÒu=ž«“ 5ôŽì¡Â*ð<4®LWO—lϹ€oL|2.ä³Í ®Á&h2¿î¸(²M«É“Ž ²+ ±#¹X†'†Ølæ¹¶n•̬¿ÀæM²@öJë0ó™ê%ÄP`¥ÏBÞyÒãøQA ævX«ös+ÊÖSÏ!`«. &È«x¬X=ØÁ#f£ ´œb*Á¼«1['\sCly>Ú åRÎ=Á>çœr)†`· ˜Û‹€éhv^:ì ¹ÒàGr0¼¨ç¦àTò^–`+£¥{´A^„´zqdË"Z±B(Ò¿MÇéú*\î'ƒZ@K3}ƒT¤’}¨Êx _ £I07ÄÆÌ&ýòr$˜4`„9žPn ¸ÒÍW–J: s4ż´¿>¿À!—b(ö &nþ’~ b.‹(bŒW¥ŠÉØ€ñâuJ17ÄætNº¨(†`ƒ°³ò¾F¼±!·ãÜŒ/AðÂKÅü¬ôÚÚqR¸S:•$ȃ𘕗@ eôÂó¯çܬÓã h r'|s¤ŸÂ§)Üñê¬Y!÷AnøS¸]äFÈüÊ…àD¥Ü jlY ÜFç{€ÁwLÙÜx§wùߟŸË¯åÇòû g|pŒË±Qœí:mL|¾£¯I>ifœ1uRU®hF}Db‹W§4§Dê0"?8Z@+çF§z9©Àf87C×ì»6_@ц½„ Û Ø*°Ù”áµæZÍî¬vÎjèÔá¬:vm±6à­—4Õ26Ú´U`3þl‰•T”æõ“ˆõΡoþ„ÎŒ¸~ˆ!U9$Xδ$ØÊŒÆâÖµ·* ñCü|HÀ.“ÓUåhRÉ­{©4i;*8Í~í[²¨Ñª­˜Ä6¢¾îâ ²õ»R…!ø"sVµ•Ò×uA"°YçóÁYs´Ö²°±ä µµVtͤç];hÓÙÕ‘ÇmW5¢Ös„Z÷H ÍGYÖhJöM†ØÕÑ rËïë:ÒLiN?}]{©5PûZÁh¶zqÌZ->Ò¦T«J6Šu ­BÞìÒóNÙæ\ËÂFÌ? -ùB]ÝÅAqÍ“Ò*ZsßÆÑ¥Å”lŒnƒ$5$`#}£UÜ<ïÀ’@«® ñxõµžô…V‘²=I /ï‡ÎÖæ£Ìn$߃V倓–®†®Ž™õCŒYù!­iŽ¡U$d[ÏÛÊ ˆ˜“ÀÑ5ØÕ]„߀l[ZEC åÐ:nS:•|ujåÚHÎ1RÁi.O¯T]¢SRóéG«¸ R‰¬dRqAsĽO¼k…¼稥€Væ5:2%­›óµ¾W·škÊ›¡‹ U†`îò$ÛvUO‡üwù‡^Tú+ÿÿ“ïé^5 f&½-˜Êþü\~-?–ßË?°ø¿SX–áA¶— ü_ø±¼ ‹AÞ,(-öWìØÃئÄÕf>åS^–YÝ¿aÑc×ýOÙ …àò¸p˱stû÷ eAºAsúkCí/öêSpc!XätÚîdx@…Žê9HòQÂãîúJÅ zBõ>ÚNBèÆšT” x¸Ì ¦ôd&kÿ t…¡Æñúl`×õx}¶¬>C×çÀë3 Zã`xä É’ø¢»±Rñ(sÃxWb-k ü6˜‚ÆÁp’NÁ‚‹é30¥î¯»Øfí7ÜC8!¢0ðøŽ×÷гÙ݇•E?w>®L¾§«$‡çÍó™!faÈ)×­|Ðdvp/?ÀWÜ“l`‚‹dÌ&·Šðe·užkàVÞ¼ø OΙVΫÆ=¸;bÆœóatoªê^Ä¥·3z¢¸ áqDž)?¢ß&µjÏ®‘;æ^ñ˜ ­%µF ”dgS^Ã;1ßž*2BcV±†'¯Ño”–}nû£u Š€9=ÈÅ^]$³ª&ñ—Émd¯*@@ºj:®¶Äþ}™)ÏK^4ª¸S|#D*yf^Øcÿ¾Ìêô“¿¢Zø›Åå’5S\éX±SP§¸áÔÊrSA~£¯- 7ö7ëW#&õEø?óÕÚÛVnDÿ?¦A-óýø¸›nÒëÂÛíÇBqäǬ¤lþú’3äåðêJ¢`#눗çœΠɡ쬙Œhý©®ðg“mzjZ¹¯{ØtxBZ%ºù„@úû£†ñB.µ/V©nJ8ãþž‹ŽCÀÃÌ! ãˆ$,Ì÷+ÂK ¸ÞmIð‰®¨ÿînG$)«;¯’ U²á"þTÉ«èÚ}ùøsíZ\€î­Ù–q<‚įð|óy4{; 6cu×dÃ8 y_ 9̤Âq(}hòÆ–0 z3}½¹ýòuìú2˜û-UNú/eQ»+à:TP >MZá’Ñ¿ÿú(¸2G±Ð¡$µÃ©Ç€ í"ÄT=¹IdJ““Š–ÓùÅ?Þý,Bsl=§â‰ýQð•ó »»:•§eÚ¾Ý1Éa@ˆÞÆÚçjâì½[/¨»ñvJîºä‘Ò3h-`âlZSÛ W›³Í€¦i`nzèc9ŠP_|ŒîæÂ\ο±ËwÄOèVdÜÛ¡qÑpt?ÎHN=Œ. ÅLº@ƒ$½o‚tñïób˜T¤0xaÂÎRå4.aKÃÁ/-òh7\KáˆO(Üã¿þt~«kÓ—h'ùÇVOWXl©ÁÄ@~ŠD9§Æ>hŒHªî³‹åÓD<œ¹H5ÔüPéqr˜‘ãÒV Š*å1þœØŠبíèVÐݺ|÷áüãZJUºá½¦Æߪ¤Có´ó¹?ãø\Ñ!:y‹£[vrýöDð4×ûœ6q$†Žvpò[r¯8„ãûzüdãq~}÷ißÝÌ?Ý­Ù/ÑåãbÍ®æËÏ+öi±þ¶X<²‹w«?iug^¢g"7s“ÎIYøÂ©ò|Ÿ±ùãg†g»úºDº 3ÝÔœd[n™?+ömS~¿¸^³§ëëØ¥Ç•}G áºbk°ëÛµ%†š)Ò¯÷÷ì1Æ÷þ;{zdë§/чd<]}iâÂnçŸ{|b±cZGoWëT9Âb¿saGÖ…ð‚Öåõb¾Ž{`5Ãú “»g›)ãh ÎÞóʙؚÍmË“I%ocøt¸M$û=õ†çìDE×5ùàÒ<îq uH?ˆü ·püý‘˜3)Ó½ího%À/椳ÅXúI:i:î•YŒâ²œÈQ)6Ä ×듊É0)W‡>MŠŽ6ļìóŠŠáh,¦9fx¯ÚtªQ«ZÇM•|¬£‡¦f>ÖÑè‚>ŽlYpïmQÄ9,¦RWÍ\­R/-bH;)‚1ä’d¶E "éjÍêÆKÏ‹kãˆvbÕñp)ð³LÄö*ç†ÑØûy¶ Êä)÷©“ÿW`Õ$õŸy™m])ö­Í*ö‰Uô·i]xÓ[NÕÒØVÌÜç¼;~§×Pí:dk< —ŸÏT¨½GûÃg{”‘KЯÍñœ6bܤOs+ö¹Lô¡›LàÀ‡“ÌÈn¾ Ï#÷r)üøšÃ±`tWš4°ñ˜ë¦Sø‹ðøc{¶¿×uºMЉ-°4¡Ë4E¿:;Ä“l«»jµ…S>ï {O|;@kº\ …çx'+[®o¡ ÌØ 9×çe^ïê]]±½Ö,p¶)¾¯(š²ÕAl5bû¸™¾ß¨§ã tæ²b‹‡[Å&¦ày¯ÙNù¶Ïx¯|%º:Ž lðCñýmÒ)üø&=A•”]‹'`ÂU}§hÂî<")Øé0Pº‹Z „×—l&ܾ}EÀ‰k¡ßë%Sô«³S+ Œè¡(áuæ—¢ »sSStb;Á”Õ]Ë ÏôÙ¬ØgYŸ•ë<:8å÷å–¢_ºç,?x÷“+öÕ˜6Žúú†úl^gW,0á|VÞ÷%hÊî¼Qøó­c|çî§7ð£à§æMÕÃ-P“}ù¦èg³ ׸Õµæ~|xÀ¨Ðu€6è×f ™è»3ô«³ÃÜðÚL©1îÏ7‚¥ÌN³ üEø¾×m_}þA¥;9øC9øTé£ ØgÆ{AFÿ.o"Y¸”_©}úG@Ëœ^(Ë»~{¢¤%³é!@æ”$s¶™±ñsy™a.M~©ä!²ÒÀetËN’€–åTÊÚ®9âŒ{žQíwYmê1Îpô/¹kà`¬þæquؘfÙeãˆ_#ëT® :k9%nÌÒ ·²VmgéÙI»5¸6L›r¼êÉ1ɉ°@G£çrºŽDË;‡%ÏIZEاÏrT•M¾|̹%9iTŒ v‹™0#zÍÂàýŒwV[zb K!än¡«^åoCÈJ¼Þ5S cW'3yDìj2*vÃØn³´\ååÅŒ¨‹f¿6:òEÀäQñ¨|(*×AVˆífÍ" 6ØÛäÆ Ë«r©'å€1ùiY†yµjæ&”C]ZúYÞ•šçb¯ˆXKÞtjP§-kï {Ó\¢‡å­[Æ&'+5#EW³]Ð÷q‘)òŽð/£j›"ž8 öó‡VeZsJC´G8Ñãf°¼ä'Œôm첺€ûa ãVd‹ä„Âh+7jI]ƽ`H¥Ÿ&交D/@o8¶&³@Š^ËåËvd&ê°´­Cî 2¢jY â)[—¤nBC—•að<³6>è6  ”ðˆt¢1Œ…Šÿ#!h?ˆŒÇ2[eÇ©„"‘56>ðM…Ò¨kש“Åý<ÖÅÖFQ²P@"üH`<–íB*gP(&GüŸùrÉ™#·áø |‡^gQÐûqŒ`s€`’YâM®ŸɪþZ ÷ †a»©âÿGŠzžÔÓs4E¼–¶:câÒ ŠÉ )“œ  áiÉ0*Ÿ€,¼4´tKª|N鼜Ç+©Þ º¿…cH¯}Ô߈Éjzéßh/±Mà ¡ÏuŸê#ú0ít•6!Íâ_¢‰ ³– Æ ¦ Ÿb×…¯2|0*7ëžáÂC H9 C¢HÍþ³çÜ–\ü4=–Ѥ˜·i+w„2ã㥜ƒ’Å»¾ À”B>@FäÅÄKƒÞù—h"ŠU\¢©F‘)á#l^ðSTa¸™ºŒ™C£. )ÔÔŽ¿F 7…˜xŽ–&p-: âÜ™ÀD(+š}ЯêćT=6 ?[sÝ®h‚1¶òÐÖ„{ž&ð•s /S=8WsÂû!ü,<+ÈRÖ …"“)ÔWЧ”óYá_3¥ùCšµb—ÍUOª$ea¬íŽ;ÊÿMŒ×³ðÂiø¾Ú ö¢_a¤JRæAΘKƒ>Š”n+Ã}’O‡Ÿç¸{ü>ß 6aæt9àÃÊ^´e‡šüYº¢]Â+Ü%v5O¡ž„º—T6å°†Íl „\¤£EŠxGÈΡE'Ü´WÁÓm…:Øä©Pƒ=ŸÆŠ{§³àÉYì º”©¡< m Dd—XŒÄþZ}Ku>„8Úè—uœk‚w§/,ü™¹Œ’ÌBܯVt²…üJ2Úª”|Ò£B[õF=«æq5æ:%Yuõ@>ê.°}á<N¥¦ÀwùXîSNdžƺ.zþýˆ9õ`PÐ\¢ E‡Ñ”UåE½]¨÷¹@·ùµ‹Í$©C<Öþ>ÃÅN»‰ƒîëÄ“M|—¼1YÌhæÝÉRãš,_Lrºæ¶ Ó^å®X÷›äUxE<ãûŸ„wÄ¿FÃ--dw| _r!ø5ýÜÚ³§ ókùrÿ€3yG/€€/‡M9{ÿ¥¸'åðj:.¹Tü2ˆä`Éiw씸9¾CŠO!:dU6Wôÿœ¼îç/àñ¢šûnRð‹ð¦Xâv”B"ÜÛg¹í®­ˆpÞ7KÚ“ï’m‡]î?/>o^Õm*ÑwÊÒîpOï)mÛ£´Ü‡8â­¨ížtJ ñ]@<>•A{+|“±‡±¿Ñ-w÷ýձ܇8yxe¹¸=͔⣈Ðý;úá⊴——À¥— ðÛ—­øPçÍç´Ãæ.3½?#­ÛyKÆ:ºº;ó…¿—·Äå‘ Þz)·];¥ˆ¼=ó”åxoâIÁø½ïòÒí=Søyõ§Ñö¤ä;eÛײéÍÒýŸÞ -Px¿¿O+…Dìï3Jñ!Ds§µ)&ߟ•m¿E„;ˆË1ËŠYöçù.Ù~ªÓÄO„¼¯— ‰ØžÚR ûo¥ˆÙİy/w!~£†Jñ)D‡jÿJ$øíg“ð?›³KoÖ@+"øw¨ˆí·›VžQoTR+$â,¤B"ö¦´pbŸŽ÷ê(¼§Fi?†ÍY¸¼§t7f×ß—…ôÖ-w)Þ»ý w%Þ¥D{k~.÷)Þ¢éýÓqczK¼Ü§x;éé=¥ûÅ^î ®ïnIJñ—"Ü‘z{ÈüëñNÖÚøï`ãýôãÇ?ÿö-†"¾Ž‹¦øƒøVÔ—r6óõ=¦x~ ™îàd¢jØàÌÖŸo·Á+;Ái*2’³ç/Q·‡3Y Œæ7ÒͰ½®|É^ ç¬:@)ç*ò2Ñ%!‚›øZœ^¾Ê"kl‰ÏUéøYž·ôûPÕ-^°¢êWÁF«¬^¥áêhy]Kª]Å)qn·rՄΣÉ/2\;Ç<ók,6ãr˜~žêBŸ Èææ°gü2‰ †^DéÀO[¨¨-RÛÑ“–¾ú²wœ$9@²DÜ$,ŽÛm\Õ5šåñþt¯Ö«â\ð ÈdqFÜÀ”î–A„©é’Ü‹/óõåÀ'GIJI½ˆ‡œˆ³¯”ÇÏD#™MâÕ `Z|Mj’ ©!#†.I×¼ä¦Hº †˜¤ëg¾Ñ¥[™_­»¨3aO³œ†³a18 šÉ5ÊŽGÓ~“tiÈ÷¤`IôÒœ:k?Ɉߛ~,"~l¢5{ɾÜKBx8*VŸÈî‡`(ÃtEø ¹È£ê¤úqƒ˜ïÅp®—Gü8<ú-Æs¨$ Væ—´…d£ž/EpáA/âLý8"¦Ž«°xô&C'DÀ& € ¥sÑk&Y“ÐO’ò¡AÖîºSR¸xÔŽÜaÙÒD°@¨R»+Kk½Š]êC”\@`)è50ñÜÈj¥nG8€k¹0™ 9¬æ”ܘèkôMéƒTK£6£ÅݹљŸb£2qÂÔÐød|Fà=·öYlhs%2Ã6T}òM¡ÂtgT—†vÃès%¼%t\(d5Þh8dˆäÉäÞjïI×ÖGô8rç¥./ã^zz»9Oµ`8SuòfáülÝKjù.•2ÞžzáÊQZ¤÷z*‘¤´C@”Qî íЀ¨ÒÐV;îqæÐÄ´`kM<öOº’¹€嬜jmé GΤ !Ž«m"‰˜˜Ç— ²Bkõ[ I\à*&ähs<Ð+ÃtXø ¹Ž¯­ñÛiUô?ùðÐy±@§?H³h«Þ¨WlhˆŽ7×!ÑÖµû$‰8²¾ +q žý`/HžK}ž¾H¹4L¬¦øw)þ+J­"}0Â,†@úšAx‘=K m…[Bä1!{žž ÑVÔCB ®gó ø}ÙõšÎ„Ž‹¬`dYÂ-Ñæ‘>!Š 3+X0»Qp¼f×¹aŒ@–©#\Mnˆ–ri0%QBIâËÄ^â=iÞVºSgBêðʧº (< “~£~‚êuf‹okìnl{da|.F/¦ E›2z\`$Ùm&æ°BNÇ<)Â…e¢Ã™ŸC‹_k³a>-g,= n_$„,¨!hŒ²Ì›pI$à’Ê57ÅIdWЃü‹í T}É.q0Òp“j!åÏ»Ä>èñùÇh¯"U`S¢¼Ó?mNÓYJy¡D[wjð€÷HÌGñqй`Y–Œ-=§$AïÕ)³v<î(…)ÝPºJ,êéÅz(šÑ ¬]ŽFæ¡Ú„d=fLt—_LYVT±Iâ1ýAUábT]òŸ {NÜpµLò!È š‰`—¶ Àº†0ÕlWN»¥“ ›Ï³üžäºÍqá¢ÔëòŽA ÙwrK×%ç¼Ybíçz|„Íú‘=õ Ï€*K Öô7rM—úYÂzþI:¨þ¼{'8éb€iXççßTÃø£üF|(F÷?î«eGv܆~Áý‡ZgQ°ÞÒÌzfÙgdV2›ü~,J"åš)»ä¾À ÝmR‡‡´¬‡Õííä€ÜUz‡]Áj'Ûä¤ëz wœÝQ¹óD:nèê9ŒÅ69U‡¢t(úi”ÇQ±>öoõW4wï–Š¬¥í9Ç D!¦W1ˆQ#¬rû~æ8DLîc= «Ay;&R™9Â\qÓ×lÃö”€î )ûì c‹þU§ÜMGFA4Ÿ‚å€a/:KËc¡‰ »5ÈoŽr;n%"ЦZðÒ *D!• W‚¤ bÚrŠ t1$C&…QÝQmÜ h…aA&Ä0È¿ò#Ⱥj w·ØA„2˜ wyØäØ×,vå(ìÈòí‰]®í3)BB…APN ZaÈŽA £ ¬µ°=œ#Å7,@u{z=¶à›SÙç!Æ>'žIs÷› †Àr¤±“<¡î›Î‰ äABò#:Í»ÝÃ>éÔٓΩÜý¬3@w …)x¯ £ ºä¸€ï¡k!09©ÉìFÄ­}o4»ûYe¸»7(ovæélŸrF8(@î¸Ç¦Ä6;q«àýØvSM™½  W&…à(´Õ“Ow pƒ»nQ.;ЇÐm!aó‡Nh ƒò‘/pÐ×ÝOš#±ËAfŽ Öã©Bù¹) ì†gg³>sXß´Ãέ±›ƒònÉÎ öšÓùÝ€-€ÜmÓˆ­ýçñÍ<¶ý§ýý­ž¨M¤ë]Ý”Lk`öÇ?¿?þþø÷ã›­ØßöEn³üûËOuxæû§MýòÕ³ýü:!íÌ=a]9¯å“$•˹÷ù\»äPÂr1[ç'šxª:ç¥:s½’¥’y{*§ßžŸ(ˆ¨Í…wéÚ%èã9K%£cÃÛ”a“”ñb:Î@DíÂó6ŸéÉòõò$1Ås }O˜.’ˆò©~Fè'-×RfhiÜNäKò ~¯§ læT}e©>NBO¬1q[«O–™èÏÔíT_u>Çòb}”môÏ2:¨ðb:ÎÐòõç}JËÚÅŒ£R¥¶BžÈ™q¡¹”sPNÓ¿Ë÷Iˇ1¥´'óÉ»¬¿×’Z•ÑŸ-’Æ}R¤Ÿ‹<›ïã ;ÍpvÂÒ…¬OØË¥JSÙòvºµù³:UJiNæ“Ö†Jq-«YLYZÒOÒõÀ†íù×)ß‘ÍG[ö 5¹|D*$_FÙT¯³ÓβΠ4@koà´_DØVþ`ß}pïH‘ç‡$ö-ÖÁ¯ÍEC´m»ZÕ«yxY0òq¡ âÒ ƒ,@z¥"L«ÕM¥5í²ò ©|1åâ;B¢m·¤è—H™)ÍâôWO .÷ ¨}4l¾õÄ­ñj$^\ 5¯}@B”¥±–(™)—ËG!^-ŸI*¥ñwL-E´«@š¯T[îÐZ”Ò²úž:ë[[R„£ZÃDE¹¶ j!^;ù QæåÚ³žï¨:«’ïÔçü “[H˜rq>2.Þ瀄(Ó={âù.αû€œiü«ãÉëKél¹[mÕíúºEŽ8 º½Ü;>µwØÕ¬v²MN:) —rÇÙ•;OԨㆮn‘ÃèQl“Su(J‡¢ŸFyë£ÌZš»wKEVƒÒöœc¢Ó«ÇÄ(ÈÎV¹ý ?s"&÷±…Õ ¼)Œ‚Ìa®¸Û©0lO 農Ϟ`ä3à”»±éÀ(ˆæS°0ìEgiy,4Qa·ùÍQn/•*ˆBÚdÓ1ˆ¢[LˆO äJ@Â,ÕÓ¤P„¡CÚ?`ÝhU˜âw¤±d÷E-ÂÁ€áNúÒ&ãÂS ]½Ý•)#)ì6Oí5çÆº¶×$/Âb¦€bÐã!™àö=4gö6k8`#»;Ï€êö¦Ý/-D(L‚@»Ê ¯TaD»¼3²„)èZÈV0b5(Ô·æöZbâ[T°ÀŒ„ÒsºC(B°¹ ‰¦Ý2`v!„!H£0 *sDiîHi#{‡}Ú @¨†$ƒ£»Å޲`7Î69cÓ‰†AéyˆI~à «Ay›æì†l³3*W«>ÇI¾ìFÒˆ¤é,í£P܈aP™#Šrc€jH ‡O¡k!¢Cr—çüv‚|=Iˆ±‡3ŽaóM—c© Âí²é®rÓf§Öda#,º±^Õ ãç‚!P/ È14gÑ`{8•>x,¶@€ê¶¾• ‡+aÈGè©p¨íÏœ¸+2Sw=ðˆz=,¿Ãh™*R\Ä .âÕÇçî¢ô×3 §çAþyÔTÕnÕâ»*?õw®†«¹®ç}¥äzì¯l‰1¼êo„ùJ’q#Žuß5HÔ,È3ÜZ?ª–Çky ^6nÖöÐ2Q>œ!H}‚÷J ’¡þcqm¾´ M<ÊCíêÅð¹U‚ø„ƒª¾MFÚ ½h´TEWX|Ñʋ̤ÂÝllcZ±¥i e[¥™Ï9C}Wlæù¢ ú»èÃ|Aä•ÂN)§'QJõ4ÑߨŠ.ÜjÕºªí9½ ÀQZ±SÚ×Ó{R,©½å­v8wt¡s«'%|²ì¬,ÜK=þZõÜjÈ©*­vs«ñ ~ÖcS†?iuÔ+I‚ƒòÐ?TÏ+I:¾ |M¨Û«/lV8èäKXg|¹Œdƒº«Õ²ç Û©¬–¦à$ÉøŠòa’dÕÃ2&IgÊÅUð¨TO“$ãižªèÂR­«ê54Õež$¥u:30,PY?¼h9Ë“ä¯=·ã{°øØrø;5‹æ{ 4fˆñóRŠÂçÿÙp•"ÝQ ic¾‡î€óèì—Û®%7†Ÿ`Þa]ˆéøÔnû6 ¹ËÝ~@“e!xzºëø—{!!ˆÍÖh¤Ùõ—]åÏe·—½±<ö|&8Ö.ruœTóz½Ðï˜<Œ¼d¸q ›ÞX.,è°(â™áid*E…Øy‹Ôy3háÿHÜp Tÿ8(/‘€ë4Ütô<)ìÿÀ¾ë°D¾c-'? êmH^ ÜX=¦ú— ¶õ¶¬ :€Ìϼ‹·%¾ùYTÍrÓoœ 4½qpnŽ0kî9B¦Ípº TA¼ò 9 =;ƒ}tC|Dª¨]nÉM?s\1|ïß9I3Ò\$¦àì@Z.J Ÿ ꈂGjEVúÁÜp•øàf¹&J¬Žqð¥y0Fž/Ò<$fh2étÊN #Lq®‡1P` üLþ’¼äÒŸçÁÙúÁï¨ÿüº1ÏM OÑ÷ç+rÏhÒ¹lÚÀO%GÜTtH”ÌR2B‚Ç¡ÜúŒü‘‘ËyÑíU·3©vöäËpoœ@÷|m>˜¼¹YmKÆ• ²›"8€ Ì•;îì9sàÎ+wÜÙÍtãNÀ-U”‡Â\¸¹Õ¹À\¸ya”;dÕñP!¹4¸8Yý:`üÀ¬pà°=€Á«®2«¢J–ó–Ü÷ -J_ Oƒ›2ìÒO•EÈÊ×°—\ ˜Ïh­ÒâpÊîCtBÆ—FæºáhžÄ5ÉØ€¥\ >yh¾Ü‰‰UqÌy>2ðŘrl»5ö¤J:š”˜>yšœ‘÷œÞ8=hbººÉY­z—èÓìÝrwDéÞ=Y@n49Žª<7ÉX}A¦7N ›1é>ìäÇìÆ™>cÌPâéæð2¢Gã\ÄcCøqG(¿%úJ÷Ý‘¤ê"éÙÓ*_ŒGA“F©EÜü>Òþ¢’ ƒbd²’ j<…ö»Fì°ƒéØÚv]±«b‚Ø£¬ØÚîPh¿‚jóÍ×Ë-Zê7¤ª*}0Ëåî¸6}‹¥îP2‰‘bŽXé-NÄb{;ªÃ8}}572Û2Ä–9¸]F˜ÞX9µd îØ3-Ø3sæ™ {æ[‰"ØJ 6; {ö ذ5`7ºÔTõWRtn¶ëöXŸÌ EÑ`-{c°I¹'z8®zÆ*x´«¡†îuI÷jØeá½ÌbìeV`¥ìÖ˜0,AR`§-EA)dôí%Jsõ ºdTüAÓFO:ÓAÔèÂ\3ŸuAñX‡7Ò%KãX$?삇âÒ´Œ§)éTª nä<>'-2(ç–Fá.nÂüÐÃQ¡.vê£#pñ*ª¾Óå¸~ýº¶ÖBWl°i˜n±Ú˜<†LíC¶õåC2ùGƒàóðº5Ô1€râ@~ÓWiN•4¡c2Ž8,Û˜GŠ ±oµCn'ªùâ»›l1³x”n{oïÞ»K"é#Êzw&áLݧŽÀÄæˆCvw;P ”Ç ÔÝ™w¬ƒÿv¡xÀüÄkÜ “àñ{–£ M¢'›Çd!ž^uf‡F1˜ftîàq(·V䤟©¼AÖ&Pl-¡ZŠT‘¼ŽèÑÈäYSÄN s¥Þõ·T¬ó¾×˦PÝMØ©èѸ†uiÛRìf– ‚•û€ß(B?à7­wø-EÁíøKÙ=*þ ºÔÚv¿S(ª;öyo@f¾SgÝ¢«rj '3ÞëB²Lï6ûPãó ¯¾zU‡Ü¬@[p)´ÓJÙ¥¸P\p,« ˜¾˜çAĦ(þ8/ï™^GfÑ _ñ¹©ÏÍ#TŒ*‹ ÎvX] ˜Oh»TX5äö7°ƒã¾"ºUصÅì^…Ý*ì2Ðq'¶ãYõ0âë{¿HLŸ Aéi>ã/$h‹éF çË@_Wߦ‡©«s5AŃì47®˜Í—=GŸªfµÀæÊwñœ%p—•»îâf¾qgäNÈVîdÜÙ¹×gÊÇâf˜·ãö˜ fYæà#ó’·  >Œ‘ð;;&Ï„¿™›F„ôSe¼ô”Í7“Ž$JäÖ§Ï[ôG[tÝ€øé ‘@È*L¶ÑÀm4í÷2–È\)Äîúñ´*éVåŽU;Ty4\š†U6eR€«Ü¡ÅŽ"7ŸÐŽ@;œvnhÚ ´iG N{8íi@;Ð|Fk{BFY’ Á&k#sÝð4Ïg·_O¢@ŒŒR.P=“¯çÅ,š×zâxP<ÒôÆ{d¬?@ÁÃqÑÒÙn@ª îäzÛYšÎ<œñŽÿ«/— `D”Á–•fn¾æ8ƒ­5X×ÑgŽX8ÈN7×’m—°.Ï—ÞR9*lBcãÎq"²ÍÓ<J!c‚Œà1¶G ¼Áûg)znkò§CycƒƒEÅXáe¦,’dÔÝç2PñÈ÷”àL;ÑÍq-Óôe ‚<i3âä†OnÀ!ËÙüÇtDŠêSrË`s[&±@?"Z`F9ð š3.}pž ¹ÃÎ#èŽAtÖi·eƒŸo¬V— =wncÍ(\F£†º÷%]d·3ÑØk`¯‘½"»„ÕåLŒŽËž1#;5ôн/éöj›\ÍÈ›ŒÇã4çiÞX=¨BÂÀ­°JƲí{êKR¡Ï‰æzq³É4ë‚G0ʪ+éxÀ>“0ÙW3îáà`¾•ØŠMª9d üPê+!\ÍM(6zâ\o…À29˜·Jë'²Êxó¶øwÿá+kس§>xôh•Á÷åãTO» æ|ŒA1sµ¨¸]ZD¶l²™LE ¨^v`–˜¶­°½¨ §˜Èë° gï{À&òN—ˆg(ÝäÏ,=Þx„c“ï/÷н/:4Jæ5ÖÓÆ’Ɖa3&]À}Ä ‡ë') wf@Õ}cX×±~’4¤4NšKÆ?°ëôg,G–0Üaô×åFhØÙ°­ ¼d‚ ôg™½± ±)éhRcJ3:qð(Ô~ßÛ²e ·Ü}[âîˆÛn‹¸ÍpkÀ­7Üê¸ÍþÞpu;ß{Èß=?/Í‚uŸ@¤æ)UýŽ5k‹ÈÆÉÝC.¥pøð ‘ãÀßûÒ£/G9:,Š7ÓÛl¸¤ ž`ë¹·FáäÇÕãIÚb²×À—&ˆO¿Ðµ-Øê8!ª_ Ý¤QjEìZ[,ÇF‡E^mˆm*Eõ[÷Ç…X T‰û´Åd¯ï—&ˆ'Äv‚¨c·jt‡÷ãC:ÒrLñK7¢Ë¢À|± VBü±ÄŸoô[]ßIÑÃQ\Å#V18WŸÙÿßì_¾¼©‰nÀ¥ÑöñòÕ›/¾nœ·Ôò¥¿}ó.m¹Îó6ðò§G:ÿÿûãmúÍãåÏoÞeú”ýÿòÕ#mµ§IßæÄÒ£Ôø¶ˆçå··ìæ=-ÓÛýÞÅs–è]>؉ho35ïA>‡ÙimÏ…F£öß%ír}®I³§–ªt¹zX¯w9_5– \¿øz_«–f–ªm{ÉK÷ÍûþðÝûLJþùþñÃ__þãç÷(çï_®õH|¦= ÊØ©ºGâ!þB)ÓÎȗݧ|ùþ§¿ýòÝ÷?þòó•ð›?þhùòãú÷Ów×+÷Ü5~—ÒãºÄþôþñíéýWãÕ¶Û¸ D¿`ÿ/Š"öŠu{ÜÛlФpá » ,d™¶ÕÊ¢*Éñn¿¾CÎP¦ä8 ò‹·3gΜ!QY4`²wZ\±wÿÚeVQ±HÆž}f53˜‡Yf#¡€™?s®ó”D„¾”–w‹OïŸb†Ó2sÐV;A<WÚÿiå%L;ç%˜ “c”ßîË^y8e³0µUeÞˆLáÓ‡ìÿc¤¸Ð"Á/ù<ïý ™|O' †*ÏÚÝËš‹¢ÌGð¸¸}XÝ:R„˜IíPfÂûP±w+û >ðaÞ‡8lÔVÙFµýeØ6ˆéF&S(‘ ™[ÚßrN;r¤ÀήÜhF¿pKˆXÄ–*ް÷qdÅJÁ9-Oª-fãä)ucúçéЋ¤3|`‰Üù·rwŽÅœáby^,ýÅ`ç®–±/YgWì€ ›Svî_€KÈ8ñS1³“,S®ÇI–¹]ƒŒzP“w]YïX£Ú­ny](–­î:ÖɤL¼Üi6bb&Ë14BìÒ‚LÇŠ‡µÎ¡[UoþP=üúˆÊ‰“ùëq÷”‘ãY`=7YÜ=~»n ,ÆnË]¾.áˆR[›ÃX‘·ì<ñ˜¼\œ`p|¸—\Æ'ÂKì:òZõ'¥jÆzLyä§„GÜ¥„‡ ¥ä¤[.º9Î6Þ&Èlñ\" tO— £³0L5•f·1iߨm~¬z0¯ÉEêÚ©ç„ð€K·gj­&ýó+ë5ãðÈ…ÿZuÐOªc‡c±gzËr¶)s]A”qàc7®nplˆ~ltëëµ·Z5JRÿ=飑n«º½®6H"£©~Ÿe§½˜c!bWš §è>—ýÞ"ÀŒ‰!_Â/ê0‰|!…ÜÑ=TRüÜÍ·J×;¤×›4–Ü,CA|§< ) &oóƒêAýºéË\077l‹öás_ pNh§(k²;‹'Ã'pLýÅYEÇÔ÷B© ¸GõƒTU1]Ÿi˜fQ"JhìiBJƒ²ß©¼ÅZ¼a;Õ÷ÆŠ@)'`ýdôask/2xéÒg,Ju<¦„.âÅ´Œ@ã” „Ð6袤:Ð{ÆüIŸÔ“jo†póªÓlŸw¬3ßkZ½®„h"Á¢d¥/稺·ýûØõ`ü ¯U¡à&OyYåâ$) Þ@匦M4OJƒâ—ÎÝ×ãZÛç¦2jß+8Þ~èc#k«70³¨Ž›keEnkÌšÖÙÂIÑöœ}Ù#À¾h‡Yô†ˆà÷?'Õð+ endstream endobj 24 0 obj 18874 endobj 22 0 obj << /Type /Page /Parent 5 0 R /Resources << /Font 29 0 R /ProcSet 2 0 R >> /Contents 23 0 R >> endobj 29 0 obj << /F0 6 0 R /F1 8 0 R /F2 10 0 R /F3 20 0 R /F4 25 0 R /F5 27 0 R >> endobj 31 0 obj << /Length 32 0 R /Filter /FlateDecode >> stream H‰Ô—Û’·†Ÿ€ï€K+p>ÜÚ–”¤¢*ÙÚÄ7ªrÈá’9”yðZyúà0ÀCî\˰Tµ"È¿¿n4 àû»§Á 3î~A`þ­ïÁèÍ;rßOG¯a…˜úóèÏ+©??€ïhE+ðáã¯ÿœoðµYOWëeÝŽ›Wàî·Â Ùþ‘‚9S`5¯HÿgeoÞ! *Ñ{È¡VvQýè¿CÒû¨…¼sD1RÎòÝü~·n6Y5!&ÍÇ”»YA§}í4%îx˜À.6³ÕØÎêm˜ú²ÞŽgÚÇvÖtób2š–‰LRKBâ9Òº~w?|Œ¶+ð0ßÎæ-¨Á´y0¿›v{`ú&:Î:(ÆÜ1WÚp±ïç÷oÁ¸^O6àów&*éx·þ£õ,ši‡½û‹]UÄe7Y&épÓ)˜ÚºÌHã=Jw—½ŠPÞ•@àK3®w›Ì·`QÏ': åj³:´íê+XM£49`”'¹/3Âá Q6øÏ¯*ý­&¬ÚÅ7°Ýµóö´M3i&v^:ƒ“Å W„`ìÀóv¼njª‰hYÿ9_î–`³ÿ§Ù‚/»é´YƒÍü¿zauì>U%ˆË”¨¨”¡ aóm³m–:¼ëf1_ÎÛzý èÚÛ-¶Q·]dÝ •7öµ 1ãqm~øø÷þæV¬áýê’…}G=ÅÕÁ|ùuÑ,ueÕÛ¹‰lkS0žÕmÛ,ü⸭%QïVÔU!9o·º€k]¼‹ú›ÉXغŽ7ûmAð¸ˆ0Q]Œ\IŸqÝúþàÔi_w˜w6_tª7›Æ”ÛJW„.3£éNïºá„ù6ɂį fBúú6ï•ÕSEþØ"¾vªýF£67访RÔ½N~>þûÃ~¡<ÚUµä\=)Ñ-9W¸K‹Ù~“fZëÂãUk;„Ë«ŽÔ½iZÝ{ºhd¼Ã±S%] ¦c-›Í¦¾·=t½ÚÝÏú&`”ö7ïp2}%»äëˉµÂȨà~ tù¾E9ô}kR7ËU»ù+x˜Ídzp<ñAá’wmDPÒ1f¯o7Ã>^ëy´  ›…nuâhñà´¿âph_¾|Ý€z¼^mBzõžœ ®=QÝ–ëÛ“>ê/º)¿Õƒu«[œ= t»úþ›Ù:¦ng.Xã£ÏƒÐ”™ß¤¾…;m¿À˜p51»³‹ºK.Øu^š§¡T¬¸–ß0‚ÿºiôÁ²u[”=ºìqÜÆ ï¸Ïß}~¥›D;¶Õ»]=×k³O½¨O ñ½h<[­ô¡2™¯›±Ù Ë¥>¥Ævƒè*Y¯&»±.ôЮ!Ò>æŒK RáV¢SÝÍcºZLBˆ7“…ër·šøø3åªã G 9¤!¾rIuZáêËRÈJ÷¹«\]là_¶¬S õíÝóÏ\L±€€A;A,íŽÂÐ\µÖºÕë5Öã åÿÐJð›ùôt×ڟ߃ÁF+´½v»#F¡-܈Qsè-¼t0ìµ30úF¿·—hŒìÑlÂÐÍÀ/ 51˜@ ‰Ä‹‘wn>.,꧘¦=‘MæJëyvp€¨p• T$JO7ÚGr½®y@­4ŠØ1ËŽ‘cÅØ )Ê_NqêhLä/ ·/ϳƒDAò§,h° !ÝÃ÷?£GWÃ]z…÷JSIGu…`ÿ»ô?þn*Øœ$îïØÆ!´„d¶1I71'Ѱ‰ÄýÓa.a.46·+Zí“#”± Ø¸g” Û›ÂÊ¡m!B',k"\8ð#Q'$cÀp•GfЧD$Ç «ç¹13útÌ Ép”³ò1óƒädÁ87f-VáA2ÆÌ²ÑÄ¢Å#ÙH@V/2³ÁCQóÇ*/fY•Gæ®`Ÿ"«˜+`nÌòhÌ1˲qY…˜cq ÍÝÞÂoo—£ßGö·ëçŒò§ÑÎ8h­e¶Yd#«|³ µ–ªÊ6ôR{ÀüùõZk‰³=©µ#ex©zÄ6–[{z‚1M,…ËØð!ðˆm¤¶Öî¼Ê4îÅñ‘›i©Í— Ÿb«Ï`mZž<ºµœmÐZK×°TŽ¡—^ÁŽBûb æä'Q_ÝÚ•g´ÖÒõŒðÌzÒ2h%†™fðÙ6îŽÃiŽYÐ^ÍR_ЏÌÚ–Az ;âî‚ämÄDþa/õ(£g{áKÚPwõ$kYbõÕ­…ä4‘Nø’6ÌÝ0TΞìµW³ä€Ã¼Ûf¤½–%·7ŽaÖ…-•ŸÓ>çhèµÖÒ|ysîµ×²vÆœâ Ë^›Xæ¹Mä…ž)à,ga:á‹ÚØ ç4«ÛÅêk[K¢*o1{íÕ,íëŒ ™iËc{••«X}ï .Qžq¯ –8+è -²“z r¬œðm´Yá’åL+Q_ÝZäÍÖ _ÒF¿5m¬YWøD}ukžoʯi§Nš¥̲ç÷©¼Ü;Î7Å{v™!ã$ÞKyÊLculëZò\æè+…$Y—×H{5Ká¢Ï»m§òØ>ã²iO°ÄúÕF @æYIŒÅº3ð hÁÈ>’4V bÿýù½±4+ÂhwK"ÚŸ>é0ûö2>áÉ>#'†åîÌN)¬œO»i<Ûeìâ„‹Ÿ]QMó4—± Cb¸ÊsÉ O®:ÍeìÁ‚xî,}æ,†¤_‹™.•Ÿ%?ÍeìÁzĹ³äÐú³×ÕÓ\âá,Y¶Ob}ŠS›x° ‘™Xö&?yŸÄN,Kå¹än{=Ë¥Š ˜;KùüYÆN¬SœçR…Yžè§Þæ¸CáÞ3¦;±,š[±6ÚÓçHõš;Gì“zb³LOf'•WÏ[D9̨Ê,U!úNgÕù>UZ¨²;ø“@{ˆEº3£ŒèHÎ#Ib¤Å<ÚÄ[Ç2^€X¤ õ²±J¢S¢ ©=Ä#),[ûÀ¸TŒÒå¡ô$M81Xžƒ*/…Tp† 3ÚC²ð‰}Œå:˜ÔiÌ.#…eØC´–A»(œ•Ý¿Ì ` µ”cÁ¢¸"{F.U¹HŒº,ðÂ0N .\ýaõ£ôX‹±X^xþzÂ…`…µÞC,R¹É—¹ æö°æt#…o®rCHiQxÛN0·‡%å°p›öËÄ(Î’Ëó?êË&Ir܆Â'è;híE…ÄžÀk{3{OL¸W1½ñõMñÀ̪¤RÌ©ª¨ˆî$ðð¤(ˆDìÅÛ–æœ[ïì²ÕvnkЯ?–ŸËoËŸ’Ô–-à‹ÊqÕ¶Àá‡h~qˆ^[GÕß­q¯õîá›k©U:µ§wè GQ‘‹à?®]Áj Fà~=Ö&¿G…„ÑÊËy÷Qå VcÂ6Zy>*ïÁ‘El3ZyX‰L7¨÷যÜÓ-ÑãûË¢X—%´Í>ØŽˆ£¨<¼‹À3¢ã:Zy©q„7cðÜ*—l4wôýÇûÿaÙýûÝèn¡º>ªÛu{e´ns,Iy^U}­Á‰#ÂÐ7äœßÎÄêšö&5+r 6gò65…Úsy­ÊëND: ‹û¢Dt!ø3y‚Ø[ë FTDÞ»c<¨¨€9{*Úb(wÇ4zRȧ¢óÅP·n¼yô±éˆ/„uVÞ †êÏ Ý¸ãx;¸ÝTÀÀv*zÃPO3 ÃÁ¢ŸÎÀñ@n=> ï7Q¦œö|- ©¯†òI-˜áhø"€rra´M‚üsƒ-Ÿ˜â6:o ø"€TÃßgn°ã#Rl²"ÿäàX~ÆáÝ&òÏ ö|$Êv8^E|!DXÂúðF#ñMþ¹Á6Á¬Ãñ*â !ê(¿ó"ÿÜàHnðù'»òÓ ?-‘O ¶ëðj‹œ‚3ObøŠ_l}ÃóùœàẛšBObøŠ3~¼Ã¨ˆŠÈ¦Œ¶áŹŸ‰œ3•‘nòO ö+M x?ø¬UÀTÀðá]G"ž* bö:ˆ'£„¨8b¹ÛzrÉ0`*`|*‚áT³_ =QuP%gžƒ nòyÁ£o©Ž¨jÃGfÏ 6£«©)4ñ,†›ªŽø:ëÎ|Î@þÉÁtôÿ’«¤á¥Sï#lYâr¥+GMRÙ¢:†¬AKðÑH)ÐDºèj ˜ª„v¦wpS&’Q´UQ¹õ4‘ÄÜr”DþŽÈ÷¢x›,vÉr/Èè.÷‰ž€&’˜^`´›×Z+ÀF"w;e#ÑB»ÓD©O”oç“õ|Òz[‹²‘ˆŸ}h‚cLNËjñ6¹ò9qD®V|Í@îÔåL˜3÷93æÌûþ ò.iÛ¸Èö «Ü¼¿¢¼I`™"påG%%y@Ú6Y({–)+Ó<ÉÆ›ÌoP²‹¶^±)w=y7Le•pkÓ´‘ˆw¡wX ڪȬB #nîz>¢m“E¥?†ÍpÝm¹ç9ã*ÓDIZ|\›—GÏ97·ýRÛ&‹ââÓ*3kãkNÏ}.ÁaCÛP$§"e•„Åçþc|Íèý+¶e›,*#ƒ;Y ×Ý‘~k@¡l“Eåìkq¶b˜à¦vW®ÍÝ ×ÝÉêk-šÚ@?vÒ÷/~0Í“dSùðî£æÀ/³>ŽKKg±š¿#bxìö+]éB„ƒ¶MÅ%¤­¹yôœ£ˆ ­MÛPäïˆ|/ú˜ÊHÚŸŒg‚÷ #nz©¶˜Pb‚¶AŽéüæÆ‰ŒÂ›8Q{Rb@7†§®´#ž‚²U‘uÝÃÃwäg.Se:)ƒê_ËmYËÿû{½˜ò™vvÙl ³5â×ËÏå·åÏå5ðÿ-?ê,)ýß¿ÿYƒùŽ´7kcrÂÝÏiùÔWӮϤ…<çöûîün}ã´´O§Å<„‹<Çya²U|*)$©,ohpˆ{'©_EΧ“bbñÅc$«{~ª*K…•SÑ`Ö|Ì5œÎŠI(©kX)%}3Og5ý\ýpZKiã+¬’+®ph¯l¨/Áéı[ä<–5ð÷lÖŒ9ã::×ti®˜‡ò𱬹Íõ|J£2éqÎx4Äç&ŠyçF÷0üÔL]·ƒGgjŽÕ=ß »I¦áÕ oO?ÐÔ/mܼ1>ß 1Ie¥uøy¦§{’JBYG¿pi}~ª©ûÂññr(ëölJÛOÔ &”­KêSIÊ>Ì8@m¢ò)ð2ôÀsÿ¢_†6N¥f3‡*œRí ¤‚ƒ\;ž†雒ݺñZÇg÷‡dEú¶dþR¥G½h€ $ ç9Øü2æ¶Kòå­¦Q/go“À›¢úº4~»¾ôb2ß§ ElþŠx{ùÍCR%›u ¶a^ÆäûŸ÷×·šB}kv9ù4Ü8ßjù6ìõwN¡¾5»\…B¼JeÈwà9¾ÖDs}-ê[³c]?µç»Q=ße’»¾º õ­ÙañyBËÎw£:Q…uÂ;§Pȶ“Àö•Ôòs›pPN£®—Ï} óºJ#]cB9 _å" Èf½^²B½œíÊhÂû&œSÍõGw`ˆI÷¢`¯¾gÂAê„~£P¯f';ååh˜ÆœpÎ ©‰_ [W¡½M(QȾþr ©’³™‚m˜Æt×—A8B‚d^š³„óbj˜D ;Õ¯´¿./*põòШ—³ã”—8zy£¬nœ²¿€S©ÛÊ‹±]¤ GQ¯/ªB!Û_m]ŠDä0g……óí¨™WäúyT£}ù“£HHž±Ûr·Ûè*¯/‡p5Í@¦Æ›ñÐÔ Â:=…-\~bHú{È3¢*Û–ëÅæ®ƒ…Ó¨SÈ»þ*‡¨‘cÆô…l{y7 ÉjŸÙò`ýâc‘-¢cÈ´T3•â—¹k‰h›t"´U‘7o½M$ ·e«¢°ÝpÐDsËQ6ù;"ß‹âm²Ø%˽ £;®74‘Äô£Ý· ö ºÛÙ(‰ê(47È‘Þ:_3;¿iï1®Î´r–湎mcrÚ>ÖªX§|Nq/O^um#ou¥Iòž5h«¢¼ïœ(/ šF%¶ó[tòžÊÍyŒ/9]9íS Y¦§m“EµÕxošà_sn¼Ÿ¼´HeB thm#ÑÖA6$xʦQ 7+­A‰xƒù ¥€©J̪ýmüØÉ,ÀñXÛ&‹J¯ ±¹yôØa úc\–;–Ša‚;->˜®»7®(o¸2M”Äŧö¢ì£çž[T†»ƒ¶M•ëÖj››GÏ9µž°mð<”m²¨»b€¡¹qêbpG⨠­¶¡1Ê6NªG[èm|8ÕDÅÐÜ›òmìȼb ËC›Ý(ÆÉ–œÐ=Ú¸9qòbx›x\ó6ƒrCqÊ6,ʦŒ¼TÑÆ© Ì] —Ý~¥-¦Ú†¢Ø+â Fìqž{[9›,¡2¡ž ¶¡3)‰‚Þ‹`hn,$`AmT“3ïå4o3 [¥FÛ£o"`u;åÛ±‰“ÀÌÐ4Ob».† nºf` U¦§%ëRÿ~ý·œáÍ~i÷¶Ãkà£ËïUˆw 2ÚcâÛEeèÞHÀr‹4+40´8+¬ÚŸËÿüㇵ©«ü0”*l„Êq@¹lÀÊmØc‚ªœ†TÀ!·H“ÊÑÐjàÀt¿rçºÊC©ÂY¨Ü(”’9#ÎM‚¶.‘¶p•t뀅œN¹wªOªô´—÷j¸¶Ð-y €%wGÝ]ÑÜKMjްÈRü„r½íû0”üÞÀbã€Òø köÛ³©šeØôTÖNk5ÃX—¤GXxTUïï—¸ÎÞ÷5;U³Ûƒœ®ÙIr‡5û®æë,åÀO(7˜nCÉ_¹R(MX±æ°î1«ªY†MOeí´V3ŒuIz„…[UµÝÓ\g5Â7ºöFloÛ dŽ ½X¨e€¬Ø^‰¨;Vb'e‘7l²¬ÛOíuu¸öÔ|Qe¹Ìî8-Pút¸‘‰]ò4¡’ÃuÅàuAWVY®Ñj‚«/aåJÛaù ¸#J£|CUöo–§Ú`A7¼=ðLwŸhrËЈZ]›Õu7½ŸÂýì :Ã@ìU=whëd[ÿì¾!3iœZæ?±’-"ÂFÉC¬qæïr‡è(RðÎW1°!±jsÓ£A½„äâä,eÒSG¶¸Lí0âRG@F·èƒ*xS$ÂVýé^‘·ÕËœ†o 2X̧@}ÅJ*ˆRýw ôI n öPÈÝx£ž~ÊhžgÁ›¶]S¼¤BÚø‘éáµá6º!±!öŽðrÓë¶KÑ"ž…F P ÄõãPó!ïL­;Ð&ÇÕËœ‚/>2>Læ<çJÊzj€Äïƒñ† I.)‰ü_h²9<Ý„ÆÀÆ×#ñPÍJjX{qQq×Íé-eÒSG¶¸LäñPÔÁ ç»C. .zeðL¹Hœ„o;4lv’@2G´9;3GÊF Çã”§Î\¸Z~™þãJ®Ó­^’îÛȪŸ=Ò:Íå{MÙ5ÎA· æÛ‘xŠÒŒ-âI•víO›*Pè¨-!s“.8Ã¥£9LÄ+ô?„—É– £¼>ÚÓ%>´eWÜ¡DfÍ̘1­,qt¾×Ð@´éQÂÈÑæìÀ )Ì=£Yd¸L·án¤?)U ½JˆV õ˜ßÇ“ƒðµ…5NB.æT ÏD‹ú墿YbŸCÝ9õSÐHß=:3 ™ƒÁÁèÿv<Œ5È®&e§ù‘8¹F)Cç ÃËô-( Ô‹^W3â6ûà,eÒ ù¡‘ù$[‹ž/ÔPÉ£Rc¢)r¾Úè ]€Ä‡åb8`˜~E"™ÓÔ8^»A?t:´m'\iv¢o\ntA…2¤ñÒA¾ä¨Ÿj2qªê¨FfœE¡ôy« &Í1&?Y|N/ÂuYÀH}µÏOœµ­ê÷P Ç6Õñ䕟"'àëÒíˆ;kD;[;‹Béó†ûP¸‰#&}Í©ax¥ñdþ)rôÈÑep_Õƒ%»–¡azqv`jÈkÏ;nú¾PCÐØq—*"¸ø°¼Y`˜~›DÜ ›m€ã5€n›9€I‘"»tEŽßfg«k‹hÖ?0¨—ü`$ân…¡Å Lº!?4r„WaGHÔâ$2‘r´sÈ`°—ŸÈ†ƒ†é·KDy)Šìq¼ö\ çþˆ¸àËž×ø.À‘• ÙÝÚG_T¼ ”ŽùݦÄý°uÅ=”ÌÖÖ(G(r‚ºê_€Ôƒµ4ÏÂh¯Ä÷‰˜ìžâ,eÒÓGÎó†BRb†l7Åæa!?ÜZƒ3PZ‰`pÝëQ¸{4‚A.úøt¥¾sNútšŠ”¥ó=H7pÛV_%¦_ˆ²€šk˜#N>Ø ™ÅAI"9ä Ê©x^ƒÝ¬¶$šIãzâmæSnN“[ ™Ú!«œ®xY³ gtË”ç¢E=“EM2­‰¹¹éíîÆþ˜ìy£c/¥<ÈU%ž¼ö©(ßCóM-ËOØ؇ÒÏhÆ[ ågƒ]äË£:’ºL2Ù à qìÚ +Ãö–CGZqÙ«9»èâT…¨B»‹fLW’¡oâ#­¾ÝF¿úâNÄÕñV‹ÜV”31˜xˆâ˜«C`9*ŒØ¶¬¸-O´¶9ÐÁƒÃ¾Ð{F×p–‚;¼ºÅ¨ç®züó¶ÁýEeŸ°Í L¤,aÌîš×Ï¿D0°¯¾F³­á,…òCc+,½ ñD</Ø/yçæ]g*tƶG·$Và µÖöÓ› §Æ¿é”½ø7‡êâT¤Ž}Î4$Lü›Cti\Öï ÇÒ>µ¹R|U…ÊMËn¿“ËUÈï#¶Ql÷ÛSôÔ<˜Ö+% ¶Ô”ñçX\yåÌ©-»þÚØ79¾ dU¦cÑý¼ùúj®‰ªÉ´f{axD†épv—p`1(“ž²LUwœÅå•ï6ØpݱO.ÍÐ"üënª¾w¨ y†* =›?x{’=!ÉgoX²&¢azsOžÏ»k{>-ËóÀÞWO­^XÀ y9A±b$¦OŸ`=Ö1§ q_§wÈÓ};Õ|Xl°bëz†ªŽxø‹4œªŽÊ)7òG%‰§oú³TÃáÓô6‘’Ĉ$‘¯EaJÛ, ê• E$‰ç%³×nØ…=î|ìAÐ ÓT« º«˜åJ%ó‹añ414®®qÆ:D‰¥ªÂÈt#»ämús„YÒÓCëUTù£ÏhOüÃû»ŽÑ4.:Ëý/ï>ø8-Ç}(—0ô7wÛöz„¾ÿ˲ÿ¿[^l?[îÿz÷2ìK /Ùáµ¼›·å8‹mÛýÏ—ÑÆÍ)]qÊàT®9Õ+NíÚÄ.Æ—fœlÝG;^†Z­²ó‘eóUñ{ž/·uÛ¤#Ç„_l×ç„X’ÌSæ´—a£%8ú§™?ø8»– -TîùR.ÜøW¯ß¿ÿüíëåý—ÿz½|ùÕòá?¿yýž‚þêþîËQÒ¾ä2êâØaËË»×ËË—¯–±ÒG{޼ãÞùT:íÂû¿˼)êH¿o±sÎû/ÞýýÛ·_|ýí7#ã«?=þn¹ Ëø{÷v¹Kûvì­q2¢¾Ö•2Ý“·}ÁÿŸýú˜:odr ™܇Ëï—QÉŽ71Õ±Ó’è +gΊ²w·eü ž±‹ëèèlhÝ#nâWŸþö£ß@))ò©¬Ò#n3݉JÜfŒÿãØc2JM¸,sÊ÷ðŽvÆýÓ'_~ó;Åêãw¤{s q-“XbÚSw”ÄLDCý¿Ä) »m|ôáÇ•JdÑÿœ:„‹y“œ½ ÷DÿËù¬P´‰;á£37¡Y‰7¹¯8c”·Õò,Ö"z‚?iJr`^¸Úа»7 PD!U¨¤ç„Ss¡3j0ÛùÕ—P\ïý;!Cos?‹t¹ˆG…uáÝß7IˆÀSž ©¿‹²@šf¾ÐD47{`•±°YÏ›uº™ûøÍRæ$'jƶAÇøÍF.T“Ô¦HÉúÔ/R¸Î´QqËQíªqlºÆvõ°é‡mÕ­à–}ø­B5Ÿ/âdVia8•…ðªP`øžÄÇ©a b ‰±*l©É½c_ÿôYµúqdW#ÞïH'ºQrŠ«äãúsßuõjbW?=9oxM`Œ01ØŠ7[jÅ>67Õu3…3Í«‚àsâþáp£Pœd¹42l~?ÝÖCWOlU ë‘]×Ó}]wlºïÙy¿ÝUÿaï®$³ ¾y’×AôTŠ2˜õ89§2Pýé¬ýÏ>ÈŒ­\L0»»í¿š®™Æº[ÿö&D¦˜eÿ!êI…ZJ´Ë»í»jª>w—mµBpÛo8ñ@’ûKÈòlÚ2V jóu™ÙÒ`ÖÙn¨ïênH¶ú-ÎFÇ"+”]¢ÞT‡ˆ‰ÌXƒ]õ»WSi¶W!ÉPnõnͪÍTlªnÜ6PŽ}wÂ6ûÁ‚áõ‹ è¤8mhQÓ­†ºé’mõG³Ýoñ8i¨ Ä¦4PîgBSž=—;BIž=êà°tc ný{3Ý:KÆšõ»©Ù6V¸6ž0R‘TE¹‘KF-R@eBä‚,S\q ý]³®GÊCèYË8Ik¢K¦¸1!ºÌj«Á…Å5'¬í}eþš’¿‚IRkyi‰ã¤TÈqŠÿÀú »¿­&²7´ï¥½ZåœR#n` €¿ZƧþÐ9:B‘l¼íïGˆ2œë{[3bd´¨¤c 8Ÿ`2½nkvIb_¨ç_#ÝöjÖÀà:²‚4Õk¤ÃhœÙÓhÌNßµ0{ð€4æ[÷­®ŸØTýøÜ¯nYµ¾«º ú™‹Ž?üëþHIª´¶D“ÁÊ@¸«•k(›ûf ¶ûØ€q}çÝIË‹E¿(¨_è‚ú0´jÁaÌŠß™„ÎE¡³DõxUÊÌ',ÀÑA§Š¥>ù8ŒšÈ%².$ÂD¹[¹³‡sw—¥>Ó8¦Ë•Iq‰ˆ þªOëû쟉òÍc@¹¯äIavu7 åú¢3“±0¥Ú"$HÉGô¯Ê䯄¸XÏ_P uð±¦$¾¿s ö¶ßßÜÀ§ ja µÕö»-п/¤k׃×}W;p¡Ue ÍÃXšg\JAõê=zÖêWENeøáœ®®€DÕ¶.±ËæbÕ3~ SÈ9õ•”ÍèÀYIÕ S V¿Ñ‚Xœ´DËWûá®f0Š"¸lqy®â©k°êè¤é 6õ½ËúÊÅÊÀa˜P.€UHbâä)e  @ àZå}åj*Þ7϶޸ã7Þ`ª&ð˸vCãy<ä¡™@¬îÐf E[1ïJ[=߸’ïwÎðn;ßM¿ÛŸÝqj i5 ‹µ SFgÜû`Q-ùö B†è勞b•@CsK!¦½‰ìv%aäÖRcãLè\æVN¼ AËžPc"Rq ·%‚ëßûíuÒ©ÚÖÑ[O’è£{ŸnWy»ýäâ:&±ãÚÌÚF‘¯=,Ì?††kŸœ÷Ò2ÐÖ*d"€žÈúCühÊd}è>C9•UTÑŽ=ö]‚$ø4ÏõP 4ŠYŠ‚À®&Ë¡‚ÃÉœËÏ—ïa¬ìõÖ+V§\^]uO¡»zx^À>Ψ,]ØL+ )Ç€>šØõƒó¥X˜ÏWñˆœ@ìò? g²ÐšäEY"Ëz±•_¹`ð£3Î5.OÛiØZµÀë'Ô$7Õj ±«¾•]Ë“BǵÂ,û@˜S'F+eøb´ºúõâêèÐ"8VœÎ¬‘¨üÙuÛ¯~‡B퀈PüO«[JÏQ™­D:H.§>±4íËùßž7Íe2G!˜;ÒÆ8_˜ ¤0”;‚Â+w-ç4¶µã®m | )Eزj·k›U˜/ØZCF4úRe’ËÐÍ^ÛHrÄ 5\|t-c—I=@=_< MGLŽSL*|©n‚ÿ“Àá¶ ÌÛ¨À]KQ °ž€_¢•—çŸ~‹u›ÌY¯›n„ÂÙ® Të$6ŠÍÐo_H¶0v!°Êg*äšýCŠ)ÿ b ƒ1Áf®^–³ ê‡Ì©õú3, eÑÈ& §“¾|¾:w\ÕãØ(½EÈù¶œ` ·ªeËØ-n{è…B©€¼ò[›/J£áVGwBNòM\ºI~:G[aÛÒNQ/3.(ê0X޾~@ 8™œº«š¶‚9ºÓ[8Î{£Ï”Äš×Ó¸%±¸Öèâ5é2àAá ÏJ‘fÌMÊo̾à‚$Š)çˆÀŽP“ŸÙ&ö½p¡«+˜JŠe#ü]ÝÖ¤­¤~JRÜFzà Ó}‘}ïf9hœl×5w«_1ŠùE/Ô{‰.AC”Ëš s(˜]±ø çãi Ðæ{R«é<ã;Y™G³r*FÐ(OêE4Q‰‚äyãÈÙ)OÃ$ñB¿¥©ï[é€@ÍßäD7/pbƩޒ+y‘=)Ç<ð"P†2¸;ª±ëš­ú. !^8yö†"(´u3@i²£”vDG5 ‘Ç ž]}¸ØÍ–û¥éö°/—Xàò1^éº x‰ˆ Oœâ²gj¡r ¥²¹ŒMJÚ•õXƒÛÐI§}ç &V'à§:_è¶/NŽèTžÇY@Feâ7k3J;×èkà›1[iTþ Afé#ræÐ á "0À±)BQ½¹ =Lëf%óHÞöÿÔ’…€S1 #'L²M[Á¬ZƒˆŸ‚+ÉÍÔœà±T9zN>CÞEPi*,Jf7.*Ô-Û~];”»´®7Õ¾Eò-‹TÒ-T /ŒI£vÙ·-©Jiú($M«Â äÅÖîú<‘½Q-nüÉ)[ºRåG¯äF<´-ñNweȇ9vŸÐf1~úoïÕ²Û6 ¿ ÿ cK‰"%]¸E.…Q¤ KŒ#T–=ê¸_ßY‘”IÇ z "“Ëݙٙýº«JýÀtqÎéšH@·YÎù툈(- m;Ølqh›BªËæµk_+xvêÓ|zPƶnjú»@½êÅd“YqìéQrÐìØâi°ð¸ðp™ðó–g»luŸqKÂ`B–µohŠ=Å[œ¡K¹;5î5’ûøÒÌ;?å0Ö¨¥éT?ù«ÀwÖ_‡îb›Ç¥j+™Ýæ¿Þ[{”™†CKDbk"Z`\-Éd=4ÁF5¤ÅwÁaŽ—¢Ú{ÔöGɹme”dÜeÿÜŽu9wRºI…€Ã­ûHnÞ]:ö@O7{ƒå·OÀ¥’ÏPŠSc!fÐÓAóã‘•ÎÉ:ãÌ›¬'Pgø{a‡röFKCaú³‡®–®ÇÁ¶ªiüÙ•J;üûÕ/zÀv,žÝýtd  â  ¦«ÌË|£º/?USª¿Ú‘ºÖ<·¸ Ü‚ñþý5¨Ð¦ºSy¹+ Œùº} 0µ¶<:N§§º¡¿ºlD©o‰±` ß&GÄÔœqÔ•.ß‘­‚'æ·yS¨kY1u$…K™Ñ¹Žìúäu·9tÜRsRJ@ë—^Ûøœšeê(D³õGœ‹-™üÍ» ̘“v'‡-¼{ŽÈY‰§Ü†o…¸É4ɂǖ‚h-¹-ã4õfç·¹¬iý†æäˆÛ„‰“gZb°Ê»zmvÑ1z¦Ã§ïa¬à@õç‰f¨ »ºí)8µ ÏàIí*þ¡>¹:I¦Dj2ñ…ζ8ÛAZPifV íV•…ãš ’-ñó‡V«ååGyüʸͳ"±Qéñ~E :Â>ïÀÿI±’ˆš+D!o›J4_Æ… |h„¿sm Ê\û1%9[’ÊÄ” žÄ©–Éøšðá ˘4uÀ´f§–74nÃÚCGzöŸ#ÆLƒÿã^Çú²Ïb‰·× Sšô|héð…gÇ龟›ƒyfþ^mò5Vì’ìB£† È»‘–Q;˜E+<ðÄQbë“™9?ÞU½"fQÂë«mUçS#`-£ãÅ‘±•Ò³ßôžÑâê –ŸþY»é endstream endobj 32 0 obj 12423 endobj 30 0 obj << /Type /Page /Parent 5 0 R /Resources << /Font 33 0 R /ProcSet 2 0 R >> /Contents 31 0 R >> endobj 33 0 obj << /F0 6 0 R /F1 8 0 R /F2 10 0 R /F3 20 0 R /F4 25 0 R /F5 27 0 R >> endobj 35 0 obj << /Length 36 0 R /Filter /FlateDecode >> stream H‰ÄWÛrÛFýýÃ<ìƒwË‚çŠ}ÍjWVKö>$)DŽ(Ø$À ùë·{.†„%¨œªÄU tŸéËé˼º™šJ¯•çœ9-ï¦Íf±Ý®ƒûg—&@ˆÃ)•°0i¢SÍ ªWU7_!Uëu}WV+òÍ4µ£O“ÞðËTi{l¥DoªPyîÏà4ðŽÔ ©+)Éçƒ1‘ªXÁûÄlïµL¬“|Pà>P2×þô®)ªvS¶-DÉ_täê~[´®ê[ÓܘbIêkû<ÉC®X°ƒCDn½5 „¢ÕÞ 7‰UMó!^߯ '5:ä°‚…à|œ÷V Ÿˆ^ˆ[”(Ê}ìT¢²|¨8ñŠ“_¹úÙŒ^îÖEƒMkÄdš¨”Ç& ºk®¼lF½è¶X|-V ûÖ¬!>Kˆ4iLk h.PKbZÜ5¦Z|'Ò"ãÞê,Ï}'yeš¯fmîÉ™e8ÔáiqUCìëæªóòA_âJÌEóË¡W'eµXï–Hæ!X4Ï„Çb:SC¿h¿æ´+G–M ED®¡ÊñëÅ}ûߺª`’¶Z*… 橾¢aV¶ãDö”ÁVûà0ø¹‚÷ít_lèÌÓý®„^ZWë{ º6Ek, ;<ª+7Æ-“±«Z/ö`ÙRå¹£p˜ø\BX0™˜ƒ×§ŒRJ¬Ó¤3ÿ% °¶{xޏ™Û‡QIîÃ(µö¡hêæ©¢Ä‹Q$AÞöûRu2‚\¤!3LøÆlšx{md1׋ӗg êcÞHí t"²ÜCE\q¦õ!AÔ–Ü™9Ãt¨'?h$ÔS :td`á,ܵÈeX=ÜÐIR_÷™k¦ùôl;DTÖ'U{Ún볩0›-Ddqóü±Ržìe–¦²g® GBX|NáÎ<ÓS–é9ƒÆ‹RÖÆÒ-—¸iR$ܪÉ}ÁŽê4MXbó†Z—WMÑ”¦uÖP‘ÄÆLºBOÙn¨3¦ý¨§‰ôÝôý§“×ÿÆÆ[êÆ[EÞŸ»—ÐÃÈË7'ü;+,ó,  ¥¦Øïš{èØ]½Åæ‘°û!ÔW;ÁÑœ… j¦ÂÚfªÑ|Ä6ï‹ PÝŒ‡É:G¢"q`2àow[d‹ Û ûÌ£yðYkÉÇe •¾]ïZra¨Ö³Ñ8Âr ½<Ÿî$¹ßÚa‚ä¾2ߟ>…ÛvØ2ÛÚ¬°L²ˆEá Ž?² añRî;Où(B#ŸÀ Ê‹óÆæg‚`©ÐC:â!O‹Ç·&hS‡%Ïy: +êÛ÷AÂíÍ’3æ”|¬xÂÅUdR«Ó²)ª{h ¦qa–Éöæc}l™v†]U\oÛ¢)6Æ_ªBRÉxM¢yÊüìÈÓpƒú‚b¾…;ßï_‹ºº.WpM%ÎfÛë£4PN}O ÿRöÅ;>t"I<*~ƒlY5Zšùöóì pàÍÛOŸ?œ¼ü|ññüüç—¾CçƒFÔíl××ÞM&Ã6ˆ¾­ ᫺^>6I¸Löow™eÇ]÷bû6„üÂt]¿âå¢7íéîs!ÝÔzv[Ÿ×µ?¬î"˜fÞ8¦CO@!Å__¡×mߦ¤Û±ú&ÊEè¢B*¯Ú”öÂVe¹%ËA(ÜGàf±4ßnë^Q7`2\[˜öÍÀ´7õzùœ\íúí]Ñò•Þg˜,óU {s[%Fµ„R-W°iÃnÕ³´¹Í»nŒù6}ëÓD_5™ötØmq´ øîzÉ57–Ê(qž–ç'gŸ_ÿüñìò`åÙã$J÷„ƒ{Ï$»°úÀ¤l/=©êÓ“‡Õ;kS”Öìô¸p[`žaú§o‚:Ü—˜Ì}HnÌzë;b62Áu‚§ôÞ9y¤™âž:!•Й`w, ˜SMQ­ dÎj¸;Tær{±Åá}ÝÔ›‰YO‡ÎÇ3k»¿-Õxû"õ®å7»JXåLGWÎL k æ¾|ÇÓ-²ÙŒ¥ïíå#ø¯Y‘#®)QÔžÅ3« ½8Ý“ÏwÄÿ’ä þzOÀ/ü÷á'r$¸À”hj‹rCŽ`C½X÷/”LñÉËÇOƒð 9º G rÐì9K‰µo)ä¤B#ÐЦ ‚(2à_¬-à/¦N­—³`µN"Tû<šód.f.âXù¨)Íça‚`ì¾1… “a®û°¬Dî»ç)P¸øÎÅ”,vß¿˜BU)þo,ô¦&Mó½xºS˜®NçÁfYOû<ªíMhæ¥çPŸª¿ÛìWðEôb³_ÒÑ‹ÍD_LØ1A>‚ÆU·X(ÔpTÓ±H_’qFBCÅE …Љ*(é ®ˆXÈÑyDîøsÏϘ°±P`[ľHä SiòI8 AÿYLç(³&|O᳄ë“ÿæ~öì²ãÇ áãÈg>îï">†-ÇßC½œ^{„<6ô—iXA¦MÎ$ìdå³y°©•ɉ8ÄËÆx’ãÏý®sˆ—‡¸2ìÁ‡¨ŽEÕþŒG¥ú®¡ÊŠ7 2ëmµQ=D€,¬ž«zj¥S:†ô²£*Ï<›÷á=C”ºû[Â!x 5JNb¡,´˜ƒ´l(&aE„9Ó\{«xØ\±gn: Wôæâ™L§cTmíÈö†C`J)FYy_z3ÓGì#Y_ 3 u2 †šj9êhæŽË†¶Êƒ¬Õ”þéÑJpÊcq«ÿå=ÍäiÊÉž~F”¢qËéQ§gf«ÒV;Ç쨃eõ;Ú#i7þàé`‡œÖdGƒs¾òH|¬/fy=–¶Ú®Å)9ÏíHÜêÛF7÷ðAøGus×Yà1Gy,ý·kÛ. òyʃð_¤«ç%z,+µ|‹öïÔcñ¿D?_}$mµSû,gj¤­¶[‡R5'ì‘ôk3޶h:CµëÍóøÿÔ—KŽåº †WP{ð8ÃzK+Èø&ƒ^@ÐInHO²ýX$%‘:ö±\v!m4P8tóÿ~ŠÖË<ûµÇï0;4bžÍÕnh¢ÊôëînBqèáÉÿW-^†âØ.Ó½Á{KŒcÓM¤sýж(²oP¯AÜ•ZnUê1Ó’Zuq\Ig—\¹_Ž¿Œ@+Ò¹þðÒ/äá.w;y5tSh©U781[nUêQ™FM‚²µ4äéwêÕ ±¥3“7ƒ[n˽®ÔaP¶&‚&MÞYaâñƒš51k<\Z¼é~˽EiG&jËe\!al9¶ÜëJekbÖØ1½WC‹ŸgߦvcÛ4Ïu@ÚÈ4j¹·(Ýà"Ò³>æ¡{Çä<û.µ;ÛX2há¤ðaìųoSûÁë²HÏú”A>¨±®ñì»ÔƒËƒ%ƒÖaôظEúzoÆÅkîúÈ-x½t–é7ê½9¥ÇtÐ;x‹C÷!ž|v¸l– j¼q„±ë˜L¿Q EvV+;Ÿ0çÙw© gÉ §º&ÒoÔe×µ=å.ÒoÔû± ®L}˜³'g?hë…­S8²â\bÎ~Þ5vKyëãcnšìG†t48ªµœ{H'Ç!,7ÿãp*ÿe,;> lQa7§˜Ke˜gˆ$*Ÿ!/,l,å§kóáÚá{ZLYlØÌ_E+YÓlOèê;WH.º8'³ôË"=EMï䃂ð š:±ÉÙ—R”¡N#F•*1èü³TQ…2‡LÔº1š9ú(3ÝKIbnª(Aý,^ÎRL¯qÀÆË(~À& <°òAÁF†ªš4·W¶ÔèâÊ—š‰ {ðg{ÀÚØû/˜øž¡ ²¨°…añ}@Ô¸ -²·Ø@Ñ0oÝéÔ,á eû]zaÖiëÆ Üéñ†©Š@_£5°&‹¹¸d“)…‹ažu¢¸i^ ô@Éwùeœ¼)ú¥¬e«X°‡€ÛVJea¾C¬evzL©ò–$%‚&õK‚…=Ö/¶xR¬k+¤a,´Ê/!õ>6K#)q5~©¤£vœºÕÙü½ç\^¬ƒz¥*ÄÍZ  YRí 2ªêCy³ü2Žƒz½®g½ËMàñ6‡tªÜ Ž9+yØ èºë¬‹µÚ®¦\B­ƒ;™7EP|$² HQçï[EKWF•0€¶\"#c^ÕkFV{=y[NŸ·‡ ©s¾‰eüïÔù-ÖE^W]låI’²yx¸W{«~ñ’Y ¤ uÇ zºáp!#™ÄU2ªPÉ0xÖ‡uËsøöî ®îêGjȯ¢šÿ(ºyÝT…am'yyP¡ŒaëÂX/#Twò‹;l¡. R0„Ô•Ò^%ŠúØ¥ÍJlÙyâ2y_¶ˆA;$!@²«K¼ôZżë;+é/¼<(›~M(ÇY ¹ÜêÍYs¬ÆÐôÊr.æÀÕ/)Ìîc/Ä&nC¾ÞÖ“Âñúh¡p•Ê §ý§]QÉh‡Aó:å Ü.þË˹HùUÚ:ºNܶÚÅYäöñ‹¶-¥„û/‡´[‹z`A(ŽQ0êN !ጒ'U’¸Ãp ®ð@L‰+åÅAn±l4õˆ]$#:çEºß‚qwJØu\ZêÏ‚q+¤³ñ£¼\å ¢®…BÑíÕ äB€–6„r8H„£)X'ƒt Š2Ý«¤’²Ã¼Ÿ±& µüÄ&pbâ03-U’ú@߯Äñ•N‹y+¡$ÖšF[:V•~ ´2p€,b³¤ ‚ŸàÜúõ}‚ÿñ³@cØX±·Š¢øÂ¿›’ÉË4ZPXyƾD}£æ´¨m8§¸ñB7üò ó¸‡óŸéCMËúÿþcE ×Fgý¤t­ýÇômú9}@øßéc…,zâÿöW!Í £K´úý}úøcÚô3 š)Þ«1¿æ 8æç!'õŠÜËê#Ø`lË|vhd^ah\Ö}j\ž!N Å:.xgfÜŒðàòOšûfxãÌ"ʨÒÑ‹ ÇvnF·xvdÜ"“ü2ìÉ3od',…Xš!¿ª;×ÒFG¯ÑáÁ7Óg†gúáù1?S‡—œqôÂ.̃teë'ã¦l0džþsÃãÀIÃïj=—ˆ×Ò!ÏÄbÎ6`jñA˜<ƒ.ïñœ!ãfÐŒ­Ãs~Òlô3|!ž4œ¥g2tŸ`f£ôógíºá¥y̰ž0Íí|ƳydT´kP¾a÷£j-=e×øè†˜CM=…Mî¤%3ù¤+nY§.4¯¶t4§·žGÔ $Ù׈…ñ%À„§ [æð“cˆ…cËéKÌÂxÐ.x¨8{´ÆÞC%çkÁp,]ç2 `á0pþÒŒâ€â†™Ê0_ˆU°‹®×ýkå˜b=4eý*¸Èåœg‚5|‰ùxm–1Êàøôž Î3Á¿ÂÑ ÷€Ë1Äæ }‡A+ä9H ›£‹W\Áy(xý,ŠîbwäAÈ„H×ÖÇ<ëÌäÒÅC¦2L“_âÅeÔ ÏAzøîðJ]¤ ÎCÁq.~kTFÆ‹ûSƒTäÅå^tA«‹e ÎCÁø‹Kp88ÜA _[kÌÞ,W •ÁßÇ|M:aÌ%b…<™–ù2±2tÔ€‹“Rp v \ý½±—Îy ÖÍ74W`ˆM÷ô6u½}VÙù*£< oé*Ç<«í-XŽy 6ÞÀŒ®[áä˜ßëŒZ³òM¦¹Ë~}Ÿ~LߦŸçMãÅKF6ÍÉ'=Ãooh4ôÅY?)=ém7–”%F—è-yý¬ÊÙ{äÆI#{ÈIûÔÈ©V Sî;Ô›¯×{`B5 ÕjÝA­“Ó@ÆZëÛÞ °áëlÁú}d`È’þžšïf9+¾-µÂ²Æ/cèHèðæ5Í1¶)öû@DëÕH±Fë°Uáó]°oÔ0”ëʬ|Ó„BÁØÒ¥B X³ K×—eyô…Њyƒæ°¬ мŽé©ÍáM¶@ÛŽ²ƒ¦>oƒm¥¶Y¼ †Märßç8FvG%GI.ÙÏܾà4’ëæv§‡eM´C診Ñ8HíFÔÔ ·;›ì“t\+9È€€pt_‰®½Ë=8cωc´//Ó½­½á>G‡F¾˜ÃmïÐÌ·ø¤ø[Ý¡ ÜoÊO{wÞ :îùé€ìÄkÝ¥#”} ~®òÍÒìB{:ZŠE.w!ð8AøóÕ¶#EŽD¿ ÿÁ,Ú*|¿<î°Ë;´4Ï=lÑͦ„f¿~íÛÎN¨(:wª„Ô”#Î9;Ãá0!€Ôd§íð$@ €¥×Iæct P#B Œ"¡ Ø9ÍÞJXSÀp7àŽEÉqÙ~Z²†bá"{Û(áL°^äÇ7û•PÇñÕÃÉ»]ï¸iG g"Á°?ßïdÍþr|šù˜ifá»»p¨Ñè\J8ܱþ•1Á9²‹}G?|Þ‹Hš=5!PÅ€2V’p&\±' %á%óhTì_Oópùzyð-ÔÉãŒ$¢ðJ3Ɉhüi;üÁäÙì•eWÞqF /Aç#KWãUâÖF‚?:œ¯ùUu`œD*Ý1 ”p&×dع80¨û¢¦„5œ„~ÇkË¢ø‰É¾Eà~¼@"sß(~ :´:ÞH&»ÃOKηA°_áL".ˆ×CøiÉÚâÈrŽÎD ÷EƱ?Ü?-Ù\†ç‘'8%ó'GI8£Z¢cêˆýN܈_ÅíwåÃÁµ¹ü ¦bù–@]’Ó²ÿ ÑŸ./ŒLÂY‹Ë^HPß_‹‹'ϬPj+­*ž·¹U&©üûMFˆË¯â‘ü›¸üýb“ ®Ä, )‰fIº/‹G†ü¶ä·#¿ý$â·U#, GBJõ÷¥ $ó"¢…ÀKtÊåx£‚mººG ®Ü7²*Ÿ÷©) ÛVg¦J ÛÞ¿Ë9 Ìoª»x;b£tB|ëì“gn¾ë2©ºë[§•Ç­¹»»»ºÞ‰»wÿ݉w·â§??ïî@ôçËòYKžlJªè˜3ÇÌúbÒa¤å··(vy³ÿøåúæÓ—ÏEêåoŸº’å_I“\;•¢M%×Þ^ä bÔbüï—ç…€×FÆ›ü#Nf¼†T6Ƀˤ.UÓ¶¤$8Ãv)#³Õ«¾328š/_½xú¯Íó—-úœáÖ”¶ß{YæÉ%ÖCò¶ê–H­‰pލ‡„±Z‹mºuèSÄ¢c!´àCªŸsõU q›$±ÉôEØÂËëðŽËNˆtÃaOÕÔ¼ŠÐªÙ®>yµÿHöuÊŠö(ÉŸ¥Uið!ÌìB{iØrJkr#ÍB)§ÐLjgåÅ«å)“ßöÇ(ÜŒa{ÿ“Ö½¢\¯èÓWMàòP_HbÚá~q,ɧjEÈ1»TÒÓWb#žÿ<$`l;TÎ`\¾·“hÍÕŠ¬ƒ²¸®AæQû)Þ †ÙœžÐ|ÕCŽÂÂÔY `ù…¸:º%%¢w#.Þ>Î ‚Sëõá0оRPË£öæp·¶:U'©®†8;„UR“k˜:Q1[ ·ƒÆ›¿«öxD’mßõÉ3…Ç@;*‚%Vß3Ç'{žàùÞhç%'‚«%õÙ»ë/9›ìV ÙNdKɹ×¶ÕÚµr¼âx {Xx¿m´õÐ ^hý¶QÚØ‡cAŸ®îîÞÝ^ ñi·ûqÿáêöMžåêÍþãÝ]]Ÿé×]‹(¦a6uë6xœážíM^‘1í\hçÚuõçþÝíî³xõô…·ÿÀEÁ.°•oÁØ• „fo®öÿ¹¿í>ÝínÅç¯ów[ŒIùiÛxŸx£e(·1]ÚP|tÈ7ª+)¥#ä®–±U-~/=ÚË\ˆ!éJ’BÓ…éæàÑRG:Açñ¾aç㊾ ñG³æ^ æT¸uµÀ׊¥`z9Ío Oà˜6”§K£ÃÅû…¨¢aAÖB’pu­¦¢y´ èÂ1Ëwq\>ŒTƒ9bùÁΖ†Ù˜ŽY~¾º‰hÝW´’-—¡A² ¢Z±§V«aOq¼  w Wï"¢Š†Y¼¸ºKçÙXbø°px_Ïmîè×3Ó‡Ù=‹a‘oø ~äiýøÇy€àIœŽåàl‡Šž±ÐÈp`æú”øÔ9eîɤ%!ÍÉÐjH°B÷zþ!¦^úà £¾ó1B!uL 6?¢(¤ifIL˜nø^jé…ˆõÕ`PÝöDmŠhHd ƒ @iŽHÔäv.AMÑeB#û‘ à†Ó-%=Ĩ3 µ(æQ?’u„œŽøš¡Ÿ2êmã⌎,šÄnç[S6Œt¡6Œ)uD7€;nGot&]œ&{7ØÐ=ËàÖˆÝÛÆÄIk)5$¢Ú$Ð ¥ÆI/Õ*`u‡îû>;6¡¶{»ap“Ê;ØØ ¥„1$m‰awhírswCwëÁ§¿ïÀ®ÎØH¦l+ƒ¼ÀÊ×mü@'ôy&?:ÉÜÔFAa{¶lˆ6cèVFÛÊ (Mn*5­±ÀµJµÖƒÚV%|¿L5t0Qˆ¡Íµ±AÎBƒH7ššŽƒ˜íajÀ.â *1­ñ“U¤mGƒ¦Þk0$æA¢"ÝÐÝq;zã–á æÞÜÔ´"$äA¯ûuôcŽhòOrÅôñP¤r­'Y<ØÖ%M—WG?è€w‘¢gšVƒ8©p-bXÁí`²áMELëA”º¡¦!ÏÀ€¡¶uAZÞ‹ˆšV„Üíž*…£eÂ9¯$ƒiEˆùí:ÿJÈüÿ¾)µ*185 ŸKeíû¸¿ŠÛì_ ÈÃ{­í‹ÑŸ€dçþ½,ŸÛå&_¾Ì¢ú VHFm™ê ™0AZV§b ÓcWßÜšA®°°»fé§¡R Í¶ðj£û^{ꃴ“8×”-ßM¯‰eªÚ ã9¬¶=î𰩈[Žrc4¶GKÚ– –°%Â~Y5 ªÌ½pޱaÜ /Yʆü­Øµ@Ñaiz —wƒH²fæÄs d=æ7̽®1P7³ÍvÜÈÍx@»'îf¡G“nüêH§pà§#ȉ2ƒÜ11E»–.ÂoŽšÝÌf·¸ ÃíX`F.-äÊ$pàcµãÒ º£†q<”}@&às î“LÐÀ†ø”ndzH0‰ ú^‚bb¤b­“¢Oΰ Ë#Oàs#ÆÁ$tyÓIC 'áˆ[iÖ±áçÀW*«¾ì ÌÈ¥EäaôÁ»Y z ^~q–*e4ocøY𽨹cOÆL>¾0d ?~~.ƒgUö}rvé?j£É`ô©Ùžh&0K×? ><ª°cÐ úÔlW.wl«“ ø¤\ìK’ä•§¾*ÿ20½Åï|S4e3ãà+Ì…•–w@&ì Là ·A /À›Æ*æ0ÀWäËÄ ¢²ï8wè)xÑä¯ëÐó,/ù',0}ùUºB³cOÅL:ÿäUÆ= ÏoKЉwH(úÄl'ì·fTp‚=³€ú,`p z=öTà)u̬}r¶ƒj̦Søš|Ö-=  ;ëðÉ|RîÌSòŒ<æËPôÉÙ–Oµÿ^No›ý»¿ÎTOX¬ÈÇ0‡¬ËŸýN¼}|a´m¾°=F6íå s±Ç2o¬n£÷mÔÚ‡†µep#.€žªlùÏ‹¶fv*àbÏ? ¦îu2Tq›@" _×ÁûiP¢œÑDÕÊwÈosÖq“€ðê ñ ò¡F϶“ªzªsuùjè[9ÎצTÄ×oTûŠ>ž45‰¸mÐÐ8o×Ðó8fU™ÿÑ^.Iv¬8^÷pÆwˆ„dÞAwÜî¸'Þÿ =@œrµ+Ž( ýŸÄ›Ô¹‘ÔX·e !ÚBh±ÈkClFÄiˆ$ÕÅh‹ZŒ´R*hªÛ B àæÆTºb×Jéû¥kº¼2$!Ú Qµ)úh r'AÊñc8t¯.3Uj†XJ ÛÒ7…cyMØœüÉ€þ$T-ÔÖ™$Á@3Õ ‹È<l«ƒF¥ÑȇAœ£Ãà`ЀK»ü 1ôâ€Ñ‹ëcPü5ì(Jm»pE‰G@6ê<¤W¤(F*¾ÿªˆ6¥“ÎÄ8áųx.F&W{å$t#É@ žw„ãfù é¢t¦r\(j0†E,±§ìÖ‘$J‰)ö-.ßµ(jÆU§¢°*Ÿ£4Ž] 0Fr‡m`OÈ:£ ھñ£ˆ(h¹µÂF˃ù)¹È•Ð?T鹪Ko$‰c>B\ùçô‘víÙO.c"zŠÃŽ![8>Ó¯HÒ‹˜L?éK“ž>(£ý?ítì($‚ÏB؆-%Ó-8¦×éøæ¾_V2Bl—1™è$a#‡ûS¼ØîwÒá{FÙ{ˆÈ „ïõœè°XìòKŒ´,Y;ÈŽN÷™SùðÏ@ï¨asÏì匒ráøÀv¹ÜXËŽb´EÐÌÏ5Ú;` mÞ]oò–Dµ»¦ëlÔGW¨äý¥HìJ¨¾lDy ô `ýVü1­xñz¼ ð;³‹AÖyˆNñ!avýò#³c”ÃŒEͺëhCsæ›úšŽÑ7Ô“=4–`è–0N]M\4–÷®† íqJ³-O6W¢@ Ÿ¬+±=å ÕQÆÉ/ŽÙëØÙ°¯fp.äˆcÖã21éJêARr[H>—#ÍšmU[¨0¢:?.}ð°ÁK•¢/S]t¸S+²V&ž\4Âè/E{;KfÑ7°“ÈöAÍg@‹j~ÝDxŠËâ8c x£óÜ·œê.1qd²âv}5³¸šŠ·jNO¾3ØSClYmUŸ!Î%ëßОÔËj8C‡ ™~ÆU˜ùB!ažâ÷ §=¥îÁòyf›7º:#·-Œ!1¨5G–<Àgx– #‹º È¢˜y”2j²¹HÞ’¬¶ŒÊ…åójŒhù8âÄ»q¤KiXôÍL]S´!Þ V—ÎÇÏ¿_ÝŸ@%“rú$§Z¨L~Ð|S\ÓèfÑË@ŸÐâÃ_W 'bÇŠ5IÙuòÚÝû‹159¸ a4;î°ïÞ׃ >F»0ä\9Æ×ƒr\ƒŒƒ–Ó|ŠçCâ»sa^6D¹0$»ö¬«k¬¦q…W /Á¶iàtóô`@Z:¨]K Ú…!çJ9å"[ÖËwïàæ#šn®áðíÂD•™íà X9à8y-×ø0躭:šÉ¢ÊXÕÂ2> jÇ£\=äJh_sX•çs@5ëåÂ^PMuÕø0è:–å!‚iïvol¸¨nKõÖøª˜tŒr}6ä"¬‰Ñ¾þ é¶ 7‹õ› •Ømæ³¾gƒîoˆIELÇÍõEÇ¿´ŠýµÆ„S )ªÄÆ÷pP¹­ª#†ãfœ ¾¸$Bûž ‚“M"¦ãæ~rAΪíz.$ãÝ ¹ªã{87ÈiD Çכό}»¤uØ_l¤#ꌣu8þæ †ÅøzPÉäP/'ë{8èzõw‘4“õëuy+Go®@Ô}f}:hÞÆõÙûø*a´’õ{ ôŸj ¦ãæ‚K߇ \Ï…´dÛ‡ýÅÆ~EðãUÚ•K…hÂô|Žq†H½Q1Ö÷pÐé+2®çBb\B´ëÁ¼\Œö=”ÂR‘v=²<Ø aíªñ=”}DþB3Ä“¾&òë^ ·»¯ˆŸ¿þõ×7HÙ~I|ÊÑ=- Gë?¯oA|å…ÁŒ†|»¿êMCÛ ²û¼/DUÈUj~ØBrã„`°tkjîi>?ÅΜÆQOLÙõCsÛÜØ‰CîV“IðUð‹FMÍyY|ñS#މwù8Eá š$0àŒÄ{L<†t¡‡ð{R[%P1XØ09w%i›Òæ‹‚}Q¸¸X_?¦q¬¯ÇN~шáalúÔØÛ']ùkšÙx ÊÆpHJŒeƒó —]¢5ñ0ðc*-åKHÍ®X‰wðªH$Çõq¿—àâõ.O³áàa½T!œøŠ€lÔyH¯(“­¥â[ª’¦ ¦Ç{DãÅ.c´¥W 7b™­E_§1åäZkÙbZÇ·û-øaCWY©* nåUë«ám}7Äcçç‡4ú Y2¶Û#BTFz†´]¦ùì0üm2ÇÏü’ ‰ìÒc†5:߀ä€Wúdi[àªwã:Y¾¿EBã…@ÖÅ•h†ã#”‚ìĘ&d“méû\ÞäC Ò4âG«X ¡NH¤'„¢ÃRÞ0-ãR€™8&Û3Ã|[vñ"Ú8ñÚ!BšrXÄNÏV9Þèý2¬N¸Mb#±˜LžŒ NÃQF°QZªV^SçrîJØ(émN‰îWš27bV€¬ÎAq±Á®®§9üÚÌÉ–Ûb8*QtZEiu´z{N-7RÜ‹NF”!hN ÒŠÊE·ƒ|]‰O’Ò¥™v'Ð*ÈÞ„7nW`j¶†bA˜ Žr&ˆã”Õâ{0!v¨P\å1{€|Å ÊÙPòñù§t’e: Ï0~¾SS<Œƒö- ÿwÂ>¬>Ôã”?‹±6 ‘È!?¤ ï,{?G Óõ¼÷ëýñ÷ƒf9“u¥Å³7Ëe@¦’oHFy·Oªæ-í´¥ÿ”ï²’Ôl±¬.ôh:Ç). ±–;{D3$Ϊ,ñ-ƒvéI§¾Xr—ø BÁ¯.B[³øË÷M'y’ç.#꽩Ïq ÅrlפÅdXùfµã2,—Ú`Þiû÷ ”@4Nþd1\‘Ó¡tò7£ØE>®ÏÚ§ù ²*…™™]!ê)ˆ¸h·¹…ÅæžÙL¸’!°å [âs|¼¹ä/ÜÀE¾Ä¦^ÌlJ_fú²QnIZ+Ÿ~BZ³ZÐVÛÀ&c{,ƒÉfy‹n ˆÃ#Þ!ÿgöˆöm¡7–X£C&¯ÂØZVÀ÷°ºÊ}üœ!*.YH:îpkXêCÚbëɼ– «ö§§>¢Æ‡ñ“Øañ~µ™&"†¹aɰò-Lka*=¼Q—™©¨š UdYŸ1b*ñÊyRÙ—cÿŸg?¶y*"´ééKÉþtÔ‡´E”à˜+‚ ÎûK´îl=+J¢°Æ{ÚªwC•š%7E†h:æJ|<«ræ’îT±™e¶¡XþeBxõ?ÿýúÁÔä59ýý±¿ÎR£{_¯öPœˆÑü¨¸¹]éÜÐÜB Mês{ét&”ù9öôHB ™L[y•]Å…ÅxÃÖ±ê¨GN ÂG\™-9ˆ‡LæmVJx›#è䕲¬g‘•EáŸß^³ïØ=]ÀöEŒ Þã© z§ÅÕ³XéX¡L{é,5Mèù:?y’‰* &?÷áÕGZòñ²ä}{m*õKÜ-½&~‰9òí&$Q‘ÉÔËj õújûý‡òš}G +¸ÿ·øð!?w¼<“ƒš¼ŒçËS9ÓSY¶8¥‚Ï=–íF ˆ¥<–&‘çΦÍí>ù±œ¼ ó5ÈPI0x¡ äE‘¾¼ cA¥rcÏÕ!ù-šs“ÎHY1xÓÅèÆ¤`e{Tª>Txñ£oL£e¨SŸ;*y*,FîTP°ÕDTNTu|8š¨é¡„ôˆ' Cö´¬;3°Îq‡A¼ßÂ. l`Ué'²w8ÕBþ‰ü:8H…Î3åÚÜ™;?Sç˃%ûUÞZÇE£LåÎCfÀ_F>w*xc›8ˆœh¼Ô±nñ:'SRRdÉYgÃ8°4REõ­Ÿ<Y#kÕi.‰ŠÌê@Ö©š 5жLüÊêë¬%-B‰E`AÙ­SN›Bq¹Ã9˜ÈF~|Ütðˆ1mŽØ>ç·fšJâ!óÞißd@¢ÆÎTŠÄ‰_b¹åž0}p¶ÙÈá dB&_±Ì+8tö?¾ÈLe,ö”}Ǿ«å uÿ\ê2ï#ªïØV"îà¾Ë·Lô•”‚B)‡K‹‘ûgÜÕt°FPåtèŠ+…ë¦Ñ—Ù£DOÈ=›®M$KÈèQº 𱨶@-[-«9é¯W¢ö& EçÆx>ŒIˆÿñ)ÅVLDb[Õ±=JÈ{¡ƒxc,ΔNti1Úœfl±9ØcPöû‚«GTbÜ#¨SBÌdÅíeµ›7*bh¦ ùHú ¯Lw®ÆeÚ–Ù1ØS7’Ыs+f¤&ç leóסg"¦K¯"?•"áý*m•{l_úþAœû×ÝQØ”u‡»àŽÎWÕ—·¥¹6IP?=W?-—IƒÑéAöá}/}MãëU¯ÛîÑüù‡@ˆ»o4Â?Ȥ=/É_Á‰&‰ñ[‰®°ÇTbÓò¯¦7¹ìë Ç]ý2Qe©ûä馦S«ãÏtD®“´È5`Å1ÑÞN<7Vveö…6ìÖ¿\î°³ÛMCõ€»îÛ‹B)”ðÆf÷c-y%¦eô㔉+‰û³wÜqçiwjs,É ×ᇠ“ >=ê´„:ͤEÌÓ²M="]e ¬>Ø?…«îÙl‡›£_1r!>;à:%¥zÁAbžzê&i.«¤Œ%2¢ v<²~ðÿðÇu)^]ÏRr-êWçu°‰çføÃdªº}íØaQ dš±8{*¬'r³w4æZŽÜÀˆeÂ+­ âaÃùû‹¨Èüó©Qw÷ÓÓw€Pì8 YH‘¬6Ü4¦Y2tI9 mzål5²‘ÃÈ„yÛ28n †KV¦fÔÀüÝÐíñN^Wë}ð% Â{v)l¢„Ü•ewh‹€’d˜HÚq jÆ=Ž×ä ¨°>ÈoF>½ƒ¢æW?°;‹|¯²’ ‡ì5Æ6”85Ís|ÖSÖ8o“,K)ÿ ð±·ÌX6ô3!þ^æñØ$ØIeùrÃQ÷kþyÿ"‰›¨0¥‚ Þÿ !’a"§”Ÿéžùé4$1ß7Üç–°1Oqý73gLFü½Èç÷+ýçÏNÛY6çl¾Ã”³Úvž…·³)ßÎì°(lWËÛ9y*¬ò»‘ÏH%ÔИ?ÒL_Þ ¯  ÛƒG_Ô"cüA³r:xzЙó}ÈŒüÄ…·TÝã¦~6ë¯8«îÅË]6š Qm“ölyÉV¼±‰&‰ñ{‰õzlûY5BŽDÏ ¥ŽÄŸ"ć™#ßq%2Kg2Q%ñ!ÿQò¥7^Á^|ý]|1^•¿U‚¡ƒTè%[¬€UÒÁæA’}xßÃ;)‘0Oÿœ­ƒIH Ê@¶˜¼Ùq ú–i6ÿ8’ÎHY}Àÿ;pàèôÂÙâëÂgxí#ÈÇ^co»¸ÃÇN÷ã$îèËáC;ÝCé4—ˆòžÍa²' Âú ¿ù ‚‚}Ämì¸ HDu:]¹/åQ÷>IèžÍZy¤`õÁþ!ìRØæ€R›…Ô*;c—Ý£ö„Ò#ºgSlW(«öOaZL€Ð«ðdúf-a·Ç÷Ñ Ðl¤ïcHÔ×é¥úSYc/Ø ÏÉi+ôí{ÌŒø› Ÿ»¡Ò½øæ6 œºÛjº… ÷2¯€_iWT^¾w+ß¶Cy]0Õö°#öÀ~yì]«=½kµy5M¯w͊Э§mk{¶Ž4}älâÿH,_N§ @Ø/¬ÿ¼¢†¶ûW8LXN}&êóI}rùEÔmR'O@…õA~7rÏ;Ú´‚w¥îÜZ4SéÜSáĤ=F‰ò5:d¢IâCüNâVæ«.» ¹ãž×.˜Û¤$î ­Èȇ#Êê4“Ñ=[×9¦2PV„]'3‹’ÒõÀ| %%uê †j "UwòXd¬Š’¨È$êV‹m!h…ØXH™¶ób·Ý£öÒ#ºgSbW(+Æ>óá¥/vR¨Ó¹¡F‹m‚¸Ùc‘=²ºK¢"“¨{ejQR»¦NJJô©S¯jöXd¬J’¨ÈdêA|A'ðuO]µ-b`4;<®kF#v_jp<@¡GÑb7°`ŒÉ'›È¿6è'ïkSö•r‡,[a˧¼!QÓ‹Y«/ÐVzÚ£ ØdùKn#÷ç´ÿb¿Üvå*Ž0üûÖ¥ÅCŸ·$ ‰ÀVr‰œhcœƒ!¶I”<}Vסû¯5ƒÈñYòÃWµjÖÔLŒ•>­XÊ:EÍ.æ‹ y³åÅXN‹7l\m7åÙ(OAIfb²yž‘¹®§HПq®ÂV¹,dSa> cîb«E®pŸ ¸¯'IÄÝ<ç¦Óªî²Ô…"æå8 ¸DØ ¢£[·A¼8Ûêb¾&Šc>ùË)úju;¹ Ûé,9sû•³DCc$¶Õ* ±×VÏ“$™£Nù ¾I<¥i-TþðD…á12GŽ+˜½\GLQ·³'rxÁÙ–]nóu=¡Ö ‘“yoü..q53š¦HP-sA›žE@:´Ñ ž» tYyu:ÛN§Ó¡[䂯 D¼+Ÿu:›NÏ•gž¹kNbîÓ„’# Äê ®Ëz Š`ËbʪÐÂv|. ŸK_N# w…Eg‹<d­¸nÁmau:ÕÃÆŠŠ d w,„2‚ãÎFä~‡Ap(˜TXر;¶oçh“d‹d%‡ŽGm^ f$ÎÖ%{¶¼8æÒ«|ÀÊ"6=^nzÒ´DžpÄ¥ìÙ$âK(#¬0ùœkAÃZ[Í»èxVLÿÿ´ F>Áõ´¯9%Úý”¸³oÓ#§¨œB. ¸•Ãè«b›NeE„2ëxk:"þ@r$Õº¬øLêñ]i4ìWWÄjɰßFÞÄèª`vêØ…~Ö$x&R±ÅnÀ|'6³ÃÈJˆ%QGœ€66úèœ(K£Ÿ|á—µÇÑ'I’¯ßA- í”f^qª-lBÒ´“9ãÌãJ œ8*-¼U˰¬¡9°¦é–. wå!f•Ø“¼œ'_F'©óª§b ,æyÕÉR¶õ±oÝ8uŒø}¹×Y°W\ƒøT`®Œm_ˆï 2OQ5SÔoTÏeÞ5Õà%‰z`cþc$JÒÉJ¯À«àæ¨zºUÊ["PÁñF}êÆ¦q‚‹"A¥ ™Ù@à4…iäºL¯¢ÅLÅég´(6*Y +ý°»aî3µØ¿b%ÛŽ 6¹À1Ê€]Òø³KûqNÎsÀ*ïºäÜIå=.8-IP¦¨>Tߌ8ëçlr–SÀp?è`ˆ¡ELeå€xß›¶íš.CL’wAûyôž£ Ä)Æoy)²x²ÀAÙ5âéúŒºÙlŠ@ÇõU¨=ïî>(¸*â ð~?%"[GJá×Á—®Ÿ¦œÃ‚Åô 1H8¯:À±Ò úм ûrf‘+“î{°oû_þ²9E>e¹HÆ<­`l õÊÌ#ó¬rÉeE·jƒþLÀ+PÏ"ElYXÐK¶˜€øCˆí¶!°ˆ‘ï³!á‘’ÇjÏ?†Ä^¥0¡EAóÉN~ÅòKEÍ.æ‹ìÆûöxy U_tªhcˆÂ¾ù†ÎðóÈYxgÖKZ›Å‡ÏuN(*¦_•ˆUlŠêÇJ7è+@GÞm#ÅЪؗØHpäå8ðþÎ'êë²M'=® ÙhØ+ bÒé—|ti¸¬t£7èißÉE ¢È{q¢µδ®G/•ÄlŠäÃp4–$hÔ:Ýß2râU7%kU OÚ‰¯3(p–ÆUÈuŸ¦ÁÄHÅiOû·D‹³K¶HVº_œßT'¸(öí9Ñ‚œ(aJ¼â³DÉRZ—q9EÈv¨a/ZŸ5â\È%_ãTAoôW§Ïûnœqó‘ix–³4˜Oþõ¤~*‰áÕÇ3ŒDô«BÔ(”þ½á¾-Ü,C¨›·*Æ )eZš³ã PމF¯ãôŠfäYÜÔ\¦“£ÁÄ£bam–ðF~]ò} Ξ™éHCšySÎát8G=­Kþ)¥~*‰áÕGŠ”ˆÐÔ(”þý‘ã:ýN™vâmáýzÔœüÈ8ÀQÌìŸLO[ˆÈrÛ-üŒ(ÜeM:Ì$/¥TxCÎô=d%JRâ ®ñ§iVi4ê™VÔ$fS*8Þ¨¯CÍ»o®L­;ì+rn'îú¨ ÂiûÒ»ws¤,-0µ\úÓòñ«6ÅôsQŠ“³Å±Ò úÐu¦#d…—ßñÈ9Ѝ³AÏkÐÙ ì#0åc5…çö•°{4Ø"2F»‡ÅÜ=à µCsg <}‹¢-fÍ#—ÜâùŠÌ†’¨ë"¢-¸DgÊR_«Ï &F3}6`åðjDÅd`G$¼@>ÛvN–Q曆þ©t;»pBp•ã–2+ ÿ]³.V;3ÏÔ vr&¢ƒˆ QvÊü»_ìÀOÅÉ' Ï§|2Å%ñI–<ÍüÉåÓ“Ë· ü[ 'qÚ3N6oi”-ÒO܇¸*vïÊå‚{'>΀/qÚœ÷d‹d¥ø5Á‹¡.’^6hB‰ó$,)ê"0@Žõc¾ÃÚnÀÇ÷Õ¸ƒ? x˜ûvèPà4Ý xòn±ûJßaÀƒÝÞQ¶HVº_<Ãøü¥aÊC:NyˆXUXNá8åF£~Œ˜S¾FÜpYéFÿNÐGè$íѬ•8KGô¶ÐÛz3}¡Gw@GpÁñÆ}=ît˜rU ú´Ð“áŽÑÔ5üÅÃ.£˜^ – sZz,ÔH7ìë`¿éB÷Ûvÿ›»÷>HÛ¾ »äw»û/t÷—Ííÿÿ{{ä~±Ýÿõî±›§WÔî¶=òŽÕ•A”÷¿ÜE8'8g8—¤œ$F½¸S—óã2®—‘Û‹h‰ÀE·=ö5© V÷È“E®T'””ÉÜ©ƒs£…õW7ŸŸË$¹(&ÃbZ=öžÝÞ;%xïƒ|ì·sµ‘÷8߸ë?¼|ùäéÃöòÙ¶gÏ·÷ÿóêá%EýíýxŽ{ö¸;Chôm£ø‡Ìy…LñþË_}óô˯¿y5â}üç¯g8¿/žnw±×=XòÔ‚\üP¼xؾ¸ÛwžÖÂfÿ|úáp¢G¡^ukÃo÷ùl»ûç¸&y¿ÞçrœôúËíOÛó†ršHŸöòÆ¿4&tg(žúµ×SólW©UÛõÇ~ý»íÃgOŸ<x¥uýa»KŽú’}äè£B°\%%ìfÓ&@Õ\Arc<÷ûQœÜ,øuû:ðñ$|üÁ:ùƒ€òùz¸„^3½ú…g‘ª|ÀûÅ–§Zø•Ñ÷EvXô²ÜWwz}»uôU©k¯–ú_Ïž|þòoÚs¿‹4²+°geܺô_QÉí¹Ä3R¾®ß:漕5®(èGï}òâ«Kímcb/;œË׌zjŽúÎ^ži¥FõÆÄ×.µ]M*½–¿£ï.íûøù c~ÖudŒ:^ û÷RJu‹<ßî>Û #_‘9²c Énš²Žtü_ëU²ÛFD…×,¹¹ôvÌ8c`à `L29ù´(w#½Í–ý}ªÈboÖX>ø&ØÍbÕ«Wï!_ü×ÌdïÌD$®gBI2î»ë:šÁ3÷Èž¹”Aá¢Q §ÏA™ ŽI´î«ç#`o™?¬¦Ãj:Œpe$yó ¿•†1Ö”ºI:Wn¡’tîuïô’*Ê)ª‚rbmmÕ>Cèƒé÷]ßè¶À‹tÑwÖR•Êi¢"ËPlDêj£ F¼ ‰dãyAH|†KÙÝ?hwø«ÐýÎ2BŠÃƒB,L* |’2㔆nwxòHõ°/îlªG¯£$eÈP$$lßÿþÄV˜$ÑU<2T$Ü5.c¨ŽQÁؾžíC×¶¦Ø×Q¾°ð«ù§B…ŒxJÐä°aþQ 쯡4=âí!þa†“1-{¼³”a2]øF³Óíµ^'Q:"™‘·=ÑØW–=÷ú|Âú–Ú²]7ا?¶>Püž4dŠâµ‘aŽøbŽÖÓݸ½XÈ=,Šc²‘ ¶ƒ lÙãl,º–!Jî¤a”‘qže°.ÎF/»Ð¥E'¹þJ¤y=fë60º´‡½»æ7šÌó>ÎÁÇ݃P1[v'Ë€/ q(ºæ ûÊÝžéº¦Ì lÈ »{µQHY’|ˆda <ÛÁ4–íu}fñ5;Dr7Ÿ`"·˜`Õ!—‚BsH7Ø*Ô'b ˜6C¡üÀrÁ—{tè»ÝJmô¯ª96Xrsl«BTÝë°¿þ¯1D« ‰]𥌇5ì°@ x¸ Ù…P9 ,ClÜÌ ÛÁÞ€vר«ÿµ Ü ²s ~;”yZºQÞs©RaD1.¹OVËzfÌǬýoTµˆ'4ÒÝçR²ºYÈPB²½>±ow I{ÓÛ˪)g²)Rš{ƒUØÉ†‹®Ý£e9u¦õA¼Z.` /Žß‘^ endstream endobj 36 0 obj 18313 endobj 34 0 obj << /Type /Page /Parent 5 0 R /Resources << /Font 37 0 R /ProcSet 2 0 R >> /Contents 35 0 R >> endobj 37 0 obj << /F0 6 0 R /F1 8 0 R /F2 10 0 R /F3 20 0 R /F4 25 0 R /F5 27 0 R >> endobj 40 0 obj << /Length 41 0 R /Filter /FlateDecode >> stream H‰”W]sÛºýùxéLÚ±uÉÇÆ‰ÝÌ­s=µÓ‡¾d ’XóC%)+º¿¾Ä‚"%ÙV&3ŽF"سgÏžýôôA…³ˆÅ<Å_öôùgö_³b~»åLH|¹üÀg\ û{Æ®‡Ï;ö1ž±Ïy›mÛ6¯«¿²§ÿ~P o#Nÿ7ëÿâ9Öÿv¯ûˆŸÙo·‚¥³8êÃ#¦Hâhü,ž¤/DâÏx§.ú, ƒÀ½ö´6ì›é¾>|ai·Eײ >˜ª3 ¶6aíºÞ±n­;VÖmGwBÜk!f2¢à’§j|õÒ´­^™þáÀBån+ËPÅý“¯Ý¯‡ ÆQH “X¸@ ”ª+òy£›Üàz¦YÖM‰ëê¶®ô¼Ø³) ¶­¦¡ë1Žœ\PÄqBÁƒ$Œ]ðÙ7ùjݱ¬®y‡r´LW ¶[› 8Ô8 á»­ÃwòwaS8)c³2‹c_; Ù¶Xx¨ðš¯ŠM2ª xê^œå¨·À¼G:ïØ¢F®~ÆOui˜Y"éŽu5+‘÷u±÷Š>Î4áF•H‚±ÛV†ÙtmJº³ˆ¶û¶3ef\-¡ä™bQYOJúlD’¼V2BÕ„'Ò‘F΂($,&.Ùå¥.|©u•k¹º0K ’²nti:Ó ^Àâˆü¶>B8K¥¡^v(kU£@¦czc Üäº3¨±=¶¬Á Š­Áˆ> DŒ‹¡@¤¾Õƒ4ÝSíÆOÉã£J…© K ÐkÝ,vÈéŠÍ·¨÷¶²Pj"Ä»}ç·Xºš‰ÀF=SC\%Ý“fÇÚ¼ÜfŒ]¦+‚Î1Rr¢'×yZ¶H¹Vд„ÂçUfÒ‘,«ËÏ´í¨qÙ|ÏtËÊm¶¶ÿŸ”£™è*Ý—¬øXa:MþÊ^ëWF“Œ“‰{]rlÅWƒ»izNÛù0Þ`ý¢ˆ/Û ¥XÕõb¬›3rTÑ%‹“”É;(ÅÁKsrˆ·=8vï84«3©m½mìRR/ Ë[{É—œ»byw^óIsξ†iÛ‚€]¬ÂʼR‹Ö*ÖÃi~RÈÐ]¾›€‹oI+P—›¼ðKì²ÎfõtswÿxwÅhÉÐoV„>¾ÂM¤¡ØÿúñøÇÍï?>}¿ýñøõ?_ú×Ò‘OœŒa«‰B?!|þ0´[[-šìåa¶f˦.6ÄçOÀçmqðvý8\NöOÖ²‘r÷»ÀÆŽ‘ç÷,õ®w›7õvµîÜÔõíæt[õúZœnB 5”<:ŒàMz“ÃpÛÇdˆ¥É¥ìúL¾“ñum}z?*’NÁ}‡ú‚6¾#£mÞ ´Ï³Ùåè£ù;Vaâ¯åA«aø•f‘CÝç{tF¹AG8üZ÷xØÛFWèy¿{|¯´ÊÎû+DDŸfÛiuýY/ua÷ƒe^-|×HžÌ7È šÉÄ{ÚtªP}£¶†Çª4hw^ mÍÆÝŽ{ͼá¿hQsyäωc’P%DÄnÞà<ý?öùQrÖ™³ù`uA‚•Ñ »û»‚Í~e=KB¿dp%èVY½±–³'üÚ:ÏÖLCs!°U‡•©ð+Ô×ÎÎû46ŒD‡ÌÏÌlº~ôͽ®& îô3\¼èªCOùFSá¯v—5n“=œc6<Ü|ô×ë‡ñ“øæšo‘?¹›€žT} ¤0àø‘Œ]š<øíÀûm£ý˜¢‡§ ©ð tþ•Ì– _Íæ¦ª²ü3/ºØj¿Ü¢Á+³cwùê‹«ÉkGU‡’¨”ªþÍìPôªMP'Î 6XP†²á‰ìr†—RÊ3ø%Ï„iBiI!‰Ådå‘PÓ!ÂÓÔÃÀ*ɳi*èxßnc’»q’Œ·Îɸ y0™H+]:Rů.ª MX4'u€é¢åƒÂ}x¿+l>LöT%=±ÒT¸Ð>“¶ÓsÈF··žÔú0ò^®PUêًۦ¦<ÌMÛåEA^¼÷’Ö(ÙAE¯‘5 GÊÉe<,U‰ç]c¬ý³÷È›>ZOúÞ²{Q郌ÌVÅ^ë‚Àwßd, ÄTÁ%éžzÛ?Ê“+”ÿo½l–GŽ ü~\|“¸ýƒßãÆÄx­Ø•G3Þ«$!³ À @sè§wVwU )JŠÝÛ„D7ª²²¾L&ùõÔÿÚµmµ¢ï‡í²ÖÀ¿{¶Kޚ죯˜d¡dê8c#ËÅhLä»jMò\¿ $EÖ £Œ^ö4èëš>¹¢f㙋5 ¬)˜Ä2e¯(dY ǪòáF26ïã§•É9©ÎçÌ8bñêš Ë*;ß“òX"IÊüâ´ýRÖíÝ+Tíšò„IZ'íšKW!MrÛ|¬ã=?}Ö/ÿ Œ¶–ÛÓÍPo)ÙœÁ\…`É üv›uç­S†/—æ,ŒuµíZ¯ /¯~þ}¬÷N92ç>m 1$³vüf)èXöBb4£SvÂ1/ŽÁ)¿xïÀ/=Õh4ûi¡&”ç^~Y 3sØD)¯ÒøùÐL¦JlÁwÌ’œâq¹ëéS ¥"ú÷d3¬6tq­·5¡½1Óblq¡ÙYQq)"‚x‘Rz_ ƒ§¨[J£úùÕĈuús^t;¼iMÂ:ö”›âsÇÙÀª¾‰™xæcZ#UÏ,ªOp7ôÚIüáh¨VýØUm•t­;|*-@Ðáíhqé«YîÕmi!}†Ù­gÊ6eKLSÀ}¦¯o«Ýþ‡wÛøÍq[UQ:”8¸xO‡ Ñã ȸv…ãù ýÚoºãÛ5ž$|i³Œm¢0±$7×®Nn1oê—ûa¦¦Ž®”wÑVXâÇz=lÐŒ—)#¬ÿ+øcG–!=¥ét8=ü$¯²ÖJ,œÌ­=LîÌ=Íâó”Ê4bä%øeÎC‹ÁùQoÛˆjM¬óôðéŸìÅx™×—Ùl3Xmø$þ'žûåÑ]/þéiï<³ooÉ{cÒ‹ô—$aMšåáÚ™ ¡r*X.¢ÎvJ+ øÜ 1 uw±øï_¾Hmp¤SµGYž"%’Û#ÖѦ}0w[dž4ð;÷ÌÇ &gc%Adš·éùd1:ûS?T[Xíò0D ʆ]?xã1Ƽ‡àø±›K> ½K>øýáçÈÏþ¼*µa2ò„/{TÔ(¯ö®þômôIŸ~êVÓœzÏ¢FÈ×äM¬|¬QþÞ¡> Æ7í7ׇXÇWézä2âÈ\,&š{¼½^¹aøÃp'Òeÿç·A*[W e€É.×ÚH@I k©BwÀ/ÃÄ]¢È,¼]¦ùܶâ˜9J§9·Ó]2¸áä­=»‘?^+f¹lñ¦6ì_cY™ÊL8"Ž3ñ,Ñ_2—Z3\ñÖæoBÓi<@+žSl]Ù„Ò-Ê[õK[?£íc Ö¢[ÐClDéÅ8)òcMR„IÆ·ò$#UùEðŽqÌoÏbªØüôiŽ¿›âÔ£/ÑÇÝ:·‚Êq,)‡†ZúNá Ĉ¡† ˆV$&ŽãïYŸ¶PIäË2ñÐ98@˜°åIb6û3ÚT£Ýh$úëÕ™¼O–àÉÐá„ÒA²·Ç;šÎîH¸Â.]{Û¡=”Z0?5šÏ©~Ô½;&ø²PF÷ß-N-JÓœ\Âð ,ô {M‹AX±IøYL¦ÄÊ+ÜÿhR×8«ŠÁ¤þg`#€¯_ Ñ×Sÿk×¶Ô6o©QŸ>a6ÝÑcÔUKìLéÎP~òªŠã몺¦'§òmqvÔÓÄ7ùµyúQ±Â¬¥!*NìL¬Þø–,?èæžÊtƶÌn¸^"üTnç‘ KjÌ.n·»*Ók«jí'á"h©¢Ngò”îùÐÀv@æ‡ÄÂr‡Åt`™ûj€$ÇO}g9 g!ªçâmc¿×IqÛeTÂKU²’СYCUˆ¤Ûj»D’Z{IyÞ"8ùW5<=<}޾O6S>ÂÇX"CW\‰|‰ýlEâ'i*ü±¯håW-Žn£ÃíC ‡.º*#Öˆ¢³Î¢Wº–‹£*#M#G IÎõ½na!mI½Ä¶?Eëšçß9e“TÏÔ᫆¥Yu V¶œqD¼AK kxÞNëÀ‚ÿhf{wÿùf¢r–eT1_XÀ¢òÅ»¯·(k²B÷M!ö*Ní«rŠ–uØ`lʈävÚl‘Ìkí;iqj¹˜Ý¢7Z U¹¾‹Ð@6ŠÛM˜5 ‹ß›©Š»¶×ׇ_¾øþí»áf ïég†!~ÎàZ¬÷ ¾–r:øGUí¢u9”Ñ3¯—èSêæ$ŠÓ¹zŽóc—ÃI‚¢¼ä™CE®¤ŽPT– ÿ“‚Ý"úÔµ«æÐ“t|Üš˜¸šJ„öÿ/½šqÍ[ æÒ@´–Ä ‹˜øsƒùq[1šêò}{`lõhE°ƒ¹¨àGØsd¼ÌUzÕGoìé<–qH”(ÖFØOUïª@´ÁMÍ™ÿäâ?q.˜DMõߪéÝî9ìG¬vEþ¡aÒ& D•Š¿Åêï¢:Fõ¨*ˆJ†éOSi޶¬Ä†\·—3oÞQÃÉ-ùVÈ7Œ<ÍŒh‹±À7 tŽP£‘'iÁ}n‡~„ÅÏßþö©ƒ› endstream endobj 41 0 obj 4842 endobj 38 0 obj << /Type /Page /Parent 39 0 R /Resources << /Font << /F0 6 0 R /F1 8 0 R /F2 10 0 R /F3 20 0 R >> /ProcSet 2 0 R >> /Contents 40 0 R >> endobj 43 0 obj << /Length 44 0 R /Filter /FlateDecode >> stream H‰¬WÙvÛ8ý‚üžæ¤çX4®è7Mì$îŽ;žØ“Hk£øj£øOþIB< ] Rùö ¸0í±¬÷xHª+½Êò¬½ó˜ÝDðËÎí&n½Hæ‰,èµÉôHÜZOˆPP†2TTÑež³m­«]Ã*hž)ZHegjÃŽøÞ`NTvÝfe¤3“Iùd¢lvœëßñ‡ÃyÌýþ{áÅû$¯ou–ëUnX¥k}0XXÈ}iƒÂðD¡MYt‘:ÜŸ—G±$´È ¤â® ,2óèe—¯Y³+l]CDzTçù[g› ä[´Àp/Œä¼L;I QéÅ"öM(b—·˜ÃE˲†Ýf­ÎY ØÔ{Ó'Ñüà¸é°ÆÅzÓûÝÂTDI2 (PrÆ ó XT¿Ï×=G€e½µ¤Ê!£ß)ЧÝ[̺·x$²J[ZØnH.î•&VnE´¦¹†Øqg ãúcÖîØ6Ûì[âØNÛcé…cˆÜäF(¨Åõú¨kãÈâû/áŠäú W„ïðÄUùæ¤amgE [/­+Â6t"¯ªyi­Tf¦y“  ›ÎYˆ„^¨z¹ÀÊèºj­[Úò0€cm6 ;ãÉ«hà$ˆ(÷]ŽÍxjm6¹AY.×úî»”²qrIâ‡|òÞŒçö›¢ª%‰a~àûóT@œo3 ]cê~‰â¯¨¼òw…H¨òmWÜ“"L²].›– ®ü…tÉs‡ÊìP•u«‹yM›Öt0uÓïØ”2‘?À|2é‘îMËV*k€åÍÐy\z¯Òw’õÂz¤>žú¶6Ý–:µ+ó5ê” þ¬ËÆ)æú¼"ÍF›«ðCzÑ í ä + íZ›<»… 4Œýe 3î§ê><Ÿ¦j@,#77a¾ß¼»‚-6ئ~Yô"úÛ·²¿?ÔZœ3vúž³>„Í<7T&÷Û)Sé¾(¹Yo͆‡eª#1 ‚Ïé ßΚ«ç*ýP§¸¯¬kñ=¸„:¥»vWBalòlß÷ÍÉž}ÉÒýûÐl;™Nó™ÿ ½•"¢¤¯wåJ³k“ßE~èÂz¯o&»ËØ;ÔuâKV“†“–@/ãx 2$YGU´u¶êz’¸pìÊ)„"dË( ”¹ ?@^l0ðáåÕ».7-ÎvcÒ]Qæåö®î1üò$v gN¬¼ ›[wÖ>¤e‚LÀÿ '^Õ%Ùžæ&Q¯^‚‚Bd<4'îÔ{ä[ÓU¨ g«»ž ˪Ê3øñRÃOÝۓǼª´f+ö¯ÓÌv….\0Ä%Œ&öI¯ÊZ·e}÷¤¦ “ ºÏÜHvÔ¿ÎÆ—ä™(¡OjÅþã]{O,Éåኔ­•ò|åSÏ (q‹ÌÂtÎ SC;±Úb~ÑúM¥ˆ§:ªÔh“’x0„µ‹ {¾ÇƒiÎßìLñ;*æ ñ¾‰RI½§–N‰áK²oÏÿø`Óù‰‘xlõxv"må)ÏÉ øe¨gu—Tf1<ÃF‚Ú¿˜Þ7§äRâä é‹Qb£ðõûOŽw_Â14RÞþ)þK!o®í´,ž™D«ýøäÅù±†¿¨W`uØÒcïu]T?€¶5@ïàz®«)‹GÃòå8êÜ€ÍOËËSЂ„w­]~…Gûhö)+ºÿ±wy×{žQ!€@ж“ÒÉ7@»5³¢ Ù2Çç 5Ø%ö‡µL'y@ä\ÙOßKªê¢¿¹+-=ÂîWx¥5¨k£˜öÅ‘ÖÁ…ft`QãçþÉ¢á´dFŸvׯf³cx2pSUÙG„ʲ(:Ð<[17ÇT7†ýúRÒÈi‡CãG(á|vþÉÎ Øò„-Û̘F]ܧ±P.,ìkìO£ÿœ¶åŠl¥Te$è N£~*šœ®¸÷ÅÁ~(‚&9çÞƒ«Šã‡êÕu¡†¤¢§š™W"%ò§| }„´@"Iùâ±3ð°-ŒÃÖ@žëýàNw°ìYì|³Épµˆÿ¹u|hg&l’tS™.}š»‡*ïÝ”¸8³¿fu‹ ¸(€> ,ýþöëÅ÷_زNwY déjC²©ëÈì° —ÆHúÔ‰‡!±ð¼¿ ¬Ò¢.€C)¶SÞ‰)åØƒáNÅÎOyGœ+P¯[ˆ[-íÅÌEïa´6gîjoR÷™ÁåE8z¥¡„L(¥,.!ý'¼+ë…ðìýä‹ê¿ œ'®$öv=¼º¸:ÿ•±]ÛV¿žžÚËŸ @ͤéx öï.+ ö8YôãlY²‚g/³}nj;‰~+wûä±e½Ñv§# 7îqLÕE†^ºáƒ6³-Ó9¹6^,üW÷/r0äìrS™‘_ÖT—µå“}?xȦþú•¸Aø>ÉÒÅòúæül~í)¶JF˜TZy‹v9¾7ô-°Dü›Q¾´ÑX#å˜*ÈÎÃ;r×¶z=¢Ñ|¨2ò}jj •?DОŒ#´­;xe½µðãÇÃô¾t‘8ßü÷U(zy…àª;¸{z&i|_Ú¾&ó±:\Ó#¼ù2,)TrÉ@ ½µ >æEÄÝ®EìUé¦ÁKc6Ì*×2w7tZ?±ÂS°‹Ð¶? ë.Býà+úc𷲫ñ#×`>íG̨þö˜ö¯5t)âOÓ„ ÿånEüÞT”ñ0‚¤»E%0}ýÓÆ¯ˆìMÇ9ꨧˆNpê䆒‡DTê0{©Š_AC°@Ìšûc0.Aj3ÖëÆ0ûܶ%=ìc×4äN_ˆ¡^ݤOnA 5þdà’ BzÂÎôm6˜pÉóþÄãH8å›Î÷ƒòëtÏÎà¤kgSuœA»ûB¹Ýz† ú ÊMk Y‹gÚ-{ÿSý ^".(Ây’Ë‹˜.ÀÇöNVµU6ÐÄ¡ ÁÄÉТõÖ —ÿ¿öêÛi\GãO°ïà«UG긱ã8 w p€3”ÁV»H«45­iÓMRÎ)ûìû9¶Ó¸m háb4Mœäóïo:_—¢ªÊ^\ÃKëÎ\Ãkèp´ÏèªDý­*Q‹˜Ÿwã#Ã/HÔ-3çíiiyZ*!^fu,Y=/l$ñö[ˆA¨uÿÞÐ_ãwpŒ§þ Zoþ8CçB–„’i²@ßÄl-2 nR¡ò^Èt.–³VopŽÇÛ‰ÅĘ<‹ÇæÛ~— $st£J”H sñ¤)p—Èé„"J‘,†]O!±w8ËsXŠEM˜W‡jÆYß·ÃÊØÞÂfof™Èš23¨Ê¥¶œø€LcÂCjñÄHH-™AVš [åÑ«ãæR.Ià`„x$!²uJb…jðëä||{~¤ãÞ>´Lܱoýc‹$bQfx¥IrD½ÈMó´4Tñ½64#æ7r¡×µKI™?V£f<ûõ‹FŽpWélQÎFú?<¯™¦myŸÃKýËÐrwæ¤ß̽=žÁÎÉÅåø'¨Ñã¶&~ 7ªTÅígÁ…X¬Ò‹)NR¼~­Ö“àv±"Ii“O:å)b¨wÇ@ûŒ¡Æ±õ륢#4¦¹|A@°¼ß¤Oùã#¸-¶&IÛ2·Ó˜X2ƒ‘êFgj¢ÿE¾†·â#ÜlD—i¾Ú ·úBêͽ´¥6ó‚-ýX_F18†ùÖÉF…Rt}ybJÖ{:‚ç™ñ$àHÓBª¼s.gÉDV謚C< ¼:FC«C°®vúMYºBo@›  —jÈEž 1…}Ê:êžPÀ€›Ð€²Íz]Ëå©X>«8tòcˆ®óg±‹@j+lŒÕC9ã²×]û}l†bênwÇ0äâeS¾(Ÿû£k)VYžÎ“Úônð1Fß 4Ë4N[Æ{vë½zž§bNcƒÌs±ÿÌ䋘¢ŸyQ%“ ¢àÅølŒ®ä¤HŠ ‚‰.älÞ¶Øý¹ý‚®@/Õ¹CoÊUøMuè\W.”€›íÈÙ†‘EÑ.€4î‰Ã§È,S¸-o5ÐÌèòøö×Ùi»ÙÞk[–Ñú;¯æ ¹§heÓí7Ô¿ÜnÊ ÜK!ÐëÛÑÅg¨Ð/†ðª/¾JJt'f „ƒkñœ(•jƒÞ0 ƯåK²”õ팊¯N:ý‡‰Ñ‡pêŠk™-³f{ énˆÎ¦%~ø2D«FÌ9ôñ;”ˆÅMe–Ìã™ãR…!›)$> Ô·>|±§ø5†Ãµ5Ã{·Í÷œõ%9dhûuz©Ë×ɶI>Ú±Ãfb4p;#}$Þ!ãØ( <  Áz)ÿ‹T—W°r'}™¦2À‰)%‹•TÿÒùèD=ÚßúûgΠïH#ËpXß¿ìùjxÄèj]‚x^c(#*M+2€lÞ>ý!²l½ÐºÙ¤Ì·ÀúU_ãj…g‰c®—*~n%aÕRU&bY%•Ì—VŠ}¥[Ûµíf©`äÚ2º\Vð èëm¥’L1mË+4׃ÚGvc½lk^£q-¥meèd£k^\ÓÏUØÐ –Ò‡ørF±>ß ¸·Í ôÑhˆnŪ҂õ‰k‰£] ï„ÿ=8&¤­$qûbê;õ/ ˜ùŽDØÙá% šï ­ø¯Ø‘)P$t¦‡ŽP´Š¾áõ3àÃhÅl¤wƒÑA) kŽÖÎwS;ìKí@ƒÑÇ!e†Ú‚¾å› u«u•©Ô÷ +/~¢o@üL¦O"›nÉߎ*¯²ÊvЗ¨£íìDvSzf±M7? ŒN„ m?“ ˜XæË¡Im@Hɺì|1žˆ±ß°S/;­°XÓ"Ž8©Œ¸QÈ8&ÛØ=+H(*Î5¯³TYæEiÀA÷øýU¿®oÙ U1“åÐdƒ.ò¬¾¦c_Õ–®@4oL̶7r)æIQ¡¿£{¹,+5:G¡I(á«F_ÿü A>zõš&zu<Æo]^Ñ2Kû=ôõ6éûšã°f}/Û‚î3#àœ3Ãñ ËºkÁû”@÷ÜÈ[|mÖ:Šî°ìǼw–„~¨©9(óGà`:Çi¾ÐCa{º×|%ãŸS©×s($àÍPôºÊ¿¯d%vr"÷:,M¬L3œ,D™%“Zúa¦ˆ´*Gf/EW´£¼[öÿŸtGI?2µoo ÇgÍyn€¥a—ùÁ}Ûs¼Îs÷ëxðÑA–Ò^§n#d6u]+£›ªNuŠ!yÕíêFw(™ @ýþ'Tôª¬û}%J0£°!«ÊôN;zÜô/êû¼1]¸ï%–©ö°{üþ´ÖáYÌRTGèËY2‘• ;qßÞã冩šõÝû’x¨,zMüÓKغin /°S»=ªú€šTÁ"Õ¯ò4ÉÐq!t-ª?óâ©ÎÊ]þû[Æ8MˆÙ:2“»<;;CcY¤¹í6: ‰LÌó1ç6ÏÑ]ža¸¹Îá¿Î°‚åí#á¡™çÌxyWk…™Õé;~kôðƒOâF£ô^ÈçC€Þ¤X'ÅFåî@6]”;ozþ Rë÷5kÚx55V}w‰N!že9@±D¿åźќ(p4'ðH‡æ<ËéãÖ€CÖ©9Aý=ŸâÁ”õ´ߨ <—0“UÕKþctB½Ã^ÝUY‹Ý„ùfú†TÐ?3-c™¹ò`l›‹ç”ÇvÆåÔîjòà,ª5´©´m.ìELv@Õ¨ b—pýq‘ÎÁÓj]t»©|”iRI•6ïàìa¡®7&I3× pìyÌê/ (mÚg8lÞŒâÝó©3YC ¼`"SGØA ÁŸßE È ú!‡Úx5î'ꕨo g–5ãŽ-Ã(uæ»oÖšÎ(­SM!J¡&5z¬f£LÍÆÖ{Ãø“ïI9«÷_›µ 8w—'v~èÂëŠ7݃€•™DÜ¥?Ô«‡´…¤ùáì×ßþð‹Î endstream endobj 44 0 obj 4936 endobj 42 0 obj << /Type /Page /Parent 39 0 R /Resources << /Font << /F0 6 0 R /F1 8 0 R /F2 10 0 R >> /ProcSet 2 0 R >> /Contents 43 0 R >> endobj 6 0 obj << /Type /Font /Subtype /TrueType /Name /F0 /BaseFont /TimesNewRoman,Bold /FirstChar 32 /LastChar 255 /Widths [ 250 333 555 500 500 1000 833 278 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 520 778 500 778 333 500 500 1000 500 500 333 1000 556 333 1000 778 667 778 778 333 333 500 500 350 500 1000 333 1000 389 333 722 778 444 722 250 333 500 500 500 500 220 500 333 747 300 500 570 333 747 500 400 549 300 300 333 576 540 250 333 300 330 500 750 750 750 500 722 722 722 722 722 722 1000 722 667 667 667 667 389 389 389 389 722 722 778 778 778 778 778 570 778 722 722 722 722 722 611 556 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 549 500 556 556 556 556 500 556 500 ] /Encoding /WinAnsiEncoding /FontDescriptor 7 0 R >> endobj 7 0 obj << /Type /FontDescriptor /FontName /TimesNewRoman,Bold /Flags 16418 /FontBBox [ -250 -216 1172 1000 ] /MissingWidth 325 /StemV 136 /StemH 136 /ItalicAngle 0 /CapHeight 891 /XHeight 446 /Ascent 891 /Descent -216 /Leading 149 /MaxWidth 977 /AvgWidth 427 >> endobj 8 0 obj << /Type /Font /Subtype /TrueType /Name /F1 /BaseFont /TimesNewRoman /FirstChar 32 /LastChar 255 /Widths [ 250 333 408 500 500 833 778 180 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 778 500 778 333 500 444 1000 500 500 333 1000 556 333 889 778 611 778 778 333 333 444 444 350 500 1000 333 980 389 333 722 778 444 722 250 333 500 500 500 500 200 500 333 760 276 500 564 333 760 500 400 549 300 300 333 576 453 250 333 300 310 500 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 549 500 500 500 500 500 500 500 500 ] /Encoding /WinAnsiEncoding /FontDescriptor 9 0 R >> endobj 9 0 obj << /Type /FontDescriptor /FontName /TimesNewRoman /Flags 34 /FontBBox [ -250 -216 1158 1000 ] /MissingWidth 321 /StemV 73 /StemH 73 /ItalicAngle 0 /CapHeight 891 /XHeight 446 /Ascent 891 /Descent -216 /Leading 149 /MaxWidth 965 /AvgWidth 401 >> endobj 10 0 obj << /Type /Font /Subtype /TrueType /Name /F2 /BaseFont /TimesNewRoman,Italic /FirstChar 32 /LastChar 255 /Widths [ 250 333 420 500 500 833 778 214 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 541 778 500 778 333 500 556 889 500 500 333 1000 500 333 944 778 556 778 778 333 333 556 556 350 500 889 333 980 389 333 667 778 389 556 250 389 500 500 500 500 275 500 333 760 276 500 675 333 760 500 400 549 300 300 333 576 523 250 333 300 310 500 750 750 750 500 611 611 611 611 611 611 889 667 611 611 611 611 333 333 333 333 722 667 722 722 722 722 722 675 722 722 722 722 722 556 611 500 500 500 500 500 500 500 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 549 500 500 500 500 500 444 500 444 ] /Encoding /WinAnsiEncoding /FontDescriptor 11 0 R >> endobj 11 0 obj << /Type /FontDescriptor /FontName /TimesNewRoman,Italic /Flags 98 /FontBBox [ -250 -216 1158 1000 ] /MissingWidth 376 /StemV 73 /StemH 73 /ItalicAngle -11 /CapHeight 891 /XHeight 446 /Ascent 891 /Descent -216 /Leading 149 /MaxWidth 965 /AvgWidth 402 >> endobj 20 0 obj << /Type /Font /Subtype /TrueType /Name /F3 /BaseFont /Symbol /FirstChar 30 /LastChar 255 /Widths [ 600 600 250 333 713 500 549 833 778 439 333 333 500 549 250 549 250 278 500 500 500 500 500 500 500 500 500 500 278 278 549 549 549 444 549 722 667 722 612 611 763 603 722 333 631 722 686 889 722 722 768 741 556 592 611 690 439 768 645 795 611 333 863 333 658 500 500 631 549 549 494 439 521 411 603 329 603 549 549 576 521 549 549 521 549 603 439 576 713 686 493 686 494 480 200 480 549 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 620 247 549 167 713 500 753 753 753 753 1042 987 603 987 603 400 549 411 549 549 713 494 460 549 549 549 549 1000 603 1000 658 823 686 795 987 768 768 823 768 768 713 713 713 713 713 713 713 768 713 790 790 890 823 549 250 713 603 603 1042 987 603 987 603 494 329 790 790 786 713 384 384 384 384 384 384 494 494 494 494 600 329 274 686 686 686 384 384 384 384 384 384 494 494 494 600 ] /FontDescriptor 21 0 R >> endobj 21 0 obj << /Type /FontDescriptor /FontName /Symbol /Flags 6 /FontBBox [ -250 -220 1246 1005 ] /MissingWidth 332 /StemV 109 /StemH 109 /ItalicAngle 0 /CapHeight 1005 /XHeight 503 /Ascent 1005 /Descent -220 /Leading 225 /MaxWidth 1038 /AvgWidth 600 >> endobj 25 0 obj << /Type /Font /Subtype /TrueType /Name /F4 /BaseFont /Arial /FirstChar 32 /LastChar 255 /Widths [ 278 278 355 556 556 889 667 191 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 333 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334 584 750 556 750 222 556 333 1000 556 556 333 1000 667 333 1000 750 611 750 750 222 222 333 333 350 556 1000 333 1000 500 333 944 750 500 667 278 333 556 556 556 556 260 556 333 737 370 556 584 333 737 552 400 549 333 333 333 576 537 278 333 333 365 556 834 834 834 611 667 667 667 667 667 667 1000 722 667 667 667 667 278 278 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 556 556 556 556 556 556 889 500 556 556 556 556 278 278 278 278 556 556 556 556 556 556 556 549 611 556 556 556 556 500 556 500 ] /Encoding /WinAnsiEncoding /FontDescriptor 26 0 R >> endobj 26 0 obj << /Type /FontDescriptor /FontName /Arial /Flags 32 /FontBBox [ -250 -212 1225 1000 ] /MissingWidth 279 /StemV 80 /StemH 80 /ItalicAngle 0 /CapHeight 905 /XHeight 453 /Ascent 905 /Descent -212 /Leading 150 /MaxWidth 1021 /AvgWidth 441 >> endobj 27 0 obj << /Type /Font /Subtype /TrueType /Name /F5 /BaseFont /Arial,Bold /FirstChar 32 /LastChar 255 /Widths [ 278 333 474 556 556 889 722 238 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 333 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500 389 280 389 584 750 556 750 278 556 500 1000 556 556 333 1000 667 333 1000 750 611 750 750 278 278 500 500 350 556 1000 333 1000 556 333 944 750 500 667 278 333 556 556 556 556 280 556 333 737 370 556 584 333 737 552 400 549 333 333 333 576 556 278 333 333 365 556 834 834 834 611 722 722 722 722 722 722 1000 722 667 667 667 667 278 278 278 278 722 722 778 778 778 778 778 584 778 722 722 722 722 667 667 611 556 556 556 556 556 556 889 556 556 556 556 556 278 278 278 278 611 611 611 611 611 611 611 549 611 611 611 611 611 556 611 556 ] /Encoding /WinAnsiEncoding /FontDescriptor 28 0 R >> endobj 28 0 obj << /Type /FontDescriptor /FontName /Arial,Bold /Flags 16416 /FontBBox [ -250 -212 1156 1000 ] /MissingWidth 321 /StemV 153 /StemH 153 /ItalicAngle 0 /CapHeight 905 /XHeight 453 /Ascent 905 /Descent -212 /Leading 150 /MaxWidth 963 /AvgWidth 479 >> endobj 2 0 obj [ /PDF /Text ] endobj 5 0 obj << /Kids [4 0 R 14 0 R 17 0 R 22 0 R 30 0 R 34 0 R ] /Count 6 /Type /Pages /Parent 45 0 R >> endobj 39 0 obj << /Kids [38 0 R 42 0 R ] /Count 2 /Type /Pages /Parent 45 0 R >> endobj 45 0 obj << /Kids [5 0 R 39 0 R ] /Count 8 /Type /Pages /MediaBox [ 0 0 612 792 ] >> endobj 1 0 obj << /Creator /CreationDate (D:20031106233012) /Title /Author /Producer (Acrobat PDFWriter 5.0 for Windows NT) >> endobj 3 0 obj << /Pages 45 0 R /Type /Catalog >> endobj xref 0 46 0000000000 65535 f 0000083577 00000 n 0000083264 00000 n 0000083977 00000 n 0000003972 00000 n 0000083295 00000 n 0000075161 00000 n 0000076260 00000 n 0000076530 00000 n 0000077619 00000 n 0000077879 00000 n 0000078975 00000 n 0000000019 00000 n 0000003951 00000 n 0000009059 00000 n 0000004114 00000 n 0000009038 00000 n 0000014232 00000 n 0000009202 00000 n 0000014211 00000 n 0000079245 00000 n 0000080311 00000 n 0000033361 00000 n 0000014387 00000 n 0000033339 00000 n 0000080569 00000 n 0000081656 00000 n 0000081910 00000 n 0000083001 00000 n 0000033471 00000 n 0000046080 00000 n 0000033557 00000 n 0000046058 00000 n 0000046190 00000 n 0000064689 00000 n 0000046276 00000 n 0000064667 00000 n 0000064799 00000 n 0000069826 00000 n 0000083403 00000 n 0000064885 00000 n 0000069805 00000 n 0000075017 00000 n 0000069982 00000 n 0000074996 00000 n 0000083485 00000 n trailer << /Size 46 /Root 3 0 R /Info 1 0 R /ID [<48cddc6bf039db9b51a8d291ff64bb74><48cddc6bf039db9b51a8d291ff64bb74>] >> startxref 84027 %%EOF NetPIPE-3.7.2/dox/np_euro.pdf0000755000000000000000000060544411433312522016041 0ustar00usergroup00000000000000%PDF-1.3 %âãÏÓ 177 0 obj << /Linearized 1 /O 180 /H [ 1267 439 ] /L 199460 /E 68080 /N 8 /T 195801 >> endobj xref 177 22 0000000016 00000 n 0000000791 00000 n 0000001128 00000 n 0000001706 00000 n 0000002047 00000 n 0000002078 00000 n 0000002239 00000 n 0000002280 00000 n 0000002860 00000 n 0000003090 00000 n 0000003120 00000 n 0000003344 00000 n 0000003814 00000 n 0000006789 00000 n 0000006812 00000 n 0000031001 00000 n 0000064705 00000 n 0000067383 00000 n 0000067450 00000 n 0000067657 00000 n 0000001267 00000 n 0000001684 00000 n trailer << /Size 199 /Info 174 0 R /Root 178 0 R /Prev 195790 /ID[<1a690b124351ee526150c02a6fdc7703>] >> startxref 0 %%EOF 178 0 obj << /Type /Catalog /Pages 176 0 R /Metadata 175 0 R /OpenAction [ 180 0 R /XYZ null null null ] /PageMode /UseNone /PageLabels 173 0 R /StructTreeRoot 179 0 R /PieceInfo << /MarkedPDF << /LastModified (D:20030708180759)>> >> /LastModified (D:20030708180759) /MarkInfo << /Marked true /LetterspaceFlags 0 >> >> endobj 179 0 obj << /Type /StructTreeRoot /ClassMap 45 0 R /RoleMap 44 0 R /K 139 0 R /ParentTree 159 0 R /ParentTreeNextKey 13 >> endobj 197 0 obj << /S 246 /L 349 /C 365 /Filter /FlateDecode /Length 198 0 R >> stream H‰b```f``ùÌÀÊÀÀ/Î À€@16Ž ‡ñÓu¹5Œå2} \ —Ärb¥¬&#qŠõw¸t#â+Oâ‘T^›cÝ2†­-¡žÅL¶Î0hdçIŒ Ü2Ý5ÈíIp<,$¸…×f3‡@Á1QÑpÏ)ç®ÍˆØ¬¬àpL¤ün+óÙŠ“J €¦stt40@è %¡ÒÒ: â0‹ ”rËè@ÒÒîx ¸8ã;5Y@¬ öÐ÷Œv  ] BLº çØN2îçZ—Ö<‘+žA‡aƒãFÆ= ÷Âκ*1÷)e8®–ΠÃÈÍÐÆ ËÐÉ ÄÆ@l —5 L_•€4û±6Óf! ÝÈÀà l.6 õ¹?N20Ÿ7]Ñ endstream endobj 198 0 obj 316 endobj 180 0 obj << /Type /Page /Parent 176 0 R /Resources << /ColorSpace << /CS0 183 0 R /CS1 186 0 R >> /ExtGState << /GS0 196 0 R /GS1 195 0 R >> /Font << /TT0 188 0 R /TT1 184 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 189 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 /StructParents 0 /Annots 181 0 R >> endobj 181 0 obj [ 182 0 R ] endobj 182 0 obj << /Type /Annot /Subtype /Link /Rect [ 265.67584 600.11768 340.78375 611.94153 ] /Border [ 0 0 0 ] /H /I /A 194 0 R /StructParent 1 >> endobj 183 0 obj [ /ICCBased 193 0 R ] endobj 184 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 150 /Widths [ 250 0 0 0 0 833 0 0 333 333 0 0 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 0 0 0 0 0 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 0 611 333 0 333 0 500 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 ] /Encoding /WinAnsiEncoding /BaseFont /EJEIAG+TimesNewRoman /FontDescriptor 185 0 R >> endobj 185 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 656 /Descent -216 /Flags 34 /FontBBox [ -568 -307 2028 1007 ] /FontName /EJEIAG+TimesNewRoman /ItalicAngle 0 /StemV 94 /XHeight 0 /FontFile2 192 0 R >> endobj 186 0 obj /DeviceGray endobj 187 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 656 /Descent -216 /Flags 34 /FontBBox [ -558 -307 2034 1026 ] /FontName /EJEHNC+TimesNewRoman,Bold /ItalicAngle 0 /StemV 160 /FontFile2 191 0 R >> endobj 188 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 121 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 250 0 250 0 0 500 500 500 500 500 500 0 0 0 0 0 0 0 0 0 0 722 667 722 722 667 611 778 0 389 0 0 0 944 722 778 611 0 722 0 667 0 0 0 722 0 0 0 0 0 0 0 0 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 0 444 389 333 556 500 722 0 500 ] /Encoding /WinAnsiEncoding /BaseFont /EJEHNC+TimesNewRoman,Bold /FontDescriptor 187 0 R >> endobj 189 0 obj << /Filter /FlateDecode /Length 190 0 R >> stream H‰„W]oÛÈ}÷¯˜Gªh~“‹&vº¨w…ZÍHöa$$n(RRV¼¿¾çÞ™)ÉjXÉûyî¹wîg⧟E ~þùããÃÝýÃK –-îé¿h—õ](JqwÿOUÉ®|UMÕèr§:].….ïî?ãƒM{÷q~w?Ÿ"óõ]àA‰ùRLhæb~aìOóÍï>=Ãþޥкd, {ËÂ,c6 ˰ˆav江ça!²$õƒ4¶†=ÊW%æ]+=Vr7 cOüZ•µ‹›Â:z|õ¶)F‰·MBOÕc!땘ëæm”zâ#¨QäÕ¨Ò+¸xëè¦W‘ó*b……?);e—Q”ûYÁ§(öÓ<ËOv£ÌS- ÿ‹aoôlŒ<ñ-Š2ñÔ¥xÁ㎠—ÿªM_”}ó†µñ-k)òÖÚé kãØ3Ä1X¢´ÉZ/Žrñ[YmUµ“U…,ìT;f#Ç"åäŽæœLyÙËúdMrÓÎVpÃ,õ³±ôïJ¨5¤4qh/¼Ú:*«É®“¢`“h²9¡r#û樴¯²n**Ûr³\ÄЩaé†Gœø4àˆ€œ¬ÍÌ“-…éìÔhÃÄk}Z ñ,éZ›ç¢kšŠCÁïý(ÛŽn zàHl³nM é,ìn›€ÿI‘"í„—[ZŸ{3æ½Å¡´ÓŒB¯u|GñB ‚X)˜WèQ½Ax*i4)ÚÑ-JÂÉÔSPòŒ³ôÁ~„¥ˆâ®_{X¸(èÕNÀkì7µy°Êv̦)¹Û˜{ƒsw+õê(µòÅ©#eË¥ËÁ4B¢0ÍM0YÊYùz˜Y*Hƒ,w1T¶b»úPóµ©}¾ŠO?$e§¤g­#±mŽƒ2²Š¢ØÑ‹? ­ƒLÙ"„TIªÞRɬ[¡Pk"Š+š¢Mã)kÕ*©—[Êï²jU‰ES¯H8“1ʯêJ?0Õò||‚z†ÓÏålÛ‰Oˆ5º_Gcê\.9Eã«Ä?Õë².?Zøº:aZ6[Ïøz†¿§«ØÙéࢪOÀ°!ëë‡h¬ìÆCÍ;E…\~"Ñfß•»VïÔÎ @1‘ÓÞ®tsÍB%îäw»I?ëÑ*™ºàå%þò<ƒàÑ o%]6|à›=æÐËl`ŧÀå˜6èKþ!ÿßÂÄ-‚&3úše%~.’ öÑóSCB˜Éu³:,™IßW[Üœ¯ WgIzsâf½qžûišÛÑtf»àÄM±jÚ) ¾¡þÈ•®¿ÖæF˜7iŒ~ªtUŽ&ay<죊ӿƒ^Ò‘¬¹#u§!Ýh¡nŠô<@+a–J<3Í`q¤w‰ Á´ƒvíšhlºÇÄ©e(Omù/«µa°µÆû²¥ÔÈŠ®¨…üÛІ¦Ÿ7ñÌŸ „'3Íû0¿5/ˆo„´o#Ô!ݳôàë•–ªz3©17ƒ@ƒïKþ`à œÈ‹ï&±-ÄoÞ󌴵op€íl}B añí¦*ùYÉ#íñƒ–ƒÍ÷kV bÆzØ€Ou‡®é)q³‡'n¡Ç ˆ7±88¨ÀQp"X;Z3é`‹Ž«vdæ¸6qºÎ²e‘ŒÑJ¬øBxs-î5“êv­4épñÇ -ØhÐ ‰ æ,êf…é6Ñßܘw-ìôü™1þ:î˜H…ÅšvÙÙË]"¤njSGÖû³íh’y•Å5ï:ä\øvÌoJ×^„ùjvÞ ÈŒ¦å¾ŽVš¶_ùF³ÿ¿¾ˆ½¤iß+«„®š4ŒxétúòNßNÍüÐZÅ•µúm”0Å ¯Ñÿs 51ùÐ^› R.·¥}³ÚÂ0.’ÄŸÎ;´aÆÛÌô›Ì8}}0°¤{‘Šå¶afQ ‹S¹„ vH‹Û÷y W•y±¾Î'Íýï4bº`é rDoá¦\òõ×?½ÅñŽeã0nr|œù(^DÓÍ€úÑü£bW66cÔ.­È¸0ì6…øà¼æ$ ÎM6޲÷ç8uÖÌk mw Pkh¡GÃÕPˆ!ÁÎmàð0¿àmâúPq9þ‘íA+³ÄàÍ)Àe+Ͻ†ÓdXL-¯M‹¢?Bÿ N.–`#:¿aD$]nšÍM"Q\8#Ég¦£Z™ðmhà€9’–Ì'Ѐ¡Ê<£9ƒPÈåÀ€¢”P ‘µB¡>cmú-mr 5ôN‹³&PÅ/Ìc{Sùkñ5üoŽÅ¥MŒ¢Äû™ëv…é;•Ïu69/4ܾJ¦YwÎ Úµ,ÔÙZÚó´>lêM=péªñ„™s?IÓðt0èÏ8˜ç³žì ²ÀÙP©úš¢`:u™a‘g©H“3"Ä_T½jpv²Ÿ©:”8µ$NÈîXŸåá¢e1U®)ºu¼eºÓ(³ìʈpZtÖ›]•äYô§]ÄÁå Â錖pûÖþ¢lÛEÎ8 <Ê'Ý&tËDÛó"Á¤²ÑD‡ WSw”¤™K+=ÁoÅð“1‰÷'¤ ªh%*ª ^²p¤Ë³ÀÆ›F/NÝÝäi ì3½>hk¶O:|¶·.­\ŒÍw(ajÆ€ù_  u>ùƒÖh+Nt´I?ºÕe?´>\tÃÌû¢ô‚ÁöaöD—oÞ¬0?N3µ\!Š`¢ô­óNÜìJÖû"‰ÿoS §±ŸÑ“zÒo£In2PŽ0lbžØæ¥U|C£nB©{UšÒ#6M³^åMz¡í-Çÿ^F9Â@½JÀˆòï<jˆ V=½³³´¬b‘ -Ýîî¼AóÆNÞ–ø‡üóRBŽ¥’£F²Lu. /’wºpã)ðƒóšV±™EQø£g€¬):À#òxcÚ{§N„äºzË Kâ(×û̬Aº¨ÔêQÏr$ ’à*|ß¡ÒÉÿ¹¸.¸6‹­}ÊM]£1pg½Ç7ùIÝ8ø½æL¯5õîò²Jé¾áâ¸Ï<@ã=ÆšâÑÕ©›èá,eJ&3°a$å6ø5f†Á Áq>Õ$ÙÜh{m4'”‘•"¶Ç âFßÄ«Ñ\»ÏŽr%QØ@ Z‘øt?wÛ›­éECŠÛ¤³ÿÚdq÷_dù`ï=aš endstream endobj 190 0 obj 2895 endobj 191 0 obj << /Filter /FlateDecode /Length 24097 /Length1 40144 >> stream H‰\U T”×þî{ÿ›A„ ‚ûÀ¢@pAÅ- 2ƒˆŠck""A@qå¸×5QÔ†TCPI«m*ž2Ö]ëµÑ&¸…j=êQTb1J´=11Dæõ2æ4Iÿ{þsîÿþûî»Ëw¿àƒåpŽýuLß©£Ò¶ɼššŸUX›½Æ(¯¨"{^‘%Ë·uܼ¼¦NÏÿwÀó"ÖyM%OŸ½pÚžÝ CX;àÌÈËÍÊ9ùý.öWÎ{äñBÀHÿ€o‡æå-¨2¢gð·h7xö›ÙY´rÐy`Õ6þ¶çg-(ôéÈû#ØÞR•Ÿ;ÞYÐláÿôNá›s‹8n~¶,où_8'·püóÓÍ@ÈzÀÿ€ú-º«Ñž·‹Ü„΀¾Ë/ǪÜ)ú…š«{¦®“ì-ôåûã†UEÊp“ñ¹pЫHƒAAèAƒ0ŠüEÞˆ€£àD{¤àKòA5úà+J ÃXT ©è€¼‡m4B?Ä ÔÒ TñîɆMÉúÆÁ©ñÀ|€-ä‹îüÇ›¬ú6{˜‹wp× ‘Žrµ½8ñ+èCÈÀJ§Iº F¢KQŽí8ŽzZC§ ¥3ÑS1‡Ì@²XŒ8u½Õ}V_†Ûog¯E¤‘¤¿† é<®hú±à#Ä- ¢þ2¾ˆå³&c ªeǘŒµœÛQZLÕÒWWr6‘e¨£tJ«ëê©^„W8¿XŽ´•øgðˆ½%Ñx™ïŽ×© x!>iÞÆŸ¹r§YÎR[ ¦‘ìùºMwe|ÀžÿˆF|‹çA3h©ˆŪoó }ᜡ}ŒÄÌÆ 'Mâ½b¾X*–Ƀò–a<Ñqú LˆaÛbìæ¼.¢ÿä~%Ѻ&–Ê}êm½˜ãAg± ;qÏHQ+jCíÈBýh g¶˜NÑ]ÑUXEšœ*«Õz½Po@0ce2ryçL¬ÄjÂ%ÜÃ#4R'ÞÃ;ãÉIè]:+.É 2C–6£Ì¨2N/”¿:í¾â®ãª·øé1,“1 ‹¸Ö‡YÎàIêLÝØÓ0JaOSh-¡RzŸvÐ.:Hçè2=¤'ô½ëÅ&qLüM\—eWÙKÚådlÜ0~0g5wuŸt?Ñ­u¤î§Ku…¾©=]èˆG"£ksÁ*”â}|È5ß ¸Ê¸»ã‘z<åü@&FSGŽ(„¬Ôƒ¢8» ”Fó©„6R%}Jw©ž^ˆ6"„¥— RD†(Å é-­2A.È/d“±Põe©RÔSS½9Ì«æÅÖæÛn¸g¸ËÜ[uÆ¢‰‘À3‹áŒ¹îrÞb™ƒy˜Ï5Zį`äTã/8†ó¨áÚ_ÂMf¨–x[ä!wâ4ÃM‚û©È‹åeì½¹3‰Œ–LÊåÞ¾”ÅTLk©œe+ýž¶s}¯ÐTKwè>=㜠¢E‚Á9Å$1™eŠÈ+Ä:±Ÿå¢¸&nŠ{¢IúIÙ]ö9]®‘%Ò%÷ËÈ«F¸‘`$³ŒsÆÎUâ|Œzî‰o XÆc“¹%Ž«É5-jÙ<—›[óŠý.åÖ̶¨´å±öºü³÷Ù²û…©5©£-eá³þ¬D`ÏNÈt¾ñ© I›h‰áÜjjIFVbŒ tàIÔÀ™*øÏ† 2;+0 ?1 ³¬.ÜÈf+£6nú«¸Ÿç[ZߘŸ`ܸ>º§ÝéÑ üŸ7™'IªÁî¶­PÈ*-eŠxjq§ðñKB_PÞ5 ?cl÷ >ZضǪf#üÁ _ð‘ê€bõ6Gz€:òÎQÍìPÌ’ãlt-9kØÒëZ’Óã˜ü"ñÿ'9–·0ù›éŸ4±~S•%Múæ {S«ÑÔ¼.¨7ãNl›ÚFi {EÒæ´¬‰µQ%OvZrž"¬ åúä`V¢>K-À¯.HÝ5àñ‚•¢G D,|Yâol\0x—“ìy–·¦9nZU¡Ñzõ(}”{>SÃj¡ÜÔ¶Î4DzEL3b"fÜl°{;Œ€ß0_Á×J‘¹½>îÞè€ý«#yV¤/†Cl’ªÊ8ØžàH==à§iñ׋ð§~gŒ×+¥|nÉ.ú錺ƒ,•¨Xå%úžÞO-r%õÉ,ûi*ú¿¡>FÅ¿ú\Èu°Ëèos 0¨–;r°ˆ÷Žc^GH¢½ž´^{ƒüÚZ A6yh—¨ïÑ,½’Z2MŒ„ö,Ø =G©ã¦A_qóYB/T{h ìhÏá5qŽlÈ @6úƒØÿû Y«þ„žPɾv!Ö^¹!å(­„\¹ ýKпzsJå~û ´ëÐ!6˹_œ½‡Š€•˜Ó?›Åz=´¶‰Ø7 r6{ŽRDÏI¯Ñ3_VKÈ'Î1âÜko r©ði °ì_*Ø'¹ÒþxxÏñ­á6°_© êTæQ5d/`ðúòEœ¹…$Ø«´P5ÃKöç8×`’ÚE™Ð¯ÁÏfíEZÀ:0A€¿ OÀ§Oi%l!ýIš…þùò}àØFš%ÿ˜*ôÊÀùÖalÐ#¸Ç\è¢6܇ 9^}Ÿra› âÏ8qòsl óýâ|öGðã:Æ4­Ì-Á¯.òcŽ9ß}–´vÜ´¯Áöàk8W5p?ì_‡cbæcÝj‡‡%I 0÷RPÌ>¸à{r‘àå÷8(^öÛ<ë–b<ó¤kÖCŸÁü`n`-¾‡F‡;Yàw‰àXâÍüql¦™:Þ–ƒñ›Ãï…9+Þ Þó‘¹Åœq%ó[ðþ´ô2Ÿ“ïî’¶hƒôbY ^¤§! uHž¡IšvÚ¾¦–÷%à¶Se:¤Á„%#Õößöÿ//i§i#ÚhCx;Ct g%χÒ àJôŸzRoH:îí–¶©5xë5T®"'äP âT€þ5úÀ¹n*ÂÚŸË5ô:Úo"÷•+„÷‰½äKȯ¹"…G£87—„tù:† 9\’ùŒ¼ö–#ßväMÈ08Yĵó3×ÎÑÀ²$_]^Q²Éåg:O~®tøy;/oÉyµNmáÜÍï{yœ7»žó#ç8Αœç8ǹãÓer~?=…3¼)òðEÌM¼ëé@þÛÉ#ÈÃö~‘»ìžˆ½S-³wê•ö!ýCÈMö.y½5YSUºÏÉeA·–Š:zž2Ü:ªuS“Ó¸îÎתQ›uTÔO}!üØ$ê[ú$~‡â ¡lyâZDãÔrÚ¨\ EY‰º‰~µ 9™m;h¦r“òÕÃÈuOØ×•Çi¡¨›Ëhƒ§Jž«œ£Lía jD-Ûc,ÖãzÉ}쿾‘s.жŠÚ»ÅÉÇa¾{¯N>¯JEbÌEä¦aÊæ³ˆ4Ò žû0¾~°–çMW+E 1çoäãxpŒFÅ"Q›ÅšÃ"ŸMkcÏßÑZ†>=o#gò^[)ž!s^´¯:5»õ´AyßA>"Áÿ‹äSÊ)µ2â`©º1ïÁØÎwKä}Qïo"W#Úajßlû.¾{^¥¥ µŸfê‹«‘ûwR¾> 1j#Cðzyboô7ˆï®SüÀïe!ùô8æã]¸ÞðÚ%"¶ àèbï8Ô–Ê”û% ÜËß~ý¸÷~‰¿£KÁ÷¾ü„”‚òUQ_ÙvS¾ Ÿ‘/ØÝ¢Þ—SXùêãGÈñ/ƒSi¡ÜI²Ij¾Í¾ˆöw¨Bù9p 1Øc«“‘ÃëÐÿ#à æýñÌ„íŒùx°sïEûªU^¢ íèàêëÃÀß1ï Ô§cÏÈ_¼Ïf»’}u1¦Ï?%ߘþÖÝò3éãþñ¼®˜ÇcÊía"ûO@ABŽ4ËGé4pJ~ siŸô$‘„{’ÞN8ø%-ò,ÐŒ;Ü'VªºNB–A~ '€óÀMubq”^…|AÇ¿ ùEYÂþðkà²kKï5V*Ô¿Ð(]›K1ä0¾ Ãtûø“4_ýrí|KÊ.ZÍÐ'Ð6—¶ÉFÿZÌKÓµbzJÝF÷ÞÉŸ;Aú=Í1L ænÎx·ào4®Ïÿ¯õî¸ß‡€EüOÑ,Á¡«ˆ¿‡2¤óôUé]Z¬œ å G‹xž¤9î=¡ÿèO»?på~¥…jÒûÑ~„áêé÷z'ëžI…Ëž¹ô(C½Œñ@ºîí¥G:s,,ô½ WOîûïÐFó§$ Ž¥éÈ!;òvèljy¾•‘ÔÛð]Õ–à'±ÝÌ@ ‰¾ˆ10v?#%®QŽ+öä¹äÞËóôûa¿Ôß`Üšv¯öئ®;|ƉãÜØIx&Àqmãš !îMx4Zk-ëjÚ´•‘¬ª<õ!’¶Ò&­]¦©›4kL¢I5’–n°R•äÜLÓKÓèKU²jRÂc„ P[J›Œ­e<öã@Wê&mÿLÖ÷}¿sÎïüÎïœ{®ï9×ëµý=ññ…=¿¦°ß¯•ÕÉéë|>'>7ð®Ü,æÿðî¼ ¼ú_Eñÿ þ#üêBQ7଺ïÅ»¤‘±4!—r»bì2tÚ…oDô·@-êðu[ümçñÁ‘}<åª"Û'Εh_ ¿§\!ÎøTØ5ˆÿ°ø)êO) (¿»'ð(ÚúŽÿú”/B¿¼ƒ:ìèËÃ~ XûàÀ ¶ïü.íWç‘ÜCÿ»z“ûÇ¿«…û1¯êõwˆÿH7|¹^ç¸úü¿L¯Þ%n z&îMüËÝçfwœ/(ö§ð#äÀ•¼‹;+VXv:oVkéY5ÓêsqÖNn%TN­Ö-D.]:a,ZR0³ÆN¨ƒþÀ\ÄEI´Ðˉ.°F¢Lù8ñQªjùeÇ?£ñ1ÇWiÙ ?¿€/ÁÂH7ï!y€‘Vþ)I î{eÍmj ¾×))³üð! pÒ¦ºlÊÄ©œªÂ¿/}åºß°ŒÕ Ç?ÝjJLæÇÏ[ü="‚ÿ:útô“:ÏŸßÊ`¼pßÉ7’¹hþßD,ènþ©Ön‡eYaœÃ2jZ‰¾‹oÖ.ñGH=ôaþ´D —¿€Lm~ÖñxU~g¥ŠÕÇ?Äl2¼NÁkšðõñ ¤P3É9ÃÊ&JyÓÌaYr¤¤S³Íß“„ñ~Ã3d*Úúù“d ôE¾ENù^~^»}¦¢`¼çeqÇ(³ò î+~+~Nöw'²Ä"‰ÿ‰ ‹zÖIX~\\b@Ð ¤Nÿ?üc´| ŸZ~œ´ñ£$ tÂv!äF‰< pÔ:Àç›±þ^¬EíާLe¶YVTj·ÍNi™ÕØÇñª"¦Í‡œiÓ­Ö^þ´žJÖ™^­:üQzJ±t?,< tܤžAÏð-z%žÔ+Ðý:Š”øøtç+Ni¹•ÆÓ_‹b+x+0Œ.¸­ÅÖ’f€Ã½É)óY¾^þmÝù«²¬Nôñ•˜úJ½Z+å” Îù.Æš^þ5l’Õ|•¼_ Á5Uë*gIƒëå«ô„WI*TËÊÚ¸Sz ›g™SR®†[®çÉâ2]=oâ½ã¦3yš%°ô”êÔ÷WÏ2¨Q+n9þ lñû¹¥Ó¶H Ðt.çýÉáäH’÷>>rœ÷× ×ŒÔp;YÝ`-n¦­4M·R— µ´‘®¦®fÞÊÓ|+w ^˱\-Þ6oÆËc^ÛÛäå~oÀ˲Þ.o·7ïðNêvçÝîîQ÷¤&w‹»ÍqgÝ]n·(ª-j,²Ý®ÑÄ2v‹ÚîÉ€³Úòë–ÑÀ†t–CÈrHg9„žCzì!Ä…„í ö„ß ö„Ÿ²nT×nÓ– nÒVS”¡Å¾Ä ö,"6ƒ;a€“Zp#ЪK>°{l³çÖùV&Ç:d†`Afd¦gF•Õœð±„í@ب:¥+yÖ.—+ßvyGAꆷãs©ÒiÇM§é®wj«ܨ­½ÚÇw­Ü >¡­6p×µ~ÍÚR~¸ÚßÅ:ðk‡åc›P»Éö22ç=RQ^\‘c¯Ê*D޽"£~ˆS©$QÉ8žA?Ñü²æNÍ¿ÐüMÍ>Û2.„Œß‡Œ]!#QÂî&aTjþPóƒvYØø l ;ÃÆóa£—ž$A4ÜbWÓAãOAcÐx1hl ë‚Æš qOP…Š’1Ø,Åt½æ™ö´€q9`ü9`¼0Þ ÏŒoŒ†Üé9|< ÜFo×¼p½!êYõÆ« kCï•>âéeŒÞK ^"͸Èqv‹LÎ̔ɤZ&¿©’ÉG!•2¹M$<ÌG{p2¬Œö+-•æ“hö¤Xšë!“¤y»ÈÑqi† —djä¢L͆|&SõO•¼FÿFR aè_ejÂÓ3$ªÂÒ÷I„íæd²Þû £ÓWHœÎAµ$¶Ê‚¾$M$GwK3 Ù%Í0ä×Ù)MyN¦@vÈÔ6È/eê¤CFVñÚITÇy†D´>&“Õh~D&U„6™¬…´ÊäBÈC2þ.ä?¥º~öPìnš"¦Îô»2e¢¹yb"ß!QݼŽ,Ô‘ï’Iµ$wª ƒ®˜˜ÈrºLðèRÚ££ØÒŒÁ-.ÍäŽÂÊ}E¦æA–È(Ö˜.–ÑX¹EÌUÏç5F*PHš{à$dj.d¶L­€T«žHªrbÔ ×I•KSyù¥¯S/Iéˆ%$B;ö‰1ĽÏÑoHqÑÎS)ÎG!ûÄÙä}â£dÇ[q¯ñž}b®Çã0m¯8fžGSAñ¶ »Z¼e.¿‹l¹h¯p’³EëNÝ'ö¦t„—#è&ÅîhŽQôîJÝ#ž1ç‰í‘œÊáçp~J@?67Š-‘_õ±M]Wüžûl¿>Û‰í8þ"&ä‘â8Á"Ø/Ž5x)Ö¦1KB EÐÔ S»Áº¨Ɔ´±‰v[ûOëÈf“ÌGG4¦i“JÉÔMû±lËÔýMÓSÕ|ìÜgTâ¯ý³›ÜwÎïÞsÏÏçÞwÞ1×8†ÂXò¸+[Wåz±v·k-3dwÔmw £#ûpÎÐÞ}®ºï¸úƒÊŽw×Ýrõ{ºÂŠâ©½Û]¸TD˜w°ã² §6¯1ŽH=tLÝríl½Nñm G±¾$7ðòGøA~Å÷ÎZ¾†÷ðÕ|©`DÁ(è­ A%P¿fiiauN–Þ`¥‘ukUÊX¤¬Å†å&J¶’œ•KÐDo4×*% üêöÜ&)‘ã{žK徕†DnfI ºs÷{}Ð>½+§öE!gIÄŽ¨Á9úfÈŽTVÙŒ‰Šœ¥#u…¬Ÿ8UÁúΉSé4±Ž8"–°9Ô{BÓÿ Ç¤GÅ!I_xªÊ}/ћʽ_•Î5±ÁjU:‘[×ëîK]¡èþxì }uéÔ¦âÛ™†ci„mV`$L_@I²a´„ å}Á âX>.‚¶AžðÐlS@»Š ŽÇAÜIèP@ÜIô£¢Á:Ü”Y‡0õR§¬SP`Ëûý¸Ò^?ƒä›üÈû›õÓÔµEõdQ=ÉÔ€Gú ¿¸ÛZâW,øi-b¤ÿcŠþ“`jËჩø/Þï‹aíÏ<<ìÈt»ó3…;Çùû÷ ³~`(wØ7ËôÅÜù-©'¨SL½ÅË“T|G*Ÿ’‡b·È[â¾XzªûئÑ/Ø:þÐÖ¦cOXì[l³Õ=úõ(Sw3[£ÌÖ(³Õ-w+¶Û£èIåMwôû)ªÓâié¯ð¤£6ñŰrt6{G*®ªœ':)Óû¢9V¦ªo¯og*<ÒLeD±éÊqd³§â*œ QlöEɘ#>Ãÿ,–±±q,Èq6[äÚQTŒIqE€1)‘8f5«HèÇÈø£"IE,ÉJ©|2wŒÄ*0™Ÿbù·”ÎI*”$‚6Ñk%á·) ¿Nc ü!ù·ä½$7£dú³Xç”L³üY¬s˜éWs3áÙð\˜›IÎ&ç{wöîÜ]n¦~¶~®žk}°f* ¸ÃGãRvœ‰%P¼UüÆÇ1)+1—ÿË>ILÊXÁR”+ó$\Ez8Wz4È•ãÊ”¢4û0~ñnÅ›5þ¡/<‰NS¸©á œ [‰Zu“#Z^uH¹ QߤÜuh'%Pχ$Þo[nëÛ’Ëm$‚cq ›„±“VÙü¾D¿$YºôZU¢ ³Y— LíŽÉShc1³¸¼@" ‹ `…6n€Œ5ØÒl^ë÷yyÏë6·šle¥š½c#<ÏkôUÒægŸÿÒ3¯L®œ]ßôN¯¹DàÍ}áèócß¾Ëv°kõS8ÍDG¼Ó¤K£ã `•uî’ %´¤\è¸Cê—2IfÍ)KÍéŒÇ YéâñA¶ÞHÜõ0zôúub„IÞ»äý ˆ§€ “ððæÃ6xÓÌ“2”Ø(•&¨^BPÀlSÆÓ!ÓÏMœˆ$”;Œ¿À @MÔRXŸGÎ3™¶¤¸œa¼G,¡{ KpO‚Œ„6—Úl@™'hBžÌÍ~FÔÚú¶­3éZnYóìV§e£;Ðe©‡?ÿékñõ55µGéÝ÷šyæQzôô¨’ü]^ó&ý½Àqkõg8ªÕiu@Ô–wmÓ6j«¤¸'­N¨,@ÿ%K£=g§öx/‚E`çJgh Üši£ôHò¢\AÔ¢šªïX>1UÂJ¨tV›n@yÕUHÁi¸ŸÏŒŠ÷3£ÉÅåÌ<‰DØI”­‚l3DÙnĦ܄!Ä8$t°W— "ÂÎ #Hé+D¥¿XiŽ(ØyŒ ³%X3æ%„âoYH‘ŒÇ$–`³ÂU (üÙy xÃÖ׳ô8ôïï~kgMËÓûÞïß:´rj´×yרàh8=rò-ÃL¡ÿ\×Äñ++X¤8ãѳúWîò(‘Û²‹7ÙMÃÒËÒDÙ„ímëÛO,?¶]µêê+#•´T€œ‘KY¾ãÑaBÚù‘‡~„oƉ“èŽÁܬðj)Þ~|I6ªRŠ Ónµö*œ!:p^ª.Ò\à´—ÍŸuâ:ºDzÙd»³ÞT Õ²µ¬¹º|ýcœKÈùhr!³¸—Í¡ÆrçBqD"ÎI—çÅyK¨1³` é‚`˜>ΞžQF<ÞµÅiÇ(lÂsê‡Æ—RòË»¾9XóÔŸOœº¼ó¹ñ¯­ÜZY¹°-•Oh¼­÷«ß5œ;!›8 ;òû•?†j# íFáñ]Ç?Eb—“ȧ–ÈYÙ1@€ÃX¾D« z¢ ®}²H ^Ð@E®Á^qZ*ÊzÔ‚Þ@0!¥Â5®æ¡_v4ª"*jR¹TTå4F)7Þûg‘ŒÈLr±M9q¼òî·að°@²„ÞhT¯‰¿2™LEn¬0Ê|x zZ=æýÆ+¯¾º²°R6'`•Yúþí•YØp›Ú1Bâ«óÜ”úËÄ =rƒQ%Úrm-©åT¥Ú²Š²Jn“¦KsYÍéÔà¬ÐVªªDl«TàTq\ÑK/z鵘¼@¼¢—zñ™¶¨ ðK7wƒ£ôNáUìįYk²º¬ÔzGo ú›)ø@®Q ñ’*¸';e¡GxWàþÃtùÇ6qžqüÞ;ßïâïÙwçgÇ÷ÃwNr¶ãÄ-$¡mØ~ªb†A£ãg4–@ZT(,Q˜DøÑ@éèP²M*t¨&:†„ “è4ºj*ë@ʪ1ÕÚ¦"ÊVÅì}Óõ,?ッÏ÷Çó<Ÿçù>îhþaT:ö1f|pßÞÚ3…’¤§à}f©XB5Ã爔ƒ£Ä… ¥0«âÊý8](kÑ®*”®*¤•=Š×_‰žÊ_ìB©ˆÿäÔêø¥:~©Ž_ªã—êzLw53ÏÚ…a:k#çB „ÃBùIôÁÖb?Ð(u…pjºŒÇY)‡Ð§’—IMgÁò¥uÓÿȃ¥£ûËåco:æÙ©%ß›N¤žÙV~³|_i¡Ÿ.—‡½'öünç?ww¤çØóÕ Ðóâò³·ñhò4Šß•JíO!Æ9‘ëå™ä'=t¤€8«JJ×$ªÓMëáp‚æ,é7äu4eüµ\;gY Ñ˜ÉÿzõÛžIpw‚ˆÖ‡'É÷Ïù£‰(ÅàÖˆ8b¤îq §¥EðAÏÜ£Pùo,ÁÒT%qF6庬bòÁ¤Sâ ÉLŸeòúZP+DתÝ5ÖZ k Í‹LEyT<Ú`ïÞMQ/)ÉG²-­U¼qDÈ’€‘ÄÀŒ!nÂÔ•s¿b¤ãóæÝØr}ÛÎ[Û?‡Ëï»ggµL¶»Ë^XGoŒeÞFîMoÙçì+—g™½'¸iò&šúè³È›‘9ç°këáÜn Ã!ãÞ ý©wÂK‚¤Aºah¼¯&·´p?9à>~‡4ú]²¡ >ÒB†_OÖ¡âÀt ŸB¥Œç9·_ò%ð*a€¬c¨|$gõY»¬7­¬;cBKµk :9`µØÑï£PõÃâýH´gºTD•´¢Og{wíiT=¾ÊØ"êFmþ¬íF‰ŒÖ0¾)^µq³jk °à{3¶øõ ÛÛÙv¤·P9.h,Š ÊoÔúQÓB¥QžÙä›[+z)•¢(jyYk‹e•Íå¹ W?þ÷žÌèÓ}ÊbUfÈØæë€W÷ηÛè6Íšç_w}ãËñŸÕ'hÓ”am ÈÍÿü±œAJIGÚ‡*—B$‰&ð¬sp,ë”r w:üËô¥ÚKéß³·3ÿiäëÀÐ *Ï’e9Dî̓ké[éOkÿ®?¨}¨?Ì ÝnËŒ%“)ŸçtݯÆEÝÈ™µT’Ȫ¹¦¬MÆ0b,kšœ˜ÌJ’H6dÝnÎM¨P%ÕO"o\Ñ|²ÉŸJ¤ÈTÆï‹4ç'kB›»"lÛ‹°D-NadºVœ'²0Kf{î•w²=¥êxHDÁþ ˜¥¶šªZŽ„…¾vìmW³Ñ 9L³!S·B&c¥MCVŽÍfNbc 3#C74"À`ûcÄе{7¦ Tªg`Gî^†´Òv®M/¤‡ÒbüS9T‘!Hœ|¥åfkmÂÐø°‚ÀŠr¾º£F»¨ï¥#å;Ó‹Ww)Ê‚"¹ïÞ•¾ýÓw÷w?µ÷hmY2ܽây3ã|çàÑï šÆœ-Tß–6Ý\vª¸öhÀyaåÊmí`úx¹§¹¥õ©áekŽ´c%³ôÑ]ú9ºq¿HÈvMpü¬ØäÌÊTW/ZºñD9¥%Ø’UFbî^¡70( F„Ó̸÷TèZè†Â32auÉób»ä…†”½± ®wkùFkcb;3àP†‚—ül«O$ãÄJ2@t«ý\øèÍqÊ·YâÀšFÑ> XsËEÐ\3]+ÎÏ'x’ï‰Dîã@OÌÜ• ‹`ñA±w¯Î‚ë34U@4ZX~{Ùà;ÍnÞ¤c¼X7Çr$£X^™7 &†LMØg\”6ÁL0p(A±Ÿ@ýÇÖÛ F1€£Ò*áÊ™¬TN,Šðý\*ý¯±Wn5u®ºz|ׇ[¿8õçò™ 7@áÊè‰Uµ‘¥{Ë “W ¹x¾üáѾ‘nï}<9y¬z¯#Ùˆd‰¸#èþ 6¨qVEw!ÇØ@lll67†7˜Çê'ëè Â&´9"ŒÉ'ƒÌó>VºîVã>݈eý>RŸ­(„;‰ùã‰8ïpçX°„ìÎôÜs•žSìÇ¡™9´H«‡¡˜)±¹9ù¼Õ“AeW*T‘BâqƱ«±c¿eØ0 A’©KÕ§RóÿÉÈRH KÉÅ$MZ&hÀƈ"“ ư±Ñ™mJºù5œð5CÞæñÜÓZ…Ó’’ˆ:cPh4ÂhmPçJYJæ›~NîjËk>íÜ»«]Þ7wÏJTò§W¼øÌ¼õݦ©J›¨—7ÎJ™ó—–'oŽþû5QëÑ—Ÿ,·xÿÖc` ïH'!õáú/ŠGXä”dW„#Õ|.ß—?}$~ú4ôEˆä_^ÎŽP‡Dz„£ÆøÃÒ85Î3ªø„ää—ä)š§xžÌc™óšë8wÒõ6÷–H{Á.õxn¸ã¬ªÆÃºn/mjº›ŽÛÌRnÐqFSãõºÂÃz J¤$Û¢$S!6$O²á¦ºzõxÂõdØÍ°~v1Kv"3Êžao²e?žUÙæüû²M6Úöb{ýû{Ô>a»í=Pî“È”uò Oø½ /éíÐÔHs5=*ÉQ…«Øç«þ­X*ψX*µWûš¼*…ÕFà}FÀéêòxKAºÚÒìþ"ºˆÿ‘]­±Q\gôÞ»ï™ÙÙõ>çîÎcg¼Þµ×Ží]¼ÆØ+ˆ©Dpm7i ¨BÀv)FPZ7"˜"E¢¥CÓ&-UœDüq)S¥”(† &M¢ö‡QTµV¥BU•ˆÑb¯ûÝ]»2éZs3cË{ÏwÎùÎö3@[üFŽÕl˶¶ª¯U€fX2¨÷`Erñï,ËÛ³c[ µ½ÿÊßšÍU÷6¬LÅ|¼ƒ‹[«ìû-º{kÛíåù›g_›o?ðÖò ƒÍêä…r¿YãÓ#;lßÚ\c@Ñ•÷ŸMÈ€oð|ë±VêqÙ=\½Mç×ñ§ÃÉl–Ýâ,ÞòöÚÖr½üî wœó®;•»h¿È]·_çnÙoq÷÷9ÎW±7ªÒ]·úëë§HºôõZj‰nìf {¨‰«ŸÔ•PiJ7Ü.—E¼½éÅÖoMlÆ&s8‡° ú’>âë¤"J‚&t&4Ú¬©O§H§½‚ úh‘Ý0QÚL‘wCî]L ÁZ…] •Y@¨ƒáÓq¯ƒ¹^ÇÊW• ªU\aKºUyi« |af\gZX…¬‚ã`´še€YÀÕR»i¸×k·÷Ô†Œó+«P1bÚÕù¾ñ|ÇYê…ÑççŸyïHy£ãJl]>ò½cq0zraÖ™rìE-xo)ÄIŽ”ÍôÕJžHK3_ª;‘áŒE¯ò~Á»2Ì»ÖÀb—k?¤.ۮاœ—R—¬Kîqcm])3Vw<ã8cgÞtþÂõÍü°ÎµÎae0‚7hd³†$S Âÿ ëFË2ûÒѦ¦·³‰$–’B8Ñù¬MÈëä—üÄ߉±<û}WjÍËéhkþ]ü$`µÏ¢JúÑ“ôO¥{ñT -{¿£‡µ0àh b)\HZò¶,ÓE¸€TLˆ»™7«§ÈÃñ›µ)a—é5<&òiÒj¬&EÉ™W+˜HT…ÕÈ]Wñ;[ÖÂþ/#ࡊà2¸ +¦G–0B?Ë_ 꼄˜W=ðEsMùÞë¯üî©Í¿é±…P÷c9ýÄJÉóBùöø{ ï¯X‹Áòžë¯¿&+MA0D}ú£såþ~ù³“5Aëk´LÓ‘LÖ•oµ¯Ü}nÏÉs¸OHî'ꊨªÇäsàk,5h¥J§R¢ë1•ʺW)tf¼Jýº!û Áî˜OÆI¼“瑵F×,‡›¸7È]åì[` \TÕØÃxœ¶ÎjxP»ª‘&­¤mÑFµIØ8W1åË2¿ÎVDŒ°‹ãX×ÿ± ÆÐ]•Sb,!Ÿ//~r­EHa>RðÕõÜ1XW¿©k|Óî- 'XfâØ“8’ MmÝ…¾¶7Ñ ä0•A#Ê=ŽÆ”1z†¾EÿAÿC½ƒm³m$)'É ”’L‡(‹1M½é)8—Y®Zº^=²d;5u£Q¥yu¢´QEÅ¥•xPQâ¨P@¨&‚”&.PÅ–Ä1TÈL,“*²ßЊ¶¸ñNîþ/<ácm•ÊW­•¨ñÑSjmK$Ó9öÌÏžåfsäjîSèߣ+Ú¦ðSÐàŒLáú=*Gr•Î2Á‚Ó¯ôòÀ€}ظØÏ»ÇrYÄ-˜#•E6RmÌ™‚ ³† e1~žå"† ì²bf÷B…åÚ>Ń$]ß‘ŠŠ|èñbý|Gu=ÿ 2×!<3Pnò5|9Íx˜%ü±íÛ€¨ynî…eÒvçaÖþÑ\÷öps—iâdk#ÿ¬mÓΖZ“U7…~|0×ðÐyY†ª|p^(²©4â-JŠ"J ¥¢ÐNÝ•Zë:i§.Ýð«4´Þ@š¤ H“”0)íD8–Æuä}Ó°æËA$r‹LÒ>QÀ[,í3°!ùÓ Šã¾8FñýÀ™£z¥ð¥{Cà €æ•³—jðe²´”©XÖ³Fp3R͵ìèÇ¤Ž£ÓcÒ4f(¬Ùp¡…ÉR6G¢$®@Ãê 6ªŽjßG§ÄSê)íº  vÕ®eìµ¼ÈÄœÒÔ³çy˜&J9oÇH bI:…¦LJ“Š1ÍÚ¡ë¢äÆ»àÕÙ’GŽt!·/Ð…¦î.îÄ`—8µpûWðÌŸ÷…»ªÑ e³1f-‡ ¨ë#5~VÕÊ` ­t.Ëä§FÓ¾úôJMŸÛ³§[-'7ÐìêNÇú¹KäK‡³íÄ4y£wëÃqûî¹³ßü ¼i¯í7©‚NLðñ>@÷.¤-%ð¹RË.iWànFž‰ÞŒÝTfèmÙ㊸añ†ca¥Vª ÔÓ1.Ášþ0jmM\ÍØìf´ÚÎ|½…Ù ã—Éç÷ËÞqa‚Lx?p|à¹NgðŒ »Ëíô8¹0“°7,„¨gGt‡rÈ1â==HÇÅw"ïЙø]7ÿ´Ï—G¶PÞå‘ùhr߆J9€]•¢(.A‰ô”lØkT»T¢ŠrR&28ë+†˜“•ÄG^{îT±¶VMý̸:pB2©´<¦ÃŠÆ"1âÙ„sŠ›¸Æ «°V~¯ÏÄ‚B`Ä.d¢˜†l¶~ª¡¡‚&$744åpÁí”‹Ž©…{%^.’ˆ\ôÂE¦þ~Þ_„VáŸ09ØN(z`÷K¡ˆ²‹Ÿxi¥…Sàä.¢©µ–_BP¿T r^‚1 yáGã7ʧË?¸ñ~·ýz[ïᯞÙÙ½ákÛ_ulñ–÷•ÿP.O—çLcçðéõW~RþSù‰Í%ý+Üã÷±ì× ½èÀþÈô'—‘ ì÷UÆþÍ|±×Âã‘ûáûê¿u{Æ­ ìUù:V©S7&åF<'£œ¢82Ä"·¤aíÏ[C£¡×¡Á?Ùha+.â$&¸A@^ÉKúþËvÙÇ6qÞqüž;¿œÇ~llßù.¾;ßåìœä_œÄq°^ÞÌ$¶1Õ%´‚v°A’m”±±Ð¶Â6ÞF%V©Ðn°2• ÝÓ¦nÓÐMCmÿ «¦¨“ª±MjÄÔÃ~Ï9늺H÷<ï9òó½ß÷ûùùGü´·žzˆ‰Ýη„„ú @©×qNcžãA2IÖ"ÏÅ9Ú£E’&’Ôh‹‰N2)Êiãæ8òÁqZ(§\ϼ£æ“J,fBòÝÀŒ†¸äÑښNjâ`˜¸eî¥#ÿš íšœÜKož;°­ êºÖ·%«é&ªòôÉÚeúèÉ‡É ¦(Êý6œ Fµ£vy0.œŒ2¬Æk+„eÍËÔÍO¨Þ0å¦<Ø=®NóIñiñiõ€vSü6m²§b>äïÅï n“õOÑ·~✱³ Ç »@ŽÂÐ)€vMhš:¡ÒhÊ4'Å=êŒ:«2X­¨Ó*3­"•Ë4«ZJï§Ð_lN£(OK{ÇIùc2©ªS,r Rœ¡3ïpS mÇü-:„¼f~…øtÇ«(:aBBñăq=!çÓ˜kõ×ý¯BÄ£«Ä¤«HFÞIERI·E„¨Oµêm‘Œ‰Ò ÙX»‰ >eR‚Hذ^u5Ie]¥Záµlô²¬¿ÐÌ/ˆ–PÝD«°ãÿH‹Ö¸(ÆÅ¸h1N+áh®€ÖµáyÍwÜ9ò…%_GKmÑè™[7·b}áÐÁ5G_¤·ÌM>¬þà•¯¼$Ïå×ÇdF§·Ð§j¯Zû¶žþ.ÉÑaxüð(Ô…«”úàÆ%^èV mq¸[Qmç†êê„n{½÷äy%UÕ§$‚ÀA·á¾”½B+¥Ð8ÈR£ˆ ~ÆVÙ:¨—â˜G _áð ¯`øº"OÈGd—| e(ž~õR’Ø%¾ È8€á±fç±±6Pï¬jÙù–«xB¨Í÷NŸì­\ÑBn‹²z0µa·¸¿½Ö_çÈÇŸ+}†K¹WÎØž ß{ÿ°áŠõ¯=޶“ À‰\…)££ö¯ÃCMËñ4,ïG.ô½Fß0zmîØ¥ìJî4·ý@¹B_U®'¯u\ë¼Vþç¢PG¤x'D¾tД‘è’MO§‰º$Y tIA%PÆ”‰ÊØð&¥€Ó÷uõ&ú:å år;c*^ƸUêŠHR2YR¾¸ËT$@¬û£U*¾ˆã÷†ÂÏé,ü´g©Ì2µƒñ¸]èK§è8ïq³ö¢)tëRòù/Hf$ZtX‘dØìlmvvõ’MƒïQ!G×þÀ*¨ ( ¨> óGOxÊÁ™ÕOÞBÝ ÂŸCPP0vDÆñ`9à ­€%H$Aõ¬A1R„4€@Ò piêÄ¡”ÃZá Ç-è%•“úo'æe6¢Õ5=µ­k:¼¾7þPí4£‹jÿZo-Þ‰šæ^^ç»;èÕþï’Wžß&÷/D—ÂSŒX»u°èÑuO‹HŸBzíKF"×wš´Žo£åèÞî@²Ù ]Js ?õ€º¸¿Gì€jDßMüöÑ0ï0¿¤º¨ºhG=\ .äìÁîCùïxOç™)»+ò— èÞsí®´¿ÑþVòÍö·òïµûòÞ%ÞáÃÜPþ³Üföu:]F—Y¿åE{J§\ßk¡ËE•*¥'b#¥qîxô":Û½[j`c•Ò—‹Ìr–ކ£t‘ü—_q…QÎb}¬7ÛÖšmÓ³mÆ€uÞzÝb\ÖBk•µÛú¦uÆú‘õ3ë÷ÖmëŽÕ8j!«a“ì&ö+¬‹f‹ìJvû{†=Çþ†}›õ5²";Ê2‘0ËðM)9 ßhl6‹ËéÜ ªjš4oÙî /óøíüþ"÷þ™ÿ|·¸›§e/Ýl“Û̶r›«mÐXÔeÖß§(ÓWöMø®û\ L4åÃà,SèuÛ¥=%Ú.”èÒ+Qɯk­´–ˆHÌR½¸—î͹mMïÞ@IwºmwÅ=âv¹ã ûÖÁëÞµpZu,»êÎØìXöU0 YèHdÜH/‡ YžC\ÌB°ãÚì ¾â Ðކɪc}ÿ–Å`l4î¤E®¯¿YkÀŒ+UœÔS…T@ I”_ñIHÕú™^‰ÂÍMjPaès%‚$EæCä™gÐøX•‚ e¡Ëfu¦¦òÝ=ºó^«¤8õ»=Vʡޫåz9¹y껬=tþ@eËÊsv뢌М*–×ßܶï4hˆ4 ¢”Û:Xù\ÃW‹éd¼=wðÄç×l=ÿ­Ç¶ô‰0•³­]KVZË÷.{$sbî˜Ä:?¼xÅ1TX¶¶§·Cá=Ï>˜q‰àž•Fkí`x)Kq˜£µÈÜú»-j©IÆ+¥ãÁ nä( CöÛ^!l€z¯­È“Éî+.ì®ÓÝiØFÅ5¾oüظax@€ Æå8Ï„Â6FØÆ|O§Ä[W9‰?æ/†8‹'I“±¦8ókœ\&FBB¦`âêx6ël5ê[ù­ÆÇ¶Þ';=ášh˜'ôãî-Ô×£Q˜èí( 9×]o¸B o¬ Š*º¸ãðÈGvÝÜ»rGá´êmÈZhÒÓ°²h uõ¤ù´{e­¶klúÀ©ïíìÙä:»vA³Hëµ—æF&´âPÿ…w߬ô“,\ý`†Ù®¥Qÿaºìc›¸Ï8~¿;çΗœ}gßù-N|¾ó»Ïö9É9ﱤ¡) ¢åmu»1ÊÒ1š— (e…¶¼µbtl¢l*UÛ ÖPj˜&˜¦Tbš„é$ÄÚ?@š6¦ РšÔöüΆ-’Ÿçî—»_œßó|žçûÜ17Ý£Q”EkØwC³älä*º‰þB2v”!ÓÒ*yûy »¥q*tXüPüPªç¤3¡s‘ÙÐ¥˜‹@‘ œ-Uâ:äH]G¤ I ÖÑãøo»ëŸþx£ŒØšx'rj¢=PÂÞ ².ƒGh‚7šOÆnAMà[ä²¥©?‡ý™¤fT„/A : &í>`Ía(èx¦”µÑSÖX57)ô¿.à¸gá&\ÄN°‹Yø£ Ÿy ±ÖêîÓÞI™òàìøo®oØ~õ­†»ûFYÚç“óªñÔ]‹ÛVßñÿ`jþôü['²¶ç±¥ëK@ÇèÑ×îôi9Ü–+ÃÀJ4øËfämÇ{޳ŽO¼6·»ËN„„铳¬Ý\ÍFxŠ#üœFÇi.¾ñ‰]{ãìMr=g|Û”¸ÄÀVa줔•à'ýiëpB%i‹}Â1!N¨éSúžpîpoñíˆL¤¶gwûögßvöɼëý s.ã|…ßç"qËk,ºõÝzn½N7Þ}¥Â}XV4pÀê¨ÅV¤ Zò.ê3Úží¾¿ùññ…3cO}<64ÖÇrùÁ=‹6Æü1ÝÈú’«—6,ùê›$%lSFº²8½ë·‡o½l,@ͽ­-éùÝ$ùc¿~?.î¯eUƧÞRmj8U³Ú…:y–¹k>ž7¬¬á ªJÀ2®w£óå˜AMÃÉ¢iý…wçñ,v·| '­ .Ùóû>’nqË!¢Yò†PÈ !ŸL-/ÒÚNTÖp'‘R£±ÖðpÝ?Æx«‡*Ï?`׫]·º¤²­ºqåüû.ÿ+óD ¥Ý;÷½C«¼GvNï<yþqüØK²»c͑ŠAPƒ PÍ|ÆÔ-ÊQ’§ F¦Æ–Ö„R.ÁÁqn(øšÀsQ™™UQT¦Ù ,©“ EÚã»<(ë|5@;nÔMŸ³‚~M§tÐèÈ-þPJ5Á«Súçײ({… RõCOsUñWªP!¯8î‡Ï6ÂÞÔSíF˜«r$( .ϽÂä¦9šàî›Öe•»Í1\ ¬çu2§ÿA9‡Ö#š€ávr)°<…Ë"ô¸É“ }¬«¿ _jwÑÃÚ¿¬YM°¿tøžÃeT¹`3Ø×-F¾R] Ê‹$Ld…ŽBÂø_ŵ֦hÏÓáAפðÊù?— ÒÞ½èO§·o]4` Ð6F ¹Ÿžßú¬?FE£(˜_Bî[7¬¼ðLwv°Sa[\¼§‘ÏNn]a"Fï/¤¾’òıýÒ|2&4ñ¥Ll»7{(õ±í,ûQêLîvôÞclî¡ûÂKì€mŠMÉÝòˆü¦ýõôöDöÄP“9T)¿@P½LT*¦:g)ôfHö¢éî)šñ„Q4C2ßÈþõŒÛo+”ÍôHFTjí:Ìq­:I™z›AU¨“ƒ n;¬3ÃñV~ÄBÍ]ÂÞl„oA##þÞʃªUz½¨·Ý?ÅhJfŽ»E›©Ì  /áKú âåArpDð¢`- ˆd*Tƒ)Å3žùq†Zž©fÈÌÖQÇ–’noôãx se ¸nçË“_CŽÌYËxbÄ ÷Ïký …õ9¬™ç4‹y ‹cø ºÇW•% l5£š×W4 <´y;ºÚ­ç .Æ]5ƒmG;S{¦ÝÊ ªÖŠëwqòç¨o¦MôŸ_DOeºŠ¿úlÙäØÓ;ßûQuíð³»¾ûýÝ/]?U^Ô»|Ygÿòlxó¥gË/Þ8Ê7Qï¼Ø–ìì[hEC_*š#sæëO¿¡´µ­Ê瞘SûòmÓ/ì»XÜ\ùÙø‹Gg俺㒠+ \!/VJ ÂÖ ½<ƒ®%è·?jêÉYT.. Iry®š#™†ÚKÇiï T"#;UÈÐî“ÎóN2ˆ1*;+ä¦KMDe5¢²QÙ‰´De¥B~n~;’ŒÊ™HáU¿ÁƨŠât:í2‹Ø´$šÊ‚’h?nˆæ@A4‡àÓÓ 7ù60‰$- F‚¬MÁe\/¢°xI$‰x¤r_È!9w*Gê¹ |ÅþGf`+ËÃn–‡ -;Y>“³¼é„¤Ï5y–N&¬%øb·HO\HT^šéê5,LX¾”õ(Ûª‰@viMbàü̃šSîêC”*Ðp½zôƒÅ9´~ÏôýC L4Ê(ÍÏ£cÿ%¼\cÛ¶®8~/)QJâMYoRiÉ6M=ÙŠk%¢’ÔÑšÄ1¶4«¸s—ÔÀÖË«ëÒ hÒvK7`0ÖmÙǰǧxqš¸[·¨Xn@øK³tÔ¼¡)à­Œ`èjeç^Éq&<—÷ŠWà¹çüÏïœIWm‰‡£·a©îgø+_/»{€úuç$¢ú«Ý­ž †kRÉ(¡‰LBØÐd ‰¿¡é@Zâ·ø_€ð¼m°Ÿä×üœ¿?¶aû0uÆ#ƒÔ̧ô2³]afí‚U,Ï…ñl³&/|ÚVÇUNS§Õ êœê(¨5uMuI’cM8¸ÛSLTÚÇFVW:•¥¶Âô‚¹Úĵb¨ë~?ƒO³õɃ¶=9ù^~G˵MUòÛGØ„ml¬ÅU†Áe‡¸ ÁowÞmâ5¨â"*¡¿ÓÆð[펔ÑfÎüD–J>:~sŸŽŸ‰{â ¼k>kšÌÏáÏóóÇ&] H‚ëš¹drÈ$&g¾ÅÝ@›¸°"M˜×îzŒ,·Ž­€èšSÔq+¯MCzÎ%tƬúRµ ¯Ëe.¬0w¶'&kµÉ‰÷‚Ñ?úÙ­}ÙÌ §/æ±ù¨ó™‰õnm¢UýlË«õ'Þ5P·, ¹õ`°·GÙúð ·½\+¸z@ w‚~´0n_áR¡á7¹ßnr·¸OýΤ'&f™LF¯$÷öŸð?<ãÿ~üþóÒyò«Ø%ÿeé&ùˆ(œÄO,&÷ÊNd <1H¾¨;%‰$“ U `ÌÁUóDÍÛkÝ}†f€dr †!¢h!ÍÐt]ï7´¼®óη9À§&<5ªxHÒ“É„{I~5™ R€ÃòÈëÇ%€äKɃ*@³1 ½;äý°øï"÷bÖB;½ø/ž|t¾Ï‹½ øâ¥Àqò@Víîĸ”Ô’\ò9UÕ$¤Ñ´íïï£gL@Ý };ž¥>G_´P| ó(Æð2å0À0:(­€U·§–×–WW§ÖþIVÇ(A±¤ôÝKVW#kË4cXÇê>—7/wçòsŠŽ¦Pp8B 5&MÄ®÷މ»ê®žcW4°ïHZeb‚!—««»-c,PxWèÁ|ûƒéÿ¬:ùòÌß¾ íC+™Jö¿YíÝÖJvtí³WÞ¯?îž~ó™Ã­ß¿É@VFámXù%S»{¤ ¢Æm3 jA’©²MËxNÆ’ ˆhN""ˆÖL߀°L߸ ÍÍnžœ^´ŽÊ"U/±­^ÔÌ[岨Q1jmdlNij"F"9ñ´&_çd¾ ×äY¹)/ÉN™þ¾T.S{ÅÊ—ƒLÄhºOŘ€­‹Ìã‡$k~Cªöü÷›wŠÿãW©@ÁÛïAHxØu”³µ]–eÍöª·Ô…ªhTë‚â6*à¡JÔДîÏ—3–¡õÂÀV2uC«êÉкtÝÎጡ帛Wu{W mÆv¿¾ÝÐFuÝ•±†Ò.ìP«›fêŒ×ëp¡Q¡:Ò›Sº¼ xèãj¦ŒsfÃÑ€€H’&qR, h¥ñzôZôz”·£³Q.z+éÏ[°d±%ëšuÝâmkÖâ¬[Hªh®Ò¿½Îà9™)O×—êÜ…ú\½Yç pY¬óõè®Æ÷¥ù4-üf»aUŸhumÝNUÛÉ@‰³J?Ôñ{É Y¡¹@“ýnÔÖR…R<)úB1›È–œy ®¤S±Ï_6©8îSÛ%©š„åYø /ì?eËZÊíI¹ÕœSó¤s(•v»0% ³gw±Ùpnáö û|Ÿ Ú;>ÁP¤!ÕdŽž'¡T‘ÿÌŒ0 ˆ½Ü'wmÐßžËî%±}/uÖIç9°ôþ×â0ÚÀ" äb¸þÿÐB{56å¢sðŸö¾<6ù|zü‡ãO°rçÃqY1“æV0\o%r–¤â½é ¬©Lø_œÞ¿cÿÉñ‰ïžo=R–qæâOá×^Ø™®ÕZÞ§c=4 ôÒñk/ÚFHÛÝòª LŽp„ÉB›«+&ç \ýÑâ°GÀ¥-»Ç-ì¦îø¸üû1>$ mó7ð‡qN– ®¦ ib^”®InO(†&µ; \­g¼ÀÜŒ±S”±C:·©ëéTJ’Þ茓w¸â ø+ó‹ã…;oØ"ƒøB¦àeÔ )»ˆ}IÁ)åºÂ)ÁÀo…â·bÁ¨Y¡¹¡PW(ƒ+”ÁÊàDÁ oI³æ,®`…´ê¶:ÔÍ,lbuèÛêжաp«CáÌ'з•èT\.{¿³¸mf³|¶ƒßÙ~gÛØm”³Ñ ìfÔMîÁn˜YÚˆ-–ޤÃÝ«æ1ÀîêJÁbïT›½Sëì-QöN­³·DÙ[¢ì-Qö–dohC¯øm"PÖN4N ?³h¼²çà·!™ ÙŒx,7ØÊuÂóÔØ®§wÿ´õ£# ½{¢‡ð…Õôé–øµ-®ûœùØeþ*Ä¡¥ñ~;òn ç|Xþ²;õcä g]·˜´Ìß £;k–%vÄtúB»™ÙÕ65f懷–©µ^³ÜÔué¶>­Ó¡ÓÖ_×9]’5™“íE³Âû2 [S{Å(‹Ñ ìqærnpË1ªœíÃÛ»25FÖ{¤ÛpT{WPû€ª+Lwâ4éáz45¥r‚Òêâ!OÄÑ/H~9o™Tq·GVQÄ•Ìá /Ã*Pq—7¬þêòmã,ãø½gßã;ß½>Ÿ}þygßíØnj;¹4I›àëº5MGÓ”Ñð²QªM-?’2þhKç²–•£)-” 1•iS+¡ŽÚlB"Õ¶Ž!¤FlÒH£‚ `mÆ Ñ`$áyÏ×Qé}{ýÞ=ïó}>•fÔ"åiL¥R®”Ë ˜ †õN4€FÐ>(0“lKháÉÄQvZ˜ÆG¿¢¯éÁ7š”Zñiîhè¨4 à©qÀDÔ Õ4è^[V ÖeU€Õ>(‰g­úíç÷zëÅ¿_ïQE~Ûú.­R ù¤ïåÇÿöÍמ<:_~U†wüù×û›ÃÛÆÐÊ]le¢$‚ÅÕí~p¤ ªŠsr5 ±G…us8ÌFª&ôD–Θà _°¯š^å¤Ì®ã*–¡cbóg9—PÉI%åz;¾ÄÌn²‰uj…cõ…:]«;õ±údÝ_—=, ÉŽ€j‚#Œ ó‚À‰Úè”Ë÷Sn²°L"GÔ|~6žu팪“twËn’¨º®õ¶kÝs­ßåú>œ%KíΊ$¤ˆI½ôÊa¶°.®%ò•B¦P̯‹—Ѝ ÁPNvQg:_¤(/´•v‘Ûd9aÛ$C+ÞÒZ…Ö:ÿcJ+1™ùŠ9YlU¾¦äûé÷oËVŸøËñ“7Ég |âÖ¿Æ7=Më~Šò}N@  _àxEÀí”Aû×Ù”nW<æ{tFïu§­ý±„]땘+è ªBó‰PØ–2”F•ô Öp‰EјªRÆy]sQU½¦g\T5-½DNSÆ vKŽ6Š—îkH"C•X-”šTð%4AùÑÄ•SÜwƒóÁy|Éá©’¤ê*­–M£}Þ ·ضkSY×:гç 4i ÊÀmü¾<úÉ;½cU¡¥XZ‹.°5¨TÈáàÜÃAÎ4×bUîÈm»£,¶Ñ€FU’™®Ö’@ . 4ŸÚÜ¿eóúÞQ.Ê$KÑ,â„jÿ*7T  5ßóo~gâ¾Æ–í÷úÙ˜ÑxøËoõàTÂP0pˆfÆbé$Cêý®µEúMˆQ7}Âù4_‹â†‡J Δü¬S®å¯~‡ßÁ`®„óå~¼¡|‚?mž¶.ð?6çøŸ™<#0¡@)* ó÷ ¬Ã;-wëÔ9ZGˆÔäðrãG¤˜£ûœuN®Âvõv%®'Î¥ôd’+¸œJ¢äÚs±Û²Ì*œ¬dÞËcGŽÚè™Êá#¯žç%»=3D2_b­‹HLJ6ªÚ;í û‹v˾d³¶,ôpà†ö•‘,u’_…;¤NÔé–IöÎDÑt"éS•‹KÍ QˆŸ²P%ÄI…Ž’k£& ±ìõ†Ó+ä„»ÉÎga×®…eˆùp¥Êø¢»‚“@NgÞ`: NÁ ª0„bmÇqª±D~HÓ4©¡Í­ýiVPÚ<ˆw×Ñõ{‘b€§dðe4pd4ðb”;.øÖ2lá¥å% ß"‚çHU'nT xâFœÚ^ä—ó]°5Èã…Ù¶…G®ÈwaÀì §.ò]ù¹µ΂V‚]¼Bd6 Bú?t§¦ ˆnp¡ˆér2)Gþ• RÁôõúr©Q,ôÚ**ù þ®d Û\Ú¨dQ¡9zr÷–IÏÅrØèúáÖÚÐà£g»î9ýí§Âr,zõä£}V*Qzí[»GÏŒ•ùn4vüø¦rmëð¾þíùÜ¥¼$Aq¢ k·é3þ*A}ß§ùiv^ sè2„ǯ(¾è1±Y¾Æ;¼?бWäiß Ã_’)ä÷S£34SŽÄ¢%âÀËó„¡7«Fæ# _$‘$Êg^/€à²Ëzw£J L©ÆÊb³A¾åA„_‡ÎwŠšBឨéê|wŸÚÞ° :чæÞ~[*à͵]—LJƒ‡ÿé=þ•Õ‹{V~¹«šÙ›ß3dœA˜ã¯$ZÝX[ô×}ÏSzúEÊ‚Ý=´o-Xt‡ʈà~¾žKûÿÁ½  ‡Ù92H Ññÿ‘Ck‚BΘ¦déÓÔ,Ý0M†e‚‰½|§ ^K±e¯:k,whž€g À³„ÝY‚í,Áv–PN èœ_Ej*®«í¨ Fgc8ªÇæÖ¾á쓨t6•No•°"IQÔƒ’WbZD”ŸÅYLIJ†Lã”*¥°$"& EãX6Mñ©ãƒ5É‘Æ$ŸÔßAÜâ–—,zÑä0]G>4Fv6;¸Óvw˜2‹¶æ„$kiÏh74?ÖÐ ðt8Á7›» WiGcy òn%±Ü\Ž/¹µšÄCVPX€¯àòÄúŠx¿r‚Yw/*q /!<ß›ÿoÜà5I;æD5²Yl–Æát‘ÎÎeÀ5Qbþ3ÃK tGDp ê?È`$âjÌYìæê«ÿe¿êb£¸®ðwgf×3ûç™ý›Ý±³3ïÎÂŽg¼fmlpð‚íÅØØ8!NH± $V¤D•R"BZ%(•š„¨RÛ‡„§üPYªÒÇŠJ}¨ªVÍ[‘‚PEEÒ R¥¡^÷ÌîID£J‘*Í}s¿{ϽwgÎýö̹½†ÚÎ>u””uê»]í½¬Óê驞kåþøý;5)›U’™ìlõgÌy¶[7¹lÖß}li¥û/W–/øÎÐ>[Ü}ïG¡0‹~¹üf4^!˜ ª2d^šœ¸“tÔþx²_ÝߖܦNù¦¢;2ó¾ÙÀžàÞè£ÉGÕ=™Yýütô™äQu!sÄ8l¾d¿ZøÐÿ\Œ\²>ÃÕÀÕà?"׬œ?àú#‚ìS„LÙž°wÙc\4ªÄbÈA=@©±žLfòº I–8IuIôd±¤®æŒ¬ž+/.zOá9:É.”÷é°Œ‚eUt#®ëF ü:‡z†š—xÆïT丢ÈgÀU”(ñ¨,ðœ Y™X”Á¯ öWãšÁS/:õ*²À–™K©Éoñ‚¶«y«Ë®Å€žR­6VÔêr*­•ìr0R½÷¶ÍlUÕÌ' }‘µÿ¢¼K9¨pÊ/Y; H4:áæÒ÷¤e‰ïÊÒ„ÄKév{‘ÛQSâ"³ž£ó¤8´4E -µ¤¥—RãC3ƒ§ëÃ=RºA‚Ê i>NL!qŽÙ‘Dé;Nê|<òUVSlAû¢f _+Ýúý¸,ö‰}î'fzš‚P-{È,ŸryñFýå½I1Þ«Øuéòwò×Õ[o-_uµû)ó–q­ôÏ3½†}ØÑfœ8È´;ìÏ=™;ŽÖrkYÂî.T?oåÞZšäÞxÝ1"ÙlkT¹·ú#6Ÿ]%f³|ZMŽRsbX3ÛRz×Ñ¥tMéÕ ™”î°ïœmëa.ä¦'oÅg# k÷k´LÙh´ìµO´,¶œk‰äcùxz´ *á9ÿ\Ó\èUç4NkJ‡iÕ°9¨I÷'ÒI=!û˜ :eQ1=¾:aæÛ Ç©h鸦¥CápŠR¬ðN°8Â0¶ÂÑÒ‘pM ÓA›K™Ï§µ]*œÌ4·]Ê$â”ëøü‚»Šç‹+òµ³m8ž/IWÍ 'Á%(p•UߪU†Y2MÞüÍŠ|¿£ì"ÝQ¼ÔHFc_š¾@IDM@…'nµ1ùrÿåËŠ+›¨«!µ7Ú{\´ õàiHucïןú½I”ë q2MëV{Ì5¹­Z²–T“jý“Å®T?¸ÑfŸó?__ÜÀzíuƒÕ«3Å¡½÷Ìm.uÞŘ(6§ZòÝ9îìO†iß¹•©ÜÁêˬå•õY‹bšï®w—F«ÿêÛþÐÀº­å\0xÇê£Qöÿø¸¶á&8™N²S€pð= 4­Äçÿ{J@ˆpø} yPÚ€è9 þ‡:¿ú2Ô3@ú$ÐòÐz¥ŽÌçu¡/cå÷Gv0S@þ°ú(`i@û¯ŽM@'½Óšó@×8°öÐó,°þ°ž·ÿ°ñb/•7€Í/[èÙFã×1ñ Pؾo~fa|æ©Éó»³6Ø¿ç›0„Â0Æ1€9iæ1ƒjÏ+'q€Ú»ñ9sñýØC}3˜Ã“Ä]w~óù߯ ×Ó>WÐGƒ}äY)M/(gÉ“œ»!ì$YD˜Ûº^c–‹Òôå?··Ÿ ʤ®#¢»ÌoÅ.~¡±ËÜk§^ÜZyí¡æ¾«bZ¬þùG]·>3zÞíÄÒå!±‹šî¾×Vþ÷àÅë¥ endstream endobj 192 0 obj << /Filter /FlateDecode /Length 33612 /Length1 51144 >> stream H‰\U P”Gþ^wÿ3ñD¢.ü0\Ê GðB£DDñÀÜ$2¨\‚ŒŠF]5Ä£À+–ç–]‹Eƒ«ƒYwƒ–Ĩ1ÞçÑÆcW×5&ë–:½ö¨dç«êu÷ëîï½~ý5@K,€DæðQ± ¹Y«€cÉÜ;lb‰Ë}¤û¯ÇGÃZ6qV™ùýÐk yì:`=šçÎ/é9³&ðÙ3ò‹çä |ºCñË€÷FLvMúÒ÷Ïì~Œ×DîðïÒ¶hÕžÛa%e³ÿ±6~7·{퓊K'ºDî‰@`÷Mn§–¸f»ýf´ÙÉóMö7§ºJ&-ï6 h8Ã|2Ý¥3ʘ7ÿ­¤u´Ÿ®ÒUa!bšx =ò¤¼®z†Nâ•: ˆ÷µc øÞãl¯æx·£Ç)€"(†#ºÄó}D*c›8-nÈEr¥za,öÞôþÅû\WÀÊU6ó0sþF˜C*¢ô-3_%~/[É6Ò.»Ë7äh™-—Ê5òKùµš®jÕ5cá2j­.ïTïY¡?à\,Ì+$¢'×OWÓæçfLÇ<,DVp½¬ÆÔrÜŸã8.âü•Oœ y÷®ºE´‚±‘vÒaj ãt‹~l‚eD‰¢¿Hi"_,b¬gÄ%qOv–å|¹€Q%÷É« J)m$0ÒJ£ÆrÒeM·æú|õâáË®/³_ÞðÂÛÑûKï:ïaï]=VÏaþáˆA7fº„Ynä¬f|Ì•¸_à+\næú„\ñdçjpð©õ§4ˆ1”F0Æ0ÆÑx†‹r©€1ŸÐûTNÐrZÛŒ [5í }ŒOé ã"5Òwô€ž.b!¹šÃE¤ˆ½9Ò1P #ù¢”áÓÅ,>¡ñ‰8 .I.c¤KN“å.yD^ÿTB9T¬ê«Æª|U®N«³êŠznN£À¨2ŽX:Y-c,E– –Ý–{–V‹5Óškg½`Õ>á¬VÇ8î½øé/ÖršfíÕlÑÈ÷"Pº%4†3f£e±\!ÏyôXšt*d¡œ¢·É4ñL–ÒXñ9…Ê`#Iæa4ÕŠ[⩸«h´¸OQêCúT”ÊaiÚÄ8¯T¹q—‘$Þ¥zÑ Ëe¹þ’Œ*j4ªÄY˜ê¦ðG#ßê%b=OúZŠJd©Dã9 9ï;ŒÙœï~b)u•TîH»øžÓ:VS4X…‰·EoªeÅ}IAxHÓ঵H¦ÏèÚ¢í²††ˆWø´<¢%õägì” ¡ ÒÙM)BP¦x,ÆÈC–3²;«Ä9Ì%Iq\;ÿýy1•oÀÉšæd59O ÄzÖû§ÞCMŠm\1*¹Î¶JF"o‰“Hâ»q‡‘…ÅHÀA®Á¥ˆ0O/ I¬ûCY?öSbÉÕÒÆÜæó{ÑA„²Nà]Ÿ±þŸ`ÕÏ Gx‡L¾YõˆRM#Ë”“•)‡õ·’1 oqkV[öç1œl€2½U\å×ñ6¿9ßòþÑ—ùÇVå`Ö&+ó4ž±É›ŽdÆbœ$w™s?¾ç™*•w.â ùÂoâqêõHᳩËu%&è­úMäc”ÞÎú;KïA,1²ÅX#Z%²Æ§£üý‰*Y·Óqõ(œñ€±‹õ3>C…ºÌÚÙ_/ÓÀùå åò+z%xÄyK—õxÍ;LÔé4éæª#t&_èbVÞC¨¶¬= dT'''÷ï÷zß>I½{õìÑ=ñµ„ø¸Øn1Žè®]¢"#ÂÃì¡!fpÐ/:wêøj ­C{ÿvmÛ´nÕò?ß>V‹¡¤ 8œö´Ó‘ãQöôô˜¦¶ÝÅ®ŸtäxLîJû¹ÇÌiv3î™Ìžyÿç™üoÏäÿyR³/úÆ8L§ÝôœJµ›ûiüˆ,¶—§Ú³MÏÃf{h³½ªÙnÉvHO0©¦‡rL§'mVA…3'•—«óóM±§Löq Î×M?¶<6»»Žlý¨Ù6gR€OK&åéhOuz^µ§61ðÈp§k’'sD–3µSHHvŒÃC)í¹ØxZG7»à_¬W lÇ~»³·çŸÍ¿mÈ3²ÏÆüÔ†3.±ïb0 ñæÎuÚ3˜ã&¡â'¥‚QbHhCÚF„P›"܆5Ö´2ªJ+ UeP~Ú¦$´¥M BP ¢zû½ÙÛã|ÐB«ZþîÍÌ›7óæÍ7ófkå4¦^kºå4Þ.^ m÷ö—;<´"Ìîôwv´ÇLÑç9ò‚˜·ÎœðÍ'Þ®bðüÚØ¶tm¡0"»¼\5Œm^sc,]ëãßxc˜j š0¢˜xBØÐìÅ\jon}H¯ÑóûÌ……þxG]QÿX2š6öN©©(ï÷äÙaí›,dç¤V¥t²$»s©¡)W…=ò/LïJ/<‰ù±¦¹ü³j.+ç¢þâ ¬ÌNìG—ù@mÂðÔ ÝÃö¦+àñ{„ý÷úÉÈ–Žd‹ðÜ .2KRDƒÞ)›Á YVÆq×bGáãY¯ª(ß8 šþµ/ÂG#¶ñšJßçãíÝ>¦¨˜=1»î¥…G(\Œ›j‚5ƒŽfÜ2Öô8š”yÂ#þ²gf•¤þs=ãÇDV×˜Êøÿ ^eëšý m1oÄH$cÛÐ2¢fëç¦tÉ’b+pS R‹ü ^S[Œðï Dý‘®D=Ž|4ÇÔÆD¡·Kj¡C¿í©‘¹Ëæ±´€.ùß9àÎe‹âšžD½ýåóݧрõ[IqÛ,¹&³&8²>oD}„{Ù†€ÃZ‰ÚÐÒf£F袸¬ #ê÷F„Ñ1`õ¬ð{=~㸈‰˜±6’p¶ÀúùöB3º#ŽE¬Vj*øHnßp„–{èóõÃMž¹Yi®=¤qIu€×©¨£^|ü€¯é‡¨^!Ã}¡k¦£}—öÐÿiÔ›!w©!h_ |”Í€XÄ€%Às@#úšÀ·y b'µ»¿B®ÓäqµR1°e¿ö•iëȇr=×1ßl1™ÊP.†®Ô=}O[—X~Ų_+ìÖQô PÈwï¤BÈ\` Ú 0ÎAö²AœäµZWQÞ?¡ü9d¾ÖA.AûR”ç9°ù¢²V¢œ‡ò|Ä&ål »›lƒþ9ð±ú±¨«Üóæ@r_ŒY*.(…ʼG.P¿ÖBc¡-uóš5±ÿìÓ¿A”ýK‡íŸûªÞöí¨X%f˽ڒ\ë^õ ­û­k(ûõ±a¸/Ð¬ï ¤uÒ$÷dë¯ðq‘ëU¡žL”à1÷ÒVqÂÐõ×À›NZ Î„¢Êº¥~‹&ëzëE¼i|3÷À…©è×,í;iŠv‰ P3²ˆþœŠbƒ½o€¬Eܯd‘õ)ƨe`œãÀIØOÀü•Þw¥u¸}/C÷,°™L€~»ä0lØó<ÌsØû@ÉA€¹ÌrÜ:ñ?$1˜ÌxÞ×€_ßã>w<úOÏ3g˜›Ìæ†ä?ø$9Ëû¸±aŽÙgæ‡ê“ô0(ǃ~keè+Ï ï#ûÌgÇfn1g }‰Í{å*¯“9•&ý®r9·<ƒÌ­4YÊÜg)Âr ¥ê U3gíX;RúáóÈg‘Ž?|>åÝ4†cÇûîH')¹ŸÐ-q½Kj3i¹8þ·£ü8äÄgŸ<ƒWµïÓÇj/©îA*Ç^òÙ}=Cîf¸‡”5o±,ÑÎÐëR©ÅÚârõY—]}êó6œrºÌ„2hëX2Òuÿmûÿõ¼«žDùo®!ËÒ†èU¬•ÜWf^G¢ýДe•ÝYÝÊ€{yÀ›ëÀ3Zß~aš£ ÒBmœëwb—¼ƒ"b˜â"ˆ3 [Äl¢K¥"W5À†äxÜ’ÛØ]?ù.¨G{åÜ˼÷ú-ʦ¹®à>jEŸCr­y囹i»yc¹ƒ”¯©Lö H›§ð^ñÀ˜‹dn^ÀcêM’³¹Òf¶u++ŸB ×›Tùr®zªÉ Q‰«Õº"ßùô˜8M3D==„räý6ä¨RäËzäG@| ƒ›».sµ”ÖM™ï7Ë|žíª¤åò=Á:¦è¥4¡ù¡KP…xã<^ÝBù-Ë’ïƒßSÏöhò}ÂïUž—ßÂîªà3Æ>È|ÃþìßÎÑCœÝÃQ|ñ.JæÁ|ÔUÈï¤á•d[‘-Ÿú.µJ] }¨žP«'¬n~Š÷è«âØ¿ÃämÈß§ç!‡/F¬~C1qåb´ï6âí·žrµ\êÑotkawc€ž±6@¾Eóů¨K â}p‘ßäÓ6@>ÔQ­òcêVoR·^œ<ÏzCŽÏXo}YâòæÅ¤mÒWwóyÞvwñWúšî'ûxÿx WÚ¡¦Q.‘õ°åp£º“ú€ýê{èû%Ú¤Ä3/E•KÀÞ$~BõRö8cUÊsÀt­Š~lA¹òpØ®Óà} cŸ„<ªãS¡>>C¢m°øµ£KÏu·öt¸ idýmêa(×­22ûk[¨óUkó‰â2½ÂÐ7S›{#µ ÜÚŒ™QÇ<³´·iͽü¹”s4CÆÐFø~Öx¿à³Ëùùÿ5Þýû»xBúp÷±Í¡ÑÊy*†l…lè Ô+P;ñT®ƒkŒƒô]ÙžÚ?»\!Á9;£=³ž¹¯÷ª«GñÖMƒÃƒ^¥ÚBô2ëYïЋ ýt§î¬k?ºÚðFÙ#}"ɱŒº¾”žb¨Sák´ÙÁHÕÏá[à¾Ò>‡v2äÙÔcÔÅHé«h;#-®ÕWÌ)õÎþ8û’¹?ð/¬Úðž=K3 ›!vdŠßÉûbçm¾§ê|—\ÊèsûLü‹ûªâ8Ã3;ç½;ŽõŽ!€1söúàŒØMÍÇ%·gÎPû¬Ø l·Êù‡ˆ€l %jj× –š¤v  vÒ˜V±]¯÷€œ-Vª&JWªÔªB`ZþõG¤¥JkpŸ™;ó¡5‘Ò?½Óó<3ïûÎ;³³³»3wž <+÷Ëùÿ<;ïïïü¯û¢x?ˆw„{Ôµ¤\}{ÏÍÇÕ›2™ }ßھȎ¹ÐØa©¯CB_ƒ}1ôUÔ…ö¤ë'¡Â"mõyÐãi={ô(êB”®ïÅGA´Û“Ö^¶ÛZÌ=‘Åð{€¡t¥#˜º#âk ¦ìÛl‡ìi„îL)¦«ÃÊÓå=êH<¸ Ø‹)íÀÔw`æ:0sÄWûtL{*f9kGL;bÚÓŽY)a»Ñßn±|ÀÀ 0ÌûnÌ»°›àQ`LÚ¿îzE=‹y,Ĩ±í–Ÿc‘mK¬6‚áóì)LµÁžJ,È vÝ©9g‰…ÍL«[ĶHoKÂ9[X[ sSЍg"™¬™|PH6¸øl¬Ù*(æo±ÇÈN12y§ÒÉ:m¶’(ͺȂ¤ïVN²ØrB@!‡hiƒ³Í¹ÏÉ(+++®Ç}q¼ÏÖª·úZý­}¶j½ÚWí¯î³…õ°/ì÷ÙŠõb_±¿¸ÏÆuîã~Þg몪ºXu©Ê¯j­ê¬b¥¸u «¨$(5ß'ô¬µ`a°ÔygCJâàà*ÀˆÌb ´Ê´Â:ë ©â@Z ŠW ˜§}ÂÞ#}¢$üÊ=~†‹°Ö¬¬ŽTáµz†ÜðÈèTiHÚMð¸´W§ã{¥]Dq`ºx ÖË×]=Ãzâ@A.±-ä*€ì`´C€Õã¿…mQñPXÀÐVÌådÞEŒ¤*Ýã—ytCªq¹­¢¢ƒ$]gé+ KÅ(/PÔÈˋÌ%ºL±ˆèrÐ9Ä'5“ºåà5’/Õaéû‘E=ã»Îÿ:/.œüº­SüÏp}›Qý­°úùoGÄtYüR I}çøoôóü×IºÙ⣤Ž‹¤BÏòaL²‰X…žãCm|P—Þ>^ÜêžÐr~R¯ç/ûP·øþÀ1 ²W¼îºÀ£¼*ÔÏ×û’n#„ÎŒY|þ5¾æUIZ‘èç+ ’b(%ÈÑŽ/CKt9”/—¾¥õ„¹ª(f:j¾R;Lé÷ëP3•ƒIJ6Õb Ó3k]í¡´øÀK9BÛ¼TWGcæh3‰5yÍq³¯73ô²ùdÞÞðüpÖ£sV¯Î@ i.ºó›_t÷o~®y4¶±Ö|#·Î ŠÂTn]ÌܰÑûÕÚe—ÒZQÚ„ÔÕŽÐç”]åO;}.Zw;Œä+mÞ¼-– ù"ŒäÓ„ «’aX¦ùåÑáüüTÐÛ´Baù¼-ƒ¶¥r  䪂0e1)¹ ”Å" ë!•Ì}w²Ù„ºe2÷l"“-AÃ>B>2\êCÀ°¯Tºûï¸u_j8uÄ'ûñÑ:Ù¥wbü©¬‚tŒâ@LÑçùk)û Á4Ñxyksy‹^Þ —· æ {Ÿžoîkòz‡·^¯É–445?-´±Å¼¬·DÍ­zÔ;ÜØ<ƒ»Y¸õè0i.ßT;Ül´D­F£±\oŒÖ%Nw®‹ÝÓסÛ}­ëœ!Y§H¶Nôu:6ƒ;&ܧE_ÿ&»Xƒ›8λ{º“Î’­ÓûÎF¶$Krña!K–ü@Ø'c›‡cìbJ,dž$8®§#)m›´ …”ÒhãÆî$8ÐØ†Ä¦”À”$?ÈLšÎ¤“i™–Î0M4Í´‰iÀýVvèdzºïq»«ý¾ý^»ÛLe5SYÇ•ãYYÍ›êqs[Ç´ÕÇÖl]¤g‰6ò¡§À«· »j³É±Ê)>S0«B°mi娔®¸~*€v•EË¢´ ²“våA³~©K|f•³`Ÿ\ê ÙP\d$6ö5Üãñx‚B2)N$Ål[’ÖÙÞ<ÕôÍÎŽ©ÈT¤qJéiˆaêŽäÒ³¦C.F®GÈ@d(2‹LFØd2ÍÆ‹®ë.Òíp ¹F\c®IG;¶vÌ(‘1×?]L¢ 'àilÈÊL…—~&’qú X''å5QzN½NèeÈP h`ÑÛ€?øÀ¿Tè€ ð*ÀYÚ”1eb_•“iÑ™ÀY(P•ºmÇ"mï\¤i$ž© æDõpÇhð»øÀ– 0ìäÉŨÅQ\Æ >‚Eq9e`05w".ˈ pð •ñ×ãáx)À!@`P¶5Nÿ–¤ôþ8Ø'X€ž™‘µL|ž\€Ãªš\<ƒXUŠ\x“A9jʼ…‘¤áØ‹ÐOƒ—#÷㇑( s‘…ÈFáóHËBÕ/Ì*÷; Nƒ”~4ï`.Í+,º‹ªK nݽkÜ#l?H5ÀųEq£R +bÈw\7!Lxޝ˜ðŸãftç„sž™çüº5 !)¦D1ÃÆ›3&EÄÔ† šrŒM9)›Q1*h‚’SòkšJK ¬ŽÁÚ’ªÚ;áª6|ŠøRäÏJn½ºªèŽ¥*OªßÜ)Ê |ËÂ\Z˜ë‚êê„üÒ i!$-¤±ÁX]MaŸO~Z¸Rî×|_ÙÅF+<~¯Ç£x«¼+<àuzmVÑ*YNç±{‚åa;Šºkí¸ZnÕràL‹¹Ø";Î×·Œ.´2`Çu^@•e5v´ú€Ìz£;8@ÖÜ;*ÔB÷ËÚÿ<]zŸÛ‹ºpÆÅذZÌ\±Ëë U„Ã6g1Û¬6k0PU”xqÀúõ~uvÀWÝì®ywŒùxþ[ûŽœ|¢õ‡­mÏ7[­·¥Èï ”;˜‰µ[^O¬ßßÚº­¿¸ÌçòûÜ~¿“í¿Óžzãð<Ý×7ý`Õ÷.=¿¾²ÐXÑòæ…–àÂÎÎÓ½Óç;Oô÷½±%nzûìÚ`åú3¿mBNlÎl {Ø Õ(Å/NÈsºý’sŒ7 cؚßÌsµq˜6o~˜\Wz<Ñ–®K—û³ ·xK¼$$ J ÇXP!!{Ž>vhæžze£3ÃÓ™Ï;ãÀa|ogiç™—®þqòÀ‰_€>ÐaKV‡jŽ\UªYÇ2 ÜJ˜à\Á瀋7\†¶t¼öÿJà.S¬l´H ‡`K¶cŒf®ß~j¬Å)5ïa-mÞñbæ»fÞÍàžÆOpÿÕ§§ìÌœ‚KÅ5dCíJIŒÄlW¬ oë‘Þ—#µJ¥×ÑŒQÑiU5zK‘eØÂXR¸yún=ÑKâèkÙ@îjYè‚Nß4VCÔÚª©fxÐ*QÁóàø`6JvöòjµÖc4—×4‡ë{G2§V¸FÚL¹¼™¯ –7Å»{§éQ­“¸²0¨NqvØþhxˆÅô 7Å0ˆ¸ ÷àCx¿9œÂo¡aÍ,an¡‹Úhe0UE69-ÎvÂ.Ü%¶£tæÃ÷nâti‘¬,C §e^© ñJ]¨›Çcü$Oøé¾ý$kp·,Óµ•û=_Å8¬£•JÔç‹F/g±o¥BçeîÝ$µàQmRxľWÔGÒú‘K3! 6T?-Já"Åì`üL³‹gn0sÿš¼§Jáé¿P©éÏ©A#u‘}ìRöË4ÍHmÆÒ†?a_¸³…}æBîÝb~Ã>ŽäF³g¶ip8òJrsóSX¯ù|äU¼Dñöxǽ7¼*¯6çu£4„FÐ8”FÉ3‹ Á´KÞLoºçZÒKauçì.v»Ü„#˜Á„S{–Ø ÎäÕ{´^Q²I„sª ÛQ—¿›ó€³ê€scÇv\ d,Û‘”è~9)ÍBié^S…±¢Ãf5˜ X¸Ä[)Ðê®  €CˆløI¢³gtÏË?þ`ûå½ß¹ÒX=Núüîêå5 ¡uä•[¸uStìjfòÓÌÌ‘¿ÿîvæÖô‘m»Oãê[/ÇýÎÕí™QðÑg°íp`1+:ª˜±Goˆ*$*"y=‡H^Ô„ûà¶ÊãqØ%˜,¯¾ü¤Ç}È -ÿK{˜žð³¼FG4‹oÃðõŠ1/O¯B~ýþ~\¯ÒK¶YâÆ7—Œ+GZ„ôMšÂà]M˜jôEz!ËÙª2Øeò f«Õfq†jIˆ€®ÿ3¼ÁiŠlÍž*kŽÚ“ï©WýþWw÷í®*$±—?I>þY©£°ˆÆá Xã)Xc!nRžU‹Új›¸lu…¨’(ÒZ­ËÕõzõ„šS©:5Ù:Å~MÂ0Žj™÷sÃiíé¼wØwl×Äl‰7_ª¾´YàNª’Ø‹d•lvQÍÛ´¢Ö^!­•öÛFjQ"Ä–/é$.—‘ˉ6ȵI•›Â+<¯˜uuÃ<æSLPÑ lþˆ„ǤI‰H³L wð,&ºÂ>¨ä"¦nÓ€iȤ2¥°Z1ý—ê²mê¼Âø{î÷µ}ík;رß8¶c›|€í”Ð^(å£I +)]3LèB i!©øH Š¡ ¾B“v…±1%n!”¡AÁTºilë†ÆþØFÙ4‘±¬m:eÛL ;×qigÉ÷¾º¶,ùœçùçPüSnâ¥Þ¤—MxS^Æëº Ðg Pš³šÙÈt1=Ìuæs—ù'#1®éÃðÆ×z­šRtý³h+U7ÖøD}kÕ¼‰ÖȨΫLpÒ2ª¹j¯ÊwþÌŒ†ƒÖ¶z쇞X"ÀjqBâ1l„ ú*¦@& "#j³**ž`Ï®~8kÀÛ÷êËý¿ëÖ±?—?sòÁ\hh©[ä~ò¿~XGOï<¹¹õÊÏ×»nÝ»—&ÿ5[©Äèá•Ø­YPs…¼oª”Ó>¤U¦ÊùòÓ†EÆêBî– ¡Ðì%b·b#±/ "‰Á|¹Ë×Qz¦èJÑpéG¥w}wý*ý¼pÌoZ*…ÒÐ=X\¬’43:øÛr(O³±K,¯:À‘†þK)‹yÒðÔ ª„НBÉ!2óWj\Žfz3Æ> ž7) ½ø¼$YÂô–¤J˜|~iµØ…ÿ=Íüh R±cL ©6÷2µ_·3vWTÇÉgËŸ©ýx}ë}ý2Š© Áo›7^?n«,›"LEiYAÀ`á„Bͧi~x¿90 :ʸ’(°àI3À — å 0]ñè,Q«²Ù$¼_µ‘ÖHÄ^‘! öÉ‘i––ANG&˜dF“n-Ÿî2½³bÓœ »×-îLnzkòïû×–i.·u›Ónü¾Ï==rd™·¶ÉÎı&î™ý‡7Ô¾øvßÌ¡íçwžZôÌøy‚±¯¥¶z¶§x~á;»k×uÔ íE/^ÁîˆBnÓb‡ò´B-,µ@ØÓDÄ)°2/g2*„3)œ`RÐ3ùÔ&J9¢(I,' &‰LW@¹ ?¤l„~ªð È’ H«‡(Þ€½240ñSfó«“EpÿÉBc’Ýõ°›ygbµN§Ô{;_C4èS'8°­*X_ÐÅw ]žnîGŒ3qíyöyoÖœ¿…oÏßËpÈ?Ξ’S¾Ÿ…øÀ¢Zmöi§”ƒs•ÕKeõj8P9¯æÎËgÅ\ŽÇ§ýƒ^¯fFNä²vŠ5…{„¹§i¸ Ã\’‹/%Å”®cø7êØÔ—ð1>4ȃ!•Ii é?Be/US*£º ‡á0Œe*6ZWëõêd¤=ŠHÁ3NËŒ ‘é:VöJ¥ËE²™¨y‚k%56sm/lâ7yøúU•DMät¥ Â7’RV¤¨Ñ °íË&›V|lOÝîç^kïØXês˪ŸÝ|¡ïà+×€ãkÎ ûö¥›‡’Á'VÌʨZìB×ößÏ)‹®Â°æP…¹¤˜ŒÓðfy‹a«y—|Ç?æ:ٮñÇÉUIÅÏú\Å.õ®–@BF yX0bÌ%¼1- î•@õ^P›ÑMÂ4ÌÐp"œ „¹°kª¾ø±«v¯½ÜNí½ö”]´»B_‡G³I#ƒÄ2V¯~¼ ˕͑†ù~ÙæÉ/Èg«_ øeZ_Ík šOE†@äÛ¼ ¤Ð„òxS gYÓ̬ø°õhaÙŠ*¢€ Èã#ÕÙ#»ß;Þ\ÔûæÁ›ëvÜ<¸æƒ·ÀòŸæ‰›¶Å‹¢Këöïë ÔñM~¥öÝ_ì_;rþL÷™—Á3K&_˜X¸wEâ/ ÊN=û¥W×wÍ£Qvõm$ç®îÑÈ =o.Ÿ~4B#xpIÀ³ay¡JBI)¿‚˜ácfDÁ"‚ˆB–á9L‚ߣn–ÉaY†cž.Žó÷Ð/‹ãÂ=}·MÆRF0ºLü0óa™O©‰p*G¹å\Šã¹kÌ'Ä”­´¾5Œf@|_Ÿ|u<2•+÷š;¿šsmX4LÉú&‡QK þ†¹=Yµ Ol-ÿVÔÃ×¾ü€»‘Wš0"ÎÈTÓT“‹H:èð*\W¢Ó£áàÆhGaÒ˜4%Ýɼ]þdà@ôtî€û=ÿ é¢ûràjð†á†ñ¶â‰…qËA‡âtû¿¹ºáueù41?Iæ@5©†¥Å«áÛÁ—¢ÈXϬ l6E·ÃŽà–;¢=\Ÿ“Ò.ë.[ONã(wDzÛzÄvÌq2p.x.𿆤1ãç¦1óXplVHTäàR ³gñ %br¹ÌEufò²À—è7»â™/#eÔµþ.dzŠDUIœÆOÄSñ‘8÷]ÃXTxn(wRg¯“uºbÃð,ô}?ƒ†ñÑûS)Z—3d=+RVPhupÒ4¿Æû02‹ž˜‘n ¥6œk…º=2G% ¤ÌZ2¥ë¬°õ)§£¤UïZàëµJt8§ö“ þÌ_‘¶.s» ß²3ö¿Sóô‰_¶œ=_YóÇ ?iYÙ3·Ñ-ÉøÌŠË½Ò²+°˜9»;µr÷õ÷Ûjúš÷-klíùuûš×^¼ð‡–ÎÚõ[·ÔÆšÊ&?]4Øy¬£nIå$Ìs¨úS¨ ' ‚‰F·ïð· ï¹&®ï”:ä­¦mJ»}«÷ ôºÝ K=!æI‰æjÁ\ž-ðsDä‡a-Éz1¸çr‡Êeþ~L·¤@o™Gu_t:‰’«óÅ –ËĦڼ6Ö–†ï"kB4” ±4”¥B#!.:¡4ü5\70Wñÿ¥’ñ©X21ÅîyYô¨÷±Uzga¦_á¼"Éj ¨þü€/0]ÑÈÿÈ.à&Ž;Œïît’º“l½î¤ÓëN–‘°dŸdÉÂÁ'06$vl‚  ÉPdÌ+i‡I0ЦPÒ¡!C ¡¸ ±k,çA[&e i§¥éd - ¤Ã+Á™ÎÔa ®Ôîh†N%ÝþïV§ÇÜ~÷ýŸ“V¢﹋yœoŒxðêÅýGY(Õñ­±ÚZS¼àëñûH‚°Ae +¤úГ[¯\¨<øÜ®ß=þôÙ76íùÛÙ×N#É”ÞÒÖ³­'µ¤êY‡ˆ6@á­•—dž¿w|物Ïò[ž_ƒÆ·Î_vuóáCmê áU8‰“ínâ$ö+H¿MسP”¥«jwÛã€&ªÛ5-›qàî66#ó{PÄ]áOœbRåc5öÁÞ | ò–=°=JèÅ[(œJ+•8©â-W–.쥕¾³,ßL…4?ið¼,¯9Ž¥n§lÆnvtØ;-d@à&ø‹nË·lè0üÃ@Þp?±Sµ!;‹o$«ðõ„âÏø‰ÇILܹúAC«{ U¶à æ™‚6ÀL@æWÿ?2Ï|POÕã—ÊßßÈâàâQµf5{bXlq(AKá@é’ň8žûçbïŒoç;;íÒLxÙ/Öõ>œ»µ .°öúmxöãö W˜EÚy™\<õ“í 4¢HVyBK`)rU8É y“ ‚ zäÈ"°ˆß¶ó;¤}ìÁŠ!v¨âûyÅpI‘®‰)@±´†!ÌZŽ-ç-‚%`ŽTÕ4 s¢Ânû¢Š½ÈÈ&Ù  K“ë’ÉÃIak:ÁP¬ÀìaR‹ÞÊ·KÛ…ýÂ%‰r'ådGr9ZN,Õ,Õ.¥–F6j׳ë¹u|¿°¾â©À ÚmÜ6~—4<þ$ü…ðµ`ïÑÑ.Nïñ2.ÎâñI Ȉ]á­L„$¢ÊˆÅô–Ê€ÕjAUE(»qÚPTŸŒ©%­”‘†TT9ilV«\Žçç-qÀ">â@ŽN2èJ„ª•7˜¦˜IÆ ŒûÁaò IÊdQ©1 Hè&!ë §B^†>T—|^° ÚpëÃî]¯¸w&Ø›iìÕÄô[œZ&z°ýÕ+âë›PµÓW¼)?¡š8Þ ‘%T<Žú6R,gçVë0ÈHþ€Í/Á0U-Aï—ˆ(¬–ˆ ®R‚M•D§W| “0·cí&”<ƒ ûl__èË|„#, ŸÖç‰I5Ø8ó|¾˜³†2/ZTGUy2ÞÏ< yPÄðKÍË>½–:E«³¢MBs^_¾÷ÐwsO‹Kêö¼<ÿÌ;+:ú3£§»ÎìšÙÍ¡_ðéÅ/®ïk}}Ä“ÏzB¢MÛôøk4E5lmÛô¦eê;Ü‘Íí{!5Jšóï«{£¦ä´žÃ0 a×^z„>b:E™Šu<þ÷8€>mÞly‰Øi9Hìe‡ˆw } a ‘³…è!4acpO‡šQÄAøîîsO¹÷kfѧ£ÆàI2Y"5º«ôÕRTš%Âre¹ a 3ô–ºŒ Fdde,.}½Ûi›Ë†l­âŠåìkÃ}»÷N_wî ¶œ\f²wòzÃÄíIl# ÌŸS×Õmæ´%”Èú‹ýQË駃3tvÍtXd-® |ÿúp-ó©W[é‡ÊÅ[µ¤Ï­PºIPpPY²8yÁåúÝUÛÄy†ïûÎösvÿów—³/qœ\âŸvÄI.@-¢ÉÚi­<`ü´TuøI¡¨Jº¦P&"­T°©[ËÔm®ÊJ‹Ò°BºIXÛ• ëV‰Lbˆf¥”Â4°Ù{gÒ@¥ÊÒݧûî,}Ïó>Ïû¼ŸþrôO Íì}ú/[…µåKGʯ½µó0ê|û§»<¼7d7¯+§><¼£|êìDùòØà+Þ7_ùßä÷Pÿ‘žj^…n$A7Ú ŽãƒÂþP{ÈÎÛ#Ïp{¸8ó7äåöVï«9ÎœâØ€ÛãÔÒL  =[‹Ö"ðЧwÉO‚‚âr9qPñù(6œëõ JØV=šÇì¹GÒeêÌhŠJ¨ í—¦%Z"~háãâÊ ¨¹¥¥ÜRÙWu|çdóY™„CµU5œìÕV…P¨.·0€øêàÀ,’Û·ëébC~0ugqG!IpŒ…Ä@ ¼ j[J ÔùÂz+HEíïß)oþçðÀyÔZþë¥7Êw‘ôúáh£¼³|ôdùßGOý0Œ!? ¢…½^À¯ßôRÔçÚ2-ópø‰ðÏÕߊêu:à –3Ì[G,#Ìnv·ÕZ'ð"ÊŸ K\.Áʳ ÁX°ðL˜ã1’ DRÔD•ä’89Oj‹P "üùp8ÂZ‹,k)v2à ¦Žéehf¨©Ø˜’ÍðÁúP1 )ô,äÐú2Aé ʼnrÝxzú-4j„ö\)¥›Ÿ¹’?WºšÏÏä8ëÏ W­l4Mp*xMŸi¸™Ï(î+T¹é<€ä‘›èU˜rK±8+q{Á3ôZ…gtÅUæ×ëV¨ˆ6ÅÓYv¹<÷/+Ÿæ”»?ÝøˆÚÑ¥l¾~QUQ¨®_5ÕTÅkR­Ê3.—š6••UaI)w=÷G›;ž*e?§­¢·×*rù̺¾š*`‚0‘DÔï•æ T«Ý%¯ÎZMVÛÁfzob2ñnâcúdâ‚é‚íºéºÍZ0,ÃÀ͈yIJ¸a›µ3Äá˜@1ÍÉòLDàýD´9ú“z3oq=©VàcDJ4*6Öa2c Ìátú“”£NÁŠÎ˜ǰÏÏÆJ‘ªGT½ £f&Ì1‹E`P/ƒŽ#뛚r‰µ‘ñ¦ÛpƒH3hLš@Èò_óaŒšÆ¤ Ån0Rš½/`Ð[ç˜iÂ’ä†Y#Us›ÓÏ’ûè¥kËz²ŒâÝ ¯9mÑFµ¥4©öÇN›LÓ_8¥P÷š—<^ÎôÞ+—&AO@–[¢OÒë+ëòéåßWt=,ÿþ-øw¦È~›iQÆC æ\G³ZvEv [‚[ÆcÁƒƒA{²yÈ>j§Ù¦P_¶ÝezÕ459ègìSYz1 h¾=:RÚpôC†££C—–h‰–Ÿ5úÑ¢4Ò.E´¢„P+ºÝ}ž1®òôz°îAÞ›“Ç3ÿ«q¶\_ UÅ„ŽÝ“Y½sÖËKW› ÔK¹sÆ0«£ÍÍZù-ïIG ÇÊJ¼>Þ§-hÑUÄ݆¢çf¶$å”àÂE]m”5nI"»ìJRwŒC OÒ›²îôÀFT–«wë6CjÀœ,5nèІŒ‰ÇxÅtèëßz´\|áË‘%»º„®û±3x_Ä»qzGù‰÷÷ ¬}}Ï{÷n}üîêjž†пÿ»›?xõó?–§öÄdôìÚN‹¥åÇÊ+;æÝxûÚ¡—ÿôè÷õ5R ÔûÁ‹ £nêÏÚ`¡gωžéSuÏxXËöÁv"Š&bZà›ˆØ-ðDÄo#RµÀóDK)#ðíD‚¿”êêøŽöv»Ý†›’Ép˜g=Õ"ÖDtVDQQ â~ñ„8-ZÄ ÕB\ÏŠž©:Úƒzºe1Ó—^‘ÆéñE+? $–rW6èá7*)åæ²>ü*™ @àó šÌÕ¼+àúMQo—É­OÐ<úH¨*^h8¤QUKPˆK;­–Ò‘[ÒÜÝ¢& 2œAO?RŒŸëZ}cÏœzЋåU·iiÝm¯éZJQÞLÔ6-O4%$+Ý«³¬Àc"ÞCÄ À#"YÞM$¬ˆ Eka§Yú&‹T¶]ÁÒËÙ)öK³+£2B¦ ­’>²‚ÐSäÁ:¬÷– ƒÁA\Ãt*&ò· 2‹!ÞòCò¡¯o AoºNžÀ-‡Èô¯ôÜ~.¯›+ ý¨33ùÁΜ‘Å¿\ˆ·9BŽp²Ûx{°‹ÍÒÝÙy°zЧhÈsVœ³0½o Xðò¦¬’Æh*î¯ã› `ÌqÒ£ûŽþ$Ÿk eç÷Óãp>šÿØ,ÀšöÅ6×Q^O¡aj3ÞæR·fžÌ³M:ÙÇ(ä1u7AAdñ2¼àÚÞ§r¾ášLM.øÈy¦Õé±#Ú…-ØÜú5Ú:NÑ~×ßZY;¤\ ›‚µÖÙ@ɨÙÚiíµî¢ÞML]NWYíA»Š28¥Í×úº^Â´Ãø°íàü¨O¨è>M_¤.¢Kè+Û%ÇegÀ—ò¥Ó­jºí£žw¾Ðº'mµ8Þ¢{7›^!b®«Ï™M&Þ\ex¹ ðq"µ¥çñmˆ¢D—Ó á±‹¢&ðq­_M{U5M!gºËÜ­R]iÓ<'»ÍÊ0®‚ë˜ »bŒ‰a|¾`1kkS”xû¼yõõ±b<àÿ?áUÛÄy‡ßß{þ8‡Ø>Ÿßù#ñùåÃw8$pÄ4J TJ4!(cŸ߬ShWÙDѪ6ë61Æ&Ú ŒVº¦RÇÖÑihš:>*? e°h[ÇÚQÈe¿÷(l“fûÞ;ËòÝó{žßóH.—3K|ée‡O×5G·68Á9H'™•¦w¾—v{ḼƒôÎiͯ&j<>ã,”ì`¹ìFJX"]˜îl]°)´ ååHIøì]Þ`étjåðxôø õÏ oã$³Y&¶‘!llzdƒ …6•lìš¾ÄôhMSµiÓõÓ—-1+Zä°·­B ÅÁÑ«‚a >Goôû ‚gúíÝP¿ÀvC'p*ëö›–$Ð @8,!íü–…ÿ+r–‰d¢ûØ9u»Üt%ÜÞù“Å#;'7›­»‚ #¿xˆòÓ ZCBm†üc±ºb>j˜µzNøý›åßÙ^/+Ë™ ð;kö#¾A•ËZg®´–×€ðt®FJ¡ ·Í AäÑÏF(d·ˆ QÀTÓ/Ò­´WyM9ªœQ*A„}f“oeËç鲊JÈ%ÕðÄX`ŠZ‘ˆ É”’PˆNL‘ãÆS”ã‘kè }Û–P5*$—wŽ™/ôömæ…Yì¸Öɵ‘.ÖF$.ùhž¨ÊŒµÛø¶8^MnºûAÓ¢t•(V­Y¬•ÅV|ïk«a«ÛÚŸž¤lâ¾ÌÂDêÌí÷Ž-HT… ›ËŒw}„÷ªÃ[æ ¿ >ÂK¾ˆ7çÏûëº[œS´y=¬–×jÛå>øŽv^¾,߀[²×+cŠté3u®EnÑŸ¹°ž•3:ç’º$qõ$»V2Y2äæH³ÞVœW\Mv-òöÈ&½—ì•_Ô_#}úQrX?X<^|WzG*¾/]’/‡¥›òÍÈÕâÇäSé== Ú¥™ÚRèiÏJÛ"çä_êïÉïé×åëº9íIªJ"Mª›ïhødJ°sÒæ:³iBDŽˆÈ2#úcºÒeI×d 4üïR4‘¨‡ç ÑõlŽ×ŸÆÑ ª¢$&'Yúšt%˜E(bøÎ€à?0ÞnaÒãÇl’®YäSËþù0zøB½“ñ“G~²…ü™]À¸ùØÉèÓ„Pe”Áå€! ¢AxÙG/œ’ I,q’òÑØ’6Ëå3tõ͇.7säv,=_·r:fÑoö膿À5èÖc6MÏ×F†ôÅ©ðÈ?›ïmy.Q—NOPº¸-KsÕÙôÝ+{{¯÷Á…Þ»ßÀ;z}ô&:ñ9$ ½æì^Ä—¨9¯ù% b5…,m N n ~›þ‰ŽRwPUE85É œÊ1–™‡Â*¢uJku«sÎ=7ç»ùݽŽÇï½ñ ~:£!èAâØil¦±J#'Ìñ}â÷ÑŠ£‚c+lw÷À·c:ïÍ®*çòÈ¥§q”p§p:grN®½šmkVªÍjZ( ÅCýž„‡zÚã+WÜNÃs….ìäd;¨"Äüéq™h&˜ñUI äF¹qvâJ¨ð6B„â òUDrTÙAéÁӪ߅TDÅ$ÉÆ‰->­€À,–²: <¼`í°nY7¬Þó“u{÷­=ùæ½ë0þ`·VÃ>(ÁôwO´÷±ÎZ?;¹ê`*,ûñölPsõ¶»n€Ï!¼Õ—'7k…Íò¦Ø¦øWs ¯ÄÝÛåÓµ?Ï]‰]‰_®uE²B!—1ÒF¶5§–f¿”ÝPè.Œ;G ÏÇgÇÿ¹sÉÁoj/I—k/e/ænÕºâfª:Çû˜ªˆ¹“)”ʪdŠT+ uÕ¹¶Ô¼M¥ÜUu¹p¸Šòn^$Q!ªGÍ膨3Ú^ƒ€À,/Ðï†  \¡T¿ï@ca¶žL._ñÀ´ÜçÐÜéXã®ñÏ1{î°=½0ŒNEëÄpkˆåΆPÅkóR\Nç2y)Óµq²‘º&HÇ0ŽA²ki_ˆ¾¸å!ÕêPk”V&AÀε¤~—m7º0Òv²Èõß È*¾ˆwb~9¶2 ºª~ÏÌ0ò:öÍP û&ü}à÷û¯üz|×Ôæ§ªW÷Íúú¦ùt§µ¹;}sRb·†­f÷ï8|Á÷DEź—ôͲZ·Ö;·c­W‘ 1ó3`‰ûà\>XŒ«U°vÃ~ò*ÿ+ÿuâqøM2 ¸E<×ç¤LçŽÔãyæ6nâ Oñ¼—«WK‰ ¤$(• 4ƒÎ`{î>/rfŽæ¢%Á«x©ß›ðRo{öñâ>õáNdG©mX¸]fˆéÉ(éxf\eE%uÉéÚT:E]‰*µª=Q¤„‡L·ÉPM#ÞU¬'ñ…!%′Ä>6@uøC¡ÓÉ<_¦¶–y;Ú\fPˆÀMl±{·{Õp_¯uÎúpÕþ…;z ÐJÀ‹È¨뿹oÝ©³_éyÒxÃüp¥â|æä3“§.‡Ø[ Ã·¬µÖoïX{7Ÿÿ¡uÜ:Ý¿wï!(ýãp÷¿ù.ûØ&Î;Žßóø^ývg;~½øÎçóÙg_l_bŸ‰]HN𠼤$h4&L´S^š¡1”:Ú¬´R¡ëZ–Iƒª¥„‘h†ÚŽIHL¥Û?h ºnÓ–iÙ´‰&Ùs—°Wi±ü£¯Ò»Âëp¹²Ÿ•]‰ÚcY½6켘:N/~_Ÿ(^W?ÌýL»^›­5l¤[ylòçÀ'‚ƒ€«Ø”cƒé1Æ›ùø€È ÂÕ¸õ¤o@Æ_éö6¸Ý^ÍóâiÆÞHÌ£V¡6;dµ“À’eÄ4HOÙ䊾i¼ë ß9ß]ŸÃ7Ç.‹“‚Æ!gZOÀtáAa…ù¸a>A7¬(è(‚ðÂ5°«‚5 ²$òz]BƒnxnfÐüpµ¨-Ñ€9v£IZóZ¼qœCzžAM˺ªnhfy,VR:PÓ®&¦„eY+h¡ttëÌ»K˜Ëݤe8O¬7›Sü(¢è"i ^³£È^–(I ¿Ž‘ÙáÚéy†Û¡áõž:@ùˆ a6á»]¶Šëlµ¤³6±õŸ\€r’ "Ňhç•ÅïI’’}%.©<“N¥ÓF¹Rj±æie…ã¬â¯OöíúŽÖöûŸ¼´áÁµÇÊâDZhœR”ØÖ‹{G­¨eÞþnǽw÷îo Ç$'bmì䶃›ÚJFw~íµMãw¢](‚O_=¶ýpoËÎ&áã‘—»_ý¥‹ˆæ±6D+çmZ¹iÖzA/ì÷ {À¸'¾G ‹R»Ô)'Þà'ˆwx ‚¸€Æ'%k ÊTDÆDȱ´4¯›h˜ö¶ûYô纰s(릠z™f’ᨠÖxóZ¿ÆNèN ¸pªX^ÿ ñT=¢q«[sL@ÓÐeXßÅ–ÑÙiŸq+çWÎÙ'Ž™.½=ÿÜÆù•'¸›ÜM«i!RÈiëlåÿ/£ãào²iW@|¦{ÁoqþC‹„ßêWËë©4Gt,|Ôª­x8÷ˆzq·7°·´Y§åZ¼G\@§U‘+˜Ž?W,ëé'Rönv‡Ë*Y#;Èý,®ÈJ¦Enɬ–WgNe¨l¦š]úˆë;ž™Îü-M®ô¢RRù¨”̉<ä€ÈG$ÕX”#PQ=L.kµ?ÃЦ»J›ˆh†tÌþ¾D»Áé`P?©Ÿ×ïé¸.&’~ÿÁ€@´8·\ƒêv Úˆarµug™ÈΈ¥†ºaÓþ +hä“´¤:}II– É*%åMä1ΗvgóÀå”8%©.Å‚j°D ,C ácC–?À?HiÏø4šëÿ^Ll±/O{ǧà^©K nš¹õëÏõÄê'Jp}¹;w¼²ëù_<¦;‘Q”/‰Có¿ºuÿÍñçzþý£ÅH Ï_è¼5¼~äâ¨L4Yÿ?j%ïYZïš>'KŠÐÏI D»ªgBÀÙˆ²”Œ²½7íÝ|#!—ÿì(ÎJŽ«á+‘ÇÎK§ˆ3ÑÉØ5ây…B}÷4y†úQðtˆøu”=ꕈÝÁ§Â#ø~ç!‰è m wIO“»)âIª‡~Ò¹ÍÛ$L© ëvl!¾L ©Œ·×`뼄Bf)•Vƒjˆ@%éÒvé¶D`à16Èñ¬—öð^1,ðâÔâ˜é Qd‚¦(þ ( ’´ä`„Âè.,²ˆ!0H‘ÌÃ0ÿV™¡£¡Ùú4ƒ]ÁóÁÙ ‘nñàüÃ¥„ôº´ç ~$‹è\ý³:± ½Æˆ¥1Šöˆ}¡¡jáÁÿ®ÈhCõýØÁŽø|Ø~Œ3⯲¦¿Š[—«Òt J¡:{)Puªëé lõQ#C4‚$…â^–k3H(¤5&Xšˆƒxo­bd2Êžá¢ëÚ`n[kô³X[M¸‰Å#5?ýð[ø±ÞQ&…)¤Z¾úÅo¾‘|Üp!!mð‹÷©Q¤*œ0£ é¡Ü´“¡œN¬R~o$Pu£7o‰‚fÊh?díh7ÑE…1Šë™|+sš!Ó¤F7¹T·PcY>§fþÁxÕÇ6qÞá÷½÷>}N|¾³ÛçÄçsÎv0ÎÝ‘8ø‚‰Ï ¡ !+LMh#¼ò>Zk3  uU M;MheSAÛŠ&A û£ 5dR‘¦n¦IhR÷ǤUTBlÒ„šI)*…˜½gS–ý1iwº÷Íý|º<÷¾Ïï÷{³‹¶ÂÆZzÓÏ÷É›èaf˜q »‡ÃÃÆ&s½ÙË…Çä=ä=ÁL¸ò¯¸_ ”'#•—õc䨷"oêoÓæ˜Sü;Ò;ÁSáwå“©ë'óìî!|^ž‰\h~_¿Ì\f?tUÂWŒß÷ÙûüÃæûÊScúvcÌœæÈœ¼·e_ôÅ ¹ÙÎŽq¨Ÿˆö¥úurD~Fÿ¶†˜!v3H¸°nˆô%‘¶¨ÉX<ÇE",ǹ"X ´´°€Æ|”Â>ÙöK)½MN‰n¯,&[rÒ2s²Uy4~Yæ]JåÑ>Ûg°ŒâæyUÆÏËáH¤…s¹šúåDôf–U ÝgºI3ŒóKÄ0ñ­)‰ÉT ›F@ð.Ë2ÜŠŸÓgM¼ì—ì¬édlwm²£Ó0Ëæ m0·˜%s¼vsËœ3Yóìß¹§yù×aþ:¡€0üÚæm÷û¦¹ßï^Q!v_®3þÞèÝÛ!ávPX˜¯‰æôÂ':¹6ÕS`ªq²žÿùƒ\”ÿ;+ŒÐ˜gñÉy§+=>p•Ä%ÒN¦øR©@C¡ÅÑ ÈjÔÓB}œS£^Ck¹!%朋‚&že&³ßjñ¥«ÇSÕ?VÿÔZ}!ãö­^ï³¹¥ÿ<¥øÃ R($µBk®3IH,m$VâTJtÆ>˜E[þŒÜq¤)¡iš¡Æ,0ÄÔg—%¤‘¥q¨­ãµ…(ñÏW¦Û¨9µ×ƒÝÙ8¿ Ä/lá6„¸D7<¾£D\ÇnÙK|–P´ÓvMýk4Þ9z«ãéÙÓê©ø9xN˜‰Í¨3ñs™}6>«Í&®ç®>>–?V>±n??Uîósň¨ Ѝ*­éT»®¯ ÑPVĺ’Fz-Àö­¨âÍ"ù» |)óª~,=­“½é÷H qñP<ÐS(ö‡{“´èk‡­íÛcgcg±öTt˜‰)º zU,˜ ´ÀÈtXÁ¬NfR˜ú…nÙ¢ )S!1(‡ª&'rúr9—QA…„½ ŠÅ{ݧ(z{Ì ÈÚU+—ÃG„C!𦨱,¤ÄfC|–à8¼oÀ[pº`…øÚö¬R6*Û¤,ê•P+Äo¯ÚÅŸ|CçùQ,ŠqböðYÅuI\ãoãc"ÿ_¤]Ç=òVPçl^´2¬h©ŠhåðK.y¬d}q#Á“RŸÒõ©ç¿»Ë“ÔÆÚW`èXK, »–c‚eHA§å<‰-‡pQ#’¤úSõˆ#!Ñ*?ôòæ…ëÝ¿Ì1ÆêíŒØ5Pvh=ã}Ю~ù»[‰ï ­0nþk‰äö´÷ÁÏ­Ö®ÍO_T¯lÁ- òœ&55y×Âçª'»“~e Ò4J? O©÷¶â;ÔÑÖVÿÍ®”ß/ø½‡ló¾Ì óŽýÀ/Âï Å#ãÕ5›F³îÑ]4>ËÀJâ;ö>>òV!nì‚¢µÊ…óÜUÓâ$˜ì8ÞæßÎÒÍb [(” $ èÕÊju Û.L7³®FFê:ØïZǯËö/ïí^·ò~'Œ;ê:Ê{6ÞÑ–Qb;@g¾½-Ó9‹¸qAâ,wŠ·ÜÎâ…»³„£(Jn¤Ô¦ 7éÎq©±ÛxkCpKp_éÁׂDðH_kaŒ¼'òKÉñL9Cd²mK Zc{I¾ýFfJèhp»;;;fáNÐ 4ü|ТZY;¡‘¶6§e j³D/Þr?Þ˨å¯Àv‹¬[&c7Z 3Ä”$0pŽC dz{z_¬Û½ý¤×ß¿›œÄûV7½Q¼îó ·G…»ûÿÍuõÇ6qÝñ÷îì»óïóÙw¶ã‹}ÇŽãKâ„Ø‰/ ÄÔ)¡Yi²B(uc¢ÓÔª±Û¡Â:J3h‹×i´ ÒÀFÙÒÈ Ð¤ÚÔtU mù#û¡V«È¤lëÊ"¥­&±”}ß9ZµYz÷õ;Ëòù}~}¿ÝK%øTsëN&—€…"ÂØ›î”#fO{¦-C1ÎÊQŒZ£ÔPLÚ¦+È]í‘‘àq…2®‰tšue¸”‚Ó)› ó2vÖÀ¥ƒé’‰é’ k«³b"Ãâ\ÂE‹%D²¥[0\YC†Æ[à¯5‘ àrÅ©·+NâñŸ\´“²µA6(6ÝK&ùPeƒ±Â¦·ÇIµBµBµ@µèèÿB`ÊGÁÀa*M§ˆÍC»d̤>oå^[ëŸä“`F•¤Ö5ímí¢1Áº‰éC<´®¡zŸ¯m[;òPýÿØ:ØQÉX495¹ïNY°ú\¼]ìÝÝÒ_jèïÊÜÿìcîÀ3ßʵô<5T;±»¦¦¡£iMªq¨\¾Gÿò½ƒ^ÖÑ•9Öóœï 4ô# ‚»wî.Ò³æÌXÎîåcø s…¹Ì~gÊ9òmJìÛôÓ÷èC¦³ôyŽíeqç­s¬÷„¼=~Ÿ™‚âU¬n£Ø`Ôb µ„‰ê  ÿ fÚ|Ë.ÔkívÞ1àu”¦1¸L9häàŠ£ÞÎ9æ¬èÿzWÚQˆþúk±4 Šác@¥•|i 4 ,êvûôÏ—þ?7˜(´)tHÁUV¿Œ~›]æ`6© Ø‚2ªf‚ "Ø^Zh€y €£.[9ùTŒ Tmu» $m«ˆáÎñÏÿöGGμ6äRür‰=­éÛOžÜ•NÇ©/f?ûÍíŽutЗ_ÙXÅGFWâ+ZÓzíÍ©_½à¦à„ûÀgTüÌ4gÂB„(ý‰Dc EÈùú[Í”ìÙl42›Ùáà°Ì>bÞcCcê44¢óÊú‹ÙÒŽ{ñ‹<)ø òI>,¼à)»Ëþ³ø u!r ¿…¯²WçåO•ÛØÏP}ÂVáHøˆ2YްnÿòîR`…ñ¨hä ê˜J!•Wu@-¨£jY=¥N©s꼺 .«uwõMv]•¢¶š4>^”lFЫ[h›z=lÇýö£vÊžäQ3Ê¢Ee4…æÐ²:÷DÕÁ*j  OVáªlÏ Ë F ÏTòÜÌäjr³Ô÷‘}©¸i)_*®ó‹ExMë^Z*f³(€id2œ` ¢’1Þ@^ûõ HôŠG7ó¼ŽI$ñDÄs¿à+ÚÄÞEè½"5T:… àá=iµ*ÂôVdH÷Eo|匧ý¼¥¡3ä¶E"ëv­ýú鉴§ðC—߯ÌÍØytS,÷„C};NŸ¹“kÚK2¥çî¢É j £FÜ4‹’wç.õö¦’ñ{´¦T!ù´éióaÓXòBr.Éf“cI %¥„¨m1oá6kÇXv#‹•d»µ×:d}Ùô“Ä©$;—\Ö(EAŠú€gWº·KéWVv[Uö)“hR9Çβï&l1ÎSg_/„<=bu´^U÷„ák6Sƒˆ¢€^¸74„i[ÙT»B^ Ò˜tA¢ÃRY¢¤[õ <ë¥xSŠÔ×{ÓL®)·¿"H°ù•R ž¼ ¦AKD¼!Hĥ˪˜fâê¢1®^Aš .q6ªà„¹ÁP"®h0Ÿ!0ˆE\*æ5-ÊT|Q_L%ÅŠ;úÌ‘´»‰ú/NÔÕÜXß±…½½·$Y¥9°»Ñ¥JÁFÛ—ËML×Îäð½Û§ÝþȆµwÞy÷núÙIC™w>>Ý+»#Å÷ðžQ½ÿ›×Þÿ#Aí~Pè =…¼¨šÊeˆ?( ‚÷´9 Èàþ².ee=L`´æúR\˜7lœTt}ÄߦþI{È\Žgy®À¸QˆÙ Ë[ì5×2k7aÖñ,E[ì Àžk³l z-ýáÍÔf˪DMx&Ç=g,g¬3ÜeË”õ*õ7jÁ~ÛêåæYh.çYJaËì)vŠ5±ß5yQ³$’gõº0"î'Å›¢Iƒ¿3a‡æA×&}Rnd7 º©Åf{(ˆƒQ7Ë^ç¤xPwIøqi¿tT¢¥Û^¹2G5sG¹›ÍsYþ7Å-p wÎ)šÐœî ÝšY瀓FNÞ©8ée'v’'±Àa:s¡ÜªåC/±i¥Hü¾˜‡²-Oô_" •Üz’døã"d¸ÑhC0šY”É b熧„)ª¸Íh3ŒQŒý,báÇlÝžmÔ°8âq­Bõ‹ÁÊ.Xùlug­ì¬•ÅØe]äz@qëX£ÿ'ü·yÉvߪÙÄl¢* °šùïÚuèÁñưøþ˯ÝúìʉwW៚ùÀζÁƒTçõ'ŸÜù”wâÏx ³œë®Íd@Žô#Dï3?‡4\]wD9.Ñ=t}c`œ·›O˜p²q¿ZfÊì$7iy•Õ=ÕhឥF#%sÎé÷b ž±34— GB“¡7CTÈ]õamZÉæD½àf8ÖÊè3ø—ŽBû8C}q'´Ìgñz,¸Üü‹.®%^*RFíè¨ÔîîJ­m1jV’ÕTÙ‰ ì#ÎQçœsÞÉ8 oÐ ÍVÌ>_AjÓiÔIBwAùk~±Ó F³Rêê^Æ1©i†·Ñ:¯‹Š±¨—Q·VÆ«ŽBlÁÂn/«¨¦ƒ¶´;’n…nËh· ǯ>4Yb«ˆÏÊÑuƒ+×ÇÿÃuõƶq–ñ{ïìs|¾øîl'¾ó¿;Çç?ñÅg;±_âÖ—ÄÉ:§IÝ6mÚš´Y;@âDj™*î ”Z S7µ–Hˆ2Á‡µY©¢[¨ª‰I°>ðe6D©6m‘(‚%å}Ïn ع{îýsRü{ž÷÷ü~ÃÂÊÊ¡_Ì?sh p÷•E1¢ê¾O‰Ý[—ë]=²+Çì*¼ðÖÉR"È¿ât¦¿ø§á]ÐyìØ#Þ‡ý}{;ŒÿUÞÑYy%r!G` ¶ŠŸŠŸÚcqR%÷}_2û÷TçúOFjÕEÓ¢ù¬û[übö{;ÏŽ.ŽgÏy÷yþžUÓ/Í×Ü×øw3U׫V7«^ÔÑÇf]9±jþi[9WôbD.Xöbˆƒc{;m£¬V§ÓemƒBÞF)pÑEu›ÃV\ ¿~;L„WÁkºýRÇRðàÛA"ØÚjD¸3ˆ¶8ePÖálY‡SåŠ ¸VAÛõ¶,yaŒ¬iÊTR¡.à ü‰Y‰ ¬—(Ò"ì{{z˜‰·ˆx×° "¥ól Ì¥SK)"•ÕT¢>¦Âb ÄÐÿéw{2‹1°'V‹­ÅÖc¦ØI©šªêÕe‚¹j“ÎTí‹/±´Ô ˜ÎZçmHD«ø Ýy¡ŠéQ!ð 0‚%pý"ÁŸAñ:|“xæHõWà9(è«/@óy_AÓ0& wXeþ>¤›(3îÀšÜ`7Z̳uñP‘ÝX`ïÁ ¾¹ÒеÛÁ‚øÌá…{°y¡qøƒ0£ænÃßÀ  øÐꜟ•³>¿›æH¸7ݗΤ r(²'¢†ã‘ƒá)ð |ØxvB†AQÂv˜‹>¬’˜ðaû”) ”ø18öƒÓþ/ÜîÄv§Ë/gs:>"A¦Øi*øÀdr¯Ûß½WÂFÝ#>C7Ñã›qp}âð 1Ó "Óyƒ:uJea dY²H›W†–: "-™Ím(h2j *þ¸oK[G ¿Æ[  np7v4ÈÿÁqvêÈï—ÏÎÞTìi&åkù[?)=Ñ#S¾Ú{;fæž}õß¿ùö¸ËZŽe t”Ÿ.e*»ömÿ3™xúƵŸ÷e.þLv¿tø»·t3iu{(3¹«V¿îŠh.N²˜³µ½¶oþĦ{s<¶žÓbè(~îÔéצ‡N/þìLß¡pJÞùÍ]™ÎNl*X;dß¿Ce—Ãþ¥'ózÚÀ9úèîøà`<^ü†ÚQ½VKÀã‹ÙËü"Z(ÄãƒÛÁ-é ‘õ€§Î÷H#CœØ‹æEˆc7öÑõW=€€‚~†ÖŸmWV`±ëJEi(¯Û_÷/+¤u…`á̺BxÚbQi(ˆ•§Ç¼R7mé\vÝÁ¶€£-Þ÷XfÉ œÈyôÄ›êOd Uq»=;Y`$0+-K›!­Ä•?ZÊ$Òz… v«0ÉŽ~¾twâ„ 23äèb= g-d¨ÇN„õìŒ?ìcDؽˆÁC­Å!„õAm=!­ÐÙ÷ØÆ”BAÖ»\=”z¼ÜSA^í|Œð¢±W ÛÒg_øäÎp(ÔÛn™OÿÿÁ+JÐ@`†™hX­ýø þ€ÑD w,€/YÏS [ƒ¾Ä\ä.9.ŠKÚ›¥ šç{Œ;&~™ãæÄK¸õ“À†ˆ×­gìïï0ã3ÜßmE®ÈżTÔÆ˜ê$Ó–Ä㬖"I-ò¬¥ƒ=ö±S’)ÄNƒiæ.ûÖü$·K¼i½Iý…2»­¬èÅQ|˜!mãl÷Ð~&`ÉýÄÓ~óavŠ›r’ã÷Äý¸‰eÎ9œNV=A…Ìí¢pk€BÄ å¢É¡l WÂ’˜Íɲ²$º$€K"ÃB€»Àô³¢Î8)Š3ËòT?†¹WÁ§únžþÍF‘wAà)[ЮӸ& Öéi¼F¯Ñ8t»—xÀ{D h 19™ÄTV½¢®©ëª¹¢‚ºÚPqu6¯­‚çÞ ^þªQ@óмN ¾>É.ÜG÷f E>âÅZ*XBIÔ²Ýä¿Â9»Ê+ö¯³·Îµµ0¸oPv°kÍû9´vËbgvaa*Ñ™0c|°ylÞ0!ìƒtl¦b Êxùu˜ÿ£áˆFlš NcšÁÚ 4 Waa^¦I°ûB‹úi6‰fƒ$i±8~‹!‡)@üàþãeÛÄyÇñ{îÎ>Ç>Ûç—óù%>ßùý|vâwÇqJ.$$$މ’ļº(*[¡Â ÊKIÄ k»ŽZû£L¢¦•mêÔ&­Ð ÓÖeí6­ÚV²i/bì/¤*‚¨Õ„4!è±çÎÒi“fÝ=÷ø±eÉÏ÷ù}Ÿoˈ kxly„ÔñapnËó}·oïõ'ƒ®urØ•?suTäŽÁm0›87³JsîAã/V’´{QŽC;J7å¿à;Mú`Ð6&öÉKµ.'-†ßŒ­¿4ä±”Sþôd3<å4ráƒ&³È|Á`Œš³ÊSê.–²€yß8•¯2@bªLi0Mæ2ü"A ,1â«ìcŸµÐBhõÉÕŸ!UƒÍ•²MTIP'd“¼L~AjÈ÷k ¶Õùz{žX*D52@Gýª‹>Ú£®ìÜÛÛá6ùœî¨X4çî÷wyUÇĤ CjãiÕ²6 É HíYb©ö¹›«KM!Ñš5œÀ:¯¡®ú ›‚ÉàØ¡¿E`ÈW¢À&¯aÆ«>„i]`[¤Ò÷4»m@'*RQˆê"44>AôÄ5¡8©7Z\C ¦’NF_ƒæIY‚|’ nC¹k '™ B‡ìJ@£°P@ Êš£2ÑõUªt®Ò¬ H…ª …íŽl¥>Y»†n‡å2뼦Î(%#>2]ê®Â·ZžMŠ#J:ëQ2¼*jí(Ø«X0ò˜.ñ…?Hš¡@8HòíÀdö›Bkùâ… ãªâÅŒÕc¬&7‚`ž÷x™XC_1î ¨NY_ËŒŸ¤÷+Oó£>ÿ”Üc+ñŒ÷DÆsûGQ”î”S£Eƒ†ås[®TY.õ¦Ýª½GÌÀ.¢w¦ÌáØÔžÊåmÝ'å#ãœÂC,Uðj£CÊm4ˆrY%X[àZJòÆ 2½=ï =¥m`÷ùx« À³CBžü<; “ºs'u9åÔ$sÕ\=×È5sš$u>ß-ä´ ¹¥ºu¸°˜Ã¼:‡Àš[h)lpįXÓHÀ+°Z¦"±¾$›hGé ᎣD00›MzÆ$š:° f]CwIwC‡ë´ôo0æªB]høœÐ (”rkƒÇD¨g[x)þÿxiuº0-raL;Ðh÷#ñ¡ö»¦áñ–*øŸl u\»ø¤V3 ü½ï”p“!µ^.Ù¤Œï«=b0)òÙS+WÕ[ù¨<ÞsR>6ás©TiG_œ>-{w9¼PŸ¡)ðô•nUÙððvªcF¼`RÚ`£Á?qü|Òö+ïÍ6­õ3=ØØ¶Á1AŸ¯µ½b¾é!|R:‡ûú¡†—|à7ô'nTòaB&¤3XqeEhÿcPW,)c¯ã ¼‰/àZü)Á%òlpýlÙ)n¢îΈ•…ãÅòBtky¡ºyû{$;üžÞ²}òçùpÁáí{¸ØÕÕUëŸüâÆÒŽØ±ô2µìYóhM¥U‘<ðZC¦0jëCÚ°Ålçà?usÀÑgNÎlFŠ ´á—­þóø+( %ý“’å0zX{\ÜtÜú‚ã°óp»nW öA%E¶µS–¢Þ´" «!2­DGíj@Ìç¿’­«QE–Ní?rcöÆñ}/þ~knÿúK§Ÿ9õõ!lþâ7çO<˜»ò­wNÝ;Ú×{ñäoå\þøîku¨ÛÃ{òöS¨[)\:¥/)z©ajõŠ?¥xo©ßÎò\üî˜åXü%ÝbYw¯Í˜,MfjÙY\*N¬6èÝ®³~tðH‰ðc@­bÃ;¨<È×´Jt„L—Ó”NùôM=Z×Ïéçõ˜þ6‡ª˜ëá¸*ßàÑ9 <Å/ð‹ü¯áëÝ•W[T¥ÑÌŠÒ¦T˜µ0f¢“U5ã:s„QʆÉp2”#Òè4Â!Ó–ç@ÊÐÁA¶}$ŽšÙ xì±P†Î«šfŠe™s"6š °Îȶ™žß:µnóNi2ÙÄŠ3=öÌ—þ¼ra–6'äåÝ6Cj Û[K:M³òÛÝ“›ž½þ§éMN«ReòŽ@µ¼ •KïºÍnvœÂ@BmŸœ3RM Rb.ñVôrOº“|o¬K£$·ÄÅ6Š“æª»ÆVùí±=âAj¯{/0v’švϲÓü¬xÆýmñMóî7Ù7øïÆ.Š?rüÀýãöwÄëŽÅ?ˆïˆ÷Å—8:}ÝvÞvÞ¾˜ ¶Ú€_g‚øYÅÓÌú°€[BÍj„¼N‚К<Äç3)êh´æÀ<ÀÀípŠ¢«4ú úý9ÑýñþYµŒ§g*+Pbh“ ]ª<²Òû¥"´µ¸ê‘Î`ÔÆ™0‡Dmp9ˆØ®%ªÒ$a)AU»Dä ·(zA µ­Ø‚¨½³€µ$…¥¤Dl¿33"§m]^»sÇËÃgþìëáîÜ7"S½Ëß?TÚ‰Íßv2Ý Q†"l[Æþù»eâ¸öà—à]èšþòúbö,#í¨WyK:AÜFÓf •̧qBŠ=1àSJE%›³ „a62€è 1‹£îœS"E²†aÙeH0vøb †X`þóq`Žkr(ÂQe¹%NÃÕ…àá6>¦‘™[Ó3ê.R+3+»,-ê("ÔÈ›Qz ­4”V¼[åƒÕòŸTûç’ærÉÁâÒ¦i»…”[3éÖU¢ 4ht-\ÿ`IÄ V‚4ÀU• EH´M·ôº¨4›&(êD'AË*!¶?¢ª•zcH¡šÔ%ᱯEð'½~^û}϶?ÏïÃÂÐã>óï;ùéTÓÙ½°±‚߀ìl&(·HÙ² BÉeÛb):Òòlaž;®é0mÑŽåñrµbËu¤º“Pï×"×ZßÖß6þªÝÔoÙ··µÛú]›úíQûíGì4ƒÏÕXU©&«©éö™R„E,NTK(EÛWóÔÈ ©xZ.&í9jŽžWiÇtFh‹Xö.{¸rY¶±ÁEà9ï¹Bž=0$ÞXÛÿûAnF yí!=M4{ѧ/{tãYXÝg¢<½‡Ïæ ‡¾¼ýi5;öãk—_úÂ×r±D$—Kýâùgž[ÿ{{ûü·{†Ê<'´gׯ{qWûcV±4¸ïÔ‘¹ ­ ÁWø9gà+³}Î3š`[%OkG7þ‰*ð&–Än^Â"wÜ--ÎÃñþô?'_‰]‰×å;r¸–FÓ nŽŒµŒEþ%VI¦DÄc’¬È;D“'ë ÔQÒM!¢ÇQ¨¥BÚ,¿{ßGýýÑä;SG÷\[¨+u¤Ï¥ñ4†P Ô£»ET&râ9qY|Wü@ ‰{S¿™~¤Ö|Í®Ž‚bƒ’a½¶â×€¥`‡ù¼±¹øÝ§ù‰6Ä—cïã}oÙgƒB…×*=€r½h×Í›e+÷8ojÕm¥=›~ÔûÍöD1ðæúŸ·¯ýväñ¢õü¾òØ>ü«¹ø…ý-´ïq3°¿¹dzd¬š^Wž3ÝLo¶OݑݡRötQn8c˜i¢-á ¹MeŒ4YG®Hc†@JÛ­­4C3LNõ(³;‡‹ÆQ ]GäÙC]v‹³"^…Ã9‘ðò£>Ìä§ðÖwÿ— S(Ïv4šÖÃköÿ8¿¹dŠåS¬’Â8>É¥S˜ï:Ž…º„îóI´«7Ô*R„®ä&ÎÌ ±Íųfëú‡íß:<0tÐNõî@[FúÛ¾þ„ó,q|íFm0Åkߪ~fäÕ*šÛÒ•DÆÚ|uwÏ“xø³½¸ùä!Ÿ ȧŠ÷¹”ðyzô%™ëï-0•¼×ƒÏÅ*Q9ªhTžÎñª Kª¬*}”C÷ ŽT‘û”]äNj= È;•äÏÈ9êçʉd-ÿkì ùKê”|J9“üù:µH/Jå7”¥ärþ†tŸ¾/=PÚkòžr¡ko·Û67c¦ØŒƒƒÍhšÍ¨iÍÈó~t]9ÕÍæƒê˜Àǃ‡Õ£Áïñ3yªì¦»%'ùûÐrî=%‚ëöýškC€î¯Ój<ÒO _„Hé êFÓ\ZtH@†¯æ1JÅ\¬ £¢è+ô‚VÉÅB i† OÕ£³)³»q3A2ùnÔÖÕRëKÅõKq+ËwÇ‚ªu®‡ðÈcéVŠe #Àg¶ò!ìéà(ÒCÉÈÆJð5¨S›ÈŸJÞ§OõWâ&1Þ0ÕÒXé5^ºkܵ>6>¶Z¼ bÅßw5™íΕJÅzÒ²œMj\)@һ྘88-.ŒÑ«÷šÃØ“h(¼“Ô·›CÖPq*\åªüŒ)kªX-àŽ{›%î’qɺRºj\µn·¬wKY,‡be„MÊ +‰­ÜV~wð©ðÓÒSÅif†›’¦åimʘ*TK‰Iê•ÄdˆP#èwˆ@¥A– ƒFa¨5.Ág8UËeT¬hg0–nͰY9“ÉB©^ -S­oq]ÉÐU2LRa½hE‹E ²l˜$%I xAŽé´¥iCÓõNIŽJ’\,h2ˆZ¨j³rKè”fÝ»E,ïqX+°ͲBWÅpï"ÂlØ¥/-¡tIô+—µ\xY]·õv? ÂìükËØþ¢VG¤s“»etòßìW]pW>wweI«•vW«•,Y²þ-Yrôg¯«F›™ü§vܦ$Tuhq˜ÐÄÒ&LŒ30­Ûa3@!Æ—þÐ6qê¤fÒç‚B&“Â0N›LÆÍ04–9WrH^àM«ùî¹{wïÝ»Úóï•üLý¥z cÉ7"Y$ï\PŒ)J¢ÔÁ-B!:C$ˆ y#è|v0FôØÉCi:kgM?Aò˜PÈx,:ÈÉÄb‚IàÔwpjâûÆzõ:$'“’R2˜Ô“o'/$ç’ÆäÞÎèÕÂRª:¬z–ç1s^e yq/{æ½(b”B”@^ªdXþ )¯þý…F²†œjpˆÜ2Ý%™éþ‘ÔÃèö¯­Q2•Må: ‡ -žFhZRMQÆ$§P¡ÉÎZeŸ_Sî3NjÏ(Z”Wýì´«AHzP>¶4è§ìkñ.=WÏI˜m°ÓJN¢ªÌ^,xâî29»9à4ͽçŒk$ôd²ö‹äõÚGÑÚUOYÊZÛÒË!?/+66e)ìt-ß"—‚ŽZÞù#³eùËlÉ[Ñy|ì‡ÈÚv¿¾bßÀ“ ë„mB.[.+WãWóf1㣖ˆ0µ|3¶öfÄ=%.S1T¤ŠÜ«$´BWïËvi»¼1°%öXb[AïÝ¥îŠô5ŽYƤ1yÌ=¦¼bœ”&å×<3±€Í J¢,¦Û¤6¹-ä“J¶——zŸ0ï) ôr1äVZñB¡È[!ïáÍF£+ ùbÔ>áÎÊD. V«[ðªÈF‡ÇÂLx"LÂj4“Ñò·’Éx~_p´HŠƒ1ª‘bÔY,Fw<Þ•œù¼€ÿµÇ,(ùxTµôdõŽ˜‡g…‚±(¶’Ö¶¶t6›qHL ‘,SuÉp¤³3ðóæ(ïvw&zžØ¦‚*Qi$¤¢®¾­þN]T9:@UEaJ#9p¦˜‰#§ Oò3Ì{ A/Ó7zɺ]ŪAZNUSà ˜»5¼½zW50W©7R¹JKÕzGËqÛhõi‡xìÚhÖsSš¯âmÙyÚ ªÙ*ŽHõSéÄMìMRÙV·IåÑÙYjfM³F4&E—©V©â Ã0zû»`A'æ5Ëù•¿ž3k -°c ­ ­nn•+VÝ'U4´Ïëòc ð´¼V;| ‰8mŠRý”ì‰3‘ˆÁé~åΡnªáBm#»„Ñ Géoš%üT¶Ô+IÆQȸ?SúŠá…Æl6ØMªÉkN9½1sÄñÆR=¤d/ú6Ù‡ÌCüAõ³Þ}¾¡ô1Óqþ¸ú¼÷ ¾cé—ù—ÕSpÊüï·S30W¸ÞFAM¥Ò<©'o*ÍøÒ¹ÕŒ/f ª^oWïÄÒ©T=×Kuà”¯™ãMi´*ʤ)¼šõÅ)÷l¸Ûx6¬ùÅ‚¢xU*u¾ ž\ãyf/„ÿ3Ïò£óvó ™5b‘aÓý©ËbˆÁÉ œL“lº’fÒj¾ðFèU¬Rý˜¼õÍW‡ç——° ª/÷oØ¿þ¨ô-ϧÌD’:M÷ÉZÊÒ«2÷”… Sš¥žÕÓ³ziq_}ÛMbuÅÈ›®ÎÎе÷e£©=E:¢ Y­}µôÖã<ÖÝÒ|`Sd]íœR%%î÷Ç7ÔräoÉ„Ýl±bþæ Ù*wž}á¥õ鎼[\»{’™jË„I@?H¢*B?p‘A½Çnâ<Ü$7i´½Á猓 ±*G­kJðIqÀÅú8ÅæŸævˆ×¸9Ñ·%i+@K؈ž3Îò gÅË9Y–c- 'Á¦XY‘±qbè² -Ò HÄ.Âðâ ³lÀ1kõ4K2“¸›Ì€•tYuë+kõf•в]a!c)CÕ­ü Bû—†û–æû¥êmüjKÕy G—GÊõFÃORžXå!0õi«V }0’Â\»÷l+sº£Û… GÌŠQ§g·&ž_ùõ´[ãNÚ½2íÔ¸#vÚýú´]ã<.Ú½1í®Xïž v6T$¡vú­ÃÝ! å(ãÙ§,w®0{k—>]vø¸D Ëß%ý·)’…¨µ#l‡Îm­Eï\ §ƒ¹+"9™± þwaã:à5ܦ͘j]ï—nC¶oß/T qòÇ¿áÂäâhÏýg0_¾¶ñÒ=p1ÄIÄÃV€–ƽfÀR°ŽØ~ ^/8ö þðp¸à¹àCøñ¾À)€`;@èu€ðç"KÑ9€®¼Ðëvæ²%€®9¼7ÿC€îSÃí÷fÁ5ÅõÖmX?ÝÀF¼¶ñõ6íXÅרú-€m·ú~°Ÿ¿c-À'.<ùS€Ý»ö|à)àiÜï îå`>sÿ3$€!|σ¸¯ÏxöU€Ã¸ÖÎyn'Àñžø_jmâŠM4ÑDM4ÑDM4ÑDM4ÑDMü¿  ‡XÚ#^D ü׃¥ À"ˆ’lw8]nÅ£z}­þúõ¿OYEUM]CSK[GWOßÀÐÈØÄÔÌÜÂÒÊšÁÖŽÁÁ‰ÁÅÕÍÝÃÓËÛÇ×Ï? 0(8$4,<"2*:&­ ;ŒZ€…¡HJ0½ÊÁ À Ê É`ÅÁÍËÏPÅ0MAøÿ  ŒƒÐOQ`™DˆÌÿÇèAúÁ> stream H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= €x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)Ë”z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ßÞô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(ЇR¡,¨*T2B-Ð ¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…寒°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 N'çÎ)Î].ÂuæJ¸rî î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_pß¶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 194 0 obj << /S /URI /URI (mailto:turner@ameslab.gov) >> endobj 195 0 obj << /Type /ExtGState /SA false /OP false /op false /OPM 0 /BG2 /Default /UCR2 /Default /TR2 /Default /HT /Default /CA 1 /ca 1 /SMask /None /AIS false /BM /Normal /TK true >> endobj 196 0 obj << /Type /ExtGState /SA false /SM 0.02 /TR2 /Default >> endobj 1 0 obj << /Type /Page /Parent 176 0 R /Resources << /ColorSpace << /CS2 183 0 R /CS3 186 0 R >> /ExtGState << /GS2 196 0 R /GS3 195 0 R >> /Font << /TT4 184 0 R /TT5 188 0 R /TT6 23 0 R /TT7 24 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 2 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 /StructParents 2 >> endobj 2 0 obj << /Filter /FlateDecode /Length 3 0 R >> stream H‰¬WÛn¹}Ÿ¯àcØï`±€-Žxã¬IÃ„ÑØ–#i¼Žÿ>§xénö4g´@²ˆ<,œ.«NÏ^<ìo>^möì§ŸÎÖ?¾nÙÙ»«O7»«ýÍý޽Øï¯6Ÿ·×ìýÙúþ+ûpöòåýÙ{© ÷ÌKÁŒŠé¨¹Ö0¯,†}øùç—¯ÎWgç—Šm™Hÿ±ÇÍn%Ù [ýº½Å¿mÏïoïnî¶û‡› {¸Y½ÁŸW/׫³õÚ0ÉÖW‚ ¡[oý’°}gÇlr[~ÖIž­ïVP,ýïë/äÍŽÞÈGöF~½ŃŸù{uõÛ–­¿=ì¶ÏØ‹ë«;ö×Û›Ýöû'mqèDYËU—o°\Ù8o L ;„–CVÎpé]h|þvÅÎ?owÏØÕîš­î°—ÛÝ—í§íÃõö±PS‰N[,{×QraíÌ{âöõzõú-.ûbGl\~¾B!™Þž_¼Â÷9$£ÿR¸Ò’9ëyÀ¿w£Åy.CdFxP¡™ó¸RRz¹h‡õf¥ƒàRûá"—6†uÙ_T‹ ÜxÍFðˆ+ö(ëÍjˆ¢X†(‹‡ù96«Ê~Y3þòüÜžs†}gR°·°}aŠý…½ÿ Ø5Ë'Ù‡÷±p¡*\ÈTxk‡u¡"úƒ*«ƒaYvÈL$Ë”‰˜™ÖŒ[”uËY†§LLN±Y}^]æœx7d‚,™0Ñ‚\ån¨Kåe ‹ˆ‡`å§;Äd#×Qää[ŸSö- #ÂÒÈŠý®äº¶³¹¦,>˜ä üÔ>p+QýÎjd¿tÉÁ÷{ò°€Ž›˜¶› z`¢Ì¨üï5'S’NÁ=°I—Ñ`÷=¬å>Î_õÀ‘‹¨žäب„W3Ç7=°âÆ¢²p‡e#²‰3Ï»!›àˆ#E*/ß{ˆ _¯TÌysÞ£…’]ÛýxJU-îe`ô×”¿YµàÚ@Jôø×'ȃ´ìa»úØ÷­‹ïÿ¬Œ¢d`Æ޾È,i›D^s¯ 9ù›l…Æ#¡Pe«q§ƒ6Åÿߨae¥©à6ì9~:‘Ú+øñR¥/ÊO£-wh8§æÖ ™È;OE³€6†+GB3E_ýè ­âQèš­{èPb|‚Ö0µØ \ ~M`:®ŠµIcÿÞÁQ 2 À™J½ìl§懠Zð›IŠÀ±_°ÇÞ¹ÑÕTœÒ¥Ôp¸žÒõŒ‘AÝ‚÷Û¥LzÛ¢ï:`¯ªN.Äq¬æìA]às^K]HèZϼ.Ð]H=Ù;ŒL¡$»EiP `ÔExÜ Sþæ ·æ@¬ƒÌc †ã=ÇÅËxª‚Ý)y:àk )ƒúºVèê%Ôº•EÇ‹5o5îtPÁþH—>œãAû«ÄX-5<§Ðþ²Nþ}¹Kˆ'ߢߞº³0èd—äDtÒaˆ‡†á‚ÉúÉñdH†5q b’3­•›·w:œtÄÓXÖÎ/;Ò€àI¶D4 ûè¸#1uEml‹~Ó» M3<Ù»‘A)<…¿>Y¯q¨Wú¡Pùo¢[aÊIÏÚ ¸”¢£Åpaˆ[Ö¾¬$Þ k$æVEùR,·)i­-ÊXdÃè².󞔢ـ֋ñ39(üƒ¼üa†±h7ÃŽe 5ªb‹wý¦ž«úÖySª×dóløiíÿ™ )Ͱž²‘-S6Ê7&Uæ”´œ²A LT6’ÁrcZ6ŒiÙ uf#EU,… ¯Ço깪Ïa7]¬W%zõ:N:2 :‡“’²‚¢ôÐO(Îø†];ŽÿÛü¼ŽÈmÒ¯)ø±FGWSl¾é½Cf1_o¯;p¼ $yÁ<,”ÍcÑׇ^ØÈCL"-ú~ß jïSLÑ›=ÝjígèÛ:P±EŸÐ@ŽŽ*D®)¥0Êa¨NÅT-¤”h](ˆ¼öe­P’fXOŠ©X&ÅT¿)JQ]ÖeÞs”C('Ò‚­‹Ië<ÔË:SŠªX¨˜JÜõ›z®ê³®Ë¦YZ ßZÍØÈ–‘ £3Þ6¼Ö-diÙHߥ˜°‘–S6È€À`œH "±e#M6h]Øðf°d6RÜõ›z®ê³®Ë¦ËÒ¢ž -xÕv´Eâ]è–Ô ãÈøˆZ*%‘ÄÚ}D/B„`6à#z5Q1çGÔR‘‚Ÿf®“¶ÓQ€ñÐ$º1ÌT¯¨%bhbv±w)‰®jÁ}A"!%tW0JEågè/f®»â%ÑÎÃ숧ÅK—|“Œþ+ozÕÚÔ§5úôÝh‰¸ƒ©VE¬Ñi¢þçÕ²[GrC÷úŠ^eÀz°^KÇ0Ƭ@3ËÀ±e ˆ$gÏ8ó÷9¬®®×mÞ{1ûušE²ø8,g°3ÕÎ(„ÒOºJP “×6 6UœMÕYÏåVÖQ$UIá.»ÎÛì·V>T-«|¨Ú^$Õ·¢³b™7sD²¤‹ˆ7ÞJD|;÷Ù$}D6Iö.MI'I¦§DURøK‘Ìoºˆlœ¨ZV9Qµ½HªoEg;ŸãDt¡qñƒuñ°˜­Ràix ¬J«U°Ÿ“÷ùãqª[Þð<¯=Z¨O« â—Õ´riÿ&Zï&3r“c_Õ¶¯T*ïG0 lÊ3¬ð4¡ X“3úýEû5äÖÕƒ¥È(N0iþ.Ýè²wõh¡…‚#®h\~·Ð¤‹y€ {”LRa%Ã]½Gÿ.ç’×`a$Y Œ¡I³è,\Á—;¯;¿‘jÐí„ìdÂÓ.¯¬F½»ååmIÖí‹î_²e¡Eœ¬[`£…cÄѲšŸ—î.žœù®vÕiµ‡rÁËiÁûÊT8„‡­ÁÓ’E^x‡}˪˜cvwaôš´N#ú–Á1óâë^å$BÎ}_ïZ”u•ŸÚ"ë-¼Cå®Ö™­jÖu&`BH#øNã×Ó¾À޹#øö„ƇzÐï0xç¥gôPr U΋ëÀdÇÛý^#q]¢)x¯%0]é€Ä8ñð/ÄÈh²×iF+ÉúëÞ„>:ôýñ Ûàdä´Ä tœ‹[zÁ4¤ÄËé…F0€Ï§—Á·X³æ8‚¥p‚J[ÍY>˜ñ"¡Qmf2㫜^øaÌ3¹˜<ÑUÁ uQû낇¡å1¤Fð?Þÿë›”~EêNñ{¸8â)õ&ó®è1m:ßS“ kÔ)aè%tî½U[° ^?ö3^TèÛ¡!@Û"7Ï¢¡žËøb—ðŒÄÿU¸FG½b;~º©6l‚jbù|v‚4Ë’›Ë’#ÇôæiWÏ›cÑ…†`³ÃäX8q,lŽ)·9–5°á¦]±'ÇÌRM,ŸÏNá$a߈°ßÖZÅ}á€Q ¡(q›å‹ìF(~¸ç]n1vo1^h1˜tˆ@d<‚„Xœ©ñ»÷Øß%¬E(A5ð ²\Àcí‹Ê¤/T”Å£ O¥¼|’Р+4£?ƒIYð@3Ûýù"_³J.WÞ”·]¹b𡇘–ÕÊ€wu¥”]±–¿—JÜ?¯çrA«U‡‡…´ÖªC;Œ¼¬•ösKê]RM,f'úrË’ÇLìJ)»b-/•88N Å1ãj­²Ù!úzÃ~cI5±h˜8,WŒïËåÊa:S®<\täíÕ‚ó"ó°}Öøå”ò#ZZèr•¥ ,m¯<‡”šìÌH`÷Qëë4sì£™Ìøç1˜°Ä‘AûÀÂG •®ôU&“ÖŒÀŸOÖ婬xu'÷E£#Œ aõ¦l¨R_ߌ j#Xjt0Ó(àÇG þl8=Zè]„SëIó³ÔÍJ!øüUî·!¸8‚ÿ'·[œÁËO³'AôäáýíÅ~kÎô[ÍŒÕõý6OJªmÉ$M0­–s븱7Ô¢¡žË]ËU\ç¡¶\‚î?ÚÏ­3í’jeÑ0û1´ÜÁ·,9òM7ú²Ÿ[Ó­ˆ½§ö¾…ßÂæ¹P»n¶\·¾¾Ÿ'ßtl]¶h˜ý8îºöB×Eíšpž#eþ”U ÷¹$½-500*—­ìÐ÷RObO¨ørÂ’œ°„vCXÇZÂRl”—P«Á¦.‘¶sKÖŠ(©È_×ßEwKTâ=*Ú–¨.®\xU9wY$Õº¢a¶ŸU€+ø–PÖ© EdlÂPÀ«¿<Üü¼<×Ôã’%S\|H]nç–èQÒ¸Æ%œÄ%”¸Û’œ-ŒmÕØÏc\XR­+fû“Ü—xü¸œeO†D?"íDÔ[ȉøá”ãŠÓÖŽè; ñ˜èø­TˆÕñ@ó´PØ’(Í]pÞñ$–Ì6 þ´ü ¼°jÇÔ®‡ßKs ô@G=‚?œÙ0l üîÌÄKœ0=X [°Üˆ}{f6&rŠÏvšP ß`Ìã{< êÕÙÕ£\Ñz#žk/6« œ 훊 ¯IWÉãAòÆ–¼[Æv y³wfÔIÀ¤a§ÊO"9ø, »9õúïìÕÚ™5).©}÷F@£þœWnD_nÍi7ydñ¿TþÝÚ4æ¥<'ÁÆWÞÛ,¯ ÷SÇq<ÓöHu¯¡ÇQ‰*A·[®õ•»#Iq%lwµ«Nž‚ô™>ÒUŸI®T_RVx‹ËÑ´0“8¿Åï¯B´É¯ÉÏè;é!ñ"Þë¼|Œ„¼Ñ÷—’Ì…‡, íAx¸`ŸšE ƒÏótò%€€!ðäë½ß¢(±²V„A¯÷©iØÏå|±K´Å”Æ“î0EÏãýŽrÆ»;b·r×0ù‘ "Ëâ&‹©úG߸‰dË™0âÞ¤|=O¾1i‡¼é|+çrǧ›*e>ô¾!7\jw”óæ[¶bGìVî&?g'‰±Kxgè\²}åè ú_Õç{ó(å:úZ׈þUó*Ã>öàÿJ…T`ýøÛ¹*BÀ˜Y›J#øEª8ž¨ÌÍíÎAÅc™è6 ûo~à·‹J±¨ø[¶î&ðkÄ;å ý_ºÓÇÕkƒèE¤•Ú¸ø÷¯â•sÝcØõðÍ…Iøß" KÎhÉ2ÅOt"*TØŠûÓPXå$ëˆæRë]#aP^ŠôèÜ7 ¡Œвn«¹ÿަ|’Ñh:ЕºÉñ¸-y”Ñh½i ʵbÀ=@pÇ7¹= µ.Ê*üjðçþúçÏÿkÂ$ Âfüüųø4`é蛆þ‹]c]Ì;•D­erjG“Ä¢²N¡bãX‚_d4¡;N(&‡õ<3|¼®¼­GÅ7Zò$¢±mé4%ÞGÍfìÏ"[*Eo®+—¼mÄÑ 1C–”6(90:PƹEtÉñvLÎ è—Tè´åNÿobÔ°râ" ×÷6Áõø~¿Šhžà–çý5ïGÈÒ¤É_× Yjô•Iš¹­5ö4IÏR[*Œ'7@ZV€ºxº)³cA*s-çmm–õ(»*Ï(7R̘ 6ÉŽñ Ÿ£d×ýåÏÕ‚‚ÚtkhòšÃ«½ŒQi΃"Y;L–€n:–¥VòxEÎÆbÁ¨;[À›Ç‚ »’íu£ß*l¸›£ŒQ(aîέduïÐÃ’î<ö.¬¤7ɬ»X`‡Ö­î @ƒ¯ ÷³ÈÇî ½í²ÝNð£8ÖhXV´Õîò¢dˆ?X¦•iñwŸ';f–çlŸNÛ>:É® Ø`ú (z²uÊlÀ¡'*Œž§›ÜKñè~ˆ)[€Ü½[*‰²™ÖðQÀOªn˜G ”К0âxßE[[lÁ$ê0ÈòœE©ûªBÀÄŒé;âÿŒWÛnË|×WÌXë¹_€ƒØ>N` ”@ÈKš\ILd®@êçëS=»ÜÝnS|–£š™îžîêê|;D«S0[5$ èdäBúÛ‹¥­À¹|4¢Ólׂ×OÎÏFÄìvt?„3L'f·/`j.ÌnŸv!ˆ­só…‘o· KdD²`áU¤ƒÑ”³1?T¾¾Z#”BJÍ3»ïàq–ÙÖ€Ò‰!\úßõÉÙGÂ5™Àãz0 ‘'u›ÜhÀ|P0œúñ(ºm|iâv`Uÿ"Ç ñãJyöœ„PÁú„(‘‰»SJ# Í×~ŽõNoÐtf$d#ŽŸUäÔNOR QwúÞã u.x i šl¢Ä0fð\ˆÜø{}ePÒ” #b šã ãïáŽõHEŽf64¾ñT‘Kzºcø½¾­VF+‡j?ÖW\–A7“øqƒøù|;®26%‰æ´UÖði@_*?t›Ø«¬O'™µ€ÆÔ¥±@_[Ò( á)À_80:dnsð &%O@µ$K' Ÿ´áC]‘ôdpK',ÉmH¢ü…£ ¨œÄsð Æ$‘ˆ¨çàª%@`ñgMI“ßjŽþΡ0\mô±Œ¶."Jô?80Þ*„*Òß80ò_%øFw·*¨…àÑÛK0+Þž>Áâöm1 ,(9§ÒÏ cÃß^VÜ ´Ëµ;ƒo80©>_÷[îàL²•%kìHlÅ|àÀHcL fr¬/C[bÅ_>1ùkÑseT¡Ä{wìòóôO§½ÌCø%꓉ï[N¹D–æYéš<àä)4/„¬ûi/ÿ®ŽÍdã)1Ñ®œ9ê˜Ô+¢˜ì¨ufK„AŠJZÜÈò~’ §,¿ŽêbTV'ãz07„þbþêÿŠÃz‡ˆsuOm*· iÅæ9Æ€ôµö¹¡äß4høé÷úJãɃQã F@dLöuXÑH·þ·­~÷·ÒÊI¹•<ÎVÐÞ1²g’}hBã­Ão4¶£eà ºîÑöaeôm8súÝߺ¾ºëý'‰UDb´ƒ¯§ßeD‚¯#B+ä2eDúßóˆäšOÓ1"ý ¬7UDLsŒˆ?úoƈÄieôm8súÝߺÜÊÃPP2WgN¤¾«Ïš¡ÄxB”D…§=•lUF›â#cQÊÛÓÛQz–&·ýÌ#X‚|˜ƒ[¬hBÈ­hÞs`!ûç ÌÙŒê³Ò–؇Å;õÄ6?N½Å,+$ ‚ê•XT²ïI‡_g¢è*,DPe$æh6ˆˆ8´o þÉûŠq3Tv¼KâqÈ9ƒÉÏ›38æÁá¸b!+膬ګ5B¹^R¨ “ûK^ÑþEÌq…çRÔ ˜C&^ÅS»Q'q)CaèÛ· —µî¤ â´ÔWj~*5˜Íå|NÐòPÐ,ð>? ÷Œ(ÌA¦BsoŽÑ&bÈ*ÀkîÍÁåKðF6I¸T€ÍdŠ“ÅTa‡©‚ÂyT*Èh:úømêË£`¬Ã‡¶}¡ ælUœíƉE*Ÿ©¾ñÆŸ¡›†OœIÐZƒîí{þ´½o„j†±ÁN§$†ÓÎåÓ@ .@|ŠOb³]ÝïW?Åá¡{ÛîîÅóC+Ïû—õó˾Ýøk~ë|KoqË· #b¼S•ÙÏ7ßn¾ŠÕn“ÿÙm^ۃش¯íc÷ÔnÄ]·Û熋¡^|ŠœìIR“=KÏ…ÉÙiÂDù…AðÝÂŽûn•éqqWÐÑyNí¢h<³[Ú"MFÅ–î0øºÝ"Øìå↘bË '¹çle=ÄÓ¾ûw»æïñ oˆNYú¾eñ˜LaVåʇƒ°0ºUÇóæÐã(qçøŽ…ãbªŒ!—_Y2­“‚*ölZÁn E­U•S+T&U}ã Âx¨¬õ—*J™Iç^W{þ š#ƒ¬Lâ“„NVqýÅÃ=4jª™…ãÑiÊòïØ V*JŠ×®Xû-tWŒªò wàïÀ«¥Pÿjx0<‚¬8ƒ·È&´J¥/ä •¢´%œ7C‚³ª‚ïX¸×Lå¥ïEÚ#™– ó±…Xb¦öF Š šR÷"nÝýdÓâÍI:ÎÀAc¶†w;Ö)…`‚så†;ôFvG. «Ê-§ í¬€¿uûÿ°6i|hh¤rË™ÍÎæ”&Ñmbå1_D˜sí¡U ¼X¯vâG+^håghÜ HÏÁÃ!®TYѾò-›¤§R±ºà…÷Æh mè.}=ƒ|E…T±?:þ+›¤t®Áæ“q`u¹E^5ØRYt8¬îÛë§ÕáÀ“ƒôTUVAû±ÁµPßU\þ$Š=ñüÏ´²91g¦{Yk“5D¨CÖ˜= ii»Ôc0f¥dß©*¥Cc=ˆ¡€óÊ΀K%8±€·bǧ¢rí3b±…u_!OþÊD¹Oª6èÐÝñAuy㫽­0°IBìƒé¨r|ÅÃ)ÛSå4+)´ý§X9͇־AVNïgŠÊU«tá3k‹èÑ¿KoùãñÆ*Ú*¢gÌñid/6-ÙY[™Óòá„L$¡Jsö/;Ñí!¾Ÿ¿Ò×nóÒ—ŠÁTð/-áOÌÚµogh3Јª§¦)“×›R"T©7ðÇYI9"ë(Ÿ—‘ÊÉjË mI,ATg±¤%ýï=ÆB]ÚàûC0,ÞÐ@÷¶}|¤ÌÏš`Ièµr÷v÷¼GÖíæ¯?,vJ¢¾ùηÑôØ›Ž gºv`ª#¶Ï¢ý//­tÒhΕÅOˆóýöµEŽÞ‰‡îM Åž3py(Up¾¼‰–l7÷hTüH$ŒvåÆ7žúF\À!xYˈUk<ì:Ë’ABi;ÚõîãûTD?ÚTVÝó¤$3‰U^79;Þ^}ýþåêãøí·ß¿|ûC8#~ÿýó_®>ß^}¼½uB‰Û»«> Í0å/¤#¢‰˜ïê?s2‚5mc#¸ŸîÑBˆc¥37ÚâFÛ߈²Ôá<£dÑìcÒlÑ$yuƒ™'g[{Í.¦ì,k@‡NæÄ†á$;¤s/>¥tŒ>–‡Œ#ÕÌ ö¤(ØÙ–'Ü”F\Od·x†¡rR¾V¡áå¯÷/Ñ›öµå퉑ÔgýXOP—ü4K“ª\àu‹‚ ^W.ð”b Tþ¥ÇOûîõŒ”‚&ÔºveÁ«nd9æ;©U‘†Æ¨5¾îx¶”ÍÉ©rÏÇK _^˜HF9ÕEÓòp×8íý…Fí âÑ_zºÖMø?ãÕ¶Û6’Dßýü€1ÓÕ÷Ìxò‡ ¬€–hKˆ $¯÷ë÷4åØìòT›Œè¡š]]—sÑ‘•§âciì­}7Â_ʇòp§äØ¡ dž˜%‘\›\bE¢U*KY^¥ÚPX>xÇ*%‡£P0 ,ü|WÁÂ)gXe7Ò?Ã['.Ħxq|%ŠÈõS^€Ó dè²uÉAΣ‡1Å¡7Éñ¯GB‚,à'dC ¤È™2^þz"УseøýIÆ?e[ím¿« +D,¾‚®þ)±tĉͮÖi¸¯"\®¥6h·ÉкŒ¿»©é}½X+ß!ÞéíÝ6ßeO à#6E·r´o] ìßWó\«˜Ø :µQPC¡ ùÜ(¤C<û j`›…al›æÏ ¸BÁDÈôµwäXËFb»Ç¾aÀDÝb5Ù;F9<£’gmn¸¤ 2‘Åã#k]¿••+,Æ5+{¹¾àU™Ôýé tÙ¾)^Þ¯èDÞ¡-Ø–’{…~zîûcE­Ìrå©ãiÛò •3Yˆ,ÏL§‹@ÊšçØt›Íy覾¢~²ê3pNÅWÀ¿o~“ùFt_*gÏ>Qåo`‡ e—§™’w}3 Ýq”'@Q V­ý8îÁ>Ó¾B¡ø;×7`¦ï6»wk“Ÿ|!øÓF{(êìM˜0©÷ŒÏ"VÑ—5¬ Jì„l„<˜Þ+S„ÿ¯o+³FØ *¿_‰ÏVÅ)™–TÔ+kPv6ë²ÕµÉLiuq´ŽàÑàXqƦË"w±Ç2TéôKu-+5ôçŠ~O-‘/ËÕ ÈÍpeË÷ˆ.Ë l£2!Yöš‘¥íºfk1ÕÆÑÃÏN~ªÃç}dÝk2ËË%Íëî0!eIGù’”Z?ëØE¼,c6s–±‹èÇ]…‹°#•ãÑ@»Ê'fånÊÎÃ}M‰›6Ú°öÆB¥ˆ>/Ìq½Äpœâïxæ¨ÕÐ%6©Ôš)ÂeD0‚4–Ñ2XZ°°Îl¸ˆ–3qª vEôPƒJ‹ ø/ãβ‡Ð­Õ¾LæpxiúŸ5ŒJÆ—µéâ?´Ê¾Œ—£më-±F3e©o0²ÖûâDö¦²·†Öµ+&A¯NmL,Z. ˜ÁeõE¬Óð{)P9 2ÐǼ.º,û¦›öb] °¼¼2£ B=•ßoÄ.Á:dR¦uS'†™¡²ŒÃVÆu`h`™?gFëäü±(ÉÛrläBFÃ^;ʵ„H0Š5œæœÝK?{›;±ZÖ"“.«µßµº{•­ ŸCXoþ‘?ù¼=o2߯ÒÏZa-ûôsMÿf¯›2g.òWžV\D¶<“µ²¬D\³°_¨ˆjL+x‡%5ÏŸúå »$ @Ô&9wyúp¨xSÈ, ‘=H–àO™v‹çÌÂï€7/¿5S÷âl:5÷}³ë/ñ&ê¹·@þó‰@vÚê×µ‚Ü6"[Ð’fwZ’á`)˜2¼¢ÕA!²ð'9ܵ@[†W’”ãõÚl€Ç*ð·ÊLž}ƒË¾g~q\X¯x}ÿR#-gùCdÝ …a/“8NˆhÃl#Š2U7Öû‘Ã1ܳ[†ÏÓúÛEí6C÷´›ý®,–©õš×Zæ,=/X_ù>\ h{õ÷!„0-öÃn<îžÎ²”UpSV³Â‰ e)¿9sæ2¼Û §q”eÓbØÒvr¸ÅFÃî¸NÝö>Ò+X(µ,ÈC¯Úx)Hw$¡¯òRxˆá¨<';Þ•¶Òeøù*.VÀ9®8ÛÎoüzwõõûÍÕ—Ûæ÷ß¿|¿ùöwã\óÇý}sõ×ÝÕ—»;ÛPs÷pÎW÷`œñŸ l¯‰¸N9è¹î®BOÃŒÿË!±¾¢€ˆ­òعu3 >±¼æ2ÆXk3–ñеâÃ-NÖ²¡ìß5™KŸ4œí§ˆ˜/Øø:{ç§§ÓP•OQ¥P’á ÕO+·2ÀolYN”Ú:ÍÂEC\’mH.'MKøW†wbWËc }ËøJ¸iU6+“OP) ^„?WTEH×èX«>3;ÔFÏß·#Cô´ ,­ ‚N•cI5§cå RÉ¿²NFA”DÏ&t¨¬TUë‹+gÚèEàùÞdŠ¿~êF™å³&Óαy:>62Àa¢%Ö ùDÁyš2ü^‡ §ÄZ7tƒx%¼À|ØþqFö£Œë [gù°îÖo Oì§î³Íar3×3Ò«>LZÖDohóU¸tU^G¡½.ã¦çnÈ÷¥ Þš?·²äÃ"Pžêåy9œ@_„ï§½˜  YD—'޲%#¨¯¼ÇËpYIÁðÅYú‡fêÇi/_âÑ wsyê±R†7ò“ï:Xö†'YA¨@ —áµ’&Ý&Ek+šB›¬b ‘1ã¤)K¾‘ez÷ieà a¾ ›q¥ hT0exm ºá¹ËÈc€¸çÞ÷b-õ`nÅ/á#mb•Ó¨I1²âœe‰š¯âa’Ó lIŽ_L$¿a’)/Ok«VñɱæNò¤' áX5e³h•‡œµ¬»1}K® ‘X>"Z­Úá»r6-<ŸöäWÇê\W«ko `ÖØµµ·& \ÃÞ*BTvÑh–ü ‡C#&bø*çîLŽb’yvfqŽŸ°8éµmYœ¯¸ÜÖ¥¹©{¦|ŒÇ…òC–ŸQ>¾UΟe"´L¤2º¢B‹IÕe8´Áþ8îwþŸNÍ´ë›§~x8 ²üµ.s&˲;núæþ4M‡ hÎo¿Þ¬EÓ§“çåmX~­ßü€Z‘É ¶ivYË3r¸Î2—Xø?}Ū?«¼cµÝžY[¢hÝápzÞC*ÿÓO·ßn¿¾ÝË“)+±OÛ<›Që?ñ”÷6ëºet¥Íp ŠL.+zÂþ+K–}þô£‘Õ3yé»C\<Ýx“¥å2^dˆÐW2^W“ÍBb-®)þÚ+çpìä %|ß³5Oà {"»P´A£Ñå)±BÚ€ðƒq+Ë)mC>6ãy³kº±b]cÂ\G»öøgKKÞ(F­“_9ª´ EÍú<¼Ô£K–öæô$èE›ˆ‘eµÎóðAÞ„' WÖÓ8¨Æà>ôMv±J¯ÝÆJ|Re4ðʰrVÞŠ=ÓZûµµ &höù‡‡~#^aU¦µö «°I±+þó]–R)EÖÞÛŠ6‚±Ñ¬kU›ôêå²àQãùrc÷Ø_ç3_﮾~¿¹ú¿¾— endstream endobj 3 0 obj 11273 endobj 4 0 obj << /Type /Page /Parent 176 0 R /Resources << /ColorSpace << /CS0 183 0 R /CS1 186 0 R >> /ExtGState << /GS0 196 0 R /GS1 195 0 R >> /Font << /TT0 188 0 R /TT1 184 0 R /TT2 25 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 5 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 /StructParents 3 >> endobj 5 0 obj << /Filter /FlateDecode /Length 6 0 R >> stream H‰ŒWÛrÛF}çWÌ#¹%BÀà^•J•-»mY‰*â&*= ! ¸3€húë·»gIÑÙ¸"˜[_NŸ>sûNuÕFûå—ÛÕq/Ùí£ØV誶a·ïºN;Y²çÛU»g/·ïß·ßÙ3ÏR/NyÆÒÀ÷’ ç,J¹—fýcºhf«ØìöOYïò®­[U}“ª ¦ªÙí'X°Õ³÷«Ùíjå³€­63ßó}Ÿ³UÁð)„o–yyžÅ´­}œXza¤lõm6¿o:¹UpV³e¿ËÃbõe–xy–°pUÎæìNìźª«®’šUM×´îñþñ#N‚ÑðÏÚàghCxa%n'ú/d¸îãjöñÜĸ>ÜÝ€9&"ƱɦhgÁ–ø˜pÚƒ,$×ÜsÀ#/eI{O"tìy¾ZW‹hŽí¥Ú´êÛ"ç¢)$Û*):ªáÿã"ž{ŒÝÁc¿Xs¥dƒcLI-…*v 7Ñ >gò;HxlJ»3ÄÁ"ÂÖwk›’í[š€ƒKüÓ./«‡L”П-/ˆBpñZ<.bd¬ºWÒ<Òg Ý0Q[Û[4ø`MÁZÚ¹&ʼÐf3ú¤ÀyZ¹¦MXCöp¨U_/E®ë^j‘ý—y ®æ-À\M[˜x~˜BæîE±šÌ­v’-–Éœ‚,d}"_KnÞ6øºõàP½kš<ßá¨dE?$Rã_Õøádíæ4m}<±hKüÓèÊÚœgÏóó˜0Ž £”Èï›äÚO¬¦Â{¼aŸ¨,ïj”‘÷Tè!ôæöîOxÁ)8$^ ÌÿüîñþfÀelqÛv;pÞÕnÇÿ©Û9ꕟv»ŒÅ©ïE ‹¨Ùý&^-žFÒëIË3ÓØØ'U7màèEO€oSÑ_5ÍÃÚ²}VIjønÉy…rírx‘|FáÕ.¸–ÝÛfùöi{R"ü ¤ÕÕZáIÃþ¡ÝD+…3Õ ¢ÒÖeh™€ü*7›ª¨dS‘Ž$ˆòó“Æn·öC£K–nï™ˆÇ ½sCïÑœÐLÕ-¢z¢Öˆ9`† êè‘«nKÚ Åy’]}4M‘cÜCŒ;V`§GMÆ&ƒÇ¿XºðëäÉ)‹PA¡{ö¤“Ôtÿ¡A€Lõø•¦ÛÏ]+•ðj©Xç‘QP?/öQŠ„ˆµòŽíMR–À(Û+™‰BµúD nú¡´”h¶$‡!|`)á?$U†½{.i#£á\á © œ$ øE18@U%XWmŽ•±r »7GVJ‹\s½¢b±8ø6fÕ%¡CO<¢òCœ€8 PHUíð…JDtaOnëæ³è$ Ó±˜íî¸7¨Œ£{Vñ ODÅ爪+²¹ê¬\*wàŽA$´ƒ¦Èº¶ÐA€‰¸‚ízÕAíÀÕ©UpþAU‰í¿Ýwv÷N@MI(J‚·ä`©ªWèp7¸l‹–\cqQ¦Q¹4)}i¨hÇ÷îĺª«Ž¢ݤTíÔepa¼¾äJÎ#?Úó”pΫ¯=¨ =„Il6ÀD3ì§ Z-80fê'ƒlC+Ï/{bÒ&œI { OqR@öŽ2qóè¶øJ@zÁFņz‚œ)Äxó7ÁfÈÞÖ£x*ÑÞø’ùÔ¤d~ZÂË gÃ`muÿÑ9Ðûç1é®r~<\}>W `_¬„Ž‹IRà/¾£¬1wxžìm•VáìïÃ=ý'ª¶ßîPtÅa¦ÁXLlÙ£ƱôöÔÁ”«ÎFÏVZ^Ã3ªS¼“Á¥Ã×äÖêºBvrs m©` ÅÐb¬öÄŽ§‰–2*¤Ñã}ÖªõÖº¥E“ž‹–—E¹UˆIÕàzÞEg3åéøœ#ŸS£ÝÉzýÊO;ÝÿÍNG=L*;ê`ÀC%þ27NMWá§WÄ0½Õ´šhõ¤ù]i}ÑÕÖg-²ø;_Ä}/ϱ¬±óý•Îï?¢ìQvì D^¨Àn) ?¢üµý¥-%;ì¤XÏ–‰¡{½2´í- ¬mj‚ddߤՇ¡Ñ‡!Ín¬¥lŠ/w1 “ë-pe E·½² × •ôm¼}¡)µ#í{½“ÚÕX8u¿µ¯ò„_ÎX®s’w:§”ÚÝüÈõé=lš°Žñ1Lâø&£)Óó€8 i8ˆBäêß‹ejN®¬ 1B}yJhèêTÞ8J&S!mûýS$HA.ª×r]ÖEe7iœ‡ >‹)Zhò˜\HšŒƒ¦r_ÜÍãgø³w¾^KT`7M3Œˆ­ˆX ‘-ß›ÅÖ5Teæ­ Í„g ØÀ"0ß"8+A w#ÿx"ËŠVÔR;Þ±zL›—ºž0M`ƒD~èz+ç‘‘°’ˆHTP€ÊŽä—yC~‰IÐc’\0zÎЗH ç^˜¦Üì ÍP`C…pC±“¢X}9ÐynÏÎ8oàèFRHÍZ\2SK ¥¬™5Þ?ÏËLïZRÐ !ZÓáM¿Àþú4Ú™X›¯ƒ0\Ì&-b<м˜ÂÐQdb”îY¹=‘kR ^a¯¿Â ¢s²Ã™Û=+1”•ÑXó (z ëH”_z*ÃéŒP¶'d<77otÝ8z“‡«ÂS†}±åÞPÈt¿Öò¿½½Ú 3¤Žé]ªt?Êr‹Ñ0 ÂAÿ¡#°\ä8^ feJ 6ÉŽÞt×rýÜ A:å~R€~,E'@ÈTÐÂá¶ú?Æ«e·M Šþ KGJ,`–ÙTê®jºëjÂ#FE`¶å~}Ï}̆6]ÄÁcæ¾ÎãÜWbs|ExICR ‡Ó$Ä5Ðoÿj1÷ŸYL³ Í¿‰öùØæÙ7R§ßVzj¦. ©ç•£œ‹&ïƒtç sÄÄùmæ<•[7Bßvƒ3 öÙ¥³àU—ï ù.HCËi°!\ˆ?ý„*îHå[ëqÆŒ,ÐÉ.üÊ.¥rs'%É.t$ŽsP¡Kk€SiÑ;ECâqCY”z˜ ‚kÎ0ò}Ã{ÎâðÇ¿“²õVGdæ;/júŒË™–¥–q5ÌVžÎ!f'OI§¶:l^é#kò0žJÐï—&‡‘t6ùh2°ùèJÌŒ4ä0IÖ†ÿQúÒ)!rÖ½¤÷{u’:‘ºs˜ˆ‹DÓFéÞqE‡ù> H¨ž.ÀÑ Ù­˜íÜ®{¿ëÑ ~³K<Ñá è|r}ó UÄËØñä„¡ºÎ8>zOûÍm'~#2 Jµ¨®”Œ“¿F¦8(»–Wø·Þú_Çû&úãîœ,Ÿj¨äʇfyiuâ¥úØÌK 1 ¯mM§ô´n<‚‹Ê·û4ôÙ£8éÔš4(() —´Âaªûêâç¦d8cu›i9›Q ázb¶Bo¶TsÄÛô¸˜_ãRhÄF!…cîÌÆÖÊkP.oNœµÃO±< ÷Û}ï½ibǤ²8–EÍH»+tMk–Ì=7aÅ‘¼ñíó)0¦!€<eoGr~ÊÁw EâV+ÈjÑNwlK¯¸¡¹Úü’+Cl­p’Ÿ_é¶§8¸Ê ÅhSÕ¹!TNE¯…Éñ­äŠLå}ìxŠ5‚uÊC­ º‡½VyA²·%Îãfz™iÎÔu“î8ë¦ Ï"wIÉ×õ“àìG˜'üGXŠÆ z×3^çx]б`F…M)ýŠèiålQA߃/üÈÀŸ˜œ›¼H`ãVÁ[Z†þÜ«3ËGµ|ª&À#¹RÁ(2+y¦(©€])èËgz¨ÿLô÷†.3Ü~⛩ù1^§P9]>üsB÷r«zžéà˜XRPðã«b>ÞŒ×hE!yK×ô÷C~ïg¼ðG€44+´ endstream endobj 6 0 obj 3809 endobj 7 0 obj << /Type /Page /Parent 176 0 R /Resources << /ColorSpace << /CS2 183 0 R /CS3 186 0 R >> /ExtGState << /GS2 196 0 R /GS3 195 0 R >> /Font << /TT4 184 0 R /TT5 188 0 R /TT6 24 0 R /TT7 23 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 8 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 /StructParents 4 >> endobj 8 0 obj << /Filter /FlateDecode /Length 9 0 R >> stream H‰ŒWÛnÛH}×Wôã.iõýbÇØì;Z`Á<ÐRKbâI9q¾~«)ÙQ—S4íB8Õ]]—S§–ﻡÞVë½}»\=[ÞV»º©†ºmØòý0Të}Ú°¿–«öÀþ^^]µßÙ_Rî™—‚;ÓQs-¬a^)øÅ°¿ß½»úp½X^ÿ©ØºgbügýºYHV³Åò?é.xH×í}ÛÕ_ÓÐÕkÖÕ‹åï`°ëW«Årµ2L²Õv!¸J±Õšå/ ¿}cÇìxìùóÉ%ð$HÏV_ÿ0lüûçês>Íþ<-Ÿq:-ŸûËÓŒâÁ£ó>T‰­Ž]“º7ìý¦úÊþ¸¯›ô†ý/_ñòe-WÂQœr$ÀNpe#§ ÎŽ ûìrøµËÊ.½ åûcÅ®÷©yêfÃV]ûÈ®Ró9íR·Iý94O¯øõé:J.¬E§±½Y-n>A²os }ºþø¬Nù™ÆÓ#´ ã# ~„ z¼çéû”G,7ð¢ñ–~ßïóM¿ÄdzÈdÃ] ÙªI³x& 3Œ)Ñ©"½RÂrk$2`Û¶£]RZrdiÒ<¤~ -,Ti°®4¡/€ztÆ¡PíH8T$ c ¯hoœçQÚ¹Îx8Ý;üÜÛÑA†k£UiÒÞUOMñ>×—6T}i‘Ð!äZJn]Ô(‘P]‡Ô‘¡ÐP”ZÉ™¡Ð&rðÁ ·š[…ÃгvËšD»"·^"«o$<:T@Ùl»/=ëë=«zF^e p¢CU¹§ÑRgQ„{NªÏIým$Aõ kx ‡Ó _É^Ö ¬W48ÇA–èï4­Ãr®+ÐÀÀ…~¤áÊÊ«¹§; AÃp:oZRå©WàÉÄIoÁ‡"ÙµÇÝþp¤Y"7Tô9ÅK›(ϽÇ‘~Akð щÝUë/ì@“‹ËMÑã«fb†@ærliÒÐô“sœTÅË+Ö£©A:î£EB7¹„&·Á×$\*zßsb¬Ëb¬_è)á~¶¨fÕpºëôynPm¸ºïÑ Í~¯wÕ]=°›aŸ@W ì6u0$¿VÍ:^(B\8á_a`~§A®æËoRÆ}.Ö—NŒñgÁe-9KòüµÂVÖûtíî‘Ñ•} ²«{¶­êîþ‘‘­u&qkKC’¼4°‘™‰/áñͺ®º4qQ„—ùˆ<$‰IÜ è¢~`ýPßß³»Ä†ê ¼n~Òú“ õ2Nç Ø‚Ë Og®÷mÛÓôkaòð£°QAsLŸh=ºe‚ór9»XÂÛWÝæ[•ãÚhÓ ¿, ¸ÂxBn¤Gp2e 4‡ˆNŸn@Ù€à?hí¨¹ŠqöéÖåŽ4ócKíÌD((@„íìÓP€ÁÕÚõ§M2=ÐËÑð¡$Jå‘Þà < ‰yµe Èå‹Ú" là*Óø¼8'3kš™•8êWk_TâS¡@:G¢“ñµ¥×‚vNË9òUÈN¦ñ,`U ïûj—~;T}_ONÂ`%º©o·C¦:ÎØÇ¦`rÞ×Cz˜(Çç7‡ç7kzU§v,mØÝ#;´m—{ù!uùà†õ-\n&ÐÌ€€þà!jú|`Ji>¿Ïcí™ ÎIR½²£Xoà4{:¤…÷­é—I¹—%:_PŠÁC™ø»Gzš¡éÃ=hžv2æ2Ílsi@On g2‚ÓÃN€ÆWNS¿°à»GpzØå•gã¼Ó¥â>DŸè+¥À­Q^'öà¯h|bÿ=C뀫fj4ZXÊ,… 9ótwÂ)t´êÄx×ÐíÞÌ}Ì*ï@¹–7ÐõóàÄÒ'rFi( ¡cœùâLVÂG ÃpZjeA¸—¥Q{LNê q³ÑðÙ‹'œ†ÃÀÒ=½›ª#42š[ÐHý¨>¬vt‰ÇÞe8«DŒÚ€R>%2<[`ºƒ=hófìÔÓþOD®‚~mZ;Å]ðg"$yM…ç…¨€wô´Ö âsä.á4'ç!ztzOÏ2 k0 ] ƒ ÷yVº~Oo¶y?1„ ª ‰"3a,ñŸi8P›µ%šÜJe\Gƒ£3ÔÍäXñ%wGÃ=á™ÙR¼—>Ð$¨$— Áéé¯@Eg7«ë[O¤ÓÜzêaýeŠÆOb·ði`wSÌìLV³r–—4‡ÑÛ-pG_ÿH=ˆÎÑÕ­áNbëz¨†šŒh®î²B4Ðú>D„ð¾®H}- »V(gí–íºê°ïÙ·}êÒ”ÜÌ›Òó¢«@@E‰œKì:,4Û=ûbaU5ëĶ´ì4°D Sæ‘Ö,„¶WAÏ«( ë¢ ±DÓ2¨?jQ&°éYK”†Æé~™”,êÈúG¨2´4ÙÈ,ÍtyA·{…Í@иyoÎd¦‚*«ªï«]VòO}!9õ9é6ב;+žj¹òRžµ‡žR¹´A‡…Ò¦Û†UߪGv÷ÈêfÝ¥ª¯Ï;äè•{òÊÂ4/5Æd}yò°Oì¤Ö_ò¤>Žã”žX–¥Ê#ÆÙKš E9ô –¾Ã€(†ªÖ(/-ÕùÑBèWr¡òÊ¡æq®,ᯱ®)á‰}" `ÇÐÖÛÒ`EËkÃ÷¡„ÿ—Ñû¤„¥. ~$6Á»–K™ çÒb;%™×èŬ?mG³-0¡ˆ=›ìB¥,ˆ~’¶ácÚoV‹›O׋å-{ûvùéúã¦Ù»wW®W«Årµ2 ÆòöÔñ¹%èNÕã² wIÇ7çŒìi“â]õ—ÿNcªYå˜]ÜÒ)4°· [Â?ÞÞÐEÅ£‡¶/ßpMŒ…‰šØK  Fxš¿”Ê$àíæHshóhƒ+-&6‘vÜó.ñ‡®} ë臻èTi²™`-•;#þŸõjÛã8¢ïûó˜Ò¨ïÀðƒhQY ¨ @,#XIK‰Éвy1¬¿Ï©žËv×N÷Œ>ˆ K§ûÔtÝNy6tqô ªêÑ’RW²PthÛÕû…‹,êÊEª%ÁÞª¾¾‡1r‡ê¢Š"¸ÈžŸüÐ’S4ø5xµmêˆ=× Åý¢§ŒÆn‰4á ‚îÛ§@>Muƺ×A­LT‚‚ †Ø·»ûC•NCg 3ëe$U‚‘\Ýo­fŒ¯dGªjˆ4sHuŸÃo¿]W·S%Ðí%O~âS½ð‘k6òo®Ã5üaèúfJS™fJ|£ê1 çQ«¦¾"é´*ñþ7‹=¥‰µ4¡NƒrfßTïõ ÃÁÅ‹šª>·U”½ÜWUõCp¬? ?ÔQ½LµA“ØÎOÔëmßâx€Þ)åÞŸ„§Ÿ±ºöÒæaÏéê¸ÿÔw ÛzÑc?Бv–M%a(`_ø{]l“ÔÔŠ?âC½áÓèÌáõÛ±OÃá“Ò>5¬é ¥i÷+ƒÎéb®y_W±Ø©tT%¼úMß‘©Kxs X¢„ª*ŽÐP?e*±«–G®ëóWzäŒ1ì@µÚe@åÃ>¢ŽÆJB¥€c;«wNÑC7±ûë½ ›V<ƒKf”¸¾?|¬·7¬‰Á³÷éªY¡tÀdw _Õ%ÊP%ÙÈ®o´s´>- ;pè^_>i8…¨¡9ø©ªuƒÀ8êÝÂXRÛÙú as2žåh].I,¨R°Õö„NƒÊ ó[ýy4¶¯-KÓêâDÚPb7aß»ïî«/ª-fˆ ìHµ ´Ó½·Þlý^G \°—öºÇÔv¬jêpÛÇϸ_Z2U’$Ûè=ÒÇ:É*ævßV¿ðš©†ËHÕëyºíêŽ4°!é\Føúþîp¼Â,}yušË“¼±¶*oÆ©P&Ï2èµÃ4ŸfÕ‚¶Ž"¸úúpó±»ÿÚ½? ¥Z½,bØañ(/¾¾¿ž]ó£k&øªdý<²K nꥈ­ Hvàjÿáþëí“ú)c{g©‹æ§¾}}hÔ¼—½åüH=‹¥A±Wþ–ñ=–¼ç‡Ïû›Oøíóa „‚[ ¦©WÊ[ìÕþáxß˜ÖØéh,N-ù&9ñú²Û#Ò³N‚§ªÛ”Šè˺¼¿¾ñ Q–ðæ‹+×gÊõ×¢wô„ýÑHãÙótûzßÁR Ò$-ß³»9>6ÔwÀˆ¯*h4Vi¸WõÛc ÛþáæP?b0¼¬s,nÕáhyNXö¬-ín‰,~ ·¨+þÅwwûO‡§s.š±sˆúÎ6VV%Єè’_öwõ5Jà½\~¦šÒá—èdy¢NàT¬gðº|wØ[£3%üv[Í`Ò¾B³èÞýé®±¨ ‰ö«4;óÆüçòõEKBº ™g^—„Šzx,ñÿüËåË¿8µ—4 †=¨Þ` ü¤Vª¼éêëm÷ª>T¯œdGÞÔáxu؃¼¼øk÷“TO¥þ¹®q<Ò'²×Ò‘s‡ßÛbÁ%-[dêñðîÏ}zœow/^]ìž½é¾ûîÙ«‹—?t¦ûþûç?\ìž¿Ý={ûÖt(«HQ-(H¤jM =Ñö–éþ—7Çë›Ãåçý/‡™ÉŽL¿î —0¶\Š¥ÃÐSFQý¹îö°ûWw³{vq©º‹ËD*ºîòâÇ]úor§{ÓñïoÝO?‹îcWÜæ!´¿ìŒ‰…帻¬»åF·þÑåžyd™·ånsÚæž–¦g~Ñ3HíÕcy†ÛŒV¹g£¥éYXò,Gx¬hÒmÚäÑœ,MÏâ¢gZõ" ¿:`eÉÄ®°ÒFê"H÷ {ÉEyk{§è “äC“]-*™F)ý‰Ía‘s»C7,r-ëÔ¢¸˜ÙÑ—VØK®=nf_Ô3»ïº+ØãrÜ9ØÑ•‚³É¢×â®%BÆ>ˆ˜^ØevÆEìÔÇ‹ kì‹*`f¨¸6{É5°µ•ݶصEÎb÷Ë9ϹÀŽ:qŠº¬Eß•+ìÍ^‡Vé&;ã؃ÛÊÞìu`·íog\Ä.{•ü1½ZëuªÙë õyÝŠ;ã"vê½zcÜ›½ìÚ¶ÙK®=†ìºÙëÀnã{ÎEìèj+{³×Yä”V͸—\`§ @åoÊ:]ö:OÍcüvÜ›ìŒk`·b+{Ùë0Ð…(Ø¥Oì¡Òç×Àî”L­ÖØ g—Êæ/h'Ã…Ëê‚sÝÈ^²¸^˜5ö²×É€«ÍÙ·×Ù×ÀnÅVö²×Ɉ—ÿƒì9×Àža ¹çäRÈ-)*I“NBíWÈ3*âŽHR™¾w«9Wv:СϾVY!/¹ÀŽLr°„ÕOœÝª3vZPâ2;ãØ%n¥G‰+­ÆNîŒÎ>¢Zµ¦FžQ7"@úß 9†î²Íûÿpô°Xá.¨n©Ãêw+ÎMz<ã6q;YåΨrn5+ܺÅ\7V’²Qk܉ ÜÎôD·Æ]68L²ó7¢×^/R—Lµ³0 íTÇ3K‰ñg?bÐI<>Ñ‘Fw SZrLÄd-1ƒ¥Äˆ3Œ0ÞO'v“?̲£â`±rÂä`"­:ȇzOfÉ1HRë Ì`0i¦á夜0¹…0èoí×!ê~À”–ã¦÷a–/;-¦"šE íH‰Ê-%†´õñ̲ñ‰] –,Æ' ³”˜ñf)1£?Ì ¶Ï`½Qb£ÆÃ-9ÚÑ–˜ÁB˜ÐG‡ìÅËI+¦´lÄ` áhÕ·lÄ=Z"¶×„a–ãû(JÌ`Æ"#Í0Ò Ã,9¯Ê0ƒ…0Ø5¡ª´DF¹0¥¥ÄXÃ1d‰î•AJC†ÀzY"Cq‡Qì2ázG„2n€0ËFL žèaAŸqTéÜRbÜÆadಆz«K–(LiÉ0Ø.…*0£˜hÑëm²è‹YJŒ7C–/;#P?˜þ:í’„á–CÛn‰,ÀH°¢É“?Ü’cf.f!ŒƒE&‹ï)-1´Àèdðé™™-R…ef)1!yÜüÓnñ+Þ'@bèÔ1”—4ïþ§ÿ8öùåD{ƒç$K4ktÅ2A/ÁDŒ:ÒK@ÏÛIfÍŒåý”Ñ×…Îl1À¹,x-Æbm0èçÑÏ„ 1ÇÔc„ìú’pýc…¢x"̣Ȯ/ W“Æ–Û:º n–‹˜¹´õ`ŒÙy#ø®Ðå?»Ë‹w’¡ %E÷œðCBfu²´ý-?$ ëÐ¥çXwäÿœW;’å8ôçeoľàä…Úª6öþÎf”DRÕ¢z¬ª—ˆïl–D ªMU$¹‘ðH$~|{Md6K"¢%ÿ‘øH$éˆð­mOd6K"õ#ÕndÏDÒVWÆ(œí÷Df³*ÆËP¾Žé™H~$ÂA¬¼#²š%$WzK¤<A!2"ÌÖ‘Ù¬i‘²#"D¸þdIÛô]Í‚&·Z²"u›¾uCD¼ÉÛ¬YÍ’šˆ$Ÿ‰´G"Ûk"³Y#RÃK"å±°FL™˜_0¸ýÓ,fAIWBR$힦®ó…ƒßy¬¬ ³)û‚¶˜5"­Áâ”vD++ˆäöDF³$‚2Þy¬¬ñµœ8ô‚‘Ù,ˆÀ7A¢ jvDæÊŠ-JÝ#ÐÔÞYÌ‘ì‚RóeGd®¬@œ›ˆpÄÓȾ×,fHA´¼{š¶ñ!OS1ãõ_TÖÅ,ˆ$Ñ«œÛ‘¹²úŠ>‘n)Ÿ²OßŬÉοK_™+«ÇZàþ=‘ѬéA³çV>\<2çÏÖ'q«³UÒhŸÊ{Ô6Te®«ÈŽäâê,ÉïyÌfAæ<®²»P•´ÉáNsÆ>y³FÄG"ëņG^y”Ç”iñ/x VI¹Ã•/¶iw2×Ô>{¯ÞH`‘¶,F£FÂGþÎ{_ÈÊ‚óîÀÂeeÑä ‹ÁêL#mXÔ'™“²ÿ{‰$Júä(úBè’Ï,æRŠ÷ºñ.,f£Æ¢dyÕ­,|¹=È[ƒÑ¿dáXdþepÞXÆ µo¢³Î%4aOÈíßEçlu¦±‰ÎŸXdn-þ ¹ç0½g¡Ñ)(¤ààÑŒzF0òÇÛ³ôO÷©Œ\ΉX÷2¾"&Ú*3"iÈJNWÐ\¢ÚZQ&ÁGu’1Ädt&™dF„2h4Ý1cÇê¶fd”AýŽu’1ä÷?ÑÕO M‘Ö(³"³L¼ÉÄE¦~‚ùû†@Æ' ¨</ÐTfAFLGÊyEf™nkA à…„¤*˜"ÌÖ‚Œ2hh‹Œ!”F ÷„?Òefd”¹lÍdtˆFÔŒÂ2»"£ ÊFœe eêÇ-z LІþ¢•ßQ·cšd "Éqî®AWÜï2Ê€!2æû†P¦êTÆŒábø}CF™ô 2Ë2Ëd¿ÊLÁØŠ¨LJ™AÕÖ>| !A³•Z]T% 2ÈHÁËäQ¦#©Ù*jÛ™eÐâ,cÈ(SÁp–1„2Ôˆˆk/TfFF™¨ëè÷ LÃFÖ2¦ÝðѲ²£ oó“ˆ!£ jlžDøýOÂ?‚Š.™ÄŒÈ8I( ï>ѳ×ÇOs¬+2ʸÔ6ÉB™ÝYK¢232Ȭ³LGFu³Œ! ÌdíÓ*Ów ¤a™$ ˜tø´è ,+-µ¯ˆEÕ;u2–gCFì™e7ËËÿðT)¡.g¼—üDeðØèú°*§¹†OÌ+hs)nÌM; =Ý„/ÖðªPhE&ä" Ó⬴ù´ûÀò'‹®\èòƒEÓ?ZäÆº³(o,VŒÒ?X4ý°ÈQ 9 »W§=#¡6ÂÃU¶E,üÄä/ƒ‹úÑ`úÈöÛ1¾‡­AS?Œuc°ÍÛƒC¬×àŽmµ~¡F•ÃÚ%ÐU |ý÷øõ`Ç?Û‘yi'<ÙA©l †J½ åO-—!̉“ j‘âØˆÔUK©Š¸¬õ‰H.D~ýçÓ¼h¥½8A¿½/z RBQ­F©&£„QÊåSÉ·Þj® $)¥™’ÿ„²PÒõë¤t£T `îw¾S%qÓ(y`H‚ —tÝ…6DxâÔzì’j’9Á¢‡¶ZFýÐü9]M•8C|9TÕ`ªB÷^ùQyW%õºHUAK1‘PMSß.Ær¨jnTNUy‘®‹T%ø¬G¬îæ. â¢:ÁuåN•«*TÐá"ì&‚…Ë/œãÃÃó9‹ûq*Úó Q)ÍA¤É¹1rô3*@ÊHŽTÈ‹£l¿x3…óœÆsøåáTÐnhˆÝ)ÚT¢û„9PÂ@D Ÿ‚?Å~+’qÌ¿±šÐü „4©ÆWEÇ5œWÆË9 eä&ÇZ¬^ß?³™@†¨ÂÆÍòBí`pºnÝÍ ƒ:~ëo/&žtQÍþ㚺 Ñj»¡£ž¹´èð2Û}:³eVýždþLiû¥¢ŒGÏ&U,d€x1MhFª áÔêð™wÝ]•ï ¨ß<~ù`ª;û_ 5¹âÒDDˆ ÖEƒü4‡"%§*¸c¸x8»ïzž£ºÊq×Cø6å€g ’”|”ð9M¼Ðª4ùÀ"b2ƒBEÄáÕÖ,x{Œ|‹LE®¸± Ž5~)3-z$82›ˆdEv×ôVö= Æ‹¾Yz{^dQ© ˆ1`Fç?žÑ× —0N:5Èëñ±áÜÂMË"ò•Š8·TC²3MñS!±Hé2>µKÕq‘b7Î¯Ï 2_™ 0[òÓ¢ÖÓˆmÕ%CB¨I v kX'rÝó®ž5&¤ÃÐqŽéÈÕ[(^ç‚“Iˆª¿xÂÁžL8¢âŠ"‰ìV®=Y£ˆãÌ ¿É§¬ª*ÊcRs—"œ’Þò)_ªìbÕ)ïøªzäýŸXE¤C4È$V;J¢ãL£V; ~…¾éžzÑãuÁÅìbv?dÊëó¬*©€5f¿ˆêWµÙGÔj‡‰›ˆhËÚH¢ÞJåˆ`N)˜ï"Š›Ü §üæó©k=Žîý4Xë1µÄÂçQM§=Jè }iDm<ÒýuëNb{Ì-¢ƒj$_- zœv+"l‘Õ±XzŸ:;/Ò` ®çµµuÇ%·[»ã1j+MpÖ ±àá62ì^dšñšT Ž#zM&§?œ§ë˜ÇN|Dålg¢°æ+‘ už²ÖˆœJ‘—‡;8‘ ÷nþÎËýŸçNÌJêL˜˜hø½^§žˆbê}QgL­ñhÚ‘CA»Än!ðâœ]ñ8•†~‡Š‡©Ó :ˆd"ÈŽln:´:u¥QA£¯ÃÅ›W†sòÿé\¼™Am•ä‚öC¾AS¯‘Lõ©“»´†Ü½’Тk¼ÄS¹õxÎór•< z*c6 Ý’<ÚîÓQMS‡H ìœ7v]-ò-•ƒ Æ0´ü(Eç|3…ò›OS—@øÁm<1žÏN*ÈP -WÁ°~Ô÷M«qù?éÕ¶ÛÆ‘Dßùý¸7Ñ}¿A,{Và$o Yf$e%R¡¤Õn¾~OuÅ®{f6@)žž:]U]u Ä w°ÕCÕCÓª?V,ô»6º*«I›U%I†Ü`^ˆ¼|s_ÙD„ÿáØ+‡ŸëB²‡_ƒË.\IÔˆÌ),I&Æ‹}r`ÁSC£ºnõû±gL¿GøL°÷4(aŸÝÅ’Œ@¥…Éþ«ûCTh§•1ŒêH¼ü^WQ1ÚdcÌTèô|Ò°HU¨ *IGÀGÊÝ®ýj¡‚Yè†;$säÖÕïǨ¾?;]¼ù¸¹½Ù¬Ï¯/î×â›oÞœ~|'°Y~ûíÛw§‹_z—äŠ)OIŸgPÌñÀG~›…ôOœŸ~¿À$õâY,Äz Ѥ1¿±HÄYûlqšºóùˆ?øÿ‡8B=IMShš­s)„q iî°PH³)Ä1 JçÕÚ_MqHœša¤5 o§8¤QØ@Ô Gâ ³òÅAI9A"$"‘Ì8 ºX‚Ÿ$¡ÆH`oqð“r'Q» ZÑ ‚5¤µšªYS“P:‹ù—H k n•Ìmd„Eã³°ˆ¾Xât>LË"xÆÂ«ÌÂŽÇ¢ñI,0¦3/ ¢¬ÿGYXÎëY Úi!–Pyr‚÷I, ¡°a%M³pœz‚µ¯2á> ‹Éâób0Á·,bü},jŸÄjEÏfÁ{¦JÈȅƼƒT‹wã,¸O°@T4^‹6«q’o›:ä²…Î3~„Eã³°p²X¼œd‘ZV2PÁóXÔ> ™ÇBÉ–…ÓRZAÙ©ºh|‚…U1dI/uÇÎ6ÈrÖÉb¡íõö•¥`rðkHe ¦“¶Yïܶ œÌbŸ šSc(eDe „ϽTCIù‚`†‚P† P­v@T†ÅY.ÓX€ñPj&T·á†‚ð.T\¹aÂÞ; -ë7p„mù.ñxÓË‹Tk™‰‰X«*Ñ,™Jc)ZLm&a˜CÔj¥žràK…¡µF1Ì`)˜¨ZLm! L¡J±2êP0ÜÂ1Ò´²Ü-ŒÄ Qdi1åÖÂ16´²ƒwk5²¸”1e&m Zl 4FR¾ZKAçàl ˜ÇÊ’eVpËLLî·Vô( UqûÊRcLVS·¯,ü;&¶ß! 0x¢Ù’×-C˜Æ2ãÐHÑ¥‡† Bm óÓRaW ¹7ܾ²pŒv-¦,“ 6µæ;Å jÂË ¦Ðmk¨U†!Šˆ€9ŽVi ­߯2ÕR¡IY uâr…6ޱ©ÅØRÅQB§²õrž ÇØÔbÈÂ1Ê´²“VKØûj,3øj,w bÀÞB+#2À´ŽñªÅ…c´k1d†¾´%l2¦±pŒT-F_$]ÐÏ,úH0Ü29©i³£¡Ø«A Tº†UÐ5!C ÇX×bÈ2÷;ii=*ÚÚ™¢xZÛqÔˆ:Û¯”¿â d’O/‰‡ß„w6ìRƒ4;âæ2ú'YbšôǶG‹~h aÈe@þ±$´‡Ašî]6j—tjҥ鹌®v‰‘þÚeq0âòså¨Úß®oV+[±úyA>°’0þTh>ÆFÌR ]b1.Vw‹?É?¯~j•„V—âÈ1ôØD1ÔC ,Ó2ƒ{„ι”áv±Bº”Ÿ„“.p$fûpôË„eŒ®¡ý‹àJNãqWH_ð#—ÝãqY:jä¶{<škJCpÔÈu<5O|¾DGMß×bå ÝvÈÕ!Ë®“å„n/ia!Xgö‘:îˆ$©S1´ð¿uC‹ñ€êÁ,å'èÀþŠ7”â%¦:3=¡?±A®žÖÞ M¡}¨ä—)†’Þ³ep~xýðpqµ7¿­ÅÍF¼íÏ2À6ŽþÛ¿©”x˜ üØãelXuÀ!>„æ ûÜb•DÄrììåÜÉ˧t—§©§= D•ú^]ï¶OW×÷O‚³/÷ù‹ïWcýÍ mG ú'.7 H+žEø"‡Ä™Ã“Ãriµ¼R¡Û½ýËë6æ‡ïÉ|ßü½ÒΆŠÈu€ïÓénxž!ú þ´›”ÃÕ Vë\éSgŸé.GÐ4á d,CÿóÓÍcõ¬¬ã𜦓C󤿔éѣΥ‹ÚD ÊSÖâCÇŸ† ¤1Íà7=0J[£›0ðÕûé4†×i„ð9Ê-cDÑ%Ú(­@åh,EH£3Ý4Æ?œFZS|tEï(£Ìh F¤ÄËäè~Kô‚ÇWy4û<âIç§h2„”ë dÃx ŽÇääðNiKÒy¾z/þ*~yºû²Îg:–O‡,Öÿç§ß^«³Ëàñ<Äò Ûö\¯ziÖrNšµK³GWÄ'X†ÉüéfóôŸÿãQÑŽ§-U%þ°C?ìçÓÑLÀÝKšxtÖ0쌥Ց ”(QÔõR–¨{,UhUxM ÊWcXÓÿ…nÐõ:ÖÐX -A Zõû‚ œuˆ*gý0É»Q¥,‡÷Â=¾æà÷#hŒAÜÇp´¨“Tp¯ÉKÔÜAj  æ;+IJF…ÏæÑ;üÖ½ Y¢û—Àý=_â(¯È%He†¿Z ½„Ž­¼ïkÓuîôRgíRO¬®×âòúb³Yߊ/ÛÍכ͕¸_ï~ÞîîzÌ·¥qxàìK›Ëµxz óøæ—§›Û¬z_1†yhâñqó"Ý3HV†²3ŸwÛ7¤Ç»Ç¬AŽml®~¿Ý=>ôÏPsQ¶¡·-÷ɯd¨qgìD¾!üòPxQpG¡{šbàç~iXz=†¡·âü ‰;ë ¤mwѯ¾¼$EŽ¾ì¢¡05Cï¶â'÷îs<ù E¿– ìŒ ÍUúhÌ´m2+¦Ôvà }ÝEc@çäùZï¾l/v_ûeb¤„¡å§öqñïn`iöà ¿0ÞŒ^Zñá»ßÄOëíÈ›r í¿>|¿Û^bÙîFŠ™†ÏÏÓfÓ¥™Ëß*ÕÒÜWiwe³ÒõuàBÑ“?ôKZQ)†^÷ÑЕÔõjô×ï.úÏ‹ ‡ÖÁú€K#>õŸ@TËHz½>ƒ1'ž»G n—Òžé×§Â>-G÷ëÛ†Fùú‡úB¥è™GûR±<üT”`x¢äCÿc4û@kmuò¾Nè\Üø×z‡éÓ0H“a'–õxþŸ¾]{ endstream endobj 9 0 obj 10731 endobj 10 0 obj << /Type /Page /Parent 176 0 R /Resources << /ColorSpace << /CS2 183 0 R /CS3 186 0 R >> /ExtGState << /GS2 196 0 R /GS3 195 0 R >> /Font << /TT4 188 0 R /TT5 184 0 R /T1_1 26 0 R /TT6 24 0 R /TT7 23 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 11 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 /StructParents 5 >> endobj 11 0 obj << /Filter /FlateDecode /Length 12 0 R >> stream H‰”WkkIý®_Qw!iÕû!;&ƃÙÑÀB6 -¹%õD£Ý­h¼¿~Oµd[Uömk0msoUÝ×9çN?µ}½,=ûða:{ØUlzW®êmÙ×Í–M?õ}¹XW÷ìÛtÖìØ÷éÕUó7û&½+Œ“ž9Á +‚dÚÉÂyi˜“ÑìûÇWŸ¯'Óëß$[tŒÿY·ØN«Ùdú¯jƒ;~V×ͦi뿪¾­¬­'Ó/pXu“«Ùd:›i&Øl9áç\²Ù‚Å/…¿˜/Bðf8öôyö*U(/›ý5ùÇ×m_­Zܵ]±_«Ã?gN^º*à mLêÉ®Ë]9¯7u_W«·}ƒú»¯w7ñ¼Î<¿‘Ÿ^Çýë¯ÓFŠ—Ý1ü3,žx3›ÜÜ"ew±·×_?Ãù˜Åc2ήã×âu(^ ÷=~ e Ž‹˜õ¦ÐÒêáÂÙºbýº^ü`óM‰Ÿ›z[!6¶¬W“¬[7‡ñ=ÃEît‘öŽºHD&„I/ª†˜^·…—V¥ö»ª]6í_”“R²àRÉÔ©Ü.*Ö,ñàŠÍ÷õ¦¡ÄŠoØ]ÛL`¡ˆS(Ââ©TΤ.çšY§Š`ýñ–/5õ*¡`/„MíWèÒÈ"øRž6džgæì†v°ƒLê°®ÚmEû €Þ›ü’]Ó’.M,RšºÌéK¤ …ñJ¥ÒÝë5Ï⨪-£o0®°Á]|ƒÕE0:»¡a¿íÑŠ·dr ¤Ð>õ"Ë­x(¤0Yž¤9ÒjÍNoöoóùοÿ"= ^ÎfÛÐÖ¾ðI/kCDa¬ÎÌ×´¹-,Ú¯7e{ß$2hå ¯dÞˆ¤¹Æ, ™|¶&«ˆÇù.+yG›‡Â)c/}ŽU…æÂÎÐÖ‚­ò¡£ßâÀPN¿ò”~Ä ¦“oc›…uâUMsÏÆ Áòbà3r¢"öXôabÝ´?h0ô1c.±M¯Ñ%‡²­Þ±é*ÆV&ñ…1Ô6±&ÛW_ÀÃ'Ö¬dV²#ó‹?ĉ‹‡´“Äè¡…òsþ#­yE?¨§Ò§ùB•Ö¢cšfa¯² •4PAÀ¹,C4pS ùiåª1 Ά´Î‹ÒŠÙÓYþ·÷,€Ïih†õpIÜæ»ŽXð¸»0æÈ’FøËzH@YHßÒ6ûÕz·'oÐP’g5x7‚–1­B¦ñŽê‚ÍÚš¶ŽòÑ\˜‘yq6™œ)Uç8P"δïGq2ù2È÷ê<ΙŽÎP À˜‰†j8"ŠeÆÀC*D”Lo¯¿~Fïüxõùzr5Ëf[áñ5µ¥ÂVqE„޵ÇÇüRo÷³d7lSýÄÏÅºÜÆßæÍö>>sL³ é²ËEÛt#K¬€­Ž{Ú¹S¿~Jëcýœ"ÓªdÔÝN¥g …‡½P£Kê-˜/rY¾92Û5mß=÷‰=‡4tÂûÄ€ù‚…Ðúdß¶Õ–¦=£ ¡NH–3¸5©9‰Ë˜á=žœ˜G(»ß/ hwMÓ¾=É %|Ÿž2L2Í´ƒiÈâ¢÷—€+¸wùlßÑÂu ÎfùFþ¹ïFˆÏ¡ŒÓŒ4ÛŠ5Ëq×Ô<ô%d©¬»0x ð ©yEëFÎy!«GlXZöB+I•U££ÙŒFŠ,ÜÙ v/rJË^Ç0ËÎït¡µFö¹‘/ =¦“…ˇŠÎNdV•Y.m1ƒÎ¸×Ê5`’}¢/Rh6øi>dƒU‰% bêÂ÷˜XqÙ{¢2¢;:™gÏ™ÓP'Bä\¨Äá>Âõ,‚”àTé³gÑT% H2dæ4U¾‚ôYGÐ3+µŒ9u©=)󥎛„Í"†Ì_µ½OIt9š)‹Ô^-—4rÀà §m/ЭFf‘Wc{a\™*ÉÕ|d‘„òÕ>›6Æçó›%·¥C°Ð‚Üä4bÍlrã4÷›BZwa3©ð(G’”²{ºÔZDúÌC(isdTæ7°‘ó1Vš,:àÎÞæÐì Üè<âã¦Fzø´¯Ó€äÛ•åâm$7£ƒzCi‘<3§©Y<*¬ssìG¤:]è çm70ÿ¹9›:^Gd¾Ì[@çÜ|ŸWÛŠF,®áY4ð™yÞ#2?Â3ƦNƒÌ§1×è ¸sî3oز¥E‰ô¶0N‰ÿ±^m»q$7ô}¾¢>ÀÛªû0 D²hN,l,öa,,öŒ2‚~»G3]T³º èÁV«ÄªÃb‘‡‡ _œ&m<3P º…x£ÞWÝ£EÎÙ{Ëb%óŽ1]²ž=¡L<†$;÷¾AýAà—•G3×yë¸ó×ë‡M#>ÈÙÄ“C†@ÊFÃ=R×bÁ¹èºØñ›õ9±sÂAô&ŸyÙÉ<¥}ÝÂ7ðå ‹R#B4—‘j­ì";u±0ëûýîÇFÞ‚ÁÉ>#%Y—GÛÅœY™mçX¼L°äK Æ%2fØØz¸ž^i«v4øwôcóûÍþv·—1h´HºÔ›ÖÛkYÏZ ¢%½?Þ!«:p@JÌZ¦øÈƱ;44£É˜Q½["k1J$Ën{+Ö›µi^î …ˆ}—…ÆáôÈÍe²†OšÇfû ß6Pè=;÷(;a)×eÑLpÈDž;òñ©tÅe³ôøì;H†ŽÍ×Z½—9“Zt½çóýC£é¸ÔŒZ,J2Ã[²bwX«™#| <‹v;Ù#Šä+«LB×û›sÛ ”üÂb#Õ«cˆKßÏS¾fþ êKCòBÃDÙMÄ~HÔ4w¨q߈áÏ?Kðu»líDþ‘_"»ï|q‡ÊCãmJã|®·ˆ3#iÝäˆ˜Ææj½•©AZÁ'_o¹ÍQ¬cm¾YË7È.9vu³{ü,ó%Ô€A«-²*64u1kˆbhé&gêĽ’û‰wàË.­J=¦4…;%_9BUö£c q}·ÞnåÑÉé„ü )WEw¦[ùÍÞšu×gñ»«Õ»÷«³êõë³÷—o•UoÞœ¿½X_­Î®®¼BŠß“ýZý6Ê{Ì~6z´á³Ïzå‹G­€½Ê+¥.··_·_Ï×ÛõÏÍjàúNwx8# ûQפš5‡ /švèÑ Yž]‘y¡©vle{Ì¢%Å\ÛŸ·†ËèØékÙš’“kíÌúÓ¤¿äzà |f›Ôúf}ß?¡³šßBV˜€¢O¥6ß?¨õ~£>c°¹Q»­ÚÈÅQ"¢Àï%{WJ‡áÃÖæò8‡¹Ã;t¯ú2ûÖ¼ôï¥H)—;_]Нîˆ="÷Hë=ËQß8PÓ.Ôæ»½¼ò¬x–º“´4m19Ð;˜µÌ_9@jh³Øt—]X@˜bÈŠ=Õv÷SŒiNY%\ß5æP×eÍ“ó^6Ï]ö<Ò„Tr`ÉÒ©–3;¾“¯t£ó StX±ŽÅóêns?v`díŸadŒ½ Y>Ä÷q¿ßlÅk¢~J½I`Q0wµ¹ÿ·¼!™Î{L¼ÕÙä; ˜Ì|s}·Ý5F3„Þ¯ö쾈JÎhp‡/»3Q2&F"™­éRa“ ÝÅbÌR_ã±hæúõú~ÝP|”YÆ3äÀØ!ø¥E sÏ¢}(˜$ZKd «ciAiã>Ó¦‹¨…Ú²UFpxµìø³ah”…Ø#ÇÈ^NæKLP”,³Êw NU»ƒì ^-%nþ(÷)ÆãÒÓ1™øÂÍ]?eH=ÆDrÓÇc]d¡Ùï¿ÜÝ?Êì² 6óHýHúm¼a˜0dDòß±DÆ<"‹šÜ¡AÄzƒ|åhÉŽ=ŒÈ>ÆCW‰{ªãDuü}’xj²ÃÿD&K ÙÔæb¥ ÙÖæbê¤~Je¹9å£fÎȬâÄ®a§“^o(pCó ¿Þ$*pܵËàÓÚ¼¡ÀMñøÐ±ÞðJ6]püÊ}Þïw_ök±Ù@‘íl˜'Ȭ¸ðIÇÓâFý¯Á@çŒwÈòqõ=)ŽÍź°˜ä|a¯ 7k‹IÊ!.=½ÐÌêXÍläþBÄS £é ´ƒ‰aa8‹†‘Òrs8ãrXX5èsN<¨jþøÛGpþ^]ËP¹òwØ=lÔõ¾1ôt4Ë”'8O¤äùóÉS¬CrxËž¯Sª§ÍwW«wï/VgÕë×gï/.ß*¯Þ¼9{±:¿Z]]eÔÕíJ÷‰(•ê· ‡OãhºÊ¨Ä.eðÙQ\=~¹ýöu»ùt·¾ßqÂç¿+SB—}Fo§‹á‡¥©7ªýfõ/µ]]|²êâS©•útñaÕÿ™è]½ÇÒðïwõç_Zݨ갨¾¯èú§ß¿­>ÉŃGÿPc§0ÏdÛ y]­]ûuXiz–¦ØaC…~Áú9ìiypÀ†(-%6“Øe¬ÇÎܯøÙL›TGpÓ%¸ð,dÃêEëa%ΦÛd—?¢ÛÎÍ ×Xz\Œ>ÙÉ詳ŽäYg’ˆ+t î Ä´Râ ºlÖ#ôdZè‹Ð ¢±}²Ñ18•ÝN'ÇÐ}¦!ÌmtÛBw)Or½Ë2ú‹Ð ¶Æ~%΢7IC‡u@GjMgÇЃV²žCoÒÐC™Cc è9/Eo'‚w„ž¦I–c[½&ªÈðk½Iu@w¡GÏÓ4˱ô臕èçЛ\ôPæÐÇXzÎKÑ›\t¥²7˜ ô1ÐAŒ¹lMA ΡW\×PO‡»ãGéÑm™FgX„jŠXAƒš­w§9zŒºImôk@·y)ºáè)§qä3ô(/}Œt‡/Œ,ýÑÏUœ³5zê‚ÏîAì¦ÑÖ€nâ°2[qÎqô}Œ5 Û¼Ýsô”Oè´œÁótFFc:*?Båò±^q]/Jcàwº*Ža è1ÓÊmôÈÑMþEô1Ö€žõRôÄÑãœ/yZ¨n}ŒtïáÐõxEu:ΠnøÕ]—Ò4x 5`¿‡Ù{ít­Ãô é„ µ3Çï^·Íˆ8D›ë <¥Ï>7—é¾f8 $mŸ\ÆfXº3KÑ-GÏÖ>‹y}Œõ«è®…OлŸ´½`…Þj#Ï¡× ù–­yv÷ÿ“^æH²ä8Õë%Y§q_äÑGé;´”%ôý•y b!‘Kdu+ÿWz8' bÁá‹Úb|­ÞËÕCKùwv–+{¯ä˜çÑn|á½Ð×E™¹4ï‹wl/‹ e]$éúþ€À©Lq2NEÞ¶ƒ¬œ–,Gåô¬H ;gFà4i$e€ºï˜~XPFª†1ÂhÒ0º["íÜ•Sªå§3Bun­€½ Ç +§fËdå”h9‚ü|EnòÎkºå,¢&‘†‹Ú `xʵéáæªžEVNΖ#ÈÊIÑr ­5Õí6jƒVF«†ÑÆ©î==Y¤Ø¥2(Y9-XŽ pxçž'yq~4¥Y9ÝYNw–SŠå”Ñ~ÇäÆ_ LlfœAVNo–Ó›åÔd95)§Ð·E:ŠX”XÕÆÉäL5$#ÅË“´ÈÊéÕrSè—hKb#­·b‘•Øj8‚‡1–¤yÊ-dæ4’øÊQdµÓ£µ#^Nc‡±ûQïÈÊ)ÙrоÌF,òÒ#“cPŽAVŽô•÷N';¡žÌ¼5¢Ë Ï8ïŠÐÞèþÍîÙuîãÆ*]à^úÍû¸W gîLÈu¦Ëxånélc-äSΩJ•kGÅ-#YWû§Çä(bõÊc{å1õÙ£ãq·¿ztùÊcçqïi^zû?_L‹ ñ³=æ¥{£ØÕáQ^ç¹GªìîÑÚ_=–«=fÿÊ£DÎéÑû§ËÃ/5‡§%:É»[¬JäráO`äo‹Ì•£Èj§m ÛëˆçKåñyzÒèË]eƒ·ÆçLƒÄÅì»7ÆqÝœ.È]ÍbyéÓ(ÈñðHI‹q´È‰~j÷hì¯ÓÕ,óSl£¶Ó#1ŸzLaõÿjêËå•Ǹì1?ó¨öñHëê¥#Ižs¾ò¸ä¿DGT°MëÄ-MI¤ì˜S5öWÙ]ylÏ=V–žˈï'³[=’Ÿ.÷¸ä?Oíj²·}®¡Ýìßžæ–ç»9$¦èìç¿ÿüïÿ¾xlÁåË79,З©‚¾‰Þô’ß«)îš2*‡!íǧj碆ÌÎ#VÚÅÙÿN i¦R"¤Åý…œÅ;rzÂXH¹ÔÞêa°ðCOóë1î†UçiWáZâ[A™¼W+hu¯‚ÊÇ‚Ò;A¤CÇpÆûõŸ‡³qÏôGÊL!Aì\=¯’/e?åø© ë^Ñ¥8Er¸T.õ>•ü¹ Õ½ JM‘r•ÖK}+¨IwTÇߚ݋ Žµ‚Ëjoubhj¿8¡Õ½ ÊA‘vyBoS4‚bÿ‚f÷*¨µÕ·YšêÓi$ƒ“Ûç‚f÷Â5þ;ˆKAK¢–âG@n‚h©º$]êÒÇ‚Œ{T’"é*†j°‚bú÷‚f÷*¨µOE+(·I…–;ÄÑ_|.hv Öwú:ù?^õ5­‚P0r=¡HéøXq/‚h„Š"Í] ÊVP+‹ Z-hu¯‚BûTP±‚z›Ñ×È+#LûoÍîľ\ ØiqŸ±®ì˜UjÇA•ÄŽE”š"5„¶+HV³šE”Sš"ÍíœQNs–3#pRbWp0(+  ùÇNîæ÷ü=‡õ{V¥ ºžþ9Јzâû¢f ãü=çI6fD8œ ­_HÚ!ß™ÓéÊVŽ"3§ÝB]9ŠÀ)ôA$ ùÒ)É÷dâÖ…³!p*1H! •—Å“º? 3'°*/E”Ó³"RïœÆ_™ÇB÷Ýêˆ<ƒLœîÆÌu@”“ª ¤¼ºsfD8¿˜K]`Õ ,ÀÌHœíŒέuÏLoœœP 2sÒ­º•£ÈÊ ÁrùùY$yŸ%Çg€‰Qo}”,ŒÚ £Ž©"zNA2Æ{´ÈÌa(~á("æm ‡©f`f|ÛÂÀÊpÅ0œÄ]$ùT¾ceIF 2s¨Ë}å(²rR¶Aàm|’ìÈärG™9dà¸rC6(ŒQ"z¼'‹Ìœ6:û"œÂŒD´oÎ"+'GËwF€pw~p ²rB¶AàBÄJäª/ƒÌœŠÂ´pyŸ,; |WΊ¬œà-G8Ü\#Ž’4™êË +'tË ê«%" ‚çóàdåÄj9Q}‘}¶ 5ŽAVNË–ÓÔW§¿Àbâén{7ÈʉÑrbüÔí"HœìXdåè}Y޼¢¥PU…±üž¿oÙÂÂÁ’8ÉäïAùó[YÞ©¡äê‘BÝî# ZdåÔd95­Nârî©[‹ø7ЍˆT©HOÖTc‰Fb ïý¡5Ž;¦5/¹OÚrå®ÍiòtTQk‰ ‰'á±×Ó£±?yŒ´ —ìÏ=Òa¹Ùã¼Gcö(=ý…Çöb¶¥2:)!¤ÞÝ™ïÔc*T@Yw|®hÛT&H/j#µ<™PºZ-‚üõŸ7Šü+E)ˆ"nEì”´ €¾ÿ­;Œ¿Þø ïüHMC17}:âÞÃéˆ~C²R‘±’Œ:ö.Hƒf½¹¦§A“æÓ`ïx¤+fNhÇZµÖ’Zóa·Ö‹Z ÛÙvzõ6ÙÇšL·nZH‹6€|NîüŒ'ϽÊôÜfWzçã^ïcU³ïá‰Ïî\¨¦bQ$†ÝTje YÃl|3•§…äʶª–ùåü.® ésƒß5nñ$;‹ewÕÃì\\yŠH:i?)MMÕ²›*N‘’¬ñ&Sy‹ÛUÕ H:TµMçv“»&SÍ´Ÿ1®Ö¢ãê6T‚´1Àî eU_܉©@OÉ6vš˜Šã‚Ä€ÛL‘ ƒïÁ?ÏêX¨455.è<+L…糚Œ7Me"ÓÏn7 Sª'ú÷:QU§»r;C¬kçÉü $¸8LÕ°›òA÷Üøfj^¨¦â&>—}aHa¾ˆãÆTÜ6ȭІ…Qwt!6R÷¾¸SãbŠÉ¡8¥EU%³DPS-í¦JR¤¾0¾™šª©–N㺰–EÕƒqcÊ«ª”ñø-éGû Àˆ¼vÜèéìÔ”¢deam@ôîǪvjùÞ¯ì‰áÍ̶JH#Yüd¦ŒÍË&/™ègz ‘ÜîÆè â³ P· ¨ÍãÆÄ3+ G?‰YÝZ µ}ïg´Ú–(?Lí …¦šqN“­¢“Ò˜ùBæ”Ä’œ^N!21ÁŽ«¾è3Ç*7ô _ÛÂ(õà<Þàæêú{ã"B{Û.íVƵp™ml¤ö2ŽFžÈ}’»‹)…8-TWSvúF£ØïiR*ý}N¥Rà—Ñ´{Æl'Òº/Ç­©iû|Ð1}ã ½ðšîx÷³½Ej?l~öuU¯QÆYZû뻬kTæªHíaLrQW•ã™qcšFÆÃ5Mß ãÏ@²WÃqsç¾ïHô§ÕÃÕ¾Phbª‚(½¦,$ÉdEª¯›©°ÊÕÃÔ¹PhªŸ·Ÿ3Ù‘Ï(‘VSžsEc–Æ)Тù®HŠyÓ–d•ïuSÒytֱ͡ã%/¾iäøNÕ&6˜ñèÃ\A¤ÏâÑÉuÀÅñ {½õ¬‹T-J„%õaœ`x¾§Ÿƒä×ÿS^u=rÜFð}Å<&A¼"Ùd“ ¹³èA†œgY8[ ¬³â“ $¿>ÕÍ™Y²wfwƒ¤»f‘]CöGõ¸Üœ xC€dòÊ_ªZ’o´íÔñR2`rÈ)= -©ùÎò~„a*r³øØ,xn›ò˜vŸ½Ø½õPì:JW"hœÐÀµ–]Q·P›Ü,©”Z:ÖºX4Bùüb7××X[—EıĚ Ä.Ê@”ד‘+ÇfqA-3%Ù•âk2 f—uø ª¼dõ˜("ýU² £‡’ ¹f¨TÙå— b7žÝîÎz­ÕÐj’‚„BOQ<#´"ÊçèW±díQ+;슋6%éËÐð”¬n#r7×O¼,à iÿ”Óež$d¿æ¾œÀQþöúÌhšÐQºÅ/ÍSPÙ Z`‹ÅÆrnë2*Ÿ^$EA§Œ]ÕkDÏâfɹYðE±m n_nÓçø2;ë+‘uuK«,%‰®0‘t­©” ÐoÄ´’¸áÊ–*KÒ÷ç¥nDþæzGETKhë‰4ôYBxÓ6*‰ÍBY 뙼¥È’H’è×}gD6×;"X‡Ä×õ˜¤óRvGFc¢ êZAÅ’³XÜÊm95áÞx¡¡;o¬¨×gϳ³¾h YÏÔÖ3i½ÏÈOHBÃaߨ°>-¡)qUËzêBN¨ ú—nãÙ­l®wTEYP[U©àK% öZ<ôÛŸ¹Fn9}9/½G@·ñŒÊæzGEôBnëP›B¥b*‚ô#t›â• ,ò Цˆ¶Fn9£­TÐ¥»çT¶Ö»Â:@×SnT2:·8†¥"Ë…nïi9£UZ –nôúÿÙWo®wTç/w® •ˆ¾T \dg&q#–Šæ+äšc{ªR‰2Õ“¹£Ræ Ù[çËí}¢´ê &Þ+È÷Jšd•xà†ºK+“‚H"MpVí!¼5‡=6B8XRC,ÈÅlÊ‚31žŒ¤ÔE/•&h¥wJÁGxt±ÞœÚžàërвMë°-;ËKĘea(®("Ƶ½Ä€䛥è$x"FG¿°À&!D6ZÌi}»OÊz‚T“®Æ:’F uUä ú k»˜¶\ J “OmT¤Oçe£á´šËiu‘’²,Ý7ЍÓXÁŒTEALø¢4£ˆÈ™„\#6œÙX M{¥TïØüé×#Ÿ§ò¯î/^>ýöáéñÍû·Ÿ§o¿}ñêþå÷|÷ÝÝ÷÷‡<Š_* P‡¡¤‰ Må¼^û?§§ƒ›ägzsÿãÊÓ×é൓`B6Héô½®È9ДúEo.ø³ÿL²ŽU àé"ãñ£ä\³P¸Æ!]æPoã0zløf|‰ÒªÀ»&ù5<(† [,õ*‰|‘„ ²JBšÞ> ëRH É…sñ‰r…D®7‘]6±ÜJ¢^"©%ÁŒjSú¨µxkÔ[лB¢ºž„æõ°ù&XË?HÔ‹1a]6)4‹¿(Þ†D  é\7‘è]6¥ÜJ"X¹» <‡(fI’zDï$pZóД\i$àbk¯A¶½›¥•9ki˜R,¦·ƒ‰·bJÁx0‡„µ&¢”7Kˆ 3Z&”ñœÑ S‡‘B<°ökiÏÍRÜ‚é- Š=§·=˜=,¤¡aFKÃpi–Ä ¦·4LqöœÞLŒØò¬Q Ñþ&^§¿ûõÓÃ~LŽí0†P­¥a¤_4ãPLoé1ˆVÕ—ÂþÔœfY8YC¯©dœá%äíÙâ­jÍ–æìCºâmhÅ"HTa—é!!Ӌη«ÇñüÎ#ÞÆµÈ0–‘ñ5Vé+D¸¤>&ŽS!¶ÇÃ!cz V »kytXÑs³½ɾ|ºxs~ç‘<8h(ËÈ*_}œ|‰Õ¨±§*l‡ÃŒü¥t£Ã¡ NpÈöF‡æøÿ×a½â2>á—Òe€@¶è/{ôÎY—%q[,ž¹ìÀe G (MÞó•FæÝØN3*´œ6^+F®quit.£Ž­W<†+å^w<¶ó›Ã˜¾¦¼#ë‘r²±eR¤Þcï@\Xм0ÂeN/ºkWqpíµZ—£ƒÎ%HÄkâÌ»t‹K$û†ËÙAÿ•hóWâGikˆˆ™³±tÓ0`f 0ÕÁº«j}¶–“‹Å䯹–cE­&TgßîÙXFÌü]Æ2b\°§œQæa¡îké1¨žqÄ4Ëç «c jiïe-=m8Œ˜fÏÉÑž“^€š(–äf´ô˜å½¬e<§{Nmœ!Á|¨Ê05Œ±Œ˜éZïæu°ŠhÒ–4DͯPÖø/øuα§ÃŸd6zÉ÷EƒzRíH=f"t´ =+±Å£9ôX®ë̲éÍ—O‘ uÓcáÁãš“³ÇןNµß=^<<ð䧇_â3„ÃÏü«‡DrB,h‡¾|øxø“ûóÿXp ôðnÚØ†Y§¤ ¹…®R¶A»ëÎKx."u«âà xH”}P<]ÇK³qR½oÀ'‚óº_l‰¾ŽטCãŸg¼ÞlÚ¹Ù‚ ¡^ñÌ®„å^·ÝˆŒÇ ²…ÿu—¦\h"tåq‡lX6!\r á”ç7ò+‚õáëåP¤ÊÅçŠe†W;”AÀWÀüøüüö×ÇéùçOÓÝyUlýgïK%¯ óðç=0f­²aµAMÕ|Âóò²¸1½;/¶îûf=Ê' |9Aß' Mïÿøý˯ï?}ù,WðêçOzâ Šws¢ûI~¦çwOK¢\Q;2¡N™´\`À+è·(+w9«(ìí§Ÿ©Ç´º1‚>?ä¢|—|r8Vðü+Á§"*¶“L?É'l ‹”>þÛ¶âÖ´âõà×{à|ŒÈçüò~qE\ƒáñ÷9 ¸ûv©‹ó›Ö `(‡BJr£ 䬯;4YªšüÒƒ_ì Þ®ÆüûônŽ ,’`üíÞCˆžÃX7€÷N.oÍÉï§Ç_öî7Ks1§ï‚ë1J(àÇ0´Oåz깘“?ï€!=b,uߊá<tÒ½ûwzsÿã#\œ¾N‡ Ø“”5Dû)VÕsÍrÞMUº%UÝ©h‡íp•>Lžµ–i$jžÜM?ída€`GéŽã†×/µè]¨ RîÉ‹úF9Îŵëüy+Åšby﬌ûbÏúòÇcôFÎÉ Ÿ÷ÀȱÓÞ ‘ àøþõªém†¡… †%Y¶|ÝaË€õRì°«×(±D.éöë÷(É_µ`@oCQ I½÷8s¦ss°÷Ç$[މd9É:9HE,ùA[Ì+æà8í6{K^Q£»Ÿ¦DD•÷•Ä«^X †ÑršX€CF{Kžpw—ר>Ë¥]Iƒ!^Ü øÕ^*¤¹ó9‡d›¹*n8ÀUÔM(Ø¢3=O,ßÌ^ËV,%`Ûgo°N©lÕ2üCœŒ–+–¾,Çñ\–Á¦|Fñ¶h™ÜŸ1óÈx›à¬W,À¯TMo[µ˜¹¿½·pIè!öJ¹¸áWr#7Ð|c¶_™Žá?…†äš4¬«½ÐßÒZ(óˆ1qÞB8F*4hæ»!3‰Œöõ}·T†, ȼ"›8ïï#E¾B(˜DXÈ‹,WØ‘c 2@ÆuC¬GrÁÜ‹¡ðq‡;¸C纘Üq»&f×Ï ©$ò¥£¥E­TÑ€½Rëwé;Û‹mM{®Ü“¥ê©m.z°§Såš7úꎵ«?UaFn$ õ Âyxw êP½t¶½ÐOÛ]­uÔ]§Ñ—ý_úaGý¦$ó›u@þ¹Ð‘·ÿ„ÙZ¸*îŽ~ïÝÙó…ÚWçj÷Lö°¯:dÓ·Ú½¾Ñµî~Q‡:ÈsevX£~ÛÖÙSB4Ê éýi endstream endobj 12 0 obj 11604 endobj 13 0 obj << /Type /Page /Parent 176 0 R /Resources << /ColorSpace << /CS0 183 0 R /CS1 186 0 R >> /ExtGState << /GS0 196 0 R /GS1 195 0 R >> /Font << /TT0 184 0 R /TT1 188 0 R /T1_0 26 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 14 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 /StructParents 6 >> endobj 14 0 obj << /Filter /FlateDecode /Length 15 0 R >> stream H‰ŒWkÛºý¾¿‚åbWõ6pq}ä6[`ÛEj¤6AAK´­\ErIiͯïÌ¢¤µ4ÁJ²H ‡3gÎ.oUWmEѱß~[®ß’-ŸÅ®jDWµ [Þv(ö²d/Ëu{`_—wwíöÂÃØÏXÆ?å«E«È‚$fY›˜}ýý÷»‡û«åý?VhЦ‹æŠ³Š]-?Éx•÷mݪê»ìTU0U]-ÿ ìôÕÝúj¹^Œ³õö*ðƒ Ùº`øÄáÝ‘åþj•'dÖ>.'9ÏØúû•—2ú·XCk|´†6Œ5´{d¡„`i]^yâU²u¯©®Ùm)¾³ÔU#¯Ù¿Ñ ýxÅ;·ÇWŸ$Ñðµ4o‚ HÜ 9®øq”DvÖ¾ì~/›k&š’­UûÆîdóMî¤*¥¶î›';h‚Ç>·hKÖWž ÆÏ˜¹§ûÇ4aŸErð<¢P Ï&Vižøq˜Æ« &ù9“B»Á0òîÜ2QêQ+e‘¿JsZéÅ»mØc³­±×àåþÄ"ô ß<òÚ²¯á•dÛV±¿ËžŸÜ{|þÀŽB³R¾Jo€Jl7ÜO=¡5ÚÓøÓ n°øÕÛ"ñ~Âb4¶Ãœ½ÇY’-¾®ÿf67 -J 7Üç€ ïñ*üxÅ^(¨tUѺà$þÂç–ЬÝ2k=ë0½< %)éOøLBŸê!PYŸoŸÑ+ÝnñSœïãoü[ï‡ehCø™nÝcmBzGïJœ«da‚á6f³–E)e-·ô€[j) ‡p›8ⳋSRK¡Š={•ŠbÞ6¸[·LËd1#óW|(±ó ÓZ‹¼9`æ uµQ°¬¤ èìSVG÷)-7C}a^¬aÚEdó9Æ8ÞƒcÁ‹ø*ÿ ¦°ÞŽžÌ0zo6M £GÙt”’ÈåB€hœ`ÍH˜1&0š%ÐMwJñÞöïr’»ŠÎ$PtêöçÇÛwÕ2«‹ â|ê®fgà%Û©¶?øÆÓŠ/UüÔÿGÅó/ç¦â×{ ¸_Ü@6á®ÁS%jÖ7Õ{(s)º…ø74ÕVI·Ý$P±u ÀÐkC¯Iòt@Õ¡…d ¹4i4¤¢Y€ôVli§Aó&ŒülÏ3!íDÞ3pŽOn3ØA-•˜ÆQÖn^+¸·½fx§ÂĪwASÜOIŠÑè­TLÑ IDQ!ë=ÎÜV̰šXlØAI·äXl¹ÝQ§¸£õ_`,ö 4×Uì`}­”54]%KŸ±?ªÏ"¦O“Ħf?Œ“dˆî¾^é Ä¡gÜmªÂ…ƒTP ôR4ð¿ØcMnºŽ˜™Òµögœš&A@î>mÆo,»9]0]ý”Ú`c[u¬jXåz\*–J©ùò܇M­ýˆm=î+ˆ4né½ó¨j„#Ðwë6‡Öokl†—8F¿ãü¶ùÔ7 FWÁÈnŒ¤#…ÅÄ£Í2èRz3°òœöVJæ$)ìWS%C´IŸkä.Âæ6jQ'EÓä]_CØ ÁÝKd‘×Pbñ ÏYЗJ–«Ë5ÿÏ:ŠšÍý4ˆsS©Þ—0MPÇ1&br ð“4·‡=:<ƒ†@.F’- P `.LÝF§ãl<5ÒS¼¶UI¬€"(±ãur;åf8>Rp¢“ùéñ¼¨$Ùæüˆô"A‰­š“ Ì3r*”£42$7lÁ×>¶Gù*Õ5m㉠õñDGŽœ™Zä&¹Õ?ù‰÷!5*…Ñ€àx{æØjÇh6wfC«ò< W5zˆò¯ÝÔ’VШèX•<ÁS(|èݽuP ¨ìÎt~:%™ÎO–güË‘×R¢¼?ñz·ÕY>VumÄ—œwøiÏ`Ř6ó m_ ‡dF|$‡I &Ü_­rC摇±Ÿ±~eqž!1x cìI~o*÷íá} „óéÒéE^âŸÑE^¢µÃ؉G†“@éIìüï²Yr‚ð«ptª².°ù½æ’Ê%§äøóâ …(dï–óôéiI ÀÎÁ[àÅb¤™éþÎP%´B†ØRk•©Z7æiâf¹cøë]Jà¼1`¾8Ê…|~uís¡àÀ›íWÒ‹Gº½X‘PvÛ³ÞÙI3ˆ,MD—”·X¤äç!CWÝ6²šY©¹‹\ø`óO€MãQ endstream endobj 15 0 obj 3428 endobj 16 0 obj << /Type /Page /Parent 176 0 R /Resources << /ColorSpace << /CS2 183 0 R /CS3 186 0 R >> /ExtGState << /GS2 196 0 R /GS3 195 0 R >> /Font << /TT5 188 0 R /TT6 184 0 R /TT7 24 0 R /TT8 23 0 R /TT9 25 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 17 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 /StructParents 7 >> endobj 17 0 obj << /Filter /FlateDecode /Length 18 0 R >> stream H‰¬WÛn[Ç}çWÌc ´£¹_€ @¬… 8p+}0üÀÈ´Ä€"‰›¿ïÚ3¼Ìòð€b$V–ÖÙ³fϾÞüô²Y|›ÝoÄ?ÜLÿ|ž‹›O³‡Åj¶Y¬Wâæ§Ífvÿ8ÿ*>ßL×ÏâËÍ»wëÿ‰Ï&Eé£I"j%ƒÎF¸hdLÆ‹h '¾üøã»Ÿo'7·wFÜ¿ Uþˆ×ûÕD‹…˜Üü{¾ÄÌo×ËõËâi¾yYÜ‹—Åäæøàáuòn:¹™N½Ðbúm¢¤Rʈ齠Ÿ,°ï"Éœ“/f·?6ª¬´IG1}šüåÃj3xÁY«ñËüû_§¿MŽ?µ^Iç=ÿRÜΞg¿.–‹Íbþ*«Í6Ÿ>|zOF .Ôáæ[u*V缑VùØQþ‰‚,¾ŸNÞ„Ë>Ñ[|¼ýð3>®^¬ÎhŽÓywœtžAédËy»Ÿµq2мt&¸rÚs’k!.)Íé‹aº—ÚiÃ鯳åà.H“|ºÔ¾ËR¹9ýa5¬?„Ÿõüƒùj3øA¤ú ‹×ùó ±2ô•¡’qÝ1Ãt'½±Ódt„“\÷fÒ‘i&ØÎIRˆéã\ØÄó—×Aã5¤õÞò¯‘óëoâaè#‹Ð…@wá…¬2¨.|u«³´!w÷ÿuŽøvª»þ½Bk“ ÉuW~]‹ÿ¾"¿Ý¢´¥Ø_úq˜eÖ!^zé„ c—¯Ãt„Tì<*fÏÏ/kê¿ ÜfèSç”ôÙÚ …9‡2å]wíA/9d¸Ö¾W6LÇ[Xo.ãµ´9¸ ½„R.MvþR1>ʤ]'fµ¾lÄ£!\OØ/Õ9Puþ{éz¤{Î tœœº;Ìᓱң“±ý¥çëyxÆíp´Ä|Á¿“½SŸì¥m>‰ R!E〲‡gÝÙÿ°Z.Vó»Ç&¥ÝIf{Òïê!á2* ™qˆCThØâe>ùXÕ‰èön7ÝÝþ2)¿&Iâ# ßðï?Åç/J|Ì"ÂT¹Î>¡úk8û°îýÀ9Wn çèîÇþ9Üýø-ölÖ ø3X´®åì=‡6Ä„ôÀÙ#‡w7@¢n8{dÏ9“4é¸l?³³•ÆJ•÷)ƒi.%Ñþ·Ä7†Õ„ø6kfǪFKcêŘ |*‹÷š0,P2cJ´Wiê¦XÜEHV#š·gDaf- ]ç¨NDa⊉^rÇ¥õYQ1mPö0.]%ª“@¢°[(]4*ÊpQ˜T›Ì€(WE¥+Eq åŒ,©‚™iTS7d¬“‡,ï‘,&\æ\IJ(kˆrÍǃ ìÁOAÒÜ MW†y'De¶Èx˜óéá©[Q ¡Qù«Dq åñûLˆ» ¢øÐa"êPÿÊ{„(t{•¨N‰B¬êÄˈX;/ŠÏÖ`Q2íó]DÅ+Eq $*Ð6¡0**qQNºÄ<¥èùð×=_'DeZ]€ ˜(^ϱìx£[O%:Õ_é).¢šžÅE„˜§ ¯ç«!¥-Dékcª“@¢P¯rEFcÊðzŽVç”îc ‘¦®{¾N‰²eür¡0ö|†×s‡N˜(‹¨|¥§¸ådŒ@0ùQOñ‚ŽBlR[¦âѯPd¯ÑÄ&¬¬(?.i|2"‰×s !V”.’’¿N@Š2Êh:#uÓðbN韎yƒë1P)u °HÄE¼’ã¡”Ím} ôn@¯“Ä$ ®CGÂíÂn)»Èû°ZJ™$_™Ù9@ ‡"£.³DH@Æž—ÐHÐ~5YÂÈR&É;:àä·œIß™cER™T{„8h2å+ôŒP9'(ô#ô•ˆá¨r:„8Ê+’¶ŽüŸójç™ä¸ùýŠý£~±€ À' dÀ¸À±6°,'þû.’;;MÎh{ìäp_m ‹ý*’ÌÉrJë{>aN‘­*èñÃ+ŽE˜£\7ðÌ^q,œ;ÇHÜJŠÀÀÙPV@Z30çÕH-y‹PFtôU`FAf$Ae¤u3øÚ•£¿sXUä':‚¼’ç QNE„k}Q&€˜Y·Ç]®ùó„(Uq‹Ü¥ç QN—6ûÕÒ: ÉŠÛl~y¢äåÔ‘0„׌àå i×13½ãÌs ޝ¦½qs0›FŽœÄ–Ÿ'D9I2„ÅñâÌf¨€RÆãÐòˆrÅE´¼˜®ž'D9¹éWº.0¯·dÀ•_RPž¡UC+ðbL€2¸)’MÛcLpæÚ‡DJqˆr:Æ X"ÎåE™€ƒÁß„8&ÊŽ0]9ºlFôNxäàáÅ×>qväf”¾TàýÜbâ²×iâìˆrrÕ¯ÂØãÌsà’½ RH998Ôó6Rž8;bãp½~žp0’õ@‚TÍÇ!‡F—"ø6ÄP¾S¥cäû$–^b}ˆm±Nzaëð{~ñгág½ý¸-ð?f”çŒR¨0KÃè‚Ë•óq—Ñ(V÷ŒÐ]ödžœÅ!^ZJE*+åòQyl)çGâÿ¬ìtX¹mèiË5Ó'et™µ‰r¡ e«åå¥Á.ÓJ¹~Tè‡+÷‹5;VnÛ@=g$/×ܬ2^‡rù lu ŒG›uûGX w+<¶^Ê[˜"ì'²pga+úèðØÊ‘Iª+áa„l¬æcŰ úÃ;V2ÜÚk V¹á•OÊÜõ@¹`åÊVʄ߆"mõ¦(化$¤C™;Q.kv:¬ŒK‚Ù‘±\s²ÊIGšc·kåzñ¦œ+W#híVoЬƒež<Ìšï6jÇÕš­+¡åš­ƒe´A)Îkî$ÊéjÍVÊî› }¹fë`(ÕÙ*Ç,ÊåâQ9VŽ8yF²|þYÙ:lº„x:gÂÒ/”­+³É*R–k¶†Z=ªQÎ|·Ñ«^­Ùê°rÙZS¤.×l-Œç>?ç>Dxd: [îØ"öü²ÑÊ;ÉZŸ«yS÷îÒ.„­ ¼~E–>R­ƒñ#êÂtµb+a.Ò™t;2~¶†Í y̹ò^ÃÇYÙé°r–½áþ*Ô•²50Bin“2Z«&ÊíbÍNG•ûP$/×l %1³2üâjÍV‡•᱑Þ=ågek`¨1ÊØ¶NôñjÍV‡•¹tq¹Æ&-×l Œp‰©Ïk¦,Ê—çlu ÜRddÜ8çê•k¾R¾:g§£Ê5*²>gk`„É+å,‹»PžuX¹àtÐUtn…ÂÖ¿`Ã$6ü^r‰"ÜÇ…°‘Q]Ì”ºÐ^wÐY·Èž^èN2ªÛ£í³l³æUÑDÆ6ßjöô´ýjŸg¨tP”Žqõ}³í¯JY¶ý›/R,Jçê¯ ‹0‡Ä^Kç ¡‹('‘"Ü->Oȯ_pM°±(ø¥Fž=¢ø ô*oÎŒ('7EFÞ93ÂlakÑÌ´&(gO!K=|z@¸0páâΘ0bÜjùˆ)QNŒTq­ç ¹ËáZÛÑÖ¢~b}ž™Så®>OÈÌá–Èr'¡¡À|FhiZfñÈÌá.ÝPPF®  »ÚƒL3`Õ½¢yL[ Ä"3w.tÃQ4÷Ã#áEÕÀà‘™ƒÈ… Gæ4,HçD‹p,2s2Šl8ŠL˜cé&Î ›ÀiàFJ¿ç‘™±RËQ„9ðd4ûʱÈÌ)øÚr±œ]Ë"àP–!ŠPjyçž'dæàýwËQÄrBñœ gj”QÒE5ÙC‡X^ã02sx5–£8•G49ÀÚåH-`Tƒf ø£K¢^ß‹(gDEv!‹XN)žÃ8¼K™Õq›¤ xdæ`Ð8±qRðq’ž9xtB|ãJWŽEf&9ÇQT ķ)iαœ˜<'ê]Ff#2‚Ö¶ˆ­8dæ Ê%ËQ°#¦VJyKQöÇ!3'ÁõŠá(bãäìãdñåP–š¥ÁNÍæ‘™ƒB5,G‘»qêÖ¸a€‹D©Ö±œDž“Èsþ0ªTànˆvaœOjóÁ±8‰@(zC(¸`|»àä¾aÊœÃ8ÄrZóF®â|jíöñðw¬‹£x´“[‰í*r ^}ÝEJ¨—-´›rf&, ñPÌ(àÜ“[EŸa©ÞTÌVc]~ b¬<ì9A‚p÷„ëž KFÃQ0qWYY‘Û™]ÑÅŸ÷[÷IÑŽ~-f²÷¦fLEå_a /ŰÁEó¿o_ÿb¾b{)ñ˜RÞÈçDêÇD`ÉØeqže"N–iºArX%Ò>%‚¤6I¤Ó:+‹Dx”EJŒ”Õ ØúÇD ,îÚɱLÄÉr"mA_O­«Dì䈧^ÐîL‰M$­ïˆ“E"x¡YϪ­®H·£d(åå%1OÁG]oˆUå4:?5ÜÕ~ôhòÀ³õð…Reö»™‡•åD†ŒŒ÷I6‘¶Å9¸- :ØõUu²H„’ø #uuU»1Êß*!‰4 —’HZåDpßb¤/w¤ØD’tÖÓÑÔ(‰ÐÚEœ,'R·ÑA°r‘n}5i§ z4­­±²œÈ€±+’Ë*ë«ýxŠóŽt’ÊÖ×É"‘Š76Ahùz­¯¢È6‘˜ß%n‘ˆ“åD¸ø)Ò——Õú*JK ñtGèNÉs²œHƃf$¯K^·¾ŠžiT“Hn’È’çd9¾[Š,KÞ°Æ sL}¶‘ÎwµÞñw§ÊytÙHF–?¬±ò07DɃÖoÆ©rC¾ÃÀ°ÅÕ›ÖWùµöÿ3«Š<…͇‘°º©ÃÚ*N"ä1›HåƒÁD>t‘ˆ“åDpU ²´Õam•P½Û”÷þHéÅu"VVéÿe½ÚvÛHŽè»¾b“Àž¾T_ã YäÁ†Õ>²v$1‘D‚”l(_ŸSݼt5§9##`ÍÓuªë^±nNYVѵ”:)¥úŽÒBóŠHZV„›1'<=§ˆ,«„€Bi2Ç]eNI E&h“Oô¬EB­ˆ3?©HE›q*Ÿ(;§ˆ,«àQÎXŒ(†óŠ”´¬ò'štâçQƒ¬«è”ºÅÑ$V%MÈÌk"y³&¼Z÷ ³š¨Z“H?¯IÉ›5 Ê,‹ž`„&˜%”/‡kÚbMJ^h1x’^jY]Vr¥MxzæÍi^“Š7k±È)3¯‰,¯h^*þ¼&%oÖ$š¬›Ÿ×„jM¬;'·>h¢çËZÅËšØ4IðI˜+kj–gÎH¥M*=Æêù9§‰äeM(=Ädd˜SÄ׊¢3ç,SDÐf=xWäÔ»=B­‡'*'Õ\¤GAût…HAÁÅè tÖ²¼Â¨.Õjé—ZÉe=*Ú¬z:°*ÎŒ$J µž~^‚6ëa<`Œ³‡RµÁÛ2ex¯!.Ñ£ e=P˜)ée]RÍË%6ßåïq.´Ô¡&CpþÜŽšõ—²3—‹éû\Z+YtÁ¦â‰ óÜG€­È&!dJõ.äïûä…¬ê4ÃÂÀ@åL]åh€Î …K¶ÙLV²ÈÖ„1í}mœ²Š—£P>/YAœ–0ø‘UHAi?«€ÐØ­OW Äwù{Ú¬ªƒŒ0NJ8}çß‘¦Á•ÄD­d—É06¤B†<ç*„s e`I‰3f„8í*„vA}þŽß- „³é{ª×ÕDÄ °T‚ÇÃLRjHö”‘_*JÄA‹ò;~'ÓG­ -äDÄ °TBÀÃTáSy Ù§ò‡¢ ñ}ÉïhN¼§uU,EˆƒE,ƒ ‹<(.÷µê€¨>$dˆ‰ÈzÈ ØlÑyP"\OÀßù÷ˆ§¹B yP"ö!Háfg w¬ÿ¨K\.ŠŽ¤#:&_,=‡j,eƒ,"ây[40ˆÒxƒ%œõÄ·9•)_Ò_¸È·o7M>vˆ°àðT°è}Qòa¯òSï §_É'¡.<8Gˆ¸á.¼ˆPŒ|†ÇÆb‡m¼PÈ/¡¾HxtáEBŒ/d‹$ =7óB)_j7Gh—º8I˜ÚæûéátМ¢//Ý´Xh –RïiΤBþ{ ýEÂÉ 9#ÔXUãB‹Ê:Q2£q¡ÿNºx‰TþÌgt¾÷C\fN#ªŒÅR¢'Ö„ŠOÈ—„³4j¡°§ÿ^B}‘0ö6ÎbVv)¡‘„IϼPÊ/¡½Hè¦Râœ0àCX4¢ÊX…ˆÓë@8ôSEM(äKÂùºe„¤B>­†SýBBQe¬ƒ:îŸVJù„ˆ€eÔ¥eçT R%¸õÆ>Ä‘/4âÁGLL ùD%²f轋'B¤¹šPÊo~=ÑØ¢}º¾úåúÚwª»¾»B[Š1tþöŠ}ЯvX)JåõÓÕŸ†?_ÿû JñÄ}ÛM\Ãì }ÃF8 3ßRþñÍ xÒP°ø‚^rlolÐé‚Yrvñ~ä vÁ§L?¨`ÓZr1g9aù‚;\Hæ¢iséÁ÷fàE‘Ã'ÏöšæÑÇ&’à–ZeǤ†&áš1›¯WTÝà ‡K™C†Ÿ¥Ó³>òÇvý1õBÞSÓrglŸýõ¹õÂÀY®%xÜínîÇn·úïØ­ž»O å½êCÚDË»o-p蕬¿4Àõ[E_iÕÃtÆUOØaPl±d;Å;Þûx¥üæ §E8í%\?lׯ÷›×¶Áço›$òï׊Š=tÕñ_·»}¾R½µÝîÊ(„*w]ò½ÃQzƒÖºwØJQb>ýå¼zšûœäå*R„„³§pü€7øtcÿÑ œZëxÒR½ :çü¯üž 0¢Øî-%øK  ™[m þ½¶ØØ Ü= 8Ž‚Jë§ÛÚÅÞ‰Þ4ÀÞ¢V’—à·}¾ù“qý)ßThWaÈ žG‘¡6¯ ^4¬MA`ia=†H`×-7 -GpínoZ~€‡­–ß>´¼ 8q%x¤‚Û H ¡/ \ãœÚ÷1Vnïô3´ãè*ôÝÝ] O’ç1 Äß¾,HVsž¬û<ûío_ð:¸”óVT9® ¡7ˆÖ/vXJ5ÓÖþ¿Ò6ôÑaù!”ªàÉ\N[Ì,ƒ3ÜJ[ •‘«7ÓÖÁ(RÜN[ĉ3¡Òº™¶^c{EFt3m}¯Ðø%¸JÛdRŒwûª.2m\ƒåÓG|©|.ú÷-Àºhv½j}?ø@ü­_¤œ“à–µKÑë¸C¹žwš÷ž`ñ ýCËÒH)BQ¡³Å¡a}Ìaºh„¾[úí£Ô´s4<åñNŒØC®:ÿ|~™6‹F\`â# oħxŸÇÎ%ÀÍxÖ‘¶¯tiÆ3öSL`•ôÍÛ¼üÅrÄ{¯W¨ÂÐF£ÊÁ51Mü’†/ÂŒ/r¦äùhÚV9$œÊuÂD²§YrŒJ9è%øk ŒÁA‡ Áÿzj Q¯~¾@-4RÊó’+з›©BaÓó§^Î!¥rCV.5Ïëç´\U1…ºÓûÁ8 n>Þõd1£ðf½½y,£ªôüa¹Íî¦Sê)³O=Cûv˜ölé#Æ“žŸO½÷*[î«û¾³ýÞzî$m8TYUCï5]IìòCÏÀð›%žäKðõÈÜ|Zo߷ИUAÅízÓ¸ :ù€~&/lo^Æ]·¾ë^@ˆR3>BÆq‹ ãKiú¥0Ê ·¥Ô§ÍêqÜ~H2ýò;$æ“îu·z¾OÇÅâæù.âÝN–}ÁM¼Ü`DDŒ›L÷}ÜîVëçôŒûÇÕ·ÛIôÍs·Þ¼¬ž°ÏýÑmoòG×x¡óÇP‘¬__P¾ö/H1>¥h¼è&°[ èBB»i5îú®É4ˆH>ÄÞ±d)¨¯‚Éûàþ³2ŽGuëÐÇ›"PSKûhmü<VVÂ’ÈþúœVÕ)¼åØ3$ñ]N¦W¼1 øº çT@Ž ø¦ wγ¶€#Nš<öHžUÄŽªæ U]èš±A˜7%~lÃ#º Ö8oKGMG…ö ­©5ú(,¾}Û—…É+<&ÚúJÓš]ÁVî}kùÅ]YsÛVÇ!Úªç¾6ÁÞ A£®£¡ËМh>c·Úuß[wxЗÖçg1úÁ@² ’Y¿´$‡⣦غægRƒ»"éê ¥ZWvOç3©•sŸÏ¤Ï@¶úÁãüxÁi_6Å<ž×%p{±ßðá·[…ó,VØAECÂyÉÒÃ×m¿ïök^‡í brŸ¢Ðu>òìP@îÈxÖ¹‘¼^Ø$GÒüòšJI¯ùøtûB´r6}CBbÇ@ÁÖ`Xl9“Æ}㆘Éó¢³,A£˜[bÁ$--Eÿý„åÑO¾/^×›¸ãìÓÒC¬Ñ’ Œp¼SP"8åÃ-¤E$¥œ¿í{ÑmÖ¼¤!apÜ¡)šÍ–^8)‚!w`}‹Å#D¥É¾ðá©C0'Û³“© žW¤~1ÂM‚­ËÝZQ¬²KÝ9ìªHg‡UçΕ]Eg‡ÿº×z…qÍ‚ÔÁpZ´u!±cïKm5 ïg»Êw•)ÑŸî*\N9“¦°%j“ÞÒ‚y8kÉ4ÌIÔ‰„󣤓ÎFKâËpŒ_Äz_ÌSßobϦ1ùL.$^wë2`¼[‹è“Aë4þ˜˜eþÐÞÊ æ˜R¾ç5)–H9’ôó3 …š½¯6M”ÆÑ§á †($z_þë6N'ál7mywU(t¾{+>èOÉ-};Y·Ð'd)i?+ ,V˜7ÆúùâSFñž€ôÀëp ÇX£‡w» :Ber[Þ:`ŒÔß`gcŠf"sÚíù@yák9ÀçÃ}wœÂ‡ÇÂr¤Gâa7ð*Ó(s&'ð¢±ð„ÎY“gàÃ6­"á,„  Ñ$œ—ìE4:eµ”lÎ Ûivd"ÅðØHŃUá û`1W´3;<(œcè]WÝVܵHG'rN /aM6)þ¼^ú{q× D(“hq‡g~Þl‚½I‹Ûe1 –~ß«?5Šrpª:’úÔ‰ çaäéàó–vvûÈŸ•c¼ ù܈?&,$$,c©¼N”~2x( ~ªŽ û”µ•¾xÃéNÃö´Á›¾˜NS§ðå`LOà…'z¦4 v í – 6‘‚šÄlÔ¡×ä»ð12[zåÕÓ–'6,»ËëÌSþ{€)è^:>-xt«Ÿy{uSÆ0;r OÎ+ÕÍ7¿ã?m'[Ý[ [qÓoùI×P¢Úø:g,l$m¨ÃY·UàîµI …nbrgH¤Õ_Ö†W‘TÄZW‹µá] A—„ËÛ“Ëë‹“³ñõëÙõÅÕw@܈oßο_œœßžœÝÞzñ|8yÔ•ÐZŸŽ8þÆÏç¤Â²/_Bˆ‹a»Ú€°†íÈe«£Â¯£þIàa·–.h,f;[T~‹LÎ$ãqhŒn ÄH•Á€‹þú:|xhˆ¼deP:×¼ÈÃŽ r¤ ïÅßzž´‘.ŽU ël Ö³"ºº¹ظÿîWü)¡P&§ð* ˆ iüȇ£±š~¯&yùáã¼ðÉeÑ’¯ÑP1%6’‡¸ïE^çgÝGH RWcl ØÖÅbÕâ TJ«ìÞ³!Ko2Á*Ï™ f4*,ýz 0¼šItÛ{ôgÛÐ0Çø¬âÂAjO[Ä+¿£·¨XQl#Ò"~¯8§¥v–Âtä‡ÓðH†d€1JÆéœ•Å ·yÖ&mŽ;–õ(Ú:¨Pˆ…:~ó¶_¯ºMƒÛ‚DCr¶g§JcÀÕáèŒÉ Eñ¼œŒTΑðQ¼®÷,wŽ[°ÊYó^N;¼>i«h|S°uB/ÆŽwhåÕm gðöÏh¶HKzØôðÄ Íh_×w||’)Zòl›þ]´Ãý@£òM‚ðæC™;¾VE–iïxö5REª|vÿûAt›Íð*žûÝðcOt R(”U]OͪýK·9tûŸ²¥šÂϼ `…Œa}_ýwCé$éTáÔyÎSC-À|Dåh?²VƉæá½àÍM,yšÐšÂäB®ÃDZ{ìOŸ»‘gyVEçW‰pª¼Òw â`uÁà°Lá‡y8zâõóð]·kú •Èkï„ÇË’ìµ²O=Ÿ… Laz"“È¥·]Ãe™£‹ › §…îIø Žr¢§ÕÃ_˸±!9¯Ý®ç‘a±g‚ò¬Å´X4˜ Ò¤76<ÁÒïN„…>w! ìFN ?<2‹ ‡%¦\$“Ó³õ;í¥K™\Wì[1l¥€qxýÅqþÇÁr}Âqð‘1yÓv¶ÚB¿¦:x¸?ðKÝC‡ë2…óŒ~lH ºŠ¡Nxê^zq×÷[qß¿ô<£@:•3©ï¹o 0x¯kI ]û:¼ñy~3i¦ª|x(ÕÏüçṬM¤]BŸ6ˆ:EëÉ#Þ£G%ãìö6 ¬Ã‡#|Ì9V% !‘Ë=µ1¾~}ÉèŸ@tì猒ÁRÙÄ¿K³íÊ>(îžÿ§2š÷Ê"û9eQ„R]µkPqÒ› ‹§bÐ’ÖÅ7T@„`â๊6:Mç…ψRdÜ{qÍû%/SÒäæ7-»ä<‰¾:5?ñô]o•–U"š¬¤0>!êé;ÿËõåuÓÌ`gè:g½ÝC4v«~ü":˜‰~³)¿Ø ë—_‹k*ʾåXS¶Åô§TŸq\fÝ[¥0VOå€?_¯@cq`·þøÅÈ¡ó³ ­Ëë\ÄB>òßn®¾ˆß~g_JÇP>Ÿê´‹–Ð A×Ñ8¡<Ô_q–œ*¾¼=¹¼¾89»_¿ž]_\}£;ñíÛù÷‹“óÛÙ$/ô®¨£å}-´¹²0<“=üqnYY«î™¿¼Š©ÊéXé§1x>ƒ»æáëÍzÿ?ÆË%·¢W™$?Íß6FÞ H. È#Ù0$%¾~ŠŠOÓ)Fûâ ÙlV¿zÁàáY¯‚þ W#yF̵šr“÷mGAšßJ$U©'Nº¡Ö‰ÓŸ—aB—ïý<&^ôVïæ`8i²®«ýuzáû)ÖÔôí^ùå"úvñÖø¼€JwS3(éºyÜ|GØ$íÚä¾k ©¶kÓ?z¥ç¸«Ûíü“««I~Jnxn@, ±o!®.&Ñ7ð°Ý LjCªìjJåhèœq•|¿ŸwWN‚‚¾KÍmÖ‹v[ÚF’­‰]Þ]÷mÈçþ3q\ʦÀn9ëøÊÇ Ýìvµà¯ÚEé÷rFÛG¥¨Qá´š&ˆf9wßæ;/ÙH¬ÕcÚ<ñÁkõò{0¬3øîû¾𸂰·V¸ÍвÞZÍ‘­9¯D§ 3?}¢µÙ—BÒßcû#̺X}Ø[¼á~[IàgÝhÈB—çãëÂÑÚ µÛ7¤¨ûy:ÑŽ ©u\·­-m¹€õ¡»6ÀÆÄy¾“~Ô©HÒ]w:ž97ûw z?tÚ‹/`KÑê…¼A³8}ÉÓùH‹)0æ­>,43:¢³^HIÑHWù±‹¶Ü÷ÁÞáÕWñFÆ6 ÷”Ô¿´°> /ExtGState << /GS0 196 0 R /GS1 195 0 R >> /Font << /TT0 184 0 R /TT1 188 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 21 0 R /MediaBox [ 0 0 595 842 ] /CropBox [ 0 0 595 842 ] /Rotate 0 /StructParents 8 /Annots 20 0 R >> endobj 20 0 obj [ 35 0 R 37 0 R 39 0 R 41 0 R ] endobj 21 0 obj << /Filter /FlateDecode /Length 22 0 R >> stream H‰”WmoÛ8þž_Áò!¦Eê=X,8¾ÂÁºë«½ÝÚ~`dZV+‹†$Ç›ýõ7CR²’Xé]‹XI gæ™yf8¹­š|+Ò†üòËdý|d²Y^Š&W%™Ü6HwrC¾LÖê@¾MîîÔßä ã>HÄ\²„/ñ¨ç>‰8‡Ÿ|ûõ×»ûéÕdºrIZWÿ'uZ^1’“«É'YÀOrª Uå{ÙTyJªüjò>Èê«»õÕd½v #ëí•K]—s²N ŽÌHL“$´X;lUMb‘õþʉ‰þ7ZGiì, ei(÷D8u9HZo®œ{ñ$ÉúX•²º&·±'¿y)¯É_(†qê',°{8åÒ ðÚ¯¥™q]7èNˆñ—ú^àÙ]»£ Ó,¯‰(7d]©gr'Ëï2“ÕFÖVÝÖx-E0Ÿ2+@›4[_Íàã%"·˜ÎïaѸý÷\ßhÃÜ8Ñ¢`’Åžv_;6þ ã€ú<ôÑ_œýˆqGm$IEIJu""M•hdñLv {!I³“d+êFVdômýð½pœv/‹©±Qþ‹ƒj¢¶$=6M^fDn2IF¡SÊæ¤ª8܉js•¤dRœN¶çz(qÜŠ3Ê|/2‚çe3òîdU#|{†?ÒN×8¨µ5’kˆkœQ£1wÈF¶Û*°ÛsPB‰+’àp;3‡è-ªX*‚(½5#©ªªãAKÙO4¥VÝGøZØCžd¡7 ac Rb¼z‘q×—€q÷`\º );|" Ÿ ™™Ÿ#¾ê-9O1}»R?@z%ä–<¶ÛÆ=ªdÚß. ¢÷ê™9N…~=ÕÀkŒ2™6é%pçô‚Àf€Àœõ¿ÀˆÔøBÿKt[ªý„#UÖd4LYwâ‹<ÿ¨pãŽlp 5î}f|­×q¯$µ8û¼Ýhf®Éi§Ï…¥Sá7€cŠ€¨Zãò< úذ–~bLìÏbb\G4©Á¦î@ÒóCż7•Øné,–æ3=~FMŇú§È_BX£ŽÞ¦%1§C{&À! ÀEÞ<ãk£ZœôwÝ›>^ÇMÑäæTÙÇ–Âü$¹„[äÕø”×Rc…a ¬ŸK\ExN…? ô$ÆÝ?rc‚öžòFoËËnê£l–óåÌ.…>Ï9‘­~VDt!ê!t> ¬'µjðYiÏu|ƒã^Œ㎦½ 6vÉf9û5—Z`ô$/|j{ô@Óǽekö‚­{ÕÉ ÏœÏ°¸ž6CCÓAÒ$ôCÓ·é çQ ø“îe‰0\>”•fÙÇ÷ãèýà¢0ŽÍÙkM5†ï¡RßM^’nn{,7@†:Ÿz zÿûŒ,`n>…¹D2ÐïATM—§#——Y]©c¶ë˸= ›Û¸}Óǵ-ðIt&Ÿ…€b¥ÃR+…øX¥¹,S€rY©¬z ¸„Üꑬ{dæ·òS@#ʶí7ñ¨*MBªÂ‚ƒ‰j̨Éë5ë8I¤Y@šÚô -sº^`Š=íE±ÛªªïŒ?芒ûW>äÖ‡PkgÐÐdƒÅ\YáªQü¡éøIK«êsù„½ˆaE¦šlq²办µæAµÚÛböŽ#ß Æ³2Ç|0¼ÁDˆPäPøQ.Â^Z½Or++æåÞÈ |¾×Oút|<à&صÅY Ü’“|<@/pCÈ®i7“ÉétÒûJ³AU•M†ìsÒïšÞä]%}h`ýÈ*‰ŽÖ Î/«·µÍ ”gÓU6´,DYQÐ{²4¹\O´É€SÃÁ†3êxõ}÷zŒF<æ=»V€‹®­Ó.æ,}kCx#kJAÅ^Ö…x¤™z:cå™ šcÉ‘ÇÜ×Ψ¸ÖÌᑳ*eQ\“ÿÐk²Èú^AMëÿáX7b[+¸ <гU¼=Íc¶}¶Lã€'¬ 7ÐÇ}lûåöÒwjjâpÀðF¥ª sÈàƒ„Ÿ²évw— Ð\‚f<j½¦™ÐÒÌàWÐCWÙEfO¢8ŠFU@qóÛÕzv²¡ùÇûâ™ÀÚn)Ë–~äy-[ª¸w4Žœ©*mÖêW¸o¢¬¢È3Ôs!JÀO–Ø…Ã º¬ ]]ž×j®@ÍœÃcVÏÀežƒoMÉWçáXJÂ’$ü:ÊÄx0[HáwÊŽ—¸àÅÀ^ ŒhP¢½PÞ[àÍíï/zCZˆÆ÷gü£î°°uŸß…v‡ãB7–r¼þ~÷aËÝw_àÆ‚w-‹§>Šœßòòø7yžÏc}s…„¤Ì{íÜiq¬±D@©Ðõn‰eŠšJ¥ÜÀ9µ-;x=œÏf³s”hô{ȃga¨ÏT!æ‡#^ {õÅíÈ÷ÛÑP·jÎWg%€ô#Èà°0fq4f‰?ëÉÏr„¼—ëHÉ^Pã±[öZƒÍ‹åª+@ ÷XHÚñ¶:Àý³ëÝŸpèe¸›€1{¡ƒÓcÉ}ZSQšÿö‡|rÙ Œ]:ýíqÐkÈÝWÇ ¸– 7™–rx¼W´o}Œ^n}o}×Y@”`¤ÍÉ¿±x«Ž, ‚nùo¹ ÝYÁB­.htðÇídŽ ä…ŽÏ­€€\éÖf zcÿ^F0L< Øæ ‚ýM·åQöiÕY¡¬¦jQ‹¬¹ïÁ]6ªò&þ×rЕ¡cÀ{ÿˆgßò8"ˆŒoã6n—Ÿ½ŠûNÈ^ì¥.œ—À%…„ýótŒv„uî¡ ¯-s&†åaOUeƒøð´ â‹ Ô… †œ;_ª3äÓÁÖ¼­±eö¢ôžŸ¹1ãçD×7r>ȼnLp'³£,òÒ¼AÝ«2U%ô˃™{ÈE™]¿¹0Ÿ™›Z©¶ùû  ÷üqM>a½é¼ÍÚ=n4¹ý JÒJwùbM>cYú¼¸9÷¯(qÌØ8 û%ÁYŠJ…,Èç¼jŽ ‘îòRR¢ùp¾†RëÔŽnÂÂN‹Ÿ9ž'p5ð0ºt×îb#æGÎzúa±úp¹«„&¡ ‡²8çp/6cŒ›681o¸»“Jë ܸD­¶Í¤I³}ÙÝ5ûbÈÄÁ6ãu{ÏÄ8¤qÀ[™5ñö1láÙº¤ß9ÇÞÙºƒÉ·KŠjŸæCÍ3®¨ÿpQHÁÓ‰µŠ[« šþ—òjëM†Â…ÇT"¦±[ß:èV¶®ªÆºNbÒB éB‚’À´¿s| N–ö€0|9þÎw™Þ_ÄM´WNûôÓn⼵≛4#ñ°ÍH]U…W¼ %z©¶2øaûìC´D¥U{7tÏBÇó m]]dL]ˆë‡²ØïÇ‚?ÇŒfEUGʶ.~]¹Ö8ôÃëftŸn¶¶a)_=e­²Ä𔬉}r¸´æÂòeÒíçµBmO¢¯Ý1ÝEî32¿¸@Õ›ÿ(Ú2mçèÊ»¶(ýay(Ãg,¨ ÀŽU1ÃB; ÁÐeöê¶y™°{î2Øs~­´ÜáMÇü|Hë䲞¹PÏÑs‚lz­5MÏÙÑ A«8#Ñ.©²h%ºòÎ[×ÕDíp¨y.Õt?$`²‚öž† >,êNN=WpxT„‡qh¬Þ zSÙ:П4|Y&Zå ô¸Û$JÊY¨tçÄÌKë þÌ,Ùk8Êq®Gâ Õ/b¨Š+Çâ ²"¾mÄÌŒâ™ÀzGˆº2ù}q}•üšV}HWeTþµÁrC—Êøˆà é|¾êÿ1v‚á+ÐÞeiÝ?MÁ#AY’c‘Èè9O0QZã’ò”ó ,S‘15KŸmëùLcò\®¢<²§Ûh·ÒM޾úã!Oc6õÇA;B툣MuÎåD'dÄçÐ82©çw!³nðÈŽ ¸oQ.5`ú.&Àt‚ŒfVåÁpzpSªžS ‡||esKTö…àPÜÊEܼ€ [DÎÜÜoãMCéá°þ5lȼ÷šêh~;šß.¾ÞÍF*Zuý¦Ã¥ß\Z:tÁ ¦Eþš” ˆ ¢¯qX–øê2]A¦Z#+.o fz`(=Q¸÷ ¶ èîÊÓh·*Ó5ÌçÊoU2œñar u]!Ê‹£”n{gpÆ·±¿ð6ì /Ô°ŽG‰ç37Ÿ`0Ï_Ó<}‡%éõˆøËTüzf]GâAQn&mù0ö;èúØÉ`"<&¶ªÇb¯`=ÂB—«H—ƒî90ó‰ãûakëó·ÛŽ]T̋ߨBqªqæ˜Ø¥ºo¬ŠÛ´°+ð! IÖ‡É^‹ø=J3Q&1î=ƒôá¹Ümo˼ð¿ øžÆv endstream endobj 22 0 obj 3397 endobj 23 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 122 /Widths [ 278 0 0 0 0 0 0 0 0 0 0 584 0 333 0 0 0 556 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 722 722 0 667 0 778 722 278 0 0 611 833 722 0 667 0 722 667 611 722 667 0 0 0 0 0 0 0 0 556 0 556 611 556 611 556 333 611 611 278 278 0 278 889 611 611 611 0 389 556 333 611 0 0 556 556 500 ] /Encoding /WinAnsiEncoding /BaseFont /EJEINA+Arial,Bold /FontDescriptor 27 0 R >> endobj 24 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 121 /Widths [ 278 0 0 0 0 0 667 0 0 0 0 0 278 333 0 278 556 556 556 556 556 556 556 556 556 0 0 0 0 0 0 0 0 667 667 722 0 667 0 778 722 278 0 0 556 833 0 0 667 778 722 667 611 0 667 0 0 0 0 0 0 0 0 556 0 556 556 500 556 556 278 556 556 222 0 500 222 833 556 556 556 0 333 500 278 556 500 722 500 500 ] /Encoding /WinAnsiEncoding /BaseFont /EJEIPK+Arial /FontDescriptor 29 0 R >> endobj 25 0 obj << /Type /Font /Subtype /TrueType /FirstChar 99 /LastChar 117 /Widths [ 444 0 444 278 500 0 0 0 0 0 0 500 0 500 0 0 0 278 500 ] /Encoding /WinAnsiEncoding /BaseFont /EJEJOC+TimesNewRoman,Italic /FontDescriptor 31 0 R >> endobj 26 0 obj << /Type /Font /Subtype /Type1 /Encoding 33 0 R /BaseFont /Symbol /ToUnicode 34 0 R >> endobj 27 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 718 /Descent -211 /Flags 32 /FontBBox [ -628 -376 2034 1048 ] /FontName /EJEINA+Arial,Bold /ItalicAngle 0 /StemV 144 /XHeight 515 /FontFile2 28 0 R >> endobj 28 0 obj << /Filter /FlateDecode /Length 17630 /Length1 31708 >> stream H‰|U tWþö9ç¿7ò„ä&aþä’¹¡ÉxA$÷†ŒŠHTN®$𠤕V*3¡ãYÓj*(õèü!-E]:j¨fQ£ª•¥¥Ò1èÜö½Ô0kMÏY²Ï>ûìýíçÂkÈ–Ó-qÜ™ÜÃÀ¬ÌÍ,(u—Õ-{ÿ0=  ­ÓÊõïO¯8ÊwgkÒø²J«å÷¡€Ú &Í¿øÒÊi@bg áHq‘»ð¯«Çç±¾õü¦g13ZÔjÃçŽÅ¥åÓoÌþ’ϯ¡}&M)pãµ!@Á->;KÝÓËn¶bzVw–×'»K‹\»«û3ãéV6ej9ãæ5ã‚÷¾ì¥¢²uí*ÛÑ{IÚnDù¾ˆR±ˆÌ ?~žó‚÷Îû_\emí|×vlÅß©3éØA÷†»d£d@á[ü šñB1+©5:¢žE)–‰Ã"ZeN3¯ –¡ÚÜI•æf¾_Œq—|­½ÉòÏ¢WäE䙂 }‘MíàÆ)Þ·Ãr¬À>zżËVCQÉú’1Íæ}tÁ"µD;Ýâ},Ų˜f : U"ÎÁ?qCT˜Œ¶|ˆÚ“N±ñSÂ&f‹Ùòº²·cíËø3 ÎÈnìAÇæK4â"…R$ý’ÆÑRº!E¡8.WÉZyR‘z—ãmG'ŽQ96àÅ1'õ?MY4¦Ðè-j†¸&î(?5Wý šµXO£ç3Ó¼pDàÌDÇvv ŸâsÜÀMü‹B(‰Ši-ÔH×D #†‰2±RlÛd¦\*¨*UMTÇÔí7ÚB«Ûê¹ÿŽg¹g›§ÁÜi6pí³þX¤sDçpUlÀ~œ`í_à+œ÷ÖëïK£èy¶2•~K+h¢ºÊ^·cD_ád«SÄK§J±\¬`ëÇy&Έ¯Äwâ¶ÔdŒì)_”k¥!wÉÏä%¢bUW• †©QÊäÌ$jƒ´m“¶E;¨]·$[ -e–o­•Öy~G›»4í§Øcxvpíúq%ÍäH¬A5×}-çàGôSF܈[œ…Ц§woJ§!4”ž£1TD•´€–Ñ›´Šªé=ö€}VÆ'ŠáEbžX ^µ¼w‹OÄ)qZ41ò0i—q2AfÈQr´œÌ>”ËÙrGv©Ü,Ëò²üV6qÖÂTõ²š©þ¨6ªZÕ =£•ò®ÖökõZƒv_»o–K”¥›e‚e“å¼ÕbíiͲþÎzÒzÓ¯Œ¢¨ #×ñØ6îÁb³UÔÄŒö¤Ð’=ã<äpWÜÄéá¼{ï[[aSm¼/-)Êà÷å´=è*,BòTUØNgE£úHôÃç”O6µQNÖŽˆhlái´Dì{(µ"YŒ«%è"mÂE®÷éXAi*¶Põ¡W©Uà¤h'sh’Íj¡¨eÐu0ÌQ…x?¹¨7Oë+ž5*H½ÂóiVrF·â½‹{¤™×xºIžFnž2‹¸ÞçÃ;õÆrŸUp?Úx‚L²G-Yxâ÷²ôW3qÿÆm7WT*OÒËžµF}cö2ã¹Ã¸Ë°‰û®ƒ¸c.r•ÔñÙ{Ãîϳ$‘»: £PˆWyê-5 sµ9לaNÁßøí=rÐ=z›;b¿HÆaÞ‹ñ-ä>ôÓ~þ¿å)D=®R8u¢Dî‡&mš¶DÛ¬Õjû´c–Žö<¬âŠ>ÏÕìÏ Wq‡ü8768Ðñ&1ö\Ly²i2îÙÎ<ÇSz2•µTrôVs?×qo\ç91ûpš…±Glßõ á8ÿŠ¥ßá Î¥Ì)ä©Ýß±ßÁ”$ÊÙ^ kZÉS«ž1Å%޶éÃåà¹à¤‘¬ëžC![è‰,ªAºùOªL8åQŽwG A*ÅÐz~—ÏŒöè­}CO¦™$JdÿƘÌ›½"Ñ^d-Ùf´¥aèáɆ#%%e@ÿ~É}ûôNêÕ£û/žîÖ5Þ×å矊íÔÑ­ÿ¬Cû¨È[xX»¶¡mZ· iàßÂÏjÑ”‡Ëžž¯±ù†Šµï=ÛÝÌp?ÆÈ7tf¥?)cèù>1ýIÉ–ÿ?’)$SIRˆžŒäx‡î²ëÆ1§]ßE£†ç2ýºÓž§M>z¨^⣃˜ŽŽæº+¼Ø©”¯»ŒôiÅU®|'«« ðO³§ùÇ;PãÀdSF˜½¬†Âú“a®>5~A ʈ°;]†Íîô"0d'—»ÐÈžërFFGçÅ; J+°3`O5ZÆùDæ3cXÒ «ÏŒ^âõ õG}Õ¢]!—Xh/tÉ5¤;Ïk£UÛua3/„ÿ÷ÈÊ[§å.xü6RV¹ÂKtﱪjnÔÏ}ü6Úû7/uð[Ñ)=¿*M/â ÉÑÙš˜Ÿ—kÐ|6©{=ñzõÀ¿"»ËËÉŸ -ì©ö⪠ùœšˆ*Ù3¢·GD¤|h6"Â¥WȵG"íyngTM(ª²gì°¥è¶'oâ5!­¶&¸åC"0èq¢èÑò‰{©!Ù"K^Dö .C/ÐI®}Jú÷åÕyÆñçÜWbⶪ0Ñ5 T¹5^1Õ¥ [ h$j"4Õ†‘‰©“F²Hã]D´6ib¦Y/6Á´kÓ©Ñ”&„4c3™TK«¢m3Ñ&äôÿ¼çœu9j4½|)ðãyï—çý¿—Ãÿ–Πàƒ3P ?åj…–`E–‡†åV½ÙœÎõCZŠ7Ù¼DP@ò…óCSÛ)zŠ÷qu•òp(==”–Æ1r±¦ãlŸš™Q–§%¯ôú`à>*„o—ggÁýãÆñ7…ýT…H¨¡¨ÌŠû¨*é ù³ÒËCr%çDœœøÎipr¢Õ+“¡äÃÄïùø'5ú7›02ïáì”ð9ÙK­üüùÉùEe¾¼`¥íÛüâ!1+F4Ï…Fæ–)I²’“‘ Q.ŠæHÙðš‚?]ˆzIH(E‚ä „¼•s­ÿåqãÆ]·NØðÄT ›ÿàZÂ\©f2”>4>kH|È膌WM•ó‹+‚Á¸!y@Á` ÙV‡Í†ªdŸ79ø²¼OÞ\™Wé,hØ|¥))ØPŽI<,eg;Û˜=X@¹^êë,òæ ÷Çüh·êv’<Ó¦ÂÊ´R­¥/ƒ€q•kǨBú+-B^ ÈUîÀ÷Ì~*AùUˆ×Ân‘gš—Q¾< î÷‚T°,°™rPç8hGp;ž¦j£‹¾Ž¾l‹ÁV­”¶!o‡>“ª8}m@ÉïDún½6!Ü‚ür.+,×/¥o!?á-Z©iÍd ¾Œôô¿™Ç ›ŠþkÕZóÂihû›È_[[lw”Ÿæ:b®<Ç'9 ÿÔ#}˜šÀBø‡ëOD½±ˆ7#| Æ5 v8¸ w¢ÌÝx—…`3Ñ®=oóÆ<¢sÂøÅ˜® û4'Œ‰çut·bÆæ¦yµ¸ÁïëÇs¾Ì’»èðË ÏKë1?aO‰z M‡ÿÊÐþ°m¾&ô°„Ç`ž‡«öP"ÚªÕèû¸ã'ö âs±®e(;€0ô8X´€Gy|è?‹}ŽuÿD*|e?D?ù ú+ÀÜ­u¥U¨ÿ}´%‰~¬u°,@~5|úsðKp”Çà tf#Új'En7?† AØÄz•`/—Aÿq('ô Ͱ6Y¬ í˜Ðê|»5±šì=óê/£Áx}?-²²ìŸ*Ö,ï§mÖëÚ±BÓ5¬{éÏ“5c·j*â1ˆ~¡-Çò¾C»«Ùâ€ÇÔªtÓFÖ,ëͱìÖïGÞ¶-Œ™k†½G2PŒÐ:´èXÇQû&µ¢ÍR}tÚKêI*À«³@[ »ó{i˜Š×»’N÷y"4kyêîtÙÆè–ªÑ×Sj|ÑM»…_»å;ÕnIÓ:̳Iǵ¹^„¯²n¤ˆ•Ç–‰Íû¢éÿò»Z-CøœÖmš˜ÏfÞF¯4ø‹ôƒ ¤yÒ¥O6Jȋϫ‹`…ê§lÍOÓÕÍQãÉ?¥ ½D¿Gœ»Ñþ1©—š±^Oñ”¬œÅÙˆ¾äwq?nöÞ Ñœ[KŽuô궬>wa5ØÑØw¯€NpÒæOàôø=±q7ðù,îœÑ ÙÒ«y!ªÏãÔûcGŸ.¦¹ôi¸ué¶|·ðù.îìSŒ£Ù™?Ÿ|ÆñÉçß}Ny·©¿ gÇÄ9ÜEö¾ž&‚,´qÄ>G:•°y{ôŒþ¶ÙiÌ1;•f§¾Ó|Ψ1_×›m˜÷„è±Î2ÞOÎ]Ê~â{ѹGµTZfŸg­¢,ú÷h©8H_ýWMUh÷·|¯ò>TÚ°ïàO´·N}ž¾«ž¢ûå%+]O|&ªu#g:çߢlùóÔ©N€ðó°»èKºAuú¯¸ŽÙ%ÒN[yœ¦UÐè.K}’~¦ 2^+ž‡<Õ<Ák=Ÿèi ÝAç¨UíÜ#˜ã1aw =qÝCfÏϘE_ÑÌË®£í&ŸííÂá£mBÃð·©¿#Þ¤½‡ò?¡5ž8jõ|çÓ%J4p–ˆ¾Ð_ø]÷õGؽÐX 5j·›Ÿ ýï7M¥{¨û‹‘O£µ^Ú…½Ô(ücÙ&Þ?J/ųF0¿bñžè…ÆŸ¥GõÚ G »nÜÝX·^Ì¥†f ¼Ií0ûQ6m÷ô"ñ>á{Êo¾ÅûňÐ(ÃþQ†Ç ÞèWéÁx·P#Î’O/=£ûø]#IÐÞ0ÉBÄׂz°ÁB¤y-+CkDúRz]nWdè›ó«/`ïí¢eÅ©Ëð~8Gëä,Z¯@wpg(¨‡¸šAã• ”¯|*îŸõZMåpŸ¡Bµõ#´D=HKáQ`ôˆzZ˜*´ñκíØÈÓPgêMg™û¹œèãS3QWÓdQ/1VóÓ1cÞßþzàñ";^ktœö¯5>1OnõD™?R‘ù>H±ì`‘ÜL`¯|ïðÕKÛñXi£€ÔÚl^¤¹ÂEPë¥FPTµžöÀfžÝ  S§ÒÐöQØCü]ÀÈ¿ÀÙ‹ügÁ«à'/îëZ鱨¡!qm2­eä ¼ 3èêò{hŠúÎá‰ð'Pê¨Ño£†‡VȧÎg’+®§ê s£ñÜéMš(|hᣳ° 7Áû1ÖÇû+“ïçÿtŒ_¬ïZððÿ^úšÐÐøß aÒº_úúk£o3v¼Røsö½½NHoé®õƒV¦)óÈïNGxãÄÝëz£8Ú})GÆd¼E€úÊw÷ÁŒÎËñ5Œö{=Ši ü€%¡1W\÷Ò*F^‰x ±Îa¢ñb¼«Š-}2ðír>$i1ð1(û8ã×2ö+úäºä¬£s÷úð¸Ô_£ÜŸñf.¦D·êÛ>/†h¾ÈÒ{4ÎgI«Ì•=qeo`¯\¯Íÿ'°wN€cà7ÿë¾ø”á3ÂËçÄÛxo„ðV}ߘoP3ÑåF¢þ£Dàšû"ÒJN…ýŒBÚrXÜFýPÙÔ8øè{Õ$zÌ~WŽF<Ϫ{ù9»½«>×ëÃk§šU¿=Ø…ðïTÖÿìVØK(B½rØz¤­ƒ‚x! þ{Ägálp`œxÆ d¡þPÇï‘k|‡þwíu¾?nÖbŒÕà;â͉ñº¿!nÚ:ëyëþÖpÖÿFÖù–¸ÊÚ~À›ïóíó¹ß8ŽÅz~†ß‹ƒ'zUi¥’Dc͈ÒrÈ{ûdXÙyhÄ¿H/ÃØ¦ŽŽßÝ3~މBp áÛ‰SÇ 3¿ªÕšâBZÙƒª©Ó¤b©IÙ M "Í6uÒTiq+-BcmžÏƒÚMî²JÕ¦kÓ´tÒ4`ŸFE?Lû6eÿ;{ÐI|©–èÿó»ÿïîÞÝùÙÞ3-¯ö6žÍoFlí[¤ 1rVû!™†â)ˆUd¥än‹y‘¿J hÒH%U¯MH毖¶vÉî Ú·(6*%¯/–¶:µïªk¯?áÚ|ü ¼~Z{™xÔ<ÍR»76ƒñˆ'´m¤Í¾ÅàIméV±IÑÖgRô†c–[;¢ùT¤]óA¸KÓEŒ+š‰™šÚ•RËf9¿+»-v[»¬é¤©¤¶óöÛš›ìƒäŒ•Z<±«UÃmŽaY8æHÉ¢*MíUŽ0Þˆ¶“t¡í»øAº ~TÛ%¶ñê ¾GËØd/oH¸ž–Vò´ÅªV‹6„V[›ÇŠÏ«ÑJÁ1bµ^…uµiÔ¼Újsئ9lͶf³˜Ã“‡h³h™EfŸvžäµsdZDÝ.· ¬`EUööÆ*Úš+á]ÁÚQ\ÝQji“3󉎭*æ+µ¶Å·µ×È(Ä0ù‰Òv_ììŠV·òdÉ×-¼hiÅÒmoìÀ.¹·µÚ.µ=jl‹ã5ÅKN(û-«ÉÕad’ûËîâµôß5ý³¦ÿ¾áUV+a³Ìþ ½nídGg/±¿’EÔ[ak$ à/¬,gÁ>g’€¯ãõËð üiøGb÷§¼ÌÊ%æþŽðtÉ›ek¢_³ÂÍÊöîf¥£+fدÙÇd'ºø3|/ücV%{àwà>x•MOá7Ù~rþ«¦ÿ†­Ê3Í>d·ÈxI´É)ØB—¶,œÒ>¤ñ*½¯²Ø ²Ñ÷Ep®^/÷òöôGÙÏÙ„èá–›½K3ôŸȺtÒÁÞqÙÉ‚X5x…-°Ó7fÄ\Ò¢h$º¤#bÄ%Ãò²y² ‹‡7,»Š2N †Ó™Ð›ޏmý÷$ï‹‘”Uˡ̫Aé}Øú¥ª%Øe2 1ô1MC3ÐEâ@yº½½©®L@“Ð9<>ò ò ò òŠÈƒÈƒÈƒÈ+"¯FŸ„$‘‘‘‘SDDDDNr¾99E¤A¤A¤A¤‘‘‘‘VDDDZ&„ ÂT„ Âa‚0a‚0A˜Šˆ‚ˆ‚ˆ‚ˆ*" " " "ªˆ(ˆ(ˆ¨" „¡„Âa(Âa€0ááááU„„„„W^µ?“$ê ê ê ꊨƒ¨ƒ¨ƒ¨+¢¢¢Îεšõ šBj@j@j@j ©©©5o}B-ñ™‚¦¡H²U°U°U°UÅVÕñš„$kƒ°AØ lEØ l6[6„­ˆˆˆˆ‚" Š(¨ƒ; Iâëʯ½5ì"͸ðáÊfhŸòir_ùYWþ&)*ƒ,)¿@.)?OâÊÏ‘ rô§|‚p<Þnuá0 ½…¡e褫Ú]èoÐÛoîq´ë£ú¢¾¬ßÑ7-ëuµ;G‹Îeçç¦egÝÉ «›yÔsò–*§Q>€ð!‚2¡j 6ˆqñœÝÿA6hnùÂx¦wÃôN˜.‡é[ajµ°g¨C=é g˜8͘­Á!¾Ń¡!<™æoÝßÎEð¼LWÖgöÃïCEh ºÅ¡W×ÂÈgÌ=Í.W¡´2䤫 ß·;¶¸Ì óÐ¥Ò'Ò"Ç õ‚[¡(¬,B£°Eè4·Zè-’_ƒèMìÜ ø²à÷Ðü~Ã~)ø ìºàƒ°Eè)Ø úŒ[ú<቎5ý8î[ú1Á_@ì9Áû`ý"”é0  µfÈ=x IímŒäülàeÚEBrã©“DÔô6AÒµ&ô B3jnæ_ðóûÀÿ…ÅñøÜ(;`weú‚éæ«‘Ÿ!lqa¹eŸŦÛÒoò¥À,}ÑÀ-þSþŸ”]¸| óžUC~É(³æV>ã|"r¿ÆŸå§ø1þb×?ÉWå4I–fØ[<¿‰»þL ¬¦x”Ÿ›<Ä«r}ÉF¿ñȪ\kŒþ$Ö7(Ë3þ|¼L·˜aýK}A?¡ë‡t¿¾Gߥ÷è®—×Õæju¹].—Óåp1qu–7êf?Á±ítz¥9²t¨º—É…üAƨ‹‘g‰½UK±Ôñaš²«gHê´aÿ븿LÝÏ}ÛÞä¦vGŠ¤Æ†íý©²¾qÌŽ÷§l=}"S¤t>‹«6»R¦d,S¦òÒån»ãÉåkÝBé—¯e³Ä×õz—èÚrðhò1E®Yö?úó}µÚcÿ$uÊðF¦³÷¿™Î^dúÿÏ¿ñá~Z˜œZ÷äü#ãPξúú+>{æ´a§&eƒakÁÜé3¯H?5nOúÇ“ö”?iÖÓ¼&›üÉ"YË×Ìñ¤0Fü§’ÙRâpÆúŸ±fŽ•9ü˜ÎËÎ2r¬„õ˜fK6'äX–Ë’c%Ì„kä;òܧ3EÎ9ÙðÛìÆÎuïÎwyóCò@WíöMuä ô:ÙÜŸµ[ýö’M+bÉ&¼ÏdSÛØ®Úà&Ž3¼»w{’l$ëÓ>t²-[XX–mÙ²µ>l ª0”b0Éáà„†ÐNÕ$awBpÒf&þQhÓ2ƒH'4C›`ì–'$L†BC§3d -ô?\ žðÃuÒÆ>÷]Ùf’):íÇíÞíî=Ïó¾»/4Û»|û •Nà·»hvT´¡%h{(3Ò´13Ú´m+“ʈ¾ãÁœõ²_¡Û‡V?µ þpßWHp}õIÔûÀ_߃~ýýý½,ëö"”©Ù”iÞ+E˜ê±U]Ð[jã¸BÛiY^=>:£°ÜǦcµ(Ž‚º¢.‘ä…¼HX¨Ð7Pž9;øHÇ‘=£uõ…(bÏXy˜Å/}cuM %ħ¬ „`†±$¼ÊÊðB©;j¡2®NæÃùÚ|R€Ö3' 1x‚m¥£u'8Ôí]ª}]6,‹Íw|´L-Lœg•h´+Ú‹ xý?Øx ôûÀö.ŽÚ[¾o‰…ö^´ððBg´é¥þÅW ý…WØ|°+"ˆ4(D§pFiûÁ¦ Ž“VÝ…(orÈ"ò&F~I &áÞÃUHÆ#؇|Qe&=—^¯L§³siÔ ue²úxÈr„!7f5îü¬NÑ—HãÏ3?¿]å;ùkÈŠÚô‰“ í‰s:G¸$éAR`'oè Å=ä5’'ñÛ²í¾(Lcd§aøIT7=gL*if ;B÷/üWsb„d¸Š÷aï3_4ÿc¾Èf]‰‡ÈSˆq¨AÅ±Ž NÂ÷*œÆÅ9ž[E¤AxÊ!?ÿæØl“FV¹i º)£>î‚ÑW’Â~óí xµŠžG2êÔåŸq„‡³ÒX7Åtœlÿƒ$SŒl2z¼.ÎЋ(⃼Æð<ï·Là_㋸ysTâ-ó&@3{Zà[ZiY .âàÂ!ÇÑÌ÷ç΢lå!eX¶ï‹VŽ&3Tpp­/bƃƒ&—Ìptž< –ÉIµÌÙðôh‘%7 ðA¾ÎU¤–ÿ‰Ü'ÈûäK¼øBþD†CO±lñ•ò<ùg|¿<Àï‘ùò:Ž«SÊ,lOqpõ‚­—Z8ÎÉ_w¶Ú4»È `pž®},+d,Iȧ¤œ+Uâ)Ò\lKßÁ %êÇ1i~Jú¥´Sú>‡¯â+Ò¿±š‹ó¤ÙR´AÚ…E¦÷Üý7sN„™^‘gŠã&äKÛ -äOÝ©åþ§†18ë¼·!ªn.Æ­°sDaØ?æg ¨]8-`¯'GÓu.f°öëæä`îVwÇé„ÌÊ,ÉlÍìÌLf ™†ûáJ’ñ(òŸ‘±*‡ƒ«Xsérª àDÙL3‚¡£¤‰íèS¤kõŽç¶Îí8vä·{–ÏxvVÙ€0Ì>¿gýÐ žÀØr4ÕZôÜ“ K4þ˜u¨Â\€ËænÛk+ÜuîER‡ÚáÚA·ëæý,UDYTBrP™ª×êµnI6¨Ç¯ûÝ~cª>Õ=Ó½L_iœRÔÚYž¹nˆ¬ËiÐO]n½Q_¦¿¬ÿ\Sô¸æòkšËí h¡`ŽÏð£Vÿ€ûý\<›¹ àd*r9ÍаöçXî€8(ŽŠ'áì´¾ÓDq³ÄÄfvàa¯%&?ÿÀkŒ“[Ò”ìhÝñôÆI˜et‹¾ÊøyÒT ÍNmàÐRÇŸÂ!_6_„MÓãyàU€ß¥ÿø8yôH몎ý©ßœî^ðìâªO?7k»W„‘yÇ×¾}&£|ÝÎÔßQõÎæì±_ós'4}cö3.UüÙ÷>'7w Р=}Ø3”y ïÃ(” „óÛ„¶¼Åíżs®Ó¦«YyZ:Ñl.q-ö¶g¿×^°"s]æ–l—×d]á±,‹Ív[$jÍOÌ7$Ž˜¤+Ñe®I¬1?K|fŠùÊ$mBb‚Y¡Yf½R¯Õ$f˜Z›¹RûqâíÕÄ;Êvíw U¨&&D3¢D´`BJ˜ŠFPhaØŽÄ­¥a´4ÜÆáÜçÜQÛpC±B?ÏÍBLŽuѸU‚lÔ€ZQ@ƒhÉè:±£A¤p ߸B!Û²BõRîÄhQVî€1h`£ÝðŒ0RøQ:çë›örvy³sÆ™kÜ‚9¿›‘uWþ—-ù—ÆçîüKP¼Ç%ë GüË|üq2=_Üç«H€{`‚Õ±}^¶:i»½ZÜ[¡8—›Ý»jë.¸§U(av9ÈòàÓœ–š/'ÈhÝIö-³¦>€9I øCAâdãüÙ(í_ÿÓÍÓ¿i _o]ß{ã÷ÈBRê¬oÕª5uÅåhðIJM÷¸Ã©/R§ÑùŒÍVηêbޢʅ+wwþqñÍãZ×óe‰ +§xñm\ý—ï#Äò§jÎ0hTâºm³˜–¡vÒ$í£’ˆœCx,q2 …¢¤—õTh+¢G%\/S ,=¼Þ€;q÷a‚#òØ®´×ç7íÅàuàýÐ OµÕ\Jל*a  –1šGKÍ!¯¥æ’£·oß}võ:PüØU„{Õ.—d‰J :SžI¥Et¡±ÅØêÙøUp»ñ‡à™Àeñ–¨j.â°”ã£.5®` à i¬!Öã;cÉŽÇJb±Ñ‰!`·x¤$2á#LèÑÿ‹¤×±;(çËö@H‚Žt¡–:6YÜ^Gyªï¿TWkl×¾wfvö1;ÝÙÞ°^Û¬ÁÛ×`†pXèb;-6+Ú`—V@TÀbˆÚI„GDPI@i•&F66”‚hùSE¢* ©"ÒÈ%u誨µ§Øãž;kh»ÒÎÙ™¹;sïw¿óïþÑîÞ ..ÿñGïܾ»Ûq¿uîúïu{‡NN˜æøÇÇÒ§ÖîþPŸše\ëcÑ?.";HÏ#×Z6mMpž~Ýqß¡î2wm6b–vØŽãcÔ æ5Û‡ƒF[æ †¬Ý±Û5¤°%(Á.CKØgaiŠ*ÀÈ›ËÒ S`c}6KQÏ nº)Ûeª1h@]ŽÁ{˜^æó)Ã0C˜3\{è^úý)GÈÅ.é2æEuÎrŒ±fß8­‹+'5È ÌX&“TsOLPîÿ-€:˜AI %1†‰ÕÁ79†ð6Ü…çMþËvùÑo™ÄOåÌ-Ì®©Š áÆW´!Y “÷H÷QÙÊ\E9 ¬ñ2GÌ-ƒƒ¤n.›ú3‡Yˆf¢Jü´±Ùt„m%¸<´4¼¬ðÏÒ=³ZkÒžMtj]‰¾Ä«ÚÏ‚o‡C·‚„Ü,ËûVSŠØZÛNõQo±ìMÖ}M¿+Q‘xe…§”É9zÜxªZDߟˆSñ¦QªrAÔD0ŠH‘w#_G˜H¤§WE4¦¶6f„=õ1#$ÁA ê±!êŒÝÍ»JIå†{V„ÛV„¥0Â0|\´"á(qóéî3n ÌèøQCPtw°EÇz;dÉ!²©’X[ß à–@[`k€h©lÃã^”®'—!Ýe26bqDÒL™¥VKæ2p u‹¤|vödˆJ&‘úEû”@ŒÈËë‰TÕ@§©“¶«à÷AbÀ¥ê*¼i*yûÃ_5Ó¡Bó N²ÓKÏeÎ]m=õêû+Vmm^ƒ7V¯Y·hÅâ”ÄQŸÍ9y4ýÒ%sè§/®×hަ¦þƒë_n„W/®3oË•jÑüºÖÊDM|Ùë°×G-F¯#yjܨàjkBKB”ÜʶºZ•V5þÊÎV1u|·*´˜i曽‹CGí'œ.·í Äý6» íå8¹1G°;Š£R E'Ä!\ÜëF½¤ŠDêóhöÌ_™›œÿiðNyç”#ÚRÞ“Á™Æu×Évº:•N5¶eÀñY]`'{$ˆù½ y¹Ì`moÿ ÓœÞðž!ëËvföíïÚÔ-ëãæçæ×æCóã éÓÔ¬7[ºÏübðìëD«×ÂÚëçú‹±z˜–ÓÊf1+g•]êNí8uÜ}Sº©þIº£Ž²£ŽQ靖õÎõÎõ/——+MjÚuÛçÉ5JJo·mØúÄ—´ òyeXTœ‚Å¿.XIïÓ…O®hQÝŠ¢Gç/c¹3ÙÃ!†"Æ¡Ô`áenì˜\Å1TÆ“|¬¤8²Ç|Zp]Ê•¤gVæ’c¹$Tá±Ìðqr,™„˜¯€©U󴪮±Ö!@¸ÈT˜„o·dwíÙ²ªÓ}ɱߚ°’»ñWêï•Ϭyåí«§7l-ûÍ œÀ ôQ…ç oÖvÓ¼9bÌ–ÓlÚ•–óly ¨1îtvG{£Ô2oôïÅÚ¤\¶è…Žƒû»¾sàô†4.g$`í(%Mt¿½âù7Ï]:{ÖÛë-®øPÿ|I'M\í çIþ˜tÁvÞuÅy… :>¼”ZÂ6¹Z¢øAv0xËõûŽë#÷¸ý+ž‹a¿Šè~Cðè¢ÿšÿC?í·Ø­·¢€H½l€—W í%¨2qpƒZHÇ)‘1‘ÝŠO•äcrv>ªa+"ˆå)’`Úm² 0_d8Y%pÇ9;Šá2žDeѶèÖè™(cƒu|Zë’ñ !Õ$g œáSb_½jDE8€ÀªD‰-ÿU?i<&#d2$O 1‰ý‡‚ˆZžÍú‚r-™t€„w/:] ­Ó†X}‘ñ#DB3ÖëPÈKòzÁ°õPh·’I°™Ð7¤,gj Å ÀLŽ#:fù oÞ ¨cµzôW想Ø÷‡–ÙIƒÞÛñõEôŽÖoÍŸñ7ËNžxåàBÒ¼e^Ýõ“¥ø»/ìilÜFtC…¸=‚‚†ŒÊjÏb ¤OšéUmæšJùå“à‘$x1’(ŸÓ!r¸›â(Žl„‹ÅQÁS VÈiT‚ç>„G³^ŸË™ªw´8V9hG±TæióPž!̼àMP¾6ô†r]¡ §[W´ÀŽa*‹ò{’:^p"æPA*¤ i§à[‡ÚJ>Ó…È›²ÜqeÀn©‚?åŸ ò:S=]{â‡;¶%.¨º}Ûüü4“XÕ·ÿ™øï¤ÚÕÍŸL\¢—Y¹o®fÚ-P†+öí‘JvóÝ}|oS€¡ï£ËqŠJÑn¤é´˜ö¥ [KZa«Æ=ã^OŸRêŠS¥Ðî(ÍÅ‹Jº'®CP97ÏÍróE‚ðÏæÝ`ØÕ8áÿ€Å‹æ‚Ç¢ÈEÎųòôŸY˜z> œþUÔÛlDnfˆE$®ÙnÎoW5vV —ªDrœš ®À @C† ¥â1Y+¢=cÓê#å¤É‘Ç¥jrìûùöc$ íjÀêQkÉ×î—±K›Ä¬/[ØUҙ̖±¤’lJàqq¯™š&i  ü0xàp^ßõj'npDŠ[Ÿ¯)ôò»¯ßÙõÆ×ÞïÅö…ÝW›ÿülb_{סƒ›7ík*šëÆ”Š™OýràðÿCwµEqßñýíóönïnoowÇáqv9ކC$bn5xñ1VÔ`Á†BšÄmÒÚ¤ÓeF$¢¦Zê´[Œ6ÚI§NÆvʴɱèLã`::âŒÁ:ÊÑïo|Ä)3{»¿½½å÷}}È¿éº÷ìGg7UŽîq‘o?ò‹£¿ê;)Ù¥°[%†Ì„…P.–¸-ñ|î žcT&FÖzš< B¤WöH^J&‘§.—âx»]Vì*A8ìº7óbÉ“<šæɄī‘Xr¯¯ÏG¶ø&|ä ò²®*4Á³} šPâ×RÙô‚?ÄÎà[Ø$$&gVÆcí{rªYÊf™@|,æ ´kÒ¢4_¢výþ…ës3ãyk¥›K3ã@ýWz—µìêœÚGÎëßPVõöŽ©k4ôï{0l'à’}ÿú(ÁÃÎR{Êä«y²äÏñcü ž ñüv¾n0Ë MS™Äq~Yº‡eX޶“ð¢ÕqáX’öÛfâzGÊAŠqDY%øZ‹7 Ç{ÈŸG~ú ¢3÷î® õ» rúXf zßÚ¡Bt˜«TNçò´ùÜÓ¦!ŠfEvŠ‚ÈsG´Â6ˆHÜû‘¬“"øË@'V²Hs–Š0_~UÕÎ’›‰0¹élÓRµþU_úpöï;´úÙ-C7{JÙ7Þµâ‘-Íj”Ïz·w‘¿¬{ká æÉQw¢\ʳ÷îÝ ýßu»'h&?ù&õ5FΙ_7J0³8Î;SÍmÌ sŽcn0Lˆid¶3}pƒ(H”ŽˆÙ ƒ{y,Ã39-Íæ“9‹± Ø@)-%âðëzø_À ‚ªB’JÚ’¾d´Š\j[꫊ yTq|ßo‹÷ÆÉösï ² ƒñ±øå¸‹ˆÇ«á‹?Ä/ÅÙ¸&S°n³¾d¸0Ír1ŒÙ¹°…æ4'z'5qÓ™qZßwü¹ššçž¯ê™ª#ŽÎ­\Öq C’éŸo(J·œº5Û‡‘ j¦½¦ójÞ ¶&=B#¨–Xe«r%2¬CÎåd‡¤#‰t•°`ü.¼äÿÁÝ¡ .œ_§S¸FšÀsñY™z pŽ*ï«Îð#ðc% @‰®ËŒÇÖT,ÿQ†šéøGý¡Õ!rΉ—T·eB´~øô3Mí?Å´ôä!ˆÔ î£Û\vÛn{o+ôyò*CJ~ÆÏ“uâzïzµÎ×Mö°=¶na„ÿŒü'ó/þ3aœg¯:Å~Ûò/ìǶ? ÌVÛÛl»òX]èÐpŠdš“+¸@cNK™ã Ø…¬éÊŠèY¦â_7‚†~ÕG#LS¨Þ›” ,À0\1=ÿ!NZ»{êðM”Ì|rmæön”w ¹¹««¹ùy±»3çoÜÌ|Ü>=pt` ïðÀŽ·#ó}ºâÁ/2ç.ð.ó’R’ªpVx“9UÔrçroUÎ{ÎY1ÉÝɱÁü<ì/U‡Ct»fý¥'îr¹uQ´Œƒã›sÕõJ(¤øåcÓâÌÍØc>ä@A%qÌ3&[‡Qw ¶ô·›F™¹7ZÛ¹J¬îÙø½7w¼øÊ.(mõK™/2S™ÉÌçéš©¯¨ÑᎠ÷ë…†ÜIT¹û€YÐÍ Þ…Ö1™­ U,Õºš\-mçÝBH ;…iL «R!_7ãýM‘¬½€àE¾„oái>°]ê•Èi»tR“hI$tDYñ“dêC$ò{R£(˜…­µó$ÆzKB& »+žÌ¦¢•X9¨­[9X¶fCí)û“ a«§ï DÖƒúpG?³¹ª±îÛÏ.Z¸¶˜Ö»7W•}=wñ¯37!Æègb,$›Í£¬‡Ú Í£E{¤¹Ûè*ä99-“Ò®óá+Ñÿ:'#lÜYã|ÙÙåè–ú#£·8jƪôW"/é;¥òŽÈ[1¾\_ʦ+œ«Ýéð’‰z¹P.‹”EËbkg<|Øç4„H$åb³è‡ÂòO”Ç·îRÚ )]…§#§£Î6Ô©½ã;Xx¼p°ˆŒL_Àª1 ×Î8+Y¨À—CBÔæ?§–íCàü»¼ùª%¦Ë€– hð5˜©˜¬ÕSdð@[2V,%( 5¿øƒò|YYž9ñm¯\ü´ sÛÓP»¥$/¨£?ÖÕÞºñù*N¬­)ç)²gåÓëîþhOǼ§—„Ôè%¸qÅÊûÿ>š¾JîcŽ~ÿÕŒç`{ìq÷S®®:7çW¥*„&ye¤I¤Œ|ÏÙ9Á‡ í&´>mP£átN£4°wC Âð6L(,‡aÎ%8øb{1«&À¥kR’’{å“2Õ(·É{å1yBfYüûÕg•ÅϹßï9o^ÉLŒm’6“l&í$Î$iâh¾´Myµ­mØŽÖØèFã#£…-QAJm-…Öe±ÐÖM‹¶>–ÀÝŠà.¢·Ø aW…bXƒ43{î7“ ¶""ßýæwι÷»sgî9÷žG¨"Ôâ¡hÙî# ¿ûµºÓ7Ó>¡üäŠBu8›I›³vuH®¼#M¶½bu˜A*C¶NK…Òb¤Rÿ’¦dSµŸM5å5]‘ÁÇ{ÆZ íÉ'±ŒÇ¦r›ŸŠ—ßði]rSgã‹øáÔGÉí#ýÝ”³ì }ø„õL­òOÎ)§ð~¬Ìx\ªRÆ#r­Ü+Ôu8€ã.Ea\iÆ6e v)‡Œ9yNѪyL©ÓS¼M_ÅûôpµGßÌôü}7îÑ_à•7õù9ý’B5X ¯àuz’·ëk¸æQ½MïÓï×ò7øý"×”“ù™ãHŠJ“³ÇÃ¥‚OYa·?…\W80›© ©’Do^ÿòT^B!Z¾’¥))Æ´cšK6Œâë…h•Òk#®€Kv¹(:©šf€ë${`BNjÄ,CÚà9ì™òHI ³¤!†3¤.Š‚Ð†Ü§é¬FíÃ!ßq!Úkf.Ú$ 6"²×µ<ïÝszïòHQBáB@2!y‚ÌèhI"Vƒ•D%Éã¹çqëÛïbWîîË=û)[¤Ü9\šÓæÿësoëys›x?Y/ˆ©ZÅ#n_J-ñøRŠ ² ®câ¬-.kKQÁ=†W6ed\’•àòž'ñ¯VÀðyÞZ¨7„w„%QðÚ1!–Ü ”/J…KKËx«dE¢©q¡x¬±4f÷2Ñ `+XåÍ)¡-ÊjB§‹7;Þ;%JŸÈ|_çÐêÿ’V²½æì´(Ýív2t¡íL>ÐJ‚â5ÓBShûÜL÷k&9†6r Ü„7ód•üÌß$WP°Ý°+ÿ¥åõøÛƒf0J$iw‰ãDÁ'¨_Xk hë[ñJKªjjÄåiñb<7‡KrûVU¯Ú:¾qS_teÓàQ›÷²o/±S™Á[ªüç< íWQfô ißÄÚ3)æ­FÓŸÒ‘ˆ‚ªÎ¾Ç9µkõµîm¸ ã0¨çù¿Üßð)7×üå-ö(¨ ãf Qš*cÂýŠíZ|¦ ú~~˜BjEl9]ŒŸÐô¤é+F7Á­jÞ|¦¯Â×à³|ã>ÙWFºŸ¤ÜŠ5 O¸ˆtŒŽ…Fk(îRÑÃøâOI7IÿîÇ‚¤HÀ2ñ¬9K®h4{1#FfÓâYòDæüwÓD/Ž£ÅlŒBÛ¨m–Ÿ±t£Õ0Ýõ Ù„Í-²âjª £Òœ¬ Wásƒ‰Æ¹}Òƒ¹ûöï*ÇãÿÁ3'$d_½—«IùÚÈ/Äç`ÃU BUJÿrðWd/€²¦• u苯^ÁÜ_x' ð(Àœ¦ï„Ž„Oÿ ÌP: ™(+¸¼ø€E„Åg*•cUýEü`i z;@¬ f]µõqú¯õ·,‹]ÁrZ»a ñ}8pàÀ8pàÀ~¢…@–d¸n“®ˆ^0Å÷Ã?ž°´:µP¯H44Bšš[V´.¼] «;׬]·¾«»§6lÜÔl¹}ë6€?nÏ\ÿÇ‹ÆáÑ z¸Íã° n‚UÐ ë¡6Âíp'ÜÃ.Ëç/Ïh„š±zhF?͸ F »óùü×zŠ6¸v“®;C…{Š+Ià'ŠÅøé)È2IUÂÒ\£‘*2KAfdÅ-EY¢ñ»‹2'ùé¢,“|´³«s}_G¼#;|×HýʇFv^€ÒUT[)©ƒ2l+¦žŽÁCÄw’ª†à^RågÆü_c†ÐˆË„o!M»u‘LHÐD{ÍÚ1ŠÃôFåöà°Àá ¯_nW›¡Xt"ÆT±Ìê gEkÿSõž£wúÒß©QÕžýç/Ò7 >Ñ}þ³~¸4ovªƒÔö±Wþÿ¢_ç› endstream endobj 29 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 718 /Descent -211 /Flags 32 /FontBBox [ -665 -325 2028 1037 ] /FontName /EJEIPK+Arial /ItalicAngle 0 /StemV 94 /XHeight 515 /FontFile2 30 0 R >> endobj 30 0 obj << /Filter /FlateDecode /Length 19505 /Length1 32920 >> stream H‰\T XT×þϽïͰ ˆeÑÄ7>!‘%*Æ" ƒ¦ h¬Ä#2¸B‚Š1Š×XC£1¦V«yX4hµ5›I?X“&š¦nIªYTÚï3ÚçõÌh­öï½wιçžå¿ç€0ÔAbÂøü¾)Ó=Î& .‚µ9EnOáñàÃÀ¢'ÚQ´`žÖà9µ€×¾,ýfxJ+>ºû:`µªQ:«fFwÚ, ©zª¬Ä]üÁèïrØŸ‹÷ *cE—ŠÎëÛ–{—UÌ«žüÖìb–Ï‘ÃfU¹)>ü*PÖÁrf…»Ú|Ðö+` ËÐf»+JêÚ=,¾ÉòMOåÜyœ7?‹Oû×=sJ<ßí­ºØ9~Èmõ0bøUw!F‰G4`^â÷²ÿï+7/û×ýñ-ïn¹ûØK娋?áêà]oâšñ!¢‰-¨ÅFÔÂ)¬ù%ò˜TÖo¤³}±óÙ†V¶ŒÅ8Œnm~ƒ%X.?æ]Ëé^‰ ¨ÄgÎÇTœS–a0Æa6k~‚HôÇ$ÎvïüÝ‹™–ÈãJ–9 áŒË‹~´ñ>.P,õ¥ñô”è#*ÅV9A±?S1Êï—ÙûYJ¤ƒÂ&ÚåverËò°ï¼Î'Wð*Þ¦0®T£¹ô<}J_Š 1M¼".ÊÊnå”ÕÍU? ¬ÁÜ .4„réTFµTO/Ò&j¥“tYŒÅ3âš,“Uò¨2Š)_™«,SW¨«,—}Nß{¾¿øn˜)æ är?,åì_ÂV®ìÚq†é.’J¡Τ‘&ÑsL‹i ý–i75s”“t‘¾¡Ñuº%ÀdÝ…]ôbÒűPl[D;ÓIñ½ø·Œ’½d¢(Se¬ä¬êåz¦ò‚«´+&㜢6¨¯©êõµÃb³>„ ~Ú~;áöY|+} ¾ý¾fóºòÆ2 =‘ÊÙ»™fòy7pǽ‰ÉÆØÅR¥Ñ8Ffͤ*ªf$_ Í´3û>:Â(}F×8ç0Ñ#óãb %Æ3=-JD•X/6ˆfñ©øQZe¨ì$»Ê9ZÊ9OÖÈiÈäßåEùƒü‰ÉTB”žJ/%^ITF+Ó”ùÊVå’rIªžP¿¶„X*,+,-–ZYÓ¬¬¹ÖBë:ëAë'A.îÎwqoᾇÎË¥Ò!`­ Äˆ6ÑÆý< Å2[p§ŠFZ)Q³è­V[†‹á”ƒ%ž±>.^?ˆá2›ÆR>fŠþw¼Y"•7ø—ª¼‹+Ê®­=W[l´X\³Ø°Ÿ †rÌ÷e?%QžÀçòY•mø›BQtEì’¸ Ž*iªv¹ûd-Âáàét+h5÷q½Ása"¥ÐMiBŠî¢ÁòK,Ã3â4®ð=^‰_S±Rе@µ¸„×ùVôQg[,]éÏ¢\ñЇ¨BÙÍÕ ¥Þ$ÕH¼@…r³åš8ƒùhWBpVþ޳oûd¶Ò¡æQ߀EX*s)jT§rŠJ!é)Ä)çyºÕÊÅÎÿ%=×[ïe×z>òpî±1ÑQݺF>Ô¥sD§ð0[hHpÕ¢*R’z–K3â]†¯“ì—u7+Ü÷)\†Æª¬m Í0Ó´LgËÿg™~Ç2ýž%Eh©HMNÒºf´fêZ MÉu2¿&S/ÐŒ+>;À¯ðaÌÛí¼AsD—ej¹4‡‘µ Ìëpe²»¦Ð =£$$9 M!¡Ì†2gDéž&ŠJ£#¢Ú‚Â8)#VÏt1z¦?CÆ9ÜÅÆ„\§#³»Ý^œdPF‘>Ý€>Êè”0AF ŒaÉ0¬0Z¹¿¬Òš’ŽyW·D`º+ÑV¬»§: é.ðÇèœÈq3¨g¿ŠþŸÈλd8ëï_í.½ŽèrÍ/z½õšñ›\çý«vÿ· €}ð^—åòfqèÕ âØ|£‰åNƒ–sHÍ_‰¿ª;õ•è¿Æ5S3‚õQz™w¦‹&Ök ¯Æ¾?66ýy±Í;Ñ©ÛÝõwf¦Hxój~“®Å<¸’œÔÑù°Máî2¶°û™’{k.`îçÆæÝC–üéOrCZ‘Æ™8u®iˆÿS2Þ¢!lÆOñ.£˜O¤ÜÎpy#†ùõþý†¡kÞëàЯ|ÿ Æ}Wc‰‹¸?ëï“{­ÆëÿåÄD#!Áß"Ö >SÎ1- LNZÐ"tÝ¡ñáÃÆÖ]0¬/Ão·ûxUK:¦³`Ôå:ïÈÿá¾Zƒ«ºªð:çìsî…‚â…B†’R yEË+"Ðòº¥VJ@°ØŠN[.á’hEaR 4‰ 1Áá© L•ÀL©SÐŽ¡jñÑGflãXÚ¡)”¿µÏ>—›Ó`Õ?fî—o¯µ_k¯½öÚû$ÓŠ¤ÌSÕ˸¦Õ­ rMØ­‰u/KE$7?dQÿ½±_¿„‰sVçDµŸQýu§>¯ 5/?T’<'R¦|›·¤›äÔOŽÕ©R4qV‰‘¤«’ždÈZåÒXcJúDE~– êU->?¢Rj´äÜhBÙ\çiï””;ìÔb_á^’nvSfFsÆt—¿ÜMîf^Ÿˆƒq æ- E"½»Õ!Ôœ ç)BÄÓ’’”äYQ*ÄÉLïÅnÌ(MŠá²YÜñ稔حa’*—â£3}l.]$’›šœ)‹,o±Ã+R“R#§ôsú¹È†9enà´Ø§w%Es«Já«ÕZN:ï©ï+] iV];Ö•#w9îÏìk)ßÓ QýuúšØH`žo(}Ç,¢m…ôFz‚a ¥ 8J¢m#äàÓÜí ¿S"`ˆÒ-–,£í)î‹16ð8’7RÈ?ŒÖ›Eö Ì·×l£‡ƒ(׋·©ÁšBë B¿3‚h·AŸ½V#Õ@õ+¡;.\‡òRôËTå^¾j|ë€ úÑg—ZïHã,Mí7±–RŒ9ØŽ9çyh“ž ìÐÚ¨Rk³ëQ¦ Ì¿ƒõÀlÅs1Î6ÔOG¿+P;,p? ¥¥)úéEpÖ_ì¬h£Õ¼æØš`¿²éV86æÅsþHÕ§Øà^q¶yQáÁ<#›Âàr È×_¥u⫤Á_Ϙd0üDì§¿ÓÄ*ZYƒf3ícX ±Ñ¾!P­q•&£î{Ö^¬_²ürÔ?¦ ý”n¥ÑfÄ×lŒ¿8ˆ1ÿ.ãa-ÁüãÀÙ¢CÆÐv  s½ïú‰}y öu1æúÔÏ1ÜHÀýØ—0°–íÁüìsÞw­¨k Ú¾ƒ6KÐ’ÀÚ9&¹÷ÇXi*ëo2Õ£M5üú7°lƒ g ¨{ã ,`(0èêr x…¹ ó2^3›2>f|ÛdÌ:k8(÷Ó93uj,ž'Å:Jå )<&ŸŽYØrÜ›ÏÇŒË2¾Ë9îµxS1ÆÙt?Û Ï bËe>w°™ÏÃ^½*ÁûdzlŸËìŽ5éœ ÅSãÖš)ÏØ JU±^á²ë‹¯¦C³ÌZœRKsÅ·ñvý!­Wh¶1𯙙Ða=hÕ;i±ïZìå"ÈÏx¸†ák×Ö˜­XgüÙNϧßíúpÑ®™f“ý®IÚy³IJ–oa/´V§Ž™_÷ïê?ôKfrf“ýžÙnÛXÏn>¾N-Hvú@¸Ï?F«ñ—k-¾BJ°ˆ®ëErÌ M­ØŸò<Îô…æ›tƨ¦¢Ýþ£¦°ÞNÛ}ZŽï~<—~‰*<>xC\u‹9o,¹ìÆ«—9竘¶pþ.(¼£ð1ðâè'š3Ç$ÎÏò~@޶;ñj_‹Åçy: Þ寧'NË=ñÙÇ—^–w ò»{NaÇNwýœ9ÇqŽä<ÇyÆmïå¸þ½qÌyøU ©s=\a>l|K}äaìw±m[¹ö«Ùn0Ø VÊLûÖ½)v§–Ø]ê>íÞ¥ŽžîrïQ3›Ö©|vHæ›éÇò-’öõ²ŽÑfó:ö9PÚ[«Î ü »ËE|¾ª°ŽÁÆœGè¥ì¹Dwó½Àw¢±~滨š*Œ7ð^à¾ÙÔ_ÞÓ©¶Ÿ—:ܩ̬3‹©Þê¤,Qˆ\ÛJ«x¯xlï½ÿ1êë O´Óxñ3´ Po´«•>ÒÜ·¯øÂ·’|ˆÙ…hÃãÕÉ>A üqHúBöÇ[„ã‹}1­-–ï‰NzÎ,¤bœ¡:_˜ê¬Bœ¹5`ŒÃèWȶ ßy_ï¡q¾*‘›*‘sHÆȾn4a=›×# 5ÑÝf>,—kŸ-œ»ƒÏÑH÷rŒX{‡ù=±‡"b ͱʩºjyóî‚n+Îo&ÎîNô¦ò6aîÐsßéü–á7Ÿ_­°|´ß)˜ßx—êŒùT‰8žáß?l£tÜbï`¼)?¥På@êÖRŒzRê³é5½Ñ¸ qËwè)±…E”eŒ§Á¢?¥‹ßá¬~Bû~´L¼BûE U±,i”w®ÑŒ·%ë/Ò¬×_ƒ\C!1ý+é›bm4Ž#ö~O½ÅÃØkô3¿8þb\ím E8[ÛQþÄ>ÊíäÍv1CÌ¥tÙ/ÒV›õ<øm>öör¹›½°5f§kãmì“ëäqÑÛˆý4•Ⱦ ¤9Ü•¯WSP«ÿ‰f è»ZÌÊÕ:€ ?§¹’ù¸ã'hOãÄzØ‚òXð¯€cŽŒ·Ûz؆±Ï‚OòwCŸI™¡;Ô¿qëâÁsÝN3‰ºËÏS˜¡]µo0¼íá牘o¢˜ˆÅ§Öf ùÇþ„þŒé‘1O–xžÖôdOOÐ.R¦ô¡ƒ`üÝý¼\Žãdfu7üGö}`7Iÿþ“*†¾ ]¢áà"p‘ñmb@N‡\êúS»ŠXc4Ф>¶Ž±BxÇMóê½²w_{’õ“t8nÄâa7meˆéhxeÿyÚʰ^BÝK·ÊâHÑ}Æ>iÉóÈÖ"Ü™€>¶‘}ª1ù"Î2Àmeÿ¾TÍgЛéF¬~ò7ç׉ìWÌ)ëÝýq÷Å»?°/(.!Ü(\žár,¾U¾èóùN¼ÇdÎ%ž67ÏÄͳq‘ïšÛùÿœW€6àåÿõ\œe8G$pž¸ŒwÈt¼#Ûñ>y*ˆn —|šüyh øuèp{wú¢Üºo€Ÿ%ºþÊBßîÀÖEÕªwå`è~¡úúÕxNÿë¿&º†ˆºvÌé½XƒòÀ“(ÿ|\ƒöï¡ßVð9§þÆ2È/B(Aùip<H ÿ^¿Gnùý¯óí¿?î”ñfY ;‡OƒŸð~CÜ1»ûÙ{¿5Üýï‰Mõ-q+;~À7Ó[x÷Eã¿}>ëÇeì§úÃ0•úƒè}À †ÿÀ"`ðà9À’íX³Ø œ®Èš 1èÄîì` h—¤“kÖfIq¹#.}HŠ'‹K^ïðìyN³§Ùø/9êq39ÖáiYaæÞ}³Zg 4ÒoÿÅxÕÇ6qžñ÷}Ïñ]’&q¾.Ÿ}ç89š˜ÄÁ q !>›ÐZ,dÈNCžøØT†ÐXËŽñц­¤ê&L[¢Nª¶V”‹ƒ2'AJ¶t¬MËØZÆ$¾ ]þX5ej‡Fñž÷l`¨LÚ¿çyŸç÷~Ü{ï½w´ “wPÆHDÃL!Ò„1¦" “7Z*»†¦ a0ÚŠÄÄ4ƒcY¹.oI”Ëàd>™!ó£Ù¹®!ï³ät0`È'pÞ"·à{ç``0¸XÉM8?†ó¹ªëÈ ðºC€)À€%×MäÝt¦¾@È5`¹ —u8¾1¹B®ÀÐ>йW¸ÆuÇáL9bYÊ)2§œ<Þ'Æî–‹qò×QÉ!{«É%¤tv ¿„$@+ ° `ï2x—‘ x0 ÐðÏØÈ,àÀeT P­Žü1ÝÄÉŘì½<ùù=*‚I½@ÞÕíä¼nß'¿Óí{`­`gÉù˜UDÞLÈ#¨ckë„|ùÍhiž˜ðæ’)˜Ø ðZÝ€A€‘L‘’ØV1™D³°ï‰$†>Õíèu);DE^ kL¢$¯\Ð4$E>~Š”äc¯GI>ôCð(Éû€GIþæð(É[w€GIîè’ÜÒPœüü×¥KDwËN,ysÈ^˜¥½0K{a–ö"ÙKOt×@ÇöÓXEÌØ)ÅQ^!ªX=‡Õ X}«¬îÇê¬6bµ «¬ XµbUÁê$®‡©P±rö±â ¥«³X=Õ(Ve¬–aµ«v+qb‹=S£›€nF½ô¹»ªÉ•c´ÁŒÚ`YÛ౟¾Hè%DRIR¼ÈJmÉh…'Y®ZézÞ»–Ì@Ÿ 3èc€nÐ ,£hdÈöºÓ€@`u |Pç`'Àè|°0êÃYô|jˆgô9Sƒn¡%2g œ6bS,&Áä0­eœcÅ-Ö„•¸ßë(/—Ë㬱/²þõEJ÷¦“cdYàF¼š²ƒ±»1ŽOÄäIÑ[ˆ‚¬Xux’qØzøô£ååHਭEy ¬+&l„j91y©8³i­1ñ®0'~*Ä ¸&Å¿Hqމ†È[câ%a@|Ïç rNŽc0’.êÅÓ³ºô$NÅÄýÔŒ‰/ ÍâNAOD’‰®(””qƒÜ!®…öüÂQ‰B›c¢G蓪å´Î˜X Cp$Ý l¹ wj·ê ~ÝÇÛ”¥ìq6Ͱu¬‹]ÊÚX‘µ°f¶€ËãL\6÷—Áqœ‘3p„C\AÐdÝãÿ=">‡6„{;{ Çˆz´ìÙV¬©[$i¤7L’ÆÈ=[z·Q»9¢…í¿Ök÷K# OHwÒtƒÝ?‚:í¡‘N%â5( ûfx´¹µÖýX_ûªm}Bc­´±ZÚW³û i7M7Ӿܴ/7í«YiÖûBúo pÈ^Ý™´£$3ÖkÙöñ¦]Múâm°ï7OèŸÆLGX{ÊîÓ²4Ué­ôÒ@_ÊKÍC_Ê&kA•èƒéxx@ت`£JƒÞ.,ò%xÎÈÆÉI%¥æ”Áæ0ZÄÓæsŽ,Céø$®BÅÓç_6~Ít§qݗȾéвj[®-· ¶EtOb¦ï)ièßH2LÓB‰iKÒ>‚Ó¥¨¯RÞÝW¸›ß]´¯jŸóÿ†ó:âŽ[~Á“çÁ:rP8d#gyÜS´ÙFøB…ߘ7­Wx¢Ò¿x·™ô£ïòähÑA3ùUáÛ<9h=*‘£ò¾t~ ¹ÀÿÖL&Ÿ/ Ûë&x²½(RC"N¼±¦³Ž¬©éÉ:Þg&Õ‹WˆD6—JUVZ+«22™ç-…ÏKÒDFeAFF¥\nµåÖ•L¦ùˆÅÞÕ“¿+8Ÿqæ+ù$ÿše°ÇI‡",j²î–,ØR__Þ5œ…³†—uI,fw¸¿}‚Îצù;›æMw6ÍÝ™ßü9ä™›÷Ì¿”]åÈ~Ñô›ÝøR65¦FÝYV7}õ@)[f4ÚK–ÈËkëÜ2å_X†ëÜEF–/be\W·¼V¶— ø"ŒÔÖ¸ê˜ á÷Ý:´óÌÛ½¾‹?;>uÿ\4Y½!¢~ç[÷­ýîæg6ÛíxÝý±×¾qìûëOŸîí=ñÂÉ—¯¶í>æ;4?ð§ß õ==ý‘ç×ü‡írnâºÂð½wwµzìJ»«·,/+ ÄC`DýT£Æë¦åaÌ„w‹ª\B,:ÆH0ÇØ` ˜¦<RC¡Ä‡ÆØAØ$! ÅS¦MÍ0“дë4JèÔ¥€¥ž•q“ÎT£Ý«Ñ¬V÷üçûÏ9Km™¶¢dfìÇSsfN*ÀøÂOÞ“©›øtÑì# õk]ÏQ˜Š‚8‚Œð@BE®˜ýv9Š¡*TÚÃvÓM¬Áèà-!-í,$…¡$¥ð”P^AžÝ¦cǽuuÎÂo…!¢«ÕÛeî¥?‚ÿ-Å RI~ ¬MTÝ«È*Š”á2øK?"f\à¦Wípg ·¢Â4¹,9%„ªqÔZà³—’ñ8ÑÓ“éßé»$ œRhî9D¥ovÙÂ$‘¾©*¶ð> êÔix Z‡° ® O¨{ˆÜà Ü7 ÏÔB a0)$Á%‘f&7Ý8œÑ`ÐŽó0îhK-r3Ÿw h~ú.-2óXO·Nq ÞDúAQLï¤?C8$8,0}Ãý½¬yÖ%ö%îg²âlܴ̺Òw?›µž¼¨[gªµ4ëö³{…+®ÉuÝuÓ ‹Ç#ÓŒMæygAõùóCŒ ‚ÚF‰5*˜j†o¤ÂÖÚäËÛ3ô“pªB@€¬H5Š¢bí…á° ’F C² $Ã¥UÐh ÕÍ´¯ëZóÝÊ#×Öï>×QW×ѱ©nF” `çTìL*ýq*•ú sÿY|8µïËx®üâ…&-Ÿ‚@@#ªQJåÅü8]Ov‘zú HÇÊÀ`Žà~cfï’ üÖÃ1*oÉgFB 1XaT†0nS/Žà-h˜„ê`0Ûp-+q†±Ö"DÑ Ï/êtlЖGu—ÌÛ÷—Ékè O×zãûý1mÈ7 û“Ñ]µð)æ)]ó®®½¬¿âe§s‹¹yæ8Wa®•j­Û¤óÒmÏí¬î]ÓY+É‚™=[Ý;鈅ëa5¤¨Ù(èuº~¯Çæõzô^0§÷x)^䨙rÃDïêáeƒäéS-˜pÆçìGË'î#/# ¸XåÄž#U¤žÐ¤—Œ†¹}כà :5H3å»$9½%JZìp)IÞC#Y.FQ]=Æî "#F3c¦ú€Rð¦ÙÇEÄ9æ—¿|ýÀ††Cøœõß<üÁ‰÷.‘;;K#Ë.lºx{yüÕC-Ößt¿sÑÉóǶ.J.Hß¡ d ¨ãÞÁOã›xzš¸P\—E=ãX)TÚ*kùõ¶&¾Å¶-ë8odJÉM&Ž7Ó,öóÖRáf}Ø…Æ#tsœvõ’cÈMV¨£í²—¡åñ¼TSª¢lfk0 h›äJàâ.÷î…G䘾6ÃÄþÙ›#~|â(ëS ~áÉPª4!‡uŠ@9 W[‹š#2’±Eÿý8¢ž&«‘?'° {Ôžxýé£ófÙ$SM¢©ò…V[·ïþ/õÇ—W4´¥î]/_qhþMCÝÛkä¥Ë•žËÏwUÄåÊoï¼úçرè˜^pÕBi·‚;ÈupW8f5‹ÿ9MIÀâtËM‹8Žçû)ÚFQ4Å#Âñ4Kõ‘>¤‡Q¡]5"š†KP¿‘NågƨfÊ7&p‘ʳjŽ?ŸÝì+`Û,DsÏÛòˆB(ÒcNàÖŒrŸGA½`pл#düCÄÈÖ ‡›sƒ4€g±X@»Ì°ÄCý•Â|"}M5å…©œIaŠÎÎŽhCÌbP®Qmœj s›ç„95ær¼°N gÆœÅ0Šà<1Ïî)“½Cäð«—.u§ pì8õÖãÇSGÀ{†âV‡}̯ÀË÷Õ왞õÙ-Ù{­'¬p×¹YzƒÕežà¡ !&dê»R€ž`5Ú%«µßl±™­6³…þT«Ù(ÛUs»™˜ÍÕŽív¯6=k¡ñ€Æ&˜WõÓ²—cB•P/ìh8te8taä\ÄÕ¦Hçq²à=@qq—¹çÿñ8êyüšH­q‡%I 2*Â-ôV³>7È€¸(ãꌡquô›`VŸÝG‘Ènc¡’æ¿m?°²¡»³ua븎䣡³å»/`ýšƒ¿›…–íì*/q¿ŸJ­[’zøáåÝ]Ÿi]­ Ô´ƒŸ³ÑÔ¥Ž»ñTVµOuOU~(ÍSâT[¡¯”*”5úµÞ-ú&ïuý5‡È‚¡»Ç*~ŧ9['«üžJYx ¦i&60r“#Ûxè·ÅªõŒ©2Ú  ‚@„¶‰FM,‡Uc‰3æ¬rÖ;ig‚Œ>|ÒÍ’#J=±nƲ“£ÉY4˲±™î¥c5‡JZ}óç Q(ÒüŠmßPztÆ5qz|AéüçHéù织^üCãŸS·o»×ùÉPQùÎÙ«ÝP{’žk® •…žþâOËžMýë-ÉMx&®Ãï½þþãO¢''^Ûú´ÖS–‚kÌ ðì*Õ|‘Ç4¼‰ž6€#µr"˜6p| E-ìòL§ˆÇ¢¯1ü •㎪–*\ Öm~B ŒëÑêHÙ`r¶ðPëvÚt¢Õþ°.ô 0 é¥cý…’T´”êiM%gZÎQ ÿØFÕÙº'%¥%ntâûøò!m¦Ÿ YvC–ÈBèSµ¨ÀÇ;¦;¦îp 1†Þˆ6â:z¾Ú´š[Ë×:·£ÜJ7é_65rMüçïÄKV)ÒÝåU<Ú¢(“µe’ÐÇ+’]ˆË’sÛsq®ä“u̸ÿp]­ÁM\gôÞ»{µ»Ò®´’%K–%y…¬õC¿ FØ„ÜãÁ!`ü@ÄÛÁqñ£!M™“†€1‰Ëc\JÁ-0˜G¨1t×Ó6ÃÐ (éÀ´@KgœÐÒÉ0ËýV2VÒî}ìÎêîýÎwÎù|6É×q^À iÔäP‡ESŒ,²…XñöÓù®Žð˜pýDz‡ã™«qhâèÎ{æj¦ü·…#9£“l4 ‡$ÚÛÀ*>÷ÚÏèÁL’ý4¼ ¼²õ{ç/ü³¹¥ë£Ø·7nľÝþÖ¦æ¦44nžUÚýƺþ£ë×bR³v®ìû󭾆ŸeMÙ|na|aÛE¼¸©sÛõ]O&Ê»Œ®ÿu?"ãP±U§sÈŒ}Z}Žœ+7òMB¼™é–?£¿7\È&žVãJR!7™ä‡âCé¡Y`EVbÍŒÉ(P–Éä 'BŸ7ˆ˜^…í0AFaE;Ü!ø(å}Æ0HZ5ñâ}`B†° –gÒl¢‚VpÌ¢ ösöËt³˜ÄX3Uˆ¸["Ó-bQËîsެå¢ávX®}·÷m)pÀÏÙ"Ž"לb÷èœ;źíÕ 3U×K®Ð¤ Œ†»ä‘óÈHM´œ²Óe¾×kªN±†ç†ÀA¡‰Gz¼ªq{[$V;Àø™$?£f8†ü‰TýåðøžŸßÀÿÚU2ÅS@‡—às±×H î=óÞG¢{!ûîÃþZã̵N«`Ù’@e !Ð!t †·ÝïÒV¡Ã´n02’Æ•‘íKö B’Í—•…<^ìRšÏgE¼K5,ª¢{ª×§Äi$T´,Ȫ KòúQ²%É7Û“FShÐ=&§Û­pò ~?Jgà„t»±“‹å¸·‹²×Å•xFÐú?‘Lvr/%ÔL‚Yhe–m±Ë}×cûNÄ7÷aÜ£ó¿uzÕÆá÷ü3»0Ùþ“¯9GðøíöŽ3xùõk¸ãTãàǹ­Ñò×;nÞ7{ý^!¶ê»z8vJ<¾MºX&9¦³ŒO0ö/‰‘bâyÊ+gˆD%,S"´zØp/ÄX‘°æ¥Nj•Ø¢jW(ÒÆWO|ØØâ¸õ…hƒØë¡Æ!0©V?8&‡‡Ç thü ©y\BNŽ—ÃÃÏÃÒÖÁªôñ§˜ žè•íÉ™³ãîÉ‚é‰vZn¢ÍÌJ´`¢õú­ËoµIž®ÐnzŒ€ÿ·¡>4€Ø°–èz€¨MÉnø»ýìµê8mÛ>öT·µGžÆI·ñ:\ ¬ç‡uF…µê,š k¥¨@1½£ˆWt ‡43G˜ÉT0<'Dù^$‘‰Gù½Ãä xÜãpãN„ xžŒßÕÖ"báí$•gW‹›Ä?ŠŒ –Š¥&‹ JSÍUL-»Zú¡¹KâM„òaéeóBRÆ€ùäË¥WÍÆdÓËõòýÌ!Î`#³9—;¥„‡Ú'—òÐåÅE–EX±ãyÁh2I’Ù,#^ u¶¨Ø†H?˜ò¼Táqžf£¢‰kMØ4D*A•Mp… ‚D `HK«ŒåARù…ÖÑ(eè é?iÕ‘‰à‚W« ôÝÏw" ‰sŠ‹å¾nPJ]»~×FhòrÑsü-'Æ?q \µ¸– ˆp-®é0~tÜlÔg'ëª+§ýaóT¼¶:]6çÆ»ŸNƒÙÉú)T *ŠÚ"XW!œì|¹û¡8€­;q:®ÍMNB Ó³±Êc±*:4öïíß­ØÃ wâ÷[¡¯ë#øwÿ^’ÕSþNOõ×±Ïb›ñšs{# ò:cÐ!³mÅé–³±ññ# Þ²vÙ”»¨jb+ýš^A”‰mZÏ›ê>•¤¸ ÄäaÓtš³§Ù†l:ÍR‹h±s–º€.p–ªº$P¥®¢k˜Ñ-Ìú ÚÍ@‡™«èjò]t×y×åöÐʦE”ÐW¯zUeƒÉÙêôä°Zê*õÌK›(S+ù*ëG§Æ[™¶TY:åmÚàhVר[=[Õ›®¯Ôð±WN¤†f®h³ÿËu•7qá}oµº÷Ða+­,¯ËØ’‘Œ-ŽX ˜ÃìÖq`0`Ʋ1Åt(†ÄC8ÒƒL($å¬(àR:qRš@ “´P<¡Iˆ¡0Ä…&Ða,÷_É%´£yzÚ};#éÿ¿ÿ;ìQLšü¤Âﵘ(B6ÇFaé‚ D§“%±Rt*T6¯¡Û\¶dz]Rkö“ú åLËgJ?‡‰Ý%taî­§D“D“˜ŒÔT ±ÃÝQºö¦ÒYèõɬoŠþb×¾?¾Ÿ<ÓÕJΈ&n¼y`éáÖÛ¯\M^GöOUÏ®ÝÏYýÑì^TÝwÍ?ýNò¾ÉÏ6ã;QôRÿ4y% 'ÿäc…îìVû(r£²«×0H?ŠŸ%,P.dúž¡ëÇõ¶ì÷Ž»}tíðE¸áÞáü¯ÇÞô9<Ï ïÒy¬>x˜R¾ÔU©©æ—òMª•L+Û®ÞÀ¾Jd{Ø[ÌßYŽÑj]:Ö¨Ó±:V«ÒÛq¦Í¤–ëu­¥,*•Él³:Íf"ÓB´Å²ŒÒéevÊã.±QlIÑmFvÖ˜ßh…µß"BiÖ‡·ÁBCtg=“—C#– ÿX$ ‰•cjeŒ²Üh~´4¶(‘rfèo1›5ªs[£zXLŒrn#,VÆðŒçÌ|ÂbšMfC™‡av²Rs” 2™{ñƳ­úà“iþª²¡ûïV5ÌÈÍœúÚÛ¾}ú«û’!êtù¹Ö—qzK2ò_z¹H£l!Ã…­“uHŠZ 9ñø”‘ŒíœGΓ5“Ëe2¯€ŒòãÉ)Š2G‰0Aœè«$g*ª3üÆO{E,’>Ï(6’5ÁSœåz.«Ê³DSO/fk-­šUô*v5×"6{:ÈšNz#»™k_ôü„ÞÎnÏpzD†ÖP™`ÉíJ…\Fb9òˆn¸–Íž»8fÀDärÈ…*P jDÛõ î˜'×é4‘”3We÷ÚJU^"eÛFfzõÈ«Vjœ5ÿ±Qê‡ó?.”Œ÷ú¯ƒ¦AϤð’6óD<Cd(tâpº¬>¯èKJ)Qš†ýi†Ñl’™SÝÍ[}Šžsnõ²C•Õc’K¾W·ðÇ_ÿlßÃê4{ô`÷Þhºú|ÛªŽG»ÞO~óºÂ5lžñLó„’…Yæ¹9…ûj—½3¿î£µÌ¦-kg—‡Ã‹ýcN¬h¹Ø¼ü6ü‡°òéTŽ,ÑvByÀ·Ê)™ª7w¥ãÜ)¹ á ‰Hø|¥-œ*O¾–fd ºÜ`ü¦Ù4+ç‡À¯H®’ÙÆ¤¢ýö *˜à‰ðjâAlrBÂOzÔAmH[£íTvª¶i{µ÷´—¶B‹e`±ÀM«\JÊ^ \‡ SFŒ)ÂÔm—ô¸V‰j±R23´B‰Ú”Û”p ©“Æ1tF[ñnŒ±tGç¢*( ÞFõR÷( txÃqMÍ´'úã‰iY8h(Ì Í:™ôÿ’hZk §ÇVÝ3ôÏc*=’6°#=Cÿ(**–]?<6*%»ÄPoÑLi`AHã™HS*FøéÁs£Õy‚;½üÞ ø¦GWÚW®”eKþiè‹d”î˜/ø§bÛ(Â*ÿ´„º~î&œ6"¡Ì‚ì`²nÝ:IgK‡nÉxÙS„Ÿ(DŽØ­ Xi[ ›ÀeÚG¦ât3Y~näyQâSäIMö\n.áÉ{ðìç‹^Îëò†¼]^Ê›•º*8³"¡ho¨ÙcqÅ·ååX˱<¿˜€±ã mÿŠÜ;xã†4‚ýŃýRjÓD:®H²–žA$4[©É+L½ ">iö¾§pjMF“9ËKÊ x )/ÂCäØù¿­ï:3©yrÁâ¾…(\²aM«£ÛÒp©sá NevŸáÍ/œ]V=riÝ¢_z/VM<Ü>}ít#CÛDº!wÜÌ„%±ijlniÞÊ{ÚÇ¡k~žóO N®™]>î‡ÐÁè  ¹\ÂA\ŽA”–©ª„¢Š…n ‚›óÏðÂ6A>Ú0Ö4ÖVf*³Å•qúy6nú­^¹„^Ä6˜l½ÂUmŸ¹ÏzÝð•ù+ë—ŽÏ…!ÁꢂlТŠÙUÆVP ¨>ÇÙ·œ–Ë`drLØy¹©3xFc/i§‰ij4m™f9Ò…‰0éÁ¸KîAÝè’ ¨•#Y“ Ól©ã}‰ÿæ¢X'Õ?Uy8&™YàíðÀ«qD–ÛGß…Sv €rõ›¦·^èJÄ’_ÿþÌb©zeÅ‘7ZV$ô`kùÖš“w“—w¡íoWmºðá¥÷.§T Ý"õ6âBl’J‹~¼a¼¹ÒPi®1Ô˜wàäëô~n¿M«¤­êz\GÖS-ÚFº~S{BuR}B«5AŠø“Œ{»Œ]Ã’,’À:%”JB5D#d =ÄçˆTËj€6õ¼FaáežE¬È¸íð+DMŽ€šÂgˆHP+°"ß9›bÊļ5M­Ìššb$±Â@Óý¦”fVuÑ Âïÿ¯P ³RBÑKòðX¤b‘cßrÜýu_òßM·;~*tY×ÌÚphÿKõ[P»ùÔEä@ê#¯íÚk_¼äŸ\~w k"Té3@–.…¬Ãj,£=t„ž@SÆ~~Vý}c%¿ϧjUóŒ5|¯ðgê/†kֆƻæ;Ö)™!Ç&ÁnªM "‹tÞÈ®úà(Ê;ü¾»ï¾ûu{·{··÷‘ wÇeÈ¥U¸KH˜³l…¬`bI‰ŠPm‚ãG4 ­Ø6vR¦Ôª ÕR´„v eJþp2“Ø‘NÅ 8FEÛh¦¥©"—ô÷î%•™frû»ÝÜfïý½ÏóüžÇZÎUj7quZ½ùõØ­ÊFí.í}ú¡u_öê8È{UÝÈRE´x5œÁÈ6|¶®X7£Õè6ˆ±Û_rZ/ˆ³"a½ky1² »nXk'Rô|n‚µ,Ç^_B‹‘:YÉH ¬.4 `†Í/¡ÅWo{íѳ{v¼¹¯õg×Ï'~³§ã—Gê<ôØó=_¼Ð‡ù®_Áy¯ÔsþÑ×_9snô5èÙMÀÆ€¬ ôì¼³5ŽbAnß"´ÈÔmüNá»ò6UÒ!’ê\™ÿ-áŠ9—ø—G–ÄVø×FWÄÖû7EnŽÝî¿'z{¬“v§¹é°Ž,ìÓB¡uV«ÕfñVÌ׫÷뜮“¢˜""< ¸BŽÆ4P.+ÏhX‹Æáì¸]šeÕ)fÊÇq+£—ˆNIyöš–Íq1½6?q)žnO³Äšè bT{޹üÖ;–pû®y°1ÿŽ SLZ¬s8Yêê"ÿíáŠON~4ó)6ÿv{ñÕKÊà÷·ôäÏqë=ÕððKxcè…!-ðàE3çg>×G‡·ãƒ­Ü~˜ÍýŒ§np!tÜY`ÊØ¹.r}ĉ´E~îyV{I“¢Ú"m 2!¶ºEÑx¶XÒx/¦à —6„§Hé3±9pHÈ&ˆçÝXK–TgYu”X<Û Ïz!9…‡QMc…aù`•Á§€?Á>ÙÂLJlJídë_ù€cê•E*ÁHÑÁÎ#ƒúŠp§Ë÷îÅiÖ®Œ‘ªÌTf—1ŸòÛ;4E×ÛK·Þ¶làG8÷ÎS÷<Õ}uÇgc¿æËß9=úê™Wa÷÷#Ä_3ѱ“ÈXhÁPÖ&•|?¬þÄìE§$Ɇ$Ãc˜¼€‘/&ˆ¦ªxlÙÉTege<"c¹Ábˆ e«²֔ŵYýÖ€5k‹3muN><ÏC èìEDPCpõº‚Ò§s,˵§¡Iiæ$ 3B@n^êm/õaM !@Zz/J·àt¦0Áû)Ãí û‡éøÝMC{v®{"cðŸZ^|6¿™;´ÿ¡oþ¸+ÿGÀØã@1øxEu9-r¯Ü/È#òyJ‘—Ûän¹oîÒEyVVâ2Ì*‘p¼LùG0¢% m‘>ÒOȹHè™"" 2g„4Hó+Ü+d<ªtu„½Ø–ïjTf‚<¬âñ¡¡!ò÷±±/‚¤ô‹sLà;òŸÁwTñ¨éFz›Ìû´ Ó”ßÀ߯p~š$³àå§Žû˲2Ô!¨~Á½t/8߃+”Ðeòj"Øô+J“r?¿G9Ç¿GÅçh©hK5´Z®ÕµfÒL›Äf¹‹< <-Ÿ¡&¡ô#ñ?ôs)èWç G©(˜Ȓd‹ÔEÊC.SºC$ =¨(IªŠE¾Aa!„ Ÿ“J¸3>Ú ò¬Úˆ³Á!ðê°'önrõsdWäÆÄöùœ˜cy ˜ƒ„È2a!C€”á…7¢.å¤ï¡¯+759Š\Q\#KÅÅ9zböü`q ”7n9–¬I³Ÿf˜ å(†;N":;2˜¬Ä Z¬œÔkh¡¸g·S 7§›†ìFÇÿÁ’iÁÓL3çà®éÁ0»ùÇŠ Ç-Í®¡c…0ƒSX„MÇ/4³Ÿ>?sèQaøê)<0Ó‘ßÊÅœù `À`™‹Òž“Há^V˜€g+ õú%…ºÐv«cs}B\è.¤SÚ„naV À<…ã ddÿÉ%eTºá°jÜ5Ì$ÿÃm:]@®+P»Ü•°ì†YêbêAKA­SèÌI$ÏþÕY¡j dB~7ô~B8+L'¸”HÉᢄÌó©1Œ©*ØfšŠFteÜÆ½v¿ÍÙ¡PÔk÷Ø8[~¶{‹p¼s"ˆË¤l<Ž0ó”\1´ð(RbŸÀÇ“«çÕ|t~†øäå–|CݶU€ufs HçB `è7/)3PjzŒ"ìׂó’Â&;[]°ÊµCìPÐw€]«0‡–ÞÑñdü‘ןùxjÓ m?jÚºfïrRz°aóMÃGÿ/ãžûÎæå_Ì?É vv®{æ'ù·æ´öè–…F€ÀÓwD?¡¿Ç˜â§”0Î.> ã§ôñðÅðl˜$$ÓkZ~]L-MѼo‰ê*¯ŠáWm»É”7<æÚÂýáðH˜„y.´æÄ×ÿâšÞ˹Bé†1õ­üR{-jÈŠ¤ˆ OõRƒz‹°OñÏ5¬|/ZiÓÁª¹xMÃöÿbÏ;­‡ÖéÊPùÎïû)}òh]ÛÚ¥]ùû¸Çî½gÅÑü)@Ý*ðŒeÐ EÐ+N‹_T"žÕôFi#m–î¢wKRö¿t—lçÇß÷|ç»÷õ}wvü3Ž/Ž%‡ð#……&…¬$6‹„%$ãÇ5´@ ¥@ATêÔtj·IJ`cC QZ‘­c*˜–m¨4Ò4eü1”dÏë@ĤÎö½÷žu'û}Þçù>ßZ¥W¹Ë½óÕ:½Î=ß›Òd‰šÑ3î%Þ¡ƒ¬V;ô÷jïVœC¬‚ÒdY*,¥Mr»e°†¶ËÔ“Ë‹¤œ+"²P8#ÑÔ#Q °Sï±Dƒï}Ì ÂÜA&ÜÂCSýÌB¨’C` 32™d–Ò† ˜ƒfåO„²JXEx¨q§Z‘@9Ù~ží×óN¸þgìÞñðõ{£C—.tï»Ð³·ûçÄñC[Fÿ2òéÃWpV>¹õÉo¯ßú~º{´•χ¸èà„n›?”ÕIê,µNå«s2 å‚`iNipnpƒqĪ©&sÊù*õ|­Ú¨þÍö08ªÚ4;¸k´V7-²û"«Ô¤Í´‹òt3v–qez¡¯EÚ -þ:¦ÍB­Vù,Ò:Ÿ™;ÇÅ1c×,Ï„ªûtÕÑïìhûK´3[¶}pvó¦ó£­Â•×/>8vâÔèã×_¨yl9ýéµ[wn}üGHí½à˜o@¼4ôª9c²«<.àSüs|ßÂoæ­D“ˆD§Fd‘°-»PDI∄¥°áÄN.¬ý_¯¢×\›ð*ÀœÃÀTÙeOÉ K%RovÛw]c‹ìÄ™§22î~E¨†½'g·V7­œ=w®<>öÞÆUgã5ÕÍ#¿gý¾xó<üÿ)ø®¹ƒ»ÂU¤–Ì‹,¯ ï$‡ÈžÈçÅ¿²(Äã÷z¦ÔÿÁ#¸e§–bêMKi’¦i[ZN+mRi£m¶6¹MéõÆñX$)œi¤+l«c«› 6Gº"ÇèÛòÑÄñâïO9M$ŸŠŸNôÄ®ÇÜAhq¦žWÙ(Å£2åýF,‡·•ýÌç†|Õ¾zß·|?õÝöY¾o½ïžùû8ßϸeÀ}ˆ¹h›˜Sñø¬b³Žãr§ØÙ̳k)ŒKÒÁö ÌÍùÜ[ÈýŸéô¦|ý\Ó1Rw^Ì­(ÂEþRöT ˜®¹ôj)W]ÚUÊ•ªã2"Žð½ û0õ)Æm\>{¨sQVÖÉ '‡:³E»`. zÕ™MÍÎAØ6øÀîyÆÅÎŒOÊ+܈iª®:U‹5¬Db “`ÈsÁe¾½ €ÂŠ,ÒNÄ µ&ù ©A&‹IfSÆf’EÉÝ»™WÝÈÌ^ÆYáÏòx,^î~ZÅx@–d%ÓÅì¿'—XõÇ;·•GÝx«~Îô¢7v]iÔÎÉ›Zw¶¹Ý“{~y|yë]·ïâY¹ë:×Ì›Uà–>¿{QÍöD(¹`ÇZï’ô’Ђܠ“FÊæìL7¾óÍY¦EÆþÅ o[v]Bö¦ ÆìâUsLº|àse…b r«$é  ›C £0Vô¨ŒÇDi>™ß,n»Ä#"@EßωWÅÑ*^æÚO;ß2^, CÌÛ3Þ©†)Ó­¬L½É E2õ°uÆÊ/jcD §ú_˜¹ª½xÏžž¾>g2‘÷Þ;êì5'¹oÄbûèGŽ-,ö³µ¼ UsŸ!/ºr ùa <g8Ý)k¦…º+•tâˆätËØé¶AÁk°TæŽz=Ù&êÁW=سȟ-{ÖDýÿôsüïúÏùÇü¼(gB€ˆA€x²È7/COû'([eõÌqEȦ”ŸWíŠCáÀ [%A‚.ÊˤHZ±ZT´4ò$¿<ˆ8„`Ï“M“iln©Þygå©zÕÖkÓ^Z¼øÐŒÞ·{tÔ—o⎎ô¼1µfqÃáý\% F~Fr ŠW^,P k•”U³¢U0)‰ \ÿØ—=pÆOÎpÇŸL’—ŸB àêIÀO"7 põ¹Ù—(I!‡\ˆ$F+Q9]€jèr¼œ[!½HZp ×*µ’mh+ÞÊm—¶‘­´wsû,ÄýÒkäèy“~ˆNÒ+è¢xžÞD×éçèý ý•>Fô˜"z‘›&PŒVÐzÞ]0uwJ0Á QÀˆ(¡.B(²p@ È…1<@Aº%‰ã°U¤Ä‚°0YÆrX2MÈ#ý8Ðg‚ñ嘙ÄàL¶}ù;¶eC~ßHf$ã÷ f˜p3í~ŠZ–-ºw]ë²èΪ9X÷™ä3/”ÉÇeNð‡Nðñ?mÿÅ`4äM~uiô%>6²gíú¥[¸ýã gEH¸;¢sçMÕáÂE|!åjµ&ífÑX~’P~JÍ Žó›ùãP$Å[eâ´ˆOxÄ[mÄf—t9-.1W Ø‚`O¢b‘”´§P¹X%ͰϳÔXMq¡Tg{ÎQ£ÕêMŽ%ú:qµ´Vßnýž¸Yºd½ìøHÿ·õ1IØ´J(q{Â×'»¦£ }«´O:a9.ŸÅïsïÛÎÈ}è#ëeûo€ûî’üÇ?ôaëH®nHaQ ”J6Y¦ª¦A}ÕõH7úÇž7[¨ÃnüZ%CÔt=)ˆƒ¢ÊrT±»Å.iG’J.x »ˆ8,ê¼äÐd»B5Ê[tE–%IÙ¶ê‡ÝŽ¨ë‘ªàfeƒÒ¥X”~|Ö¤F=ÅëéË”£ýÜ2“Ôkx½ö²Æiìʦ ¸9K<Øø³}ø‘óQK¶-øg2^}ø°Èxÿ>±ëê“·>Î,#´ìؽðÙdøßdB·ÐÓ®Îd›³£î\¨áÅ^Å îçc÷†Ã>6Ћ¦8 ½ì>žþäµ¢î¿ìWklU>3³ÇÞÙÙÙv»]`»ô±¶ ÝØSk:+ô¡- [m°> •J„LIEI0D$£ÁhÔôW¡-¥RBD4 ÄŠ$˜˜€ `w<3»-hR«LLæN¾;gνsgÎã~÷Þý%Íxè䌳œ1ÊRd7×ï/^Úji/p†’Zµ³--4BBæØÜ¨qvÐ3G„ôáä—¦Ÿz/ÃzÏc\âCŽ˜ H¼Öi×mœQ4ˆ"Fs¼æ15ž<ãÁzܧ™Inå¸7ÃLô¹L>CÕ'Æ÷W9Šû?û°ôÑ‘ÄðXÿCç1é?¸ê9I¯›è=õÝqïÝsð÷/1û òѯ˜ý2õê!¢P$œ©±&dj­dc×çÞKÆÓÆÙqç)â"zº`¼.ŸK© a+µKàŠ”ޏ3.¬t¿Oõò½Â!zTf®²³'YãÍ̦J®2§a·–&˜^fib8Ccæó`¶&›+ïÓ¨p¶æÒƒÚ$AÅ­SòVòSq†ÉTå(a)BmKôýðÉü`4wè|âêí‹*?Ó*qgq¬ºø^Bœ8CÕÅm&{e'–2¿`üÔö!¤ˆùŸµˆÚBxF—tth(+‘ÍÊ)º”tɯä ùb¾T&–I¥î>Q"Þ%éq%îû:•No§¯›Ý$u{6«›}oJ;<;•Þ·Ô^~Ÿð¹<æ9¬ÞàRoKòÕÎF eädþLÕëÍUxˆˆ„‘+ðª ð^EEe‚™‚r.  ÒÁQºê ñꊮŽÒËu¡JÑz•rD¡•Qªz„Pa¨ÉâÍ&…„]‰1±QdšDC¤Eì1TDÐXºj8+ÔƒäÈ”'Öã¶£ŠâM¿|ëj¦|6¿|Ó’Àonn&CÌahñî/t§b¼Ý (2ƒg¤gäˆÆuŒëÔóQ5.”k|¸\sã"|ЧyÂ>-NkJb<½ù澠ܼî/AxºÀ½Ãëê#ÑÊ%ž¼4!ñòÑ‹…á9…W†] sb=-%‰Õýr$'k-™åˆLômÜÚ³‰^{ïÄ@u¼¦J×Ì [¦Áœéj Ûầ°;œ—pž‰|+€ð€ˆzipf@öxÊRO›ŽÀm¬ºòìHá>2Ü~ìXu ¸.‰Y½ÿ§“˜³ OG²¯Ì ätä> w ÿ@dM/áF¿­˜×0uE½IÄð߯1Šq¬’½eQ­ â@å×6lذaÆ 6lذaÆ 6lü4P`S¢f,ŒU»¬šÈ xU_z†?35Ù!'7"PP(Š—”–•ƒ6ÙZ Õ<¾xIm]}<ÙØ´tY3<Õ²be¼õégfþöR°ëÙ £©nðj ž€åЫ ^nÃÀ~f{Š`!¶/†h²ÚÛa-l0 ãÊôWÊûW˜{pБ‡k*eˆWRfQò›v¸P㇜”L£m•)™A}]Jv ü\JfQÞ\SWSÛT_¸pCg{×t2Ú^gù§ ê¡}±=Ô]° ^„Õ°¥vÔM×ëßêѲ4«*xÒÐý_f‹üþ9m:€Ú-œ%óiò´‚Nš*ugÐ1¦Ýœ9Ìi®éMy•îÛûîozt©¼ÍeqVï¯ä˜÷Áú�;0±Z®àÀœTÒ÷ * þø endstream endobj 31 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 0 /Descent -216 /Flags 98 /FontBBox [ -498 -307 1120 1023 ] /FontName /EJEJOC+TimesNewRoman,Italic /ItalicAngle -15 /StemV 0 /FontFile2 32 0 R >> endobj 32 0 obj << /Filter /FlateDecode /Length 9764 /Length1 18408 >> stream H‰\V tWþö>ÿošDP•x67nD"Ä#^‰Tî•”¦bIÔ˜ÜDBˆ–´ÁŒWÔ«Ä»­vŠ rƒfZ©êPj5c)3C©R´Ê’äžÙI»fµóïõ¯µÏ9ûüçÛ{{Ÿ J¡Æ|‰‹6fúcÖéÂjôҨÓWµ‰xu4„ƨR3ã0ó°œ(ŒÐ<„ †b|ŒZnõ\5|‘„W‘Š4äâ€Ar¦‰dTÒ/'¥¡ŒúQ­Þ ›  E^¢þÜCÁ‹C_ ÆPü k±—¨'Å¨ÞÆaˆO.&?ò§.tToA H&Òå(Ç.œÆi ¤TŽTæGžÛðÃtAX‚2\ÀCò¦qTÌ5jg¨Î×ûõqÙ-ç80Bp—`½x·Q‹O%&uÔ™’i=Ý7ŠÌ¨ÆùžsžëÚ_?DKÁ:y˜†7±TróŽá þƒ§dµ¦cÜ‹¯(?ã3@C/nb"ñ’D«‹±Dä°ìøœlÔúP]d?nÉSù ®àïÔRU¥þm|£ãõNý™Äü¬°‹„b´dµD²¶Rr·{QœÄ·x€%’ùTFUTMOøÞÃŒ³Î| ·êøH´CŽ^"}$‚ xY°LÃ&ÉÔ8#5ó Ϩ# ¤7h1-£´ŽÊékú‰ñY¾¦ÊÕGÊ­NdDùf™yÝ’buyÊ=›ôHñ®|»¯ð&Vb˜-\œ)œØ"q܇C8*Øž ^âÒF¼ ¦Á4šŠiͧ•ô]æDÎçé\¨HuVvÕU-1 ãœqÅœk–yB=éº'šxã-l,¸ÓD~9e®H™Ä¡•lÖÞ6?F½œÆ’gjKAÔ•œ"c%ëi4‘\”G%ôUкϭ¸wᕼ–?à¯ø5C½­6«ýê¼òÚô1£DFšéâo…ùÈ2Ö²Ô:ÌšiÝáõecXãÉÆk_O[OWÏÏ=Ñiz¶~]oÓ;ô]©k›+U w; ¿l"]ÑS*g$^ÁDÁ?3„“˰ «EvˆûqÇ…qçð®ák‘[¸-™½ÛìÓc4ˆOíÈN½…/Ñ42)‡ in³,  ´‘6“›ŽR-¢ót‰êèºÈOô„žòó܆#9šœÀ£x4gq6ò›¼7óv>ÄGøsÉòE¾Ä7Ù£:I&œ*QýNM”ˆÌQóÕ6uHýC]Puê†z*±1$GA†Ý1¹ÆBãºÙMâ4ÉÌ7ß9fñ±ä[*-û-§-·­k7k¢5ٺݺϪ¥R*±FªôW0n'uç×¥¢Ïø½MgxŸqý(æ*p„.OÂ-^ªB(VSG©ã·ð2+‰¡oåawÓ3Zª¸ð0Õ¡hnP6vP’ ï!ÄòTµð\Ðñp°Ök ŸÆï%:3pYW†ËQ_]–h*0Óô#O‰¹c‘cÞ±Æ`ÇK‡8+wQ%Âè{î q”™A©cU}=§ 3? Ç(¦•RÁâIªtŽJäÒN±5ån*·À3®®™¤fIŸ9ˆãÂöyÒÛÛp–Ü3y4,·„Ñ|l6<4&cŽü=$ãc¹M+D{Ñü0..nhlÌÁƒˆî×·OTï^‘=#Â{„uïÖ54$ØÞ%ÈøbçN;´oàßö…6Ï·nÕÒ¯…¯÷s^V‹i(&„;íÃ3lîÐ ·jOLŒhÛ]2áúÕD†Û&SÃkã¶e4›Ù~k'–9ÿg÷³eÜÿ,©•m†D„Ûœv›ûŒÃn«¡ñ)i¢¿å°§ÛÜ÷šõ¤f}U³ÞBô  Ù`s¶ËsØÜ”asº‡ÏÎ[æÌpÈçª|¼ãíñÙÞá¨òöÕG4w€½°Šb©Yáç *†W åî`w8ÝííŽ&nâtMr'§¤9ƒ‚Ò#ÂÝŸeÏtÃ>ÌݲG³ â›q[âÝÖæcl“›¼A™­*¼vÙòšVÈü/íUÕq…ï{óÞ.QT¬ÿàÏ’-  "Z‰ÖE]ª’Äh€,b‚Öˆ &¶1ÚjhµgýÅhªQS“š´šfEO\´"h[µšÏ1Õ¶G{kQë16¦„éwgß[lÓsª|{gî{çÎÌ{çùÓbËÝå¥%¾ (-â9º§aÞÉÁ>K.õ½Ó…ñ¯Lò­Œ–&ˆ€·ï“.î+]Á3|ÑÒDþ-*‚ èêI¹þ@.¦^Í›Ø7ްû¼”ð¢f»½ÌñÏsïsOtÏ Ìóã<âAš¹8±.>ÞS/ÿDñ^W ßçN NHp•Nî¿«'f.ÞÝÏãê×^’>tW\÷ðnîêÚÍjÄv‰nÌŽÈTK çVÞÌÈvjì‘{*¢ èzÂO|n,$‹fgQà‰, ÿ" ZÁrÓÁû&ùqÙÌgý ™çv>!»»åoí9¥Ç‘÷ q“ƒ#_Ûí`ZZ05•ãÂ9  ¿®ú£Ò‡>Ò¯ºĹ@°}ôˆjEÙØóÄD>ÕU!•¡¬šá ÷]T–PGžŒ´¢ îgÉA[Ò«€%U¶$¢îw#|÷ô Æ$GþºÅõîá›Ôzÿñì°<ïQwÞŒbŸËð[{›—ß®–gEdV+Øc’O$èVKOJŠH,‰ æŽ/6h$áÏ¡"¹<äŒA(*ŽæÊ Æù§„‹:%&Þ£RH^g-Eî¨Yn³ÓÚ÷h×oç^l@Àa#YÏË/:µ“å"í¹nWnÀ( ɪ2·+ΨÇ/XàõÛ'’ûV%sWasµìtU®ñu•Øæ¥Çb*ZÍÖ¶˜[øvqF×sQí«õç–n£†^%Z2>|^ 5´Þ1–Ê´w´.­Ökd¢AÚýæjÐI^o4ô¼úX¹ã—K0ðSï@g ðUØx8ÆüFg •å6à´YH³IAû pÒl¢µèÿókä>³P7ÊG<€väK0î(Û8 {]…´ýsÆE°ŽÛà//½V1€ºècéœ G ?e$¯é5Ú\è F‹5Ì£P>¶m+äÇÑú;Àï‰ötØwó8`Æ M‡íTØm<Ÿù;ëqÃïPY“Ikô‘Ô"FÊoùÔÓZ÷«¼n^³½&åا»»lÛ°wpÇ·/Äyøô{ÐgL¬¥U?Ao4ß ¶½Žž´Šá<‹s¯Ñ¶±F9õsáãsBŸ1 (†þ c›<#n’²4ÇË´ü)z&blÕéߥK|Ýb½é˜Ïä8Á¾­W±P®öMhüE¾‡6÷“œ´NÖ>mã½q®¡tèÆ\WáG‹±P ßou@5ûƒù3°ç~œû^­°­vº#ö¾ ú–†!/"†«ÁËÁ¸1D/X󜉢g8ö¢as6ÔÞ×àWCÀ-ø’ –BïCÐ ð‰XlÄø‘¯ˆ‹ëáØ”oql Þþö]­ñÍ1¾7Ú}ý¨^t½fá£î Ç,ûiÙnáØâ˜±©GõZ¼›yWUwï¥(°vŽ­ŽãØWô2î4ÓM4•c–mFh“Êãø>âl“#Ôò‡ï'òÆyE/S¡ëãljíÅ‘]#ßl©£m7F"öC¸)Ô[Ü@:=|Цñ=66Ñ+ú êé¼B8Ëé°µ¥ÝÌp6kó`ï ö³Ñ8A[@7ÍúýF³fšµò²Ñ¢4kõeܾ›v„=–)#Zöeùÿ ôÌZ¼ákå_Íf)fÚ€µ’óŠ6pÙü:  HIÓ6ÇTh!gÅ!nn•†‡²Mbî M0z©ü~ƒ°ÿå¯ÒB|·vZ²£–æ‹ÜQÌ¥@ËltA$ŽÂ±–mÓ»bÉ¢v¼v Ç8çsÞµ©º{È«õµëgÓ׸6p~æúÀ9šŽWùz$.7 †|x'>ÛÇ©¼Ÿ/ÁffǸŒ¢˜rmáüεóÏÂüÛaë ^¿ÊÈqœ#9ÏáÎ?dïH#ú5Ú䇽*Ÿ bû^|Ï?†ìA+ Ó•+éqG!‰1ôÊGSh–yŠ\ªY5Õ¨“?S¹ ÷É®¥ªŽ6Ëu‘::@Þç3yTå›C²žï§ª›¨Ÿæ­‡yœT^YH¿R÷ïà§”¹ Ä/s[å"ð2Åxä^ðÅU*V²³4H,‚ž!7rMOQ’ªge¥˜@”î é1>EÝ~µÂ²§Æ€š›“x 8ütHå‚bŽêjçc>{g…Üïœ%;Ê©Ñ|ë)£?c-'Ô„d£ÚÖí#Óy/œùr½¸%Û0æ· ¬S!ëÕ~`¢÷BÕf~SÀ¦£’6©ý`åôQŒO^b˜sé9Çg˜s™ãQK&Ês¢¬V¹Õ·ë„ÚKã9îÏH)É“v ”$–Ê7̹{7Äâ§pÞç7 ¿7ø aþ’k¿ )Óx§u"ÃHA\VбXIÝÌx‹„ä‹ê­ÐLƒ…!kÄR¼oÂï~#¨ûR)ß4ë(•ï˜òsðÝÇyA.-D.Éq®’?7t˜…ýžÌ¼Vÿ°…#ah§Âc4ò|ýÔ‚v ÚßÔÄ÷ôÃï@ñ¾l/È£zµ\&£â¤<­÷§wõøñžüL¼OEÚ5jUtHLÅ»i5‰cò’8"/èiš>Nn»¨B,—'ij4]< {ë鍸±¼.ÖÊubbô:,~#WYô®Ñ¶.P£öCÚªÿ¶:¤8Ì—£ìWÑ:Øï­°q½h(_mÜís™žD±–¿Åíüe_m?mmÿÖ¢–YþñºÙ®ÒÃc M#’’´mΤ˜óºÊY^äžä¢ÇiäñDŸßö ]±·€Kh?ÐþðOàuàiŒ» 3£€Aèȧç­æµîF»‹E÷eÀpõ~íð.ù?Ð[î•v¨C™kÊ—¢Þ{¢íj}þ_D­ÚRrµöÁ^G”?ÿ©æµ£ˆŸë?Õ#ïßíõŽð„@Ó†)Z7xȈ° >yDUN±Ÿ~¼ œ`¿ƒ]ì×ߦ„Áõu½”V¨nâD«1:+ÜØš>â9ðø»è"$êipXk÷àa#®çtCƒÙ½¤ý‹õjâºÂ÷ÎÌάc¯×¯µ÷îkf×X{gÖØ8¶wÖØ¦ÍÖ0‰¼cš…B‹cÚ45iP‹Ó$?R5 m1Ò ±4,‚¥J•øUýÓ*jPJ)­äô¡(r`{î]+´QÕþéÌžóÍ=ç;çÌ}ÌÌ]žÂ_äÙ¤Gz ¨m¡]ÊØMƒ”ŒíõA¶?¼åÕ Ý ƒAVæâç†t]]m$‹óðÊòË€àŸ ¤ÓðAäBb@÷RléÔÝ4SÔ`MX”,¿j´ùÙGãa ø €YÚhÔV]¨FÔ_6‹U(^¤6øõ™kP óz":%íDl"?ËÍq×¹·9a–Ÿã¯óoóÂA`½Ìó„oáü?Æ;Ê“mÜLîèY÷@xÔ:rµæ` a42"¼sà¥W ºŠ™gìSú|`Þæmn N NÈbÖ·cÔŠMÌaŒŠ0‡œ¨¶^î §™,ážá‚(ŽdÜÍt;Ó f}\~9.?—÷Æåt\Þ—?—WÇåH\Nº¸6äC2×@5¾ÇôÏ™ÞÄôj³Þ'ÿÅ'_óÉßñÉOûä/ùäÏûä1ŸÜç““2îÁHFÝL·2ÝH5¾¾|°]Ç÷Ñ ’ùyÚjD¸j[“We« §í½B’uœ›5 ^HDXAÚ1ŠÑ·þñã€oÚj3É០Ks&«ñ¤Ò(ücäÅ à(ËÚ¯£Ã­àíàû…dþ>ìþ¡0X‘ö÷;öIVàýP“š÷¢£õá˜X ÚÞSä*ö#/G›è¼ú4¹ñŠMþaäœØ&帬Mîª9 ­ßƒï¤MnÇ e–ßÅn“÷c'È/Õ‡/’wԛ䦒€øVŒßTY’s^0ÿTlyU=E^)äž 1Ò7`0³f%yº4¼MÆ!Í®àSdG!ÕhÝÁcwXkî`È`Æ*M\I6ľHÔ,Y»Iz‚;H'ûE².t›´Y­h…7{¡sp'MÁ, Dzä±ö«øHÂ3 š•2Ò„´OÚ#¥$SêÖJk¤€ä—ªœn§ËYæ,u;NÑ)8a›é¬Êåo™°áÁ¨JtQªvíâ¨E?)vr°%³*ù—îµÚµTNÊo±:´”U´iÛÈ<Æ/¥qÊZüJ=é³>æpñæ',G°[îJmíõÙ⾕ÃhëHçiÄñ˽~¾YØ<þbÅôñÓiTs8áI¸{*Ö ôýµsEköÑúnjxÄ:Û˜¶tz‘oL§¬ þí#—¸£Ü3ý}—¸#Ò#—ðw´ µã¾ô'4XPG€‹úH–A^JƒÕa´h )(í "ŒFðJƒeFyóYÒß7Oãã(Ë8Ya¼ÀQçοp.t‡qî8\¬\-£„B@‰…(e>Â|(ÀÜ›ºƒ÷Ñ‚û(så¡Û(¸ÏÜgÁ­ýŸŽÝ½ÿ‹Ñ¿o¸§6Ì;QozýöÖ¸Æ{Ø:¨¸Ð=Ýp¯âJ´´UìµJ‚½(‘ðh®.Ü2*–Z"Ø$JÄïy¶á²€`È)½ÌòŠkMrM’º`9SW˜ËW\žgñC‘3+.˜+ ¬ãè0¬ËýýVóN€`_yú÷õÁo&ᘚššœ<4EP‡SV÷æ'FæUµßªÛÙ—Öú=ûúý—þ£”Õ A $Iý– A““‹Ó´©Â䦗Ÿ>lŒŠ´ÉOì˜æ¤Y4 CšËÿvÁ»Š}u/h†GÕŒKðëØ¼Û ä4ž~ñžé@#Ÿ°¯’®ü]þE°l ³¶,¡*ŠVc-ô Üéè ÷D¾Í½à?Îro„.…‹ z®^¨sÔ‡ID<®â¯‡gÂ?ñó5Ü »O»¢A ³,Ø6™‹p„"r]E çCÅ’B§Á•Pè.)à]§„ùt£j¼.,O·µÈ yH“…r™Èœ\ßL7†¦WWBÇă¢0-ž-qQ|GtˆuMÚã º?:¡ þq£ëÅ¥¥Û(±¤i‰¥%\á^·Îuc4ÖJ§hb&ß“…ɇ}þ.òæïvt¤ÑžÕ4Eƒµ-îzMu•Thõpmñ° ˆ’X]UcèkÛù†½¿:üÒlû_øòuUi*o)®ll{r±oË¡]ƒ¯îøÍÑ©Óß| G.mëíYˆx+}kªJªËªf2'Oîùêànx¥›00õHA̵å®Åãò(ú'ÛåÛÆYÆñ{ïÎ9ÛqÎgŸ}ûŸc;þuvì8þ'®}Iš.‰ãÑ$JJÒ˜][Ú…®©V¬´[µu¡•ÚIÍÂÄ´®-[[ÁÚQRn)Z†´IüHC" •É”?ºŠ ìò¼v²?—¼÷ܽç³ÎÏçy¾ß÷À#Hó„vLGúuÁön]¯cˆÖë†ô;µ;¸Éö%ú»ô%~…~§óáÛ$µJ‰’¤F·ÇÌh|ΣU¶’V»&qzEÒË>çßžcUø¢ó,bm^åõ¼BÚ Ÿ­?Ê=(`9WΕÍéHQ©'Öœ&L8½õì‰âVc†GÑaÐ&}N»u†,>_X+ýi¢ˆŠüf^ÅÿI?ÓàK¦’ÉDgÿ>slfèÄóÖòïϾ\BÂÒþ=ý;¾wpõåâ‘#‰Î=E ±¶é£½»[?)=¹Œº¯MõNŒîÚ°›©ï ã ­ž¯n£Ö4gˆä»IPð83á…sÈO*¹UìûÓmTý¸ÏÛmî8¡ÂnP%UF3 –‹âËá¦D›Ëç“)r Ÿv{h™ðõÓ´,û,0¸e©ky‹'L · ßnü„Ê{¥-Q]+!:eI•#¿ìò„˜AO³Ñl² ‘Zë&³m7Z¦‡:-?£bD …WHšêTuC{.Ð×Óryˆ$Ì@ƒ‰®£×çèà Ü,¼?Š…´K¹{¿ÌÁå.W)së˜hmÔC­ÿî—~z/-¦7éwFk½÷㼫IÈq£mF#—åpÃAÜ€ H7š«¦g¢(ˆæ†ÁÉZðnà™Z÷Õ:4K¢†MöД>/­´^áο·?añ ÿüb¼káîéoþö‹iE:Ö1öüãŸ}ÿr¸0=4¿ô¥Ä®­þjÛØDfêòKïççz©ü×’‘öîmt†8“¥Íöƃãß*ô>žPŠþâŸIZÏì8óg‡óÜöÙ¿)|µgÏë•ÃíOu÷+Ù¯|Ûx™tôpN¢—Tj6¤Ã0ô¸Æ_ã-Y‹‹Ok#!‘R„cÆuãŽ1ç:>é¸ì{Ó‹¼åmœE³þw5£›qÌ8©} ûtû ºÇoÃTp,1ç¥Æ dqÙ< „È x5oI†gü‰h²íBDø¼¹;iš`ƒA–œIr ‘TäPØ …Cо¹QJùR8ÄYNñ%4pÃÀ´;Kȳbh—°oÎ&¤¹¼’X ãrQàÕ/³b:T¿X =µp#×¢ÛS‹+-µi•·Ùã÷B(dKIbH”RúØ‹uÙTr¼Êëë÷(#îV” MÉe5Šj jªYH4ƒÌ”a¡'`pŸ–•ÿ O¹µEŽ=ºª­«K±XÌ_¡&ñjÊéê†úŠ>_[Qæ ½ êå“ ¿aª)¾.ëL.DƽyÊøÐꉟþj6Ö×úŒ•ÓL‰œ\œèéh¹žì|‹oäÂtDŽ}û§Ûnpx¨“Õ4¯÷'2Wws,ßœâO¤}aoô0:›ZlÍá.Nî¾Dš…6ºÁCÕê×P3n"†&Ôü$:m8g¸f¸Ý¤I[óÄ6v›u(8Ù°›=Ì.دúojon×ìì€k;1ÅRQ"îR 5y:c,Kv1*€·G­îA©„®¨¬ßuŠx!EJÔiÕ… ÃO°„›•í’Ån—¼}#Üe´#{—_²s¡[   ìH0˜h |µ Z F•_`Êlg2˜;Œ†¹Eõ‚Ò)?’Üî’>ö“X®:Ì9|¬š[àDjß³#ÉÖeí]úÕóéÏ-#zæãæW®Ôy)wë3ËÈ\K .¥9G@l–Áf0uSÛ/²\¶£ C* €Ù0Xûjô….¦ ,âsì ë U·v½7øõ·¦§U_ýG¬ÄxAW è‹}žŠ(;[ã²ûâs{Çû†;ç~×IüÛs{NÏÿ©šZªÕQQMíít÷³ÔÜ„Er0¾ ?Òshù7»¶Oþë2¸>±ãáÇäú8¼46Ü$4 óÆ´Q5¦ßÔÜ#ÿÍR“Ò)â¢<­=ÄN–2:[ä³Î{NÒA°FDk†hmqHÈÞÒêhÖØh¤â6MSKÄÐC¾Z^lðm‚ì· 9l¤`IðBÔœ“øc<ÅÞBˆ`Àß fAM¦ãw„R(¡^U/ë@~eýÓ£ .€ÝZ5 ªß’ðzLÀLkÚ]yž€×ºëuR˜‘¦Þª¹Ì:,ýá@‰5Rà‹Ø4™ âÖj‹´â<àÁÙ¶þÿzÒ‘â£çL¯]mám扶Ùñît¨Ûyåý³3ôñê?s••ÇZLf·e¯íÅ”7¥$Ÿ„eãé%bãÍb:+ƒ^ù/ûåÓD…á33m™>èeúp 4Ð"MPZ ƒ Z¥ª„J@ <Ô–LÜŒ‰šèB>MÜ)š 6$ÆG\èÒ+èÂD!j„zæˆQcX°0s'ß=çÞ¹379ÿôÜSq’­qÖÐÖªŠ=qaÐ6Á²MsÏàg<à×™(‡Ã£ ¼%aú®‘ ×{cÞ.ï"·d[ gäÖ 1šŠ=Õá›]_É ¤ØÃ×ù++Õ[š!€ÆE„\BÇ63Oê0Ë $ÛtÞØÍHU/Ü#bcι*‰‘.r‰Ü$z2KD Ö$¢ŸòåOYy%ËJæ!.—m.§X_@¶Xzå¼Èß²ÚYgäíÄŽ›šÆŸÈ¢ˆëéV:”yÑm­—_€U±dglaYÎ}Ÿ:³ä•o1¯&cÌÆÂOÊ õë5žR À’ ÒÏN>ù)IÖN©œÃæð„BK¸)GòµšŽbÖ«íUÝQóYÙ!Þ’÷N:bžÞ÷dšsJÚóbí¡J/3;zçÝQ¿èëÈÏ1q;"®h\ •yxœ\ÁàL²ÁÆœXž>ë¶æ¸†ì§k‹}îÂêÈ—•÷¯ÄŠèuªj”·ääuÛR¡Ò²¢à…•¹I7±ïšþz/¨­_ãwP˜n=+#ðgŒý 惱<ȲhhhhhhhhhhhhüŸ ”ü¿2É£¶#ØŠ¶š["Š»Ú±ï8´%ûþ[ÓA3ö`1B:èc0Ça,ÆÙè•G©t:=¿z©q\o @úã_÷`¡O}Š{JÝ™ÇKñ è%etFœ b Ÿ†mpNõœŸR}ú/TßAŠjŠ4Eb¥ñáÞdkïxÛèpbÄ×’J ôlî4AD&P q€a GZ±‡6ÅqÃãƒH¡7„+zp¾C8†£œÜä;¶ò)E æ |úAφ2h@yΘa„iI(ê2ÞauèI£U }´_k¿Ê^ DÜdLú¸à%[Î$Uõé«×nLèÝ]YÂ"ëdåÕ·]³s’}}óõ»~ù"»Ä–ãPúä7ÿ`EÇ.ï endstream endobj 33 0 obj << /Type /Encoding /Differences [ 181 /mu ] >> endobj 34 0 obj << /Filter /FlateDecode /Length 216 >> stream H‰TP=Â0 Ýó+<‚Ò"±UÔ]=MÜ^$êDn:ôß_R §ü$?ûé=[ªcE6€¼²Ó5h-ÆÁ¬ì,A¾cuXºu¯<È(®§!`_Që („üŽÃ!ð«¯|“­A^Ø [ê`uËïHÔ£÷Oì‘dP–`°òpRþ¬z™dÜmòÛ¹ÏcgpðJ#+êŠfW¾ÉüŸ½M«‹×f–íw¥ˆ» ›Té”O=2Çló½s„dn ?/ñÎ'¯TâW€Æ÷hø endstream endobj 35 0 obj << /Type /Annot /Subtype /Link /Rect [ 209.7081 356.5578 315.62006 368.38165 ] /Border [ 0 0 0 ] /H /I /A 36 0 R /StructParent 9 >> endobj 36 0 obj << /S /URI /URI (http://www.mcs.anl.gov/mpi/) >> endobj 37 0 obj << /Type /Annot /Subtype /Link /Rect [ 196.91229 325.48322 309.25302 337.30707 ] /Border [ 0 0 0 ] /H /I /A 38 0 R /StructParent 10 >> endobj 38 0 obj << /S /URI /URI (http://www.epm.ornl.gov/pvm/) >> endobj 39 0 obj << /Type /Annot /Subtype /Link /Rect [ 205.91437 273.77148 336.79901 285.59534 ] /Border [ 0 0 0 ] /H /I /A 40 0 R /StructParent 11 >> endobj 40 0 obj << /S /URI /URI (http://www.mcs.anl.gov/mpi/mpich/) >> endobj 41 0 obj << /Type /Annot /Subtype /Link /Rect [ 209.45763 232.37828 379.02679 244.20213 ] /Border [ 0 0 0 ] /H /I /A 42 0 R /StructParent 12 >> endobj 42 0 obj << /S /URI /URI (http://www.scl.ameslab.gov/Projects/MP_Lite/) >> endobj 43 0 obj << /S /title /C /title /Pg 180 0 R /K 0 /P 139 0 R >> endobj 44 0 obj << /title /P /author /P /authorinfo /P /email /P /abstract /P /heading1 /P /p1a /P /Normal /P /figure#20legend /P /Numbered#20Item /P /TextBox /Div /Frame /Div /Footnote /Note /Endnote /Note /Shape /Figure /InlineShape /Figure /TOA /TOC /TOAI /TOCI /TOF /TOC /TOFI /TOCI /Superscript /Span /Subscript /Span /Strikeout /Span /Underline /Span /DropCap /Figure >> endobj 45 0 obj << /title 46 0 R /author 49 0 R /authorinfo 51 0 R /email 54 0 R /abstract 58 0 R /heading1 60 0 R /p1a 62 0 R /Normal 64 0 R /figure#20legend 69 0 R /Numbered#20Item 114 0 R >> endobj 46 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Center /SpaceBefore 0 /SpaceAfter 23 /TextIndent 11.35001 >> endobj 47 0 obj << /S /author /C /author /Pg 180 0 R /K 1 /P 139 0 R >> endobj 48 0 obj << /S /authorinfo /C /authorinfo /Pg 180 0 R /K 2 /P 139 0 R >> endobj 49 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Center /SpaceBefore 0 /SpaceAfter 11 /TextIndent 11.35001 >> endobj 50 0 obj << /S /authorinfo /C /authorinfo /Pg 180 0 R /K 3 /P 139 0 R >> endobj 51 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Center /SpaceBefore 0 /SpaceAfter 0 /TextIndent 11.35001 >> endobj 52 0 obj << /S /email /C /email /Pg 180 0 R /K [ 53 0 R 5 ] /P 139 0 R >> endobj 53 0 obj << /S /Link /P 52 0 R /K [ 55 0 R << /Type /OBJR /Pg 180 0 R /Obj 182 0 R >> ] >> endobj 54 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Center /SpaceBefore 0 /SpaceAfter 0 /TextIndent 11.35001 >> endobj 55 0 obj << /S /Span /P 53 0 R /Pg 180 0 R /K 4 >> endobj 56 0 obj << /S /abstract /C /abstract /Pg 180 0 R /K 6 /P 139 0 R >> endobj 57 0 obj << /S /heading1 /C /heading1 /Pg 180 0 R /K 7 /P 139 0 R >> endobj 58 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 28.35001 /EndIndent 28.35001 /TextAlign /Justify /SpaceBefore 30 /SpaceAfter 6 /TextIndent 0 >> endobj 59 0 obj << /S /p1a /C /p1a /Pg 180 0 R /K 8 /P 139 0 R >> endobj 60 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Justify /SpaceBefore 26 /SpaceAfter 14 /TextIndent 0 >> endobj 61 0 obj << /S /Normal /C /Normal /Pg 180 0 R /K 9 /P 139 0 R >> endobj 62 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Justify /SpaceBefore 0 /SpaceAfter 0 /TextIndent 0 >> endobj 63 0 obj << /S /Normal /C /Normal /Pg 180 0 R /K 10 /P 139 0 R >> endobj 64 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Justify /SpaceBefore 0 /SpaceAfter 0 /TextIndent 11.35001 >> endobj 65 0 obj << /S /Normal /C /Normal /Pg 1 0 R /K [ 66 0 R 50 ] /P 139 0 R >> endobj 66 0 obj << /S /InlineShape /Pg 1 0 R /P 65 0 R /K [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 ] /Alt () /A [ 162 0 R ] >> endobj 67 0 obj << /S /figure#20legend /C /figure#20legend /Pg 1 0 R /K 51 /P 139 0 R >> endobj 68 0 obj << /S /Normal /C /Normal /Pg 1 0 R /K 52 /P 139 0 R >> endobj 69 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Justify /SpaceBefore 6 /SpaceAfter 12 /TextIndent 0 >> endobj 70 0 obj << /S /heading1 /C /heading1 /Pg 1 0 R /K 53 /P 139 0 R >> endobj 71 0 obj << /S /p1a /C /p1a /Pg 1 0 R /K 54 /P 139 0 R >> endobj 72 0 obj << /S /Normal /C /Normal /Pg 1 0 R /P 139 0 R /K [ 55 << /Type /MCR /Pg 4 0 R /MCID 0 >> ] >> endobj 73 0 obj << /S /Normal /C /Normal /Pg 4 0 R /K 1 /P 139 0 R >> endobj 74 0 obj << /S /Normal /C /Normal /Pg 4 0 R /K 2 /P 139 0 R >> endobj 75 0 obj << /S /Normal /C /Normal /Pg 4 0 R /K 3 /P 139 0 R >> endobj 76 0 obj << /S /Normal /C /Normal /Pg 4 0 R /K 4 /P 139 0 R >> endobj 77 0 obj << /S /Normal /C /Normal /Pg 4 0 R /K 5 /P 139 0 R >> endobj 78 0 obj << /S /Normal /C /Normal /Pg 4 0 R /P 139 0 R /K [ 6 << /Type /MCR /Pg 7 0 R /MCID 0 >> ] >> endobj 79 0 obj << /S /heading1 /C /heading1 /Pg 7 0 R /K 1 /P 139 0 R >> endobj 80 0 obj << /S /p1a /C /p1a /Pg 7 0 R /K 2 /P 139 0 R >> endobj 81 0 obj << /S /Normal /C /Normal /Pg 7 0 R /K 3 /P 139 0 R >> endobj 82 0 obj << /S /Normal /C /Normal /Pg 7 0 R /K 4 /P 139 0 R >> endobj 83 0 obj << /S /Normal /C /Normal /Pg 7 0 R /K [ 84 0 R 123 ] /P 139 0 R >> endobj 84 0 obj << /S /InlineShape /Pg 7 0 R /P 83 0 R /K [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 ] /Alt () /A [ 165 0 R ] >> endobj 85 0 obj << /S /Normal /C /Normal /Pg 10 0 R /K 0 /P 139 0 R >> endobj 86 0 obj << /S /Normal /C /Normal /Pg 10 0 R /K 1 /P 139 0 R >> endobj 87 0 obj << /S /heading1 /C /heading1 /Pg 10 0 R /K 2 /P 139 0 R >> endobj 88 0 obj << /S /p1a /C /p1a /Pg 10 0 R /K 3 /P 139 0 R >> endobj 89 0 obj << /S /Normal /C /Normal /Pg 10 0 R /K 4 /P 139 0 R >> endobj 90 0 obj << /S /Normal /A [ 91 0 R ] /C /Normal /Pg 10 0 R /K [ 92 0 R 119 ] /P 139 0 R >> endobj 91 0 obj << /O /Layout /TextIndent 0 >> endobj 92 0 obj << /S /InlineShape /Pg 10 0 R /P 90 0 R /K [ 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 ] /Alt () /A [ 167 0 R ] >> endobj 93 0 obj << /S /p1a /C /p1a /Pg 13 0 R /K 0 /P 139 0 R >> endobj 94 0 obj << /S /Normal /C /Normal /Pg 13 0 R /K 1 /P 139 0 R >> endobj 95 0 obj << /S /Normal /C /Normal /Pg 13 0 R /K 2 /P 139 0 R >> endobj 96 0 obj << /S /Normal /C /Normal /Pg 13 0 R /K 3 /P 139 0 R >> endobj 97 0 obj << /S /Normal /C /Normal /Pg 13 0 R /K 4 /P 139 0 R >> endobj 98 0 obj << /S /heading1 /C /heading1 /Pg 13 0 R /K 5 /P 139 0 R >> endobj 99 0 obj << /S /p1a /C /p1a /Pg 13 0 R /K 6 /P 139 0 R >> endobj 100 0 obj << /S /Normal /C /Normal /Pg 13 0 R /P 139 0 R /K [ 7 << /Type /MCR /Pg 16 0 R /MCID 0 >> ] >> endobj 101 0 obj << /S /Normal /C /Normal /Pg 16 0 R /K 1 /P 139 0 R >> endobj 102 0 obj << /S /Normal /C /Normal /Pg 16 0 R /K [ 103 0 R 149 ] /P 139 0 R >> endobj 103 0 obj << /S /InlineShape /Pg 16 0 R /P 102 0 R /K [ 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 ] /Alt () /A [ 170 0 R ] >> endobj 104 0 obj << /S /Normal /C /Normal /Pg 16 0 R /K 150 /P 139 0 R >> endobj 105 0 obj << /S /Normal /C /Normal /Pg 16 0 R /K 151 /P 139 0 R >> endobj 106 0 obj << /S /heading1 /C /heading1 /Pg 16 0 R /K 152 /P 139 0 R >> endobj 107 0 obj << /S /p1a /C /p1a /Pg 16 0 R /K 153 /P 139 0 R >> endobj 108 0 obj << /S /Normal /C /Normal /Pg 16 0 R /P 139 0 R /K [ 154 << /Type /MCR /Pg 19 0 R /MCID 0 >> ] >> endobj 109 0 obj << /S /heading1 /C /heading1 /Pg 19 0 R /K 1 /P 139 0 R >> endobj 110 0 obj << /S /p1a /C /p1a /Pg 19 0 R /K 2 /P 139 0 R >> endobj 111 0 obj << /S /heading1 /C /heading1 /Pg 19 0 R /K 3 /P 139 0 R >> endobj 112 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K 4 /P 141 0 R >> endobj 113 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K 5 /P 142 0 R >> endobj 114 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 11.35001 /EndIndent 0 /TextAlign /Justify /SpaceBefore 0 /SpaceAfter 0 /TextIndent -11.34999 >> endobj 115 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K 6 /P 143 0 R >> endobj 116 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K 7 /P 144 0 R >> endobj 117 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K 8 /P 145 0 R >> endobj 118 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K [ 9 119 0 R 11 ] /P 146 0 R >> endobj 119 0 obj << /S /Link /P 118 0 R /K [ 120 0 R << /Type /OBJR /Pg 19 0 R /Obj 35 0 R >> ] >> endobj 120 0 obj << /S /Span /P 119 0 R /Pg 19 0 R /K 10 >> endobj 121 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K 12 /P 147 0 R >> endobj 122 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K [ 13 123 0 R 15 ] /P 148 0 R >> endobj 123 0 obj << /S /Link /P 122 0 R /K [ 124 0 R << /Type /OBJR /Pg 19 0 R /Obj 37 0 R >> ] >> endobj 124 0 obj << /S /Span /P 123 0 R /Pg 19 0 R /K 14 >> endobj 125 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K 16 /P 149 0 R >> endobj 126 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K 17 /P 150 0 R >> endobj 127 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K 18 /P 151 0 R >> endobj 128 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K [ 19 129 0 R 21 ] /P 152 0 R >> endobj 129 0 obj << /S /Link /P 128 0 R /K [ 130 0 R << /Type /OBJR /Pg 19 0 R /Obj 39 0 R >> ] >> endobj 130 0 obj << /S /Span /P 129 0 R /Pg 19 0 R /K 20 >> endobj 131 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K 22 /P 153 0 R >> endobj 132 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K [ 23 133 0 R 25 ] /P 154 0 R >> endobj 133 0 obj << /S /Link /P 132 0 R /K [ 134 0 R << /Type /OBJR /Pg 19 0 R /Obj 41 0 R >> ] >> endobj 134 0 obj << /S /Span /P 133 0 R /Pg 19 0 R /K 24 >> endobj 135 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K 26 /P 155 0 R >> endobj 136 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K 27 /P 156 0 R >> endobj 137 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K 28 /P 157 0 R >> endobj 138 0 obj << /S /LBody /C /Numbered#20Item /Pg 19 0 R /K 29 /P 158 0 R >> endobj 139 0 obj << /S /Sect /P 179 0 R /K [ 43 0 R 47 0 R 48 0 R 50 0 R 52 0 R 56 0 R 57 0 R 59 0 R 61 0 R 63 0 R 65 0 R 67 0 R 68 0 R 70 0 R 71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 140 0 R ] >> endobj 140 0 obj << /S /L /P 139 0 R /K [ 141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R 153 0 R 154 0 R 155 0 R 156 0 R 157 0 R 158 0 R ] >> endobj 141 0 obj << /S /LI /P 140 0 R /K 112 0 R >> endobj 142 0 obj << /S /LI /P 140 0 R /K 113 0 R >> endobj 143 0 obj << /S /LI /P 140 0 R /K 115 0 R >> endobj 144 0 obj << /S /LI /P 140 0 R /K 116 0 R >> endobj 145 0 obj << /S /LI /P 140 0 R /K 117 0 R >> endobj 146 0 obj << /S /LI /P 140 0 R /K 118 0 R >> endobj 147 0 obj << /S /LI /P 140 0 R /K 121 0 R >> endobj 148 0 obj << /S /LI /P 140 0 R /K 122 0 R >> endobj 149 0 obj << /S /LI /P 140 0 R /K 125 0 R >> endobj 150 0 obj << /S /LI /P 140 0 R /K 126 0 R >> endobj 151 0 obj << /S /LI /P 140 0 R /K 127 0 R >> endobj 152 0 obj << /S /LI /P 140 0 R /K 128 0 R >> endobj 153 0 obj << /S /LI /P 140 0 R /K 131 0 R >> endobj 154 0 obj << /S /LI /P 140 0 R /K 132 0 R >> endobj 155 0 obj << /S /LI /P 140 0 R /K 135 0 R >> endobj 156 0 obj << /S /LI /P 140 0 R /K 136 0 R >> endobj 157 0 obj << /S /LI /P 140 0 R /K 137 0 R >> endobj 158 0 obj << /S /LI /P 140 0 R /K 138 0 R >> endobj 159 0 obj << /Nums [ 0 160 0 R 1 53 0 R 2 161 0 R 3 163 0 R 4 164 0 R 5 166 0 R 6 168 0 R 7 169 0 R 8 171 0 R 9 119 0 R 10 123 0 R 11 129 0 R 12 133 0 R ] >> endobj 160 0 obj [ 43 0 R 47 0 R 48 0 R 50 0 R 55 0 R 52 0 R 56 0 R 57 0 R 59 0 R 61 0 R 63 0 R ] endobj 161 0 obj [ 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 66 0 R 65 0 R 67 0 R 68 0 R 70 0 R 71 0 R 72 0 R ] endobj 162 0 obj << /O /Layout /BBox [ 134 456 479 695 ] /Placement /Inline >> endobj 163 0 obj [ 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R ] endobj 164 0 obj [ 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 84 0 R 83 0 R ] endobj 165 0 obj << /O /Layout /BBox [ 153 192 452 440 ] /Placement /Inline >> endobj 166 0 obj [ 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 92 0 R 90 0 R ] endobj 167 0 obj << /O /Layout /BBox [ 141 174 441 422 ] /Placement /Inline >> endobj 168 0 obj [ 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R ] endobj 169 0 obj [ 100 0 R 101 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 103 0 R 102 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R ] endobj 170 0 obj << /O /Layout /BBox [ 149 429 475 654 ] /Placement /Inline >> endobj 171 0 obj [ 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 115 0 R 116 0 R 117 0 R 118 0 R 120 0 R 118 0 R 121 0 R 122 0 R 124 0 R 122 0 R 125 0 R 126 0 R 127 0 R 128 0 R 130 0 R 128 0 R 131 0 R 132 0 R 134 0 R 132 0 R 135 0 R 136 0 R 137 0 R 138 0 R ] endobj 172 0 obj << /S /D >> endobj 173 0 obj << /Nums [ 0 172 0 R ] >> endobj 174 0 obj << /Producer (Acrobat Distiller 5.0 \(Windows\)) /Author (Dave Turner) /Creator (Acrobat PDFMaker 5.0 for Word) /ModDate (D:20030708180759-04'00') /Title (sv-lncs) /CreationDate (D:20030708180737-05'00') >> endobj 175 0 obj << /Type /Metadata /Subtype /XML /Length 1022 >> stream sv-lncs endstream endobj 176 0 obj << /Type /Pages /Kids [ 180 0 R 1 0 R 4 0 R 7 0 R 10 0 R 13 0 R 16 0 R 19 0 R ] /Count 8 >> endobj xref 0 177 0000000000 65535 f 0000067736 00000 n 0000068080 00000 n 0000079429 00000 n 0000079451 00000 n 0000079783 00000 n 0000083668 00000 n 0000083689 00000 n 0000084033 00000 n 0000094840 00000 n 0000094862 00000 n 0000095222 00000 n 0000106904 00000 n 0000106927 00000 n 0000107262 00000 n 0000110768 00000 n 0000110790 00000 n 0000111149 00000 n 0000123033 00000 n 0000123056 00000 n 0000123394 00000 n 0000123444 00000 n 0000126919 00000 n 0000126941 00000 n 0000127397 00000 n 0000127864 00000 n 0000128110 00000 n 0000128220 00000 n 0000128448 00000 n 0000146169 00000 n 0000146391 00000 n 0000165987 00000 n 0000166209 00000 n 0000176063 00000 n 0000176130 00000 n 0000176420 00000 n 0000176577 00000 n 0000176645 00000 n 0000176805 00000 n 0000176874 00000 n 0000177034 00000 n 0000177108 00000 n 0000177268 00000 n 0000177353 00000 n 0000177430 00000 n 0000177834 00000 n 0000178040 00000 n 0000178200 00000 n 0000178279 00000 n 0000178366 00000 n 0000178526 00000 n 0000178613 00000 n 0000178772 00000 n 0000178860 00000 n 0000178963 00000 n 0000179122 00000 n 0000179186 00000 n 0000179269 00000 n 0000179352 00000 n 0000179520 00000 n 0000179593 00000 n 0000179748 00000 n 0000179827 00000 n 0000179980 00000 n 0000180060 00000 n 0000180220 00000 n 0000180309 00000 n 0000180546 00000 n 0000180642 00000 n 0000180720 00000 n 0000180874 00000 n 0000180956 00000 n 0000181028 00000 n 0000181145 00000 n 0000181222 00000 n 0000181299 00000 n 0000181376 00000 n 0000181453 00000 n 0000181530 00000 n 0000181646 00000 n 0000181727 00000 n 0000181798 00000 n 0000181875 00000 n 0000181952 00000 n 0000182042 00000 n 0000182514 00000 n 0000182592 00000 n 0000182670 00000 n 0000182752 00000 n 0000182824 00000 n 0000182902 00000 n 0000183008 00000 n 0000183059 00000 n 0000183516 00000 n 0000183588 00000 n 0000183666 00000 n 0000183744 00000 n 0000183822 00000 n 0000183900 00000 n 0000183982 00000 n 0000184054 00000 n 0000184173 00000 n 0000184252 00000 n 0000184345 00000 n 0000184932 00000 n 0000185013 00000 n 0000185094 00000 n 0000185179 00000 n 0000185254 00000 n 0000185375 00000 n 0000185458 00000 n 0000185531 00000 n 0000185614 00000 n 0000185701 00000 n 0000185788 00000 n 0000185957 00000 n 0000186044 00000 n 0000186131 00000 n 0000186218 00000 n 0000186320 00000 n 0000186424 00000 n 0000186490 00000 n 0000186578 00000 n 0000186681 00000 n 0000186785 00000 n 0000186851 00000 n 0000186939 00000 n 0000187027 00000 n 0000187115 00000 n 0000187218 00000 n 0000187322 00000 n 0000187388 00000 n 0000187476 00000 n 0000187579 00000 n 0000187683 00000 n 0000187749 00000 n 0000187837 00000 n 0000187925 00000 n 0000188013 00000 n 0000188101 00000 n 0000188537 00000 n 0000188735 00000 n 0000188792 00000 n 0000188849 00000 n 0000188906 00000 n 0000188963 00000 n 0000189020 00000 n 0000189077 00000 n 0000189134 00000 n 0000189191 00000 n 0000189248 00000 n 0000189305 00000 n 0000189362 00000 n 0000189419 00000 n 0000189476 00000 n 0000189533 00000 n 0000189590 00000 n 0000189647 00000 n 0000189704 00000 n 0000189761 00000 n 0000189930 00000 n 0000190031 00000 n 0000190451 00000 n 0000190535 00000 n 0000190607 00000 n 0000191510 00000 n 0000191594 00000 n 0000192469 00000 n 0000192553 00000 n 0000192633 00000 n 0000193915 00000 n 0000193999 00000 n 0000194265 00000 n 0000194297 00000 n 0000194343 00000 n 0000194569 00000 n 0000195676 00000 n trailer << /Size 177 /ID[<1a690b124351ee526150c02a6fdc7703>] >> startxref 173 %%EOF NetPIPE-3.7.2/hosts/NPtcgmsg.p0000644000000000000000000000020211433312522016122 0ustar00usergroup00000000000000turner grimm.ge3 1 /home/turner/np/NPtcgmsg.fin /home/turner/np turner shadow.ge3 1 /home/turner/np/NPtcgmsg.fin /home/turner/np NetPIPE-3.7.2/hosts/batchLapi0000644000000000000000000000054111433312522016037 0ustar00usergroup00000000000000#@ job_name = NPlapi #@ output = NPlapi.out #@ error = NPlapi.err #@ job_type = parallel #@ environment = COPY_ALL #@ network.LAPI = csss,not_shared,us #@ node_usage = not_shared #@ class = debug # # #@ tasks_per_node = 1 #@ node = 2 #@ wall_clock_limit= 00:10:00 # #@ queue ./NPlapi NetPIPE-3.7.2/hosts/lamhosts0000644000000000000000000000007611433312522016005 0ustar00usergroup00000000000000slam zombie #localhost cpu=2 #grasshopper.ge3 #hammerhead.ge3 NetPIPE-3.7.2/hosts/mvich.hosts0000644000000000000000000000002711433312522016414 0ustar00usergroup00000000000000grasshopper hammerhead NetPIPE-3.7.2/hosts/mvich.param0000644000000000000000000000043511433312522016357 0ustar00usergroup00000000000000#VIADEV_DEVICE = /dev/via_eth2 VIADEV_DEVICE = /dev/clanvi0 VIADEV_VBUF_MAX = -1 VIADEV_RENDEZVOUS_THRESHOLD = 128000 VIADEV_SPIN_COUNT = 1000 #VIADEV_RELIABILITY_LEVEL = unreliable_delivery #VIADEV_CQ_SIZE = 32768 #VIADEV_PREPOST_DEPTH = 200 #VIADEV_PREPOST_RENDEZVOUS_EXTRA = 100 NetPIPE-3.7.2/hosts/p4hosts0000644000000000000000000000012411433312522015551 0ustar00usergroup00000000000000grasshopper.ge1 0 /home/turner/np/NPmpich hammerhead.ge1 1 /home/turner/np/NPmpich NetPIPE-3.7.2/makefile0000644000000000000000000002475611433312522014603 0ustar00usergroup00000000000000######################################################################## # This is the makefile for NetPipe # Simply type make with one of the following choices for environments: # # mpi : will use mpicc to compile # mplite : It will look for the MP_Lite library in $HOME/mplite # tcp : You start the receiver and transmitter manually # paragon : Uses MPI on the Paragon # pvm : Old version doesn't use pvm_spawn # Use 'NPpvm -r' on receiver and 'NPpvm' on transmitter # tcgmsg : Run directly on TCGMSG # tcgmsg-mpich: Test TCGMSG layer on top of mpich # lapi : Test the LAPI interface on the IBM SP # mx : Directly measure MX / Open-MX # gm : Directly measure raw GM on Myrinet # Use 'NPgm -r' on receiver and 'NPgm -t -h ...' on trans # shmem : Directly measure SHMEM on Cray and SGI systems # gpshmem : Measure GPSHMEM on any other system using shmem.c # # For more information, see the function printusage() in netpipe.c # ######################################################################## CC = cc CFLAGS = -O -g SRC = ./src # For MPI, mpicc will set up the proper include and library paths MPICC = mpicc MP_Lite_home = $(HOME)/MP_Lite PVM_HOME = /usr/share/pvm3 PVM_ARCH = LINUX #PVM_ARCH = LINUXALPHA TCGMSG_HOME = $(HOME)/np/packs/ga TCGMSG_LIB = $(TCGMSG_HOME)/lib/LINUX/libtcgmsg.a TCGMSG_INC = $(TCGMSG_HOME)/include TCGMSG_MPI_HOME= $(HOME)/np/ga TCGMSG_MPI_LIB = $(TCGMSG_MPI_HOME)/lib/LINUX/libtcgmsg-mpi.a TCGMSG_ARMCI_LIB = $(TCGMSG_MPI_HOME)/armci-1.0/lib/LINUX/libarmci.a TCGMSG_MPI_INC = $(TCGMSG_MPI_HOME)/include GM_HOME = /opt/gm GM_INC = $(GM_HOME)/include GM_LIB = -L $(GM_HOME)/lib -lgm GM_DRI = $(GM_HOME)/drivers/linux/gm MX_HOME = /opt/mx MX_INC = $(MX_HOME)/include MX_LIB = -L$(MX_HOME)/lib -lmyriexpress -lpthread GPSHMEM_LIB = $(HOME)/np/ga/gpshmem/lib/libgpshmem.a GPSHMEM_INC = $(HOME)/np/ga/gpshmem/include ARMCI_LIB = $(HOME)/armci/lib/LINUX/libarmci.a -lm ARMCI_INC = $(HOME)/armci/src # MTHOME should be defined in the environment #MTHOME=/usr/mellanox VAPI_INC = $(MTHOME)/include VAPI_LIB = $(MTHOME)/lib # Modify UDAPL_INC & UDAPL_LIB to match your uDAPL installation. # Currently defined for (OpenIB) 64-bit OFED 1.0 UDAPL_INC = /usr/local/ofed/include UDAPL_LIB = /usr/local/ofed/lib64 # If the MPI-2 implementation provides the mpicc compiler, then simply # set MPI2CC to mpicc, and set MPI2_LIB and MPI2_INC to nothing. # If mpicc is not included with the implementation, then set MPI2CC to # an appropriate compiler, and set the paths to the MPI-2 library and include # directory (library path should be absolute, e.g. MPI2_LIB = # $(HOME)/mpi/libmpi.a) MPI2CC = mpicc MPI2_LIB = MPI2_INC = all:tcp clean: rm -f *.o NP* np.out # # This section of the Makefile is for compiling the binaries # tcp: $(SRC)/tcp.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) $(SRC)/netpipe.c $(SRC)/tcp.c -DTCP -o NPtcp -I$(SRC) tcp6: $(SRC)/tcp.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) $(SRC)/netpipe.c $(SRC)/tcp6.c -DTCP6 \ -o NPtcp6 -I$(SRC) sctp: $(SRC)/sctp.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) $(SRC)/netpipe.c $(SRC)/sctp.c -DSCTP \ -o NPsctp -I$(SRC) sctp6: $(SRC)/sctp6.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) $(SRC)/netpipe.c $(SRC)/sctp6.c -DSCTP6 \ -o NPsctp6 -I$(SRC) ipx: $(SRC)/ipx.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) $(SRC)/netpipe.c $(SRC)/ipx.c -DIPX \ -o NPipx -I$(SRC) -lipx memcpy: $(SRC)/memcpy.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) $(SRC)/netpipe.c $(SRC)/memcpy.c \ -DMEMCPY -o NPmemcpy -I$(SRC) MP_memcpy: $(SRC)/memcpy.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(SRC)/MP_memcpy.c $(CC) $(CFLAGS) -mmmx -msse $(SRC)/netpipe.c $(SRC)/memcpy.c \ $(SRC)/MP_memcpy.c -DMEMCPY -DUSE_MP_MEMCPY -o NPmemcpy -I$(SRC) disk: $(SRC)/disk.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) $(SRC)/netpipe.c $(SRC)/disk.c -DDISK -o NPdisk -I$(SRC) sync: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h ( cd ~/mplite; make clean; make sync; ) $(CC) $(CFLAGS) -DMPI $(SRC)/netpipe.c $(SRC)/mpi.c -o NPmplite \ -I$(SRC) -I$(MP_Lite_home) $(MP_Lite_home)/libmplite.a debug2: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h ( cd ~/mplite; make debug2; ) $(CC) $(CFLAGS) -DMPI $(SRC)/netpipe.c $(SRC)/mpi.c -o NPmplite \ -I$(SRC) -I$(MP_Lite_home) $(MP_Lite_home)/libmplite.a mpi: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(MPICC) $(CFLAGS) -DMPI $(SRC)/netpipe.c $(SRC)/mpi.c -o NPmpi -I$(SRC) @ rm -f netpipe.o mpi.o mpipro: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h mpicc $(CFLAGS) -DMPI $(SRC)/netpipe.c $(SRC)/mpi.c \ -o NPmpipro -I$(SRC) @ rm -f netpipe.o mpi.o mpipro-gm: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h cc -O -DMPI $(SRC)/netpipe.c $(SRC)/mpi.c \ /usr/lib/libmpipro_tg_i386.a \ -o NPmpipro-gm -I./src -I/usr/include \ -L $HOME/np/packs/gm/binary/lib -lgm -lm -lpthread mpich: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h mpichcc $(CFLAGS) -DMPI $(SRC)/netpipe.c \ $(SRC)/mpi.c -o NPmpich -I$(SRC) @ rm -f netpipe.o mpi.o mpich-trace: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h mpichcc $(CFLAGS) -mpitrace -DMPI $(SRC)/netpipe.c \ $(SRC)/mpi.c -o NPmpich -I$(SRC) @ rm -f netpipe.o mpi.o mpich-log: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h mpichcc $(CFLAGS) -mpilog -DMPI $(SRC)/netpipe.c \ $(SRC)/mpi.c -o NPmpich -I$(SRC) @ rm -f netpipe.o mpi.o mpich-gm: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h mpichgmcc $(CFLAGS) -DMPI $(SRC)/netpipe.c \ $(SRC)/mpi.c -o NPmpich-gm -I$(SRC) @ rm -f netpipe.o mpi.o mx: $(SRC)/mx.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) -DMX $(SRC)/netpipe.c $(SRC)/mx.c \ -o NPmx -I$(SRC) -I$(MX_INC) \ $(MX_LIB) -static gm: $(SRC)/gm.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) -DGM $(SRC)/netpipe.c $(SRC)/gm.c \ -o NPgm -I$(SRC) -I$(GM_INC) -I$(GM_DRI) \ $(GM_LIB) -static mvich: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h mvichcc $(CFLAGS) -DMPI $(SRC)/netpipe.c \ $(SRC)/mpi.c -o NPmvich -I$(SRC) -lvipl @ rm -f netpipe.o mpi.o mvich-gn: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h mvichcc $(CFLAGS) -DMPI $(SRC)/netpipe.c \ $(SRC)/mpi.c -o NPmvich-gn -I$(SRC) -lgnivipl @ rm -f netpipe.o mpi.o mplite MP_Lite sigio: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h ( cd $(MP_Lite_home); make; ) $(CC) $(CFLAGS) -DMPI $(SRC)/netpipe.c $(SRC)/mpi.c \ -o NPmplite -I$(SRC) -I$(MP_Lite_home) $(MP_Lite_home)/libmplite.a mplite-mvia: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h ( cd ~/mplite; make mvia; ) $(CC) $(CFLAGS) -DMPI $(SRC)/netpipe.c $(SRC)/mpi.c \ -o NPmplite-mvia -I$(SRC) -I$(MP_Lite_home) \ $(MP_Lite_home)/libmplite.a -lvipl -lpthread mplite-gn: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h ( cd ~/mplite; make giganet; ) $(CC) $(CFLAGS) -DMPI $(SRC)/netpipe.c $(SRC)/mpi.c \ -o NPmplite-gn -I$(SRC) -I$(MP_Lite_home) \ $(MP_Lite_home)/libmplite.a -lgnivipl -lpthread mplite-ib: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h ( cd $(MP_Lite_home); make ib; ) $(CC) $(CFLAGS) -g -DMPI $(SRC)/netpipe.c $(SRC)/mpi.c \ -o NPmplite-ib -I$(SRC) -I$(MP_Lite_home) \ $(MP_Lite_home)/libmplite.a -L/usr/mellanox/lib \ -lmpga -lvapi -lpthread pvm: $(SRC)/pvm.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) -DPVM $(SRC)/netpipe.c $(SRC)/pvm.c \ -o NPpvm -I$(SRC) -I$(PVM_HOME)/include \ -L $(PVM_HOME)/lib/$(PVM_ARCH)/ -lpvm3 -lgpvm3 tcgmsg: $(SRC)/tcgmsg.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) -DTCGMSG $(SRC)/netpipe.c \ $(SRC)/tcgmsg.c -o NPtcgmsg -I$(SRC) -I$(TCGMSG_INC) $(TCGMSG_LIB) tcgmsg-mpich: $(SRC)/tcgmsg.c $(SRC)/netpipe.c $(SRC)/netpipe.h mpichcc $(CFLAGS) -DTCGMSG $(SRC)/netpipe.c \ $(SRC)/tcgmsg.c -o NPtcgmsg.mpich -I$(SRC) -I$(TCGMSG_MPI_INC) \ $(TCGMSG_MPI_LIB) $(TCGMSG_ARMCI_LIB) lapi: $(SRC)/lapi.c $(SRC)/netpipe.c $(SRC)/netpipe.h mpcc_r $(CFLAGS) -DLAPI $(SRC)/netpipe.c \ $(SRC)/lapi.c -o NPlapi t3e: $(SRC)/shmem.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) -DSHMEM $(SRC)/netpipe.c \ $(SRC)/shmem.c -o NPshmem shmem: $(SRC)/shmem.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) -DSHMEM $(SRC)/netpipe.c \ $(SRC)/shmem.c -o NPshmem -lsma gpshmem: $(SRC)/gpshmem.c $(SRC)/netpipe.c $(SRC)/netpipe.h mpichcc $(CFLAGS) -DGPSHMEM -DSHMEM $(SRC)/netpipe.c \ $(SRC)/gpshmem.c -I$(GPSHMEM_INC) -o NPgpshmem $(GPSHMEM_LIB) \ $(ARMCI_LIB) @ rm -f netpipe.o gpshmem.o paragon: $(SRC)/mpi.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) -nx $(CFLAGS) -DMPI $(SRC)/netpipe.c \ $(SRC)/mpi.c -o NPparagon -I$(SRC) -lmpi @ echo "On the Paragon, the buffer alignment does not work." @ echo "Run using NPparagon -A 0." armci: $(SRC)/armci.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(MPICC) $(CFLAGS) -DARMCI $(SRC)/netpipe.c \ $(SRC)/armci.c -o NParmci -I$(ARMCI_INC) $(ARMCI_LIB) mpi2: $(SRC)/mpi2.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(MPI2CC) $(CFLAGS) -DMPI -DMPI2 $(SRC)/netpipe.c \ $(SRC)/mpi2.c -o NPmpi2 -I$(MPI2_INC) $(MPI2_LIB) ib: $(SRC)/ib.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) $(SRC)/ib.c $(SRC)/netpipe.c -o NPib \ -DINFINIBAND -DTCP -I $(VAPI_INC) -L $(VAPI_LIB) \ -lmpga -lvapi -lpthread ibv: $(SRC)/ibv.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) $(SRC)/ibv.c $(SRC)/netpipe.c -o NPibv \ -DOPENIB -DTCP -I $(IBV_INC) -L $(IBV_LIB) -libverbs atoll: $(SRC)/atoll.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) -DATOLL $(SRC)/netpipe.c \ $(SRC)/atoll.c -o NPatoll \ -I$(PALMS_PATH)/include -L$(PALMS_PATH)/lib -latoll udapl: $(SRC)/udapl.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CFLAGS) $(SRC)/udapl.c $(SRC)/netpipe.c -o NPudapl \ -DDAT -DTCP -DUSE_VOLATILE_RPTR -I $(UDAPL_INC) -L $(UDAPL_LIB) \ -ldat -lpthread vmsplice: $(SRC)/vmsplice.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CPPFLAGS) $(CFLAGS) $(SRC)/netpipe.c $(SRC)/vmsplice.c \ -DVMSPLICE -o NPvmsplice -I$(SRC) knem: $(SRC)/knem.c $(SRC)/netpipe.c $(SRC)/netpipe.h $(CC) $(CPPFLAGS) $(CFLAGS) $(SRC)/netpipe.c $(SRC)/knem.c \ -DKNEM -o NPknem -I$(SRC) NetPIPE-3.7.2/src/MP_memcpy.c0000644000000000000000000001520011433312522015704 0ustar00usergroup00000000000000/* This optimized memcpy requires gcc 3.x to be installed (needs xmmintrin.h) */ /*#define _INTEL */ #if defined (_INTEL) #include #else #include "xmmintrin.h" #endif #include /*construct a function that can do well on most bufferalignment */ #define LONGMSGSIZE (2.5*131072) /* Long message size */ /*#define BLOCKSIZE 131072 */ #define BLOCKSIZE 131072 /* Needs to be divisible by 16 */ #define PAGESIZE 4096 #define NUMPERPAGE 512 /* Number of elements fit in a page */ #define ALIGNMENT 16 /* #define P4 */ #if defined(P4) #define CACHELINE 128 /* on Pentimum 4 */ #else #define CACHELINE 32 /* on Pentimum 3 */ #endif #define NTCOPY 1 /* Use nontemporal copy */ #define WACOPY 2 /* Write allocate copy */ #define CBCOPY 3 /* * mixed copy, small message use * write allocate copy, and long * message use nontemporal copy */ #define COPY_TYPE CBCOPY #define small_memcpy(dst,src,n) \ { register unsigned long int dummy; \ asm volatile ( \ "rep; movsb\n\t" \ :"=&D"(dst), "=&S"(src), "=&c"(dummy) \ :"0" (dst), "1" (src),"2" (n) \ : "memory"); } extern int myproc; void ntcopy(void *dst, const void *src, int size); void memcpy_8(void *destination, const void *source, int nbytes); void memcpy_16(void *destination, const void *source, int nbytes); void MP_memcpy(void *dst, const void *src, int nbytes); int intlog2(int i) { float x = i; return (*(int*)&x >> 23) - 127; } /* * This function optimize the memory copy if number of bytes * to transfer is not equal to 8 */ void memcpy_8(void *destination, const void *source, int nbytes) { int nb_b4, nb_after; char *dest = (char *)destination, *src = (char *) source; nb_b4 = 8 - ((long int)src % 8); if( nb_b4 != 8 && nb_b4 <= nbytes) { /* * Copy up to an 8-byte boundary first * considering that nbytes can be less * than nb_b4 */ memcpy( dest, src, nb_b4 ); src += nb_b4; dest += nb_b4; nbytes -= nb_b4; } nb_after = nbytes % 8; nbytes -= nb_after; if( nbytes > 0 ) { /* Copy the main data */ memcpy( dest, src, nbytes ); } if( nb_after > 0 ) { /* Copy the last few bytes */ src += nbytes; dest += nbytes; memcpy( dest, src, nb_after ); } } void memcpy_16(void *destination, const void *source, int nbytes) { int nb_b4, nb_after; char *dest = (char *)destination, *src = (char *)source; nb_b4 = 16 - ((int) dest % 16); if (nb_b4 != 16 && nb_b4 <= nbytes) { memcpy(dest, src, nb_b4); src += nb_b4; dest += nb_b4; nbytes -= nb_b4; } /*memcpy(dest, src, nbytes); */ nb_after = nbytes % 16; nbytes -= nb_after; if ( nbytes > 0) { memcpy(dest, src, nbytes); } if( nb_after > 0 ) { src += nbytes; dest += nbytes; memcpy( dest, src, nb_after ); } } //#if defined(_INTEL) void ntcopy(void *dst, const void *src, int size) { int ii, jj, kk, N, delta, LEFT, blocksize, size1; double *a, *b; double temp; /* copy the first few bytes to make dest divisible by 8 */ if (size <= ALIGNMENT) { memcpy(dst, (void *)src, size); return; } delta = ((int)dst) & (ALIGNMENT - 1); if (delta != 0) { delta = ALIGNMENT - delta; size -= delta; memcpy(dst, (void *)src, delta); } a = (double *)(src + delta); b = (double *)(dst + delta); N = 2 * (size / 16); /* number of doubles */ LEFT = size % 16; blocksize = N; if (blocksize > BLOCKSIZE / 8) blocksize = BLOCKSIZE / 8; for (X3;;èi) { if (N < blocksize) blocksize = N; _mm_prefetch((char*)&a[0], _MM_HINT_NTA); /* prefetch a block of size blocksize */ for (jj = 0; jj < blocksize; jj += NUMPERPAGE) { /* prefetch one page of memory */ if (jj + NUMPERPAGE < blocksize ) { temp = a[jj + NUMPERPAGE]; /* TLB priming */ } for (kk = jj + 16; kk < jj + NUMPERPAGE && kk < blocksize; kk += 16) { _mm_prefetch((char*)&a[kk], _MM_HINT_NTA); } } if ( ((int) a) & (ALIGNMENT - 1) ) { size1 = blocksize - blocksize % 16; for (kk = 0; kk < size1; kk += 16) { /* copy one cacheline (128 bytes) */ _mm_stream_ps((float*)&b[kk], _mm_loadu_ps((float*)&a[kk])); _mm_stream_ps((float*)&b[kk+2], _mm_loadu_ps((float*)&a[kk+2])); _mm_stream_ps((float*)&b[kk+4], _mm_loadu_ps((float*)&a[kk+4])); _mm_stream_ps((float*)&b[kk+6], _mm_loadu_ps((float*)&a[kk+6])); _mm_stream_ps((float*)&b[kk+8], _mm_loadu_ps((float*)&a[kk+8])); _mm_stream_ps((float*)&b[kk+10], _mm_loadu_ps((float*)&a[kk+10])); _mm_stream_ps((float*)&b[kk+12], _mm_loadu_ps((float*)&a[kk+12])); _mm_stream_ps((float*)&b[kk+14], _mm_loadu_ps((float*)&a[kk+14])); } for (kk = size1; kk < blocksize; kk += 2) { _mm_stream_ps((float*)&b[kk], _mm_loadu_ps((float*)&a[kk])); } } else { size1 = blocksize - blocksize % 16; for (kk = 0; kk < size1; kk+=16) { _mm_stream_ps((float*)&b[kk], _mm_load_ps((float*)&a[kk])); _mm_stream_ps((float*)&b[kk+2], _mm_load_ps((float*)&a[kk+2])); _mm_stream_ps((float*)&b[kk+4], _mm_load_ps((float*)&a[kk+4])); _mm_stream_ps((float*)&b[kk+6], _mm_load_ps((float*)&a[kk+6])); _mm_stream_ps((float*)&b[kk+8], _mm_load_ps((float*)&a[kk+8])); _mm_stream_ps((float*)&b[kk+10], _mm_load_ps((float*)&a[kk+10])); _mm_stream_ps((float*)&b[kk+12], _mm_load_ps((float*)&a[kk+12])); _mm_stream_ps((float*)&b[kk+14], _mm_load_ps((float*)&a[kk+14])); } for (kk = size1; kk < blocksize; kk += 2) { _mm_stream_ps((float*)&b[kk], _mm_load_ps((float*)&a[kk])); } } /* finished copying one block */ a = a + blocksize; b = b + blocksize; } _mm_sfence(); if (LEFT > 0) { memcpy((char*)b, (char *)a, LEFT); } } //#endif void MP_memcpy(void *dst, const void *src, int nbytes) { #if COPY_TYPE == WACOPY memcpy_16(dst, (void *)src, nbytes); #elif COPY_TYPE == NTCOPY ntcopy(dst, src, nbytes); #elif COPY_TYPE == CBCOPY if (nbytes > LONGMSGSIZE) ntcopy(dst, src, nbytes); else memcpy_16(dst, src, nbytes); #endif } NetPIPE-3.7.2/src/armci.c0000644000000000000000000001664611433312522015130 0ustar00usergroup00000000000000/* This module is basically the rewritten ARMCI module written by Xuehua */ #include #include #include #include #include "armci.h" #define USE_VOLATILE_RPTR /* need for polling on receive buffer */ #include "netpipe.h" extern double *pTime; extern int *pNrepeat; int npes, mype; int nbor_r_buff_offset; struct mnode_t { void *ptrs[2]; /* Will only use 2 pointers */ int nbytes; struct mnode_t* next; }; /* Pointers to first element of the linked list */ struct mnode_t *m_first = 0; void mlink_front(struct mnode_t* node) { if (m_first != 0) node->next = m_first; else node->next = 0; m_first = node; } struct mnode_t *mfind(void* ptr, struct mnode_t** prev) { struct mnode_t *p, *n; if (m_first != 0) { if (m_first->ptrs[mype] != ptr) { for (p=m_first, n=p->next; n != 0; p=n, n=n->next) { if (n->ptrs[mype] == ptr) { *prev = p; return n; } } } else { *prev = 0; return m_first; } } else { *prev = 0; return 0; } ARMCI_Error("Cannot find pointer in linked list", -1); } void* munlink(struct mnode_t *node, struct mnode_t *prev) { if (node != 0) { if (prev != 0) prev->next = node->next; else m_first = node->next; } return node; } void* armci_malloc(int nbytes) { struct mnode_t *node = malloc(sizeof(struct mnode_t)); if (node == 0) { ARMCI_Error("Cannot allocate memory", -1); } ARMCI_Malloc(node->ptrs, nbytes); node->nbytes = nbytes; mlink_front(node); return node->ptrs[mype]; } void armci_free(void* ptr) { struct mnode_t *n, *p; n = mfind(ptr, &p); if (n != 0) munlink(n, p); /* XXX if n = 0, then we have a problem */ ARMCI_Free(ptr); } void* remote_ptr(void* local) { struct mnode_t *n, *p; n = mfind(local, &p); /* ignore p */ if (n != 0) { return n->ptrs[1-mype]; } else { return 0; } } /* aro */ int is_host_local(char* hostname) { struct hostent* hostinfo; char* addr; char buf[1024]; char cmd[80]; FILE* output; hostinfo = gethostbyname(hostname); if(hostinfo == NULL) { fprintf(stderr, "Could not resolve hostname [%s] to IP address", hostname); fprintf(stderr, "Reason: "); switch(h_errno) { case HOST_NOT_FOUND: printf("host not found\n"); break; case NO_ADDRESS: printf("no IP address available\n"); break; case NO_RECOVERY: printf("name server error\n"); break; case TRY_AGAIN: printf("temporary error on name server, try again later\n"); break; } return -1; } addr = (char*)inet_ntoa(*(struct in_addr *)hostinfo->h_addr_list[0]); sprintf(cmd, "/sbin/ifconfig | grep %s", addr); output = popen(cmd, "r"); if(output == NULL) { fprintf(stderr, "running /sbin/ifconfig failed\n"); return -1; } if(fgets(buf, 1024, output) == NULL) { pclose(output); return 0; } else { pclose(output); return 1; } } void chop(char* s) { int i; for(i=0; s[i]!='\0'; s++) if(s[i]=='\n') s[i]='\0'; } void set_armci_hostname() { char buf[1024]; FILE* hostfile = fopen("armci_hosts", "r"); if(hostfile == NULL) return; while(fgets(buf, 1024, hostfile) != NULL) { chop(buf);/* remove trailing newline */ if(is_host_local(buf)==1) { fprintf(stderr,"Setting ARMCI_HOSTNAME=%s\n", buf); if(setenv("ARMCI_HOSTNAME", buf, 1)==-1) fprintf(stderr, "Insufficient space in environment\n"); } } fclose(hostfile); } void Init(ArgStruct *p, int* pargc, char*** pargv) { MPI_Init(pargc, pargv); } void Setup(ArgStruct *p) { int e; set_armci_hostname(); /* aro */ ARMCI_Init(); /* aro */ e = MPI_Comm_size(MPI_COMM_WORLD, &npes); if (e != MPI_SUCCESS) { ARMCI_Error("Cannot obtain number of PEs", e); } else if (npes != 2) { ARMCI_Error("This program must be run on 2 PEs", -1); } e = MPI_Comm_rank(MPI_COMM_WORLD, &mype); if (e != MPI_SUCCESS) { ARMCI_Error("Cannot obtain PE rank", e); } if (npes != 2) { ARMCI_Error("You must run on 2 nodes", -1); /* ARMCI_Error terminates everything */ } p->prot.flag = armci_malloc(sizeof(int)); pTime = armci_malloc(sizeof(double)); pNrepeat = armci_malloc(sizeof(int)); p->tr = p->rcv = 0; if ((p->prot.ipe = mype) == 0) { p->tr = 1; p->prot.nbor = 1; *p->prot.flag = 1; } else { p->rcv = 1; p->prot.nbor = 0; *p->prot.flag = 0; } } void Sync(ArgStruct *p) { MPI_Barrier(MPI_COMM_WORLD); } void PrepareToReceive(ArgStruct *p) { } void SendData(ArgStruct *p) { int p_bytes; void *remote_buff; int buf_offset=0; p_bytes = p->bufflen; buf_offset = nbor_r_buff_offset; buf_offset += p->s_ptr - p->s_buff; remote_buff = remote_ptr(p->r_buff_orig) + buf_offset; ARMCI_Put(p->s_ptr, remote_buff, p_bytes, p->prot.nbor); ARMCI_AllFence(); /* may be necessary or not */ } void RecvData(ArgStruct *p) { while (p->r_ptr[p->bufflen-1] != 'a' + (p->cache ? 1 - p->tr : 1)) { /* BUSY WAIT */ } p->r_ptr[p->bufflen-1] = 'a' + (p->cache ? p->tr : 0); } void SendTime(ArgStruct *p, double *t) { int p_bytes; void *remote_buff; *pTime = *t; p_bytes = sizeof(double); remote_buff = remote_ptr(pTime); ARMCI_Put(pTime, remote_buff, p_bytes, p->prot.nbor); p_bytes = sizeof(int); remote_buff = remote_ptr((void*)p->prot.flag); ARMCI_Put((void*)p->prot.flag, remote_buff, p_bytes, p->prot.nbor); } void RecvTime(ArgStruct *p, double *t) { while (*p->prot.flag != p->prot.ipe) { /* BUSY WAIT */ } *t = *pTime; *p->prot.flag = p->prot.nbor; } void SendRepeat(ArgStruct *p, int rpt) { void *remote_buff; int p_bytes; *pNrepeat = rpt; p_bytes = sizeof(int); remote_buff = remote_ptr(pNrepeat); ARMCI_Put(pNrepeat, remote_buff, p_bytes, p->prot.nbor); p_bytes = sizeof(int); remote_buff = remote_ptr((void*)p->prot.flag); ARMCI_Put((void*)p->prot.flag, remote_buff, p_bytes, p->prot.nbor); } void RecvRepeat(ArgStruct *p, int *rpt) { void *remote_buff; while (*p->prot.flag != p->prot.ipe) { /* BUSY WAIT */ } *rpt = *pNrepeat; *p->prot.flag = p->prot.nbor; } void CleanUp(ArgStruct *p) { ARMCI_Finalize(); } void Reset(ArgStruct *p) { } void AfterAlignmentInit(ArgStruct *p) { MPI_Status s; /* Calculate difference between malloc'ed buffer and aligned buffer */ int my_r_buff_offset = p->r_buff - p->r_buff_orig; /* Exchange offset data */ MPI_Send(&my_r_buff_offset, 1, MPI_INT, p->prot.nbor, 0, MPI_COMM_WORLD); MPI_Recv(&nbor_r_buff_offset, 1, MPI_INT, p->prot.nbor,0,MPI_COMM_WORLD, &s); } void MyMalloc(ArgStruct *p, int bufflen, int soffset, int roffset) { /* the MAX() is easier than another if clause and the offsets should be small enough for this to never matter */ p->r_buff = armci_malloc(bufflen+MAX(soffset,roffset)); if(!p->cache) p->s_buff = armci_malloc(bufflen+soffset); } void FreeBuff(char *buff1, char* buff2) { if(buff1 != NULL) armci_free(buff1); if(buff2 != NULL) armci_free(buff2); } NetPIPE-3.7.2/src/gm.c0000644000000000000000000001444011433312522014426 0ustar00usergroup00000000000000#include "netpipe.h" extern struct gm_port *gm_p; extern unsigned long *ltime, *lrpt; extern char *sync, *sync1; void Init(ArgStruct *p, int* pargc, char*** pargv) { p->tr = 0; p->rcv = 1; } void Setup(ArgStruct *p) { if(gm_open(&gm_p,0,5,"port2",(enum gm_api_version) GM_API_VERSION) != GM_SUCCESS) { printf(" Couldn't open board 0 port 2\n"); exit(-1); } else printf("Opened board 0 port2\n"); if( p->tr ) p->prot.host_id = gm_host_name_to_node_id(gm_p, p->host); gm_free_send_tokens(gm_p, GM_LOW_PRIORITY, gm_num_send_tokens(gm_p)); ltime = gm_dma_malloc(gm_p, sizeof(unsigned long)); lrpt = gm_dma_malloc(gm_p, sizeof(unsigned long)); sync = gm_dma_malloc(gm_p, 64); sync1 = gm_dma_malloc(gm_p, 64); sprintf(sync, "Syncme"); establish(p); p->prot.num_stokens = gm_num_send_tokens(gm_p); } void my_send_callback (struct gm_port *port, void *context, gm_status_t status) { if (status != GM_SUCCESS) { if (status != GM_SEND_DROPPED) { gm_perror ("send completed with error", status); } } } void establish(ArgStruct *p) { gm_recv_event_t *e; int bytesRead, recv_sz; char temp[60]; int todo = 1; if((p->r_buff = gm_dma_calloc(gm_p, 1, 64)) == 0) { printf("Couldn't allocate memory \n"); exit(0); } if((p->s_buff = gm_dma_calloc(gm_p, 1, 64)) == 0) { printf("Couldn't allocate memory \n"); exit(0); } if(p->tr){ sprintf(p->s_buff, "this is the sender!!"); gm_send_to_peer_with_callback(gm_p, p->s_buff, 7, (unsigned long) strlen(p->s_buff), GM_LOW_PRIORITY, p->prot.host_id, my_send_callback, NULL); } else { gm_provide_receive_buffer(gm_p, p->r_buff, 7, GM_LOW_PRIORITY); while (todo) { e = gm_receive(gm_p); switch(gm_ntoh_u8(e->recv.type)) { case GM_RECV_EVENT: case GM_PEER_RECV_EVENT: case GM_FAST_PEER_RECV_EVENT: /* printf("[recv] Received: \"%s\"\n", (char *) gm_ntohp (e->recv.message)); */ recv_sz=(int) gm_ntoh_u32 (e->recv.length); p->prot.host_id= gm_ntoh_u16(e->recv.sender_node_id); todo--; break; case GM_NO_RECV_EVENT: break; default: gm_unknown(gm_p,e); } } } } int readFully(void *buff, int len) { int bytesRead,bytesLeft; gm_recv_event_t *e; bytesLeft=len; bytesRead=0; while (bytesLeft>0) { e = gm_receive(gm_p); switch(gm_ntoh_u8(e->recv.type)) { case GM_FAST_PEER_RECV_EVENT: bytesRead = (int) gm_ntoh_u32 (e->recv.length); bytesLeft -= bytesRead; /* gm_memorize_message(buff, gm_ntohp (e->recv.message), gm_ntohl (e->recv.length)); */ bcopy(gm_ntohp(e->recv.message), buff,bytesRead); /* strncpy(buff, (char *) gm_ntohp (e->recv.message),bytesRead); */ break; case GM_RECV_EVENT: case GM_PEER_RECV_EVENT: bytesRead = (int) gm_ntoh_u32 (e->recv.length); bytesLeft -= bytesRead; break; case GM_NO_RECV_EVENT: break; default: gm_unknown(gm_p,e); } } return 1; } void Sync(ArgStruct *p) { int len; len=strlen(sync); gm_send_to_peer_with_callback(gm_p, sync, gm_min_size_for_length(len), (unsigned long) (len+1), GM_LOW_PRIORITY, p->prot.host_id, my_send_callback, NULL); gm_provide_receive_buffer(gm_p, sync1, gm_min_size_for_length(len), GM_LOW_PRIORITY); readFully(sync1,len+1); } void PrepareToReceive(ArgStruct *p) { /* The GM interface doesn't have a method to pre-post a buffer for reception of data. */ } void SendData(ArgStruct *p) { gm_send_to_peer_with_callback(gm_p, p->s_ptr, gm_min_size_for_length(p->bufflen), p->bufflen, GM_LOW_PRIORITY, p->prot.host_id, my_send_callback, NULL); } void RecvData(ArgStruct *p) { gm_provide_receive_buffer(gm_p, p->r_ptr, gm_min_size_for_length(p->bufflen), GM_LOW_PRIORITY); readFully(p->r_ptr, p->bufflen); } void SendTime(ArgStruct *p, double *t) { /* Multiply the number of seconds by 1e6 to get time in microseconds and convert value to an unsigned 32-bit integer. */ *ltime = (unsigned long)(*t * 1.e6); gm_send_to_peer_with_callback(gm_p, ltime, gm_min_size_for_length(sizeof(unsigned long)), sizeof(unsigned long), GM_LOW_PRIORITY, p->prot.host_id, my_send_callback, NULL); } void RecvTime(ArgStruct *p, double *t) { gm_provide_receive_buffer(gm_p, ltime, gm_min_size_for_length(sizeof(unsigned long)), GM_LOW_PRIORITY); readFully(ltime, sizeof(unsigned long)); /* ltime = ntohl(p->buff1); */ /* Result is ltime (in microseconds) divided by 1.0e6 to get seconds */ *t = (double)(*ltime) / 1.0e6; } void SendRepeat(ArgStruct *p, int rpt) { *lrpt = (int)rpt; /* Send repeat count as a long in network order */ gm_send_to_peer_with_callback(gm_p, lrpt, gm_min_size_for_length(sizeof(unsigned long)), sizeof(unsigned long), GM_LOW_PRIORITY, p->prot.host_id, my_send_callback, NULL); } void RecvRepeat(ArgStruct *p, int *rpt) { gm_provide_receive_buffer(gm_p, lrpt, gm_min_size_for_length(sizeof(unsigned long)), GM_LOW_PRIORITY); readFully(lrpt,sizeof(unsigned long)); *rpt =(int)*lrpt; } void CleanUp(ArgStruct *p) { sleep(2); gm_close(gm_p); gm_exit(GM_SUCCESS); gm_finalize(); } void Reset(ArgStruct *p) { } void AfterAlignmentInit(ArgStruct *p) { } void MyMalloc(ArgStruct *p, int bufflen, int soffset, int roffset) { if((p->r_buff = (char *)gm_dma_malloc(gm_p, bufflen+MAX(soffset,roffset)))==(char *)NULL) { fprintf(stderr,"couldn't allocate memory\n"); exit(-1); } if(!p->cache) if((p->s_buff = (char *)gm_dma_malloc(gm_p, bufflen+soffset))==(char *)NULL) { fprintf(stderr,"Couldn't allocate memory\n"); exit(-1); } } void FreeBuff(char *buff1, char *buff2) { if(buff1 != NULL) gm_dma_free(gm_p, buff1); if(buff2 != NULL) gm_dma_free(gm_p, buff2); } NetPIPE-3.7.2/src/gpshmem.c0000644000000000000000000000506311433312522015464 0ustar00usergroup00000000000000#include "netpipe.h" extern double *pTime; extern int *pNrepeat; void Init(ArgStruct *p, int* pargc, char*** pargv) { gpshmem_init(pargc, pargv); } void Setup(ArgStruct *p) { int npes; if((npes=gpnumpes())!=2) { printf("Error Message: npes = %d - You must run on 2 nodes\n", gpnumpes()); exit(1); } p->prot.flag=(int *) gpshmalloc(sizeof(int)); pTime = (double *) gpshmalloc(sizeof(double)); pNrepeat = (int *) gpshmalloc(sizeof(int)); p->tr = p->rcv = 0; if((p->prot.ipe=gpmype()) == 0) { p->tr=1; p->prot.nbor=1; *p->prot.flag=1; } else { p->rcv=1; p->prot.nbor=0; *p->prot.flag=0; } } void Sync(ArgStruct *p) { gpshmem_barrier_all(); } void PrepareToReceive(ArgStruct *p) { } void SendData(ArgStruct *p) { if(p->bufflen%4==0) gpshmem_put32((short*)p->buff,(short*)p->buff,p->bufflen/4,p->prot.nbor); else gpshmem_putmem(p->buff,p->buff,p->bufflen,p->prot.nbor); } void RecvData(ArgStruct *p) { int i=0; while( p->buff[p->bufflen-1] != 'b'+p->prot.ipe ) { if( ++i%10000000==0 ) printf(""); } p->buff[p->bufflen-1] = 'b' + p->prot.nbor; } void SendTime(ArgStruct *p, double *t) { *pTime=*t; gpshmem_putmem(pTime,pTime,sizeof(double),p->prot.nbor); gpshmem_putmem(p->prot.flag,p->prot.flag,sizeof(int),p->prot.nbor); } void RecvTime(ArgStruct *p, double *t) { int i=0; while(*p->prot.flag!=p->prot.ipe) { if(++i%10000000==0) printf(""); } *t=*pTime; *p->prot.flag=p->prot.nbor; } void SendRepeat(ArgStruct *p, int rpt) { *pNrepeat= rpt; gpshmem_putmem(pNrepeat,pNrepeat,sizeof(int),p->prot.nbor); gpshmem_putmem(p->prot.flag,p->prot.flag,sizeof(int),p->prot.nbor); } void RecvRepeat(ArgStruct *p, int *rpt) { int i=0; while( *p->prot.flag != p->prot.ipe ) { if( ++i%2 == 3 ) printf("%d", *p->prot.flag); /* invalidate cache */ } *rpt=*pNrepeat; *p->prot.flag=p->prot.nbor; } void CleanUp(ArgStruct *p) { gpshmem_finalize(); } void Reset(ArgStruct *p) { } void MyMalloc(ArgStruct *p, int bufflen, int soffset, int roffset) { if((p->buff=(char *)gpshmalloc(bufflen+MAX(soffset,roffset)))==(char *)NULL) { fprintf(stderr,"couldn't allocate memory\n"); exit(-1); } p->buff[bufflen-1]='b'+p->tr; if((p->buff1=(char *)gpshmalloc(bufflen+soffset))==(char *)NULL) { fprintf(stderr,"Couldn't allocate memory\n"); exit(-1); } return 0; } void FreeBuff(char *buff1, char* buff2) { gpshfree(buff1); gpshfree(buff2); } NetPIPE-3.7.2/src/ib.c0000644000000000000000000007666611433312522014437 0ustar00usergroup00000000000000/*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* ib.c ---- Infiniband module for the Mellanox VAPI */ /*****************************************************************************/ #define USE_VOLATILE_RPTR /* needed for polling on last byte of recv buffer */ #include "netpipe.h" #include #include /* Debugging output macro */ FILE* logfile; #if 0 #define LOGPRINTF(_format, _aa...) fprintf(logfile, __FUNCTION__": " _format, ##_aa); fflush(logfile) #else #define LOGPRINTF(_format, _aa...) #endif /* Header files needed for Infiniband */ #include "vapi.h" /* Mellanox Verbs API */ #include "evapi.h" /* Mellanox Verbs API extension */ #include "vapi_common.h" /* Mellanox VIP layer of HCA Verbs */ /* Global vars */ static VAPI_hca_hndl_t hca_hndl=VAPI_INVAL_HNDL; static VAPI_hca_port_t hca_port; static int port_num; static IB_lid_t lid; static IB_lid_t d_lid; static VAPI_pd_hndl_t pd_hndl=VAPI_INVAL_HNDL; static VAPI_cqe_num_t num_cqe; static VAPI_cqe_num_t act_num_cqe; static VAPI_cq_hndl_t s_cq_hndl=VAPI_INVAL_HNDL; static VAPI_cq_hndl_t r_cq_hndl=VAPI_INVAL_HNDL; static EVAPI_compl_handler_hndl_t ceh_hndl=VAPI_INVAL_HNDL; static VAPI_mrw_t mr_in; static VAPI_mrw_t s_mr_out; static VAPI_mrw_t r_mr_out; static VAPI_mr_hndl_t s_mr_hndl=VAPI_INVAL_HNDL; static VAPI_mr_hndl_t r_mr_hndl=VAPI_INVAL_HNDL; static VAPI_qp_init_attr_t qp_init_attr; static VAPI_qp_prop_t qp_prop; static VAPI_qp_hndl_t qp_hndl=VAPI_INVAL_HNDL; static VAPI_qp_num_t d_qp_num; static VAPI_qp_attr_mask_t qp_attr_mask; static VAPI_qp_attr_t qp_attr; static VAPI_qp_cap_t qp_cap; static VAPI_wc_desc_t wc; static int max_wq=50000; static void* remote_address; static VAPI_rkey_t remote_key; static volatile int receive_complete; /* Local prototypes */ void event_handler(VAPI_hca_hndl_t, VAPI_cq_hndl_t, void*); /* Function definitions */ void Init(ArgStruct *p, int* pargc, char*** pargv) { /* Set defaults */ p->prot.ib_mtu = MTU1024; /* 1024 Byte MTU */ p->prot.commtype = NP_COMM_SENDRECV; /* Use Send/Receive communications */ p->prot.comptype = NP_COMP_LOCALPOLL; /* Use local polling for completion */ p->tr = 0; /* I am not the transmitter */ p->rcv = 1; /* I am the receiver */ } void Setup(ArgStruct *p) { int one = 1; int sockfd; struct sockaddr_in *lsin1, *lsin2; /* ptr to sockaddr_in in ArgStruct */ char *host; struct hostent *addr; struct protoent *proto; int send_size, recv_size, sizeofint = sizeof(int); struct sigaction sigact1; char logfilename[80]; /* Sanity check */ if( p->prot.commtype == NP_COMM_RDMAWRITE && p->prot.comptype != NP_COMP_LOCALPOLL ) { fprintf(stderr, "Error, RDMA Write may only be used with local polling.\n"); fprintf(stderr, "Try using RDMA Write With Immediate Data with vapi polling\n"); fprintf(stderr, "or event completion\n"); exit(-1); } /* Open log file */ sprintf(logfilename, ".iblog%d", 1 - p->tr); logfile = fopen(logfilename, "w"); host = p->host; /* copy ptr to hostname */ lsin1 = &(p->prot.sin1); lsin2 = &(p->prot.sin2); bzero((char *) lsin1, sizeof(*lsin1)); bzero((char *) lsin2, sizeof(*lsin2)); if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ printf("NetPIPE: can't open stream socket! errno=%d\n", errno); exit(-4); } if(!(proto = getprotobyname("tcp"))){ printf("NetPIPE: protocol 'tcp' unknown!\n"); exit(555); } if (p->tr){ /* if client i.e., Sender */ if (atoi(host) > 0) { /* Numerical IP address */ lsin1->sin_family = AF_INET; lsin1->sin_addr.s_addr = inet_addr(host); } else { if ((addr = gethostbyname(host)) == NULL){ printf("NetPIPE: invalid hostname '%s'\n", host); exit(-5); } lsin1->sin_family = addr->h_addrtype; bcopy(addr->h_addr, (char*) &(lsin1->sin_addr.s_addr), addr->h_length); } lsin1->sin_port = htons(p->port); } else { /* we are the receiver (server) */ bzero((char *) lsin1, sizeof(*lsin1)); lsin1->sin_family = AF_INET; lsin1->sin_addr.s_addr = htonl(INADDR_ANY); lsin1->sin_port = htons(p->port); /* re-use socket, common if netpipe aborts due to busted networks */ one = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int))) { printf("NetPIPE: server: unable to setsockopt -- errno %d\n", errno); exit(-7); } if (bind(sockfd, (struct sockaddr *) lsin1, sizeof(*lsin1)) < 0){ printf("NetPIPE: server: bind on local address failed! errno=%d", errno); exit(-6); } } if(p->tr) p->commfd = sockfd; else p->servicefd = sockfd; /* Establish tcp connections */ establish(p); /* Initialize Mellanox Infiniband */ if(initIB(p) == -1) { CleanUp(p); exit(-1); } } int initIB(ArgStruct *p) { VAPI_ret_t ret; /* Open HCA */ /* open hca just in case it was not opened by system earlier */ ret = VAPI_open_hca("InfiniHost0", &hca_hndl); ret = EVAPI_get_hca_hndl("InfiniHost0", &hca_hndl); if(ret != VAPI_OK) { fprintf(stderr, "Error opening Infiniband HCA: %s\n", VAPI_strerror(ret)); return -1; } else { LOGPRINTF("Opened Infiniband HCA\n"); } /* Get HCA properties */ port_num=1; ret = VAPI_query_hca_port_prop(hca_hndl, (IB_port_t)port_num, (VAPI_hca_port_t *)&hca_port); if(ret != VAPI_OK) { fprintf(stderr, "Error querying Infiniband HCA: %s\n", VAPI_strerror(ret)); return -1; } else { LOGPRINTF("Queried Infiniband HCA\n"); } lid = hca_port.lid; LOGPRINTF(" lid = %d\n", lid); /* Allocate Protection Domain */ ret = VAPI_alloc_pd(hca_hndl, &pd_hndl); if(ret != VAPI_OK) { fprintf(stderr, "Error allocating PD: %s\n", VAPI_strerror(ret)); return -1; } else { LOGPRINTF("Allocated Protection Domain\n"); } /* Create send completion queue */ num_cqe = 30000; /* Requested number of completion q elements */ ret = VAPI_create_cq(hca_hndl, num_cqe, &s_cq_hndl, &act_num_cqe); if(ret != VAPI_OK) { fprintf(stderr, "Error creating send CQ: %s\n", VAPI_strerror(ret)); return -1; } else { LOGPRINTF("Created Send Completion Queue with %d elements\n", act_num_cqe); } /* Create recv completion queue */ num_cqe = 20000; /* Requested number of completion q elements */ ret = VAPI_create_cq(hca_hndl, num_cqe, &r_cq_hndl, &act_num_cqe); if(ret != VAPI_OK) { fprintf(stderr, "Error creating recv CQ: %s\n", VAPI_strerror(ret)); return -1; } else { LOGPRINTF("Created Recv Completion Queue with %d elements\n", act_num_cqe); } /* Placeholder for MR */ /* Create Queue Pair */ qp_init_attr.cap.max_oust_wr_rq = max_wq; /* Max outstanding WR on RQ */ qp_init_attr.cap.max_oust_wr_sq = max_wq; /* Max outstanding WR on SQ */ qp_init_attr.cap.max_sg_size_rq = 1; /* Max scatter/gather entries on RQ */ qp_init_attr.cap.max_sg_size_sq = 1; /* Max scatter/gather entries on SQ */ qp_init_attr.pd_hndl = pd_hndl; /* Protection domain handle */ qp_init_attr.rdd_hndl = 0; /* Reliable datagram domain handle */ qp_init_attr.rq_cq_hndl = r_cq_hndl; /* CQ handle for RQ */ qp_init_attr.rq_sig_type = VAPI_SIGNAL_REQ_WR; /* Signalling type */ qp_init_attr.sq_cq_hndl = s_cq_hndl; /* CQ handle for RQ */ qp_init_attr.sq_sig_type = VAPI_SIGNAL_REQ_WR; /* Signalling type */ qp_init_attr.ts_type = IB_TS_RC; /* Transmission type */ ret = VAPI_create_qp(hca_hndl, &qp_init_attr, &qp_hndl, &qp_prop); if(ret != VAPI_OK) { fprintf(stderr, "Error creating Queue Pair: %s\n", VAPI_strerror(ret)); return -1; } else { LOGPRINTF("Created Queue Pair, max outstanding WR on RQ: %d, on SQ: %d\n", qp_prop.cap.max_oust_wr_rq, qp_prop.cap.max_oust_wr_sq); } /* Exchange lid and qp_num with other node */ if( write(p->commfd, &lid, sizeof(lid) ) != sizeof(lid) ) { fprintf(stderr, "Failed to send lid over socket\n"); return -1; } if( write(p->commfd, &qp_prop.qp_num, sizeof(qp_prop.qp_num) ) != sizeof(qp_prop.qp_num) ) { fprintf(stderr, "Failed to send qpnum over socket\n"); return -1; } if( read(p->commfd, &d_lid, sizeof(d_lid) ) != sizeof(d_lid) ) { fprintf(stderr, "Failed to read lid from socket\n"); return -1; } if( read(p->commfd, &d_qp_num, sizeof(d_qp_num) ) != sizeof(d_qp_num) ) { fprintf(stderr, "Failed to read qpnum from socket\n"); return -1; } LOGPRINTF("Local: lid=%d qp_num=%d Remote: lid=%d qp_num=%d\n", lid, qp_prop.qp_num, d_lid, d_qp_num); /* Bring up Queue Pair */ /******* INIT state ******/ QP_ATTR_MASK_CLR_ALL(qp_attr_mask); qp_attr.qp_state = VAPI_INIT; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_QP_STATE); qp_attr.pkey_ix = 0; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_PKEY_IX); qp_attr.port = port_num; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_PORT); qp_attr.remote_atomic_flags = VAPI_EN_REM_WRITE | VAPI_EN_REM_READ; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_REMOTE_ATOMIC_FLAGS); ret = VAPI_modify_qp(hca_hndl, qp_hndl, &qp_attr, &qp_attr_mask, &qp_cap); if(ret != VAPI_OK) { fprintf(stderr, "Error modifying QP to INIT: %s\n", VAPI_strerror(ret)); return -1; } LOGPRINTF("Modified QP to INIT\n"); /******* RTR (Ready-To-Receive) state *******/ QP_ATTR_MASK_CLR_ALL(qp_attr_mask); qp_attr.qp_state = VAPI_RTR; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_QP_STATE); qp_attr.qp_ous_rd_atom = 1; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_QP_OUS_RD_ATOM); qp_attr.dest_qp_num = d_qp_num; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_DEST_QP_NUM); qp_attr.av.sl = 0; qp_attr.av.grh_flag = FALSE; qp_attr.av.dlid = d_lid; qp_attr.av.static_rate = 0; qp_attr.av.src_path_bits = 0; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_AV); qp_attr.path_mtu = p->prot.ib_mtu; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_PATH_MTU); qp_attr.rq_psn = 0; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_RQ_PSN); qp_attr.pkey_ix = 0; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_PKEY_IX); qp_attr.min_rnr_timer = 5; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_MIN_RNR_TIMER); ret = VAPI_modify_qp(hca_hndl, qp_hndl, &qp_attr, &qp_attr_mask, &qp_cap); if(ret != VAPI_OK) { fprintf(stderr, "Error modifying QP to RTR: %s\n", VAPI_strerror(ret)); return -1; } LOGPRINTF("Modified QP to RTR\n"); /* Sync before going to RTS state */ Sync(p); /******* RTS (Ready-to-Send) state *******/ QP_ATTR_MASK_CLR_ALL(qp_attr_mask); qp_attr.qp_state = VAPI_RTS; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_QP_STATE); qp_attr.sq_psn = 0; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_SQ_PSN); qp_attr.timeout = 31; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_TIMEOUT); qp_attr.retry_count = 1; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_RETRY_COUNT); qp_attr.rnr_retry = 1; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_RNR_RETRY); qp_attr.ous_dst_rd_atom = 1; QP_ATTR_MASK_SET(qp_attr_mask, QP_ATTR_OUS_DST_RD_ATOM); ret = VAPI_modify_qp(hca_hndl, qp_hndl, &qp_attr, &qp_attr_mask, &qp_cap); if(ret != VAPI_OK) { fprintf(stderr, "Error modifying QP to RTS: %s\n", VAPI_strerror(ret)); return -1; } LOGPRINTF("Modified QP to RTS\n"); /* If using event completion, register event completion handler and request * the initial notification */ if( p->prot.comptype == NP_COMP_EVENT ) { EVAPI_set_comp_eventh(hca_hndl, r_cq_hndl, event_handler, p, &ceh_hndl); VAPI_req_comp_notif(hca_hndl, r_cq_hndl, VAPI_NEXT_COMP); } return 0; } int finalizeIB(ArgStruct *p) { VAPI_ret_t ret; LOGPRINTF("Finalizing IB stuff\n"); /* Clear completion event handler */ if(p->prot.comptype == NP_COMP_EVENT ) { LOGPRINTF("Clearing comp handler\n"); ret = EVAPI_clear_comp_eventh(hca_hndl, ceh_hndl); if(ret != VAPI_OK) { fprintf(stderr, "Error clearing event handler: %s\n", VAPI_strerror(ret)); } } if(qp_hndl != VAPI_INVAL_HNDL) { LOGPRINTF("Destroying QP\n"); ret = VAPI_destroy_qp(hca_hndl, qp_hndl); if(ret != VAPI_OK) { fprintf(stderr, "Error destroying Queue Pair: %s\n", VAPI_strerror(ret)); } } if(r_cq_hndl != VAPI_INVAL_HNDL) { LOGPRINTF("Destroying Recv CQ\n"); ret = VAPI_destroy_cq(hca_hndl, r_cq_hndl); if(ret != VAPI_OK) { fprintf(stderr, "Error destroying recv CQ: %s\n", VAPI_strerror(ret)); } } if(s_cq_hndl != VAPI_INVAL_HNDL) { LOGPRINTF("Destroying Send CQ\n"); ret = VAPI_destroy_cq(hca_hndl, s_cq_hndl); if(ret != VAPI_OK) { fprintf(stderr, "Error destroying send CQ: %s\n", VAPI_strerror(ret)); } } /* Check memory registrations just in case user bailed out */ if(s_mr_hndl != VAPI_INVAL_HNDL) { LOGPRINTF("Deregistering send buffer\n"); ret = VAPI_deregister_mr(hca_hndl, s_mr_hndl); if(ret != VAPI_OK) { fprintf(stderr, "Error deregistering send mr: %s\n", VAPI_strerror(ret)); } } if(r_mr_hndl != VAPI_INVAL_HNDL) { LOGPRINTF("Deregistering recv buffer\n"); ret = VAPI_deregister_mr(hca_hndl, r_mr_hndl); if(ret != VAPI_OK) { fprintf(stderr, "Error deregistering recv mr: %s\n", VAPI_strerror(ret)); } } if(pd_hndl != VAPI_INVAL_HNDL) { LOGPRINTF("Deallocating PD\n"); ret = VAPI_dealloc_pd(hca_hndl, pd_hndl); if(ret != VAPI_OK) { fprintf(stderr, "Error deallocating PD: %s\n", VAPI_strerror(ret)); } } /* Application code should not close HCA, just release handle */ if(hca_hndl != VAPI_INVAL_HNDL) { LOGPRINTF("Releasing HCA\n"); ret = EVAPI_release_hca_hndl(hca_hndl); if(ret != VAPI_OK) { fprintf(stderr, "Error releasing HCA: %s\n", VAPI_strerror(ret)); } } return 0; } void event_handler(VAPI_hca_hndl_t hca, VAPI_cq_hndl_t cq, void* data) { VAPI_ret_t ret; while(1) { ret = VAPI_poll_cq(hca, cq, &wc); if(ret == VAPI_CQ_EMPTY) { LOGPRINTF("Empty completion queue, requesting next notification\n"); VAPI_req_comp_notif(hca_hndl, r_cq_hndl, VAPI_NEXT_COMP); return; } else if(ret != VAPI_OK) { fprintf(stderr, "Error in event_handler, polling cq: %s\n", VAPI_strerror(ret)); exit(-1); } else if(wc.status != VAPI_SUCCESS) { fprintf(stderr, "Error in event_handler, on returned work completion " "status: %s\n", VAPI_wc_status_sym(wc.status)); exit(-1); } LOGPRINTF("Retrieved work completion\n"); /* For ping-pong mode at least, this check shouldn't be needed for * normal operation, but it will help catch any bugs with multiple * sends coming through when we're only expecting one. */ if(receive_complete == 1) { while(receive_complete != 0) sched_yield(); } receive_complete = 1; } } static int readFully(int fd, void *obuf, int len) { int bytesLeft = len; char *buf = (char *) obuf; int bytesRead = 0; while (bytesLeft > 0 && (bytesRead = read(fd, (void *) buf, bytesLeft)) > 0) { bytesLeft -= bytesRead; buf += bytesRead; } if (bytesRead <= 0) return bytesRead; return len; } void Sync(ArgStruct *p) { char s[] = "SyncMe"; char response[7]; if (write(p->commfd, s, strlen(s)) < 0 || readFully(p->commfd, response, strlen(s)) < 0) { perror("NetPIPE: error writing or reading synchronization string"); exit(3); } if (strncmp(s, response, strlen(s))) { fprintf(stderr, "NetPIPE: Synchronization string incorrect!\n"); exit(3); } } void PrepareToReceive(ArgStruct *p) { VAPI_ret_t ret; /* Return code */ VAPI_rr_desc_t rr; /* Receive request */ VAPI_sg_lst_entry_t sg_entry; /* Scatter/Gather list - holds buff addr */ /* We don't need to post a receive if doing RDMA write with local polling */ if( p->prot.commtype == NP_COMM_RDMAWRITE && p->prot.comptype == NP_COMP_LOCALPOLL ) return; rr.opcode = VAPI_RECEIVE; /* We only need signaled completions if using VAPI * completion methods. */ if( p->prot.comptype == NP_COMP_LOCALPOLL ) rr.comp_type = VAPI_UNSIGNALED; else rr.comp_type = VAPI_SIGNALED; rr.sg_lst_len = 1; rr.sg_lst_p = &sg_entry; sg_entry.lkey = r_mr_out.l_key; sg_entry.len = p->bufflen; sg_entry.addr = (VAPI_virt_addr_t)(MT_virt_addr_t)p->r_ptr; ret = VAPI_post_rr(hca_hndl, qp_hndl, &rr); if(ret != VAPI_OK) { fprintf(stderr, "Error posting recv request: %s\n", VAPI_strerror(ret)); CleanUp(p); exit(-1); } else { LOGPRINTF("Posted recv request\n"); } /* Set receive flag to zero and request event completion * notification for this receive so the event handler will * be triggered when the receive completes. */ if( p->prot.comptype == NP_COMP_EVENT ) { receive_complete = 0; } } void SendData(ArgStruct *p) { VAPI_ret_t ret; /* Return code */ VAPI_sr_desc_t sr; /* Send request */ VAPI_sg_lst_entry_t sg_entry; /* Scatter/Gather list - holds buff addr */ /* Fill in send request struct */ if(p->prot.commtype == NP_COMM_SENDRECV) { sr.opcode = VAPI_SEND; LOGPRINTF("Doing regular send\n"); } else if(p->prot.commtype == NP_COMM_SENDRECV_WITH_IMM) { sr.opcode = VAPI_SEND_WITH_IMM; LOGPRINTF("Doing regular send with imm\n"); } else if(p->prot.commtype == NP_COMM_RDMAWRITE) { sr.opcode = VAPI_RDMA_WRITE; sr.remote_addr = (VAPI_virt_addr_t)(MT_virt_addr_t)(remote_address + (p->s_ptr - p->s_buff)); sr.r_key = remote_key; LOGPRINTF("Doing RDMA write (raddr=%p)\n", sr.remote_addr); } else if(p->prot.commtype == NP_COMM_RDMAWRITE_WITH_IMM) { sr.opcode = VAPI_RDMA_WRITE_WITH_IMM; sr.remote_addr = (VAPI_virt_addr_t)(MT_virt_addr_t)(remote_address + (p->s_ptr - p->s_buff)); sr.r_key = remote_key; LOGPRINTF("Doing RDMA write with imm (raddr=%p)\n", sr.remote_addr); } else { fprintf(stderr, "Error, invalid communication type in SendData\n"); exit(-1); } sr.comp_type = VAPI_UNSIGNALED; sr.set_se = FALSE; /* This needed due to a bug in Mellanox HW rel a-0 */ sr.sg_lst_len = 1; sr.sg_lst_p = &sg_entry; sg_entry.lkey = s_mr_out.l_key; /* Local memory region key */ sg_entry.len = p->bufflen; sg_entry.addr = (VAPI_virt_addr_t)(MT_virt_addr_t)p->s_ptr; ret = VAPI_post_sr(hca_hndl, qp_hndl, &sr); if(ret != VAPI_OK) { fprintf(stderr, "Error posting send request: %s\n", VAPI_strerror(ret)); } else { LOGPRINTF("Posted send request\n"); } } void RecvData(ArgStruct *p) { VAPI_ret_t ret; /* Busy wait for incoming data */ LOGPRINTF("Receiving at buffer address %p\n", p->r_ptr); if( p->prot.comptype == NP_COMP_LOCALPOLL ) { /* Poll for receive completion locally on the receive data */ LOGPRINTF("Waiting for last byte of data to arrive\n"); while(p->r_ptr[p->bufflen-1] != 'a' + (p->cache ? 1 - p->tr : 1) ) { /* BUSY WAIT -- this should be fine since we * declared r_ptr with volatile qualifier */ } /* Reset last byte */ p->r_ptr[p->bufflen-1] = 'a' + (p->cache ? p->tr : 0); LOGPRINTF("Received all of data\n"); } else if( p->prot.comptype == NP_COMP_VAPIPOLL ) { /* Poll for receive completion using VAPI poll function */ LOGPRINTF("Polling completion queue for VAPI work completion\n"); ret = VAPI_CQ_EMPTY; while(ret == VAPI_CQ_EMPTY) ret = VAPI_poll_cq(hca_hndl, r_cq_hndl, &wc); if(ret != VAPI_OK) { fprintf(stderr, "Error in RecvData, polling for completion: %s\n", VAPI_strerror(ret)); exit(-1); } if(wc.status != VAPI_SUCCESS) { fprintf(stderr, "Error in status of returned completion: %s\n", VAPI_wc_status_sym(wc.status)); exit(-1); } LOGPRINTF("Retrieved successful completion\n"); } else if( p->prot.comptype == NP_COMP_EVENT ) { /* Instead of polling directly on data or VAPI completion queue, * let the VAPI event completion handler set a flag when the receive * completes, and poll on that instead. Could try using semaphore here * as well to eliminate busy polling */ LOGPRINTF("Polling receive flag\n"); while( receive_complete == 0 ) { /* BUSY WAIT */ } /* If in prepost-burst mode, we won't be calling PrepareToReceive * between ping-pongs, so we need to reset the receive_complete * flag here. */ if( p->preburst ) receive_complete = 0; LOGPRINTF("Receive completed\n"); } } /* Reset is used after a trial to empty the work request queues so we have enough room for the next trial to run */ void Reset(ArgStruct *p) { VAPI_ret_t ret; /* Return code */ VAPI_sr_desc_t sr; /* Send request */ VAPI_rr_desc_t rr; /* Recv request */ /* If comptype is event, then we'll use event handler to detect receive, * so initialize receive_complete flag */ if(p->prot.comptype == NP_COMP_EVENT) receive_complete = 0; /* Prepost receive */ rr.opcode = VAPI_RECEIVE; rr.comp_type = VAPI_SIGNALED; rr.sg_lst_len = 0; LOGPRINTF("Posting recv request in Reset\n"); ret = VAPI_post_rr(hca_hndl, qp_hndl, &rr); if(ret != VAPI_OK) { fprintf(stderr, " Error posting recv request: %s\n", VAPI_strerror(ret)); CleanUp(p); exit(-1); } /* Make sure both nodes have preposted receives */ Sync(p); /* Post Send */ sr.opcode = VAPI_SEND; sr.comp_type = VAPI_SIGNALED; sr.set_se = FALSE; /* This needed due to a bug in Mellanox HW rel a-0 */ sr.sg_lst_len = 0; LOGPRINTF("Posting send request \n"); ret = VAPI_post_sr(hca_hndl, qp_hndl, &sr); if(ret != VAPI_OK) { fprintf(stderr, " Error posting send request in Reset: %s\n", VAPI_strerror(ret)); exit(-1); } if(wc.status != VAPI_SUCCESS) { fprintf(stderr, " Error in completion status: %s\n", VAPI_wc_status_sym(wc.status)); exit(-1); } LOGPRINTF("Polling for completion of send request\n"); ret = VAPI_CQ_EMPTY; while(ret == VAPI_CQ_EMPTY) ret = VAPI_poll_cq(hca_hndl, s_cq_hndl, &wc); if(ret != VAPI_OK) { fprintf(stderr, "Error polling CQ for send in Reset: %s\n", VAPI_strerror(ret)); exit(-1); } if(wc.status != VAPI_SUCCESS) { fprintf(stderr, " Error in completion status: %s\n", VAPI_wc_status_sym(wc.status)); exit(-1); } LOGPRINTF("Status of send completion: %s\n", VAPI_wc_status_sym(wc.status)); if(p->prot.comptype == NP_COMP_EVENT) { /* If using event completion, the event handler will set receive_complete * when it gets the completion event. */ LOGPRINTF("Waiting for receive_complete flag\n"); while(receive_complete == 0) { /* BUSY WAIT */ } } else { LOGPRINTF("Polling for completion of recv request\n"); ret = VAPI_CQ_EMPTY; while(ret == VAPI_CQ_EMPTY) ret = VAPI_poll_cq(hca_hndl, r_cq_hndl, &wc); if(ret != VAPI_OK) { fprintf(stderr, "Error polling CQ for recv in Reset: %s\n", VAPI_strerror(ret)); exit(-1); } if(wc.status != VAPI_SUCCESS) { fprintf(stderr, " Error in completion status: %s\n", VAPI_wc_status_sym(wc.status)); exit(-1); } LOGPRINTF("Status of recv completion: %s\n", VAPI_wc_status_sym(wc.status)); } LOGPRINTF("Done with reset\n"); } void SendTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; /* Multiply the number of seconds by 1e6 to get time in microseconds and convert value to an unsigned 32-bit integer. */ ltime = (uint32_t)(*t * 1.e6); /* Send time in network order */ ntime = htonl(ltime); if (write(p->commfd, (char *)&ntime, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendTime: errno=%d\n", errno); exit(301); } } void RecvTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; int bytesRead; bytesRead = readFully(p->commfd, (void *)&ntime, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvTime: errno=%d\n", errno); exit(302); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvTime of %d bytes\n", bytesRead); exit(303); } ltime = ntohl(ntime); /* Result is ltime (in microseconds) divided by 1.0e6 to get seconds */ *t = (double)ltime / 1.0e6; } void SendRepeat(ArgStruct *p, int rpt) { uint32_t lrpt, nrpt; lrpt = rpt; /* Send repeat count as a long in network order */ nrpt = htonl(lrpt); if (write(p->commfd, (void *) &nrpt, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendRepeat: errno=%d\n", errno); exit(304); } } void RecvRepeat(ArgStruct *p, int *rpt) { uint32_t lrpt, nrpt; int bytesRead; bytesRead = readFully(p->commfd, (void *)&nrpt, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvRepeat: errno=%d\n", errno); exit(305); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvRepeat of %d bytes\n", bytesRead); exit(306); } lrpt = ntohl(nrpt); *rpt = lrpt; } void establish(ArgStruct *p) { int clen; int one = 1; struct protoent; clen = sizeof(p->prot.sin2); if(p->tr){ if(connect(p->commfd, (struct sockaddr *) &(p->prot.sin1), sizeof(p->prot.sin1)) < 0){ printf("Client: Cannot Connect! errno=%d\n",errno); exit(-10); } } else { /* SERVER */ listen(p->servicefd, 5); p->commfd = accept(p->servicefd, (struct sockaddr *) &(p->prot.sin2), &clen); if(p->commfd < 0){ printf("Server: Accept Failed! errno=%d\n",errno); exit(-12); } } } void CleanUp(ArgStruct *p) { char *quit="QUIT"; if (p->tr) { write(p->commfd,quit, 5); read(p->commfd, quit, 5); close(p->commfd); } else { read(p->commfd,quit, 5); write(p->commfd,quit,5); close(p->commfd); close(p->servicefd); } finalizeIB(p); } void AfterAlignmentInit(ArgStruct *p) { int bytesRead; /* Exchange buffer pointers and remote infiniband keys if doing rdma. Do * the exchange in this function because this will happen after any * memory alignment is done, which is important for getting the * correct remote address. */ if( p->prot.commtype == NP_COMM_RDMAWRITE || p->prot.commtype == NP_COMM_RDMAWRITE_WITH_IMM ) { /* Send my receive buffer address */ if(write(p->commfd, (void *)&p->r_buff, sizeof(void*)) < 0) { perror("NetPIPE: write of buffer address failed in AfterAlignmentInit"); exit(-1); } LOGPRINTF("Sent buffer address: %p\n", p->r_buff); /* Send my remote key for accessing * my remote buffer via IB RDMA */ if(write(p->commfd, (void *)&r_mr_out.r_key, sizeof(VAPI_rkey_t)) < 0) { perror("NetPIPE: write of remote key failed in AfterAlignmentInit"); exit(-1); } LOGPRINTF("Sent remote key: %d\n", r_mr_out.r_key); /* Read the sent data */ bytesRead = readFully(p->commfd, (void *)&remote_address, sizeof(void*)); if (bytesRead < 0) { perror("NetPIPE: read of buffer address failed in AfterAlignmentInit"); exit(-1); } else if (bytesRead != sizeof(void*)) { perror("NetPIPE: partial read of buffer address in AfterAlignmentInit"); exit(-1); } LOGPRINTF("Received remote address from other node: %p\n", remote_address); bytesRead = readFully(p->commfd, (void *)&remote_key, sizeof(VAPI_rkey_t)); if (bytesRead < 0) { perror("NetPIPE: read of remote key failed in AfterAlignmentInit"); exit(-1); } else if (bytesRead != sizeof(VAPI_rkey_t)) { perror("NetPIPE: partial read of remote key in AfterAlignmentInit"); exit(-1); } LOGPRINTF("Received remote key from other node: %d\n", remote_key); } } void MyMalloc(ArgStruct *p, int bufflen, int soffset, int roffset) { VAPI_ret_t ret; /* Allocate buffers */ p->r_buff = malloc(bufflen+MAX(soffset,roffset)); if(p->r_buff == NULL) { fprintf(stderr, "Error malloc'ing buffer\n"); exit(-1); } if(p->cache) { /* Infiniband spec says we can register same memory region * more than once, so just copy buffer address. We will register * the same buffer twice with Infiniband. */ p->s_buff = p->r_buff; } else { p->s_buff = malloc(bufflen+soffset); if(p->s_buff == NULL) { fprintf(stderr, "Error malloc'ing buffer\n"); exit(-1); } } /* Register buffers with Infiniband */ mr_in.acl = VAPI_EN_LOCAL_WRITE | VAPI_EN_REMOTE_WRITE; mr_in.l_key = 0; mr_in.pd_hndl = pd_hndl; mr_in.r_key = 0; mr_in.size = bufflen+MAX(soffset,roffset); mr_in.start = (VAPI_virt_addr_t)(MT_virt_addr_t)p->r_buff; mr_in.type = VAPI_MR; ret = VAPI_register_mr(hca_hndl, &mr_in, &r_mr_hndl, &r_mr_out); if(ret != VAPI_OK) { fprintf(stderr, "Error registering recv buffer: %s\n", VAPI_strerror(ret)); exit(-1); } else { LOGPRINTF("Registered Recv Buffer\n"); } mr_in.acl = VAPI_EN_LOCAL_WRITE; mr_in.l_key = 0; mr_in.pd_hndl = pd_hndl; mr_in.r_key = 0; mr_in.size = bufflen+soffset; mr_in.start = (VAPI_virt_addr_t)(MT_virt_addr_t)p->s_buff; mr_in.type = VAPI_MR; ret = VAPI_register_mr(hca_hndl, &mr_in, &s_mr_hndl, &s_mr_out); if(ret != VAPI_OK) { fprintf(stderr, "Error registering send buffer: %s\n", VAPI_strerror(ret)); exit(-1); } else { LOGPRINTF("Registered Send Buffer\n"); } } void FreeBuff(char *buff1, char *buff2) { VAPI_ret_t ret; if(s_mr_hndl != VAPI_INVAL_HNDL) { LOGPRINTF("Deregistering send buffer\n"); ret = VAPI_deregister_mr(hca_hndl, s_mr_hndl); if(ret != VAPI_OK) { fprintf(stderr, "Error deregistering send mr: %s\n", VAPI_strerror(ret)); } else { s_mr_hndl = VAPI_INVAL_HNDL; } } if(r_mr_hndl != VAPI_INVAL_HNDL) { LOGPRINTF("Deregistering recv buffer\n"); ret = VAPI_deregister_mr(hca_hndl, r_mr_hndl); if(ret != VAPI_OK) { fprintf(stderr, "Error deregistering recv mr: %s\n", VAPI_strerror(ret)); } else { r_mr_hndl = VAPI_INVAL_HNDL; } } if(buff1 != NULL) free(buff1); if(buff2 != NULL) free(buff2); } NetPIPE-3.7.2/src/ibv.c0000644000000000000000000012234611433312522014610 0ustar00usergroup00000000000000/*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* ibv.c ---- Infiniband module for OpenFabrics verbs */ /* */ /* Contributions Copyright (c) 2007 Cisco, Inc. */ /*****************************************************************************/ #define USE_VOLATILE_RPTR /* needed for polling on last byte of recv buffer */ #include "netpipe.h" #include #include #include #include #define WANT_DEBUG 0 FILE* logfile = NULL; /* If we're not debugging, make the logprintf() an inline function that the compiler will optimize away. */ #if WANT_DEBUG #define LOGPRINTF(args) \ do { \ va_list arglist; \ fprintf(logfile, "%s:%d:%s: ", __FILE__, __LINE__, __func__); \ logprintf args; \ fprintf(logfile, "\n"); \ } while (0) #else #define LOGPRINTF(a) #endif /* Pre-release versions of libiberbs do not have ibv_device_list() */ #define HAVE_IBV_DEVICE_LIST 1 /* Header files needed for Infiniband */ #include /* Global vars */ static struct ibv_device *hca; /* Infiniband Adapter */ static struct ibv_context *ctx; /* Context for Connections */ static struct ibv_port_attr hca_port;/* Attributes of the HCA */ static int port_num;/* IB port to use */ static uint16_t lid; /* Local ID of Adapter */ static uint16_t d_lid; /* Destination ID */ static struct ibv_pd *pd_hndl; /* Protection Domain handle */ static int num_cqe; /* # Command Queue Entries */ static int act_num_cqe; /* Actual # CQE */ static struct ibv_cq *s_cq_hndl; /* Send Command Queue */ static struct ibv_cq *r_cq_hndl; /* Recv Command Queue */ static struct ibv_mr *s_mr_hndl; /* Send Mem. Region */ static struct ibv_mr *r_mr_hndl; /* Recv Mem. Region */ static struct ibv_qp_init_attr qp_init_attr; /* Initial QP attributes */ static struct ibv_qp *qp_hndl; /* Handle to QP */ static uint32_t d_qp_num; /* Dest. QP Number */ static struct ibv_qp_attr qp_attr; /* QP Attribute */ static struct ibv_wc wc; /* Work Completion Queue */ static int max_wq=50000; /* max write queue entries */ static void* remote_address; /* remote address */ static uint32_t remote_key; /* Remote Key */ static volatile int receive_complete; /* initialization variable */ static pthread_t thread; /* thread to handle events */ static int initIB(ArgStruct *p); static void logprintf(const char *format, ...); /* Function definitions */ void Init(ArgStruct *p, int* pargc, char*** pargv) { /* Setup Infiniband specific defaults */ p->prot.ib_mtu = IBV_MTU_1024; /* 1024 Byte MTU */ p->prot.commtype = NP_COMM_RDMAWRITE; /* Use RDMA write communications */ p->prot.comptype = NP_COMP_LOCALPOLL; /* Use local polling for completion */ p->prot.device_and_port = NULL; /* Use first available port */ p->tr = 0; /* I am not the transmitter */ p->rcv = 1; /* I am the receiver */ } /* Setup(..) function is simply used to 'setup' the standard features of * the netpipe modules. tcp,netpipe-related stuff. This does no actual * 'setup' of any InfiniBand stuff, other than passing/storing * the parameters from the command line.... the 'initIB' function * is called from here though to do IB initialization. */ void Setup(ArgStruct *p) { int one = 1; int sockfd; struct sockaddr_in *lsin1, *lsin2; /* ptr to sockaddr_in in ArgStruct */ char *host; struct hostent *addr; struct protoent *proto; /* protocol entry */ int send_size, recv_size, sizeofint = sizeof(int); struct sigaction sigact1; #if WANT_DEBUG char logfilename[80]; #endif /* Sanity check */ if( p->prot.commtype == NP_COMM_RDMAWRITE && p->prot.comptype != NP_COMP_LOCALPOLL ) { fprintf(stderr, "Error, RDMA Write may only be used with local polling.\n"); fprintf(stderr, "Try using RDMA Write With Immediate Data with vapi polling\n"); /* vapi polling? */ fprintf(stderr, "or event completion\n"); exit(-1); } if( p->prot.commtype != NP_COMM_RDMAWRITE && p->prot.comptype == NP_COMP_LOCALPOLL ) { fprintf(stderr, "Error, local polling may only be used with RDMA Write.\n"); fprintf(stderr, "Try using vapi polling or event completion\n"); exit(-1); } #if WANT_DEBUG /* Open log file */ sprintf(logfilename, ".iblog%d", 1 - p->tr); logfile = fopen(logfilename, "w"); #endif host = p->host; /* copy ptr to hostname */ lsin1 = &(p->prot.sin1); /* setup the socket structure #1 */ lsin2 = &(p->prot.sin2); /* setup socket structure #2 */ /* more setup stuff */ bzero((char *) lsin1, sizeof(*lsin1)); bzero((char *) lsin2, sizeof(*lsin2)); /* tcp checks */ if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ printf("NetPIPE: can't open stream socket! errno=%d\n", errno); exit(-4); } /* another tcp check */ if(!(proto = getprotobyname("tcp"))){ printf("NetPIPE: protocol 'tcp' unknown!\n"); exit(555); } if (p->tr){ /* if client i.e., Sender */ if (atoi(host) > 0) { /* Numerical IP address */ lsin1->sin_family = AF_INET; lsin1->sin_addr.s_addr = inet_addr(host); } else { if ((addr = gethostbyname(host)) == NULL){ /* get the hostname */ printf("NetPIPE: invalid hostname '%s'\n", host); exit(-5); } lsin1->sin_family = addr->h_addrtype; bcopy(addr->h_addr, (char*) &(lsin1->sin_addr.s_addr), addr->h_length); } lsin1->sin_port = htons(p->port); } else { /* we are the receiver (server) */ bzero((char *) lsin1, sizeof(*lsin1)); lsin1->sin_family = AF_INET; lsin1->sin_addr.s_addr = htonl(INADDR_ANY); lsin1->sin_port = htons(p->port); /* re-use socket, common if netpipe aborts due to busted networks */ one = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int))) { printf("NetPIPE: server: unable to setsockopt -- errno %d\n", errno); exit(-7); } if (bind(sockfd, (struct sockaddr *) lsin1, sizeof(*lsin1)) < 0){ printf("NetPIPE: server: bind on local address failed! errno=%d\n", errno); exit(-6); } } if(p->tr) p->commfd = sockfd; else p->servicefd = sockfd; /* ********** This is where the IB specific stuff begins ******** */ /* Establish tcp connections */ /* Connection management for IB is handled over tcp/ip connection */ establish(p); /* Initialize OpenIB -> Mellanox Infiniband */ if(initIB(p) == -1) { CleanUp(p); exit(-1); } } /* Event Handler: * Receives events from the EventThread, and notifies other functions * of their arrivals. */ void event_handler(struct ibv_cq *cq); /* EventThread: * Continuously polls the Command Queue for events, and registers them with * the event_handler(..) function. */ void *EventThread(void *unused) { struct ibv_cq *cq; void *ev_ctx; while (1) { if (ibv_get_cq_event(0, &cq, &ev_ctx)) { fprintf(stderr, "Failed to get CQ event\n"); return NULL; } event_handler(cq); } } /* Initialize the actual IB device */ int initIB(ArgStruct *p) { int i, j, ret; char *tmp; int num_devices = 0; struct ibv_device **hca_list, **filtered_hca_list; struct ibv_device_attr hca_attr; #if !HAVE_IBV_DEVICE_LIST struct dlist *hca_dlist; struct ibv_device* hca_device; #endif /* Find all the devices on this host */ #if HAVE_IBV_DEVICE_LIST hca_list = ibv_get_device_list(&num_devices); #else hca_dlist = ibv_get_devices(); dlist_start(hca_dlist); dlist_for_each_data(hca_dlist, hca_device, struct ibv_device) ++num_devices; #endif /* If we didn't find any, return an error */ if (0 == num_devices) { fprintf(stderr, "Couldn't find any IBV devices\n"); return -1; } #if !HAVE_IBV_DEVICE_LIST /* If we have the old version (ibv_get_devices()), convert it to the new form */ hca_list = (struct ibv_device**) malloc(num_devices * sizeof(struct ibv_device*)); if (NULL == hca_list) { fprintf(stderr, "%s:%s:%d: malloc failed\n", __FILE__, __func__, __LINE__); return -1; } i = 0; dlist_start(hca_dlist); dlist_for_each_data(hca_dlist, hca_device, struct ibv_device) hca_list[i++] = hca_device; #endif /* Possible values for p->prot.device_and_port: 1. : -- use only this device and only this port 2. -- use the first active port on this device 3. : -- use only this port, but on any device names are matched exactly. */ /* If a device name was specified on the command line, see if we can find it */ tmp = NULL; port_num = -1; filtered_hca_list = hca_list; if (NULL != p->prot.device_and_port) { /* If there's a : in the string, then we have a port */ tmp = strchr(p->prot.device_and_port, ':'); if (NULL != tmp) { *tmp = '\0'; ++tmp; port_num = atoi(tmp); } LOGPRINTF(("Pre-filter: looking for target device \"%s\", port %d", p->prot.device_and_port, port_num)); /* If the length of the device string left is >0, then there's a device specification */ if (strlen(p->prot.device_and_port) > 0) { int found = 0; /* Loop through all the devices and find a matching name */ for (i = 0; i < num_devices; ++i) { LOGPRINTF(("Pre-filter: found device: %s", ibv_get_device_name(hca_list[i]))); if (0 == strcmp(p->prot.device_and_port, ibv_get_device_name(hca_list[i]))) { LOGPRINTF(("Pre-filter: found target device: %s (%d of %d)", p->prot.device_and_port, i, num_devices)); filtered_hca_list = &(hca_list[i]); num_devices = 1; found = 1; break; } } /* If we didn't find it, abort */ if (!found) { fprintf(stderr, "Unable to find device \"%s\", aborting\n", p->prot.device_and_port); return -1; } } } /* Traverse the filtered HCA list and find a good port */ for (hca = NULL, i = 0; NULL == hca && i < num_devices; ++i) { /* Get a ibv_context from the ibv_device */ ctx = ibv_open_device(filtered_hca_list[i]); if (!ctx) { fprintf(stderr, "Couldn't create IBV context\n"); return -1; } else { LOGPRINTF(("Found HCA %s", ibv_get_device_name(filtered_hca_list[i]))); } /* Get the device attributes */ if (0 != ibv_query_device(ctx, &hca_attr)) { fprintf(stderr, "Could not get device context for %s, aborting\n", ibv_get_device_name(hca)); return -1; } for (j = 1; j <= hca_attr.phys_port_cnt; ++j) { /* If a specific port was asked for, *only* look at that port */ if (port_num >= 0 && port_num != j) { continue; } LOGPRINTF(("Checking %s:%d...", ibv_get_device_name(filtered_hca_list[i]), j)); /* Query this port and see if it's active */ if (0 != ibv_query_port(ctx, j, &hca_port)) { fprintf(stderr, "Unable to query port %s:%d, aborting\n", ibv_get_device_name(filtered_hca_list[i]), j); return -1; } /* If this port is active, we have a winner! */ if (IBV_PORT_ACTIVE == hca_port.state) { LOGPRINTF(("%s:%d is ACTIVE", ibv_get_device_name(filtered_hca_list[i]), j)); port_num = j; hca = filtered_hca_list[i]; break; } } /* If we found one, we're done */ if (hca) { break; } /* Otherwise, close the device (ignore any errors) */ ibv_close_device(ctx); ctx = NULL; } /* If we didn't find a good device/port combo, abort */ if (NULL == hca) { fprintf(stderr, "Could not find an active device and port, aborting\n"); return -1; } /* free up the other devices in the event we would have multiple ib devices. if this isnt done, the device pointers will still be around in space somewhere -> bad */ #if HAVE_IBV_DEVICE_LIST ibv_free_device_list(hca_list); #endif /* Get HCA properties */ lid = hca_port.lid; /* local id, used to ref back to the device */ LOGPRINTF((" lid = %d", lid)); /* Allocate Protection Domain */ /* need a Protection domain to handle/register memory over the card */ pd_hndl = ibv_alloc_pd(ctx); if(!pd_hndl) { fprintf(stderr, "Error allocating PD\n"); return -1; } else { LOGPRINTF(("Allocated Protection Domain")); } /* Create send completion queue */ num_cqe = 30000; /* Requested number of completion q elements */ s_cq_hndl = ibv_create_cq(ctx, num_cqe, NULL, NULL, 0); if(!s_cq_hndl) { fprintf(stderr, "Error creating send CQ\n"); return -1; } else { act_num_cqe = s_cq_hndl->cqe; LOGPRINTF(("Created Send Completion Queue with %d elements", act_num_cqe)); } /* Create recv completion queue */ num_cqe = 20000; /* Requested number of completion q elements */ r_cq_hndl = ibv_create_cq(ctx, num_cqe, NULL, NULL, 0); if(!r_cq_hndl) { fprintf(stderr, "Error creating send CQ\n"); return -1; } else { act_num_cqe = r_cq_hndl->cqe; LOGPRINTF(("Created Recv Completion Queue with %d elements", act_num_cqe)); } /* Placeholder for MR */ /* We dont actually setup the Memory Regions here, instead * this is done in the 'MyMalloc(..)' helper function. * You could however, set them up here. */ /* Create Queue Pair */ /* To setup a Queue Pair, the following qp initial attributes must be * specified and passed to the create_qp(..) function: * max send/recv write requests. (max_recv/send_wr) * max scatter/gather entries. (max_recv/send_sge) * Command queues to associate the qp with. (recv/send_cq) * Signalling type: 1-> signal all events. 0-> dont, event handler will * deal with this. * QP type. (RC=reliable connection, UC=unreliable.. etc.) defined * in the verbs header. */ memset(&qp_init_attr, 0, sizeof(struct ibv_qp_init_attr)); /* * Set the Max outstanding QP WRs, can be set via max_wr global * or if this is greater than the max reported by the HCA, set * to max reported value. */ if (hca_attr.max_qp_wr < max_wq ) { LOGPRINTF(("Reduced max_wq to hca reported max of %d", hca_attr.max_qp_wr)); qp_init_attr.cap.max_send_wr = hca_attr.max_qp_wr; qp_init_attr.cap.max_recv_wr = hca_attr.max_qp_wr; } else { qp_init_attr.cap.max_recv_wr = max_wq; qp_init_attr.cap.max_send_wr = max_wq; } qp_init_attr.cap.max_recv_sge = 1; /* Max scatter/gather entries on RQ */ qp_init_attr.cap.max_send_sge = 1; /* Max scatter/gather entries on SQ */ qp_init_attr.recv_cq = r_cq_hndl; /* CQ handle for RQ */ qp_init_attr.send_cq = s_cq_hndl; /* CQ handle for SQ */ qp_init_attr.sq_sig_all = 0; /* Signalling type */ qp_init_attr.qp_type = IBV_QPT_RC; /* Transmission type */ /* ibv_create_qp( ibv_pd *pd, ibv_qp_init_attr * attr) */ qp_hndl = ibv_create_qp(pd_hndl, &qp_init_attr); if(!qp_hndl) { fprintf(stderr, "Error creating Queue Pair: %s\n", strerror(errno)); return -1; } else { LOGPRINTF(("Created Queue Pair")); } /* Using the tcp connection, exchange necesary data needed to map * the remote memory: * (local: lid, qp_hndl->qp_num ), (remote: d_lid, d_qp_num) */ /* Exchange lid and qp_num with other node */ if( write(p->commfd, &lid, sizeof(lid) ) != sizeof(lid) ) { fprintf(stderr, "Failed to send lid over socket\n"); return -1; } if( write(p->commfd, &qp_hndl->qp_num, sizeof(qp_hndl->qp_num) ) != sizeof(qp_hndl->qp_num) ) { fprintf(stderr, "Failed to send qpnum over socket\n"); return -1; } if( read(p->commfd, &d_lid, sizeof(d_lid) ) != sizeof(d_lid) ) { fprintf(stderr, "Failed to read lid from socket\n"); return -1; } if( read(p->commfd, &d_qp_num, sizeof(d_qp_num) ) != sizeof(d_qp_num) ) { fprintf(stderr, "Failed to read qpnum from socket\n"); return -1; } LOGPRINTF(("Local: lid=%d qp_num=%d Remote: lid=%d qp_num=%d", lid, qp_hndl->qp_num, d_lid, d_qp_num)); /* Further setup must be done to finalize the QP 'connection'. * First set the State of the qp to initialization by making a seperate * ibv_qp_attr* variable, giving it the initial values, and calling * ibv_qp_modify(..) to merge these settings into the QP. */ /* NOTE: According to openIB, ib_mthca's QP modify does not set alternate path * fields in QP context, so you'll have to do this manually if necessary */ /* Bring up Queue Pair */ /******* INIT state ******/ /* qp_attr is seperately allocated per qp/connection */ qp_attr.qp_state = IBV_QPS_INIT; qp_attr.pkey_index = 0; qp_attr.port_num = port_num; qp_attr.qp_access_flags = IBV_ACCESS_REMOTE_WRITE | IBV_ACCESS_REMOTE_READ; /* merge the qp_attributes into the queue pair */ ret = ibv_modify_qp(qp_hndl, &qp_attr, IBV_QP_STATE | IBV_QP_PKEY_INDEX | IBV_QP_PORT | IBV_QP_ACCESS_FLAGS); if(ret) { fprintf(stderr, "Error modifying QP to INIT\n"); return -1; } LOGPRINTF(("Modified QP to INIT")); /* To enable the Queue Pair to finally receive data, it must be * put into the 'RTR' (Ready-To-Receive) state. The Queue Pair will NOT * function properly until it has been setup, and manually put through * the init and rtr states. */ /******* RTR (Ready-To-Receive) state *******/ qp_attr.qp_state = IBV_QPS_RTR; qp_attr.max_dest_rd_atomic = 1; qp_attr.dest_qp_num = d_qp_num; qp_attr.ah_attr.sl = 0; qp_attr.ah_attr.is_global = 0; qp_attr.ah_attr.dlid = d_lid; qp_attr.ah_attr.static_rate = 0; qp_attr.ah_attr.src_path_bits = 0; qp_attr.ah_attr.port_num = port_num; qp_attr.path_mtu = p->prot.ib_mtu; qp_attr.rq_psn = 0; qp_attr.pkey_index = 0; qp_attr.min_rnr_timer = 5; /* merge these settings into the qp */ ret = ibv_modify_qp(qp_hndl, &qp_attr, IBV_QP_STATE | IBV_QP_AV | IBV_QP_PATH_MTU | IBV_QP_DEST_QPN | IBV_QP_RQ_PSN | IBV_QP_MAX_DEST_RD_ATOMIC | IBV_QP_MIN_RNR_TIMER); if(ret) { fprintf(stderr, "Error modifying QP to RTR\n"); return -1; } LOGPRINTF(("Modified QP to RTR")); /* Sync before going to RTS state */ Sync(p); /* In the same manner, 'enable' sending on the queue pair */ /******* RTS (Ready-to-Send) state *******/ qp_attr.qp_state = IBV_QPS_RTS; qp_attr.sq_psn = 0; qp_attr.timeout = 31; qp_attr.retry_cnt = 1; qp_attr.rnr_retry = 1; qp_attr.max_rd_atomic = 1; ret = ibv_modify_qp(qp_hndl, &qp_attr, IBV_QP_STATE | IBV_QP_TIMEOUT | IBV_QP_RETRY_CNT | IBV_QP_RNR_RETRY | IBV_QP_SQ_PSN | IBV_QP_MAX_QP_RD_ATOMIC); if(ret) { fprintf(stderr, "Error modifying QP to RTS\n"); return -1; } LOGPRINTF(("Modified QP to RTS")); /* If using event completion, request the initial notification */ /* This spawns a seperate thread to do the event handling and * notification. * NOTE: This may have problems in systems with Weak Memory Consistency * since there are no mutex(*) calls to preserve coherancy?? */ if( p->prot.comptype == NP_COMP_EVENT ) { if (pthread_create(&thread, NULL, EventThread, NULL)) { fprintf(stderr, "Couldn't start event thread\n"); return -1; } ibv_req_notify_cq(r_cq_hndl, 0); /* request completion notification */ } /* for the receive cq. 2nd argument specifies if ONLY 'solicited' completions will be 'noticed' */ return 0; /* if we get here, the connection is setup correctly */ } /* Deallocate everything properly */ int finalizeIB(ArgStruct *p) { int ret; LOGPRINTF(("Finalizing IB stuff")); /* NOTE: This implementation only has created one of each type of queue. * In other implementations it may be necessary to create arrays of * these queues. If this is the case, you need to loop and get them all */ if(qp_hndl) { LOGPRINTF(("Destroying QP")); ret = ibv_destroy_qp(qp_hndl); if(ret) { fprintf(stderr, "Error destroying Queue Pair\n"); } } if(r_cq_hndl) { LOGPRINTF(("Destroying Recv CQ")); ret = ibv_destroy_cq(r_cq_hndl); if(ret) { fprintf(stderr, "Error destroying recv CQ\n"); } } if(s_cq_hndl) { LOGPRINTF(("Destroying Send CQ")); ret = ibv_destroy_cq(s_cq_hndl); if(ret) { fprintf(stderr, "Error destroying send CQ\n"); } } /* Check memory registrations just in case user bailed out */ if(s_mr_hndl) { LOGPRINTF(("Deregistering send buffer")); ret = ibv_dereg_mr(s_mr_hndl); if(ret) { fprintf(stderr, "Error deregistering send mr\n"); } } if(r_mr_hndl) { LOGPRINTF(("Deregistering recv buffer")); ret = ibv_dereg_mr(r_mr_hndl); if(ret) { fprintf(stderr, "Error deregistering recv mr\n"); } } if(pd_hndl) { LOGPRINTF(("Deallocating PD")); ret = ibv_dealloc_pd(pd_hndl); if(ret) { fprintf(stderr, "Error deallocating PD\n"); } } /* Application code should not close HCA, just release handle */ if(ctx) { LOGPRINTF(("Releasing HCA")); ret = ibv_close_device(ctx); if(ret) { fprintf(stderr, "Error releasing HCA\n"); } } return 0; } void event_handler(struct ibv_cq *cq) { int ret; while(1) { /* int ibv_poll_cq(a,b,c): * a: command queue to poll * b: max number of completions to return * c: array of at least (b) entries of ibv_wc where these * completion events will be returned. */ ret = ibv_poll_cq(cq, 1, &wc); if(ret == 0) { LOGPRINTF(("Empty completion queue, requesting next notification")); ibv_req_notify_cq(r_cq_hndl, 0); /* ... explained in prev line.. */ return; } else if(ret < 0) { fprintf(stderr, "Error in event_handler (polling cq)\n"); exit(-1); } else if(wc.status != IBV_WC_SUCCESS) { fprintf(stderr, "Error in event_handler, on returned work completion " "status: %d\n", wc.status); exit(-1); } LOGPRINTF(("Retrieved work completion")); /* For ping-pong mode at least, this check shouldn't be needed for * normal operation, but it will help catch any bugs with multiple * sends coming through when we're only expecting one. */ if(receive_complete == 1) { while(receive_complete != 0) sched_yield(); } receive_complete = 1; } } /* read the data from the tcp connection */ static int readFully(int fd, void *obuf, int len) { int bytesLeft = len; char *buf = (char *) obuf; int bytesRead = 0; while (bytesLeft > 0 && (bytesRead = read(fd, (void *) buf, bytesLeft)) > 0) { bytesLeft -= bytesRead; buf += bytesRead; } if (bytesRead <= 0) return bytesRead; return len; } /* sync up the tcp connection */ void Sync(ArgStruct *p) { char s[] = "SyncMe"; char response[7]; if (write(p->commfd, s, strlen(s)) < 0 || readFully(p->commfd, response, strlen(s)) < 0) { perror("NetPIPE: error writing or reading synchronization string"); exit(3); } if (strncmp(s, response, strlen(s))) { fprintf(stderr, "NetPIPE: Synchronization string incorrect!\n"); exit(3); } } void PrepareToReceive(ArgStruct *p) { int ret; /* Return code */ struct ibv_recv_wr rr; /* Receive request */ struct ibv_recv_wr *bad_wr; /* Handle to any incomplete requests */ struct ibv_sge sg_entry; /* Scatter/Gather list - holds buff addr */ /* We don't need to post a receive if doing RDMA write with local polling */ if( p->prot.commtype == NP_COMM_RDMAWRITE && p->prot.comptype == NP_COMP_LOCALPOLL ) return; /* setup the receive request, specify which list to use and # entries */ rr.num_sge = 1; /* # of entries in this list */ rr.sg_list = &sg_entry; /* the list of entries */ rr.next = NULL; /* the next entry (if more than one */ sg_entry.lkey = r_mr_hndl->lkey; /* link the entries lkey to our remote mr */ sg_entry.length = p->bufflen; /* provide a buffer length */ sg_entry.addr = (uintptr_t)p->r_ptr; /* address/context of sg_entry */ /* technically if we have problems, the return is < 0, * but this works as well */ /* if we get a change in bad_wr value, it is because the Receive request * couldnt be posted to the command queue for some reason. * (This may be because the queue is full) * You should probably do something with the bad_wr if your request * needs to actuall get posted. */ ret = ibv_post_recv(qp_hndl, &rr, &bad_wr); if(ret) { fprintf(stderr, "Error posting recv request\n"); CleanUp(p); exit(-1); } else { LOGPRINTF(("Posted recv request")); } /* Set receive flag to zero and request event completion * notification for this receive so the event handler will * be triggered when the receive completes. */ if( p->prot.comptype == NP_COMP_EVENT ) { receive_complete = 0; } } /* SendData == Post a 'send' request to the (send)command queue */ void SendData(ArgStruct *p) { int ret; /* Return code */ struct ibv_send_wr sr; /* Send request */ struct ibv_send_wr *bad_wr; /* Handle to any incomplete wr returned by ibv*/ struct ibv_sge sg_entry; /* Scatter/Gather list - holds buff addr */ /* Fill in send request struct */ /* Set the send request's opcode based on run-time options */ if(p->prot.commtype == NP_COMM_SENDRECV) { sr.opcode = IBV_WR_SEND; LOGPRINTF(("Doing regular send")); } else if(p->prot.commtype == NP_COMM_SENDRECV_WITH_IMM) { sr.opcode = IBV_WR_SEND_WITH_IMM; LOGPRINTF(("Doing regular send with imm")); } else if(p->prot.commtype == NP_COMM_RDMAWRITE) { sr.opcode = IBV_WR_RDMA_WRITE; /* if RDMA, need to give more info */ sr.wr.rdma.remote_addr = (uintptr_t)(((char *)remote_address) + (p->s_ptr - p->s_buff)); sr.wr.rdma.rkey = remote_key; LOGPRINTF(("Doing RDMA write (raddr=%p)", sr.wr.rdma.remote_addr)); } else if(p->prot.commtype == NP_COMM_RDMAWRITE_WITH_IMM) { sr.opcode = IBV_WR_RDMA_WRITE_WITH_IMM; /* more info if RDMA */ sr.wr.rdma.remote_addr = (uintptr_t)(((char *)remote_address) + (p->s_ptr - p->s_buff)); sr.wr.rdma.rkey = remote_key; LOGPRINTF(("Doing RDMA write with imm (raddr=%p)", sr.wr.rdma.remote_addr)); } else { fprintf(stderr, "Error, invalid communication type in SendData\n"); exit(-1); } sr.send_flags = 0; /* This needed due to a bug in Mellanox HW rel a-0 */ sr.num_sge = 1; /* # entries in this request */ sr.sg_list = &sg_entry; /* the list of other requests */ sr.next = NULL; /* the next request in the list */ sg_entry.lkey = s_mr_hndl->lkey; /* Local memory region key */ sg_entry.length = p->bufflen; /* buffer's size */ sg_entry.addr = (uintptr_t)p->s_ptr; /* buffer's location */ /* Post the send request to the (send)command queue */ /* ibv_post_send(...) is handled in same fashion ibv_post_recv(..) */ ret = ibv_post_send(qp_hndl, &sr, &bad_wr); if(ret) { fprintf(stderr, "Error posting send request\n"); } else { LOGPRINTF(("Posted send request")); } } /* Post a receive request to the (receive)command queue */ void RecvData(ArgStruct *p) { int ret; /* Busy wait for incoming data */ LOGPRINTF(("Receiving at buffer address %p", p->r_ptr)); /* * Unsignaled receives are not supported, so we must always poll the * CQ, except when using RDMA writes. */ if( p->prot.commtype == NP_COMM_RDMAWRITE ) { /* Poll for receive completion locally on the receive data */ LOGPRINTF(("Waiting for last byte of data to arrive")); while(p->r_ptr[p->bufflen-1] != 'a' + (p->cache ? 1 - p->tr : 1) ) { /* BUSY WAIT -- this should be fine since we * declared r_ptr with volatile qualifier */ } /* Reset last byte */ p->r_ptr[p->bufflen-1] = 'a' + (p->cache ? p->tr : 0); LOGPRINTF(("Received all of data")); } else if( p->prot.comptype != NP_COMP_EVENT ) { /* Poll for receive completion using poll function */ LOGPRINTF(("Polling completion queue for work completion")); ret = 0; while(ret == 0) ret = ibv_poll_cq(r_cq_hndl, 1, &wc); /* poll & grab 1 completion */ /* ret = # of completions polled by the function */ if(ret < 0) { fprintf(stderr, "Error in RecvData, polling for completion\n"); exit(-1); } if(wc.status != IBV_WC_SUCCESS) { fprintf(stderr, "Error in status of returned completion: %d\n", wc.status); exit(-1); } LOGPRINTF(("Retrieved successful completion")); } else if( p->prot.comptype == NP_COMP_EVENT ) { /* Instead of polling directly on data or the completion queue, * let the event completion handler set a flag when the receive * completes, and poll on that instead. Could try using semaphore here * as well to eliminate busy polling */ LOGPRINTF(("Polling receive flag")); while( receive_complete == 0 ) /* this is set by the event hanlr */ { /* BUSY WAIT */ } /* If in prepost-burst mode, we won't be calling PrepareToReceive * between ping-pongs, so we need to reset the receive_complete * flag here. */ if( p->preburst ) receive_complete = 0; LOGPRINTF(("Receive completed")); } } /* Reset is used after a trial to empty the work request queues so we have enough room for the next trial to run */ void Reset(ArgStruct *p) { int ret; /* Return code */ struct ibv_send_wr sr; /* Send request */ struct ibv_send_wr *bad_sr; /* handle to your reqeust if it fails */ struct ibv_recv_wr rr; /* Recv request */ struct ibv_recv_wr *bad_rr; /* handle to your request if it fails */ /* If comptype is event, then we'll use event handler to detect receive, * so initialize receive_complete flag */ if(p->prot.comptype == NP_COMP_EVENT) receive_complete = 0; /* Prepost receive */ rr.num_sge = 0; /* there are no entries in this request */ rr.next = NULL; LOGPRINTF(("Posting recv request in Reset")); ret = ibv_post_recv(qp_hndl, &rr, &bad_rr); if(ret) { fprintf(stderr, " Error posting recv request\n"); CleanUp(p); exit(-1); } /* Make sure both nodes have preposted receives */ Sync(p); /* Post Send */ sr.opcode = IBV_WR_SEND; sr.send_flags = IBV_SEND_SIGNALED; sr.num_sge = 0; /* no entires in this request */ sr.next = NULL; LOGPRINTF(("Posting send request ")); ret = ibv_post_send(qp_hndl, &sr, &bad_sr); if(ret) { fprintf(stderr, " Error posting send request in Reset\n"); exit(-1); } if(wc.status != IBV_WC_SUCCESS) { fprintf(stderr, " Error in completion status: %d\n", wc.status); exit(-1); } LOGPRINTF(("Polling for completion of send request")); ret = 0; while(ret == 0) ret = ibv_poll_cq(s_cq_hndl, 1, &wc); /* grab the request */ if(ret < 0) { fprintf(stderr, "Error polling CQ for send in Reset\n"); exit(-1); } if(wc.status != IBV_WC_SUCCESS) { fprintf(stderr, " Error in completion status: %d\n", wc.status); exit(-1); } LOGPRINTF(("Status of send completion: %d", wc.status)); if(p->prot.comptype == NP_COMP_EVENT) { /* If using event completion, the event handler will set receive_complete * when it gets the completion event. */ LOGPRINTF(("Waiting for receive_complete flag")); while(receive_complete == 0) { /* BUSY WAIT */ } } else { LOGPRINTF(("Polling for completion of recv request")); ret = 0; while(ret == 0) ret = ibv_poll_cq(r_cq_hndl, 1, &wc); if(ret < 0) { fprintf(stderr, "Error polling CQ for recv in Reset"); exit(-1); } if(wc.status != IBV_WC_SUCCESS) { fprintf(stderr, " Error in completion status: %d\n", wc.status); exit(-1); } LOGPRINTF(("Status of recv completion: %d", wc.status)); } LOGPRINTF(("Done with reset")); } /* ********** NetPipe stuff ********* */ void SendTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; /* Multiply the number of seconds by 1e6 to get time in microseconds and convert value to an unsigned 32-bit integer. */ ltime = (uint32_t)(*t * 1.e6); /* Send time in network order */ ntime = htonl(ltime); if (write(p->commfd, (char *)&ntime, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendTime: errno=%d\n", errno); exit(301); } } void RecvTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; int bytesRead; bytesRead = readFully(p->commfd, (void *)&ntime, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvTime: errno=%d\n", errno); exit(302); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvTime of %d bytes\n", bytesRead); exit(303); } ltime = ntohl(ntime); /* Result is ltime (in microseconds) divided by 1.0e6 to get seconds */ *t = (double)ltime / 1.0e6; } /* in the event of a send failure, re-send (tcp)*/ void SendRepeat(ArgStruct *p, int rpt) { uint32_t lrpt, nrpt; lrpt = rpt; /* Send repeat count as a long in network order */ nrpt = htonl(lrpt); if (write(p->commfd, (void *) &nrpt, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendRepeat: errno=%d\n", errno); exit(304); } } /* in the event of a recv failure, resend (tcp)*/ void RecvRepeat(ArgStruct *p, int *rpt) { uint32_t lrpt, nrpt; int bytesRead; bytesRead = readFully(p->commfd, (void *)&nrpt, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvRepeat: errno=%d\n", errno); exit(305); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvRepeat of %d bytes\n", bytesRead); exit(306); } lrpt = ntohl(nrpt); *rpt = lrpt; } /* establish the tcp connection */ void establish(ArgStruct *p) { unsigned int clen; int one = 1; struct protoent; clen = sizeof(p->prot.sin2); if(p->tr){ if(connect(p->commfd, (struct sockaddr *) &(p->prot.sin1), sizeof(p->prot.sin1)) < 0){ printf("Client: Cannot Connect! errno=%d\n",errno); exit(-10); } } else { /* SERVER */ listen(p->servicefd, 5); p->commfd = accept(p->servicefd, (struct sockaddr *) &(p->prot.sin2), &clen); if(p->commfd < 0){ printf("Server: Accept Failed! errno=%d\n",errno); exit(-12); } } } void CleanUp(ArgStruct *p) { char *quit="QUIT"; if (p->tr) { write(p->commfd,quit, 5); read(p->commfd, quit, 5); close(p->commfd); } else { read(p->commfd,quit, 5); write(p->commfd,quit,5); close(p->commfd); close(p->servicefd); } finalizeIB(p); /* finally, deallocate all the IB stuff */ } /* Exchange IB connection info via the tcp connection */ void AfterAlignmentInit(ArgStruct *p) { int bytesRead; /* Exchange buffer pointers and remote infiniband keys if doing rdma. Do * the exchange in this function because this will happen after any * memory alignment is done, which is important for getting the * correct remote address. */ if( p->prot.commtype == NP_COMM_RDMAWRITE || p->prot.commtype == NP_COMM_RDMAWRITE_WITH_IMM ) { /* Send my receive buffer address */ if(write(p->commfd, (void *)&p->r_buff, sizeof(void*)) < 0) { perror("NetPIPE: write of buffer address failed in AfterAlignmentInit"); exit(-1); } LOGPRINTF(("Sent buffer address: %p", p->r_buff)); /* Send my remote key for accessing * my remote buffer via IB RDMA */ if(write(p->commfd, (void *)&r_mr_hndl->rkey, sizeof(uint32_t)) < 0) { perror("NetPIPE: write of remote key failed in AfterAlignmentInit"); exit(-1); } LOGPRINTF(("Sent remote key: %d", r_mr_hndl->rkey)); /* Read the sent data */ bytesRead = readFully(p->commfd, (void *)&remote_address, sizeof(void*)); if (bytesRead < 0) { perror("NetPIPE: read of buffer address failed in AfterAlignmentInit"); exit(-1); } else if (bytesRead != sizeof(void*)) { perror("NetPIPE: partial read of buffer address in AfterAlignmentInit"); exit(-1); } LOGPRINTF(("Received remote address from other node: %p", remote_address)); bytesRead = readFully(p->commfd, (void *)&remote_key, sizeof(uint32_t)); if (bytesRead < 0) { perror("NetPIPE: read of remote key failed in AfterAlignmentInit"); exit(-1); } else if (bytesRead != sizeof(uint32_t)) { perror("NetPIPE: partial read of remote key in AfterAlignmentInit"); exit(-1); } LOGPRINTF(("Received remote key from other node: %d", remote_key)); } } void MyMalloc(ArgStruct *p, int bufflen, int soffset, int roffset) { /* Allocate buffers */ p->r_buff = malloc(bufflen+MAX(soffset,roffset)); if(p->r_buff == NULL) { fprintf(stderr, "Error malloc'ing buffer\n"); exit(-1); } if(p->cache) { /* run-time option ? */ /* Infiniband spec says we can register same memory region * more than once, so just copy buffer address. We will register * the same buffer twice with Infiniband. */ p->s_buff = p->r_buff; } else { p->s_buff = malloc(bufflen+soffset); if(p->s_buff == NULL) { fprintf(stderr, "Error malloc'ing buffer\n"); exit(-1); } } /* Register buffers with Infiniband */ /* Associate our newly allocated buffers with an IB memory region * If the reg fails, the function will return NULL for your region ptr * Else it will return a ptr to an allocated mem region */ /* Register the local recv mem region handle: * ibv_mem_register( * local protection domain, * remote buffer address, * size of the remote buffer, * access rights to this memory * ) */ r_mr_hndl = ibv_reg_mr(pd_hndl, p->r_buff, bufflen + MAX(soffset, roffset), IBV_ACCESS_LOCAL_WRITE | IBV_ACCESS_REMOTE_WRITE); if(!r_mr_hndl) { fprintf(stderr, "Error registering recv buffer\n"); exit(-1); } else { LOGPRINTF(("Registered Recv Buffer")); } /* Register the send mem region handle */ s_mr_hndl = ibv_reg_mr(pd_hndl, p->s_buff, bufflen+soffset, IBV_ACCESS_LOCAL_WRITE); if(!s_mr_hndl) { fprintf(stderr, "Error registering send buffer\n"); exit(-1); } else { LOGPRINTF(("Registered Send Buffer")); } } /* De_register the allocated memory regions before exiting */ void FreeBuff(char *buff1, char *buff2) { int ret; if(s_mr_hndl) { LOGPRINTF(("Deregistering send buffer")); ret = ibv_dereg_mr(s_mr_hndl); if(ret) { fprintf(stderr, "Error deregistering send mr\n"); } else { s_mr_hndl = NULL; } } if(r_mr_hndl) { LOGPRINTF(("Deregistering recv buffer")); ret = ibv_dereg_mr(r_mr_hndl); if(ret) { fprintf(stderr, "Error deregistering recv mr\n"); } else { r_mr_hndl = NULL; } } if(buff1 != NULL) free(buff1); if(buff2 != NULL) free(buff2); } static void logprintf(const char *format, ...) { va_list arglist; va_start(arglist, format); vfprintf(logfile, format, arglist); va_end(arglist); } NetPIPE-3.7.2/src/ipx.c0000644000000000000000000002430611433312522014625 0ustar00usergroup00000000000000/*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* IPX Extensions Copyright 2006 George V. Neville-Neil and Neville-Neil */ /* Consulting */ /* */ /* * ipx.c ---- IPX calls source */ /* */ /*****************************************************************************/ #include "netpipe.h" #if defined (MPLITE) #include "mplite.h" #endif int doing_reset = 0; void Init(ArgStruct *p, int* pargc, char*** pargv) { p->reset_conn = 0; /* Default to not resetting connection */ p->prot.sndbufsz = p->prot.rcvbufsz = 0; p->tr = 0; /* The transmitter will be set using the -h host flag. */ p->rcv = 1; } void Setup(ArgStruct *p) { int one = 1; int sockfd; struct sockaddr_ipx *lsipx1, *lsipx2; /* ptr to sockaddr_in in ArgStruct */ char *host; int send_size, recv_size, sizeofint = sizeof(int); host = p->host; /* copy ptr to hostname */ lsipx1 = &(p->prot.sipx1); lsipx2 = &(p->prot.sipx2); bzero((char *) lsipx1, sizeof(*lsipx1)); bzero((char *) lsipx2, sizeof(*lsipx2)); if ( (sockfd = socket(AF_IPX, SOCK_STREAM, 0)) < 0){ printf("NetPIPE: can't open IPX DGRAM socket! errno=%d\n", errno); exit(-4); } /* If requested, set the send and receive buffer sizes */ if(p->prot.sndbufsz > 0) { if(setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &(p->prot.sndbufsz), sizeof(p->prot.sndbufsz)) < 0) { printf("NetPIPE: setsockopt: SO_SNDBUF failed! errno=%d\n", errno); printf("You may have asked for a buffer larger than the system can handle\n"); exit(556); } if(setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &(p->prot.rcvbufsz), sizeof(p->prot.rcvbufsz)) < 0) { printf("NetPIPE: setsockopt: SO_RCVBUF failed! errno=%d\n", errno); printf("You may have asked for a buffer larger than the system can handle\n"); exit(556); } } getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (char *) &send_size, (void *) &sizeofint); getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (char *) &recv_size, (void *) &sizeofint); if(!doing_reset) { fprintf(stderr,"Send and receive buffers are %d and %d bytes\n", send_size, recv_size); fprintf(stderr, "(A bug in Linux doubles the requested buffer sizes)\n"); } if( p->tr ) { /* Primary transmitter */ lsipx1->sipx_family = AF_IPX; lsipx1->sipx_addr = ipx_addr(host); p->commfd = sockfd; } else if( p->rcv ) { /* we are the receiver */ bzero((char *) lsipx1, sizeof(*lsipx1)); lsipx1->sipx_family = AF_IPX; lsipx1->sipx_addr.x_port = DEFPORT; if (bind(sockfd, (struct sockaddr *) lsipx1, sizeof(*lsipx1)) < 0){ printf("NetPIPE: server: bind on local address failed! errno=%d", errno); exit(-6); } p->servicefd = sockfd; } p->upper = send_size + recv_size; establish(p); /* Establish connections */ } static int readFully(int fd, void *obuf, int len) { int bytesLeft = len; char *buf = (char *) obuf; int bytesRead = 0; while (bytesLeft > 0 && (bytesRead = read(fd, (void *) buf, bytesLeft)) > 0) { bytesLeft -= bytesRead; buf += bytesRead; } if (bytesRead <= 0) return bytesRead; return len; } void Sync(ArgStruct *p) { char s[] = "SyncMe", response[] = " "; if (write(p->commfd, s, strlen(s)) < 0 || /* Write to nbor */ readFully(p->commfd, response, strlen(s)) < 0) /* Read from nbor */ { perror("NetPIPE: error writing or reading synchronization string"); exit(3); } if (strncmp(s, response, strlen(s))) { fprintf(stderr, "NetPIPE: Synchronization string incorrect! |%s|\n", response); exit(3); } } void PrepareToReceive(ArgStruct *p) { /* The Berkeley sockets interface doesn't have a method to pre-post a buffer for reception of data. */ } void SendData(ArgStruct *p) { int bytesWritten, bytesLeft; char *q; bytesLeft = p->bufflen; bytesWritten = 0; q = p->s_ptr; while (bytesLeft > 0 && (bytesWritten = write(p->commfd, q, bytesLeft)) > 0) { bytesLeft -= bytesWritten; q += bytesWritten; } if (bytesWritten == -1) { printf("NetPIPE: write: error encountered, errno=%d\n", errno); exit(401); } } void RecvData(ArgStruct *p) { int bytesLeft; int bytesRead; char *q; bytesLeft = p->bufflen; bytesRead = 0; q = p->r_ptr; while (bytesLeft > 0 && (bytesRead = read(p->commfd, q, bytesLeft)) > 0) { bytesLeft -= bytesRead; q += bytesRead; } if (bytesLeft > 0 && bytesRead == 0) { printf("NetPIPE: \"end of file\" encountered on reading from socket\n"); } else if (bytesRead == -1) { printf("NetPIPE: read: error encountered, errno=%d\n", errno); exit(401); } } /* uint32_t is used to insure that the integer size is the same even in tests * between 64-bit and 32-bit architectures. */ void SendTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; /* Multiply the number of seconds by 1e8 to get time in 0.01 microseconds and convert value to an unsigned 32-bit integer. */ ltime = (uint32_t)(*t * 1.e8); /* Send time in network order */ ntime = htonl(ltime); if (write(p->commfd, (char *)&ntime, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendTime: errno=%d\n", errno); exit(301); } } void RecvTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; int bytesRead; bytesRead = readFully(p->commfd, (void *)&ntime, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvTime: errno=%d\n", errno); exit(302); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvTime of %d bytes\n", bytesRead); exit(303); } ltime = ntohl(ntime); /* Result is ltime (in microseconds) divided by 1.0e8 to get seconds */ *t = (double)ltime / 1.0e8; } void SendRepeat(ArgStruct *p, int rpt) { uint32_t lrpt, nrpt; lrpt = rpt; /* Send repeat count as a long in network order */ nrpt = htonl(lrpt); if (write(p->commfd, (void *) &nrpt, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendRepeat: errno=%d\n", errno); exit(304); } } void RecvRepeat(ArgStruct *p, int *rpt) { uint32_t lrpt, nrpt; int bytesRead; bytesRead = readFully(p->commfd, (void *)&nrpt, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvRepeat: errno=%d\n", errno); exit(305); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvRepeat of %d bytes\n", bytesRead); exit(306); } lrpt = ntohl(nrpt); *rpt = lrpt; } void establish(ArgStruct *p) { int one = 1; socklen_t clen; struct protoent *proto; clen = (socklen_t) sizeof(p->prot.sipx2); if( p->tr ){ while( connect(p->commfd, (struct sockaddr *) &(p->prot.sipx1), sizeof(p->prot.sipx1)) < 0 ) { /* If we are doing a reset and we get a connection refused from * the connect() call, assume that the other node has not yet * gotten to its corresponding accept() call and keep trying until * we have success. */ if(!doing_reset || errno != ECONNREFUSED) { printf("Client: Cannot Connect! errno=%d\n",errno); exit(-10); } } } else if( p->rcv ) { /* SERVER */ listen(p->servicefd, 5); #if 0 p->commfd = accept(p->servicefd, (struct sockaddr *) &(p->prot.sipx2), &clen); #else p->commfd = accept(p->servicefd, NULL, NULL); #endif if(p->commfd < 0){ printf("Server: Accept Failed! errno=%d\n",errno); exit(-12); } /* If requested, set the send and receive buffer sizes */ if(p->prot.sndbufsz > 0) { /* printf("Send and Receive Buffers on accepted socket set to %d bytes\n",*/ /* p->prot.sndbufsz);*/ if(setsockopt(p->commfd, SOL_SOCKET, SO_SNDBUF, &(p->prot.sndbufsz), sizeof(p->prot.sndbufsz)) < 0) { printf("setsockopt: SO_SNDBUF failed! errno=%d\n", errno); exit(556); } if(setsockopt(p->commfd, SOL_SOCKET, SO_RCVBUF, &(p->prot.rcvbufsz), sizeof(p->prot.rcvbufsz)) < 0) { printf("setsockopt: SO_RCVBUF failed! errno=%d\n", errno); exit(556); } } } } void CleanUp(ArgStruct *p) { char *quit="QUIT"; if (p->tr) { write(p->commfd,quit, 5); read(p->commfd, quit, 5); close(p->commfd); } else if( p->rcv ) { read(p->commfd,quit, 5); write(p->commfd,quit,5); close(p->commfd); close(p->servicefd); } } void Reset(ArgStruct *p) { /* Reset sockets */ if(p->reset_conn) { doing_reset = 1; /* Close the sockets */ CleanUp(p); /* Now open and connect new sockets */ Setup(p); } } void AfterAlignmentInit(ArgStruct *p) { } NetPIPE-3.7.2/src/knem.c0000644000000000000000000002146611433312522014763 0ustar00usergroup00000000000000/*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* * knem.c ---- knem Linux kernel module memory copy */ /* http://runtime.bordeaux.inria.fr/knem/ */ /*****************************************************************************/ #include "netpipe.h" #include #include #include #include #include #include #include typedef struct shared_data_t { uint64_t cookies[2]; double time; int repeat; uint8_t sync_counter; } shared_data_t; static int knem_fd = -1; static int shared_fd = -1; static volatile char *shared_map = NULL; static size_t shared_len = 0; static volatile shared_data_t *my_shared = NULL; static int my_cookie_index = 0; static volatile shared_data_t *peer_shared = NULL; static int peer_cookie_index = 0; static uint8_t last_sync_counter_value = 0; void Init(ArgStruct *p, int* pargc, char*** pargv) { /* Default to software copy mode; may be reset by command line args */ p->prot.flags = 0; } void Setup(ArgStruct *p) { pid_t pid; struct knem_cmd_info info; char *filename = (char*) "NPknem.mmap"; size_t pagesize = sysconf(_SC_PAGESIZE); int need_fork = 0, am_parent = 0, flags = O_RDWR; /* If no filename was specified, then we're the parent until we fork */ if (NULL == p->host) { am_parent = 1; need_fork = 1; unlink(filename); } /* If the file was specified, see if the file exists. If it does, then we're the parent. Otherwise, we're the "child". */ else { int ret; struct stat sbuf; filename = p->host; need_fork = 0; ret = stat(filename, &sbuf); if (ret < 0 && errno == ENOENT) { am_parent = 1; } } /* Open a file so that we can mmap it */ if (am_parent) { flags |= O_CREAT; printf("NPknem: creating shared file: %s\n", filename); } else { printf("NPknem: attaching to shared file: %s\n", filename); } shared_fd = open(filename, flags, 0600); if (shared_fd < 0) { fprintf(stderr, "Netpipe failed to create a file to mmap. Aborting in despair.\n"); exit(1); } shared_len = pagesize * 2; if (0 != ftruncate(shared_fd, shared_len)) { fprintf(stderr, "Netpipe failed to set the size of a shared file. Aborting in despair.\n"); exit(1); } /* Now fork the child and reset transmitter / receiver flags as appropriate */ if (need_fork) { pid = fork(); if (0 == pid) { am_parent = 0; } else { am_parent = 1; } } if (am_parent) { p->rcv = 0; p->tr = 1; } else { p->rcv = 1; p->tr = 0; } /* Map an anonymous shared memory segment between the two processes for passing cookies, etc. */ shared_map = mmap(NULL, shared_len, (PROT_READ | PROT_WRITE), MAP_SHARED, shared_fd, 0); if (MAP_FAILED == shared_map) { if (am_parent || !need_fork) { perror("mmap"); fprintf(stderr, "Netpipe failed to mmap a shared file. Aborting in despair.\n"); } exit(1); } /* Once we have both mmaped the file, parent unlinks the file so that we don't deal with filesystem synchronization. Parent's data is the first page; child's data is the second. This way we can pin them down to our local memory via "first touch" method. */ if (am_parent) { my_shared = (shared_data_t*) shared_map; peer_shared = (shared_data_t*) (shared_map + pagesize); } else { peer_shared = (shared_data_t*) shared_map; my_shared = (shared_data_t*) (shared_map + pagesize); } memset((void*) my_shared, 0, sizeof(*my_shared)); Sync(p); if (am_parent){ unlink(filename); } /* See if we can find /dev/knem */ knem_fd = open(KNEM_DEVICE_FILENAME, O_RDWR); if (knem_fd < 0) { if (am_parent || !need_fork) { fprintf(stderr, "Netpipe cannot open %s on this host. Aborting in despair.\n", KNEM_DEVICE_FILENAME); } exit(1); } /* Check that we're compiled against the same ABI version that we're running with */ if (ioctl(knem_fd, KNEM_CMD_GET_INFO, &info) < 0) { if (am_parent || !need_fork) { fprintf(stderr, "Netpipe failed to get ABI version from %s. Aborting in despair.\n", KNEM_DEVICE_FILENAME); } exit(1); } #if KNEM_ABI_VERSION < 0x0000000c #error KNEM is too old, pleasse upgrade to 0.7 or later #endif if (KNEM_ABI_VERSION != info.abi) { if (am_parent || !need_fork) { fprintf(stderr, "The knem ABI that Netpipe was compiled against is different than that of %s. Aborting in despair.\n", KNEM_DEVICE_FILENAME); } exit(1); } /* If DMA was asked for, ensure that it's available */ if (0 != p->prot.flags && 0 == (info.features & KNEM_FEATURE_DMA)) { if (am_parent || !need_fork) { fprintf(stderr, "DMA copy mode was requested but is not supported in the running kernel. Aborting in despair.\n"); } exit(1); } } void Sync(ArgStruct *p) { uint8_t save; ++my_shared->sync_counter; do { save = peer_shared->sync_counter; if (last_sync_counter_value != save) { ++last_sync_counter_value; break; } } while (1); } void PrepareToReceive(ArgStruct *p) { } void SendData(ArgStruct *p) { struct knem_cmd_param_iovec knem_iov = { .base = (uintptr_t) p->s_ptr, .len = p->bufflen }; struct knem_cmd_create_region createregioncmd = { .iovec_array = (uintptr_t) &knem_iov, .iovec_nr = 1, .flags = KNEM_FLAG_SINGLEUSE, .protection = PROT_READ, }; /* Create the region */ if (0 != ioctl(knem_fd, KNEM_CMD_CREATE_REGION, &createregioncmd)) { fprintf(stderr, "Netpipe failed to KNEM_CMD_CREATE_REGION. Aborting in despair.\n"); exit(1); } /* Send the cookie to the peer */ peer_shared->cookies[peer_cookie_index] = createregioncmd.cookie; peer_cookie_index = (0 == peer_cookie_index) ? 1 : 0; } void RecvData(ArgStruct *p) { uint64_t cookie; struct knem_cmd_param_iovec knem_iov = { .base = (uintptr_t) p->r_ptr, .len = p->bufflen }; struct knem_cmd_inline_copy icopycmd = { .local_iovec_array = (uintptr_t) &knem_iov, .local_iovec_nr = 1, .write = 0, .async_status_index = 0, .flags = p->prot.flags }; /* Wait for the sender to set my cookie */ while (0 == (cookie = my_shared->cookies[my_cookie_index])) { continue; } icopycmd.remote_cookie = cookie; icopycmd.remote_offset = 0; my_shared->cookies[my_cookie_index] = 0; my_cookie_index = (0 == my_cookie_index) ? 1 : 0; /* Initiate the receive (synchronous mode) */ if (0 != ioctl(knem_fd, KNEM_CMD_INLINE_COPY, &icopycmd)) { fprintf(stderr, "Netpipe failed to KNEM_CMD_INLINE_COPY. Aborting in despair.\n"); exit(1); } if (icopycmd.current_status != KNEM_STATUS_SUCCESS) { fprintf(stderr, "Netpipe failed to complete KNEM_CMD_INLINE_COPY. Aborting in despair.\n"); exit(1); } } void SendTime(ArgStruct *p, double *t) { /* Only child calls SendTime */ peer_shared->time = *t; Sync(p); } void RecvTime(ArgStruct *p, double *t) { /* Only parent calls RecvTime */ Sync(p); *t = my_shared->time; } void SendRepeat(ArgStruct *p, int rpt) { /* Only parent calls SendRepeat */ peer_shared->repeat = rpt; Sync(p); } void RecvRepeat(ArgStruct *p, int *rpt) { /* Only child calls RecvRepeat */ Sync(p); *rpt = my_shared->repeat; } void CleanUp(ArgStruct *p) { if (NULL != shared_map && 0 != shared_len) { munmap((void*) shared_map, shared_len); } if (-1 != shared_fd) { close(shared_fd); } close(knem_fd); } void Reset(ArgStruct *p) { } void AfterAlignmentInit(ArgStruct *p) { } NetPIPE-3.7.2/src/lapi.c0000644000000000000000000001505711433312522014755 0ustar00usergroup00000000000000#include "netpipe.h" #include lapi_handle_t t_hndl; lapi_cntr_t l_cntr; lapi_cntr_t t_cntr; lapi_cntr_t c_cntr; lapi_info_t t_info; /* LAPI info structure */ void *global_addr[2]; void *tgt_addr[2]; void *rpt_addr[2]; void *time_addr[2]; void *offset_addr[2]; int npRepeat; int nbor_r_buff_offset; void Init(ArgStruct *p, int* pargc, char*** pargv) { } void Setup(ArgStruct *p) { int one=1, loop, rc, val, cur_val; int task_id; /* My task id */ int num_tasks; /* Number of tasks in my job */ char* t_buf; /* Buffer to manipulate */ char err_msg_buf[LAPI_MAX_ERR_STRING]; bzero(&t_info, sizeof(lapi_info_t)); t_info.err_hndlr = NULL; /* Not registering error handler function */ if ((rc = LAPI_Init(&t_hndl, &t_info)) != LAPI_SUCCESS) { LAPI_Msg_string(rc, err_msg_buf); printf("Error Message: %s, rc = %d\n", err_msg_buf, rc); exit (rc); } /* Get task number within job */ rc = LAPI_Qenv(t_hndl, TASK_ID, &task_id); /* Get number of tasks in job */ rc = LAPI_Qenv(t_hndl, NUM_TASKS, &num_tasks); if (num_tasks != 2) { printf("Error Message: Run with MP_PROCS set to 2\n"); exit(1); } /* Turn off parameter checking - default is on */ rc = LAPI_Senv(t_hndl, ERROR_CHK, 0); /* Initialize counters to be zero at the start */ rc = LAPI_Setcntr(t_hndl, &l_cntr, 0); rc = LAPI_Setcntr(t_hndl, &t_cntr, 0); rc = LAPI_Setcntr(t_hndl, &c_cntr, 0); /* Exchange addresses for target counter, repeats, and rbuff offset */ rc = LAPI_Address_init(t_hndl,&t_cntr,tgt_addr); rc = LAPI_Address_init(t_hndl,&npRepeat,rpt_addr); rc = LAPI_Address_init(t_hndl,&nbor_r_buff_offset,offset_addr); p->tr = p->rcv = 0; if (task_id ==0) { p->tr = 1; p->prot.nbor=1; } else { p->rcv = 1; p->prot.nbor=0; } } void Sync(ArgStruct *p) { LAPI_Gfence(t_hndl); } void PrepareToReceive(ArgStruct *p) { /* Nothing to do */ } void SendData(ArgStruct *p) { int rc; int offset = p->s_ptr - p->s_buff; void* dest = global_addr[p->prot.nbor] + nbor_r_buff_offset + offset; /* We calculate the destination address because buffer alignment most * likely changed the start of the buffer from what malloc returned */ rc = LAPI_Put(t_hndl, p->prot.nbor, p->bufflen*sizeof(char), dest, (void *)p->s_ptr,tgt_addr[p->prot.nbor], &l_cntr,&c_cntr); /* Wait for local Put completion */ rc = LAPI_Waitcntr(t_hndl, &l_cntr, 1, NULL); } void RecvData(ArgStruct *p) { int rc,val,cur_val; /* Poll for receive. We have to use polling * as LAPI_Waitcntr does not guarantee making progress * on receives. */ rc = LAPI_Getcntr(t_hndl, &t_cntr, &val); while (val < 1) { rc = LAPI_Probe(t_hndl); /* Poll the adapter once */ rc = LAPI_Getcntr(t_hndl, &t_cntr, &val); } /* To clear the t_cntr value */ rc = LAPI_Waitcntr(t_hndl, &t_cntr, 1, &cur_val); } void SendTime(ArgStruct *p, double *t) { int rc; rc = LAPI_Address_init(t_hndl,t,time_addr); rc = LAPI_Put(t_hndl,p->prot.nbor,sizeof(double), time_addr[p->prot.nbor],(void *)t,tgt_addr[p->prot.nbor], &l_cntr,&c_cntr); /* Wait for local Put completion */ rc = LAPI_Waitcntr(t_hndl, &l_cntr, 1, NULL); } void RecvTime(ArgStruct *p, double *t) { int rc, val, cur_val; rc = LAPI_Address_init(t_hndl,t,time_addr); rc = LAPI_Getcntr(t_hndl, &t_cntr, &val); while (val < 1) { rc = LAPI_Probe(t_hndl); /* Poll the adapter once */ rc = LAPI_Getcntr(t_hndl, &t_cntr, &val); } /* To clear the t_cntr value */ rc = LAPI_Waitcntr(t_hndl, &t_cntr, 1, &cur_val); } void SendRepeat(ArgStruct *p, int rpt) { int rc; rc = LAPI_Put(t_hndl,p->prot.nbor,sizeof(int), rpt_addr[p->prot.nbor], (void *)&rpt,tgt_addr[p->prot.nbor],&l_cntr,&c_cntr); /* Wait for local Put completion */ rc = LAPI_Waitcntr(t_hndl, &l_cntr, 1, NULL); } void RecvRepeat(ArgStruct *p, int *rpt) { int rc,val,cur_val; rc = LAPI_Getcntr(t_hndl, &t_cntr, &val); while (val < 1) { rc = LAPI_Probe(t_hndl); /* Poll the adapter once */ rc = LAPI_Getcntr(t_hndl, &t_cntr, &val); } *rpt = npRepeat; /* To clear the t_cntr value */ rc = LAPI_Waitcntr(t_hndl, &t_cntr, 1, &cur_val); } void CleanUp(ArgStruct *p) { int rc; rc = LAPI_Gfence(t_hndl); /* Global fence to sync before terminating job */ rc = LAPI_Term(t_hndl); } void Reset(ArgStruct *p) { } void AfterAlignmentInit(ArgStruct* p) { int rc, val, cur_val; int my_r_buff_offset = p->r_buff - p->r_buff_orig; /* Send my receive buffer offset to other guy */ rc = LAPI_Put(t_hndl,p->prot.nbor,sizeof(int), offset_addr[p->prot.nbor], (void *)&my_r_buff_offset,tgt_addr[p->prot.nbor],&l_cntr,&c_cntr); /* Wait for local Put completion */ rc = LAPI_Waitcntr(t_hndl, &l_cntr, 1, NULL); /* Wait for incoming Put completion (We poll because receive progress not * guaranteed in LAPI_Waitcntr() */ rc = LAPI_Getcntr(t_hndl, &t_cntr, &val); while (val < 1) { rc = LAPI_Probe(t_hndl); /* Poll the adapter once, make progress */ rc = LAPI_Getcntr(t_hndl, &t_cntr, &val); } /* To clear the t_cntr value */ rc = LAPI_Waitcntr(t_hndl, &t_cntr, 1, &cur_val); } void MyMalloc(ArgStruct *p, int bufflen, int soffset, int roffset) { int rc; if((p->r_buff=(char *)malloc(bufflen+MAX(soffset,roffset)))==(char *)NULL) { fprintf(stderr,"couldn't allocate memory for receive buffer\n"); exit(-1); } rc = LAPI_Address_init(t_hndl,p->r_buff,global_addr); if(!p->cache) if((p->s_buff=(char *)malloc(bufflen+soffset))==(char *)NULL) { fprintf(stderr,"Couldn't allocate memory for send buffer\n"); exit(-1); } } void FreeBuff(char *buff1, char *buff2) { if(buff1 != NULL) free(buff1); if(buff2 != NULL) free(buff2); } NetPIPE-3.7.2/src/memcpy.c0000644000000000000000000000675611433312522015330 0ustar00usergroup00000000000000/*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* * memcpy.c ---- single process memory copy */ /*****************************************************************************/ #include "netpipe.h" /*#undef SPLIT_MEMCPY*/ #ifdef USE_MP_MEMCPY void MP_memcpy(); #endif void Init(ArgStruct *p, int* pargc, char*** pargv) { /* Print out message about results */ printf("\n"); printf(" *** Note about memcpy module results *** \n"); printf("\n"); printf("The memcpy module is sensitive to the L1 and L2 cache sizes,\n" \ "the size of the cache-lines, and the compiler. The following\n" \ "may help to interpret the results:\n" \ "\n" \ "* With cache effects and no perturbations (NPmemcpy -p 0),\n" \ " the plot will show 2 peaks. The first peak is where data is\n" \ " copied from L1 cache to L1, peaking around half the L1 cache\n" \ " size. The second peak is where data is copied from the L2 cache\n" \ " to L2, peaking around half the L2 cache size. The curve then\n" \ " will drop off as messages are copied from RAM through the caches\n" \ " and back to RAM.\n" \ "\n" \ "* Without cache effects and no perturbations (NPmemcpy -I -p 0).\n" \ " Data always starts in RAM, and is copied through the caches\n" \ " up in L1, L2, or RAM depending on the message size.\n"\ "\n" \ "* Compiler effects (NPmemcpy)\n" \ " The memcpy() function in even current versions of glibc is\n"\ " poorly optimized. Performance is great when the message size\n" \ " is divisible by 4 bytes, but other sizes revert to a byte-by-byte\n" \ " copy that can be 4-5 times slower. This produces sharp peaks\n" \ " in the curve that are not seen using other compilers.\n" \ ); printf("\n"); p->tr = 1; p->rcv = 0; } void Setup(ArgStruct *p) { } void Sync(ArgStruct *p) { } void PrepareToReceive(ArgStruct *p) { } void SendData(ArgStruct *p) { int nbytes = p->bufflen, nleft; char *src = p->s_ptr, *dest = p->r_ptr; #ifdef USE_MP_MEMCPY MP_memcpy(dest, src, nbytes); #else memcpy(dest, src, nbytes); #endif } void RecvData(ArgStruct *p) { int nbytes = p->bufflen, nleft; char *src = p->s_ptr, *dest = p->r_ptr; #ifdef USE_MP_MEMCPY MP_memcpy(src, dest, nbytes); #else memcpy(src, dest, nbytes); #endif } void SendTime(ArgStruct *p, double *t) { } void RecvTime(ArgStruct *p, double *t) { } void SendRepeat(ArgStruct *p, int rpt) { } void RecvRepeat(ArgStruct *p, int *rpt) { } void CleanUp(ArgStruct *p) { } void Reset(ArgStruct *p) { } void AfterAlignmentInit(ArgStruct *p) { } NetPIPE-3.7.2/src/mpi.c0000644000000000000000000001105411433312522014606 0ustar00usergroup00000000000000/*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* * MPI.c ---- MPI calls source */ /*****************************************************************************/ #include "netpipe.h" #include #ifdef BSEND char *messbuff; #define MAXBUFSIZE (10*1024*1024) #endif /* Initialize vars in Init() that may be changed by parsing the command args */ void Init(ArgStruct *p, int* pargc, char*** pargv) { p->source_node = 0; /* Default source node */ MPI_Init(pargc, pargv); } void Setup(ArgStruct *p) { int nprocs; MPI_Comm_rank(MPI_COMM_WORLD, &p->prot.iproc); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); { char s[255], *ptr; gethostname(s,253); if( s[0] != '.' ) { /* just print the base name */ ptr = strchr( s, '.'); if( ptr != NULL ) *ptr = '\0'; } printf("%d: %s\n",p->prot.iproc,s); fflush(stdout); } if (nprocs < 2) { printf("Need at least two processes (only given %d)\n", nprocs); exit(-2); } p->tr = p->rcv = 0; if( p->prot.iproc == 0 ) { p->tr = 1; p->prot.nbor = nprocs-1; } else if( p->prot.iproc == nprocs-1 ) { p->rcv = 1; p->prot.nbor = 0; } /* p->source_node may already have been set to -1 (MPI_ANY_SOURCE) * by specifying a -z on the command line. If not, set the source * node normally. */ if( p->source_node == 0 ) p->source_node = p->prot.nbor; #ifdef BSEND messbuff = (char *)malloc(MAXBUFSIZE * sizeof(char)); if (messbuff == NULL) { printf("Can't allocate for message buffer\n"); exit(-1); } MPI_Buffer_attach(messbuff, MAXBUFSIZE); p->upper = MAXBUFSIZE; #endif if( p->bidir ) { printf("MPI implementations do not have to guarantee message progress.\n"); printf("You may need to run using -a to avoid locking up.\n\n"); } } void Sync(ArgStruct *p) { MPI_Barrier(MPI_COMM_WORLD); } static int recvPosted = 0; static MPI_Request recvRequest; void PrepareToReceive(ArgStruct *p) { /* Providing a buffer for reception of data in advance of the sender sending the data provides a major performance boost on some implementations of MPI, particularly shared memory implementations on the Cray T3E and Intel Paragon. */ if (recvPosted) { printf("Can't prepare to receive: outstanding receive!\n"); exit(-1); } MPI_Irecv(p->r_ptr, p->bufflen, MPI_BYTE, p->source_node, 1, MPI_COMM_WORLD, &recvRequest); recvPosted = -1; } void SendData(ArgStruct *p) { #ifdef BSEND MPI_Bsend(p->s_ptr, p->bufflen, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD); #else if(p->syncflag) MPI_Ssend(p->s_ptr,p->bufflen, MPI_BYTE, p->prot.nbor,1,MPI_COMM_WORLD); else MPI_Send(p->s_ptr, p->bufflen, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD); #endif } void RecvData(ArgStruct *p) { MPI_Status status; if (recvPosted) { MPI_Wait(&recvRequest, &status); recvPosted = 0; } else { MPI_Recv(p->r_ptr, p->bufflen, MPI_BYTE, p->source_node, 1, MPI_COMM_WORLD, &status); } } void SendTime(ArgStruct *p, double *t) { MPI_Send(t, 1, MPI_DOUBLE, p->prot.nbor, 2, MPI_COMM_WORLD); } void RecvTime(ArgStruct *p, double *t) { MPI_Status status; MPI_Recv(t, 1, MPI_DOUBLE, p->prot.nbor, 2, MPI_COMM_WORLD, &status); } void SendRepeat(ArgStruct *p, int rpt) { MPI_Send(&rpt, 1, MPI_INT, p->prot.nbor, 2, MPI_COMM_WORLD); } void RecvRepeat(ArgStruct *p, int *rpt) { MPI_Status status; MPI_Recv(rpt, 1, MPI_INT, p->source_node, 2, MPI_COMM_WORLD, &status); } void CleanUp(ArgStruct *p) { MPI_Finalize(); } void Reset(ArgStruct *p) { } void AfterAlignmentInit(ArgStruct *p) { } NetPIPE-3.7.2/src/mpi2.c0000644000000000000000000000742611433312522014700 0ustar00usergroup00000000000000/* Netpipe module for mpi-2 one-sided communications by Adam Oline */ #define USE_VOLATILE_RPTR #include "netpipe.h" #include MPI_Win win; void Init(ArgStruct *p, int* pargc, char*** pargv) { p->prot.use_get = 0; /* Default to put */ p->prot.no_fence = 0; /* Default to fence */ MPI_Init(pargc, pargv); } void Setup(ArgStruct *p) { int nprocs; MPI_Comm_rank(MPI_COMM_WORLD, &p->prot.iproc); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); if ( nprocs < 2 ) { printf("Need at least 2 processes, we have %d\n", nprocs); exit(-2); } { char s[255], *ptr; gethostname(s,253); if( s[0] != '.' ) { /* just print the base name */ ptr = strchr( s, '.'); if( ptr != NULL ) *ptr = '\0'; } printf("%d: %s\n",p->prot.iproc,s); fflush(stdout); } /* TODO: Finish changing netpipe such that it can run with > 2 procs */ /* 0 <--> (nprocs - 1) * 1 <--> (nprocs - 2) * ... */ p->tr = p->rcv = 0; if (p->prot.iproc == 0) { p->tr = 1; p->prot.nbor = nprocs-1; } else if( p->prot.iproc == nprocs-1 ) { p->rcv = 1; p->prot.nbor = 0; } } void Sync(ArgStruct *p) { MPI_Win_fence(0, win); } void PrepareToReceive(ArgStruct *p) { } void SendData(ArgStruct *p) { int buf_offset = 0; /* If we're limiting cache effects, then we need to calculate the offset * from the beginning of the memory pool */ if( !p->cache ) buf_offset = p->s_ptr - p->s_buff; if( p->prot.use_get ) MPI_Get(p->s_ptr, p->bufflen, MPI_BYTE, p->prot.nbor, buf_offset, p->bufflen, MPI_BYTE, win); else MPI_Put(p->s_ptr, p->bufflen, MPI_BYTE, p->prot.nbor, buf_offset, p->bufflen, MPI_BYTE, win); if (p->prot.no_fence == 0) MPI_Win_fence(0, win); } void RecvData(ArgStruct *p) { /* If user specified 'no fence' option on cmd line, then we try to bypass * the fence call by waiting for the last byte to arrive. The MPI-2 * standard does not require any data to be written locally until a * synchronization call (such as fence) occurs, however, so this may * hang, depending on the MPI-2 implementation. Currently works with * MP_Lite . */ if( p->prot.no_fence ) { /* The conditional in the comparison below is necessary because we are * always waiting for a 'b' to arrive if in no-cache mode, but in cache * mode the character we are waiting for depends on whether we are the * transmitter or receiver. Adding a little complexity here helps * us avoid more complexity elsewhere with regard to the no-cache code. * We cannot use the same character all the time with cache mode due * to timing issues. */ while(p->r_ptr[p->bufflen-1] != 'a' + (p->cache ? 1 - p->tr : 1) ) sched_yield(); /* Since we made r_ptr volatile, we don't necessarily * need to call a function here encourage the compiler * to reload it */ p->r_ptr[p->bufflen-1] = 'a' + (p->cache ? p->tr : 0); } else { MPI_Win_fence(0, win); } } void SendTime(ArgStruct *p, double *t) { MPI_Send(t, 1, MPI_DOUBLE, p->prot.nbor, 2, MPI_COMM_WORLD); } void RecvTime(ArgStruct *p, double *t) { MPI_Status status; MPI_Recv(t, 1, MPI_DOUBLE, p->prot.nbor, 2, MPI_COMM_WORLD, &status); } void SendRepeat(ArgStruct *p, int rpt) { MPI_Send(&rpt, 1, MPI_INT, p->prot.nbor, 2, MPI_COMM_WORLD); } void RecvRepeat(ArgStruct *p, int *rpt) { MPI_Status status; MPI_Recv(rpt, 1, MPI_INT, p->prot.nbor, 2, MPI_COMM_WORLD, &status); } void CleanUp(ArgStruct *p) { MPI_Finalize(); } void Reset(ArgStruct *p) { } void AfterAlignmentInit(ArgStruct *p) { /* After mallocs and alignment, we need to create MPI Window */ MPI_Win_create(p->r_buff, p->bufflen, 1, NULL, MPI_COMM_WORLD, &win); } NetPIPE-3.7.2/src/mx.c0000644000000000000000000002200711433312522014445 0ustar00usergroup00000000000000#include "netpipe.h" void Init(ArgStruct *p, int* pargc, char*** pargv) { p->tr = 0; p->rcv = 1; } void Setup(ArgStruct *p) { mx_return_t mx_ret; mx_ret = mx_init(); if (mx_ret != MX_SUCCESS) { printf(" Couldn't initialize MX\n"); exit(-1); } mx_ret = mx_open_endpoint(0, 0, 0x14072010, NULL, 0, &p->prot.ep); if (mx_ret != MX_SUCCESS) { printf(" Couldn't open board 0 endpoint 0\n"); exit(-1); } printf("Opened board 0 endpoint 0\n"); establish(p); } void establish(ArgStruct *p) { mx_return_t mx_ret; if(p->tr){ char mx_hostname[MX_MAX_HOSTNAME_LEN]; uint64_t mx_nicid; mx_request_t mx_req; mx_status_t mx_status; uint32_t mx_result; snprintf(mx_hostname, sizeof(mx_hostname), "%s:0", p->host); mx_ret = mx_hostname_to_nic_id(mx_hostname, &mx_nicid); if (mx_ret != MX_SUCCESS) { printf("Couldn't find peer %s\n", mx_hostname); exit(-1); } mx_ret = mx_connect(p->prot.ep, mx_nicid, 0, 0x14072010, MX_INFINITE, &p->prot.addr); if (mx_ret != MX_SUCCESS) { printf("Couldn't connect to peer %s endpoint 0\n", mx_hostname); exit(-1); } mx_ret = mx_isend(p->prot.ep, NULL, 0, p->prot.addr, 0, NULL, &mx_req); if (mx_ret != MX_SUCCESS) { printf("Couldn't send connect to peer %s endpoint 0\n", mx_hostname); exit(-1); } mx_ret = mx_wait(p->prot.ep, &mx_req, MX_INFINITE, &mx_status, &mx_result); if (mx_ret != MX_SUCCESS || !mx_result || mx_status.code != MX_STATUS_SUCCESS) { printf("Send connect to peer %s endpoint 0 failed\n", mx_hostname); exit(-1); } mx_ret = mx_irecv(p->prot.ep, NULL, 0, 0, 0, NULL, &mx_req); if (mx_ret != MX_SUCCESS) { printf("Couldn't receive connect back\n"); exit(-1); } mx_ret = mx_wait(p->prot.ep, &mx_req, MX_INFINITE, &mx_status, &mx_result); if (mx_ret != MX_SUCCESS || !mx_result || mx_status.code != MX_STATUS_SUCCESS) { printf("Receiver connect back failed\n"); exit(-1); } } else { uint64_t mx_nicid; uint32_t mx_eid; mx_request_t mx_req; mx_status_t mx_status; uint32_t mx_result; mx_ret = mx_irecv(p->prot.ep, NULL, 0, 0, 0, NULL, &mx_req); if (mx_ret != MX_SUCCESS) { printf("Couldn't receive connect\n"); exit(-1); } mx_ret = mx_wait(p->prot.ep, &mx_req, MX_INFINITE, &mx_status, &mx_result); if (mx_ret != MX_SUCCESS || !mx_result || mx_status.code != MX_STATUS_SUCCESS) { printf("Receive connect failed\n"); exit(-1); } mx_ret = mx_decompose_endpoint_addr(mx_status.source, &mx_nicid, &mx_eid); if (mx_ret != MX_SUCCESS) { printf("Couldn't decompose sender address\n"); exit(-1); } mx_ret = mx_connect(p->prot.ep, mx_nicid, mx_eid, 0x14072010, MX_INFINITE, &p->prot.addr); if (mx_ret != MX_SUCCESS) { printf("Couldn't connect to nic %llx endpoint %u\n", (unsigned long long) mx_nicid, (unsigned) mx_eid); exit(-1); } mx_ret = mx_isend(p->prot.ep, NULL, 0, p->prot.addr, 0, NULL, &mx_req); if (mx_ret != MX_SUCCESS) { printf("Couldn't send connect back\n"); exit(-1); } mx_ret = mx_wait(p->prot.ep, &mx_req, MX_INFINITE, &mx_status, &mx_result); if (mx_ret != MX_SUCCESS || !mx_result || mx_status.code != MX_STATUS_SUCCESS) { printf("Send connect back failed\n"); exit(-1); } } } void Sync(ArgStruct *p) { char s[] = "SyncMe", response[] = " "; mx_segment_t mx_seg; mx_request_t mx_req; mx_status_t mx_status; uint32_t mx_result; mx_return_t mx_ret; mx_seg.segment_ptr = s; mx_seg.segment_length = strlen(s); mx_ret = mx_isend(p->prot.ep, &mx_seg, 1, p->prot.addr, 0, NULL, &mx_req); if (mx_ret != MX_SUCCESS) { printf("Couldn't send sync\n"); exit(-1); } mx_ret = mx_wait(p->prot.ep, &mx_req, MX_INFINITE, &mx_status, &mx_result); if (mx_ret != MX_SUCCESS || !mx_result || mx_status.code != MX_STATUS_SUCCESS) { printf("Send sync failed\n"); exit(-1); } mx_seg.segment_ptr = response; mx_seg.segment_length = strlen(response); mx_ret = mx_irecv(p->prot.ep, &mx_seg, 1, 0, 0, NULL, &mx_req); if (mx_ret != MX_SUCCESS) { printf("Couldn't receive sync\n"); exit(-1); } mx_ret = mx_wait(p->prot.ep, &mx_req, MX_INFINITE, &mx_status, &mx_result); if (mx_ret != MX_SUCCESS || !mx_result || mx_status.code != MX_STATUS_SUCCESS) { printf("Receive sync failed\n"); exit(-1); } } void PrepareToReceive(ArgStruct *p) { /* TODO use this */ } void SendData(ArgStruct *p) { mx_segment_t mx_seg; mx_request_t mx_req; mx_status_t mx_status; uint32_t mx_result; mx_return_t mx_ret; mx_seg.segment_ptr = p->s_ptr; mx_seg.segment_length = p->bufflen; mx_ret = mx_isend(p->prot.ep, &mx_seg, 1, p->prot.addr, 0, NULL, &mx_req); if (mx_ret != MX_SUCCESS) { printf("Couldn't send data\n"); exit(-1); } do { mx_ret = mx_test(p->prot.ep, &mx_req, &mx_status, &mx_result); if (mx_ret != MX_SUCCESS) { printf("Send data failed\n"); exit(-1); } } while (!mx_result); if (mx_status.code != MX_STATUS_SUCCESS) { printf("Send data failed\n"); exit(-1); } } void RecvData(ArgStruct *p) { mx_status_t mx_status; uint32_t mx_result; mx_segment_t mx_seg; mx_return_t mx_ret; mx_seg.segment_ptr = p->r_ptr; mx_seg.segment_length = p->bufflen; mx_ret = mx_irecv(p->prot.ep, &mx_seg, 1, 0, 0, NULL, &p->prot.rreq); if (mx_ret != MX_SUCCESS) { printf("Couldn't prepare receive\n"); exit(-1); } do { mx_ret = mx_test(p->prot.ep, &p->prot.rreq, &mx_status, &mx_result); if (mx_ret != MX_SUCCESS) { printf("Recv data failed\n"); exit(-1); } } while (!mx_result); if (mx_status.code != MX_STATUS_SUCCESS) { printf("Recv data failed\n"); exit(-1); } } /* ********** NetPipe stuff ********* */ void SendTime(ArgStruct *p, double *t) { mx_segment_t mx_seg; mx_request_t mx_req; mx_status_t mx_status; uint32_t mx_result; mx_return_t mx_ret; uint32_t ltime, ntime; /* Multiply the number of seconds by 1e6 to get time in microseconds and convert value to an unsigned 32-bit integer. */ ltime = (uint32_t)(*t * 1.e6); /* Send time in network order */ ntime = htonl(ltime); mx_seg.segment_ptr = &ntime; mx_seg.segment_length = sizeof(ntime); mx_ret = mx_isend(p->prot.ep, &mx_seg, 1, p->prot.addr, 0, NULL, &mx_req); if (mx_ret != MX_SUCCESS) { printf("Couldn't send time\n"); exit(301); } mx_ret = mx_wait(p->prot.ep, &mx_req, MX_INFINITE, &mx_status, &mx_result); if (mx_ret != MX_SUCCESS || !mx_result || mx_status.code != MX_STATUS_SUCCESS) { printf("Send time failed\n"); exit(301); } } void RecvTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; mx_segment_t mx_seg; mx_request_t mx_req; mx_status_t mx_status; uint32_t mx_result; mx_return_t mx_ret; mx_seg.segment_ptr = &ntime; mx_seg.segment_length = sizeof(ntime); mx_ret = mx_irecv(p->prot.ep, &mx_seg, 1, 0, 0, NULL, &mx_req); if (mx_ret != MX_SUCCESS) { printf("Couldn't prepare receive time\n"); exit(302); } mx_ret = mx_wait(p->prot.ep, &mx_req, MX_INFINITE, &mx_status, &mx_result); if (mx_ret != MX_SUCCESS || !mx_result || mx_status.code != MX_STATUS_SUCCESS) { printf("Receive time failed\n"); exit(302); } ltime = ntohl(ntime); /* Result is ltime (in microseconds) divided by 1.0e6 to get seconds */ *t = (double)ltime / 1.0e6; } /* in the event of a send failure, re-send (tcp)*/ void SendRepeat(ArgStruct *p, int rpt) { mx_segment_t mx_seg; mx_request_t mx_req; mx_status_t mx_status; uint32_t mx_result; mx_return_t mx_ret; uint32_t lrpt, nrpt; lrpt = rpt; /* Send repeat count as a long in network order */ nrpt = htonl(lrpt); mx_seg.segment_ptr = &nrpt; mx_seg.segment_length = sizeof(nrpt); mx_ret = mx_isend(p->prot.ep, &mx_seg, 1, p->prot.addr, 0, NULL, &mx_req); if (mx_ret != MX_SUCCESS) { printf("Couldn't send repeat\n"); exit(304); } mx_ret = mx_wait(p->prot.ep, &mx_req, MX_INFINITE, &mx_status, &mx_result); if (mx_ret != MX_SUCCESS || !mx_result || mx_status.code != MX_STATUS_SUCCESS) { printf("Send repeat failed\n"); exit(304); } } /* in the event of a recv failure, resend (tcp)*/ void RecvRepeat(ArgStruct *p, int *rpt) { uint32_t lrpt, nrpt; mx_segment_t mx_seg; mx_request_t mx_req; mx_status_t mx_status; uint32_t mx_result; mx_return_t mx_ret; mx_seg.segment_ptr = &nrpt; mx_seg.segment_length = sizeof(nrpt); mx_ret = mx_irecv(p->prot.ep, &mx_seg, 1, 0, 0, NULL, &mx_req); if (mx_ret != MX_SUCCESS) { printf("Couldn't prepare receive time\n"); exit(302); } mx_ret = mx_wait(p->prot.ep, &mx_req, MX_INFINITE, &mx_status, &mx_result); if (mx_ret != MX_SUCCESS || !mx_result || mx_status.code != MX_STATUS_SUCCESS) { printf("Receive time failed\n"); exit(302); } lrpt = ntohl(nrpt); *rpt = lrpt; } void CleanUp(ArgStruct *p) { sleep(1); mx_close_endpoint(p->prot.ep); mx_finalize(); } void Reset(ArgStruct *p) { } void AfterAlignmentInit(ArgStruct *p) { } NetPIPE-3.7.2/src/netpipe.c0000644000000000000000000014060211433312522015467 0ustar00usergroup00000000000000/*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* Files needed for use: */ /* * netpipe.c ---- Driver source */ /* * netpipe.h ---- General include file */ /* * tcp.c ---- TCP calls source */ /* * tcp.h ---- Include file for TCP calls and data structs */ /* * mpi.c ---- MPI calls source */ /* * pvm.c ---- PVM calls source */ /* * pvm.h ---- Include file for PVM calls and data structs */ /* * tcgmsg.c ---- TCGMSG calls source */ /* * tcgmsg.h ---- Include file for TCGMSG calls and data structs */ /* * udapl.c ---- uDAPL calls source */ /* * knem.c ---- knem calls source */ /* * vmsplice.c ---- vmsplice calls source */ /*****************************************************************************/ #include "netpipe.h" #if defined(MPLITE) #include "mplite.h" /* Included for the malloc wrapper to protect from */ #endif extern char *optarg; int main(int argc, char **argv) { FILE *out; /* Output data file */ char s[255],s2[255],delim[255],*pstr; /* Generic strings */ int *memcache; /* used to flush cache */ int len_buf_align, /* meaningful when args.cache is 0. buflen */ /* rounded up to be divisible by 8 */ num_buf_align; /* meaningful when args.cache is 0. number */ /* of aligned buffers in memtmp */ int c, /* option index */ i, j, n, nq, /* Loop indices */ asyncReceive=0, /* Pre-post a receive buffer? */ bufalign=16*1024,/* Boundary to align buffer to */ errFlag, /* Error occurred in inner testing loop */ nrepeat, /* Number of time to do the transmission */ nrepeat_const=0,/* Set if we are using a constant nrepeat */ len, /* Number of bytes to be transmitted */ inc=0, /* Increment value */ perturbation=DEFPERT, /* Perturbation value */ pert, start= 1, /* Starting value for signature curve */ end=MAXINT, /* Ending value for signature curve */ streamopt=0, /* Streaming mode flag */ reset_connection,/* Reset the connection between trials */ debug_wait=0; /* spin and wait for a debugger */ ArgStruct args; /* Arguments for all the calls */ double t, t0, t1, t2, /* Time variables */ tlast, /* Time for the last transmission */ latency; /* Network message latency */ Data bwdata[NSAMP]; /* Bandwidth curve data */ int integCheck=0; /* Integrity check */ /* Initialize vars that may change from default due to arguments */ strcpy(s, "np.out"); /* Default output file */ /* Let modules initialize related vars, and possibly call a library init function that requires argc and argv */ Init(&args, &argc, &argv); /* This will set args.tr and args.rcv */ args.preburst = 0; /* Default to not bursting preposted receives */ args.bidir = 0; /* Turn bi-directional mode off initially */ args.cache = 1; /* Default to use cache */ args.upper = end; args.host = NULL; args.soffset=0; /* default to no offsets */ args.roffset=0; args.syncflag=0; /* use normal mpi_send */ args.use_sdp=0; /* default to no SDP */ args.port = DEFPORT; /* just in case the user doesn't set this. */ /* TCGMSG launches NPtcgmsg with a -master master_hostname * argument, so ignore all arguments and set them manually * in netpipe.c instead. */ #if ! defined(TCGMSG) /* Parse the arguments. See Usage for description */ while ((c = getopt(argc, argv, "AXSO:rIiszgfaB2h:p:o:l:u:b:m:n:t:c:d:D:P:")) != -1) { switch(c) { case 'A': args.use_sdp=1; break; case 'O': strcpy(s2,optarg); strcpy(delim,","); if((pstr=strtok(s2,delim))!=NULL) { args.soffset=atoi(pstr); if((pstr=strtok((char *)NULL,delim))!=NULL) args.roffset=atoi(pstr); else /* only got one token */ args.roffset=args.soffset; } else { args.soffset=0; args.roffset=0; } printf("Transmit buffer offset: %d\nReceive buffer offset: %d\n",args.soffset,args.roffset); break; case 'p': perturbation = atoi(optarg); if( perturbation > 0 ) { printf("Using a perturbation value of %d\n\n", perturbation); } else { perturbation = 0; printf("Using no perturbations\n\n"); } break; case 'B': if(integCheck == 1) { fprintf(stderr, "Integrity check not supported with prepost burst\n"); exit(-1); } args.preburst = 1; asyncReceive = 1; printf("Preposting all receives before a timed run.\n"); printf("Some would consider this cheating,\n"); printf("but it is needed to match some vendor tests.\n"); fflush(stdout); break; case 'I': args.cache = 0; printf("Performance measured without cache effects\n\n"); fflush(stdout); break; case 'o': strcpy(s,optarg); printf("Sending output to %s\n", s); fflush(stdout); break; case 's': streamopt = 1; printf("Streaming in one direction only.\n\n"); #if defined(TCP) && !defined(INFINIBAND) && !defined(OPENIB) && !defined(DAT) printf("Sockets are reset between trials to avoid\n"); printf("degradation from a collapsing window size.\n\n"); #endif args.reset_conn = 1; printf("Streaming does not provide an accurate\n"); printf("measurement of the latency since small\n"); printf("messages may get bundled together.\n\n"); if( args.bidir == 1 ) { printf("You can't use -s and -2 together\n"); exit(0); } fflush(stdout); break; case 'l': start = atoi(optarg); if (start < 1) { fprintf(stderr,"Need a starting value >= 1\n"); exit(0); } break; case 'u': end = atoi(optarg); break; #if defined(TCP) && ! defined(INFINIBAND) && !defined(OPENIB) && !defined(DAT) case 'b': /* -b # resets the buffer size, -b 0 keeps system defs */ args.prot.sndbufsz = args.prot.rcvbufsz = atoi(optarg); break; #endif case '2': args.bidir = 1; /* Both procs are transmitters */ /* end will be maxed at sndbufsz+rcvbufsz */ printf("Passing data in both directions simultaneously.\n"); printf("Output is for the combined bandwidth.\n"); #if defined(TCP) && ! defined(INFINIBAND) && !defined(OPENIB) && !defined(DAT) printf("The socket buffer size limits the maximum test size.\n\n"); #endif if( streamopt ) { printf("You can't use -s and -2 together\n"); exit(0); } break; case 'h': args.tr = 1; /* -h implies transmit node */ args.rcv = 0; args.host = (char *)malloc(strlen(optarg)+1); strcpy(args.host, optarg); break; #ifdef DISK case 'd': args.tr = 1; /* -d to specify input/output file */ args.rcv = 0; args.prot.read = 0; args.prot.read_type = 'c'; args.prot.dfile_name = (char *)malloc(strlen(optarg)+1); strcpy(args.prot.dfile_name, optarg); break; case 'D': if( optarg[0] == 'r' ) args.prot.read = 1; else args.prot.read = 0; args.prot.read_type = optarg[1]; break; #endif case 'i': if(args.preburst == 1) { fprintf(stderr, "Integrity check not supported with prepost burst\n"); exit(-1); } integCheck = 1; perturbation = 0; start = sizeof(int)+1; /* Start with integer size */ printf("Doing an integrity check instead of measuring performance\n"); fflush(stdout); break; #if defined(MPI) case 'z': args.source_node = -1; printf("Receive using the ANY_SOURCE flag\n"); fflush(stdout); break; case 'a': asyncReceive = 1; printf("Preposting asynchronous receives\n"); fflush(stdout); break; case 'S': args.syncflag=1; fprintf(stderr,"Using synchronous sends\n"); break; #endif #if defined(MPI2) case 'g': if(args.prot.no_fence == 1) { fprintf(stderr, "-f cannot be used with -g\n"); exit(-1); } args.prot.use_get = 1; printf("Using MPI-2 Get instead of Put\n"); break; case 'f': if(args.prot.use_get == 1) { fprintf(stderr, "-f cannot be used with -g\n"); exit(-1); } args.prot.no_fence = 1; bufalign = 0; printf("Buffer alignment off (Required for no fence)\n"); break; #endif /* MPI2 */ #if defined(INFINIBAND) && !defined(DAT) case 'm': switch(atoi(optarg)) { case 256: args.prot.ib_mtu = MTU256; break; case 512: args.prot.ib_mtu = MTU512; break; case 1024: args.prot.ib_mtu = MTU1024; break; case 2048: args.prot.ib_mtu = MTU2048; break; case 4096: args.prot.ib_mtu = MTU4096; break; default: fprintf(stderr, "Invalid MTU size, must be one of " "256, 512, 1024, 2048, 4096\n"); exit(-1); } break; #endif #if defined(OPENIB) && !defined(DAT) case 'm': switch(atoi(optarg)) { case 256: args.prot.ib_mtu = IBV_MTU_256; break; case 512: args.prot.ib_mtu = IBV_MTU_512; break; case 1024: args.prot.ib_mtu = IBV_MTU_1024; break; case 2048: args.prot.ib_mtu = IBV_MTU_2048; break; case 4096: args.prot.ib_mtu = IBV_MTU_4096; break; default: fprintf(stderr, "Invalid MTU size, must be one of " "256, 512, 1024, 2048, 4096\n"); exit(-1); } break; #endif #if defined(OPENIB) case 'D': args.prot.device_and_port = strdup(optarg); break; #endif #if ( defined(OPENIB) || defined(INFINIBAND) ) && !defined(DAT) case 't': if( !strcmp(optarg, "send_recv") ) { printf("Using Send/Receive communications\n"); args.prot.commtype = NP_COMM_SENDRECV; } else if( !strcmp(optarg, "send_recv_with_imm") ) { printf("Using Send/Receive communications with immediate data\n"); args.prot.commtype = NP_COMM_SENDRECV_WITH_IMM; } else if( !strcmp(optarg, "rdma_write") ) { printf("Using RDMA Write communications\n"); args.prot.commtype = NP_COMM_RDMAWRITE; } else if( !strcmp(optarg, "rdma_write_with_imm") ) { printf("Using RDMA Write communications with immediate data\n"); args.prot.commtype = NP_COMM_RDMAWRITE_WITH_IMM; } else { fprintf(stderr, "Invalid transfer type " "specified, please choose one of:\n\n" "\tsend_recv\t\tUse Send/Receive communications\t(default)\n" "\tsend_recv_with_imm\tSame as above with immediate data\n" "\trdma_write\t\tUse RDMA Write communications\n" "\trdma_write_with_imm\tSame as above with immediate data\n\n"); exit(-1); } break; case 'c': if( !strcmp(optarg, "local_poll") ) { printf("Using local polling completion\n"); args.prot.comptype = NP_COMP_LOCALPOLL; } else if( !strcmp(optarg, "vapi_poll") ) { printf("Using VAPI polling completion\n"); args.prot.comptype = NP_COMP_VAPIPOLL; } else if( !strcmp(optarg, "event") ) { printf("Using VAPI event completion\n"); args.prot.comptype = NP_COMP_EVENT; } else { fprintf(stderr, "Invalid completion type specified, " "please choose one of:\n\n" "\tlocal_poll\tWait for last byte of data\t(default)\n" "\tvapi_poll\tUse VAPI polling function\n" "\tevent\t\tUse VAPI event handling function\n\n"); exit(-1); } break; #endif #if defined(DAT) case 't': if( !strcmp(optarg, "send_recv") ) { printf("Using Send/Receive communications\n"); args.prot.commtype = NP_COMM_SENDRECV; } else if( !strcmp(optarg, "rdma_write") ) { printf("Using RDMA Write communications\n"); args.prot.commtype = NP_COMM_RDMAWRITE; } else { fprintf(stderr, "Invalid transfer type " "specified, please choose one of:\n\n" "\tsend_recv\t\tUse Send/Receive communications\t(default)\n" "\trdma_write\t\tUse RDMA Write communications\n"); exit(-1); } break; case 'c': if( !strcmp(optarg, "local_poll") ) { printf("Using local polling completion\n"); args.prot.comptype = NP_COMP_LOCALPOLL; } else if( !strcmp(optarg, "dq_poll") ) { printf("Using EVD Dequeue to poll for completion\n"); args.prot.comptype = NP_COMP_DQPOLL; } else if( !strcmp(optarg, "evd_wait") ) { printf("Using EVD Wait for completion\n"); args.prot.comptype = NP_COMP_EVD; } else if( !strcmp(optarg, "cno_wait") ) { printf("Using CNO Wait for completion\n"); args.prot.comptype = NP_COMP_CNO; } else { fprintf(stderr, "Invalid completion type specified, " "please choose one of:\n\n" "\tlocal_poll\tWait for last byte of data (default)\n" "\tdq_poll\t\tUse EVD Dequeue to poll for completion\n" "\tevd_wait\tUse EVD wait for completion events\n" "\tcno_wait\tUse CNO wait for completion events\n\n"); exit(-1); } break; #endif #if defined(KNEM) case 't': if( !strcasecmp(optarg, "copy") ) { printf("Using software copy mode\n"); args.prot.flags = 0; } else if( !strcasecmp(optarg, "dma") ) { printf("Using DMA copy mode\n"); args.prot.flags = KNEM_FLAG_DMA; } else { fprintf(stderr, "Invalid transfer type " "specified, please choose one of:\n\n" "\tcopy\t\tUse software copy mode\t(default)\n" "\tdma\t\tUse DMA copy mode\n"); exit(-1); } break; #endif case 'P': args.port = atoi(optarg); break; case 'n': nrepeat_const = atoi(optarg); break; #if defined(TCP) && ! defined(INFINIBAND) && !defined(OPENIB) case 'r': args.reset_conn = 1; printf("Resetting connection after every trial\n"); break; #endif case 'X': debug_wait = 1; printf("Enableing debug wait!\n"); printf("Attach to pid %d and set debug_wait to 0 to conttinue\n", getpid()); break; default: PrintUsage(); exit(-12); } } while(debug_wait){ for(i=0;i<10000;i++){}; }; #endif /* ! defined TCGMSG */ #if defined(OPENIB) || defined(INFINIBAND) || defined(DAT) #if defined(DAT) // if using RDMA_WRITE, no need to prepost receives since no receive requests are // consumed by the RDMA_WRITE operations. however, if using a completion notification // method other than LOCAL_POLL along with RDMA_WRITES, the handshake receive packet // will need to be preposted. if ( (NP_COMM_RDMAWRITE == args.prot.commtype) && (NP_COMP_LOCALPOLL == args.prot.comptype)) { asyncReceive = 0; } else { asyncReceive = 1; fprintf(stderr, "Preposting asynchronous receive.\n"); } #else asyncReceive = 1; fprintf(stderr, "Preposting asynchronous receives (required for Infiniband)\n"); #endif if(args.bidir && ( (args.cache && args.prot.commtype == NP_COMM_RDMAWRITE) || /* rdma_write only works with no-cache mode */ (!args.preburst && args.prot.commtype != NP_COMM_RDMAWRITE) || /* anything besides rdma_write requires prepost burst */ (args.preburst && args.prot.comptype == NP_COMP_LOCALPOLL && args.cache) || /* preburst with local polling in cache mode doesn't work */ 0)) { fprintf(stderr, "\n" "Bi-directional mode currently only works with a subset of the\n" "Infiniband options. Restrictions are:\n" "\n" " RDMA write (-t rdma_write) requires no-cache mode (-I).\n" "\n" " Local polling (-c local_poll, default if no -c given) requires\n" " no-cache mode (-I), and if not using RDMA write communication,\n" " burst mode (-B).\n" "\n" " Any other communication type and any other completion type\n" " require burst mode (-B). No-cache mode (-I) may be used\n" " optionally.\n" "\n" " All other option combinations will fail.\n" "\n"); exit(-1); } #endif if (start > end) { fprintf(stderr, "Start MUST be LESS than end\n"); exit(420132); } args.nbuff = TRIALS; Setup(&args); if( args.bidir && end > args.upper ) { end = args.upper; if( args.tr ) { printf("The upper limit is being set to %d Bytes\n", end); #if defined(TCP) && ! defined(INFINIBAND) && !defined(OPENIB) && !defined(DAT) printf("due to socket buffer size limitations\n\n"); #endif } } #if defined(GM) if(streamopt && (!nrepeat_const || nrepeat_const > args.prot.num_stokens)) { printf("\nGM is currently limited by the driver software to %d\n", args.prot.num_stokens); printf("outstanding sends. The number of repeats will be set\n"); printf("to this limit for every trial in streaming mode. You\n"); printf("may use the -n switch to set a smaller number of repeats\n\n"); nrepeat_const = args.prot.num_stokens; } #endif if( args.tr ) /* Primary transmitter */ { if ((out = fopen(s, "w")) == NULL) { fprintf(stderr,"Can't open %s for output\n", s); exit(1); } } else out = stdout; /* Set a starting value for the message size increment. */ inc = (start > 1) ? start / 2 : 1; nq = (start > 1) ? 1 : 0; /* Test the timing to set tlast for the first test */ args.bufflen = start; MyMalloc(&args, args.bufflen, 0, 0); InitBufferData(&args, args.bufflen, 0, 0); if(args.cache) args.s_buff = args.r_buff; args.r_ptr = args.r_buff_orig = args.r_buff; args.s_ptr = args.s_buff_orig = args.s_buff; AfterAlignmentInit(&args); /* MPI-2 needs this to create a window */ /* Infiniband requires use of asynchronous communications, so we need * the PrepareToReceive calls below */ if( asyncReceive ) PrepareToReceive(&args); Sync(&args); /* Sync to prevent race condition in armci module */ /* For simplicity's sake, even if the real test below will be done in * bi-directional mode, we still do the ping-pong one-way-at-a-time test * here to estimate the one-way latency. Unless it takes significantly * longer to send data in both directions at once than it does to send data * one way at a time, this shouldn't be too far off anyway. */ t0 = When(); for( n=0; n<100; n++) { if( args.tr) { SendData(&args); RecvData(&args); if( asyncReceive && n<99 ) PrepareToReceive(&args); } else if( args.rcv) { RecvData(&args); if( asyncReceive && n<99 ) PrepareToReceive(&args); SendData(&args); } } tlast = (When() - t0)/200; /* Sync up and Reset before freeing the buffers */ Sync(&args); Reset(&args); /* Free the buffers and any other module-specific resources. */ if(args.cache) FreeBuff(args.r_buff_orig, NULL); else FreeBuff(args.r_buff_orig, args.s_buff_orig); /* Do setup for no-cache mode, using two distinct buffers. */ if (!args.cache) { /* Allocate dummy pool of memory to flush cache with */ if ( (memcache = (int *)malloc(MEMSIZE)) == NULL) { perror("malloc"); exit(1); } mymemset(memcache, 0, MEMSIZE/sizeof(int)); /* Allocate large memory pools */ MyMalloc(&args, MEMSIZE+bufalign, args.soffset, args.roffset); /* Save buffer addresses */ args.s_buff_orig = args.s_buff; args.r_buff_orig = args.r_buff; /* Align buffers */ args.s_buff = AlignBuffer(args.s_buff, bufalign); args.r_buff = AlignBuffer(args.r_buff, bufalign); /* Post alignment initialization */ AfterAlignmentInit(&args); /* Initialize send buffer pointer */ /* both soffset and roffset should be zero if we don't have any offset stuff, so this should be fine */ args.s_ptr = args.s_buff+args.soffset; args.r_ptr = args.r_buff+args.roffset; } /************************** * Main loop of benchmark * **************************/ if( args.tr ) fprintf(stderr,"Now starting the main loop\n"); for ( n = 0, len = start, errFlag = 0; n < NSAMP - 3 && tlast < STOPTM && len <= end && !errFlag; len = len + inc, nq++ ) { /* Exponentially increase the block size. */ if (nq > 2) inc = ((nq % 2))? inc + inc: inc; /* This is a perturbation loop to test nearby values */ for (pert = ((perturbation > 0) && (inc > perturbation+1)) ? -perturbation : 0; pert <= perturbation; n++, pert += ((perturbation > 0) && (inc > perturbation+1)) ? perturbation : perturbation+1) { Sync(&args); /* Sync to prevent race condition in armci module */ /* Calculate how many times to repeat the experiment. */ if( args.tr ) { if (nrepeat_const) { nrepeat = nrepeat_const; /* } else if (len == start) {*/ /* nrepeat = MAX( RUNTM/( 0.000020 + start/(8*1000) ), TRIALS);*/ } else { nrepeat = MAX((RUNTM / (((double)args.bufflen / (args.bufflen - inc + 1.0)) * tlast)),TRIALS); } SendRepeat(&args, nrepeat); } else if( args.rcv ) { RecvRepeat(&args, &nrepeat); } args.bufflen = len + pert; if( args.tr ) fprintf(stderr,"%3d: %7d bytes %6d times --> ", n,args.bufflen,nrepeat); if (args.cache) /* Allow cache effects. We use only one buffer */ { /* Allocate the buffer with room for alignment*/ MyMalloc(&args, args.bufflen+bufalign, args.soffset, args.roffset); /* Save buffer address */ args.r_buff_orig = args.r_buff; args.s_buff_orig = args.r_buff; /* Align buffer */ args.r_buff = AlignBuffer(args.r_buff, bufalign); args.s_buff = args.r_buff; /* Initialize buffer with data * * NOTE: The buffers should be initialized with some sort of * valid data, whether it is actually used for anything else, * to get accurate results. Performance increases noticeably * if the buffers are left uninitialized, but this does not * give very useful results as realworld apps tend to actually * have data stored in memory. We are not sure what causes * the difference in performance at this time. */ InitBufferData(&args, args.bufflen, args.soffset, args.roffset); /* Post-alignment initialization */ AfterAlignmentInit(&args); /* Initialize buffer pointers (We use r_ptr and s_ptr for * compatibility with no-cache mode, as this makes the code * simpler) */ /* offsets are zero by default so this saves an #ifdef */ args.r_ptr = args.r_buff+args.roffset; args.s_ptr = args.r_buff+args.soffset; } else /* Eliminate cache effects. We use two distinct buffers */ { /* this isn't truly set up for offsets yet */ /* Size of an aligned memory block including trailing padding */ len_buf_align = args.bufflen; if(bufalign != 0) len_buf_align += bufalign - args.bufflen % bufalign; /* Initialize the buffers with data * * See NOTE above. */ InitBufferData(&args, MEMSIZE, args.soffset, args.roffset); /* Reset buffer pointers to beginning of pools */ args.r_ptr = args.r_buff+args.roffset; args.s_ptr = args.s_buff+args.soffset; } bwdata[n].t = LONGTIME; /* t2 = t1 = 0;*/ /* Finally, we get to transmit or receive and time */ /* NOTE: If a module is running that uses only one process (e.g. * memcpy), we assume that it will always have the args.tr flag * set. Thus we make some special allowances in the transmit * section that are not in the receive section. */ if( args.tr || args.bidir ) { /* This is the transmitter: send the block TRIALS times, and if we are not streaming, expect the receiver to return each block. */ for (i = 0; i < (integCheck ? 1 : TRIALS); i++) { if(args.preburst && asyncReceive && !streamopt) { /* We need to save the value of the recv ptr so * we can reset it after we do the preposts, in case * the module needs to use the same ptr values again * so it can wait on the last byte to change to indicate * the recv is finished. */ SaveRecvPtr(&args); for(j=0; jbufflen / sizeof(int); for(i=0; is_ptr + i ) = i; } } void VerifyIntegrity(ArgStruct *p) { int i; int num_segments; int integrityVerified = 1; num_segments = p->bufflen / sizeof(int); for(i=0; ir_ptr + i ) != i ) { integrityVerified = 0; break; } } if(!integrityVerified) { fprintf(stderr, "Integrity check failed: Expecting %d but received %d\n", i, *( (int*)p->r_ptr + i ) ); /* Dump argstruct */ /* fprintf(stderr, " args struct:\n"); fprintf(stderr, " r_buff_orig %p [%c%c%c...]\n", p->r_buff_orig, p->r_buff_orig[i], p->r_buff_orig[i+1], p->r_buff_orig[i+2]); fprintf(stderr, " r_buff %p [%c%c%c...]\n", p->r_buff, p->r_buff[i], p->r_buff[i+1], p->r_buff[i+2]); fprintf(stderr, " r_ptr %p [%c%c%c...]\n", p->r_ptr, p->r_ptr[i], p->r_ptr[i+1], p->r_ptr[i+2]); fprintf(stderr, " s_buff_orig %p [%c%c%c...]\n", p->s_buff_orig, p->s_buff_orig[i], p->s_buff_orig[i+1], p->s_buff_orig[i+2]); fprintf(stderr, " s_buff %p [%c%c%c...]\n", p->s_buff, p->s_buff[i], p->s_buff[i+1], p->s_buff[i+2]); fprintf(stderr, " s_ptr %p [%c%c%c...]\n", p->s_ptr, p->s_ptr[i], p->s_ptr[i+1], p->s_ptr[i+2]); */ exit(-1); } } void PrintUsage() { printf("\n NETPIPE USAGE \n\n"); #if ! defined(INFINIBAND) && !defined(OPENIB) && !defined(DAT) printf("a: asynchronous receive (a.k.a. preposted receive)\n"); #endif printf("B: burst all preposts before measuring performance\n"); #if (defined(TCP) || defined(TCP6)) && ! defined(INFINIBAND) && !defined(DAT) printf("b: specify TCP send/receive socket buffer sizes\n"); #endif #if defined(INFINIBAND) || defined(OPENIB) printf("c: specify type of completion <-c type>\n" " valid types: local_poll, vapi_poll, event\n" " default: local_poll\n"); #endif #if defined(DAT) printf("c: specify type of completion <-c type>\n" " valid types: local_poll, dq_poll, evd_wait, cno_wait\n" " default: local_poll\n"); #endif #if defined(MPI2) printf("g: use get instead of put\n"); printf("f: do not use fence during timing segment; may not work with\n"); printf(" all MPI-2 implementations\n"); #endif #if defined(TCP) || defined(TCP6) || defined(SCTP) || defined(SCTP6) || defined(INFINIBAND) || defined(OPENIB) || defined(DAT) printf("h: specify hostname of the receiver <-h host>\n"); #endif printf("I: Invalidate cache (measure performance without cache effects).\n" " This simulates data coming from main memory instead of cache.\n"); printf("i: Do an integrity check instead of measuring performance\n"); printf("l: lower bound start value e.g. <-l 1>\n"); #if defined(INFINIBAND) || defined(OPENIB) printf("m: set MTU for Infiniband adapter <-m mtu_size>\n"); printf(" valid sizes: 256, 512, 1024, 2048, 4096 (default 1024)\n"); #endif printf("n: Set a constant value for number of repeats <-n 50>\n"); printf("o: specify output filename <-o filename>\n"); printf("O: specify transmit and optionally receive buffer offsets <-O 1,3>\n"); printf("p: set the perturbation number <-p 1>\n" " (default = 3 Bytes, set to 0 for no perturbations)\n"); #if (defined(TCP) || defined(TCP6) || defined(SCTP) || defined(SCTP6)) && ! defined(INFINIBAND) && !defined(OPENIB) && !defined(DAT) printf("r: reset sockets for every trial\n"); #endif printf("s: stream data in one direction only.\n"); #if defined(MPI) printf("S: Use synchronous sends.\n"); #endif #if defined(INFINIBAND) || defined(OPENIB) printf("t: specify type of communications <-t type>\n" " valid types: send_recv, send_recv_with_imm,\n" " rdma_write, rdma_write_with_imm\n" " default: send_recv\n"); #endif #if defined(OPENIB) printf("D: specify an OpenFabrics device/port combination\n" " to use on the local host. For example:\n" " -D mthca0:1\n" " Uses the first port on the \"mthca0\" device\n" " (NOTE: ports are indexed from 1, not 0)\n" " -D mthca1\n" " Uses the first active port on the mtcha1 device\n" " No specification will result in using the first\n" " active port on any valid device.\n"); #endif #if defined(DAT) printf("t: specify type of communications <-t type>\n" " valid types: send_recv, rdma_write\n" " default: send_recv\n"); #endif #if defined(KNEM) printf("t: specify type of communications <-t type>\n" " valid types: copy, dma\n" " default: copy\n"); #endif #if defined(KNEM) || defined(VMSPLICE) printf("h: specify a filename to use to synchronize\n" " When run with this option, two copies of Netpipe\n" " must be invoked on the same machine with the\n" " -h argument values.\n"); #endif printf("u: upper bound stop value e.g. <-u 1048576>\n"); #if defined(MPI) printf("z: receive messages using the MPI_ANY_SOURCE flag\n"); #endif printf("2: Send data in both directions at the same time.\n"); printf("P: Set the port number to one other than the default.\n"); #if defined(MPI) printf(" May need to use -a to choose asynchronous communications for MPI/n"); #endif #if (defined(TCP) || defined(TCP6) || defined(SCTP) || defined (SCTP6)) && !defined(INFINIBAND) && !defined(OPENIB) && !defined(DAT) printf(" The maximum test size is limited by the TCP buffer size\n"); #endif #if defined(TCP) printf("A: Use SDP Address familty (AF_INET_SDP)\n"); #endif printf("\n"); } void* AlignBuffer(void* buff, int boundary) { if(boundary == 0) return buff; else /* char* typecast required for cc on IRIX */ return ((char*)buff) + (boundary - ((unsigned long)buff % boundary) ); } void AdvanceSendPtr(ArgStruct* p, int blocksize) { /* Move the send buffer pointer forward if there is room */ if(p->s_ptr + blocksize < p->s_buff + MEMSIZE - blocksize) p->s_ptr += blocksize; else /* Otherwise wrap around to the beginning of the aligned buffer */ p->s_ptr = p->s_buff; } void AdvanceRecvPtr(ArgStruct* p, int blocksize) { /* Move the send buffer pointer forward if there is room */ if(p->r_ptr + blocksize < p->r_buff + MEMSIZE - blocksize) p->r_ptr += blocksize; else /* Otherwise wrap around to the beginning of the aligned buffer */ p->r_ptr = p->r_buff; } void SaveRecvPtr(ArgStruct* p) { /* Typecast prevents warning about loss of volatile qualifier */ p->r_ptr_saved = (void*)p->r_ptr; } void ResetRecvPtr(ArgStruct* p) { p->r_ptr = p->r_ptr_saved; } /* This is generic across all modules */ void InitBufferData(ArgStruct *p, int nbytes, int soffset, int roffset) { memset(p->r_buff, 'a', nbytes+MAX(soffset,roffset)); /* If using cache mode, then we need to initialize the last byte * to the proper value since the transmitter and receiver are waiting * on different values to determine when the message has completely * arrive. */ if(p->cache) p->r_buff[(nbytes+MAX(soffset,roffset))-1] = 'a' + p->tr; /* If using no-cache mode, then we have distinct send and receive * buffers, so the send buffer starts out containing different values * from the receive buffer */ else memset(p->s_buff, 'b', nbytes+soffset); } #if !defined(OPENIB) && !defined(INFINIBAND) && !defined(DAT) && !defined(ARMCI) && !defined(LAPI) && !defined(GPSHMEM) && !defined(SHMEM) && !defined(GM) void MyMalloc(ArgStruct *p, int bufflen, int soffset, int roffset) { if((p->r_buff=(char *)malloc(bufflen+MAX(soffset,roffset)))==(char *)NULL) { fprintf(stderr,"couldn't allocate memory for receive buffer\n"); exit(-1); } /* if pcache==1, use cache, so this line happens only if flushing cache */ if(!p->cache) /* Allocate second buffer if limiting cache */ if((p->s_buff=(char *)malloc(bufflen+soffset))==(char *)NULL) { fprintf(stderr,"couldn't allocate memory for send buffer\n"); exit(-1); } } void FreeBuff(char *buff1, char *buff2) { if(buff1 != NULL) free(buff1); if(buff2 != NULL) free(buff2); } #endif NetPIPE-3.7.2/src/netpipe.h0000644000000000000000000003332211433312522015474 0ustar00usergroup00000000000000#define FINAL #undef FINAL /*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* * netpipe.h ---- General include file */ /*****************************************************************************/ #include #include #include #include #include #include #include /* struct timeval */ #include /* getrusage() */ #include /* malloc(3) */ #include /* getopt, read, write, ... */ /* Handle the case of building on MacOS X */ #if defined(__APPLE__) #include #endif #ifdef INFINIBAND #include /* ib_mtu_t */ #endif #ifdef OPENIB #include /* enum ibv_mtu */ #endif #ifdef FINAL #define TRIALS 7 #define RUNTM 0.25 #else #define TRIALS 3 #define RUNTM 0.10 #endif #define MEMSIZE 10000000 #define DEFPORT 5002 #define NSAMP 8000 #define DEFPERT 3 #define LONGTIME 1e99 #define CHARSIZE 8 #define STOPTM 1.0 #define MAXINT 10000000 /*#define MAXINT 1048576*/ #define ABS(x) (((x) < 0)?(-(x)):(x)) #define MIN(x,y) (((x) < (y))?(x):(y)) #define MAX(x,y) (((x) > (y))?(x):(y)) /* Need to include the protocol structure header file. */ /* Change this to reflect the protocol */ #if defined(TCP) #include #include #include #include #include typedef struct protocolstruct ProtocolStruct; struct protocolstruct { struct sockaddr_in sin1, /* socket structure #1 */ sin2; /* socket structure #2 */ int nodelay; /* Flag for TCP nodelay */ struct hostent *addr; /* Address of host */ int sndbufsz, /* Size of TCP send buffer */ rcvbufsz; /* Size of TCP receive buffer */ #if defined(INFINIBAND) IB_mtu_t ib_mtu; /* MTU Size for Infiniband HCA */ int commtype; /* Communications type */ int comptype; /* Completion type */ #endif #if defined(OPENIB) enum ibv_mtu ib_mtu; /* MTU Size for Infiniband HCA */ int commtype; /* Communications type */ int comptype; /* Completion type */ char *device_and_port; /* Local port specification */ #endif #if defined(DAT) int commtype; /* Communications type */ int comptype; /* Completion type */ #endif }; #if defined(INFINIBAND) || defined(OPENIB) enum completion_types { NP_COMP_LOCALPOLL, /* Poll locally on last byte of data */ NP_COMP_VAPIPOLL, /* Poll using vapi function */ NP_COMP_EVENT /* Don't poll, use vapi event completion */ }; enum communication_types { NP_COMM_SENDRECV, /* Communication with send/receive */ NP_COMM_SENDRECV_WITH_IMM, /* Communication with send/receive & imm data */ NP_COMM_RDMAWRITE, /* Communication with rdma write */ NP_COMM_RDMAWRITE_WITH_IMM, /* Communication with rdma write & imm data */ }; #endif #if defined(DAT) enum completion_types { NP_COMP_LOCALPOLL, /* Poll locally on last byte of data */ NP_COMP_DQPOLL, /* Poll using uDAPL dequeue function */ NP_COMP_EVD, /* Don't poll, use uDAPL EVD wait */ NP_COMP_CNO /* Don't poll, use uDAPL CNO wait */ }; enum communication_types { NP_COMM_SENDRECV, /* Communication with send/receive */ NP_COMM_RDMAWRITE, /* Communication with rdma write */ }; #endif #elif defined(SCTP6) #include #include #include #include #include typedef struct protocolstruct ProtocolStruct; struct protocolstruct { struct sockaddr_in6 sin1; /* socket structure #1 */ struct sockaddr_in6 sin2; /* socket structure #2 */ int nodelay; /* Flag for TCP nodelay */ struct hostent *addr; /* Address of host */ int sndbufsz; /* Size of TCP send buffer */ int rcvbufsz; /* Size of TCP receive buffer */ }; #elif defined(SCTP) #include #include #include #include #include typedef struct protocolstruct ProtocolStruct; struct protocolstruct { struct sockaddr_in sin1, /* socket structure #1 */ sin2; /* socket structure #2 */ int nodelay; /* Flag for TCP nodelay */ struct hostent *addr; /* Address of host */ int sndbufsz, /* Size of TCP send buffer */ rcvbufsz; /* Size of TCP receive buffer */ }; #elif defined(TCP6) #include #include #include #include #include typedef struct protocolstruct ProtocolStruct; struct protocolstruct { struct sockaddr_in6 sin1; /* socket structure #1 */ struct sockaddr_in6 sin2; /* socket structure #2 */ int nodelay; /* Flag for TCP nodelay */ struct hostent *addr; /* Address of host */ int sndbufsz; /* Size of TCP send buffer */ int rcvbufsz; /* Size of TCP receive buffer */ }; #elif defined(IPX) #include #include #include typedef struct protocolstruct ProtocolStruct; struct protocolstruct { struct sockaddr_ipx sipx1; /* socket structure #1 */ struct sockaddr_ipx sipx2; /* socket structure #2 */ int sndbufsz; /* Size of send buffer */ int rcvbufsz; /* Size of receive buffer */ }; #elif defined(MPI) typedef struct protocolstruct ProtocolStruct; struct protocolstruct { int nbor, iproc; int use_get; int no_fence; }; #elif defined(PVM) typedef struct protocolstruct ProtocolStruct; struct protocolstruct { int mytid; /* Keep track of our task id */ int othertid; /* Keep track of the other's task id */ }; /* Choose one of the following to determine the type of data encoding for the PVM message passing. DataDefault means that PVM uses XDR encoding which ensures that the data can be packed / unpacked across non-homogeneous machines. If you know that the machines are the same, then you can use DataRaw and save some time (DDT - does not seem to help). DataInPlace means that the data is not copied at pack time, but is copied directly from memory at send time (DDT - this helps a lot). #define PVMDATA PvmDataDefault #define PVMDATA PvmDataRaw #define PVMDATA PvmDataInPlace */ #define PVMDATA PvmDataInPlace #elif defined(TCGMSG) typedef struct protocolstruct ProtocolStruct; struct protocolstruct { long nbor, nid; }; #elif defined(LAPI) typedef struct protocolstruct ProtocolStruct; struct protocolstruct { int nbor; }; #elif defined(SHMEM) #if defined(GPSHMEM) #include "gpshmem.h" #else #include #endif typedef struct protocolstruct ProtocolStruct; struct protocolstruct { int nbor,ipe; volatile int *flag; }; #elif defined(ARMCI) /* basically same as for GPSHMEM */ double *pTime; int *pNrepeat; typedef struct protocolstruct ProtocolStruct; struct protocolstruct { int nbor,ipe; volatile int *flag; }; #elif defined(MX) #include "myriexpress.h" typedef struct protocolstruct ProtocolStruct; struct protocolstruct { mx_endpoint_t ep; mx_endpoint_addr_t addr; mx_request_t rreq; }; #elif defined(GM) #include "gm.h" typedef struct protocolstruct ProtocolStruct; struct protocolstruct { int nbor, iproc, num_stokens; unsigned short host_id; /* Host id in routing info of myrinet card */ }; struct gm_port *gm_p; unsigned long *ltime, *lrpt; char *sync, *sync1; #elif defined(ATOLL) #include typedef struct protocolstruct ProtocolStruct; struct protocolstruct { port_id id_self, /* My port id */ id_nbor; /* My neighbor's port id */ } #elif defined(MEMCPY) || defined(VMSPLICE) typedef struct protocolstruct ProtocolStruct; struct protocolstruct { int nothing; }; #elif defined(KNEM) #include "knem_io.h" typedef struct protocolstruct ProtocolStruct; struct protocolstruct { int flags; char *shared_filename; }; #elif defined(DISK) typedef struct protocolstruct ProtocolStruct; struct protocolstruct { char *dfile_name; int read; char read_type; /* c-char d-double s-stream */ }; #else #error "One of TCP, TCP6, SCTP, SCTP6, IPX, MPI, PVM, TCGMSG, LAPI, SHMEM, MX, GM, ATOLL, MEMCPY, DISK, VMSPLICE, or KNEM must be defined during compilation" #endif typedef struct argstruct ArgStruct; struct argstruct { /* This is the common information that is needed for all tests */ int cache; /* Cache flag, 0 => limit cache, 1=> use cache */ char *host; /* Name of receiving host */ int servicefd, /* File descriptor of the network socket */ commfd; /* Communication file descriptor */ short port; /* Port used for connection */ char *r_buff; /* Aligned receive buffer */ char *r_buff_orig; /* Original unaligned receive buffer */ #if defined(USE_VOLATILE_RPTR) volatile /* use volatile if polling on buffer in module */ #endif char *r_ptr; /* Pointer to current location in send buffer */ char *r_ptr_saved; /* Pointer for saving value of r_ptr */ char *s_buff; /* Aligned send buffer */ char *s_buff_orig; /* Original unaligned send buffer */ char *s_ptr; /* Pointer to current location in send buffer */ int bufflen, /* Length of transmitted buffer */ upper, /* Upper limit to bufflen */ tr,rcv, /* Transmit and Recv flags, or maybe neither */ bidir, /* Bi-directional flag */ nbuff; /* Number of buffers to transmit */ int source_node; /* Set to -1 (MPI_ANY_SOURCE) if -z specified */ int preburst; /* Burst preposted receives before timed runs */ int reset_conn; /* Reset connection flag */ int soffset,roffset; int syncflag; /* flag for using sync sends vs. normal sends in MPI mod*/ int use_sdp; /* Use AF_INET_SDP instead of AF_INET */ /* Now we work with a union of information for protocol dependent stuff */ ProtocolStruct prot; }; typedef struct data Data; struct data { double t; double bps; double variance; int bits; int repeat; }; double When(); void Init(ArgStruct *p, int* argc, char*** argv); void Setup(ArgStruct *p); void establish(ArgStruct *p); void Sync(ArgStruct *p); void PrepareToReceive(ArgStruct *p); void SendData(ArgStruct *p); void RecvData(ArgStruct *p); void SendTime(ArgStruct *p, double *t); void RecvTime(ArgStruct *p, double *t); void SendRepeat(ArgStruct *p, int rpt); void RecvRepeat(ArgStruct *p, int *rpt); void FreeBuff(char *buff1, char *buff2); void CleanUp(ArgStruct *p); void InitBufferData(ArgStruct *p, int nbytes, int soffset, int roffset); void MyMalloc(ArgStruct *p, int bufflen, int soffset, int roffset); void Reset(ArgStruct *p); void mymemset(int *ptr, int c, int n); void flushcache(int *ptr, int n); void SetIntegrityData(ArgStruct *p); void VerifyIntegrity(ArgStruct *p); void* AlignBuffer(void* buff, int boundary); void AdvanceSendPtr(ArgStruct* p, int blocksize); void AdvanceRecvPtr(ArgStruct* p, int blocksize); void SaveRecvPtr(ArgStruct* p); void ResetRecvPtr(ArgStruct* p); void PrintUsage(); int getopt( int argc, char * const argv[], const char *optstring); void AfterAlignmentInit( ArgStruct *p ); NetPIPE-3.7.2/src/pvm.c0000644000000000000000000001753011433312522014630 0ustar00usergroup00000000000000/*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* * pvm.c ---- PVM calls source */ /*****************************************************************************/ #include "netpipe.h" #include #ifndef lint static const char rcsid[] = "$Id: pvm.c,v 1.7 2003/12/10 00:52:25 turner Exp $"; #endif /**********************************************************************/ /* Initialialization that needs to occur before */ /* command args are parsed */ /**********************************************************************/ void Init(ArgStruct *p, int* pargc, char*** pargv) { p->tr = 0; /* The transmitter will be set using the -h host flag. */ p->rcv = 1; } /**********************************************************************/ /* Set up the communcations system. */ /* In pvm, this means to join the parallel machine */ /**********************************************************************/ void Setup(ArgStruct *p) { p->prot.mytid = pvm_mytid(); #ifdef DEBUG printf("My task id is %d \n",p->prot.mytid); #endif establish(p); } /**********************************************************************/ /* Establish a link with the other processor */ /* In pvm, this means to send a simple message, but to keep the */ /* communication line open. Since the assumption is that we are */ /* starting it by hand on the other machine, we don't know what */ /* the other task id is. */ /**********************************************************************/ void establish(ArgStruct *p) { /* Task information for the entire parallel machine (if trans) */ int tasks_status; struct pvmtaskinfo *taskp; int ntasks; /* Received buffer (if receiver) */ int buffer_id; /* If we are the transmitting side, go find the other one and send it a message containing our tid. If we are the receiving side, just wait for a message. */ if ( p->tr ) { #ifdef DEBUG printf("this is the transmitter\n"); #endif tasks_status = pvm_tasks( 0, &ntasks, &taskp ); if ( ntasks != 2 ) { printf("Error, too many processes in parallel machine \n"); printf("Start a clean machine. n=%d\n", ntasks); exit(-1); } /* Since there are two tasks, one is ours the other is the receiver */ p->prot.othertid = -1; if ( taskp[0].ti_tid == p->prot.mytid ) { p->prot.othertid = taskp[1].ti_tid; } if ( taskp[1].ti_tid == p->prot.mytid ) { p->prot.othertid = taskp[0].ti_tid; } if ( p->prot.othertid == -1 ) { printf("Error, cannot find other (receiving) task \n"); printf("Id's: %d %d \n",taskp[0].ti_tid,taskp[1].ti_tid); } /* Send the receiver a message. Tell pvm to keep the channel open */ #ifdef DEBUG printf("The receiver tid is %d \n",p->prot.othertid); #endif /* PVMDATA is defined in netpipe.h, choose wisely (PvmDataInPlace) * Also use PvmRouteDirect, otherwise the data goes through the * pvmd daemons which kills performance. */ pvm_setopt( PvmRoute, PvmRouteDirect ); pvm_initsend( PVMDATA ); pvm_pkint( &p->prot.mytid, 1, 1 ); pvm_send( p->prot.othertid, 1 ); } else { #ifdef DEBUG printf("This is the receiver \n"); #endif /* Receive any message from any task */ buffer_id = pvm_recv(-1, -1); if ( buffer_id < 0 ) { printf("Error on receive in receiver\n"); exit(-1); } pvm_upkint( &p->prot.othertid, 1, 1 ); } } /**********************************************************************/ /* Prepare to receive */ /* In pvm, you cannot set up a reception buffer ahead of time */ /**********************************************************************/ void PrepareToReceive(ArgStruct *p) { } /**********************************************************************/ /* Synchronize */ /* In pvm, this is not necessary */ /**********************************************************************/ void Sync(ArgStruct *p) { } /**********************************************************************/ /* Send a buffer full of information */ /* In pvm, we use pvm_pkbyte and then send it. */ /**********************************************************************/ void SendData(ArgStruct *p) { #ifdef DEBUG printf(" In send \n"); #endif pvm_initsend( PVMDATA ); pvm_pkbyte( p->s_ptr, p->bufflen, 1 ); pvm_send( p->prot.othertid, 1 ); #ifdef DEBUG printf(" message sent. Size=%d\n",p->bufflen); #endif } /**********************************************************************/ /* Receive a buffer full of information */ /**********************************************************************/ void RecvData(ArgStruct *p) { #ifdef DEBUG printf(" In receive \n"); #endif pvm_recv( -1, -1); pvm_upkbyte( p->r_ptr, p->bufflen, 1); #ifdef DEBUG printf(" message received . Size=%d \n", p->bufflen); #endif } /**********************************************************************/ /* Send elapsed time to the other process */ /**********************************************************************/ void SendTime(ArgStruct *p, double *t) { pvm_initsend( PVMDATA ); pvm_pkdouble( t, 1, 1 ); pvm_send( p->prot.othertid, 1); } /**********************************************************************/ /* Receive elapsed time from the other process */ /**********************************************************************/ void RecvTime(ArgStruct *p, double *t) { pvm_recv(-1, -1); pvm_upkdouble( t, 1, 1 ); } /**********************************************************************/ /* Send repeat count to the other process */ /**********************************************************************/ void SendRepeat(ArgStruct *p, int rpt) { pvm_initsend( PVMDATA ); pvm_pkint( &rpt, 1, 1 ); pvm_send( p->prot.othertid, 1); } /**********************************************************************/ /* Receiver repeat count from other process */ /**********************************************************************/ void RecvRepeat(ArgStruct *p, int *rpt) { pvm_recv(-1, -1); pvm_upkint( rpt, 1, 1 ); } /**********************************************************************/ /* Close down the connection. /**********************************************************************/ void CleanUp(ArgStruct *p) { } void Reset(ArgStruct *p) { } void AfterAlignmentInit(ArgStruct *p) { } NetPIPE-3.7.2/src/sctp.c0000644000000000000000000002601711433312522014777 0ustar00usergroup00000000000000/*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* * sctp.c ---- SCTP calls source */ /*****************************************************************************/ #include "netpipe.h" #if defined (MPLITE) #include "mplite.h" #endif int doing_reset = 0; void Init(ArgStruct *p, int* pargc, char*** pargv) { p->reset_conn = 0; /* Default to not resetting connection */ p->prot.sndbufsz = p->prot.rcvbufsz = 0; p->tr = 0; /* The transmitter will be set using the -h host flag. */ p->rcv = 1; } void Setup(ArgStruct *p) { int one = 1; int sockfd; struct sockaddr_in *lsin1, *lsin2; /* ptr to sockaddr_in in ArgStruct */ char *host; struct hostent *addr; struct protoent *proto; int send_size, recv_size, sizeofint = sizeof(int); host = p->host; /* copy ptr to hostname */ lsin1 = &(p->prot.sin1); lsin2 = &(p->prot.sin2); bzero((char *) lsin1, sizeof(*lsin1)); bzero((char *) lsin2, sizeof(*lsin2)); if ( (sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP)) < 0){ printf("NetPIPE: can't open stream socket! errno=%d\n", errno); exit(-4); } if(!(proto = getprotobyname("sctp"))){ printf("NetPIPE: protocol 'sctp' unknown!\n"); exit(555); } /* Attempt to set SCTP_NODELAY */ if(setsockopt(sockfd, proto->p_proto, SCTP_NODELAY, &one, sizeof(one)) < 0) { printf("NetPIPE: setsockopt: SCTP_NODELAY failed! errno=%d\n", errno); exit(556); } /* If requested, set the send and receive buffer sizes */ if(p->prot.sndbufsz > 0) { if(setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &(p->prot.sndbufsz), sizeof(p->prot.sndbufsz)) < 0) { printf("NetPIPE: setsockopt: SO_SNDBUF failed! errno=%d\n", errno); printf("You may have asked for a buffer larger than the system can handle\n"); exit(556); } if(setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &(p->prot.rcvbufsz), sizeof(p->prot.rcvbufsz)) < 0) { printf("NetPIPE: setsockopt: SO_RCVBUF failed! errno=%d\n", errno); printf("You may have asked for a buffer larger than the system can handle\n"); exit(556); } } getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (char *) &send_size, (void *) &sizeofint); getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (char *) &recv_size, (void *) &sizeofint); if(!doing_reset) { fprintf(stderr,"Send and receive buffers are %d and %d bytes\n", send_size, recv_size); fprintf(stderr, "(A bug in Linux doubles the requested buffer sizes)\n"); } if( p->tr ) { /* Primary transmitter */ if (atoi(host) > 0) { /* Numerical IP address */ lsin1->sin_family = AF_INET; lsin1->sin_addr.s_addr = inet_addr(host); } else { if ((addr = gethostbyname(host)) == NULL){ printf("NetPIPE: invalid hostname '%s'\n", host); exit(-5); } lsin1->sin_family = addr->h_addrtype; bcopy(addr->h_addr, (char*) &(lsin1->sin_addr.s_addr), addr->h_length); } lsin1->sin_port = htons(p->port); p->commfd = sockfd; } else if( p->rcv ) { /* we are the receiver */ bzero((char *) lsin1, sizeof(*lsin1)); lsin1->sin_family = AF_INET; lsin1->sin_addr.s_addr = htonl(INADDR_ANY); lsin1->sin_port = htons(p->port); if (bind(sockfd, (struct sockaddr *) lsin1, sizeof(*lsin1)) < 0){ printf("NetPIPE: server: bind on local address failed! errno=%d", errno); exit(-6); } p->servicefd = sockfd; } p->upper = send_size + recv_size; establish(p); /* Establish connections */ } static int readFully(int fd, void *obuf, int len) { int bytesLeft = len; char *buf = (char *) obuf; int bytesRead = 0; while (bytesLeft > 0 && (bytesRead = read(fd, (void *) buf, bytesLeft)) > 0) { bytesLeft -= bytesRead; buf += bytesRead; } if (bytesRead <= 0) return bytesRead; return len; } void Sync(ArgStruct *p) { char s[] = "SyncMe", response[] = " "; if (write(p->commfd, s, strlen(s)) < 0 || /* Write to nbor */ readFully(p->commfd, response, strlen(s)) < 0) /* Read from nbor */ { perror("NetPIPE: error writing or reading synchronization string"); exit(3); } if (strncmp(s, response, strlen(s))) { fprintf(stderr, "NetPIPE: Synchronization string incorrect! |%s|\n", response); exit(3); } } void PrepareToReceive(ArgStruct *p) { /* The Berkeley sockets interface doesn't have a method to pre-post a buffer for reception of data. */ } void SendData(ArgStruct *p) { int bytesWritten, bytesLeft; char *q; bytesLeft = p->bufflen; bytesWritten = 0; q = p->s_ptr; while (bytesLeft > 0 && (bytesWritten = write(p->commfd, q, bytesLeft)) > 0) { bytesLeft -= bytesWritten; q += bytesWritten; } if (bytesWritten == -1) { printf("NetPIPE: write: error encountered, errno=%d\n", errno); exit(401); } } void RecvData(ArgStruct *p) { int bytesLeft; int bytesRead; char *q; bytesLeft = p->bufflen; bytesRead = 0; q = p->r_ptr; while (bytesLeft > 0 && (bytesRead = read(p->commfd, q, bytesLeft)) > 0) { bytesLeft -= bytesRead; q += bytesRead; } if (bytesLeft > 0 && bytesRead == 0) { printf("NetPIPE: \"end of file\" encountered on reading from socket\n"); } else if (bytesRead == -1) { printf("NetPIPE: read: error encountered, errno=%d\n", errno); exit(401); } } /* uint32_t is used to insure that the integer size is the same even in tests * between 64-bit and 32-bit architectures. */ void SendTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; /* Multiply the number of seconds by 1e8 to get time in 0.01 microseconds and convert value to an unsigned 32-bit integer. */ ltime = (uint32_t)(*t * 1.e8); /* Send time in network order */ ntime = htonl(ltime); if (write(p->commfd, (char *)&ntime, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendTime: errno=%d\n", errno); exit(301); } } void RecvTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; int bytesRead; bytesRead = readFully(p->commfd, (void *)&ntime, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvTime: errno=%d\n", errno); exit(302); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvTime of %d bytes\n", bytesRead); exit(303); } ltime = ntohl(ntime); /* Result is ltime (in microseconds) divided by 1.0e8 to get seconds */ *t = (double)ltime / 1.0e8; } void SendRepeat(ArgStruct *p, int rpt) { uint32_t lrpt, nrpt; lrpt = rpt; /* Send repeat count as a long in network order */ nrpt = htonl(lrpt); if (write(p->commfd, (void *) &nrpt, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendRepeat: errno=%d\n", errno); exit(304); } } void RecvRepeat(ArgStruct *p, int *rpt) { uint32_t lrpt, nrpt; int bytesRead; bytesRead = readFully(p->commfd, (void *)&nrpt, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvRepeat: errno=%d\n", errno); exit(305); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvRepeat of %d bytes\n", bytesRead); exit(306); } lrpt = ntohl(nrpt); *rpt = lrpt; } void establish(ArgStruct *p) { int one = 1; socklen_t clen; struct protoent *proto; clen = (socklen_t) sizeof(p->prot.sin2); if( p->tr ){ while( connect(p->commfd, (struct sockaddr *) &(p->prot.sin1), sizeof(p->prot.sin1)) < 0 ) { /* If we are doing a reset and we get a connection refused from * the connect() call, assume that the other node has not yet * gotten to its corresponding accept() call and keep trying until * we have success. */ if(!doing_reset || errno != ECONNREFUSED) { printf("Client: Cannot Connect! errno=%d\n",errno); exit(-10); } } } else if( p->rcv ) { /* SERVER */ listen(p->servicefd, 5); p->commfd = accept(p->servicefd, (struct sockaddr *) &(p->prot.sin2), &clen); if(p->commfd < 0){ printf("Server: Accept Failed! errno=%d\n",errno); exit(-12); } /* Attempt to set SCTP_NODELAY. SCTP_NODELAY may or may not be propagated to accepted sockets. */ if(!(proto = getprotobyname("sctp"))){ printf("unknown protocol!\n"); exit(555); } if(setsockopt(p->commfd, proto->p_proto, SCTP_NODELAY, &one, sizeof(one)) < 0) { printf("setsockopt: SCTP_NODELAY failed! errno=%d\n", errno); exit(556); } /* If requested, set the send and receive buffer sizes */ if(p->prot.sndbufsz > 0) { /* printf("Send and Receive Buffers on accepted socket set to %d bytes\n",*/ /* p->prot.sndbufsz);*/ if(setsockopt(p->commfd, SOL_SOCKET, SO_SNDBUF, &(p->prot.sndbufsz), sizeof(p->prot.sndbufsz)) < 0) { printf("setsockopt: SO_SNDBUF failed! errno=%d\n", errno); exit(556); } if(setsockopt(p->commfd, SOL_SOCKET, SO_RCVBUF, &(p->prot.rcvbufsz), sizeof(p->prot.rcvbufsz)) < 0) { printf("setsockopt: SO_RCVBUF failed! errno=%d\n", errno); exit(556); } } } } void CleanUp(ArgStruct *p) { char *quit="QUIT"; if (p->tr) { write(p->commfd,quit, 5); read(p->commfd, quit, 5); close(p->commfd); } else if( p->rcv ) { read(p->commfd,quit, 5); write(p->commfd,quit,5); close(p->commfd); close(p->servicefd); } } void Reset(ArgStruct *p) { /* Reset sockets */ if(p->reset_conn) { doing_reset = 1; /* Close the sockets */ CleanUp(p); /* Now open and connect new sockets */ Setup(p); } } void AfterAlignmentInit(ArgStruct *p) { } NetPIPE-3.7.2/src/sctp6.c0000644000000000000000000002563011433312522015065 0ustar00usergroup00000000000000/*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* * sctp6.c ---- SCTP over IPv6 calls source */ /*****************************************************************************/ #include "netpipe.h" #if defined (MPLITE) #include "mplite.h" #endif int doing_reset = 0; void Init(ArgStruct *p, int* pargc, char*** pargv) { p->reset_conn = 0; /* Default to not resetting connection */ p->prot.sndbufsz = p->prot.rcvbufsz = 0; p->tr = 0; /* The transmitter will be set using the -h host flag. */ p->rcv = 1; } void Setup(ArgStruct *p) { int one = 1; int sockfd; struct sockaddr_in6 *lsin1, *lsin2; /* ptr to sockaddr_in6 in ArgStruct */ char *host; struct hostent *hp; struct protoent *proto; int send_size, recv_size, sizeofint = sizeof(int); host = p->host; /* copy ptr to hostname */ lsin1 = &(p->prot.sin1); lsin2 = &(p->prot.sin2); bzero((char *) lsin1, sizeof(*lsin1)); bzero((char *) lsin2, sizeof(*lsin2)); if ( (sockfd = socket(AF_INET6, SOCK_STREAM, IPPROTO_SCTP)) < 0){ printf("NetPIPE: can't open stream socket! errno=%d\n", errno); exit(-4); } if(!(proto = getprotobyname("sctp"))){ printf("NetPIPE: protocol 'sctp' unknown!\n"); exit(555); } /* Attempt to set SCTP_NODELAY */ if(setsockopt(sockfd, proto->p_proto, SCTP_NODELAY, &one, sizeof(one)) < 0) { printf("NetPIPE: setsockopt: SCTP_NODELAY failed! errno=%d\n", errno); exit(556); } /* If requested, set the send and receive buffer sizes */ if(p->prot.sndbufsz > 0) { if(setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &(p->prot.sndbufsz), sizeof(p->prot.sndbufsz)) < 0) { printf("NetPIPE: setsockopt: SO_SNDBUF failed! errno=%d\n", errno); printf("You may have asked for a buffer larger than the system"); printf("can handle\n"); exit(556); } if(setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &(p->prot.rcvbufsz), sizeof(p->prot.rcvbufsz)) < 0) { printf("NetPIPE: setsockopt: SO_RCVBUF failed! errno=%d\n", errno); printf("You may have asked for a buffer larger than the system"); printf("can handle\n"); exit(556); } } getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (char *) &send_size, (void *) &sizeofint); getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (char *) &recv_size, (void *) &sizeofint); if(!doing_reset) { fprintf(stderr,"Send and receive buffers are %d and %d bytes\n", send_size, recv_size); fprintf(stderr, "(A bug in Linux doubles the requested buffer sizes)\n"); } if( p->tr ) { /* Primary transmitter */ lsin1->sin6_family = AF_INET6; /* First attempt to convert the string to an IPv6 */ /* address. */ /* If the user supplied a real host name this will fail and */ /* we'll then do a name lookup. */ if (inet_pton(AF_INET6, host, &lsin1->sin6_addr) == 0) { if ((hp = gethostbyname2(host, AF_INET6)) == NULL) { printf("NetPIPE: invalid hostname '%s'\n", host); exit(-5); } if (hp->h_addrtype != AF_INET6) { printf("NetPIPE: invalid hostname '%s'\n", host); exit(-5); } bcopy(hp->h_addr, (char*) &(lsin1->sin6_addr), hp->h_length); } lsin1->sin6_port = htons(p->port); p->commfd = sockfd; } else if( p->rcv ) { /* we are the receiver */ bzero((char *) lsin1, sizeof(*lsin1)); lsin1->sin6_family = AF_INET6; lsin1->sin6_len = sizeof(*lsin1); lsin1->sin6_port = htons(p->port); /* Setting this to all 0 is the "ANY" address. */ bzero(&lsin1->sin6_addr, sizeof(lsin1->sin6_addr)); if (bind(sockfd, (struct sockaddr *) lsin1, sizeof(*lsin1)) < 0){ printf("NetPIPE: server: bind on local address failed! errno=%d", errno); exit(-6); } p->servicefd = sockfd; } p->upper = send_size + recv_size; establish(p); /* Establish connections */ } static int readFully(int fd, void *obuf, int len) { int bytesLeft = len; char *buf = (char *) obuf; int bytesRead = 0; while (bytesLeft > 0 && (bytesRead = read(fd, (void *) buf, bytesLeft)) > 0) { bytesLeft -= bytesRead; buf += bytesRead; } if (bytesRead <= 0) return bytesRead; return len; } void Sync(ArgStruct *p) { char s[] = "SyncMe", response[] = " "; if (write(p->commfd, s, strlen(s)) < 0 || /* Write to nbor */ readFully(p->commfd, response, strlen(s)) < 0) /* Read from nbor */ { perror("NetPIPE: error writing or reading synchronization string"); exit(3); } if (strncmp(s, response, strlen(s))) { fprintf(stderr, "NetPIPE: Synchronization string incorrect! |%s|\n", response); exit(3); } } void PrepareToReceive(ArgStruct *p) { /* The Berkeley sockets interface doesn't have a method to pre-post a buffer for reception of data. */ } void SendData(ArgStruct *p) { int bytesWritten, bytesLeft; char *q; bytesLeft = p->bufflen; bytesWritten = 0; q = p->s_ptr; while (bytesLeft > 0 && (bytesWritten = write(p->commfd, q, bytesLeft)) > 0) { bytesLeft -= bytesWritten; q += bytesWritten; } if (bytesWritten == -1) { printf("NetPIPE: write: error encountered, errno=%d\n", errno); exit(401); } } void RecvData(ArgStruct *p) { int bytesLeft; int bytesRead; char *q; bytesLeft = p->bufflen; bytesRead = 0; q = p->r_ptr; while (bytesLeft > 0 && (bytesRead = read(p->commfd, q, bytesLeft)) > 0) { bytesLeft -= bytesRead; q += bytesRead; } if (bytesLeft > 0 && bytesRead == 0) { printf("NetPIPE: \"end of file\" encountered reading from socket\n"); } else if (bytesRead == -1) { printf("NetPIPE: read: error encountered, errno=%d\n", errno); exit(401); } } /* uint32_t is used to insure that the integer size is the same even in tests * between 64-bit and 32-bit architectures. */ void SendTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; /* Multiply the number of seconds by 1e8 to get time in 0.01 microseconds and convert value to an unsigned 32-bit integer. */ ltime = (uint32_t)(*t * 1.e8); /* Send time in network order */ ntime = htonl(ltime); if (write(p->commfd, (char *)&ntime, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendTime: errno=%d\n", errno); exit(301); } } void RecvTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; int bytesRead; bytesRead = readFully(p->commfd, (void *)&ntime, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvTime: errno=%d\n", errno); exit(302); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvTime of %d bytes\n", bytesRead); exit(303); } ltime = ntohl(ntime); /* Result is ltime (in microseconds) divided by 1.0e8 to get seconds */ *t = (double)ltime / 1.0e8; } void SendRepeat(ArgStruct *p, int rpt) { uint32_t lrpt, nrpt; lrpt = rpt; /* Send repeat count as a long in network order */ nrpt = htonl(lrpt); if (write(p->commfd, (void *) &nrpt, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendRepeat: errno=%d\n", errno); exit(304); } } void RecvRepeat(ArgStruct *p, int *rpt) { uint32_t lrpt, nrpt; int bytesRead; bytesRead = readFully(p->commfd, (void *)&nrpt, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvRepeat: errno=%d\n", errno); exit(305); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvRepeat of %d bytes\n", bytesRead); exit(306); } lrpt = ntohl(nrpt); *rpt = lrpt; } void establish(ArgStruct *p) { int one = 1; socklen_t clen; struct protoent *proto; clen = (socklen_t) sizeof(p->prot.sin2); if( p->tr ){ while( connect(p->commfd, (struct sockaddr *) &(p->prot.sin1), sizeof(p->prot.sin1)) < 0 ) { /* If we are doing a reset and we get a connection refused from * the connect() call, assume that the other node has not yet * gotten to its corresponding accept() call and keep trying until * we have success. */ if(!doing_reset || errno != ECONNREFUSED) { printf("Client: Cannot Connect! errno=%d\n",errno); exit(-10); } } } else if( p->rcv ) { /* SERVER */ listen(p->servicefd, 5); p->commfd = accept(p->servicefd, (struct sockaddr *) &(p->prot.sin2), &clen); if(p->commfd < 0){ printf("Server: Accept Failed! errno=%d\n",errno); exit(-12); } /* * Attempt to set SCTP_NODELAY. SCTP_NODELAY may or may not be * propagated to accepted sockets. */ if(!(proto = getprotobyname("sctp"))){ printf("unknown protocol!\n"); exit(555); } if(setsockopt(p->commfd, proto->p_proto, SCTP_NODELAY, &one, sizeof(one)) < 0) { printf("setsockopt: SCTP_NODELAY failed! errno=%d\n", errno); exit(556); } /* If requested, set the send and receive buffer sizes */ if(p->prot.sndbufsz > 0) { if(setsockopt(p->commfd, SOL_SOCKET, SO_SNDBUF, &(p->prot.sndbufsz), sizeof(p->prot.sndbufsz)) < 0) { printf("setsockopt: SO_SNDBUF failed! errno=%d\n", errno); exit(556); } if(setsockopt(p->commfd, SOL_SOCKET, SO_RCVBUF, &(p->prot.rcvbufsz), sizeof(p->prot.rcvbufsz)) < 0) { printf("setsockopt: SO_RCVBUF failed! errno=%d\n", errno); exit(556); } } } } void CleanUp(ArgStruct *p) { char *quit="QUIT"; if (p->tr) { write(p->commfd,quit, 5); read(p->commfd, quit, 5); close(p->commfd); } else if( p->rcv ) { read(p->commfd,quit, 5); write(p->commfd,quit,5); close(p->commfd); close(p->servicefd); } } void Reset(ArgStruct *p) { /* Reset sockets */ if(p->reset_conn) { doing_reset = 1; /* Close the sockets */ CleanUp(p); /* Now open and connect new sockets */ Setup(p); } } void AfterAlignmentInit(ArgStruct *p) { } NetPIPE-3.7.2/src/shmem.c0000644000000000000000000000552311433312522015136 0ustar00usergroup00000000000000/* NOTE: Anywhere a sched_yield() is called, previously there was a busy * polling wait on the byte or flag, which caused horrible performance on the * machine I tested on (helix). sched_yield() seemed to fix this issue. */ #include "netpipe.h" double *pTime; int *pNrepeat; void Init(ArgStruct *p, int* pargc, char*** pargv) { } void Setup(ArgStruct *p) { int npes; start_pes(2); if((npes=shmem_n_pes())!=2) { printf("Error Message: Run with npes set to 2\n"); exit(1); } p->prot.flag=(int *) shmalloc(sizeof(int)); pTime = (double *) shmalloc(sizeof(double)); pNrepeat = (int *) shmalloc(sizeof(int)); p->tr = p->rcv = 0; if((p->prot.ipe=_my_pe()) == 0) { p->tr=1; p->prot.nbor=1; *p->prot.flag=1; } else { p->rcv=1; p->prot.nbor=0; *p->prot.flag=0; } } void Sync(ArgStruct *p) { shmem_barrier_all(); } void PrepareToReceive(ArgStruct *p) { } void SendData(ArgStruct *p) { if(p->bufflen%8==0) shmem_put64(p->s_ptr,p->s_ptr,p->bufflen/8,p->prot.nbor); else shmem_putmem(p->s_ptr,p->s_ptr,p->bufflen,p->prot.nbor); } void RecvData(ArgStruct *p) { int i=0; while(p->r_ptr[p->bufflen-1] != 'a' + (p->cache ? 1 - p->tr : 1) ) { sched_yield(); } p->r_ptr[p->bufflen-1] = 'a' + (p->cache ? p->tr : 0); } void SendTime(ArgStruct *p, double *t) { *pTime=*t; shmem_double_put(pTime,pTime,1,p->prot.nbor); shmem_int_put(p->prot.flag,p->prot.flag,1,p->prot.nbor); } void RecvTime(ArgStruct *p, double *t) { int i=0; while(*p->prot.flag!=p->prot.ipe) { sched_yield(); } *t=*pTime; *p->prot.flag=p->prot.nbor; } void SendRepeat(ArgStruct *p, int rpt) { *pNrepeat= rpt; shmem_int_put(pNrepeat,pNrepeat,1,p->prot.nbor); shmem_int_put(p->prot.flag,p->prot.flag,1,p->prot.nbor); } void RecvRepeat(ArgStruct *p, int *rpt) { int i=0; while(*p->prot.flag!=p->prot.ipe) { sched_yield(); } *rpt=*pNrepeat; *p->prot.flag=p->prot.nbor; } void CleanUp(ArgStruct *p) { } void Reset(ArgStruct *p) { } void AfterAlignmentInit(ArgStruct *p) { } void MyMalloc(ArgStruct *p, int bufflen, int soffset, int roffset) { void* buff1; void* buff2; if((buff1=(char *)shmalloc(bufflen+MAX(soffset,roffset)))==(char *)NULL) { fprintf(stderr,"couldn't allocate memory\n"); exit(-1); } if(!p->cache) if((buff2=(char *)shmalloc(bufflen+soffset))==(char *)NULL) { fprintf(stderr,"Couldn't allocate memory\n"); exit(-1); } if(p->cache) { p->r_buff = buff1; } else { /* Flip-flop buffers so send <--> recv between nodes */ p->r_buff = p->tr ? buff1 : buff2; p->s_buff = p->tr ? buff2 : buff1; } } void FreeBuff(char *buff1, char* buff2) { if(buff1 != NULL) shfree(buff1); if(buff2 != NULL) shfree(buff2); } NetPIPE-3.7.2/src/tcgmsg.c0000644000000000000000000000666111433312522015315 0ustar00usergroup00000000000000/*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* * mpi.c ---- MPI calls source */ /*****************************************************************************/ #include "netpipe.h" #include void RCV_(long *type, void *buf, long *lenbuf, long *lenmes, long *nodesel, long *nodefrom, long *sync); void SND_(long *type, void *buf, long *lenbuf, long *node, long *sync); void Init(ArgStruct *p, int* pargc, char*** pargv) { PBEGIN_(*pargc, *pargv); } void Setup(ArgStruct *p) { long nprocs; nprocs = NNODES_(); p->prot.nid = NODEID_(); { char s[255]; gethostname(s,253); printf("%d: %s\n",p->prot.nid,s); fflush(stdout); } if (nprocs < 2) { printf("Need at least two processes, we have %d\n", nprocs); fflush(stdout); exit(-2); } p->tr = p->rcv = 0; if (p->prot.nid == 0) { p->tr = 1; p->prot.nbor = nprocs-1; } else if( p->prot.nid == nprocs-1 ) { p->rcv = 1; p->prot.nbor = 0; } } void Sync(ArgStruct *p) { long type = MSGCHR; SYNCH_(&type); } void PrepareToReceive(ArgStruct *p) { /* The TCGMSG interface doesn't have a method to pre-post a buffer for reception of data. */ } void SendData(ArgStruct *p) { long type = MSGCHR; long sync_snd = 0; long lbufflen = p->bufflen; SND_( &type, p->s_ptr, &lbufflen, &p->prot.nbor, &sync_snd); } void RecvData(ArgStruct *p) { long lenmes; long nodefrom; long type = MSGCHR; long sync_rcv = 1; long lbufflen = p->bufflen; RCV_ ( &type, p->r_ptr, &lbufflen, &lenmes, &p->prot.nbor, &nodefrom, &sync_rcv) ; } void SendTime(ArgStruct *p, double *t) { long ttype; long lenbuf; long sync_snd = 1; ttype = MSGDBL; lenbuf = sizeof(double); SND_( &ttype, t, &lenbuf, &p->prot.nbor, &sync_snd); } void RecvTime(ArgStruct *p, double *t) { long lenmes; long nodefrom; long ttype; long lenbuf; long sync_rcv = 1; ttype = MSGDBL; lenbuf = sizeof(double); RCV_( &ttype, t, &lenbuf, &lenmes, &p->prot.nbor, &nodefrom, &sync_rcv); } void SendRepeat(ArgStruct *p, int n) { long ttype; long lenbuf; long sync_snd = 1; ttype = MSGINT; lenbuf = sizeof(int); SND_( &ttype, &n, &lenbuf, &p->prot.nbor, &sync_snd); } void RecvRepeat(ArgStruct *p, int *n) { long lenmes; long nodefrom; long ttype; long lenbuf; long sync_rcv = 1; ttype = MSGINT; lenbuf = sizeof(int); RCV_( &ttype, n, &lenbuf, &lenmes, &p->prot.nbor, &nodefrom, &sync_rcv); } void CleanUp(ArgStruct *p) { PEND_(); } void Reset(ArgStruct *p) { } void AfterAlignmentInit(ArgStruct *p) { } NetPIPE-3.7.2/src/tcp.c0000644000000000000000000002660411433312522014616 0ustar00usergroup00000000000000/*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* * tcp.c ---- TCP calls source */ /* * tcp.h ---- Include file for TCP calls and data structs */ /*****************************************************************************/ #include "netpipe.h" #if defined (MPLITE) #include "mplite.h" #endif int doing_reset = 0; void Init(ArgStruct *p, int* pargc, char*** pargv) { p->reset_conn = 0; /* Default to not resetting connection */ p->prot.sndbufsz = p->prot.rcvbufsz = 0; p->tr = 0; /* The transmitter will be set using the -h host flag. */ p->rcv = 1; } void Setup(ArgStruct *p) { int one = 1; int sockfd; struct sockaddr_in *lsin1, *lsin2; /* ptr to sockaddr_in in ArgStruct */ char *host; struct hostent *addr; struct protoent *proto; int send_size, recv_size, sizeofint = sizeof(int); int socket_family = AF_INET; host = p->host; /* copy ptr to hostname */ if (p->use_sdp){ printf("Using AF_INET_SDP (27) socket family\n"); socket_family = 27; } lsin1 = &(p->prot.sin1); lsin2 = &(p->prot.sin2); bzero((char *) lsin1, sizeof(*lsin1)); bzero((char *) lsin2, sizeof(*lsin2)); if ( (sockfd = socket(socket_family, SOCK_STREAM, 0)) < 0){ printf("NetPIPE: can't open stream socket! errno=%d\n", errno); exit(-4); } if(!(proto = getprotobyname("tcp"))){ printf("NetPIPE: protocol 'tcp' unknown!\n"); exit(555); } /* Attempt to set TCP_NODELAY */ if(setsockopt(sockfd, proto->p_proto, TCP_NODELAY, &one, sizeof(one)) < 0) { printf("NetPIPE: setsockopt: TCP_NODELAY failed! errno=%d\n", errno); exit(556); } /* If requested, set the send and receive buffer sizes */ if(p->prot.sndbufsz > 0) { if(setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &(p->prot.sndbufsz), sizeof(p->prot.sndbufsz)) < 0) { printf("NetPIPE: setsockopt: SO_SNDBUF failed! errno=%d\n", errno); printf("You may have asked for a buffer larger than the system can handle\n"); exit(556); } if(setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &(p->prot.rcvbufsz), sizeof(p->prot.rcvbufsz)) < 0) { printf("NetPIPE: setsockopt: SO_RCVBUF failed! errno=%d\n", errno); printf("You may have asked for a buffer larger than the system can handle\n"); exit(556); } } getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (char *) &send_size, (void *) &sizeofint); getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (char *) &recv_size, (void *) &sizeofint); if(!doing_reset) { fprintf(stderr,"Send and receive buffers are %d and %d bytes\n", send_size, recv_size); fprintf(stderr, "(A bug in Linux doubles the requested buffer sizes)\n"); } if( p->tr ) { /* Primary transmitter */ if (atoi(host) > 0) { /* Numerical IP address */ lsin1->sin_family = AF_INET; lsin1->sin_addr.s_addr = inet_addr(host); } else { if ((addr = gethostbyname(host)) == NULL){ printf("NetPIPE: invalid hostname '%s'\n", host); exit(-5); } lsin1->sin_family = addr->h_addrtype; bcopy(addr->h_addr, (char*) &(lsin1->sin_addr.s_addr), addr->h_length); } lsin1->sin_port = htons(p->port); p->commfd = sockfd; } else if( p->rcv ) { /* we are the receiver */ if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int))) { printf("NetPIPE: server: unable to setsockopt -- errno %d\n", errno); exit(557); } bzero((char *) lsin1, sizeof(*lsin1)); lsin1->sin_family = AF_INET; lsin1->sin_addr.s_addr = htonl(INADDR_ANY); lsin1->sin_port = htons(p->port); if (bind(sockfd, (struct sockaddr *) lsin1, sizeof(*lsin1)) < 0){ printf("NetPIPE: server: bind on local address failed! errno=%d\n", errno); exit(-6); } p->servicefd = sockfd; } p->upper = send_size + recv_size; establish(p); /* Establish connections */ } static int readFully(int fd, void *obuf, int len) { int bytesLeft = len; char *buf = (char *) obuf; int bytesRead = 0; while (bytesLeft > 0 && (bytesRead = read(fd, (void *) buf, bytesLeft)) > 0) { bytesLeft -= bytesRead; buf += bytesRead; } if (bytesRead <= 0) return bytesRead; return len; } void Sync(ArgStruct *p) { char s[] = "SyncMe", response[] = " "; if (write(p->commfd, s, strlen(s)) < 0 || /* Write to nbor */ readFully(p->commfd, response, strlen(s)) < 0) /* Read from nbor */ { perror("NetPIPE: error writing or reading synchronization string"); exit(3); } if (strncmp(s, response, strlen(s))) { fprintf(stderr, "NetPIPE: Synchronization string incorrect! |%s|\n", response); exit(3); } } void PrepareToReceive(ArgStruct *p) { /* The Berkeley sockets interface doesn't have a method to pre-post a buffer for reception of data. */ } void SendData(ArgStruct *p) { int bytesWritten, bytesLeft; char *q; bytesLeft = p->bufflen; bytesWritten = 0; q = p->s_ptr; while (bytesLeft > 0 && (bytesWritten = write(p->commfd, q, bytesLeft)) > 0) { bytesLeft -= bytesWritten; q += bytesWritten; } if (bytesWritten == -1) { printf("NetPIPE: write: error encountered, errno=%d\n", errno); exit(401); } } void RecvData(ArgStruct *p) { int bytesLeft; int bytesRead; char *q; bytesLeft = p->bufflen; bytesRead = 0; q = p->r_ptr; while (bytesLeft > 0 && (bytesRead = read(p->commfd, q, bytesLeft)) > 0) { bytesLeft -= bytesRead; q += bytesRead; } if (bytesLeft > 0 && bytesRead == 0) { printf("NetPIPE: \"end of file\" encountered on reading from socket\n"); } else if (bytesRead == -1) { printf("NetPIPE: read: error encountered, errno=%d\n", errno); exit(401); } } /* uint32_t is used to insure that the integer size is the same even in tests * between 64-bit and 32-bit architectures. */ void SendTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; /* Multiply the number of seconds by 1e8 to get time in 0.01 microseconds and convert value to an unsigned 32-bit integer. */ ltime = (uint32_t)(*t * 1.e8); /* Send time in network order */ ntime = htonl(ltime); if (write(p->commfd, (char *)&ntime, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendTime: errno=%d\n", errno); exit(301); } } void RecvTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; int bytesRead; bytesRead = readFully(p->commfd, (void *)&ntime, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvTime: errno=%d\n", errno); exit(302); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvTime of %d bytes\n", bytesRead); exit(303); } ltime = ntohl(ntime); /* Result is ltime (in microseconds) divided by 1.0e8 to get seconds */ *t = (double)ltime / 1.0e8; } void SendRepeat(ArgStruct *p, int rpt) { uint32_t lrpt, nrpt; lrpt = rpt; /* Send repeat count as a long in network order */ nrpt = htonl(lrpt); if (write(p->commfd, (void *) &nrpt, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendRepeat: errno=%d\n", errno); exit(304); } } void RecvRepeat(ArgStruct *p, int *rpt) { uint32_t lrpt, nrpt; int bytesRead; bytesRead = readFully(p->commfd, (void *)&nrpt, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvRepeat: errno=%d\n", errno); exit(305); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvRepeat of %d bytes\n", bytesRead); exit(306); } lrpt = ntohl(nrpt); *rpt = lrpt; } void establish(ArgStruct *p) { int one = 1; socklen_t clen; struct protoent *proto; clen = (socklen_t) sizeof(p->prot.sin2); if( p->tr ){ while( connect(p->commfd, (struct sockaddr *) &(p->prot.sin1), sizeof(p->prot.sin1)) < 0 ) { /* If we are doing a reset and we get a connection refused from * the connect() call, assume that the other node has not yet * gotten to its corresponding accept() call and keep trying until * we have success. */ if(!doing_reset || errno != ECONNREFUSED) { printf("Client: Cannot Connect! errno=%d\n",errno); exit(-10); } } } else if( p->rcv ) { /* SERVER */ listen(p->servicefd, 5); p->commfd = accept(p->servicefd, (struct sockaddr *) &(p->prot.sin2), &clen); if(p->commfd < 0){ printf("Server: Accept Failed! errno=%d\n",errno); exit(-12); } /* Attempt to set TCP_NODELAY. TCP_NODELAY may or may not be propagated to accepted sockets. */ if(!(proto = getprotobyname("tcp"))){ printf("unknown protocol!\n"); exit(555); } if(setsockopt(p->commfd, proto->p_proto, TCP_NODELAY, &one, sizeof(one)) < 0) { printf("setsockopt: TCP_NODELAY failed! errno=%d\n", errno); exit(556); } /* If requested, set the send and receive buffer sizes */ if(p->prot.sndbufsz > 0) { /* printf("Send and Receive Buffers on accepted socket set to %d bytes\n",*/ /* p->prot.sndbufsz);*/ if(setsockopt(p->commfd, SOL_SOCKET, SO_SNDBUF, &(p->prot.sndbufsz), sizeof(p->prot.sndbufsz)) < 0) { printf("setsockopt: SO_SNDBUF failed! errno=%d\n", errno); exit(556); } if(setsockopt(p->commfd, SOL_SOCKET, SO_RCVBUF, &(p->prot.rcvbufsz), sizeof(p->prot.rcvbufsz)) < 0) { printf("setsockopt: SO_RCVBUF failed! errno=%d\n", errno); exit(556); } } } } void CleanUp(ArgStruct *p) { char quit[] = "QUIT"; if (p->tr) { write(p->commfd,quit, 5); read(p->commfd, quit, 5); close(p->commfd); } else if( p->rcv ) { read(p->commfd,quit, 5); write(p->commfd,quit,5); close(p->commfd); close(p->servicefd); } } void Reset(ArgStruct *p) { /* Reset sockets */ if(p->reset_conn) { doing_reset = 1; /* Close the sockets */ CleanUp(p); /* Now open and connect new sockets */ Setup(p); } } void AfterAlignmentInit(ArgStruct *p) { } NetPIPE-3.7.2/src/tcp6.c0000644000000000000000000002606311433312522014703 0ustar00usergroup00000000000000/*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* TCP6 extension Copyright 2004 George V. Neville-Neil and Neville-Neil */ /* Consulting */ /* */ /* * tcp6.c ---- TCP over IPv6 calls source */ /* * tcp.h ---- Include file for TCP6 calls and data structs */ /*****************************************************************************/ #include "netpipe.h" #if defined (MPLITE) #include "mplite.h" #endif int doing_reset = 0; void Init(ArgStruct *p, int* pargc, char*** pargv) { p->reset_conn = 0; /* Default to not resetting connection */ p->prot.sndbufsz = p->prot.rcvbufsz = 0; /* The transmitter will be set using the -h host flag. */ p->tr = 0; p->rcv = 1; } void Setup(ArgStruct *p) { int one = 1; int sockfd = -1; /* ptr to sockaddr_in in ArgStruct */ struct sockaddr_in6 *lsin1, *lsin2; char *host; struct hostent *hp; struct protoent *proto; int send_size, recv_size, sizeofint = sizeof(int); host = p->host; /* copy ptr to hostname */ lsin1 = &(p->prot.sin1); lsin2 = &(p->prot.sin2); bzero((char *) lsin1, sizeof(*lsin1)); bzero((char *) lsin2, sizeof(*lsin2)); if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0){ printf("NetPIPE: can't open stream socket! errno=%d\n", errno); exit(-4); } if(!(proto = getprotobyname("tcp"))){ printf("NetPIPE: protocol 'tcp' unknown!\n"); exit(555); } /* Attempt to set TCP_NODELAY */ if(setsockopt(sockfd, proto->p_proto, TCP_NODELAY, &one, sizeof(one)) < 0) { printf("NetPIPE: setsockopt: TCP_NODELAY failed! errno=%d\n", errno); exit(556); } /* If requested, set the send and receive buffer sizes */ if(p->prot.sndbufsz > 0) { if(setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &(p->prot.sndbufsz), sizeof(p->prot.sndbufsz)) < 0) { printf("NetPIPE: setsockopt: SO_SNDBUF failed! errno=%d\n", errno); printf("You may have asked for a buffer larger than the system can handle\n"); exit(556); } if(setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &(p->prot.rcvbufsz), sizeof(p->prot.rcvbufsz)) < 0) { printf("NetPIPE: setsockopt: SO_RCVBUF failed! errno=%d\n", errno); printf("You may have asked for a buffer larger than the system can handle\n"); exit(556); } } getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (char *) &send_size, (void *) &sizeofint); getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (char *) &recv_size, (void *) &sizeofint); if(!doing_reset) { fprintf(stderr,"Send and receive buffers are %d and %d bytes\n", send_size, recv_size); fprintf(stderr, "(A bug in Linux doubles the requested buffer sizes)\n"); } if( p->tr ) { /* Primary transmitter */ lsin1->sin6_family = AF_INET6; /* First attempt to convert the string to an IPv6 */ /* address. */ /* If the user supplied a real host name this will fail and */ /* we'll then do a name lookup. */ if (inet_pton(AF_INET6, host, &lsin1->sin6_addr) == 0) { if ((hp = gethostbyname2(host, AF_INET6)) == NULL) { printf("NetPIPE: invalid hostname '%s'\n", host); exit(-5); } if (hp->h_addrtype != AF_INET6) { printf("NetPIPE: invalid hostname '%s'\n", host); exit(-5); } bcopy(hp->h_addr, (char*) &(lsin1->sin6_addr), hp->h_length); } lsin1->sin6_port = htons(p->port); p->commfd = sockfd; } else if( p->rcv ) { /* we are the receiver */ bzero((char *) lsin1, sizeof(*lsin1)); lsin1->sin6_family = AF_INET6; #if defined(SIN6_LEN) lsin1->sin6_len = sizeof(*lsin1); #endif lsin1->sin6_port = htons(p->port); /* Setting this to all 0 is the "ANY" address. */ bzero(&lsin1->sin6_addr, sizeof(lsin1->sin6_addr)); if (bind(sockfd, (struct sockaddr *) lsin1, sizeof(*lsin1)) < 0){ printf("NetPIPE: server: bind on local address failed! errno=%d", errno); exit(-6); } p->servicefd = sockfd; } p->upper = send_size + recv_size; establish(p); /* Establish connections */ } static int readFully(int fd, void *obuf, int len) { int bytesLeft = len; char *buf = (char *) obuf; int bytesRead = 0; while (bytesLeft > 0 && (bytesRead = read(fd, (void *) buf, bytesLeft)) > 0) { bytesLeft -= bytesRead; buf += bytesRead; } if (bytesRead <= 0) return bytesRead; return len; } void Sync(ArgStruct *p) { char s[] = "SyncMe", response[] = " "; if (write(p->commfd, s, strlen(s)) < 0 || /* Write to nbor */ readFully(p->commfd, response, strlen(s)) < 0) /* Read from nbor */ { perror("NetPIPE: error writing or reading synchronization string"); exit(3); } if (strncmp(s, response, strlen(s))) { fprintf(stderr, "NetPIPE: Synchronization string incorrect! |%s|\n", response); exit(3); } } void PrepareToReceive(ArgStruct *p) { /* The Berkeley sockets interface doesn't have a method to pre-post a buffer for reception of data. */ } void SendData(ArgStruct *p) { int bytesWritten, bytesLeft; char *q; bytesLeft = p->bufflen; bytesWritten = 0; q = p->s_ptr; while (bytesLeft > 0 && (bytesWritten = write(p->commfd, q, bytesLeft)) > 0) { bytesLeft -= bytesWritten; q += bytesWritten; } if (bytesWritten == -1) { printf("NetPIPE: write: error encountered, errno=%d\n", errno); exit(401); } } void RecvData(ArgStruct *p) { int bytesLeft; int bytesRead; char *q; bytesLeft = p->bufflen; bytesRead = 0; q = p->r_ptr; while (bytesLeft > 0 && (bytesRead = read(p->commfd, q, bytesLeft)) > 0) { bytesLeft -= bytesRead; q += bytesRead; } if (bytesLeft > 0 && bytesRead == 0) { printf("NetPIPE: \"end of file\" encountered on reading from socket\n"); } else if (bytesRead == -1) { printf("NetPIPE: read: error encountered, errno=%d\n", errno); exit(401); } } /* uint32_t is used to insure that the integer size is the same even in tests * between 64-bit and 32-bit architectures. */ void SendTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; /* Multiply the number of seconds by 1e8 to get time in 0.01 microseconds and convert value to an unsigned 32-bit integer. */ ltime = (uint32_t)(*t * 1.e8); /* Send time in network order */ ntime = htonl(ltime); if (write(p->commfd, (char *)&ntime, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendTime: errno=%d\n", errno); exit(301); } } void RecvTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; int bytesRead; bytesRead = readFully(p->commfd, (void *)&ntime, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvTime: errno=%d\n", errno); exit(302); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvTime of %d bytes\n", bytesRead); exit(303); } ltime = ntohl(ntime); /* Result is ltime (in microseconds) divided by 1.0e8 to get seconds */ *t = (double)ltime / 1.0e8; } void SendRepeat(ArgStruct *p, int rpt) { uint32_t lrpt, nrpt; lrpt = rpt; /* Send repeat count as a long in network order */ nrpt = htonl(lrpt); if (write(p->commfd, (void *) &nrpt, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendRepeat: errno=%d\n", errno); exit(304); } } void RecvRepeat(ArgStruct *p, int *rpt) { uint32_t lrpt, nrpt; int bytesRead; bytesRead = readFully(p->commfd, (void *)&nrpt, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvRepeat: errno=%d\n", errno); exit(305); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvRepeat of %d bytes\n", bytesRead); exit(306); } lrpt = ntohl(nrpt); *rpt = lrpt; } void establish(ArgStruct *p) { int one = 1; socklen_t clen; struct protoent *proto; clen = (socklen_t) sizeof(p->prot.sin2); if( p->tr ){ while( connect(p->commfd, (struct sockaddr *) &(p->prot.sin1), sizeof(p->prot.sin1)) < 0 ) { /* If we are doing a reset and we get a connection refused from * the connect() call, assume that the other node has not yet * gotten to its corresponding accept() call and keep trying until * we have success. */ if(!doing_reset || errno != ECONNREFUSED) { printf("Client: Cannot Connect! errno=%d\n",errno); exit(-10); } } } else if( p->rcv ) { /* SERVER */ listen(p->servicefd, 5); p->commfd = accept(p->servicefd, (struct sockaddr *) &(p->prot.sin2), &clen); if(p->commfd < 0){ printf("Server: Accept Failed! errno=%d\n",errno); exit(-12); } /* Attempt to set TCP_NODELAY. TCP_NODELAY may or may not be propagated to accepted sockets. */ if(!(proto = getprotobyname("tcp"))){ printf("unknown protocol!\n"); exit(555); } if(setsockopt(p->commfd, proto->p_proto, TCP_NODELAY, &one, sizeof(one)) < 0) { printf("setsockopt: TCP_NODELAY failed! errno=%d\n", errno); exit(556); } /* If requested, set the send and receive buffer sizes */ if(p->prot.sndbufsz > 0) { /* printf("Send and Receive Buffers on accepted socket set to %d bytes\n",*/ /* p->prot.sndbufsz);*/ if(setsockopt(p->commfd, SOL_SOCKET, SO_SNDBUF, &(p->prot.sndbufsz), sizeof(p->prot.sndbufsz)) < 0) { printf("setsockopt: SO_SNDBUF failed! errno=%d\n", errno); exit(556); } if(setsockopt(p->commfd, SOL_SOCKET, SO_RCVBUF, &(p->prot.rcvbufsz), sizeof(p->prot.rcvbufsz)) < 0) { printf("setsockopt: SO_RCVBUF failed! errno=%d\n", errno); exit(556); } } } } void CleanUp(ArgStruct *p) { char *quit="QUIT"; if (p->tr) { write(p->commfd,quit, 5); read(p->commfd, quit, 5); close(p->commfd); } else if( p->rcv ) { read(p->commfd,quit, 5); write(p->commfd,quit,5); close(p->commfd); close(p->servicefd); } } void Reset(ArgStruct *p) { /* Reset sockets */ if(p->reset_conn) { doing_reset = 1; /* Close the sockets */ CleanUp(p); /* Now open and connect new sockets */ Setup(p); } } void AfterAlignmentInit(ArgStruct *p) { } NetPIPE-3.7.2/src/udapl.c0000644000000000000000000011520511433312522015131 0ustar00usergroup00000000000000// vim:expandtab:autoindent:tabstop=4:shiftwidth=4:filetype=c: /*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* udapl.c ---- uDAPL module for NetPIPE */ /*****************************************************************************/ /* * :NOTE: This code uses UDAPL_DEVICE as the name of the Interface Adapter to * pass to dat_ia_open. UDAPL_DEVICE by default in this code is set * up for OFED 1.2 uDAPL RDMA-CM: "OpenIB-cma-name". The default * device name can be changed by redefining UDAPL_DEVICE below. For * example, for a Mellanox IBGold setup, it could be set to "ib0" or * any other name defined in /etc/dat.conf. * * :NOTE: For InfiniBand, this code requires that IPoIB be running in order to * resolve the host name. * * :NOTE: For best latency & throughput numbers, use local_poll. * To demonstrate CPU efficiency, use evd_wait or cno_wait. * ***************************************************************************** * * EXAMPLE USAGE OF THe UDAPL MODULE: * * Server side (host name ibdemo): ./NPudapl -t send_recv -c local_poll * Client side (host name ibcool): ./NPudapl -t send_recv -c local_poll -h ibdemo * * Server side (host name ibdemo): ./NPudapl -t rdma_write -c local_poll * Client side (host name ibcool): ./NPudapl -t rdma_write -c local_poll -h ibdemo * * Server side (host name ibdemo): ./NPudapl -t rdma_write -c evd_wait * Client side (host name ibcool): ./NPudapl -t rdma_write -c evd_wait -h ibdemo * * Server side (host name ibdemo): ./NPudapl -t send_recv -c evd_wait * Client side (host name ibcool): ./NPudapl -t send_recv -c evd_wait -h ibdemo * * Server side (host name ibdemo): ./NPudapl -t send_recv -c dq_poll * Client side (host name ibcool): ./NPudapl -t send_recv -c dq_poll -h ibdemo * * Server side (host name ibdemo): ./NPudapl -t send_recv -c cno_wait * Client side (host name ibcool): ./NPudapl -t send_recv -c cno_wait -h ibdemo * */ #include "netpipe.h" #include #include /* Debugging output macro */ FILE* logfile; #if 0 #define LOGPRINTF(_format, _aa...) fprintf(logfile, _format, ##_aa); fflush(logfile) #else #define LOGPRINTF(_format, _aa...) #endif /* Header files needed for Infiniband */ #include #include #include #include #include /* Local definitions */ #define NP_FAILURE -1 #define NP_SUCCESS 0 #define EVD_QLEN 1024 #define CONN_QUAL 1040 #define NP_CONNECTED 1 #define UDAPL_DEVICE "OpenIB-cma-name" #define MAX_MTU_SIZE 8388608 #define MAX_MSG_SIZE 8388608 #define REQ_QUEUE_SIZE 50000 #define RCV_QUEUE_SIZE 50000 #define MAX_RCV_IOV 4 #define MAX_REQ_IOV 4 #define MAX_RDMA_RD_IN 4 #define MAX_RDMA_RD_OUT 4 /* Global vars */ static DAT_IA_HANDLE gIA = DAT_HANDLE_NULL; static DAT_PZ_HANDLE gPZ = DAT_HANDLE_NULL; static DAT_EP_HANDLE gEP = DAT_HANDLE_NULL; static DAT_PSP_HANDLE gPSP = DAT_HANDLE_NULL; static DAT_CNO_HANDLE gCNO = DAT_HANDLE_NULL; static DAT_EVD_HANDLE gConnReqEvd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE gConnEvd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE gAsyncEvd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE gRecvDtoEvd = DAT_HANDLE_NULL; static DAT_EVD_HANDLE gSendDtoEvd = DAT_HANDLE_NULL; static uint8_t gConnected = 0; // disconnected static DAT_LMR_HANDLE gSndLmrHandle = DAT_HANDLE_NULL; static DAT_LMR_CONTEXT gSndLmrContext = 0; static DAT_LMR_HANDLE gRcvLmrHandle = DAT_HANDLE_NULL; static DAT_RMR_HANDLE gRcvRmrHandle = DAT_HANDLE_NULL; static DAT_LMR_CONTEXT gRcvLmrContext = 0; static DAT_RMR_CONTEXT gRcvRmrContext = 0; static void *gRemoteAddress = NULL; static DAT_RMR_CONTEXT gRemoteKey = 0; static DAT_REGION_DESCRIPTION gRegion; static uint32_t gOutReqs = 0; /* Local prototypes */ /* Function definitions */ void Init(ArgStruct *p, int* pargc, char*** pargv) { /* Set defaults */ p->prot.commtype = NP_COMM_SENDRECV; /* Use Send/Receive communications */ p->prot.comptype = NP_COMP_LOCALPOLL; /* Use local polling for completion */ p->tr = 0; /* I am not the transmitter */ p->rcv = 1; /* I am the receiver */ } void Setup(ArgStruct *p) { struct sockaddr_in *lsin1; /* ptr to sockaddr_in in ArgStruct */ struct hostent *addr; struct protoent *proto; char *host; char logfilename[80]; int sockfd; /* Sanity check */ if( p->prot.commtype == NP_COMM_RDMAWRITE && p->prot.comptype != NP_COMP_LOCALPOLL && p->prot.comptype != NP_COMP_EVD ) { fprintf(stderr, "Error, RDMA Write only supported with local polling & evd wait by this module.\n"); exit(-1); } /* Open log file */ sprintf(logfilename, ".udapllog%d", 1 - p->tr); logfile = fopen(logfilename, "w"); host = p->host; /* copy ptr to hostname */ lsin1 = &(p->prot.sin1); bzero((char *) lsin1, sizeof(*lsin1)); if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ printf("NetPIPE: can't open stream socket! errno=%d\n", errno); exit(-4); } if(!(proto = getprotobyname("tcp"))){ printf("NetPIPE: protocol 'tcp' unknown!\n"); exit(555); } if (p->tr){ /* if client i.e., Sender */ if (atoi(host) > 0) { /* Numerical IP address */ lsin1->sin_family = AF_INET; lsin1->sin_addr.s_addr = inet_addr(host); } else { if ((addr = gethostbyname(host)) == NULL){ printf("NetPIPE: invalid hostname '%s'\n", host); exit(-5); } lsin1->sin_family = addr->h_addrtype; bcopy(addr->h_addr, (char*) &(lsin1->sin_addr.s_addr), addr->h_length); } lsin1->sin_port = htons(p->port); } else { /* we are the receiver (server) */ bzero((char *) lsin1, sizeof(*lsin1)); lsin1->sin_family = AF_INET; lsin1->sin_addr.s_addr = htonl(INADDR_ANY); lsin1->sin_port = htons(p->port); if (bind(sockfd, (struct sockaddr *) lsin1, sizeof(*lsin1)) < 0){ printf("NetPIPE: server: bind on local address failed! errno=%d", errno); exit(-6); } } if(p->tr) { p->commfd = sockfd; } else { p->servicefd = sockfd; } /* Establish tcp connections */ establish( p ); /* Initialize uDAPL */ if ( NP_FAILURE == init_uDAPL(p) ) { CleanUp( p ); exit( NP_FAILURE ); } } int lookup_addr(DAT_IA_ADDRESS_PTR netAddr, char *serverName) { struct addrinfo *target; int status; unsigned int addr; status = getaddrinfo( serverName, NULL, NULL, &target ); if ( status ) { fprintf(stderr, "getaddrinfo failed: %d\n", status); return NP_FAILURE; } addr = ((struct sockaddr_in *) target->ai_addr)->sin_addr.s_addr; *netAddr = *((DAT_IA_ADDRESS_PTR) target->ai_addr); freeaddrinfo(target); return 0; } int init_uDAPL(ArgStruct *p) { int status = 0; DAT_RETURN dat_status; DAT_CR_HANDLE cr; DAT_EVD_HANDLE evd_handle; DAT_CONTEXT context; DAT_EP_ATTR ep_attr; DAT_EVENT event; DAT_COUNT count; DAT_IA_ADDRESS_PTR remote_net_addr; // If p->host is NULL, this is the server. Need to create the PSP and listen // for a connection. if ( NULL == p->host ) { /* ** SERVER / REMOTE ** */ dat_status = dat_ia_open( UDAPL_DEVICE, EVD_QLEN, &gAsyncEvd, &gIA ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_ia_open failed: status=0x%x\n", dat_status); fprintf(stderr, "Can not open IA %s\n", UDAPL_DEVICE); return NP_FAILURE; } dat_status = dat_pz_create( gIA, &gPZ ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_pz_create failed: status=0x%x", dat_status); return NP_FAILURE; } dat_status = dat_cno_create( gIA, DAT_OS_WAIT_PROXY_AGENT_NULL, &gCNO ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_cno_create failed: status=0x%x", dat_status); return NP_FAILURE; } dat_status = dat_evd_create( gIA, EVD_QLEN, DAT_HANDLE_NULL, DAT_EVD_CR_FLAG, &gConnReqEvd ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_evd_create for gConnReqEvd failed: status=0x%x", dat_status); return NP_FAILURE; } dat_status = dat_psp_create( gIA, CONN_QUAL, gConnReqEvd, DAT_PSP_CONSUMER_FLAG, &gPSP ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_psp_create failed: status=0x%x", dat_status); return NP_FAILURE; } dat_status = dat_evd_create( gIA, EVD_QLEN, DAT_HANDLE_NULL, DAT_EVD_DTO_FLAG, &gSendDtoEvd ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_evd_create for gSendDtoEvd failed: status=0x%x", dat_status); return NP_FAILURE; } dat_status = dat_evd_create( gIA, EVD_QLEN, gCNO, DAT_EVD_DTO_FLAG, &gRecvDtoEvd ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_evd_create for gRecvDtoEvd failed: status=0x%x", dat_status); return NP_FAILURE; } dat_status = dat_evd_create( gIA, EVD_QLEN, DAT_HANDLE_NULL, DAT_EVD_CONNECTION_FLAG, &gConnEvd ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_evd_create for gConnEvd failed: status=0x%x", dat_status); return NP_FAILURE; } dat_status = dat_evd_wait( gConnReqEvd, DAT_TIMEOUT_INFINITE, 1, &event, &count ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_evd_wait failed: status=0x%x", dat_status); return NP_FAILURE; } if ( DAT_CONNECTION_REQUEST_EVENT != event.event_number ) { fprintf(stderr, "Rejected the event 0x%x", event.event_number); return NP_FAILURE; } cr = event.event_data.cr_arrival_event_data.cr_handle; // :NOTE: these values may have to be tuned for your uDAPL device. memset(&ep_attr, 0, sizeof(ep_attr)); ep_attr.max_mtu_size = MAX_MTU_SIZE; ep_attr.max_rdma_size = MAX_MSG_SIZE; ep_attr.qos = DAT_QOS_BEST_EFFORT; ep_attr.service_type = DAT_SERVICE_TYPE_RC; ep_attr.max_recv_dtos = RCV_QUEUE_SIZE; ep_attr.max_request_dtos = REQ_QUEUE_SIZE; ep_attr.max_recv_iov = MAX_RCV_IOV; ep_attr.max_request_iov = MAX_REQ_IOV; ep_attr.max_rdma_read_in = MAX_RDMA_RD_IN; ep_attr.max_rdma_read_out = MAX_RDMA_RD_OUT; ep_attr.request_completion_flags = DAT_COMPLETION_UNSIGNALLED_FLAG; ep_attr.recv_completion_flags = DAT_COMPLETION_DEFAULT_FLAG; dat_status = dat_ep_create( gIA, gPZ, gRecvDtoEvd, gSendDtoEvd, gConnEvd, &ep_attr, &gEP ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_ep_create failed: status=0x%x", dat_status); return NP_FAILURE; } dat_status = dat_cr_accept( cr, gEP, 0, NULL ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_cr_accept failed: status=0x%x", dat_status); return NP_FAILURE; } dat_status = dat_evd_wait( gConnEvd, DAT_TIMEOUT_INFINITE, 1, &event, &count ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_evd_wait failed: status=0x%x", dat_status); return NP_FAILURE; } if ( DAT_CONNECTION_EVENT_ESTABLISHED != event.event_number ) { fprintf(stderr, "Rejected the event 0x%x", event.event_number); return NP_FAILURE; } // CONNECTION ESTABLISHED gConnected = NP_CONNECTED; status = NP_SUCCESS; } else { /* ** CLIENT / LOCAL ** */ // p->host is NOT NULL, so this is the client. Need to attempt to establish // a connection with the server. remote_net_addr = (DAT_IA_ADDRESS_PTR)malloc(sizeof(*remote_net_addr)); if ( NP_SUCCESS != lookup_addr(remote_net_addr, p->host) ) { fprintf(stderr, "unable to look up server address\n"); return NP_FAILURE; } dat_status = dat_ia_open( UDAPL_DEVICE, EVD_QLEN, &gAsyncEvd, &gIA ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_ia_open failed: status=0x%x", dat_status); gIA = DAT_HANDLE_NULL; gAsyncEvd = DAT_HANDLE_NULL; return NP_FAILURE; } dat_status = dat_cno_create( gIA, DAT_OS_WAIT_PROXY_AGENT_NULL, &gCNO ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_cno_create failed: status=0x%x", dat_status); gCNO = DAT_HANDLE_NULL; return NP_FAILURE; } dat_status = dat_evd_create( gIA, EVD_QLEN, DAT_HANDLE_NULL, DAT_EVD_DTO_FLAG, &gSendDtoEvd ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_evd_create for gSendDtoEvd failed: status=0x%x", dat_status); gSendDtoEvd = DAT_HANDLE_NULL; return NP_FAILURE; } dat_status = dat_evd_create( gIA, EVD_QLEN, gCNO, DAT_EVD_DTO_FLAG, &gRecvDtoEvd ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_evd_create for gRecvDtoEvd failed: status=0x%x", dat_status); gRecvDtoEvd = DAT_HANDLE_NULL; return NP_FAILURE; } dat_status = dat_evd_create( gIA, EVD_QLEN, DAT_HANDLE_NULL, DAT_EVD_CONNECTION_FLAG, &gConnEvd ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_evd_create for connect_evd failed: status=0x%x", dat_status); gConnEvd = DAT_HANDLE_NULL; return NP_FAILURE; } dat_status = dat_pz_create( gIA, &gPZ ); if (DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_pz_create failed: status=0x%x", dat_status); gPZ = DAT_HANDLE_NULL; return NP_FAILURE; } // :NOTE: these values may have to be tuned for your uDAPL device. memset(&ep_attr, 0, sizeof(ep_attr)); ep_attr.max_mtu_size = MAX_MTU_SIZE; ep_attr.max_rdma_size = MAX_MSG_SIZE; ep_attr.qos = DAT_QOS_BEST_EFFORT; ep_attr.service_type = DAT_SERVICE_TYPE_RC; ep_attr.max_recv_dtos = RCV_QUEUE_SIZE; ep_attr.max_request_dtos = REQ_QUEUE_SIZE; ep_attr.max_recv_iov = MAX_RCV_IOV; ep_attr.max_request_iov = MAX_REQ_IOV; ep_attr.max_rdma_read_in = MAX_RDMA_RD_IN; ep_attr.max_rdma_read_out = MAX_RDMA_RD_OUT; ep_attr.request_completion_flags = DAT_COMPLETION_UNSIGNALLED_FLAG; ep_attr.recv_completion_flags = DAT_COMPLETION_DEFAULT_FLAG; dat_status = dat_ep_create( gIA, gPZ, gRecvDtoEvd, gSendDtoEvd, gConnEvd, &ep_attr, &gEP ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_ep_create failed: status=0x%x", dat_status); gEP = DAT_HANDLE_NULL; return NP_FAILURE; } dat_status = dat_ep_connect( gEP, remote_net_addr, CONN_QUAL, DAT_TIMEOUT_INFINITE, 0, NULL, DAT_QOS_BEST_EFFORT, DAT_CONNECT_DEFAULT_FLAG ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_ep_connect failed: status=0x%x", dat_status); return NP_FAILURE; } dat_status = dat_evd_wait( gConnEvd, DAT_TIMEOUT_INFINITE, 1, &event, &count ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_evd_wait failed: status=0x%x", dat_status); return NP_FAILURE; } if ( DAT_CONNECTION_EVENT_ESTABLISHED != event.event_number ) { fprintf(stderr, "Received an unexpected event: %x\n", event.event_number); return NP_FAILURE; } // CONNECTION ESTABLISHED gConnected = NP_CONNECTED; status = NP_SUCCESS; } // end of CLIENT/SERVER if..else.. return status; } // Disconnect if connected and clean-up all resources. int finalize_uDAPL(ArgStruct *p) { int status = NP_SUCCESS; DAT_RETURN dat_status; DAT_EVENT event; DAT_COUNT count; // if connected was established, need to disconnect cleanly if ( NP_CONNECTED == gConnected ) { if ( NULL == p->host ) { /* ** SERVER ** */ dat_status = dat_evd_dequeue( gConnEvd, &event ); while ( dat_status != DAT_SUCCESS ) { dat_status = dat_evd_dequeue( gConnEvd, &event ); } // :NOTE: checking the event number for debug purposes if ( DAT_CONNECTION_EVENT_DISCONNECTED == event.event_number ) { fprintf(stderr, "Disconnected.\n"); } else { fprintf(stderr, "Unexpected event: 0x%x\n", event.event_number); } } else { /* ** CLIENT ** */ dat_status = dat_ep_disconnect( gEP, DAT_CLOSE_ABRUPT_FLAG ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_ep_disconnect failed. status=0x%x\n", dat_status); return NP_FAILURE; } dat_status = dat_evd_wait( gConnEvd, DAT_TIMEOUT_INFINITE, 1, &event, &count ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "dat_evd_wait failed: status=0x%x", dat_status); return NP_FAILURE; } if ( DAT_CONNECTION_EVENT_DISCONNECTED != event.event_number ) { fprintf(stderr, "Received an unexpected event: %x\n", event.event_number); return NP_FAILURE; } else { fprintf(stderr, "Disconnected.\n"); } } } // free resources if ( DAT_HANDLE_NULL != gEP ) { dat_status = dat_ep_free( gEP ); gEP = DAT_HANDLE_NULL; } if ( DAT_HANDLE_NULL != gPZ ) { dat_status = dat_pz_free(gPZ); gPZ = DAT_HANDLE_NULL; } if ( DAT_HANDLE_NULL != gSendDtoEvd ) { dat_status = dat_evd_free(gSendDtoEvd); gSendDtoEvd = DAT_HANDLE_NULL; } if ( DAT_HANDLE_NULL != gRecvDtoEvd ) { dat_status = dat_evd_free(gRecvDtoEvd); gRecvDtoEvd = DAT_HANDLE_NULL; } if ( DAT_HANDLE_NULL != gConnEvd ) { dat_status = dat_evd_free(gConnEvd); gConnEvd = DAT_HANDLE_NULL; } if ( DAT_HANDLE_NULL != gConnReqEvd ) { dat_status = dat_evd_free(gConnReqEvd); gConnReqEvd = DAT_HANDLE_NULL; } if ( DAT_HANDLE_NULL != gAsyncEvd ) { dat_status = dat_evd_free(gAsyncEvd); gAsyncEvd = DAT_HANDLE_NULL; } if ( DAT_HANDLE_NULL != gCNO ) { dat_status = dat_cno_free(gCNO); gCNO = DAT_HANDLE_NULL; } if ( DAT_HANDLE_NULL != gPSP ) { dat_status = dat_psp_free(gPSP); gPSP = DAT_HANDLE_NULL; } if ( DAT_HANDLE_NULL != gIA ) { dat_status = dat_ia_close(gIA, DAT_CLOSE_ABRUPT_FLAG); gIA = DAT_HANDLE_NULL; } return status; } static int readFully(int fd, void *obuf, int len) { int bytesLeft = len; char *buf = (char *) obuf; int bytesRead = 0; while (bytesLeft > 0 && (bytesRead = read(fd, (void *) buf, bytesLeft)) > 0) { bytesLeft -= bytesRead; buf += bytesRead; } if (bytesRead <= 0) { return bytesRead; } return len; } void Sync(ArgStruct *p) { char s[] = "SyncMe"; char response[7]; if (write(p->commfd, s, strlen(s)) < 0 || readFully(p->commfd, response, strlen(s)) < 0) { perror("NetPIPE: error writing or reading synchronization string"); exit(3); } if (strncmp(s, response, strlen(s))) { fprintf(stderr, "NetPIPE: Synchronization string incorrect!\n"); exit(3); } } void PrepareToReceive(ArgStruct *p) { DAT_RETURN dat_status; DAT_LMR_TRIPLET lmr_triplet; DAT_COMPLETION_FLAGS comp_flags; // Note: Notification suppression is not supported for Receive requests comp_flags = DAT_COMPLETION_DEFAULT_FLAG; // no need to post a receive if doing RDMA Write with local polling if ( ( NP_COMM_RDMAWRITE == p->prot.commtype ) && ( NP_COMP_LOCALPOLL == p->prot.comptype ) ) { return; } // if using RDMA_WRITE with an EVD completion, post the // zero length receive request for the handshake if ( ( NP_COMM_RDMAWRITE == p->prot.commtype ) && ( NP_COMP_EVD == p->prot.comptype ) ) { // post zero length receive for handshake dat_status = dat_ep_post_recv( gEP, 0, NULL, (DAT_DTO_COOKIE)NULL, comp_flags ); } else { lmr_triplet.lmr_context = gRcvLmrContext; lmr_triplet.virtual_address = (uintptr_t)p->r_ptr; lmr_triplet.segment_length = p->bufflen; dat_status = dat_ep_post_recv( gEP, 1, // one entry in iov &lmr_triplet, (DAT_DTO_COOKIE)NULL, comp_flags ); } if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "Error posting receive request: 0x%x\n", dat_status); CleanUp(p); exit(NP_FAILURE); } else { LOGPRINTF("Posted receive request\n"); } } void SendData(ArgStruct *p) { DAT_RETURN dat_status; DAT_LMR_TRIPLET lmr_triplet; DAT_RMR_TRIPLET rmr_triplet; DAT_COMPLETION_FLAGS comp_flags; DAT_RETURN dq_status; DAT_EVENT event; // In uDAPL, when you have requested completion generation & notification // suppression, the completion events of successful requests are suppressed. // However, entries are still consumed on the request queue. Before consuming // all of the request queue entries, you need to request default completion // and process a completion event. By doing so, you cause all of the queue // work queue entries to be freed. As a result, this code tracks the number // of outstanding work requests (gOutReqs) and when it is approaching the // size of the request queue (REQ_QUEUE_SIZE), it requests a default completion // as opposed to a suppressed completion. // Check to see if we need to request a completion notification on the // send operation this time. If so, issue the send with the default completion // Otherwise, issue the send operation requesting the suppression of the // generation of a completion event and the suppression of the notification. if ( gOutReqs >= (REQ_QUEUE_SIZE - 4) ) { comp_flags = DAT_COMPLETION_DEFAULT_FLAG; } else { comp_flags = DAT_COMPLETION_SUPPRESS_FLAG | DAT_COMPLETION_UNSIGNALLED_FLAG; } lmr_triplet.lmr_context = gSndLmrContext; lmr_triplet.virtual_address = (uintptr_t)p->s_ptr; lmr_triplet.segment_length = p->bufflen; if ( NP_COMM_SENDRECV == p->prot.commtype ) { LOGPRINTF("Doing regular send\n"); dat_status = dat_ep_post_send( gEP, 1, // 1 entry in iov &lmr_triplet, (DAT_DTO_COOKIE)NULL, comp_flags ); gOutReqs++; } if ( NP_COMM_RDMAWRITE == p->prot.commtype ) { rmr_triplet.rmr_context = gRemoteKey; rmr_triplet.target_address = (uintptr_t)(gRemoteAddress + (p->s_ptr - p->s_buff)); rmr_triplet.segment_length = p->bufflen; LOGPRINTF("Doing RDMA write (raddr=%p)\n", rmr_triplet.target_address); dat_status = dat_ep_post_rdma_write( gEP, (DAT_COUNT)1, &lmr_triplet, (DAT_DTO_COOKIE)NULL, &rmr_triplet, comp_flags ); gOutReqs++; // if the caller wants to use EVD completion notification instead // of local polling (to illustrate CPU efficiency), send a 0 length // packet as the handshake to indicate rdma_write completion. if ( NP_COMP_EVD == p->prot.comptype ) { dat_status = dat_ep_post_send( gEP, 0, NULL, (DAT_DTO_COOKIE)NULL, comp_flags ); gOutReqs++; } } // If a default completion on this request, spin here until the event // arrives and is dequeued. Usually it only requires three or fewer // passes through the dequeue loop. if ( DAT_COMPLETION_DEFAULT_FLAG == comp_flags ) { do { dq_status = dat_evd_dequeue( gSendDtoEvd, &event ); } while ( DAT_QUEUE_EMPTY == DAT_GET_TYPE(dq_status) ); if ( NP_COMP_EVD == p->prot.comptype ) { do { dq_status = dat_evd_dequeue( gSendDtoEvd, &event ); } while ( DAT_QUEUE_EMPTY == DAT_GET_TYPE(dq_status) ); } gOutReqs = 0; } if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "Error posting send request: 0x%x\n", dat_status); } else { LOGPRINTF("Posted send request\n"); } } void RecvData(ArgStruct *p) { DAT_RETURN dat_status = DAT_SUCCESS; DAT_EVD_HANDLE evd_handle = DAT_HANDLE_NULL; DAT_COUNT count = 0; DAT_EVENT event; LOGPRINTF("Receiving at buffer address %p\n", p->r_ptr); if( NP_COMP_LOCALPOLL == p->prot.comptype ) { /* Poll for receive completion locally on the receive data */ LOGPRINTF("Waiting for last byte of data to arrive\n"); while(p->r_ptr[p->bufflen-1] != 'a' + (p->cache ? 1 - p->tr : 1) ) { // BUSY WAIT -- this should be fine since we // declared r_ptr with volatile qualifier } /* Reset last byte */ p->r_ptr[p->bufflen-1] = 'a' + (p->cache ? p->tr : 0); if (NP_COMM_RDMAWRITE != p->prot.commtype) { dat_status = dat_evd_dequeue( gRecvDtoEvd, &event ); } LOGPRINTF("Received all of data\n"); } else if( p->prot.comptype == NP_COMP_DQPOLL ) { /* Poll for receive completion using uDAPL Dequeue function */ LOGPRINTF("Polling EVD via Dequeue for work completion\n"); dat_status = DAT_QUEUE_EMPTY; while ( dat_status != DAT_SUCCESS ) { dat_status = dat_evd_dequeue( gRecvDtoEvd, &event ); } if ( DAT_DTO_COMPLETION_EVENT != event.event_number ) { fprintf(stderr, "Unexpected completion event: %d\n", event.event_number); exit(NP_FAILURE); } LOGPRINTF("Retrieved successful completion\n"); } else if( NP_COMP_EVD == p->prot.comptype ) { /* * Instead of polling directly on data or event dispatcher queue, * wait on the EVD to get the completion event. */ LOGPRINTF("Waiting on the EVD\n"); dat_status = dat_evd_wait( gRecvDtoEvd, DAT_TIMEOUT_INFINITE, 1, &event, &count ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "Error in RecvData, waiting on EVD for completion: %d\n", dat_status); exit(NP_FAILURE); } if ( DAT_DTO_COMPLETION_EVENT != event.event_number ) { fprintf(stderr, "Unexpected completion event: %d\n", event.event_number); exit(NP_FAILURE); } LOGPRINTF("Receive completed\n"); } else if ( NP_COMP_CNO == p->prot.comptype ) { LOGPRINTF("Waiting on the CNO\n"); dat_status = dat_cno_wait( gCNO, DAT_TIMEOUT_INFINITE, &evd_handle ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "Error in RecvData, waiting on CNO for completion: %d\n", dat_status); exit(NP_FAILURE); } dat_status = dat_evd_dequeue( gRecvDtoEvd, &event ); while ( DAT_SUCCESS != dat_status ) { dat_status = dat_evd_dequeue( gRecvDtoEvd, &event ); } if ( DAT_DTO_COMPLETION_EVENT != event.event_number ) { fprintf(stderr, "Unexpected completion event: %d\n", event.event_number); exit(NP_FAILURE); } } } /* Reset is used after a trial to empty the work request queues so we have enough room for the next trial to run */ void Reset(ArgStruct *p) { DAT_RETURN dat_status; DAT_EVENT event; LOGPRINTF("Posting recv request in Reset\n"); /* Post Receive */ dat_status = dat_ep_post_recv( gEP, 0, NULL, (DAT_DTO_COOKIE)NULL, DAT_COMPLETION_DEFAULT_FLAG ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, " Error posting recv request: %d\n", dat_status); CleanUp(p); exit(NP_FAILURE); } /* Make sure both nodes have preposted receives */ Sync(p); LOGPRINTF("Posting send request \n"); /* Post Send */ dat_status = dat_ep_post_send( gEP, 0, NULL, (DAT_DTO_COOKIE)NULL, DAT_COMPLETION_DEFAULT_FLAG ); gOutReqs++; if( DAT_SUCCESS != dat_status ) { fprintf(stderr, " Error posting send request in Reset: %d\n", dat_status); exit(NP_FAILURE); } LOGPRINTF("Polling for completion of send request\n"); dat_status = DAT_QUEUE_EMPTY; while ( DAT_SUCCESS != dat_status ) { dat_status = dat_evd_dequeue( gSendDtoEvd, &event ); } if( DAT_DTO_COMPLETION_EVENT != event.event_number ) { fprintf(stderr, "Unexpected event when polling EVD: %d\n", event.event_number); exit(NP_FAILURE); } LOGPRINTF("Status of send completion: %d\n", dat_status); LOGPRINTF("Polling for completion of receive request\n"); dat_status = DAT_QUEUE_EMPTY; while ( DAT_SUCCESS != dat_status ) { dat_status = dat_evd_dequeue( gRecvDtoEvd, &event ); } if( DAT_DTO_COMPLETION_EVENT != event.event_number ) { fprintf(stderr, "Unexpected event when polling EVD: %d\n", event.event_number); exit(NP_FAILURE); } LOGPRINTF("Status of recv completion: %d\n", dat_status); LOGPRINTF("Done with reset\n"); } void SendTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; /* Multiply the number of seconds by 1e6 to get time in microseconds and convert value to an unsigned 32-bit integer. */ ltime = (uint32_t)(*t * 1.e6); /* Send time in network order */ ntime = htonl(ltime); if (write(p->commfd, (char *)&ntime, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendTime: errno=%d\n", errno); exit(301); } } void RecvTime(ArgStruct *p, double *t) { uint32_t ltime, ntime; int bytesRead; bytesRead = readFully(p->commfd, (void *)&ntime, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvTime: errno=%d\n", errno); exit(302); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvTime of %d bytes\n", bytesRead); exit(303); } ltime = ntohl(ntime); /* Result is ltime (in microseconds) divided by 1.0e6 to get seconds */ *t = (double)ltime / 1.0e6; } void SendRepeat(ArgStruct *p, int rpt) { uint32_t lrpt, nrpt; lrpt = rpt; /* Send repeat count as a long in network order */ nrpt = htonl(lrpt); if (write(p->commfd, (void *) &nrpt, sizeof(uint32_t)) < 0) { printf("NetPIPE: write failed in SendRepeat: errno=%d\n", errno); exit(304); } } void RecvRepeat(ArgStruct *p, int *rpt) { uint32_t lrpt, nrpt; int bytesRead; bytesRead = readFully(p->commfd, (void *)&nrpt, sizeof(uint32_t)); if (bytesRead < 0) { printf("NetPIPE: read failed in RecvRepeat: errno=%d\n", errno); exit(305); } else if (bytesRead != sizeof(uint32_t)) { fprintf(stderr, "NetPIPE: partial read in RecvRepeat of %d bytes\n", bytesRead); exit(306); } lrpt = ntohl(nrpt); *rpt = lrpt; } void establish(ArgStruct *p) { int clen; struct protoent; clen = sizeof(p->prot.sin2); if(p->tr){ if(connect(p->commfd, (struct sockaddr *) &(p->prot.sin1), sizeof(p->prot.sin1)) < 0){ printf("Client: Cannot Connect! errno=%d\n",errno); exit(-10); } } else { /* SERVER */ listen(p->servicefd, 5); p->commfd = accept(p->servicefd, (struct sockaddr *) &(p->prot.sin2), &clen); if(p->commfd < 0){ printf("Server: Accept Failed! errno=%d\n",errno); exit(-12); } } } void CleanUp(ArgStruct *p) { char *quit="QUIT"; if (p->tr) { write(p->commfd,quit, 5); read(p->commfd, quit, 5); close(p->commfd); } else { read(p->commfd,quit, 5); write(p->commfd,quit,5); close(p->commfd); close(p->servicefd); } finalize_uDAPL(p); } void AfterAlignmentInit(ArgStruct *p) { int bytesRead; /* Exchange buffer pointers and remote infiniband keys if doing rdma. Do * the exchange in this function because this will happen after any * memory alignment is done, which is important for getting the * correct remote address. */ if( p->prot.commtype == NP_COMM_RDMAWRITE ) { /* Send my receive buffer address */ if(write(p->commfd, (void *)&p->r_buff, sizeof(void*)) < 0) { perror("NetPIPE: write of buffer address failed in AfterAlignmentInit"); exit(-1); } LOGPRINTF("Sent buffer address: %p\n", p->r_buff); /* Send my remote key for accessing * my remote buffer via IB RDMA */ if(write(p->commfd, (void *)&gRcvRmrContext, sizeof(DAT_RMR_CONTEXT)) < 0) { perror("NetPIPE: write of remote key failed in AfterAlignmentInit"); exit(-1); } LOGPRINTF("Sent remote key: %d\n", gRcvRmrContext); /* Read the sent data */ bytesRead = readFully(p->commfd, (void *)&gRemoteAddress, sizeof(void*)); if (bytesRead < 0) { perror("NetPIPE: read of buffer address failed in AfterAlignmentInit"); exit(-1); } else if (bytesRead != sizeof(void*)) { perror("NetPIPE: partial read of buffer address in AfterAlignmentInit"); exit(-1); } LOGPRINTF("Received remote address from other node: %p\n", gRemoteAddress); bytesRead = readFully(p->commfd, (void *)&gRemoteKey, sizeof(DAT_RMR_CONTEXT)); if (bytesRead < 0) { perror("NetPIPE: read of remote key failed in AfterAlignmentInit"); exit(-1); } else if (bytesRead != sizeof(DAT_RMR_CONTEXT)) { perror("NetPIPE: partial read of remote key in AfterAlignmentInit"); exit(-1); } LOGPRINTF("Received remote key from other node: %d\n", gRemoteKey); } } void MyMalloc(ArgStruct *p, int bufflen, int soffset, int roffset) { DAT_RETURN dat_status; /* Allocate buffers */ p->r_buff = malloc(bufflen+MAX(soffset,roffset)); if(p->r_buff == NULL) { fprintf(stderr, "Error malloc'ing buffer\n"); exit(NP_FAILURE); } if(p->cache) { /* Infiniband spec says we can register same memory region * more than once, so just copy buffer address. We will register * the same buffer twice with Infiniband. */ p->s_buff = p->r_buff; } else { p->s_buff = malloc(bufflen+soffset); if(p->s_buff == NULL) { fprintf(stderr, "Error malloc'ing buffer\n"); exit(NP_FAILURE); } } /* Register buffers with uDAPL */ // register receive buffer gRegion.for_va = p->r_buff; dat_status = dat_lmr_create( gIA, DAT_MEM_TYPE_VIRTUAL, gRegion, bufflen+MAX(soffset,roffset), gPZ, DAT_MEM_PRIV_READ_FLAG | DAT_MEM_PRIV_WRITE_FLAG | DAT_MEM_PRIV_REMOTE_WRITE_FLAG, &gRcvLmrHandle, &gRcvLmrContext, &gRcvRmrContext, NULL, NULL ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "Error registering receive buffer: 0x%x\n", dat_status); exit(NP_FAILURE); } else { LOGPRINTF("Registered Receive Buffer\n"); } // register send buffer gRegion.for_va = p->s_buff; dat_status = dat_lmr_create( gIA, DAT_MEM_TYPE_VIRTUAL, gRegion, bufflen+soffset, gPZ, DAT_MEM_PRIV_READ_FLAG | DAT_MEM_PRIV_WRITE_FLAG, &gSndLmrHandle, &gSndLmrContext, NULL, NULL, NULL ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "Error registering send buffer: 0x%x\n", dat_status); exit(NP_FAILURE); } else { LOGPRINTF("Registered Send Buffer\n"); } } void FreeBuff(char *buff1, char *buff2) { DAT_RETURN dat_status; if ( DAT_HANDLE_NULL != gSndLmrHandle ) { LOGPRINTF("Deregistering send buffer\n"); dat_status = dat_lmr_free( gSndLmrHandle ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "Error deregistering Send Memory Region: 0x%x\n", dat_status); } else { gSndLmrHandle = DAT_HANDLE_NULL; } } if ( DAT_HANDLE_NULL != gRcvLmrHandle ) { LOGPRINTF("Deregistering receive buffer\n"); dat_status = dat_lmr_free( gRcvLmrHandle ); if ( DAT_SUCCESS != dat_status ) { fprintf(stderr, "Error deregistering Receive Memory Region: 0x%x\n", dat_status); } else { gRcvLmrHandle = DAT_HANDLE_NULL; } } if( NULL != buff1 ) { free(buff1); } if( NULL != buff2 ) { free(buff2); } } NetPIPE-3.7.2/src/vmsplice.c0000644000000000000000000002337511433312522015654 0ustar00usergroup00000000000000/*****************************************************************************/ /* "NetPIPE" -- Network Protocol Independent Performance Evaluator. */ /* Copyright 1997, 1998 Iowa State University Research Foundation, Inc. */ /* */ /* This program is free software; you can redistribute it and/or modify */ /* it under the terms of the GNU General Public License as published by */ /* the Free Software Foundation. You should have received a copy of the */ /* GNU General Public License along with this program; if not, write to the */ /* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* */ /* * vmsplice.c ---- vmsplice */ /*****************************************************************************/ #include "netpipe.h" #define _GNU_SOURCE #include #include #include #include #include #include #include static int pipe_to_child[2]; static int pipe_to_parent[2]; static int vmsplice_to_child[2]; static int vmsplice_to_parent[2]; static char *fcontrol_to_parent = NULL, *fcontrol_to_child = NULL; static char *fdata_to_parent = NULL, *fdata_to_child = NULL; /* Don't know if this is hard-coded in the kernel or not */ const int MAX_VMSPLICE_SIZE = 65536; static void despair(const char *msg) { fprintf(stderr, "%s Aborting in despair.\n", msg); CleanUp(NULL); exit(1); } static void sig_handler(int sig) { CleanUp(NULL); } static void pipe_send(int *fd, void *buf, size_t len) { int ret; char *start = (char*) buf; while (1) { ret = write(fd[1], start, len); if (0 == ret) { despair("Netpipe wrote 0 bytes down a pipe."); } else if (ret > 0) { len -= ret; start += ret; if (0 == len) { return; } } else { despair("Netpipe got an error writing down a pipe."); } } } static void pipe_recv(int *fd, void *buf, size_t len) { int ret; char *start = (char*) buf; while (1) { ret = read(fd[0], start, len); if (0 == ret) { despair("Netpipe read 0 bytes down a pipe."); exit(1); } else if (ret > 0) { len -= ret; start += ret; if (0 == len) { return; } } else { despair("Netpipe got an error reading from a pipe; that shouldn't happen."); } } } void Init(ArgStruct *p, int* pargc, char*** pargv) { /* Install a signal handler to remove all stale fifos if someone hits ctrl-c */ signal(SIGHUP, sig_handler); signal(SIGINT, sig_handler); } void Setup(ArgStruct *p) { pid_t pid; const char *base = "NPknem.vmsplice"; const char *child_suffix = "to-child"; const char *parent_suffix = "to-parent"; int need_fork = 0, am_parent = 0; /* If no filename was specified, then we're the parent until we fork */ if (NULL == p->host) { am_parent = 1; need_fork = 1; } /* If the file was specified, see if all 4 files exist. If it does, then we're the parent. Otherwise, we're the "child". */ else { int ret; struct stat sbuf; base = p->host; need_fork = 0; asprintf(&fcontrol_to_parent, "%s.control-%s", base, parent_suffix); asprintf(&fcontrol_to_child, "%s.control-%s", base, child_suffix); asprintf(&fdata_to_parent, "%s.data-%s", base, parent_suffix); asprintf(&fdata_to_child, "%s.data-%s", base, child_suffix); if (0 == stat(fcontrol_to_parent, &sbuf) && 0 == stat(fcontrol_to_child, &sbuf) && 0 == stat(fdata_to_parent, &sbuf) && 0 == stat(fdata_to_child, &sbuf)) { am_parent = 0; } else { unlink(fcontrol_to_parent); unlink(fcontrol_to_child); unlink(fdata_to_parent); unlink(fdata_to_child); am_parent = 1; } } /* If we can fork, then it's easy to just create pipes between parent and child */ if (need_fork) { if (pipe(pipe_to_child) < 0 || pipe(pipe_to_parent) < 0 || pipe(vmsplice_to_child) < 0 || pipe(vmsplice_to_parent) < 0) { despair("Netpipe failed to create a pipe."); } /* Now fork the child and reset transmitter / receiver flags as appropriate */ if (0 == fork()) { /* CHILD */ p->rcv = 1; p->tr = 0; /* Close the relevant ends of pipes */ close(pipe_to_child[1]); close(pipe_to_parent[0]); close(vmsplice_to_child[1]); close(vmsplice_to_parent[0]); } else { /* PARENT */ p->rcv = 0; p->tr = 1; /* Close the relevant ends of pipes */ close(pipe_to_child[0]); close(pipe_to_parent[1]); close(vmsplice_to_child[0]); close(vmsplice_to_parent[1]); } } /* Otherwise, we have unrelated processes. So open up several named pipes. */ else { if (am_parent) { /* Parent */ p->rcv = 0; p->tr = 1; if (mkfifo(fcontrol_to_parent, 0600) < 0 || mkfifo(fcontrol_to_child, 0600) < 0 || mkfifo(fdata_to_parent, 0600) < 0 || mkfifo(fdata_to_child, 0600) < 0) { /* This is where people typically hit ctrl-c, so don't print an error in this case */ if (EINTR == errno) { exit(0); } despair("Netpipe was unable to create a named pipe."); } if ((pipe_to_parent[0] = open(fcontrol_to_parent, O_RDONLY)) < 0 || (pipe_to_child[1] = open(fcontrol_to_child, O_WRONLY)) < 0 || (vmsplice_to_parent[0] = open(fdata_to_parent, O_RDONLY)) < 0 || (vmsplice_to_child[1] = open(fdata_to_child, O_WRONLY)) < 0) { /* This is where people typically hit ctrl-c, so don't print an error in this case */ if (ENOENT == errno || EINTR == errno) { exit(0); } despair("Netpipe was unable to open parent ends of the named pipes."); } } else { /* Child */ p->rcv = 1; p->tr = 0; if ((pipe_to_parent[1] = open(fcontrol_to_parent, O_WRONLY)) < 0 || (pipe_to_child[0] = open(fcontrol_to_child, O_RDONLY)) < 0 || (vmsplice_to_parent[1] = open(fdata_to_parent, O_WRONLY)) < 0 || (vmsplice_to_child[0] = open(fdata_to_child, O_RDONLY)) < 0) { despair("Netpipe was unable to open child ends of the named pipes."); } } } printf("All pipes opened\n"); return; } void Sync(ArgStruct *p) { int bogus; /* Parent */ if (p->tr) { pipe_send(pipe_to_child, &bogus, sizeof(bogus)); pipe_recv(pipe_to_parent, &bogus, sizeof(bogus)); } /* Child */ else { pipe_recv(pipe_to_child, &bogus, sizeof(bogus)); pipe_send(pipe_to_parent, &bogus, sizeof(bogus)); } } void PrepareToReceive(ArgStruct *p) { } void SendData(ArgStruct *p) { long ret; int fd = p->tr ? vmsplice_to_child[1] : vmsplice_to_parent[1]; int left = p->bufflen; struct iovec v = { .iov_base = p->s_ptr, .iov_len = p->bufflen }; /* Can only vmsplice 64k at a time -- don't know if this is a hard-coded limit or not */ while (left > 0) { v.iov_len = left > MAX_VMSPLICE_SIZE ? MAX_VMSPLICE_SIZE : left; if (vmsplice(fd, &v, 1, 0) != v.iov_len) { despair("Netpipe failed to vmsplice."); } left -= v.iov_len; v.iov_base += v.iov_len; } } void RecvData(ArgStruct *p) { int fd = p->tr ? vmsplice_to_parent[0] : vmsplice_to_child[0]; int len, left = p->bufflen; char *dest = p->r_ptr; /* Can only vmsplice 64k at a time */ while (left > 0) { len = left > MAX_VMSPLICE_SIZE ? MAX_VMSPLICE_SIZE : left; if (read(fd, dest, len) != len) { despair("Netpipe failed to read bytes from the vmsplice."); } left -= len; dest += len; } } void SendTime(ArgStruct *p, double *t) { /* Only child calls SendTime */ pipe_send(pipe_to_parent, t, sizeof(*t)); } void RecvTime(ArgStruct *p, double *t) { /* Only parent calls RecvTime */ pipe_recv(pipe_to_parent, t, sizeof(*t)); } void SendRepeat(ArgStruct *p, int rpt) { /* Only parent calls SendRepeat */ pipe_send(pipe_to_child, &rpt, sizeof(rpt)); } void RecvRepeat(ArgStruct *p, int *rpt) { /* Only child calls RecvRepeat */ pipe_recv(pipe_to_child, rpt, sizeof(*rpt)); } void CleanUp(ArgStruct *p) { close(pipe_to_parent[0]); close(pipe_to_parent[1]); close(pipe_to_child[0]); close(pipe_to_child[1]); close(vmsplice_to_parent[0]); close(vmsplice_to_parent[1]); close(vmsplice_to_child[0]); close(vmsplice_to_child[1]); /* Don't leave stale fifos around */ if (NULL != fcontrol_to_parent) { unlink(fcontrol_to_parent); } if (NULL != fcontrol_to_child) { unlink(fcontrol_to_child); } if (NULL != fdata_to_parent) { unlink(fdata_to_parent); } if (NULL != fdata_to_child) { unlink(fdata_to_child); } } void Reset(ArgStruct *p) { } void AfterAlignmentInit(ArgStruct *p) { }