You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by bu...@apache.org on 2011/04/05 04:48:27 UTC

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...

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 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta content="Apache Forrest" name="Generator">
+<meta name="Forrest-version" content="0.8">
+<meta name="Forrest-skin-name" content="pelt">
+<title>Programming with ZooKeeper - A basic tutorial</title>
+<link type="text/css" href="skin/basic.css" rel="stylesheet">
+<link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
+<link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
+<link type="text/css" href="skin/profile.css" rel="stylesheet">
+<script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
+<link rel="shortcut icon" href="images/favicon.ico">
+</head>
+<body onload="init()">
+<script type="text/javascript">ndeSetTextSize();</script>
+<div id="top">
+<!--+
+    |breadtrail
+    +-->
+<div class="breadtrail">
+<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://hadoop.apache.org/">Hadoop</a> &gt; <a href="http://hadoop.apache.org/zookeeper/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
+</div>
+<!--+
+    |header
+    +-->
+<div class="header">
+<!--+
+    |start group logo
+    +-->
+<div class="grouplogo">
+<a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
+</div>
+<!--+
+    |end group logo
+    +-->
+<!--+
+    |start Project Logo
+    +-->
+<div class="projectlogo">
+<a href="http://hadoop.apache.org/zookeeper/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
+</div>
+<!--+
+    |end Project Logo
+    +-->
+<!--+
+    |start Search
+    +-->
+<div class="searchbox">
+<form action="http://www.google.com/search" method="get" class="roundtopsmall">
+<input value="hadoop.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp; 
+                    <input name="Search" value="Search" type="submit">
+</form>
+</div>
+<!--+
+    |end search
+    +-->
+<!--+
+    |start Tabs
+    +-->
+<ul id="tabs">
+<li>
+<a class="unselected" href="http://hadoop.apache.org/zookeeper/">Project</a>
+</li>
+<li>
+<a class="unselected" href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
+</li>
+<li class="current">
+<a class="selected" href="index.html">ZooKeeper 3.3 Documentation</a>
+</li>
+</ul>
+<!--+
+    |end Tabs
+    +-->
+</div>
+</div>
+<div id="main">
+<div id="publishedStrip">
+<!--+
+    |start Subtabs
+    +-->
+<div id="level2tabs"></div>
+<!--+
+    |end Endtabs
+    +-->
+<script type="text/javascript"><!--
+document.write("Last Published: " + document.lastModified);
+//  --></script>
+</div>
+<!--+
+    |breadtrail
+    +-->
+<div class="breadtrail">
+
+             &nbsp;
+           </div>
+<!--+
+    |start Menu, mainarea
+    +-->
+<!--+
+    |start Menu
+    +-->
+<div id="menu">
+<div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" class="menutitle">Overview</div>
+<div id="menu_1.1" class="menuitemgroup">
+<div class="menuitem">
+<a href="index.html">Welcome</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperOver.html">Overview</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperStarted.html">Getting Started</a>
+</div>
+<div class="menuitem">
+<a href="releasenotes.html">Release Notes</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_selected_1.2', 'skin/')" id="menu_selected_1.2Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">Developer</div>
+<div id="menu_selected_1.2" class="selectedmenuitemgroup" style="display: block;">
+<div class="menuitem">
+<a href="api/index.html">API Docs</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperProgrammers.html">Programmer's Guide</a>
+</div>
+<div class="menuitem">
+<a href="javaExample.html">Java Example</a>
+</div>
+<div class="menupage">
+<div class="menupagetitle">Barrier and Queue Tutorial</div>
+</div>
+<div class="menuitem">
+<a href="recipes.html">Recipes</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">BookKeeper</div>
+<div id="menu_1.3" class="menuitemgroup">
+<div class="menuitem">
+<a href="bookkeeperStarted.html">Getting started</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperOverview.html">Overview</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperConfig.html">Setup guide</a>
+</div>
+<div class="menuitem">
+<a href="bookkeeperProgrammer.html">Programmer's guide</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.4', 'skin/')" id="menu_1.4Title" class="menutitle">Admin &amp; Ops</div>
+<div id="menu_1.4" class="menuitemgroup">
+<div class="menuitem">
+<a href="zookeeperAdmin.html">Administrator's Guide</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperQuotas.html">Quota Guide</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperJMX.html">JMX</a>
+</div>
+<div class="menuitem">
+<a href="zookeeperObservers.html">Observers Guide</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.5', 'skin/')" id="menu_1.5Title" class="menutitle">Contributor</div>
+<div id="menu_1.5" class="menuitemgroup">
+<div class="menuitem">
+<a href="zookeeperInternals.html">ZooKeeper Internals</a>
+</div>
+</div>
+<div onclick="SwitchMenu('menu_1.6', 'skin/')" id="menu_1.6Title" class="menutitle">Miscellaneous</div>
+<div id="menu_1.6" class="menuitemgroup">
+<div class="menuitem">
+<a href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
+</div>
+<div class="menuitem">
+<a href="http://wiki.apache.org/hadoop/ZooKeeper/FAQ">FAQ</a>
+</div>
+<div class="menuitem">
+<a href="http://hadoop.apache.org/zookeeper/mailing_lists.html">Mailing Lists</a>
+</div>
+</div>
+<div id="credit"></div>
+<div id="roundbottom">
+<img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
+<!--+
+  |alternative credits
+  +-->
+<div id="credit2"></div>
+</div>
+<!--+
+    |end Menu
+    +-->
+<!--+
+    |start content
+    +-->
+<div id="content">
+<div title="Portable Document Format" class="pdflink">
+<a class="dida" href="zookeeperTutorial.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
+        PDF</a>
+</div>
+<h1>Programming with ZooKeeper - A basic tutorial</h1>
+<div id="minitoc-area">
+<ul class="minitoc">
+<li>
+<a href="#ch_Introduction">Introduction</a>
+</li>
+<li>
+<a href="#sc_barriers">Barriers</a>
+</li>
+<li>
+<a href="#sc_producerConsumerQueues">Producer-Consumer Queues</a>
+</li>
+<li>
+<a href="#sc_sourceListing">Complete Source Listing</a>
+</li>
+</ul>
+</div>
+  
+
+  
+
+  
+<a name="N10009"></a><a name="ch_Introduction"></a>
+<h2 class="h3">Introduction</h2>
+<div class="section">
+<p>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.</p>
+<p>Both primitives use the following common excerpt of code:</p>
+<pre class="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();
+        }
+    }
+</pre>
+<p>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.</p>
+<p>
+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.
+</p>
+</div>
+   
+ 
+<a name="N1001F"></a><a name="sc_barriers"></a>
+<h2 class="h3">Barriers</h2>
+<div class="section">
+<p>
+ 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.
+ </p>
+<p>In this example, each process instantiates a Barrier object, and its constructor takes as parameters:</p>
+<ul>
+<li>
+<p>the address of a ZooKeeper server (e.g., "zoo1.foo.com:2181")</p>
+</li>
+
+<li>
+<p>the path of the barrier node on ZooKeeper (e.g., "/b1")</p>
+</li>
+
+<li>
+<p>the size of the group of processes</p>
+</li>
+
+</ul>
+<p>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 (<strong>Note:</strong> This is not the ZooKeeper root "/").</p>
+<pre class="code">
+        /**
+         * 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());
+            }
+
+        }
+</pre>
+<p>
+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.
+</p>
+<pre class="code">
+        /**
+         * 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&lt;String&gt; list = zk.getChildren(root, true);
+
+                    if (list.size() &lt; size) {
+                        mutex.wait();
+                    } else {
+                        return true;
+                    }
+                }
+            }
+        }
+</pre>
+<p>
+Note that enter() throws both KeeperException and InterruptedException, so it is 
+the reponsability of the application to catch and handle such exceptions.</p>
+<p>
+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.</p>
+<pre class="code">
+        /**
+         * 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&lt;String&gt; list = zk.getChildren(root, true);
+                        if (list.size() &gt; 0) {
+                            mutex.wait();
+                        } else {
+                            return true;
+                        }
+                    }
+                }
+        }
+    }
+</pre>
+</div>
+
+<a name="N10051"></a><a name="sc_producerConsumerQueues"></a>
+<h2 class="h3">Producer-Consumer Queues</h2>
+<div class="section">
+<p>
+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.
+</p>
+<p>
+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.
+</p>
+<pre class="code">
+        /**
+         * 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");
+                }
+            }
+        }
+</pre>
+<p>
+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.
+</p>
+<pre class="code">
+        /**
+         * 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;
+        }
+</pre>
+<p>
+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.</p>
+<p>
+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.</p>
+<pre class="code">
+        /**
+         * 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&lt;String&gt; 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 &lt; 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;
+                    }
+                }
+            }
+        }
+    }
+</pre>
+</div>
+
+<a name="N1006F"></a><a name="sc_sourceListing"></a>
+<h2 class="h3">Complete Source Listing</h2>
+<div class="section">
+<div class="note example">
+<div class="label">SyncPrimitive.Java</div>
+<div class="content">
+
+<title>SyncPrimitive.Java</title>
+
+<pre class="code">
+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&lt;String&gt; list = zk.getChildren(root, true);
+
+                    if (list.size() &lt; 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&lt;String&gt; list = zk.getChildren(root, true);
+                        if (list.size() &gt; 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&lt;String&gt; 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 &lt; 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 &lt; max; i++)
+                try{
+                    q.produce(10 + i);
+                } catch (KeeperException e){
+
+                } catch (InterruptedException e){
+
+                }
+        } else {
+            System.out.println("Consumer");
+
+            for (i = 0; i &lt; 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 &lt; r; i++) {
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException e) {
+
+            }
+        }
+        try{
+            b.leave();
+        } catch (KeeperException e){
+
+        } catch (InterruptedException e){
+
+        }
+        System.out.println("Left barrier");
+    }
+}
+</pre>
+</div>
+</div>
+</div>
+
+
+<p align="right">
+<font size="-2"></font>
+</p>
+</div>
+<!--+
+    |end content
+    +-->
+<div class="clearboth">&nbsp;</div>
+</div>
+<div id="footer">
+<!--+
+    |start bottomstrip
+    +-->
+<div class="lastmodified">
+<script type="text/javascript"><!--
+document.write("Last Published: " + document.lastModified);
+//  --></script>
+</div>
+<div class="copyright">
+        Copyright &copy;
+         2008 <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
+</div>
+<!--+
+    |end bottomstrip
+    +-->
+</div>
+</body>
+</html>

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><n$...@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<pM...@7>GS*3Mnr[g>4tgcBs#DkD-
 t#Cs;$Qa8i2Lb?>AeQA8"^+-2$/dMbU,8g<V&rNlRXh-4D2TH%*AM4&Fq]erW5+*Zu!KM<^]:.X]Bjf8E6(20r:l>l[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@*+.[g<!hK"Er'NllBtp6lR-m;!(>d(YMV$/F:G@m*nGDS2k%T<+Jrg!;WQ3tl[#kS3+IO'&jKp>j+:>$3cDCK6o>QsHVJ4V6u-^T;lO+[<F=5LmVL9V1c/u`1BCbI9lMr[ia@PT]#kQJc)S3I!Qg@8L&`1@iQQqej;&(V38nLS>&>VA8)Z`;Cl/`Wm/,?=gqbA`3`F-I(u1po"/'la3bp8'luH^Vf5=ebAj97"1pkl];[e=.X9U`h$T`I$!m^qeW]$uITLhLdG+rs<S*^al4;"5Sm6)k9FD%sd#?,3WTlu_j]II(gVAnWMo5#`Vm=eDMIFSC-F\=-$00"oS("5hgAjrl9.@jQD,@_?ekCs^\"!A?0UQ^niTbA+6]bH0^L^.pq0E7`4O8okW1C&Do@O(,Tf9`TbdI)j>XTCF,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\<<X.W6*3hi+S)QAp:D2=0o3\RQ95qaS_ejlinqAKfVZ0WE!j+pg`I=%U'g">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]&<nc#DP0Li)=nTl6/_qV10Z0")`*e/;k*k?9_(%!):R?IA?$<Y24@.t3dT%Z]Z$r8>I;NrE-5!UG%:UI=e;RLW(,Qp2^.#EZk3!Lq7:6!!+J<TVb9,VWa*qjHURIF1020nmL<)a`IWscb+'eTlFT#T!gr/?Tb]3.)XdICXUS>VWD[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,A<IJt8NV0.*_(Kc!lIph$V`d7\'j0&.idqEX"0=A\<N6%ATN_?4q<s7g&>6>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?&:"+R<L?:0L)W[,h/cf8J;R`J^<lZ!D0bQ5gW6V`lAeS@`AdMX(L>h!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<9<H#dFqTHm<d7qV"3DR,%j'4UCc/qug?`X>9G9rRL;uMq<H+rqgk^EIIMc0?u6LL+QppI]M9(Vt;]iJ+[5n1Rhb-c49ta>0(Cto:OTX33Zrlm>eP2O,C6:[YRqks6=sPP595hrT\&C<dJ026@RsNfg@+=*q?mMUkht!&+!FIBY[&n/.,i&0.,_fpG??7RbUun7U%U9AZr0c_nM.:]DGe+2.q3^7[r/mh@7XZd;k+=XhO?^:^.54'sPYfEMf]f("T[Hg8A>,'?^P5bnIXqrug5T:7WQd!)=Y'KB]m%@<tWV+5);&75f"98Pk7gTCRtX+oD*<K'/iCF,BN[<,H"0"(d:%T:RR_KgIA*(59mEOip36d@E%,(n58P^nrJ`<'<"(`HEQjKlo1)@'(l//^%4*$/I:(RK[YDL(+gl`0:(4p\>WK"Y#PV\1^4,i&Xk`nrQ>1D)iecId(%qi/T"Yl$$+?0iZ([6:4;ipfcIrfsQ0Ic1?21ICQA^<F]T/Pd3)1ZZ8E:JJ%:!*$/^7~>
+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<!J`R$Cr',]L_r*%TGk&[E6Z[lkKuC7D%@>\/@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@<bV"@p)Wl_cnY62DNG_<=P'&jVSU\kuk%pY_q3)m,h27HYm5geDS:\Ze+qiJP\:5n0h%7".A.&a%/>&K^a/SAp,ROaGmY#TcKU^d(Mp#n^Yj<jh<3.+,fV)O:ShdOdp*t]86$YO+CYB9\1$:"I:YV;IrS2FZJ="srE(X/Q"IItZkGD@-?N@"/TS<*J3dU,>/mf#:bo%1.M.n3\[YWV0_<D`P%Ff5jV#o>_/&5/0%;E>,-p^I+%ffnkHnQAp%-X`q-:K&mDM3$[Db'[a'c7LEAf,m'>HN6K95HInQiRL40\5c<g@6=l*"NRUmeDT^(C[nk.mJMK0sIOs<s<LWXPIKK4jTGhBUV6Ha<)-5($^3$grLdj$O5%(T*g88RES+mKeg`qn0?$kWh0uP+;D$u,$dMrP=YtR1Lrld(K:p>$?(rAmJ9f%#14>2>/\r;#u2/&@Ni#5"D%5;is:\<f"^`c*TsJS#B[hJO%`E.6a?E<$E\upX:A%6=SZBp:_f$%#J+#Yoj)`gRq6p5HGP=l`*fOBYjCUN5_sP6Nni/N:P4>`[E2D7Ol"i[6TTi6;@M*+A]euoAN<pEKN\hFA5/c9C5e[fjD6XE1_kQF9c.1VLs\4m)3#6jb:Ht
 6;/r]rX/Z`[4J$2<QM#k'd;f$8W#/X:/CE-(pl76=j8Ydq/s$Z$D"t='pi'\m0<:>X[<rTE4SQs]/hM*L\Hg9F=VI\\/Q[;D;FKR1d\R]:6ijQpK)j_f0HcD-]Aa>r`K'-X,=+TMW..44KRM6Cr(6.=E^W$4ZM]7Jc=pE?Z?l,u<m\elJR/=?WWc^Daeg<_X\E]j5XUDJWn1":Yj:On/UPFIUr896'!'%Ak>tR/`E?+KC2q"qT4aL'g3LfFO90!;EX7U/5sLd0Z$qU_]R;`Lq_GmsrUTLHIXF<C('M7.<_)k3[9Ke+h;5qW,Em>T->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`/H56<nVqq[K;YGDVGO#&Wc*hQ3u-,i&3s%RIPHioscY-fZh_M3h(Zf/i$*dG'GNSbUg,+h1D<l)n"Sca\Yu5fOh`/*=X_Sb;<"Q2-p-h/ftG:GM7$qlRWQ[eo)Y6<Ape_2`.9rhnN@1+5@&,V)qHiLX$r'\kkGlDSsi[KXkCkaCdl)Xl"C6##)dS_5p?o2:sYj"lLGQY$\JO5V^(cg$q3<7]ld!N*(7o?f#e2!g^R"&H\C6"hrg$]8)6X(os7.1Aa`_NKqmR0%*.U&NdgR)J9DD1fb>A[",YP\Z&\>q9p*U_IZ(@XfaN&=Q+pn!=aAm1rdI6s*2'#7;*ZiJgI*25Z1'9`'O\Bq47UIc>&a((#(qAFL<a;%DoCPfq-`S+FT"3W:"
 E#_0?nHG^Ri'@NTYJF3Sn(U3r1.*NT%OC/EbmTJ8#Hs%XAdL]7bY7rqT~>
+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<96...@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"<NLQNg*G?c9TY[J*%pu9XI^s/lLC`bE*FNj-'E_-t`DWnSUVLIkhs2VA'3+D8K5Q'oVUQ6Nl88p\CJ6Qh2_:5/rG6E8GWLl$9\Wh>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<ja]s'IV&c7[&Xr=FAA+QSspkm8?0l(f2AUjhCAVdp'"%jX:E[>_bU9UB]T\4#_4Ol0a=6,PXZ5]`79,d=4lo[)NbSiRJ7R&Y\/OpS$EAFT6NDn/InSe<Z@#3mY!doF\;WPPd@K&:RVW<&u9q#mg^g:@)AT*PK5s,[,o9uTbZ:*kTZZ`8a40Rp2n-19AFJq#AsD.dt#fpgi7BW47,Db;VOt57gY$iW8$^
 7>OJWO7@c5SIE*j@n*l>-Y%BPTpc:,(PomO^80ZjGP:;5tq@^`ehK"O!9CGH$ilT6\'0Ff22f&NV-d!ab$t;RmVU-(_46de@4ebtjb?FC]DnjQ5_jj<?OSN'h9ih8S6bOaZ:S0*`1/.$i9\jgOQlWE%Zt/L(:H@3HfL3[g#_=S^YtE+E&$hqFaKV5+LUC[1&ul2,5_n(U%(Ugj?P_5sg[PMlcJ+WB]9+2Kd'TFGM7BoE1H+=M)hTl2dMeYq+595pgNTf[q4-E+"`.FhZIOQ4%JS_J$(UKF<d3[C#dtOCJh:7)9>p3oKqFOG.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^<IpHi]YYm\"_ZCWdJ3o=iPN_XjScZq?*Y"9XYrC.":55YE7'6B<qA'iM(#<($\o`pAf=-*ghIL'73oS05:<R3!ncH%CM5<ET=GL".)C4:JS.4*o`X80RV-=e,rU#GY=QcC!5"*9%/msIWU#iV+F403'%qrmYm%RM]C,W)u\0F1uL9-EC_8lSXW;e'Fr=tc\Ch2U-XN/0&"Tcdh.>]]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\MdKY<Z\j_0c`1a>2\+pjB'tWZ\PZgG*q`<shbI?/n):h--6XS\&8\@"gdFZ\kd4#L6$&fYu&9c+gO.oltg/AkJRCZLF+WViSFd#,>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]<nki9b2[c7>?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#4Lg<g9QP@)jM)XPRr%b!eZ?g3qQeV[R#!`#!Xp,UJh,LY0!Y8[;Z0It]D7P._:^3ic*%re"`P,p:#r)Zt'=.njr5/OIERlq3Va!KAumNYBa]&3Sh.-nk;b6LF!`u33(P60&\ok"j_)*&-qA]FFlAD;Oh68RNX/2jUsXlgp!`^fAH/AlM6Z]lGpY^YTmSc/n$ha\R\oB#o/rTs6sq_o%Dg"lS+CX"@rB"L7tAB:bZpd;t<]puiDgb4ubLZP3'NfSQ*PJ;I>Aii%/N+PPm[4pOt%\iWd&<Zk]cQP=<R&9-`3=Alq$ZYU=N5=L&j(+3acF[#o3>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<6hJ<R7D6"!L[j,U%Mto);X:8!Hgsd1t.4<$$WB,?_bf&K%g-rWHA2_HI^E\AeWR&(icnp5%5Fo)Ej7ol<k'NWKko.>5F8a/U336Ii67P\1('eIq7AYPfNoKiUT^#j]-WFDJ(<q5ZIGLYK?Xfd+DB++^/<YWN'`]VW!76[^t:3"WT\QK:n.Oopha3qI[q2JhI
 )IV2'e+Dk\<8Ftgd_mIO!-jh#P^*0;8P(6AZoXRcVWYhCS%%[Ic8"_Qm+)",iUWt;!'&Yj0i3m@rFXV?jS/Ma&[b2NPL\!D/bI2]37#N1`9KY0[hui7X&s3U84?5[i2Zg3%b0Q<"L?d2n1e^1uR_foi1_ZcO6?;4<6'b5BaISbNA)2"NEQFI#jkY#0ABECY]tE^?!3>$PVJRJ\[ZO55IqB:/7LcM@TZlElGm?<HM(@jM,X,M?1"8-L&38'"fue4<OVW;Z,l/<eED&#](GipLQM)sD#MP:/>Y]Vb,ka[QPFGlWRZIM+s/(^n&=XM7!kr1:#^C3AZusK%)/\`naHeOPZ&]R(?T*8tg<Hb`7M+=DI'\A,D;ECoeP%5l1_%W+D@PEsY[]WdW008-.SXJ;*EZo6c2@iQSQ\#hmc"A*a-c<Vb0OT`A]Ah\lcpChE\>.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(<Ji!n#p+kSD!VQ`0`G'5pHP38I>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><d3o#[#\"m/"=pJ1M[RPMe.>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-Y<J?>G\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_=)Rr1P,o[=9BTO4Ud"t:D-eN&nl@U(-8IIj=k-4DE-(e9,)HB6d"'D^@6:CT@>?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.<P]2GjCMEnf=r.FNV8UHN6>oJ*0!rW8Xb00#:nE7CcW0fN!1V5<;eUha'!8fB+B1#84EkK*<l=r$8>k#:1WT0Bq(P3i6&-.j`sA>W>
 >Gi["<7o...@9Lf>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`<dqem*eAi'\SrU:^[uF9I+NASGOZ3961o?jRF<M^pt"[A2_8AT.q+9A_@dYOE[L(V3l)?l:=%>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%,%<W>jR*2F58J%g=KMj6nGp8sA9!=68+_@DZ$.(I<If98cYMSau),#@h6b-0L]9Km)Ra?lFOMFB`(5o1NPG-b'*Aj)]Bg]A,bd"S`*klQ<-$Y<2u54C1J/,bN#2N^W?6?tIk8<N]VP#X9/$[@s-ZOeXL_jamV9)Kq^_?/pW+;U;I!T-t>;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<hQE^F;9i$<e2Ab7*CIG@uc1g\Nf5/-&*'%*\qZ3po*WJ<%@b*qSY*F7:i6VJ@D&lQ#Ra$dp0'+gq[2,&B6<gHsHj#V^#@9OV@#RN&p*-T:g[J#!I7au/M$HNfTiY]V*4.LOhq2#+<CugB#I^\lKb@%?CBZ515V9:OIt>.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<U'/bDNfAV%]kd%J:oQ>@(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!@%?<qo@S7muD&@hJh9Ig*>Gos'PGP&&&iK&O&RZJ"JDEJ8qcShG*I"hO3?s6%jp0?LoM8=3NhZo(uKpO8.M1-"3pA]@<Qcki3c!UZu-a-%:e.,`!S=*l4K"WS>>=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</3!Vmg:Mo,@%VV?;I+2BC^#DQaV"A77(:1LHe9o_)_/C>(UkO
 V+UFZ<KPKs):,Boe>,S.d<2\B25lhH7&SW^s*U1a@WmePc^g*nKq(u6gc:b!T5VJWT=e;I%nHpjK+.galZSQ\MAqr2(6hVhLmk_*G]/-;#K]7*s`VrOkPh<CUPTrT4Su>`.!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<uD;kI1E7i;b?=S_FTMUbJtSAN,rg6`?t?0ZN4uQdm$hR[];-oK.u[b6')(aU!#G5p-q^DO7([X7DE.=05^tAk;T"cXp:lBQUfo)hWX-^&tuiKj!`h\kp4ZMd3%AI7`3FD_[jYGKCbSuiROjb`TV,W5!Jg_`rllg["<=oPV_h`Nu%T5lN(toV*"+6,h(eKC?4j>..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:/><KZih*%uD9gLDA^n!)!/H0oXA,=I:&<<5urn@Q<im6Tkb6jbo(&Z0lJNHSi/q>[.7IF3Pl35,`d]#Ge?)gtV\&EVe<T/9B#WW.W8WDlF8s,fKd`h>`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,)E1Gl<f<...@C7e2.A>nIo3^(@OuCa1Ns_DG:t'LG8p0k+'2`rqPSQs)\,pdaM_!cC8+BKSEVV\fWW,r\_*R*81=;fo`dBR5sl5<!2eBR-h7%+'$]Pc2]1V2"`QmV&`4*KBf+G,0N^^6<g0`I47a"1[?8ot>>7K>,G:K/h>e<XmQ7Pm3n;?cStZS)IfXX=Ka.~>
+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...@D><P$e%op8gg\$A)n*9\9AbFfGQu^)Ef43-2V8D!:E0eH-E,V@es)9r@9ppVXm=n<+&-5ZproRBb-8oWq.)1b7V0od$6+pSCqLCMC9Flui%8bk=5:W'2MO!nZcj*d$/jgIZjJ2ba3JYgI-L?Na3GPj&&[3r.3^'sr;"$O:U@%n-&n35h)iMu:"MQt+g#%j1Li-(rqL6(?iI97'hL/A2Y,`7^SFJ5i).F<m8qEm"6s3H%LE^?CA!.8PgRh%WtiR6Y=O&%F-Vft1<\1Hq(dkk>`=\mDk@4=Lp4><g=*]HZ&fiBlU("&r'4eV.P3`EV;fT&j(B[P\G)oGUf=`gH%;hgb4RS]J)0g:*mQE'4FF^XS6trY7\3grP(iuE1u`Xdr!=["DYnX1lbTfT1Y`3BAH<,qpA_KHPJY&rCnn7A_^&-DKam$g+]^r'^JDd?`E?q>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)V2F<i5G$0P664c*9ueD_C3=mlaGa?=:1a9rU?Ru,iUi#q+;:+1$]Oc5SqNn]OJXI/An9;)^';p2S*b7W.kSFftsoKnRc*V;>7&eS:>Z]a"KQiMWT2E%gG<GE\`-]9`!)o%ro4P7;t`hBMdS#':)N#-Fm9P^[:+O,gR2R@W'\Fk5'ROCdkCf9f.^K\-m%KM2
 u`%#612kD(cU_%msHl$5*HRs(Mfjk[BQM;/p7DnqP&u__u>i]VS`b8@#!,kj!@o$&,\f;/]_nQB%(e%=lcQsOtE<GT!d!hi00,DGGp%3Dg3c1tEP(2IFX%u\*oGKf2QotlS+$[U5qY\7F'p'!,:?/e>/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>[<h>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<U/@-TV68`t)aW_Pl;,!*<mU&$uZ7#~>
+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<:7...@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$8gg<An#Pa5Sni@[NqCqVf;$AZ&:bpBf\&9]i,3rBYP83RSWnHP!rmUQhO<m:4bW,(Y?8Sk-3f`maAK_Fn%M'1Ao`FGW"[^IK0o.X^CWg(;\@AXjlX4YkkDEBe3INDJ';T5p30DcXql++p?D\eaqN4Bb.0Y4tkYT\0*MRR?ae$>lV[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%<l%FN`@"Y]^0Z&[cqdlg^]o3".$U]I=5dTigH=68+4E/n``5kgXloFXPNUHI$qj&<;isX<F[=A3:>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]Tn9MFE<Ta[-?mHe99#5Hsfc>ldo3HI>%gg*Y9u\r<I[uOJ+(6uNSXSMjTSRd23d"n[D<&:XN@$J:L\o:E6@Y3\Uj`m'kE6#m-Mo;'1i9BjL"Gh`SO9?j`Q4\-2&@&^o!PHER$%>a8'.n5&qV@6^X##o@E+h=O$dhr'WmdU)\ODEdMKOoGo=Nm.ZFM>.j@Y<-nmKAq/Y/a&`M*hn<cJE?`<e:`1LW:M\'Y;*:<+C_<BpqBUi-NM;&nJX&9`/_WkfQa0XpK!IYc>@at<:&F.!=]a>9fn?FhZY-_S.O@G=14(IiL3"Un&6c]2#M\<n#oJkH.39F+P,*E4fZ-i'?>]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,9J<?U,XBS$4-G^Sc8@9#hXYQ;KC4<1D[OZmY?4#EB3;iNI"rY,Ui0^VT2%0K/?<m2bs#B+JBd</<D'Co`",]>5f(X9F)#tT-O\Q&[X->^'T*2bT&0j%;aT"Mir(9J+u^,B*1dnL,(#H+f5:V=/XRGZueY!s,].M>A9kF`n2)^1hL0JU5VL!l6jK7B<QE)Cj\T@j-rU:VV,aX(#JK*n<sSM7q4AG20G]k8TZS%r/rB5!XGK#n>60RGq_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[<Xm>@HaKtF4qfW+.65CGlGpRlk91SpF?GlO*h;e:L]rporTBG3CI,8^qEDhBg_l],eHobYmRZ'uY&F1^NcXFss7DH^h(dIF1)K-3t#5";[52jr9%e@iW??k56^`0<u#14qVl^MqG-r(X*2JV>]d'5`BOKpf<m$KTe8Om5K\J8aZl24ZKa".<2F`:_o,"J(fe5\\e,L.F>H>L$RAN=nUf.'icI:&6q7nn"Q9-Hg"<oa1]_Pe:=@kN]9bMBGQ[3e9Z0PfaG!VCPKc-3S?E.jJoRgmKq4"oEE'6<ea:Ms6fVQ\!ab])l:*R*LHNhQP+Q#@?aptK(q2M<4YC27]b<D/I$WA.cB7B:tQ&3?`C$I?LWS3qD"n?0.23/lD0@XKoBA)iM8Cnk"Ua8MX;%=XDn[?8mUN=QEU(Pl+7-[!p*[)OP(*)[_'CJS/ADP@f@*"UC<gH-sl*dNo-BF>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<VDK&^ln/6s_q#WSr@S"C`>'d6`_<#5&VX^<<KfO-i3',Gr&9`_Z`idJ8e8*6lT&NfX<6::+KI.8Xg-"L&Qs[n\gcO^o0ckUkKn8a38[naC99,c:PthJ`n,BokW^0*]bHbnU^A)F0m"nu&PrRBKYg'2sY'#tl^*lV]<X(B1HdA+e.4@#+T_6V[-_)'[jng8[c2q9ga+Y?$@f=mCnbFs;"8%/#/8mSUl;dV9,M0o;JRaU>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)<q1AR%dW:@Ps1aNk,4NFXe@D<L:OTd]HgZ3Er2j@78"_.nZPl\B5?;#dYLP4&a6=h@6B(@fYC_RR*>k;k#:`39,SSKE/0\g7bV;8nU-0P<c4:ptNHfb@g\s_VG;2ME4AVu7C@:kbb00_O,)!cjsJhZ"`90=^;B!p4*Je@)S=U((O,7;Vi%]rVQ/sJm$Q9MsO]f?^Pn`8c"efWU?HLoPNquW0D'3;$cb.5O%S'Bs;!kq%tIY'pS&5Gboa<'d$F[aUkla2[&<bi0K&V8nCSE1$P"lRUXnY,rGZaHioa/5u$&m's(Q#fKg)o%FH?`j97bfR@C]8WK=.,%_bjtY$RMmojg%Kjbfjgr4biC57Vgi,lqS6<F,Zg2<N>(`#h(8Ode0NDta".>Oun]*@^E$]&U)[_s*-j0l53;;!q?<gFtI0UUl6+Z$<9bF;1R%eV>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