Return-Path: Delivered-To: apmail-zookeeper-commits-archive@www.apache.org Received: (qmail 75994 invoked from network); 5 Apr 2011 05:40:15 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 5 Apr 2011 05:40:15 -0000 Received: (qmail 74972 invoked by uid 500); 5 Apr 2011 02:50:13 -0000 Delivered-To: apmail-zookeeper-commits-archive@zookeeper.apache.org Received: (qmail 74918 invoked by uid 500); 5 Apr 2011 02:50:13 -0000 Mailing-List: contact commits-help@zookeeper.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ Delivered-To: mailing list commits@zookeeper.apache.org Received: (qmail 74851 invoked by uid 99); 5 Apr 2011 02:50:13 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 05 Apr 2011 02:50:13 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 05 Apr 2011 02:50:10 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 53A6D2388CAA; Tue, 5 Apr 2011 02:48:31 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: svn commit: r787995 [39/39] - in /websites/staging/zookeeper/trunk/content/doc/current: ./ api/ api/org/ api/org/apache/ api/org/apache/zookeeper/ api/org/apache/zookeeper/class-use/ api/org/apache/zookeeper/data/ api/org/apache/zookeeper/data/class-us... Date: Tue, 05 Apr 2011 02:48:27 -0000 To: commits@zookeeper.apache.org From: buildbot@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110405024831.53A6D2388CAA@eris.apache.org> Added: websites/staging/zookeeper/trunk/content/doc/current/zookeeperTutorial.html ============================================================================== --- websites/staging/zookeeper/trunk/content/doc/current/zookeeperTutorial.html (added) +++ websites/staging/zookeeper/trunk/content/doc/current/zookeeperTutorial.html Tue Apr 5 02:48:22 2011 @@ -0,0 +1,892 @@ + + + + + + + +Programming with ZooKeeper - A basic tutorial + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + +
+
+
+
+ +
+ + +
+ +
+ +   +
+ + + + + +
+ +

Programming with ZooKeeper - A basic tutorial

+ + + + + + + +

Introduction

+
+

In this tutorial, we show simple implementations of barriers and + producer-consumer queues using ZooKeeper. We call the respective classes Barrier and Queue. + These examples assume that you have at least one ZooKeeper server running.

+

Both primitives use the following common excerpt of code:

+
+    static ZooKeeper zk = null;
+    static Integer mutex;
+
+    String root;
+
+    SyncPrimitive(String address) {
+        if(zk == null){
+            try {
+                System.out.println("Starting ZK:");
+                zk = new ZooKeeper(address, 3000, this);
+                mutex = new Integer(-1);
+                System.out.println("Finished starting ZK: " + zk);
+            } catch (IOException e) {
+                System.out.println(e.toString());
+                zk = null;
+            }
+        }
+    }
+
+    synchronized public void process(WatchedEvent event) {
+        synchronized (mutex) {
+            mutex.notify();
+        }
+    }
+
+

Both classes extend SyncPrimitive. In this way, we execute steps that are +common to all primitives in the constructor of SyncPrimitive. To keep the examples +simple, we create a ZooKeeper object the first time we instantiate either a barrier +object or a queue object, and we declare a static variable that is a reference +to this object. The subsequent instances of Barrier and Queue check whether a +ZooKeeper object exists. Alternatively, we could have the application creating a +ZooKeeper object and passing it to the constructor of Barrier and Queue.

+

+We use the process() method to process notifications triggered due to watches. +In the following discussion, we present code that sets watches. A watch is internal +structure that enables ZooKeeper to notify a client of a change to a node. For example, +if a client is waiting for other clients to leave a barrier, then it can set a watch and +wait for modifications to a particular node, which can indicate that it is the end of the wait. +This point becomes clear once we go over the examples. +

+
+ + + +

Barriers

+
+

+ A barrier is a primitive that enables a group of processes to synchronize the + beginning and the end of a computation. The general idea of this implementation + is to have a barrier node that serves the purpose of being a parent for individual + process nodes. Suppose that we call the barrier node "/b1". Each process "p" then + creates a node "/b1/p". Once enough processes have created their corresponding + nodes, joined processes can start the computation. +

+

In this example, each process instantiates a Barrier object, and its constructor takes as parameters:

+
    +
  • +

    the address of a ZooKeeper server (e.g., "zoo1.foo.com:2181")

    +
  • + +
  • +

    the path of the barrier node on ZooKeeper (e.g., "/b1")

    +
  • + +
  • +

    the size of the group of processes

    +
  • + +
+

The constructor of Barrier passes the address of the Zookeeper server to the +constructor of the parent class. The parent class creates a ZooKeeper instance if +one does not exist. The constructor of Barrier then creates a +barrier node on ZooKeeper, which is the parent node of all process nodes, and +we call root (Note: This is not the ZooKeeper root "/").

+
+        /**
+         * Barrier constructor
+         *
+         * @param address
+         * @param root
+         * @param size
+         */
+        Barrier(String address, String root, int size) {
+            super(address);
+            this.root = root;
+            this.size = size;
+
+            // Create barrier node
+            if (zk != null) {
+                try {
+                    Stat s = zk.exists(root, false);
+                    if (s == null) {
+                        zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,
+                                CreateMode.PERSISTENT);
+                    }
+                } catch (KeeperException e) {
+                    System.out
+                            .println("Keeper exception when instantiating queue: "
+                                    + e.toString());
+                } catch (InterruptedException e) {
+                    System.out.println("Interrupted exception");
+                }
+            }
+
+            // My node name
+            try {
+                name = new String(InetAddress.getLocalHost().getCanonicalHostName().toString());
+            } catch (UnknownHostException e) {
+                System.out.println(e.toString());
+            }
+
+        }
+
+

+To enter the barrier, a process calls enter(). The process creates a node under +the root to represent it, using its host name to form the node name. It then wait +until enough processes have entered the barrier. A process does it by checking +the number of children the root node has with "getChildren()", and waiting for +notifications in the case it does not have enough. To receive a notification when +there is a change to the root node, a process has to set a watch, and does it +through the call to "getChildren()". In the code, we have that "getChildren()" +has two parameters. The first one states the node to read from, and the second is +a boolean flag that enables the process to set a watch. In the code the flag is true. +

+
+        /**
+         * Join barrier
+         *
+         * @return
+         * @throws KeeperException
+         * @throws InterruptedException
+         */
+
+        boolean enter() throws KeeperException, InterruptedException{
+            zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE,
+                    CreateMode.EPHEMERAL_SEQUENTIAL);
+            while (true) {
+                synchronized (mutex) {
+                    List<String> list = zk.getChildren(root, true);
+
+                    if (list.size() < size) {
+                        mutex.wait();
+                    } else {
+                        return true;
+                    }
+                }
+            }
+        }
+
+

+Note that enter() throws both KeeperException and InterruptedException, so it is +the reponsability of the application to catch and handle such exceptions.

+

+Once the computation is finished, a process calls leave() to leave the barrier. +First it deletes its corresponding node, and then it gets the children of the root +node. If there is at least one child, then it waits for a notification (obs: note +that the second parameter of the call to getChildren() is true, meaning that +ZooKeeper has to set a watch on the the root node). Upon reception of a notification, +it checks once more whether the root node has any child.

+
+        /**
+         * Wait until all reach barrier
+         *
+         * @return
+         * @throws KeeperException
+         * @throws InterruptedException
+         */
+
+        boolean leave() throws KeeperException, InterruptedException{
+            zk.delete(root + "/" + name, 0);
+            while (true) {
+                synchronized (mutex) {
+                    List<String> list = zk.getChildren(root, true);
+                        if (list.size() > 0) {
+                            mutex.wait();
+                        } else {
+                            return true;
+                        }
+                    }
+                }
+        }
+    }
+
+
+ + +

Producer-Consumer Queues

+
+

+A producer-consumer queue is a distributed data estructure thata group of processes +use to generate and consume items. Producer processes create new elements and add +them to the queue. Consumer processes remove elements from the list, and process them. +In this implementation, the elements are simple integers. The queue is represented +by a root node, and to add an element to the queue, a producer process creates a new node, +a child of the root node. +

+

+The following excerpt of code corresponds to the constructor of the object. As +with Barrier objects, it first calls the constructor of the parent class, SyncPrimitive, +that creates a ZooKeeper object if one doesn't exist. It then verifies if the root +node of the queue exists, and creates if it doesn't. +

+
+        /**
+         * Constructor of producer-consumer queue
+         *
+         * @param address
+         * @param name
+         */
+        Queue(String address, String name) {
+            super(address);
+            this.root = name;
+            // Create ZK node name
+            if (zk != null) {
+                try {
+                    Stat s = zk.exists(root, false);
+                    if (s == null) {
+                        zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,
+                                CreateMode.PERSISTENT);
+                    }
+                } catch (KeeperException e) {
+                    System.out
+                            .println("Keeper exception when instantiating queue: "
+                                    + e.toString());
+                } catch (InterruptedException e) {
+                    System.out.println("Interrupted exception");
+                }
+            }
+        }
+
+

+A producer process calls "produce()" to add an element to the queue, and passes +an integer as an argument. To add an element to the queue, the method creates a +new node using "create()", and uses the SEQUENCE flag to instruct ZooKeeper to +append the value of the sequencer counter associated to the root node. In this way, +we impose a total order on the elements of the queue, thus guaranteeing that the +oldest element of the queue is the next one consumed. +

+
+        /**
+         * Add element to the queue.
+         *
+         * @param i
+         * @return
+         */
+
+        boolean produce(int i) throws KeeperException, InterruptedException{
+            ByteBuffer b = ByteBuffer.allocate(4);
+            byte[] value;
+
+            // Add child with value i
+            b.putInt(i);
+            value = b.array();
+            zk.create(root + "/element", value, Ids.OPEN_ACL_UNSAFE,
+                        CreateMode.PERSISTENT_SEQUENTIAL);
+
+            return true;
+        }
+
+

+To consume an element, a consumer process obtains the children of the root node, +reads the node with smallest counter value, and returns the element. Note that +if there is a conflict, then one of the two contending processes won't be able to +delete the node and the delete operation will throw an exception.

+

+A call to getChildren() returns the list of children in lexicographic order. +As lexicographic order does not necessary follow the numerical order of the counter +values, we need to decide which element is the smallest. To decide which one has +the smallest counter value, we traverse the list, and remove the prefix "element" +from each one.

+
+        /**
+         * Remove first element from the queue.
+         *
+         * @return
+         * @throws KeeperException
+         * @throws InterruptedException
+         */
+        int consume() throws KeeperException, InterruptedException{
+            int retvalue = -1;
+            Stat stat = null;
+
+            // Get the first element available
+            while (true) {
+                synchronized (mutex) {
+                    List<String> list = zk.getChildren(root, true);
+                    if (list.size() == 0) {
+                        System.out.println("Going to wait");
+                        mutex.wait();
+                    } else {
+                        Integer min = new Integer(list.get(0).substring(7));
+                        for(String s : list){
+                            Integer tempValue = new Integer(s.substring(7));
+                            //System.out.println("Temporary value: " + tempValue);
+                            if(tempValue < min) min = tempValue;
+                        }
+                        System.out.println("Temporary value: " + root + "/element" + min);
+                        byte[] b = zk.getData(root + "/element" + min,
+                                    false, stat);
+                        zk.delete(root + "/element" + min, 0);
+                        ByteBuffer buffer = ByteBuffer.wrap(b);
+                        retvalue = buffer.getInt();
+
+                        return retvalue;
+                    }
+                }
+            }
+        }
+    }
+
+
+ + +

Complete Source Listing

+
+
+
SyncPrimitive.Java
+
+ +SyncPrimitive.Java + +
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.Random;
+
+import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.WatchedEvent;
+import org.apache.zookeeper.Watcher;
+import org.apache.zookeeper.ZooKeeper;
+import org.apache.zookeeper.ZooDefs.Ids;
+import org.apache.zookeeper.data.Stat;
+
+public class SyncPrimitive implements Watcher {
+
+    static ZooKeeper zk = null;
+    static Integer mutex;
+
+    String root;
+
+    SyncPrimitive(String address) {
+        if(zk == null){
+            try {
+                System.out.println("Starting ZK:");
+                zk = new ZooKeeper(address, 3000, this);
+                mutex = new Integer(-1);
+                System.out.println("Finished starting ZK: " + zk);
+            } catch (IOException e) {
+                System.out.println(e.toString());
+                zk = null;
+            }
+        }
+        //else mutex = new Integer(-1);
+    }
+
+    synchronized public void process(WatchedEvent event) {
+        synchronized (mutex) {
+            //System.out.println("Process: " + event.getType());
+            mutex.notify();
+        }
+    }
+
+    /**
+     * Barrier
+     */
+    static public class Barrier extends SyncPrimitive {
+        int size;
+        String name;
+
+        /**
+         * Barrier constructor
+         *
+         * @param address
+         * @param root
+         * @param size
+         */
+        Barrier(String address, String root, int size) {
+            super(address);
+            this.root = root;
+            this.size = size;
+
+            // Create barrier node
+            if (zk != null) {
+                try {
+                    Stat s = zk.exists(root, false);
+                    if (s == null) {
+                        zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,
+                                CreateMode.PERSISTENT);
+                    }
+                } catch (KeeperException e) {
+                    System.out
+                            .println("Keeper exception when instantiating queue: "
+                                    + e.toString());
+                } catch (InterruptedException e) {
+                    System.out.println("Interrupted exception");
+                }
+            }
+
+            // My node name
+            try {
+                name = new String(InetAddress.getLocalHost().getCanonicalHostName().toString());
+            } catch (UnknownHostException e) {
+                System.out.println(e.toString());
+            }
+
+        }
+
+        /**
+         * Join barrier
+         *
+         * @return
+         * @throws KeeperException
+         * @throws InterruptedException
+         */
+
+        boolean enter() throws KeeperException, InterruptedException{
+            zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE,
+                    CreateMode.EPHEMERAL_SEQUENTIAL);
+            while (true) {
+                synchronized (mutex) {
+                    List<String> list = zk.getChildren(root, true);
+
+                    if (list.size() < size) {
+                        mutex.wait();
+                    } else {
+                        return true;
+                    }
+                }
+            }
+        }
+
+        /**
+         * Wait until all reach barrier
+         *
+         * @return
+         * @throws KeeperException
+         * @throws InterruptedException
+         */
+
+        boolean leave() throws KeeperException, InterruptedException{
+            zk.delete(root + "/" + name, 0);
+            while (true) {
+                synchronized (mutex) {
+                    List<String> list = zk.getChildren(root, true);
+                        if (list.size() > 0) {
+                            mutex.wait();
+                        } else {
+                            return true;
+                        }
+                    }
+                }
+        }
+    }
+
+    /**
+     * Producer-Consumer queue
+     */
+    static public class Queue extends SyncPrimitive {
+
+        /**
+         * Constructor of producer-consumer queue
+         *
+         * @param address
+         * @param name
+         */
+        Queue(String address, String name) {
+            super(address);
+            this.root = name;
+            // Create ZK node name
+            if (zk != null) {
+                try {
+                    Stat s = zk.exists(root, false);
+                    if (s == null) {
+                        zk.create(root, new byte[0], Ids.OPEN_ACL_UNSAFE,
+                                CreateMode.PERSISTENT);
+                    }
+                } catch (KeeperException e) {
+                    System.out
+                            .println("Keeper exception when instantiating queue: "
+                                    + e.toString());
+                } catch (InterruptedException e) {
+                    System.out.println("Interrupted exception");
+                }
+            }
+        }
+
+        /**
+         * Add element to the queue.
+         *
+         * @param i
+         * @return
+         */
+
+        boolean produce(int i) throws KeeperException, InterruptedException{
+            ByteBuffer b = ByteBuffer.allocate(4);
+            byte[] value;
+
+            // Add child with value i
+            b.putInt(i);
+            value = b.array();
+            zk.create(root + "/element", value, Ids.OPEN_ACL_UNSAFE,
+                        CreateMode.PERSISTENT_SEQUENTIAL);
+
+            return true;
+        }
+
+
+        /**
+         * Remove first element from the queue.
+         *
+         * @return
+         * @throws KeeperException
+         * @throws InterruptedException
+         */
+        int consume() throws KeeperException, InterruptedException{
+            int retvalue = -1;
+            Stat stat = null;
+
+            // Get the first element available
+            while (true) {
+                synchronized (mutex) {
+                    List<String> list = zk.getChildren(root, true);
+                    if (list.size() == 0) {
+                        System.out.println("Going to wait");
+                        mutex.wait();
+                    } else {
+                        Integer min = new Integer(list.get(0).substring(7));
+                        for(String s : list){
+                            Integer tempValue = new Integer(s.substring(7));
+                            //System.out.println("Temporary value: " + tempValue);
+                            if(tempValue < min) min = tempValue;
+                        }
+                        System.out.println("Temporary value: " + root + "/element" + min);
+                        byte[] b = zk.getData(root + "/element" + min,
+                                    false, stat);
+                        zk.delete(root + "/element" + min, 0);
+                        ByteBuffer buffer = ByteBuffer.wrap(b);
+                        retvalue = buffer.getInt();
+
+                        return retvalue;
+                    }
+                }
+            }
+        }
+    }
+
+    public static void main(String args[]) {
+        if (args[0].equals("qTest"))
+            queueTest(args);
+        else
+            barrierTest(args);
+
+    }
+
+    public static void queueTest(String args[]) {
+        Queue q = new Queue(args[1], "/app1");
+
+        System.out.println("Input: " + args[1]);
+        int i;
+        Integer max = new Integer(args[2]);
+
+        if (args[3].equals("p")) {
+            System.out.println("Producer");
+            for (i = 0; i < max; i++)
+                try{
+                    q.produce(10 + i);
+                } catch (KeeperException e){
+
+                } catch (InterruptedException e){
+
+                }
+        } else {
+            System.out.println("Consumer");
+
+            for (i = 0; i < max; i++) {
+                try{
+                    int r = q.consume();
+                    System.out.println("Item: " + r);
+                } catch (KeeperException e){
+                    i--;
+                } catch (InterruptedException e){
+
+                }
+            }
+        }
+    }
+
+    public static void barrierTest(String args[]) {
+        Barrier b = new Barrier(args[1], "/b1", new Integer(args[2]));
+        try{
+            boolean flag = b.enter();
+            System.out.println("Entered barrier: " + args[2]);
+            if(!flag) System.out.println("Error when entering the barrier");
+        } catch (KeeperException e){
+
+        } catch (InterruptedException e){
+
+        }
+
+        // Generate random integer
+        Random rand = new Random();
+        int r = rand.nextInt(100);
+        // Loop for rand iterations
+        for (int i = 0; i < r; i++) {
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException e) {
+
+            }
+        }
+        try{
+            b.leave();
+        } catch (KeeperException e){
+
+        } catch (InterruptedException e){
+
+        }
+        System.out.println("Left barrier");
+    }
+}
+
+
+
+
+ + +

+ +

+
+ +
 
+
+ + + Added: websites/staging/zookeeper/trunk/content/doc/current/zookeeperTutorial.pdf ============================================================================== --- websites/staging/zookeeper/trunk/content/doc/current/zookeeperTutorial.pdf (added) +++ websites/staging/zookeeper/trunk/content/doc/current/zookeeperTutorial.pdf Tue Apr 5 02:48:22 2011 @@ -0,0 +1,447 @@ +%PDF-1.3 +%ª«¬­ +4 0 obj +<< /Type /Info +/Producer (FOP 0.20.5) >> +endobj +5 0 obj +<< /Length 570 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gaua;bAO(/'Sc?E`EA?m4MG23bGK$N::k1>rVY1dMt9D1q;SMD4B@!dK)!jL-^90Oe`#714&(ZW9.n[Vajf(9jSY)[5b%D>$0iV:;9)#H<.'dPl)lF'\K^[=EHLIU6#"bZ?WR;7\BLUX7:GT-erJ_c_jpG0F*=T%*m5nio,PVa/oAlVCfkn4Jb?NNi6T\S=l+jt@EfaY7,duo]q&M6/I%H_e8=U6SH/_YLX4foc9lS9^eY&rcI]@bT>ij-=K6*an5CloVJaSEZO#')b'*J[gppbZ/^kd$X'"61\['JgccRX]H7P1_9:;T$6;[tfT>auSgn>Ya0hKTS/9f__U`AmHdZ'U#[*m,sk?e*_TPWJ$==$sGGXbWPlX_E1@CA1"FH`@%f%J&`_!6ib\k5~> +endstream +endobj +6 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 5 0 R +/Annots 7 0 R +>> +endobj +7 0 obj +[ +8 0 R +10 0 R +12 0 R +14 0 R +] +endobj +8 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 102.0 502.541 169.328 490.541 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 9 0 R +/H /I +>> +endobj +10 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 102.0 484.341 148.652 472.341 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 11 0 R +/H /I +>> +endobj +12 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 102.0 466.141 245.636 454.141 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 13 0 R +/H /I +>> +endobj +14 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 102.0 447.941 230.0 435.941 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 15 0 R +/H /I +>> +endobj +16 0 obj +<< /Length 2068 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%$997gc&AJ$C#W[1X/5,91'Ktdufc\P58_64Xe32.kD6o?nQ_N's'`IKs7*-A$PdeIMeg/5nbVu_d]O/m3Hq6@4,4$o41[Jsj`5DG4GT#(RE>Tf2`84tdr@o\``k1o=G(0G);Gn3'Y.1EJ]Ka*KYHt]rg#%+"/)f=.ljc@H`j$>'HYt(pUWeqG>Ko@Vmb(`NIQieYm>UH*$=>j0UO[W%$OoV>lDYHJ7Tf`(1[h&T[)[M"Kpf`oY3*?1'`GR%Q#al0_]lM.o/dh:VAe%:MR,H''-m:n9\,R+)j*>\*9eZMFc83!H`A,5>Y5)Lb+tM8#O'k'$8=0$IR%fQ3.:0LZOD?FXHi\CTp$M)?qrdK^eWf/kB7T^]"<#)(_u[H0YRM;]CD;,e&4A8f%)qF-8HXFV:CS`%&I)[7*4JS6drRB?8%lM37`uSOD#?VO^"fj>0^J<.Op]pd?bA^?7g(JO>6<8N(DC?S+8'k35T)a+SC%c$o#\/fG6mB%uOHdb37Bm)B'N/bQsrG+.'O:inAQh0=`,ZM>lUbB:8Q.!ZE9FrPGQ&YtR14i%RogtL;5t[62?2l/s-lUU:Fma.DW;&=8^jWO=@7>GS*3Mnr[g>4tgcBs#DkD- t#Cs;$Qa8i2Lb?>AeQA8"^+-2$/dMbU,8gl[n[&B]:/Ee@b]4-mB]P'<+iCXr"-nu'SFp&3^kXL9]'T?DVWh`3[&_f"b6%"2W`E#=>lcnhm,_05/:^W*FkrRLIn?aN>Fe#2Q]+8XW7+l)>*@`E#@eCI^GK5dU,H7Cp8.PE\M`=a(Kr8*WPc4]-8"o9q"1p3_S*-_e*"=C3ZX9(@%\rGe7/L//sqZ>adbklpdm]!UABbP.P2DAK+\AL&0oks8QOqlT7A]T5%BXJ]n&YtWb*0#8t?'VZa5":"+hpd_3!k6dshp>>F'aB?Ji%[YPsUP@aD\f26cSQ<(p?"c'NIN3om"aJV*$mi%Qn(Vcm\d1#;;@A"\7*Kumi0p@#?+^&[G%C!#@Lb2;)T:>CkM=RO5-Ji;E@*+.[gd(YMV$/F:G@m*nGDS2k%T<+Jrg!;WQ3tl[#kS3+IO'&jKp>j+:>$3cDCK6o>QsHVJ4V6u-^T;lO+[&>VA8)Z`;Cl/`Wm/,?=gqbA`3`F-I(u1po"/'la3bp8'luH^Vf5=ebAj97"1pkl];[e=.X9U`h$T`I$!m^qeW]$uITLhLdG+rsXTCF,rA7q/pM'?P)VnPk's.qM3R%sCW7EJ`[k[>C"=GUSqWB,_r9c:R4Zk'RF))t:7?@^[(@#\s?jnpCiH1_'ckmh!oJP,o_?`7dP:/b#*-l7sE?R g$04KF\c"#LR2JMVJo;*OkETCW"Nh`12RDI^Nk&C5Hf':WR5;VmRR]>S7#D$aSZ.08oZYM7,h4%o*7dU*VHr$K<~> +endstream +endobj +17 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 16 0 R +>> +endobj +18 0 obj +<< /Length 1973 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=,>Ar7S'Roe[d/;sH%4tKP%Ki"28Wdm`]@qU7>njY>gM1P%Q)LS%Yl?oPIONU(;\VcN,k>3SF4]N$1qiSkCa7DrY=GIp).CFIs0**&nsO8t#[=Gdh]!Xb"J$Fn`$q9R/npbD/BuJ!:WE>"k\<23Uh1I-AIad^tP",=>7,M,@88P9h-l1:nNp/38;P#6Vak)V-%p>47Mh6/fZ\LNqVEBk['u>E&Z:u%R;7lpmj&M)2MLaq9;Bqj=@)[D^Ekm?imuq!Q&b-^JCC]$6=Nj[S"&Q-;eM@tF#]m@KG&5LaMS7j]&I;NrE-5!UG%:UI=e;RLW(,Qp2^.#EZk3!Lq7:6!!+JVWD[E+kSjOF6Ct&*9=XU2oQ9>fQQ?$Y7ks)!8b%lD*&9fYTa3fGFrFk,YH;Ou0k:?LLOH'hM?+aNEN_g9<%8[262t3`K7knmYYY<+'Gcs)5i]E9T&u_sBcuW1,"h;b=o=`r-Bj>TR?5,A6>5!.$A.BS-:mj%%BL>'#_"dpE^Rj72-q.F[W+5k]7m.kYMa5+uGd\*H')!L@X5#XbAFC3"oo5!e74B$(LacHJuHU^,.,X^_kde97??+6RA_CP!V5*Fr,9HXjn6JZ,*'?FY>+'Obnp-Rl/Pga;mVU>PmcS[@_0#baD/>0"uX>?/XMUPJnB49dH>S13h@%X-a)9_9(N!'l.EAj"u(Vg$-&8O/AVpY,sSroi:=e+5t'MEV6Ke(0h*l8UuR*,68,l(t(O%NVm CZt7#lPQBcQ'Y'#m[p6.=7k+`M#RYBP\MI:leO)(>ca\ELWeuk8ZK*1=ig@fp4ju,ZjC-4V`W)NW@Mn@L3;i?b)l$Som%WWb9+g]!A?&:"+Rh!5f&(u_,tUcTe!Am%K(^Qnc3UY>jKj5C]QhU=S:YNQhU(qKEU#$!J,0sEA&>/[<:1DTP&+nZd.C+'m^R7OC;;RQ+-pS<;5YQDItb,baR(>ZBls6XU](-,b;RF#?5j[l.9/U)4.MuJUh]5[pm0l3RF`+qZRWqttJ'FAD\aJA7L6RKd1"&(h/S-I!t[(Gn?/>=/ulpn*g3NQB+^KuO_feVh3Mok!b8,WS_Mt>cm.+#\40Qr8R/<.L1_r:3_9NP\-aD:jF#mrhrL$A+;Q0g&*oYY-4G8V?GZ^,*(#Wl4BTq#cJ9<99G9rRL;uMq0(Cto:OTX33Zrlm>eP2O,C6:[YRqks6=sPP595hrT\&C,'?^P5bnIXqrug5T:7WQd!)=Y'KB]m%@WK"Y#PV\1^4,i&Xk`nrQ>1D)iecId(%qi/T"Yl$$+?0iZ([6:4;ipfcIrfsQ0Ic1?21ICQA^ +endstream +endobj +19 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 18 0 R +>> +endobj +20 0 obj +<< /Length 2037 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm<=`<%a&:W67+T,cJadVsTVF;4e:7OAj@HF=_&5^kK,!p:7jXQ-doY5U9LH%pZ-)2l?,i!0Yk*t%lDtIL"RS66/7[C<2^Fr*>8PI%rIJDFejS(IVEJWWoS/V"HqpC=J^I`f30Km\/@EGA1Eb(JnRIJ6PXAGMZ]b'6CduEn^r1=AWZS?mamdP)(_[T3$*Sk-o`,_juQ^8N.1Z+GkS\KG`^N6iVBG>B`?Bc0:4/bORNm@[\h-Of67`;F:Y@KQgIm]RMIHPR+RMSE2X6mJ74O$s6o:)8-nRB=K;32M-[k*BB=0)t>o@\hf\;G?nVtK*k>Z`Taesr@&K^a/SAp,ROaGmY#TcKU^d(Mp#n^Yj/mf#:bo%1.M.n3\[YWV0__/&5/0%;E>,-p^I+%ffnkHnQAp%-X`q-:K&mDM3$[Db'[a'c7LEAf,m'>HN6K95HInQiRL40\5c$?(rAmJ9f%#14>2>/\r;#u2/&@Ni#5"D%5;is:\`[E2D7Ol"i[6TTi6;@M*+A]euoANX[r`K'-X,=+TMW..44KRM6Cr(6.=E^W$4ZM]7Jc=pE?Z?l,utR/`E?+KC2q"qT4aL'g3LfFO90!;EX7U/5sLd0Z$qU_]R;`Lq_GmsrUTLHIXFT->t4Q`j]=C-gs8pm\Vr'gEG#6Qm$Hb8*hB*UNUBQ^;A@TLE2)eYG8ROa:n&1T)L9$gd0A#-g6V$U+1f^&3A:okI5.KSl]4@n*RY:/J.QQirf$(F[Z'3@9T)I`Lsp[)BZ;?0jS7rj_^dnA(4>%hL:cKa6\tGa07_jQ>;^X.#9-_;WrX#DF>JFf/_9\TI6p`TKW";5,671(kdGJTq1qPJ_mU$13Dc3F6k7T)]J>;B`Da=269=AO&cPK\90gD@q(Nai*:eGcQ8@83Q"P%QgqGj>*gO3>q]$6`/H56A[",YP\Z&\>q9p*U_IZ(@XfaN&=Q+pn!=aAm1rdI6s*2'#7;*ZiJgI*25Z1'9`'O\Bq47UIc>&a((#(qAFL +endstream +endobj +21 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 20 0 R +>> +endobj +22 0 obj +<< /Length 1971 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gatm<968iG&AII3E,qqKg+^?%qoI:W`0mtq,`OjUC"3;S64t5o:]Sk"e*2ANOp&`-"j/i91.ehq\;tPEMf8E35'o/ZI@O/I%=_a2;O=mg'LhM0&2q;,]f7-`iX"ZtBCBFckHgZTd%MLCR]g=@qjInBW7/EuH6dM5B>/Hd]#Zhl[^`mO*Nc=L[:.T.Q"p)Ba@[``EQ,m>AAc`NX)_5&R4:3p[(,$eq44dK@AB5G>SmUcEaBK5]['!S@u;GiHo:G3So(t#&\iGeG32#M_!k88oO+bg\ngdHXBJj[/eJRAE$]7R!8Fc[.]`5A0Rn-B$Y+PMmj=6q=$s(3$L&^4q$+fB9uLfQJocY90%f0H$k'i=)`8Bn]SLeq*eNKiD^H*L4csji%^)FO_t"IL[`R[kG'TT+FlU`8r90`HXOm:jL-f@OgU![WNK42*Q5,7[3/T&er1B2R1Np3W6J@08a%75flk;u7.H*m57+3%0eO^L8jl6;:L?s<_%1QgkRPY6:WGf.kmAk2_l%XjWLto#HEUH@KYd_8@up'&GY=O%d.<'s6XFfIKi:/P!pP:#%\]5\M!O?=QiE(oLmmHH644;]L7^\lJo.4O/c,%ilFn9f5.c)P?*Bo2+pZoBjnEqF/mJf'k6%4i2S?A0gE$k"`9!f.OA_.X)Hll_bU9UB]T\4#_4Ol0a=6,PXZ5]`79,d=4lo[)NbSiRJ7R&Y\/OpS$EAFT6NDn/InSeOJWO7@c5SIE*j@n*l>-Y%BPTpc:,(PomO^80ZjGP:;5tq@^`ehK"O!9CGH$ilT6\'0Ff22f&NV-d!ab$t;RmVU-(_46de@4ebtjb?FC]DnjQ5_jjp3oKqFOG.pKM)oG:;YCLDu,_5N^%3XPaYq%ut7=ZtS:Q2A)Dm1$l[Hl]+r>>'>1-f.1i/O0=um/'pqKig9fl*1U58R:lRQ62(]L]Q`PHY%CM2opBl"lp[NQ""331<2O;K5C_O?SWVljZb:tW#0H8NC0\l_"H,JT"Ddjkh$P0NH/M+=d;>5BaEA&r$m956u8)s^]]Um^%N)=a%cii,F\qt]qq@TDaE\7#j>]^(mM3DUN)=M6DYRMI/pR]i]N#7aUW"MGoZ35K]L4FHY)oj[)j2`1.h/U7jfuMWY6b5.NAL>UU=A^s*6CD\MdKY2\+pjB'tWZ\PZgG*q`QWkimm^!nVn+fQr1^E;HmWi(Q/Vt\8[I1)+-a^<.P(DeP#DPHBr=:8_2@]~> +endstream +endobj +23 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 22 0 R +>> +endobj +24 0 obj +<< /Length 1990 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0DD/\/e&H;*)U%um%/>4BTID^RqJQ$+HZF4qkZjmFGU2?U0kYbC9FP)'b,uNYnQJ?Z9&B*-sj;m^"j5!)[/4]?aOcQW3K>=J/\?8A[S7_*NlHm`*k`KJaS@l;/6B;<*P$phio8]-,FZW\g@3;;ca4`$L@6;p$r$,;bp_F"2^?#kQS/7Gc#@X,eFnQ!D7S9T9sX[^fP2$e&L1Ge](kARHdn@rG?7lfo'C)pho-IBPk#4LgAii%/N+PPm[4pOt%\iWd&5=C*LROAFC9+2PB8Z"=4VrMdsW3["A!O$nK?q5^uKOkYuFa,gXM?;+oRdlSG]H(O#m_C]gN3c3[:p-$#Bcb]&7%qgXThWd8L].Qj"&X2o'g5El(q-i$A/c=GrOF$.])K@%dhOnW3j=D]mjXaJ?,E=It)J3AA?%Jnqn$1-=/K]sBQu=2hW`+Nq3UV-DL:RFiuAX7t\jBU"9`18p=3P[cQ^#"\m7Z!:2FB<6hJ5F8a/U336Ii67P\1('eIq7AYPfNoKiUT^#j]-WFDJ($PVJRJ\[ZO55IqB:/7LcM@TZlElGm?Y]Vb,ka[QPFGlWRZIM+s/(^n&=XM7!kr1:#^C3AZusK%)/\`naHeOPZ&]R(?T*8tg.3(#^"^'m?&3:.IMKBT3)5Ju>?X%B)"OjuUu%G:5%nSW9W=1l\\"rdErmUqHA.6%nQ.:[^I-IFVbmpTkZ'*Y`_%^67!DV9*)q'@cS`(p47M.Hd\*i>>+U\S=%`6F'ddj[5,1S?+in3pE(oT\sg9=iCf*Ja?Q:uEMAUAD.>@$WL=#AUY8%,E'%QQ*a"k;O_EWRW+AfJ2[@07OV*L0>3LV1l+]B-Lg6mT!@,>r^9YJu,8gSr'o]k_TkR0&If*bkHqE+oc&D4NrR5^+JmC;WBlnK.bG26X'6MTR#?f11*iYi[):*Yu(1YeHq?,(L(Qch0q#\"WokV5N>.q6#?MhD>nRW#hY'DXa#XFW/#.],#\Dl+BZ^^Ag'Xq)d@PqHD]g@D7t*>fTMOd#GBKBk(c(c$K;,9q%IsJhm#&b'"H#_F%[$>/Dfg;kdj2WR]N`1-jf4NVkdl=RnB%gJe6'4]&C\[JWW$6lCp%=#V8U]-'Yho+Hqbg:G( `'%iqGPYl~> +endstream +endobj +25 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 24 0 R +>> +endobj +26 0 obj +<< /Length 1781 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU4>B?Pt'Roe[@.KOu',_+0:qPIrP&<&0p0kT'oV(T!^p\&8`Q0PtS8>,']g;uM0\Fk=A7BV5F=uH23Z$\u-LYT2Y7p,:eGnQ^qS;j"-rQZ\Y+BR9Nrb5'_7[bJpW;6-14?qZ7-`<=4n82"?i<9o5)Kr.r6Ur#][)q"1s<&7)l+?Wb,sS,9.%2tAhQfcQRU7sQ1r7erR0^D5S,h9DsaN8dUCJho7kBaD47R0bNG5`/,MXe=c0k2Q"$'#dR%,pY8pJpRpAUVkD[*M9>2"[I[_r1#%GOSYk2ceH=Xg)(^&8)XZ>(P/'],83Hp_5fod(=,$sZbRV/#rI)k<\gbFp@,^X8:_pCETjCKt"S^0l.ZJsRj**bdgXbNCS@`rl4"u/rJkI8:'JD*%-PHc.O*QundY8027-`iDi-YG\rPGj`6!-Kg&PK;XLMZ-AY&&2uL?OZYEsYS!R/]K-Ibgd,&H*If+l\//tP^0(6KTR#KaNSll'mA,M/F&@)Nn3Ia$++$0o0Hd=j->LNk`5WaGq?Dg-ecB'roReJZXL8qL8`7L0;XIlt\n;mVe[).TA"9]ifUu"miSf0eE#RKDZ&Y359]C7=\HR@T.R<=l5,QQlr]KT;W/BYY:X"t04!honeBn)'7>"AsU%4J36nWN'hb!m^d[nr^(lM@lJJ+kgVWk&qb"AgkHJO3XL;S2MF52O'sL:NE`5i[nQR5jPj%csq;b:FT@L1:c3r2*D>ifV?Fn2hGsa`EVWaWg$u)^@"p!=mfdRlQGj.f5ISou.N3Z#15>=!N?0nX;+r_t*Gh:A-9;>q+IM.99!sn.oJ*0!rW8Xb00#:nE7CcW0fN!1V5<;eUha'!8fB+B1#84EkK*k#:1WT0Bq(P3i6&-.j`sA>W> >Gi["<7osT#%nS6("r,[J"%iSLcI3&OC3ufCYb=?V6!uhJNuKhX4(goG.)#H^k3Od$iIZl;#^:M2W0IVN'r%?L(PR&2r0#:-7d\51&-M9f.jfDK3#Bq*Ic$-Yq:1Uu\4TL^8-'/hlr9S2s"Tra`iKX"-g=c_'-h%.g9fa+"Ss`K6Mn7k'RckaR(joa6^Dg,aq&h@$Bl+hi8VL&5S(f\?!p+8H1u&Ho(+Ci!&P&m-;:#O8^^`c5[c54Gqp-t(21]go#!Wh!J/U(H9V#5LR%)**fLSCQn;S5"YEF>5@ZN*9jLh)uREU`BCoob!cui-T^ou0IMBIGoj[rL0E3a1XfLF-$&-U!S9#6dU0%p9TccNU?;F<;c)ZS\DnF"Hlg:b(U*poV6[tB;Oa6&_H;'BZaNJsK*[L0FLauSb,&*Do@+&o@+D>EFNYMY3GB6*(6i]V<*lDb7A!g&B-d%qi(#R#*WL[NY75p4)j4()Vc`s5KN(B7jgMMb-g,VNfic#Q:q%H[OVIJUhlb$uEfjBiZniDARsM_uW[B.GbVq#Dj(c),2o?(E1kgZ,DG&[(AA^IVLkA&N)>PCE6oiHi*!7o"<7P,/>f!:lh"1KF82ja9VNP&*3U4Ib$Mf-eWEDA?f#6r^c%$<&`7ORA#\W6b9t[OFr/B)GX+-nD#q`c.BN?hWbZ<"Gq(M9qBc[~> +endstream +endobj +27 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 26 0 R +>> +endobj +28 0 obj +<< /Length 1563 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU4;01_T&:WeDGk(uOZWOMEg$SDT\L,q`[F=Gq:1p`tK*)21",kkW$0h)sGAR^u^bT/a).Ku(IbOaDV:BTBlJ7JHJ+\UR_p@(DjFZ\#6%Ju`LV697hM(1ALoYP5h1J59ELNhMs,u(/6V@X=Zib46u%b,\l9BZ'K_^6=PaO=_#dO,(aP,IAC13!537dm]Q&G^uuBDWsCi+$bZi7_#P0LJt[S5!up'CgJ>]ZO187U#\*T)Pd6D7nH.`tsh4Q_>lV*iJ+`UL[#Uj^gjj+Vd#5,,\TQaeAUm%.Bor,i*&XCLrB(kt%\pQ-@do\O%,%jR*2F58J%g=KMj6nGp8sA9!=68+_@DZ$.(I;e14`]Is9`/Q!p`gcgS=7NH'u>H$k<[)J.]@$V4<7Je?AmC3>GA\c&+/;X&6QkjX*Z"1TkZ#\`nO#T^1!Y6ccnE9BCLurW`IU&[YK/[*^7:CptkHtns'aq:b!&^WgP)\Dg_o9.qX$(Ab^&R4=*ZU?;i;sL?hI3j;MW^9^LpnXXD-hNj65r9L:CHL"N'jOr;+:?RdQ0bTrY;]4iWU\:3lnj)Za@L]bb,_gFIBt!q>+)Io8bKM_=U&:[/p:aG&FkjbV8H DC9nM1Y'e\.d]d_D4*FGNP'&P#rHM_HM1jfX#^Y5PY!']2$_od">;cYE63r1g)'N;ilNtJ&=;9b&g],T1W:rC8+^RbmB%/W`(qMm!n3iZ,1.tuDfl;6>5KU;.2OEIpR-6Kp@O%K+nFRSbr@(Mm^k^Y)P8R][%PseJS!@[5-+tR`n?1NuaH/uY:,f#pO[e^kM1CAPEP^CUA4s1B#/S#M:DdDE*_u7+egPXVdtV-Ha)7&&:WkfJVS]S[d$@rIgD:@hC2YP`-gLABjW2Ap8n=.7'tlbI#e%Wu>C)`P=((U+1J`C7e(VuWQ7R5P_`R.:AP&?YoXt7.3OkK]S&$#C0eer+H*U]+5SOT)`0$PgF/nALK'(n*8?__Vf6a:5Uo9Y;'"(aq:Qrb(:PsQto`IM5/TR_<+i)<0HS$s4oS0%U?KaE%C4q!#9JR9.$\f*KG)[?i/FKiV4,+RM-t!NC*/*U0s,C9#noQck'jb#0@*49C;:c9%BJ^N;E*_99c1jS"eT6m4,^4:"i?]*e#;jpG$T"a4/fJ4sM#9h<^i9$$QPqZe~> +endstream +endobj +29 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 28 0 R +>> +endobj +30 0 obj +<< /Length 1536 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU3?Z4[W&:aGPd.67>bupi1M;0dm8`6u?g+9;\QdnNufShE3O^*`LRLK)]4%b_d>BHBQ!@%?Gos'PGP&&&iK&O&RZJ"JDEJ8qcShG*I"hO3?s6%jp0?LoM8=3NhZo(uKpO8.M1-"3pA]@>=N7._L?2JN8CZi*c?"&Q+fOlTNP9?b!*TKbEb+=Y/2M>&^"<*cPeqnQp$_+tdn;*+Ep_M]8O[:E->f)/[%2j-INUON@rP=C.a5/1^r5S:q9_/AqKW'0Xirh;sX8TB#-rO4#Kk[-DW`W%s?F][T#Y;2Ij5M0nd(!TMf2Y]oGEu!9ZU0tS>D8,GPCk?B4BG:'-6cjaTR<.k9"-pD+DS\1m'9TXZT&#(E%iD0qBK"9ft=Z3QZcr,6Z8[k3R-'^H]qr4s1R_(f."W,:^I5J\R&u/N7l>CcYa%)"#9#>79W$;@q4YfD=@2^#\0O/V5)&YTgO=^UP$S%%"s7aPrLF-U0>]WG&oL`B:ZQ_)G(@"_'6S#!gEWD(JF_Rnh+-"QVV$`X2;dDaW&0ULF:^VI?m54K.u5B<728U';EN#+MXbL.OVk(E18COfo;a]_m*;Lf5B>T^1XcG-[utSTI)5RfsHW+a0SIr[j(I;j@B7!bMAgjPq@qS"=>O`ZP%`%*aX7Y4b*A)_q!uC@^mp&pf/JJfGtC[F[!IUTYpHlrTJ8Y*aXj#JeE*[%/0]\K,Fk5@^4nE'YZt0(Ms_5P7g[?nCppF<17Ine!#R8G_++6(^rnFV36%aYBOasNCDA-nS-p4'ikRIbU3:`g3UqUf8of_bhS$O!iQ,Q`H%P\.S\Dnh>+XJC\a0jO*79`2,o,<&/[*ND#",^Y7'$Z5<3mTU;AqK!lAU.I$lEd'^M$IZi:5QJ2g"=YZk5(UkO V+UFZ,S.d<2\B25lhH7&SW^s*U1a@WmePc^g*nKq(u6gc:b!T5VJWT=e;I%nHpjK+.galZSQ\MAqr2(6hVhLmk_*G]/-;#K]7*s`VrOkPh`.!K@?fqspKD#RR^^0D:?@3kJl`C,K4BPGbNgDjmFo!@>PK,j+)/3#Od^X[9%1d4$]ULeiR]Ah18;o(uJJl'+u!/g;^jmSMWbjXq,tKq(K^5is-C847G)Y?>c6Hmt8&%V\9kp3,]9^>(l40Y3[n?-^&P3>0cbN5!bdXo29@4rPD$fCa-5AuctX:lduBmhLg8eI<)Y.6s?K>Sm2U#Nr_1K?tI5RlI.pJ5Wf->50o"2grlPSnq9%>LZAFVUMX^[Do7;ROjGNk%6NT0;eReLm=^KRJM42[F_Y!"`\EKKQmckSKr9eAPKONfNbY2dl:lBf.=QsiDdW\"JqMYo$p*ic53M/a/]P9)6jnKI;Z%S6<`AjPt]s).)/dV8^U_PaOf)rdA[1!Z/sCHQ0kkGb>K+*aVe4=rWW/GZ+^~> +endstream +endobj +31 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 30 0 R +>> +endobj +32 0 obj +<< /Length 1506 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GauHKD/\/e&H;*)+nUt^e[5*(@VmhYE8#,BQ8C2uC`WYsAo(naj[rL8G1_<%;3WWbQCJ."(;Q&mik7M94ZpG!FbZ[:k772tn9`ba54Ui["T2of^@sTaL^.7\^"^h4kA;s27uC_+^%."C0:@)[_]Rc]*UF#r=j3DhTZJ`u1*?MR.Iq+h(Ae_d0GTBU&&W/teD8U-S<33dG-Mk;/pM/A..SZ!6m,0oM=eu+1/Hn0oMn]QQBmrdNsACiKWm^03`G3=C0k28,[/IL<-eohXeaS!ldrnu9Uc\d@@HE1\=:FAH!,Q=WU+*P]Q,;0049b,l=!n8."u3Oh0SRoWn71/TtFc=_*]?,-rA3_5S%:6XO3>iUd.3Hks(GQ]h%g[Y+S$[!F_]sQE7M\BQ;*>_Kb+F@?ij:M"'OEDC]]V&QLD=\B8Sf,#/Zo!+/#(8,r@/GE/mF1*r&4+uufhq[F+=UhjV:74!\HRK/U.R9/BbQm@ehRXG?9b\H1=Bnd$-TmP2b<+=a\+p(0o^5@KaGt=ue?aO/*AGA.3CD4Z=[Q%);IbNB+b31+mej`H-0ZX;@8p'riMo:/>[.7IF3Pl35,`d]#Ge?)gtV\&EVe`8=niF%I'X"CJY]*tD%u]6_V`;&/f`X:nE4hiF2`N[eMF_a3M\j5/Z`!S$\>HK*b&1XSUkJ5?WV=`_N8X495PXOqS&V^J)(Ni&XKQcb&". I?ps_qjYD[jfgI4$PB`@)91tW5VpCdVFL*QZ&SpJ@(D9F&jmG($M'eMHF`tBqbEGA^enF-eq;!UkUX?,VmJAaTdq'.D,88lT=F(3*+W(CMd,`\I0_D%8cr`\DG>(\8"!t)b_Rd['nnm#>B0JVK+$+\O,)E1GlEano+P(LVm?k+ofW6a"ad!)A$S9ArZ-??dgi]^*(L`;@G%]G-%P`Y^A'E&l*DSCM@`G8/2YtFPCqnIo3^(@OuCa1Ns_DG:t'LG8p0k+'2`rqPSQs)\,pdaM_!cC8+BKSEVV\fWW,r\_*R*81=;fo`dBR5sl5>7K>,G:K/h>e +endstream +endobj +33 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 32 0 R +>> +endobj +34 0 obj +<< /Length 1551 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU3;/b2I&:XAWd.67.#q]&L-uKmK,]JXJ?'`Lu9C!^^D;#aT9.iXZ9o&]ASKupbA_Ce+!3pXqh=:9rn`0.Kf]`o.h`BDX_uJI$GEM1o5leY`/`4l&iJ<5K'[F5[Z#cW3?,V/MRBq?Oa,tG@D>`=\mDk@4=Lp4>M1ZYr;,E"O`c1F;/$VKFTpi!?Q`<5:7)OXX1/:i4Nk.aRm+.uEEBGg@g5`\`OJfpQdp,>@MB`k6F(>*L&;Bo(a@FK+O:!K4V&IQbX]U\-"q!\fO1M+HQ;#df@toT-_"g#k6HWc6`:Q9G%F^"m?s?`:1UI..Zu5t/B8G%1;QBQ4%tO`V*Xu:bf4Q6NHcf3$:cMV/FEhiSe-X8Ll2)V2F7&eS:>Z]a"KQiMWT2E%gGi]VS`b8@#!,kj!@o$&,\f;/]_nQB%(e%=lcQsOtE/t2p./P3(Q#%8?WG)1U'NtLK/l)1=[[_(_k`%l\H&i,AVXpu#k9P2K";\C5jL$T?s&I]+)IMJmpQQWq6W,H"8JlZ6G'1DW=^=poD2MWGA^3>\00S>[5eA:U2f1QD3.@Y9CDC0t&kU%`kN*hhhD1hnN%7E-l_;8iDZUULW/D)U7X&=mq5-+nEhR`nG?R1PGW5_X$"4b%qQ#e?\Lp#_U$c"_9u0B&I`rD7VAVHF>,jDb8t;O!e-VW_f+BUI5?cDf#%A_HPe,JIh#bX'9ask'GUj_Q?Ji54!mo8trlKRLNa7Ls=0PKnT9O^4-/&ETeW6+&L@q]?F=%17g-ujY3c>1.&7.M!Kdb)D6[Tc<&E3Q3Z):4[md;\]TeO)O4 +endstream +endobj +35 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 34 0 R +>> +endobj +36 0 obj +<< /Length 1657 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU4hfId8&:WfGnDoF"&n+@tAbYURF1F2s]CqrM0R[WYK*_TA"\`HpK^88[mn+?t&=GB,bQM-:qKDVf+'NYIm/9'54n`hKKE'\4)PSpAitss)VVeQo8J+Ss.=uR.C[]u[%oF6Rb_+^b#D&BK^?ONnK,tMd()BCLCuU)$SP]ZBn;PW@^uCHn*_^&XOT<:7X46e7h2IHqZ+JE>mV\9@(rr+C*:]-,%Hg`bhko%`4.S"%&IY?;/KAFF'5Z'Ddq]M/ScZ(:I7pr*/P9)%FhRMV;C)Y=fc4"[eghoC[?iMp"Nhe-IaCs@3WZ?lcZS5QO[THP]qSU3(AQ[;N%NT[[)Xt0IH+tb("BkL*s))DZY@nnRd2q\#klsU9[g5%Ap*.W-WVkJru(rAc)Ik([B5>\,g2UN0naZ@2S7j>$&J4/;[5?4nXjT16m+/#0(/;=O2A$.5;LAh6JS4?D"=;drEa&"CY+h;LSUX\HWj^RSm,8j3%-\lgsJUP5rT7[`hK>!,:GheY$YaIlIk2m/2R24OoN*7tc"%$EdV5OY:J>2KL<;1d*V'HJQM/+2SVb]7SrMT-7lJb$8gglV[eS-$u&@W\^]dKJ;&oUk+iR&5WG"RJV,df8:##;Afl-rGmn^5u4[p>#cAA6@cj%^a7'#Qb*$FT+L&rea81FNF`;Jko:RNfoJGdVXVAr#h .nh`p8P]e=03NsqXED6<]R]_1\.C:rQ/!qpi'L#INZ%jV9`KXlJi0h\_+4W=GpAHjUKF,a'.FEMd'ARK@b`KTQO&3&')5FKod[E%@r/^KY*c*XC)l6m!B"^N;Hr48V@\^2LX+p%XRkh\f7"Wej4P&l.1Z<]uHWZa\!ir-2b]Tn9MFEldo3HI>%gg*Y9u\ra8'.n5&qV@6^X##o@E+h=O$dhr'WmdU)\ODEdMKOoGo=Nm.ZFM>.j@Y<-nmKAq/Y/a&`M*hn@at<:&F.!=]a>9fn?FhZY-_S.O@G=14(IiL3"Un&6c]2#M\]41.Rk"T.R$`DmeW*0;-LGJ+([^/@3e)+hGNDdejjKR-.I5LeMHm\YcF1]d*>mIp1DZ7;)_jW1H2dpe4:`/~> +endstream +endobj +37 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 36 0 R +>> +endobj +38 0 obj +<< /Length 1366 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gau0C968iG&AII3YWg1hBLRF^&5@M-1U\ZJ%rJCH,9J5f(X9F)#tT-O\Q&[X->^'T*2bT&0j%;aT"Mir(9J+u^,B*1dnL,(#H+f5:V=/XRGZueY!s,].M>A9kF`n2)^1hL0JU5VL!l6jK7B60RGq_MFEOA$UeTBckEW:5+2F:_5:;o\fe_5Eaj7@cGK=bO`gHKYB!9^8B5HU34Ek>1Xp.b$%"j100G;r.12+NI?5;Z(cCZ24?E0=pB-9Qu-0qu-Q[1Y!g[L+pu>cZt4gct[@HaKtF4qfW+.65CGlGpRlk91SpF?GlO*h;e:L]rporTBG3CI,8^qEDhBg_l],eHobYmRZ'uY&F1^NcXFss7DH^h(dIF1)K-3t#5";[52jr9%e@iW??k56^`0]d'5`BOKpfH>L$RAN=nUf.'icI:&6q7nn"Q9-Hg"S>$6e[aBu>M"Htm_;3-:6@@P),n]L,KWlWLXdc4Z>rmAS+CXBD1ij>>0H8i0GJ8_`SsEGj"qX3Vm$.BLL`6:[(5,RcbS1JEhmcl[a:e]'*t56H*=.[B] HL8Sq0B*8KU5N7)I^A#:,Y'd6`_<#5&VX^<A[)i6[I]NgRAUC>>?n/R6#)4ZAc(qjB'oWd+4ag,$I"u'gZKD":R)MXZT7LS12&"@t3e$mk44lk$q\ZWC,=jqZ3'3d(0dHk.c[&A\k(Gg$%q[Zq#RZ7~> +endstream +endobj +39 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 38 0 R +>> +endobj +40 0 obj +<< /Length 581 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat=&9omaW&A@7.N:rJWlIq7=a5XIakXrVkfUSTSdTnekeAfIM=m^e?c8ZmkXqi/m.C!M@oDI`6hj)k;k#:`39,SSKE/0\g7bV;8nU-0P(`#h(8Ode0NDta".>Oun]*@^E$]&U)[_s*-j0l53;;!q?VVq/I4jN'm]CX@6Rq:1EdQU[FYq;BO*=c#pSUI*Kk%rgKo0aqqIKR1Ul(.~> +endstream +endobj +41 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 40 0 R +>> +endobj +43 0 obj +<< + /Title (\376\377\0\61\0\40\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156) + /Parent 42 0 R + /Next 44 0 R + /A 9 0 R +>> endobj +44 0 obj +<< + /Title (\376\377\0\62\0\40\0\102\0\141\0\162\0\162\0\151\0\145\0\162\0\163) + /Parent 42 0 R + /Prev 43 0 R + /Next 45 0 R + /A 11 0 R +>> endobj +45 0 obj +<< + /Title (\376\377\0\63\0\40\0\120\0\162\0\157\0\144\0\165\0\143\0\145\0\162\0\55\0\103\0\157\0\156\0\163\0\165\0\155\0\145\0\162\0\40\0\121\0\165\0\145\0\165\0\145\0\163) + /Parent 42 0 R + /Prev 44 0 R + /Next 46 0 R + /A 13 0 R +>> endobj +46 0 obj +<< + /Title (\376\377\0\64\0\40\0\103\0\157\0\155\0\160\0\154\0\145\0\164\0\145\0\40\0\123\0\157\0\165\0\162\0\143\0\145\0\40\0\114\0\151\0\163\0\164\0\151\0\156\0\147) + /Parent 42 0 R + /Prev 45 0 R + /A 15 0 R +>> endobj +47 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F1 +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding >> +endobj +48 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F5 +/BaseFont /Times-Roman +/Encoding /WinAnsiEncoding >> +endobj +49 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F3 +/BaseFont /Helvetica-Bold +/Encoding /WinAnsiEncoding >> +endobj +50 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F2 +/BaseFont /Helvetica-Oblique +/Encoding /WinAnsiEncoding >> +endobj +51 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F9 +/BaseFont /Courier +/Encoding /WinAnsiEncoding >> +endobj +52 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F7 +/BaseFont /Times-Bold +/Encoding /WinAnsiEncoding >> +endobj +1 0 obj +<< /Type /Pages +/Count 14 +/Kids [6 0 R 17 0 R 19 0 R 21 0 R 23 0 R 25 0 R 27 0 R 29 0 R 31 0 R 33 0 R 35 0 R 37 0 R 39 0 R 41 0 R ] >> +endobj +2 0 obj +<< /Type /Catalog +/Pages 1 0 R + /Outlines 42 0 R + /PageMode /UseOutlines + >> +endobj +3 0 obj +<< +/Font << /F1 47 0 R /F5 48 0 R /F3 49 0 R /F2 50 0 R /F9 51 0 R /F7 52 0 R >> +/ProcSet [ /PDF /ImageC /Text ] >> +endobj +9 0 obj +<< +/S /GoTo +/D [17 0 R /XYZ 85.0 659.0 null] +>> +endobj +11 0 obj +<< +/S /GoTo +/D [19 0 R /XYZ 85.0 659.0 null] +>> +endobj +13 0 obj +<< +/S /GoTo +/D [23 0 R /XYZ 85.0 384.62 null] +>> +endobj +15 0 obj +<< +/S /GoTo +/D [27 0 R /XYZ 85.0 153.02 null] +>> +endobj +42 0 obj +<< + /First 43 0 R + /Last 46 0 R +>> endobj +xref +0 53 +0000000000 65535 f +0000027089 00000 n +0000027239 00000 n +0000027331 00000 n +0000000015 00000 n +0000000071 00000 n +0000000732 00000 n +0000000852 00000 n +0000000898 00000 n +0000027465 00000 n +0000001033 00000 n +0000027528 00000 n +0000001170 00000 n +0000027592 00000 n +0000001307 00000 n +0000027657 00000 n +0000001442 00000 n +0000003603 00000 n +0000003711 00000 n +0000005777 00000 n +0000005885 00000 n +0000008015 00000 n +0000008123 00000 n +0000010187 00000 n +0000010295 00000 n +0000012378 00000 n +0000012486 00000 n +0000014360 00000 n +0000014468 00000 n +0000016124 00000 n +0000016232 00000 n +0000017861 00000 n +0000017969 00000 n +0000019568 00000 n +0000019676 00000 n +0000021320 00000 n +0000021428 00000 n +0000023178 00000 n +0000023286 00000 n +0000024745 00000 n +0000024853 00000 n +0000025526 00000 n +0000027722 00000 n +0000025634 00000 n +0000025797 00000 n +0000025951 00000 n +0000026199 00000 n +0000026427 00000 n +0000026535 00000 n +0000026645 00000 n +0000026758 00000 n +0000026874 00000 n +0000026980 00000 n +trailer +<< +/Size 53 +/Root 2 0 R +/Info 4 0 R +>> +startxref +27773 +%%EOF