ZooKeeper系列(5):管理分布式环境中的数据

时间:2021-07-05 16:53:11

引言

本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法、Zab协议、通信协议等相关知 识,理解起来比较抽象所以还需要借助一些应用场景,来帮我们理解。由于内容比较多,一口气吃不成胖子,得慢慢来一步一个脚印,因此我对后期 ZooKeeper的学习规划如下:

第一阶段:

|---理解ZooKeeper的应用

|---ZooKeeper是什么

|---ZooKeeper能干什么

|---ZooKeeper 怎么使用

第二阶段:

|---理解ZooKeeper原理准备

|---了解paxos

|---理解 zab原理

|---理解选举/同步流程

第三阶段:

    |---深入ZooKeeper原理

        |---分析源码

|---尝试开发分布式应用

由于内容较多,而且理解较为复杂,所以每个阶段分开来学习和介绍,那么本文主要介绍的的是第一阶段,该阶段一般 应该放在前面介绍,但感觉像一些ZooKeeper应用案例,如果没有一定的ZooKeeper基础,理解起来也比较抽象, 所以放在这介绍。大家可以对比一下前面的应用程序,来对比理解一下前面的那些应用到底用到ZooKeeper的那些功能,来进一步理解ZooKeeper 的实现理念,由于网上关于这方面的介绍比较多,如果一些可爱的博友对该内容已经比较了解,那么您可以不用往下看了,继续下一步学习。

一、ZooKeeper产生背景

1.1 分布式的发展

分布式这个概念我想大家并不陌生,但真正实战开始还要从google说起,很早以前在实验室中分布式被人提出,可是说是计算机内入行较为复杂学习较为困难的技术,并且市场也并不成熟,因此大规模的商业应用一直未成出现,但从Google 发布了MapReduce 和DFS 以及Bigtable的论文之后,分布式在计算机界的格局就发生了变化,从架构上实现了分布式的难题,并且成熟的应用在了海量数据存储和计算上,其集群的规模也是当前世界上最为庞大的。

以DFS 为基础的分布式计算框架和key、value 数据高效的解决运算的瓶颈, 而且开发人员不用再写复杂的分布式程序,只要底层框架完备开发人员只要用较少的代码就可以完成分布式程序的开发,这使得开发人员只需要关注业务逻辑的即 可。Google 在业界技术上的领军地位,让业界望尘莫及的技术实力,IT 因此也是对Google 所退出的技术十分推崇。在最近几年中分布式则是成为了海量数据存储以及计算、高并发、高可靠性、高可用性的解决方案。

1.2 ZooKeeper的产生

众所周知通常分布式架构都是中心化的设计,就是一个主控机连接多个处理节点。 问题可以从这里考虑,当主控机失效时,整个系统则就无法访问了,所以保证系统的高可用性是非常关键之处,也就是要保证主控机的高可用性。分布式锁就是一个 解决该问题的较好方案,多主控机抢一把锁。在这里我们就涉及到了我们的重点Zookeeper。

ZooKeeper是什么,chubby 我想大家都不会陌生的,chubby 是实现Google 的一个分布式锁的实现,运用到了paxos 算法解决的一个分布式事务管理的系统。Zookeeper 就是雅虎模仿强大的Google chubby 实现的一套分布式锁管理系统。同时,Zookeeper 分布式服务框架是Apache Hadoop的一个子项目,它是一个针对大型分布式系统的可靠协调系统,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,可以高可靠的维护元数据。提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的设计目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

1.3 ZooKeeper的使用

Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理,后面将 会详细介绍 Zookeeper 能够解决的一些典型问题。

注意一下这里的"数据"是有限制的:

(1) 从数据大小来看:我们知道ZooKeeper的数据存储在一个叫ReplicatedDataBase 的 数据库中,该数据是一个内存数据库,既然是在内存当中,我就应该知道该数据量就应该不会太大,这一点上就与hadoop的HDFS有了很大的区 别,HDFS的数据主要存储在磁盘上,因此数据存储主要是HDFS的事,而ZooKeeper主要是协调功能,并不是用来存储数据的。

(2) 从数据类型来看:正如前面所说的,ZooKeeper的数据在内存中,由于内存空间的限制,那么我们就不能在上面随心所欲的存储数据,所以ZooKeeper存储的数据都是我们所关心的数据而且数据量还不能太大,而且还会根据我们要以实现的功能来选择相应的数据。简单来说,干什么事存什么数据,ZooKeeper所实现的一切功能,都是由ZK节点的性质和该节点所关联的数据实现的,至于关联什么数据那就要看你干什么事了。

例如:

  ① 集群管理:利用临时节点特性,节点关联的是机器的主机名、IP地址等相关信息,集群单点故障也属于该范畴。

  ② 统一命名:主要利用节点的唯一性和目录节点树结构。

  ③ 配置管理:节点关联的是配置信息。

  ④ 分布式锁:节点关联的是要竞争的资源。

二、ZooKeeper应用场景

ZooKeeper是一个高可用的分布式数据管理与系统协调框架。基于对Paxos算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是 基于这样的特性,使得zookeeper能够应用于很多场景。需要注意的是,ZK并不是生来就为这些场景设计,都是后来众多开发者根据框架的特性,摸索出 来的典型使用方法。因此,我们也可以根据自己的需要来设计相应的场景实现。正如前文所提到的,ZooKeeper 实现的任何功能都离不开ZooKeeper的数据结构,任何功能的实现都是利用"Znode结构特性+节点关联的数据"来实现的,好吧那么我们就看一下ZooKeeper数据结构有哪些特性。ZooKeeper数据结构如下图所示:

图2.1 ZooKeeper数据结构

aaarticlea/png;base64,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" alt="" width="521" height="668" />

Zookeeper 这种数据结构有如下这些特点:

 每个子目录项如 NameService 都被称作为 znode,这个 znode 是被它所在的路径唯一标识,如 Server1 这个 znode 的标识为 /NameService/Server1;

 znode 可以有子节点目录,并且每个 znode 可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录;

 znode 是有版本的,每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据;

 znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了;

⑤ znode 的目录名可以自动编号,如 App1 已经存在,再创建的话,将会自动命名为 App2;

⑥ znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是 Zookeeper 的核心特性,Zookeeper 的很多功能都是基于这个特性实现的。

2.1数据发布与订阅

(1) 典型场景描述

发布与订阅即所谓的配置管理,顾名思义就是将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息地址列表等就非常适合使用。集中式的配置管理在应用集群中是非常常见的,一般商业公司内部都会实现一套集中的配置管理中心,应对不同的应用集群对于共享各自配置的需求,并且在配置变更时能够通知到集群中的每一个机器。

(2) 应用

 索引信息和集群中机器节点状态存放在ZK的一些指定节点,供各个客户端订阅使用。

② 系统日志(经过处理后的)存储,这些日志通常2-3天后被清除。

 应用中用到的一些配置信息集中管理,在应用启动的时候主动来获取一次,并且在节点上注册一个Watcher,以后每次配置有更新,实时通知到应用,获取最新配置信息。

 业务逻辑中需要用到的一些全局变量,比如一些消息中间件的消息队列通常有个offset,这个offset存放在zk上,这样集群中每个发送者都能知道当前的发送进度。

 系统中有些信息需要动态获取,并且还会存在人工手动去修改这个信息。以前通常是暴露出接口,例如JMX接口,有了ZK后,只要将这些信息存放到ZK节点上即可。

(3) 应用举例

例如:同一个应用系统需要多台 PC Server 运行,但是它们运行的应用系统的某些配置项是相同的,如果要修改这些相同的配置项,那么就必须同时修改每台运行这个应用系统的 PC Server,这样非常麻烦而且容易出错。将配置信息保存在 Zookeeper 的某个目录节点中,然后将所有需要修改的应用机器监控配置信息的状态,一旦配置信息发生变化,每台应用机器就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中。ZooKeeper配置管理服务如下图所示:

图2.2 配置管理结构图

aaarticlea/png;base64,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" alt="" />

Zookeeper很容易实现这种集中式的配置管理,比如将所需要的配置信息放到/Configuration 节点上,集群中所有机器一启动就会通过Client对/Configuration这个节点进行监控【zk.exist("/Configuration″,true)】,并且实现Watcher回调方法process(),那么在zookeeper上/Configuration节点下数据发生变化的时候,每个机器都会收到通知,Watcher回调方法将会被执行,那么应用再取下数据即可【zk.getData("/Configuration″,false,null)】。

2.2统一命名服务(Name Service)

(1) 场景描述

分布式应用中,通常需要有一套完整的命名规则,既能够产生唯一的名称又便于人识别和记住,通常情况下用树形的名称结构是一个理想的选择,树形的名称 结构是一个有层次的目录结构,既对人友好又不会重复。说到这里你可能想到了 JNDI,没错 Zookeeper 的 Name Service 与 JNDI 能够完成的功能是差不多的,它们都是将有层次的目录结构关联到一定资源上,但是Zookeeper的Name Service 更加是广泛意义上的关联,也许你并不需要将名称关联到特定资源上,你可能只需要一个不会重复名称,就像数据库中产生一个唯一的数字主键一样。

(2) 应用

在分布式系统中,通过使用命名服务,客户端应用能够根据指定的名字来获取资源服务的地址,提供者等信息。被命名的实体通常可以是集群中的机器,提供的服务地址,进程对象等等,这些我们都可以统称他们为名字(Name)。其中较为常见的就是一些分布式服务框架中的服务地址列表。 通过调用ZK提供的创建节点的API,能够很容易创建一个全局唯一的path,这个path就可以作为一个名称。Name Service 已经是Zookeeper 内置的功能,你只要调用 Zookeeper 的 API 就能实现。如调用 create 接口就可以很容易创建一个目录节点。

(3) 应用举例

阿里开源的分布式服务框架Dubbo中使用ZooKeeper来作为其命名服务,维护全局的服务地址列表。在Dubbo实现中: 服务提供者在启动的时候,向ZK上的指定节点/dubbo/${serviceName}/providers目录下写入自己的URL地址,这个操作就完成了服务的发布。 服务消费者启 动的时候,订阅/dubbo/${serviceName}/providers目录下的提供者URL地址, 并向/dubbo/${serviceName} /consumers目录下写入自己的URL地址。 注意,所有向ZK上注册的地址都是临时节点,这样就能够保证服务提供者和消费者能够自动感应资源的变化。 另外,Dubbo还有针对服务粒度的监控,方法是订阅/dubbo/${serviceName}目录下所有提供者和消费者的信息。

2.3分布通知/协调(Distribution of notification/coordination)

(1) 典型场景描述

ZooKeeper中特有watcher注册与异步通知机制,能够很好的实现分布式环境下不同系统之间的通知与协调,实现对数据变更的实时处理。使用方法通常是不同系统都对ZK上同一个znode进行注册,监听znode的变化(包括znode本身内容及子节点的),其中一个系统update了znode,那么另一个系统能够收到通知,并作出相应处理。

(2) 应用

 另一种心跳检测机制:检测系统和被检测系统之间并不直接关联起来,而是通过ZK上某个节点关联,大大减少系统耦合。

② 另一种系统调度模式:某系统由控制台和推送系统两部分组成,控制台的职责是控制推送系统进行相应的推送工作。管理人员在控制台作的一些操作,实际上是修改了ZK上某些节点的状态,而ZK就把这些变化通知给他们注册Watcher的客户端,即推送系统,于是,作出相应的推送任务。

③ 另一种工作汇报模式:一些类似于任务分发系统,子任务启动后,到ZK来注册一个临时节点,并且定时将自己的进度进行汇报(将进度写回这个临时节点),这样任务管理者就能够实时知道任务进度。

总之,使用zookeeper来进行分布式通知和协调能够大大降低系统之间的耦合。

2.4分布式锁(Distribute Lock)

(1) 场景描述

分布式锁,这个主要得益于ZooKeeper为我们保证了数据的强一致性,即用户只要完全相信每时每刻,zk集群中任意节点(一个zk server)上的相同znode的数据是一定是相同的。锁服务可以分为两类,一个是保持独占,另一个是控制时序。

保持独占,就是所有试图来获取这个锁的客户端,最终只有一个可以成功获得这把 锁。通常的做法是把ZK上的一个znode看作是一把锁,通过create znode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。

控制时序,就是所有试图来获取这个锁的客户端,最终都是会被安排执行,只是有 个全局时序了。做法和上面基本类似,只是这里 /distribute_lock 已经预先存在,客户端在它下面创建临时有序节点。Zk的父节点(/distribute_lock)维持一份sequence,保证子节点创建的时序性, 从而也形成了每个客户端的全局时序。

(2) 应用

共享锁在同一个进程中很容易实现,但是在跨进程或者在不同 Server 之间就不好实现了。Zookeeper 却很容易实现这个功能,实现方式也是需要获得锁的 Server 创建一个 EPHEMERAL_SEQUENTIAL 目录节点,然后调用 getChildren方法获取当前的目录节点列表中最小的目录节点是不是就是自己创建的目录节点,如果正是自己创建的,那么它就获得了这个锁,如果不是那么它就调用 exists(String path, boolean watch) 方法并监控 Zookeeper 上目录节点列表的变化,一直到自己创建的节点是列表中最小编号的目录节点,从而获得锁,释放锁很简单,只要删除前面它自己所创建的目录节点就行了。

图 2.3 ZooKeeper实现Locks的流程图

aaarticlea/png;base64,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" alt="" width="491" height="608" />

代码清单1 TestMainClient 代码

package org.zk.leader.election;

    import org.apache.log4j.xml.DOMConfigurator;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper; import java.io.IOException; /**
* TestMainClient
* <p/>
* Author By: sunddenly工作室
* Created Date: 2014-11-13
*/
public class TestMainClient implements Watcher {
protected static ZooKeeper zk = null;
protected static Integer mutex;
int sessionTimeout = 10000;
protected String root;
public TestMainClient(String connectString) {
if(zk == null){
try { String configFile = this.getClass().getResource("/").getPath()+"org/zk/leader/election/log4j.xml";
DOMConfigurator.configure(configFile);
System.out.println("创建一个新的连接:");
zk = new ZooKeeper(connectString, sessionTimeout, this);
mutex = new Integer(-1);
} catch (IOException e) {
zk = null;
}
}
}
synchronized public void process(WatchedEvent event) {
synchronized (mutex) {
mutex.notify();
}
}
}

清单 2 Locks 代码

package org.zk.locks;

    import org.apache.log4j.Logger;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.data.Stat;
import org.zk.leader.election.TestMainClient; import java.util.Arrays;
import java.util.List; /**
* locks
* <p/>
* Author By: sunddenly工作室
* Created Date: 2014-11-13 16:49:40
*/
public class Locks extends TestMainClient {
public static final Logger logger = Logger.getLogger(Locks.class);
String myZnode; public Locks(String connectString, String root) {
super(connectString);
this.root = root;
if (zk != null) {
try {
Stat s = zk.exists(root, false);
if (s == null) {
zk.create(root, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
} catch (KeeperException e) {
logger.error(e);
} catch (InterruptedException e) {
logger.error(e);
}
}
}
void getLock() throws KeeperException, InterruptedException{
List<String> list = zk.getChildren(root, false);
String[] nodes = list.toArray(new String[list.size()]);
Arrays.sort(nodes);
if(myZnode.equals(root+"/"+nodes[0])){
doAction();
}
else{
waitForLock(nodes[0]);
}
}
void check() throws InterruptedException, KeeperException {
myZnode = zk.create(root + "/lock_" , new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
getLock();
}
void waitForLock(String lower) throws InterruptedException, KeeperException {
Stat stat = zk.exists(root + "/" + lower,true);
if(stat != null){
mutex.wait();
}
else{
getLock();
}
}
@Override
public void process(WatchedEvent event) {
if(event.getType() == Event.EventType.NodeDeleted){
System.out.println("得到通知");
super.process(event);
doAction();
}
}
/**
* 执行其他任务
*/
private void doAction(){
System.out.println("同步队列已经得到同步,可以开始执行后面的任务了");
} public static void main(String[] args) {
String connectString = "localhost:2181"; Locks lk = new Locks(connectString, "/locks");
try {
lk.check();
} catch (InterruptedException e) {
logger.error(e);
} catch (KeeperException e) {
logger.error(e);
}
}
}

2.5 集群管理(Cluster Management)

(1) 典型场景描述

集群机器监控

这通常用于那种对集群中机器状态,机器在线率有较高要求的场景,能够快速对集群中机器变化作出响应。这样的场景中,往往有一个监控系统,实时检测集 群机器是否存活。过去的做法通常是:监控系统通过某种手段(比如ping)定时检测每个机器,或者每个机器自己定时向监控系统汇报"我还活着"。 这种做法可行,但是存在两个比较明显的问题:

① 集群中机器有变动的时候,牵连修改的东西比较多。

 有一定的延时。

利用ZooKeeper中两个特性,就可以实施另一种集群机器存活性监控系统:

① 客户端在节点 x 上注册一个Watcher,那么如果 x 的子节点变化了,会通知该客户端。

② 创建EPHEMERAL类型的节点,一旦客户端和服务器的会话结束或过期,那么该节点就会消失。

Master选举:

Master选举则是zookeeper中最为经典的使用场景了,在分布式环境中,相同的业务应用分布在不同的机器上,有些业务逻辑,例如一些耗时的计算,网络I/O处,往往只需要让整个集群中的某一台机器进行执行,其余机器可以共享这个结果,这样可以大大减少重复劳动,提高性能,于是这个master选举便是这种场景下的碰到的主要问题。

利用ZooKeeper中两个特性,就可以实施另一种集群中Master选举:

① 利用ZooKeeper的强一致性,能够保证在分布式高并发情况下节点创建的全局唯一性,即:同时有多个客户端请求创建 /Master 节点,最终一定只有一个客户端请求能够创建成功。利用这个特性,就能很轻易的在分布式环境中进行集群选举了。

另外,这种场景演化一下,就是动态Master选举。这就要用到 EPHEMERAL_SEQUENTIAL类型节点的特性了,这样每个节点会自动被编号。允许所有请求都能够创建成功,但是得有个创建顺序,每次选取序列号最小的那个机器作为Master 。

(2) 应用

在搜索系统中,如果集群中每个机器都生成一份全量索引,不仅耗时,而且不能保证彼此间索引数据一致。因此让集群中的Master来迚行全量索引的生 成,然后同步到集群中其它机器。另外,Master选丼的容灾措施是,可以随时迚行手动挃定master,就是说应用在zk在无法获取master信息 时,可以通过比如http方式,向一个地方获取master。  在Hbase中,也是使用ZooKeeper来实现动态HMaster的选举。在Hbase实现中,会在ZK上存储一些ROOT表的地址和HMaster 的地址,HRegionServer也会把自己以临时节点(Ephemeral)的方式注册到Zookeeper中,使得HMaster可以随时感知到各 个HRegionServer的存活状态,同时,一旦HMaster出现问题,会重新选丼出一个HMaster来运行,从而避免了HMaster的单点问 题的存活状态,同时,一旦HMaster出现问题,会重新选丼出一个HMaster来运行,从而避免了HMaster的单点问题。

(3) 应用举例

集群监控:

应用集群中,我们常常需要让每一个机器知道集群中或依赖的其他某一个集群中哪些机器是活着的,并且在集群机器因为宕机,网络断链等原因能够不在人工 介入的情况下迅速通知到每一个机器,Zookeeper 能够很容易的实现集群管理的功能,如有多台 Server 组成一个服务集群,那么必须要一个"总管"知道当前集群中每台机器的服务状态,一旦有机器不能提供服务,集群中其它集群必须知道,从而做出调整重新分配服 务策略。同样当增加集群的服务能力时,就会增加一台或多台 Server,同样也必须让"总管"知道,这就是ZooKeeper的集群监控功能。

图2.4 集群管理结构图

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtAAAAL+CAIAAAALk7SNAAAgAElEQVR4nOzde3QV5b3/8edf6R/gWvEC9qQJbWpRaGMLgWqUJ4JgUkouaAmQEJAgTXIOpCUC+kO0YASRi9ioNdqqhdh641I9KlCLisUigSCQcmuKWoV62rSni9V1Tk7/yO+PJxmG2bNn7509s5+5vL/rtVhk9lye2Xsn89kzs59H9A60/vr5PwAAQLAM+LifZokBL6n9KQMAAKlyMUOkVAQOAAAixMUMkVIROAAAiBAXM0RK5U7g+PgPnwMAAP/TFT4IHAAARAiBAwAAeI7AAQAAPEfgAAAAniNwAAAAzxE4AACA50IVOP45qeR/R4+1+OekEreerPO3z7Ss7a/rH/vf0WP/68mfa38hB+C/nvz5/44e+6+c4f/KGf7PSSXe7cX522f+K2f4ue27tO8yAECXUAWOvy++x0IdTT/dd8SVJ0sdni88d+sf6xXi/O0ztb+KA/C3+1f3CvHPSSXqifrnpBLzrrnr74vv+d/RY916FQAAQRSqwGGhjql/X3yPW0+WOXCc277rXznD/3f0WO0v4cCoKGaeQiAAAHgntIHj031HbAPB3+5frS61nL995udt22IXdJjBCByf7d4XL238df1j6srOPyeV/HX9Y8k/+vfF93zetu3TfUf+UVuvZoi9xpFw8c927/vnpJJ/Tir55MgfnV/4hGnp87Zt52+fqZ6Kv92/2nlbf198j2UeNZtq5Odt2/6++B5zk4zdjF258xMIAAio0AYOdY3gs937jCnqnMS/cob/o7ZeneS3XBBJOIMKHJ8c+aPxH8tGz98+Uy3y98X3GP9P8tF/5QxX9zqoyxxq6+YjbpKLq6N4whsm/jmpxOF6kLpapFryj9p6SzqJ3Zb60XyO5PO2bUb7/774nl4hjCZ93rbNeJ6NXU5mHwEAwRXOwGF7MSU2JahDmnEaI8kZ1L+xR3R1kDZ/XlcHWhV6nB/9+A+f/ytnuCVhmK96JLl47GkGByrTqAO/OSuok0PmI71KD8bKY7elZvhHbb0xxXxTiCVwWG6F+eTIH9VeJ9xHAEBwhTBwqOsdlq+TfLZ7n+WI+PEfPj+3fZeRSxLO8HH/kVKlkNiz/bH3XarF1RHU+dGP7a5x/KO23jhOD2DxpF7+9Y8ZscPYTRXXLJeTzE+p7bYsMcIcWcyBw/Z5TuYJBAAEWggDhzryWW6BtEQHg3HsTDjDxzGXVCwnOYwjt5mxTudHP7Y7ipuP0wNYPHnqGkevEOquEbXd2G05Bw5zTFHnKozIYt6ReM9zMvsIAAiu4AWOv3z+D8NHf/jcQh3buu9fbZl+tv84Z574p/5rB8nM8FF/4Pio/yTKv3KGf3zkj8bM6tGz23dZJPPoR/1H8dh9UfMMYPGUfP7kz1WkMLb7l/WPpbQt83Ol7u2w3RHb5znJpwgAEFyhChxnt+9SZ/5j91OdyTeig/KX9Y+pI2syM3xkChwf9R+hzYdVdf/jn/YdsX2inR/9yO4ori4xqEUGsHhKVA5Qu2/Z6+S3Zdyo+6+c4ebMZw4cts9zkk8RACC4QhU4+m4jMJ11MFPfyzCOo8ZZiuRnMAeOj/qPo8ax889t22wjSzKPftR/J6Yxw1/6vyeS/OLJB46z23f9c1LJn9u2qR//tO+IupxhTFFrMx/7/9y2zXhi421LNVI9S+ZlzYHDeBqNbf1l/WNqNxPuIwAguIIdOM784XPDZ9t39QrRK8T/5Qy3+Ov9q9U8/zN6rHmG/xk99rPtu8wrcZ7hf0aP/b+c4eb51Q2kf1n/mPrxL+sfMxZUM5vnd37UMr1XiP8ZPda8rWQWN8/v4JN9Ryx7+n85w429UE+m2oR5W5/u3pdwW//Xf7eHeeLf1JdN+p/JT3fvs2z9v2vrk9lHAEBwmQ/fLuaJhOV+4Djzh88/277LlnmeT3fv++v9q/96/2rL9GRm+HT3vtiJn23fZRyJlXNt2/62+J6/rH/MdhPxHjWO4mqGeM2Lt3hsMxL6dPe+v6x/zGFbn23f9bfF98Q+FQ7bUk/Rx0f+aJ748ZE/2j5vakc+2XckyX0EAARXqAJHoKV0igIAgGAhcPgFgQMAEGIEDr9QFy+0NwMAAC8QOAAAgOcIHAAAwHMEDgAA4DkCBwAA8ByBAwAAeI7AAQAAPEfgAAAAniNwAAAAzxE4AACA5wgcAADAcwQOAADgOQIHAADwHIEDAAB4jsABAAA8R+AAAACeI3AAAADPETgAAIDnCBwAAMBzBA4AAOA5AgcAAPAcgQMAAHiOwAEAADxH4AAAAJ4jcAAAAM8ROAAAgOcIHAAAwHMEDgAA4DkCBwAA8ByBAwAAeC6AgePP/zCcOf05AADwPwIHAADwHIEDAAB4jsABAAA8F/DAcepzAADgf+bDt4t5ImEROAAAiBACBwAA8ByBAwAAeI7AAQAAPEfgAAAAniNwAAAAzxE4AACA5wgcAADAcwSOxEbfPlfqqNnVc7S/PwAAcAWBIzEppdj298yTUmp/fwAA4AoCR2JSSrHtb5knpfz90dMnOv+o/V0CAECaCByJSSnF1u7MU4Hj90dPa3+XAACQJgJHYlJK8cpfM4/AAQAIDQJHYlJK8fJfMo/AAQAIDQJHYlJK8fJ/pWVqvRg6XDz6fkpLETgAAKFB4EhMSile+jwtQ4eLocNTXYrAAQAIDQJHYlJK8eLnA3ffNiGEuHlmqgsSOAAAoUHgSExKKV7488AVlAghxH1bU12QwAEACA0CR2JSSvHCuYFT11NSX5DAAQAIDQJHYlJK8cuzA9TwYyGEmFI3gGUJHACA0CBwJCalFL/4bICuLhBX5oonOgawLIEDABAaBI7EpJTi+U8H4vFD4spccXXBwBYncAAAQoPAkZiUUjz/p4GYvkQIIeY8MLDFCRwAgNAgcCQmpRRtnwzElbniytwBLtv2CYEDABAaBI7EpJSi7eOUrdsjhBCjJw9k2baPRdvHBA4AQGgQOBKTUootH6VMThdCiLqNA1l2y0diy0cEDgBAaBA4EpNSis1nUnZljrgyZyAL9iNwAABCg8CRmJRS/PyPqbn7eSGEGP+9lBc0IXAAAEKDwJGYlFL8vCs135okhBB3P5/ygiYEDgBAaBA4EpNSiuf+kJorcsQVOSkvdTECBwAgNAgciUkpxbOnU3DnOiGEKK5NbakYBA4AQGgQOBKTUopnTqUg71viihyx8bepLRWDwAEACI0gBo7/Npw59ecMSC1wbPytuCJH5H0rzbTRHzhO/f7oqczsJgAA3iFwJCalFD87maxb5wkhRNWKFBaJg8ABAAgNAkdiUkrx0xPJ+o/HRcUPUpg/PgIHACA0CByJSSnF08czj8ABAAiNoAeOcxkgpRRP/z7zTIEjE7sJAIB3zIdvF/NEwgpa4HiqM/MIHACA0CBwJCalFK3HMo/AAQAIDQJHYiUlJVJHFReXEDgAAOFA4EiWOvanyjhLkQ7t7xIAANJE4EjW8WOntQSO48dOa3+XAACQJgKHt6SU2tsAAIB2BA5vETgAADhD4PAagQMAgDMEDq8ROAAAOEPg8BqBAwCAMwQOrxE4AAA4Q+DwGoEDAIAzBA6vETgAADhD4PAagQMAgDMEDq8ROAAAOEPg8BqBAwCAMwQOrxE4AAA4Q+DwGoEDAIAzBA6vETgAADhD4PAagQMAgDMEDq8ROAAAOEPg8BqBAwCAMwQOrxE4AAA4Q+DwGoEDAIAzBA6vETgAADhD4PAagQMAgDMEDq8ROAAAOEPg8BqBAwCAMwQOrxE4AAA4Q+DwGoEDAIAzBA6vETgAADhD4PAagQMAgDMEDq8ROAAAOBPEwPFf5/7b8MeT53xOSqm9DQAAaEfg8BaBAwCAPxI4vEbgAADgj0EPHF0nz/mclFJ7GwAA0M58+HYxTyQsAgcAABFC4PAWgQMAgC4Ch9cIHAAAdBE4vEbgAACgi8DhNQIHAABdBA6vETgAAOgicHiNwAEAQBeBw2sEDgAAuggcXiNwAADQReDwGoEDAIAuAofXCBwAAHQROLxG4AAAoIvA4TUCBwAAXQQOrxE4AADoInB4jcABAEAXgcNrBA4AALoIHF4jcAAA0EXg8BqBAwCALgKH1wgcAAB0ETi8RuAAAKCLwOE1AgcAAF0EDq8ROAAA6CJweI3AAQBAF4HDawQOAAC6CBxeI3AAANBF4PAagQMAgC4Ch9cIHAAAdBE4vEbgAACgi8DhNQIHAABdBA6vETgAAOgicHiNwAEAQBeBw2sEDgAAuggcXiNwAADQReDwGoEDAIAuAofXCBwAAHQROLxG4AAAoIvA4TUCBwAAXQQOrxE4AADoInB4jcABAEAXgcNrBA4AALoIHF4jcAAA0EXg8BqBAwCALgKH1wgcAAB0ETi8RuAAAKCLwOG1EASO0cWVkqKCXLOra7T/HgEgcHhLBj9wSCnFot8AwRWCX0MgBAgc3grBXzoCB4JOStl59NTxY13af5uAKCNweCskgWPhW0BwqcDRefSU9t8mIMoIHN4icADaETgAPyBweCskgeM/fg0EF4ED8AMCh7fCEjh2A8FF4AD8gMDhLQIHoB2BA/ADAoe3QhI4/n2Xr1X9TMz9pf5mwK8IHIAfEDi8ReDwXNXPhBBi+A2am/G9x8S4uaL8Yf1PCGIQOAA/IHB4KySBo2Gnf113mxBCTFxi89D3WvrM/YW3bRh+gzBq3BzRsFPc1CBuatD/5CSj5P6+NocXgQPwAwKHt8ISON70ryFXiSFXWSeOmyOGXHUhBAy5Sgy9VpSt9aQBE5cIIcTQa8X3fizK1oqyteJ7P+7b7vd+rP/5SeYJ7MtJulviGQIH4AcEDm+FJXC84VNlDwkhxPDrL5o49Nq+kHHNZDGuRoyrEcOv788lHrThmslCCFH20EUTh19vbZV233tUDLnKplXXTRNDrxWzntbfQs8QOAA/IHB4KySBo/51nxoxWQghStdcmJI/TQghBg8TM5+6aM45W8Tw6z1pg8o3tz+q/9lwdvujfWditLck4wgcgB8QOLxF4PDW4GFi8LALP87ZIgYPs0YQBzOfErc/2sf20Tlb+v4fb7bbH+0LHBObxO2PXkg5M5+yJh7VPGM9sSu8/dELm4s3cc6WC6uN1x7FsqqZT4mJTX2BwzKDalXs7ptba/uoeWfjzeYPBA7ADwgc3gpJ4Kj7Tz+a0CSEEPkVF6bcWNd3TE247IxWkfttYa7Bw8SEpovmGTxMDL1W3LapL1KoMq987GxhqcHDLixr/F/Jr+gLQ5a6bZOo+09x2yb7lqs2GD8OvVYMHiZqX77QpLGz+x4aMemi9Q8edtEzE7tpY7VqVaoZBue1mVtifhoHD7Ouxx8IHIAfEDi8ReDwkDrUzWi1TjGOwfHUvtx3NB0xSdy2Sdy2SeRX9B0yi1dcdJBWhl4rJjSJCU19x+YRk/pmKF0jxs7uW1V+hRg7W9xYd9GyxqpUNLFsbvCwC01NKXCof8fOFvkVfQ1WzTDWP6Gpr1VGhFIzGxsdO/vCnsYGDvU0Dr1WlK4Rt20SN9Zd2EfbltxYJ0rXiBGT7HfBBwgcgB8QOLwVlsDxmu/U/FwMHiaGXnPRxKHXCCFE6eoEy6pDY37FRRNv/L4Q4qIVGqHEstHBw2w2etsjF020zGa7lHnKbY9Yt24saJ6otjV4mHVzqm3mHycsFkKI3G8n3oSl/WpBy2y3PdK3C8ZW1FJDr7lou+oZm/Gk/rfHxQgcgB8QOLwVksDx/Vd9p/D7QghR+P2LJl55jRBCTNuYYFl17Jz9nM10IcSMn1w0m+2yCTdqmW3wMHHlNU5LTdsohLDOE7ugWsqy17ZiVxhvE5aWqNMbN//QOpuabmxaLTX1wYvm+dotST3/GUfgAPyAwOGtkpISGfzSfsCwceU1NqHB9ihoMfs5+yQRe+i1nU3NY4SS2KVsl1U/znsp7gwpBY54R/TZz4mpD4qCalFQLb5RPsDAES+NFVQLIURBtVNL1DzJ5KHMkgQOwAcIHEhASikW/MpfKp/ou15gma6OggXVTstWbOg77sY+pBav2ND3ozr0Os9jOyV22cIFfRv9brP4bnPfmYBvlCdulQoczttSvlF+4aYTxbLCeJtIZq8X/OpC4HBoiWUe3yBwAH5A4EACUkqxYIe/qI/vN//AOr2gqv+YGn9ZFVYGD7N56MJBdIdYsKP/0Os4j+2U2GVzx10IAWrr3yi/aP4LaWCHdT3mibbbMp6Qr90iqp+Nu8J4m4jdayFE5RP2z21BlVNLLPP4BoED8AMCBxLwY+CwjQILdojqZ/uOl99tTry4cWyOt1q3AoeKOOowXPmETVxYECcNVD6RbOCI3aMBBw71Y2yYU9ONJ5bAASBFBA4kIKUUd273kSkPCCHE1ybaP/q1iX2nEKY8YF3qyhGi6pkL81jWMKZKCCFyxl2Yoo7ilvVfOUIIISrWO02xLDv9cSGEuHKEKPqBqFjfR7UkdhFjetUzfWu+ckSCbcUua+yjedmK9dYptuss+oHNbOo5Nz8bti1Rz+GYKv1vkosROAA/IHAgAd8FDnUoteSJ2COoOmp+vUx8bWLfaQ/jeFn1TN+UnHFiTJUYUyVyxvXNYD5muxU47twuvl4mLDV4mLhyxEVLGRFhTJX4elnfDOpf520Z679yhJjygJjygMgZ138Pxwhrq1TSGlN1IW/F2yPVEjWnWnDyPQlaQuAAEB+BAwlIKcX8bT4yeKgYPDTBPGNm9c0mRN9/rp4oZv3swgzfe0zkjOubQc2TM+6iGeJtSC31vcesU8rXOS175QgxeKiYdLcoXyfK14kpq8TVE/u2G7tyNf3qiWLOL/oa5rwt5eqJF3bnyhGifJ112fnbRFHjhfUbD9mu07y2wUPFlSPElFU2TbUspZ72G+7U/ya5GIED8IPgBY7Pz/634Q8nzsFrUkoxf6tfFC0SQoivlyY186yfivKHxayfOs1T/rAof9jbNt8wXwghbphvna5OEli2rto84G2VPyy+15J4HufnxPLkJDmzj0kpjx05dezIKe2/TUCUETiQgL8CR85YIUTiY6qvjJklhBCT7rZOV2dBgn849z8CB+AHBA4kIKUUta/4wsyn+07va29JSuSivgsT19eKsrWibK34zsq+5HT1BP3NiwACB+AHBA4k4KPAUfuKKFsrZj6tvxmpGj3zwi0Rxo0Ro2fqb1g0EDgAPwh44Dh+Dl6TUop5L8MFtz0qSteK0rXitkf1NyZKLgQO3b9NQJSZD98u5omEReAIDCmlmPcSEFwEDsAPCBxIQEop5r0IBBeBA/ADAgcSkFKKO14AgovAAfgBgQMJEDgQdAQOwA8IHEhASinm/hIILgIH4AcEDiRA4EDQETgAPyBwIIGS4hJJUUGu4uISAgegHYEDSVF/r+EF2f/5G17T/nsERBmBA0npPHpa+9EirAgcmdF59LT23yMgyggcgGZSSu1tAACvETgAzQgcAKKAwAFoRuAAEAUEDkAzAgeAKCBwAJoROABEAYED0IzAASAKCByAZgQOAFFA4AA0I3AAiAICB6AZgQNAFBA4AM0IHACigMABaEbgABAFBA5AMwIHgCggcACaETgARAGBA9CMwAEgCggcgGYEDgBRQOAANCNwAIgCAgegGYEDQBQQOADNCBwAooDAAWhG4AAQBQQOQDMCB4AoIHAAmhE4AEQBgQPQjMABIAoIHIBmBA4AUUDgADQjcACIgiAGjr8b/nD8LBB0UkrtbQAArxE4AM0IHACigMABaEbgABAFQQ8cnwFBJ6XU3gYA8Jr58O1inkhYBA6gD4EDQBQQOADNCBwAooDAAWhG4AAQBQQOQDMCB4AoIHAAmhE4AEQBgQPQjMABIAoIHIBmBA4AUUDgADQjcACIAgIHoBmBA0AUEDgAzQgcAKKAwAFoRuAAEAUEDkAzAgeAKCBwAJoROABEAYED0IzAASAKCByAZgQOAFFA4AA0I3AAiAICB6AZgQNAFBA4AM0IHACigMABaEbgABAFBA5AMwIHgCggcACaETgARAGBA9CMwAEgCggcgGYEDgBRQOAANCNwAIgCAgegGYEDQBQQOADNCBwAooDAAWgWtcBROmuCpOJUdVWN9hcI8AiBA9BMRixwSCk3HS6Frai9GRApBA5As6gdYwgczoHj90f/oP01ArxA4AA0i2DgeKRjKmxJKY8dOan9NQK8QOAANItk4PgubBE4EGIEDkCzSAaOKbBF4ECIETgAzQgcIHAgCoIXOP782d8Np3//GRB0Ukrtbcjw/j7S8R3YklIe+/Ck9tcI8AKBA9AsgoFjY0eJg3u2jx9+3aXzHvmW82yhROBAiBE4AM0IHBbjyv5NCDHrgW9oP/wTOAAXETgAzSIYODYcKnZwWfYXLsv+gvM8YUXgQIgFO3Cc6vwMCDoppfY2ZHh/HY64sx74hhBibNkXtR/7dQWOox+e1P4aAV4wH75dzBMJi8AB9Ilk4Lg1nlFFVwgh6lsLHOYJqLu33Tiq6IpRRVc4zEPgQIgROADNIhg41h+aHE9W9qCs7EEOMwRUSUNeVvYgIYTz3hE4EGIEDkAzAoehYtkIIURJQ5554h0brxtVdEVu/qW5+ZeOLfvifbsuWvzB9ybK2Tnq0dz8Sy3L3rdL5uZfesfG69YfmqxWMqroCvV/9R8Ly3Tnlav55eyc9YcmG7NZmqfk5l+alT2oYtkI9R8CB6KJwAFoFsHAse7gJFu5+UOysget2DnemFLckKfOCuTmD1GPFjfkGY8u3VqoThsYj6r/GzM0bhknhJDVOepRZd3BSWrOutbR5q3XtY4WQowsujzJlav15OYPKSi7SjUyK3tQ45Zxsfslq3Oa904wdjDe7q87OInAgRAjcACaETiUFTvHq+O35YielT1IHa2NHGAOKEKIGatGGVPUsd8IJSpwmKOASjMqxxSUXWXellrWWFvClRvBxZjNHJUcEhWBA9FE4AA0i2TguCWWrP6SEGLGqpHmif3nJGzmVyckCsquskw3L9K4ZawKBHWto83zrNh5U+yazVOSWbn6UQhR3PAV2xbG6g8ccWcgcCDECByAZjJ6ZXustc0WI4suVwf+FTtvsjxU3PAV24N9bODIzR9ie+w3BxFLwkhm5c55iMABWBA4AM1kZM5wvLr913fMrZVSrjs40aKu9Vv9909cNH3p1utVMsjKHjSy6PK61m8ZD6ksYtyZYVAT1TyNWwr6A4d1izNWXSuEKCgbpn4sKBsmhDDWn8zK1x2c2B84rCuPpz9wxJ2BwIEQI3AAmkUhcLz/7uHGRU3GGY6HD06wUMf777d+M/ahhw9OmLHq2pFFl6mLI7c2fFlNVFPGV2cv2lJgsWTrt9U8i/oDh+1qVVyI/X+SK49dKiEVOBxmIHAgxAgcgGbhDhyH208/sPIhyyUV52N/PN9v/aZ5tlsbvmzOH7acA4dKFd9v/aY62zG+Ott4KJmVEziAlBA4AM3CGjg6D3+0aeMTJcUlsfdwrG2/2axy5TVCiILSYZbpsXLyhwghFm4es7b95gVPXieEGFl0mcP8CzePEULk5A+xfdTYrkoed20dZzyUzMrXtt+sAkfCZpvb7zw/gQMhRuAANAtl4Hj/3cPVVTXxbhq1HGVjj/fKXVvHFZQOW/5moZEeLAd4lT8sSaVy5TVzNnw9mcBhJAbbeRKunMABpITAAWgWysChvLVz3z3LVpijxi233CKlfKi9yCwr+5Ks7EssEx9qL7pr61ghhHo0J3+w+k/lymuMGRZuHp2TP1jNY8wghChb8lVjBiFETv7g2JUrY0qHqltDjEWSX7lDyy3Mixt7NLLostg5CRwIMQIHoFmIA4dy/70PVJRPU4Fj2rTbpZQPtV9QtiRPCDG5Ptc80XDX1oLJ9bk5+YNz8gffVP1vy9+8PnaeypUjRhZlqXkm1+cueDLfeGjVuzdOrs8tW5Jnu3Jj/fG27rzyh9ql87LmfVRzmtVsGBk7J4EDIUbgADQLd+B4dfuvF8yv6zz80V1Nd0spF8yvswQO9enfNklEEIEDIUbgADQLceDoPPxR5fSZ7797WP24YH6dih1r2scrTVsL1CUPY0rEETgQYgQOQLMQB457lq149qe/MH58/93DmzY+YQ4cszeMzMkfPHvDSO1Hep8gcCDECByAZmENHC8+v6NxUZPt/q4+cBNsETgQYgQOQLNQBo4D73dWV9UceL/Tdn9XH7gRtggcCDECB6BZKANH46KmF5/fEW9/tR/XfYvAgRAjcACahS9wPPvTX9yzbIXD/q4+UAhbBA6EGIED0CxkgeP9dw9XTp/Zefgjh/1dfeAG2CJwIMQIHIBmIQscC+bXvbr91877++AH18MWgQMhRuAANAtT4Ni08YmHHtyQcH+1H9d9i8CBECNwAJqFJnC8tXPfHXNrHS6mKLbjx1KqiotLCBwIKwIHoJkMReDoPPzRHXNr39q5L8n5j354EvFofzUBLxA4AM3CETgeenDDpo1PJD//sSOntB/X/enYkVPaX03ACwQOQLMQBI43X3vnjrm12psBwM8IHIBmQQ8clhHaAMAWgQPQLOiBwzJCGwDYInAAmgU6cGx96fV/r1+kvRkA/I/AAWgW3MDhMEIbAFgQOADNghs4HEZoAwALAgegWUADh/MIbQBgQeAANAti4Hj/3cPVVTWH209rbwmAoCBwAJoFMXAkHKENACwIHIBmgQscyYzQBgAWBA5As2AFjnd/c6C6qibhCG0AYEHgADQLUOBIdYQ2ADAQOADNAhQ4Uh2hDQAMBA5As6AEDkZoA5AOAgegWSACByO0AUgTgQPQLBCB4757Vz31k59rbwaA4CJwAJr5P3AwQhuA9BE4AM18HjgYoQ2AKwgcgGY+Dxx3Nd3d9tzL2psBIOgIHIBmfg4cjNAGwC0EDkAz3wYORmgD4CICB6CZbwMHI7QBcBGBA9DMn4Hj8R8//cDKh7Q3A0BoEDgAzYekXVwAACAASURBVHwYOBihDYDrCByAZn4LHIzQBsALBA5AM78FjvVrH12/9lHtzQAQMgQOQDNfBQ5GaAPgEQIHoJl/Akfn4Y+qq2re/c0B7S0BED4EDkAz/wQORmgD4B0CB6CZTwIHI7QB8BSBA9DMD4HjcPvpyukzGaENgHcIHIBmfggcjNAGwGsEDkAz7YGDEdoAZACBA9BMb+A48H5n5fSZjNAGwGsEDkAzvYGDEdoAZAaBA9BMY+BghDYAGUPgADTTFTgYoQ1AJhE4AM20BI7Owx8tmF/35mvvaN99ABFB4AA00xI4GKENQIYROADNMh84GKENQOYROADNMhw4GKENgBYEDkCzDAcORmgDoAWBA9Ask4Hj1e2/XjC/TvsuA4igAAaOT/9mOHXsUyDopJSZ2dDhA6cqp888sK9T+y4DiCACB6BZxgLHXYvvbnvuJe37CyCaCByAZpkJHG3PvXTX4ru17yyAyCJwAJplIHAc2NdZOX3m4QOntO8sgMgyH75dzBMJi8AB9MlA4Fgwv+7Vbbu17ymAKCNwAJp5HTie+slz9y1fpX03AUQcgQPQzNPA8e5bH1RX1XR2nNG+mwAijsABaOZd4OjsOLNgft2br76tfR8BgMABaOZd4OgboU33DgLAKQIHoJ1HgePNV99eML+OiykAfILAAWjmReDo7DhTXVXz7lsfaN87AFAIHIBmXgSOB3605vEfP61912yVzpogqThVXVWj/QUCPELgADSTbgeOV7ftXjC/Tvt+OezvpsOlsCWl7PzwtPbXCPACgQPQzN3A4f8R2qSUmw5PhS0p5dHDJ7S/RoAXCByAZu4GjnuWrXj26ee175Tz/j7S8V3YInAgxAgcgGYuBo5AjNBG4CBwIJoIHIBmbgWOoIzQJqV8pGMKbBE4EGIEDkAztwLHv9cv3Pri69p3J5n91X5c9y0CB0KMwAFo5krgCNAIbVLKjR3fcfbD5wsTzhNKBA6EGIED0Cz9wBGsEdqklBs7ShxMW3atEOI7/36182yhROBAiBE4AM3SDxx3zK0N0AhtCQPH8OsuvSz7Cz/aPUH74Z/AAbiIwAFolmbgCNwIbVLKDYeK47l/182XZX8hN/9Sh3lCjMCBECNwAJqlEziCOEKblHLDoVvjKZqdK4SoWHaNwzxBdPe2GyuWXVPS8NX61gKH2QgcCDECB6DZgANHQEdok1KuP3RrPFnZg7KyBznMEESjiq4QQqhdE0Lk5l/6g7brbeckcCDECByAZikFjvff6Xh12+5Xt+0+5e8R2pz3d/2hybbqW8cIIUYVXWGZvmxb4Q/avv2Dtm/ft8t+WfXoD9q+bfuQeSXLthWqieo/sRuKne6w8mXbClWT7tslHRqQm3/pzAdG3bdL3rdLji37osoctjtC4ECIETgAzZIMHJ0dZx56cP20abcvmF+3YH7dd0q+UzVrtvbGD2x/1x2cZKug7CohRF3raGPK0q2FuflDRH9lZQ8qXzrCvEhxQ546bWDMMGPVKOPRxi3jhBDFDXkzVo0yZlh3cJI62WDZ+oqd4y3TnVeu1pObP6RxyzhjtsYt4+LtnXmp2K0rBA6EGIED0CzJwHHPshXGzaGHD5yaOaNqdnVNIHr6it3f5I/EI4suF0KULx3RuGVc45ZxsjqnuCHPHAiEELn5Q+paRzduGTdj1Sh14DciiwocKrIUlF1V3JBXUHaVebXmbZUvHSGEkNU5Sa7caLCKHWrlK3aOTxg4cvOHEDgQQQQOQLNkAseLbdsbFzUZP6oR2g7s6yydWqq9/QPYX9tjrToJoQKB5RSC7fzqhITl0brW0UKIkUWXmwNH7GrVbJZlVS5ZurUwyZWr5sWuhzMcgC0CB6CZTK6M2zXMI7SVTi1NcnFf1bqDt8RSZx2Wbr3BPFEdmxu3jI2dv3zp14QQxQ1fsUzvP5zfsu7gLY1bxvZfRrEurmZbsfMm9eOKnTf1J4xkV278aGmzM7XmgrKrbB+VBA6EF4ED0Ewmd4ZDjcp2YF9ndVXNgX2davr773T4f7Q2s1e37Y4XOCzHcqW44SsqMRSUXWU5rsvqL6nzDcUNXzGLDRxGjDBT94uUL/2aOQcYPyaz8nhtdtC892a1SPPemwkciBoCB6BZMoHDEJQR2my9+9YHJcUlUsqHD060KF96tRDi1oYvxz40Z8M3jPtGRxZdfu/OG9V0NVGdlrAYWXS5mmfRlgIVOGJXu2Tr9eaH1H0VKa384YMTVXqIXXk8arVzNnwj3gwEDoQYgQPQLPnAEaAR2mId2Nc5bdrt6pLKg+9NePjgRfqP94WW6Ybvt35zZNFl/RFhwsMHJ4yvzu7PKPaLPHxwgilw2Dyq4sK9OwuXbP22EGJk0WXGQ8ms3FiD8zyGgrJhQogZq651mIfAgRAjcACaJRk43n+no3L6zGB1KmpQfZQZ93AsabvZfJS9d2ehOpeQ8JitbtJcsvXbDx+coE6KjK/OHnDgUKmifOnV6j/mKJDMylMKHMmkDQIHwo3AAWiWZOAI1ghtFv9ev9B802jdhqK17Tcb1PG+cuU15onK8jcLzT/m5A/Jyh6kJi5/s1Ad7xduHmNZ6oF3x6v/LNw8RgiRkz8kds3GGtQ6s7IHxT7kvPK17TfHLmiroHSYii8J5yRwIMQIHIBmyQSOwI3QZnbf8lWWb6lU3SXXthcZsrIvycq+xDxFWbh5dFb2JQWlQytXXrPgyesKSoeqCx/GDCqpZGVfMr46e8GT11WuvGZ8dXZW9iW31g831iCEyMkfHLtyJSd/cN/3ZkuHWh5KuHKHlpuVLfmqWs+t9cPN5mwYFTszgQMhRuAANEsYON5687d3zK0N6MWUTRueiP1a7NSZ8qH2PguezBdCjCzKMqaYjSzKysq+pL+jz0vGlA61zFC2JM+YQc2Tkz/4rq0F6tGFm7+VlX1JvJUbi2dlX7Lgyfx4j8Zb+UPtUi0bb+XK5PpcNZuFbasIHAgxAgegmXPgCOgIbcqr23YbfbGbA8fNEy8cYseUDhVC2B7vDQs3f2vh5m85zHDX1oKE8wyYpysncCA6ghc4zn36N8PJY58CQSeldHh0zYPrN214Qnsj0/f4j5/+f3ffZ5zwuOdX49e0j1/TPl593Ff/hwoc2l8swAsEDkAzh8Dx6rbdd86v095CVzTUL9z64utqf2sfHL/o6fFr2sdPX/k1IcSY0iu1H+l9gsCBECNwAJrFCxwdB05VV9Xse6dDewvTd6zjTElxybGOM2p/17Tf9KM9N61pv2lN+03/sfmb6j9Y034TgQMhRuAANIsXOO5ZtuKZp5/X3jxXmE/VSClXH7gRtggcCDECB6CZbeB4oW1746Im7W1zi/lOFAIHgQPRZD58u5gnEhaBA+gTGziMEdq0t80t1VU1v37zt8b+rj5QCFsEDoQYgQPQLDZwGPdXhkPHgVMlxSXm/dV+XPctAgdCjMABaGYJHM88/fw9y1Zob5WLLHskpXzwgxtgi8CBECNwAJqZA8e+dzoqp89U3+YIDcvdr1LKBz+4HrYIHAgxAgegmTlw3DG39o1X39beJHdNm3a7+cu9JcUlsZ2dU6qKi0sIHAgrAgegmewPHJs2PLHmwfXa2+OuX7/52+qqmtjpRw+fQDzaXzXACwQOQJs3Xn1bjaSqLjrcMbc2ZBdTTh779PEfP73qR2tipx/78JT247o/HfvwlPZXDfACgQPQQyWM1p88J6V85unnp04tNb44GiYh+8YNgAEjcAAabH3x9Yb6her/0nHwtkAz92gOIOIIHIAGjYuaXmjbrv4f4sARpsHnAKSJwAFoYP7iRogDh7lHcwARR+AANLB09a29PRnYTQARR+AANFi39tF1ax9V/w9r4LD0aA4g4ggcgAbHOs40LmpSHX6HNXCEr492AOkgcAB6GPc3hDVwWHo0BxBxBA5AA/PXN8IaOCw9mgOIOAIHkGnHOs5UTp8Z7m+pvPPWB5XTZ2pvBgD/IHAAmRY7eqr2JrkuXo/mACKLwAFk1Att2xsXNZmnhDJwmHs2A4CTBA4gkw7s66yuqjmwr9M8MXyBgx7NAcQicACZY/u5P3yBgx7NAcQicAAZEq9fivAFDnO3ZgCgEDiATNj3Tkfl9Jm2VxnCFzjo0RxALAIHkAl3zq97ddtu24dCFjjo0RyALQIH4LlNG55Y8+D6eI+GLHBsee6luxbfrb0ZAPyGwAF469dv/vaOubUOX9kIWeCgR3MAtggcgIeOdZy5Y26t8w0NIQsc9GgOwBaBA/CQMUKbgzAFDno0BxAPgQPwSpLdUYQpcNCjOYB4CByAJywjtDkIU+CgR3MA8RA4AE8kf+9kaAIHPZoDcEDgANwXO0Kbg9AEDno0B+CAwAG4zHaENgehCRz0aA7AAYEDcFmq9zGEJnDQozkABwQOwE3xRmhzEI7AQY/mAJwROADX7Huno7qqpuPAqZSWCkfgoEdzAM4IHIBrHEZocxCOwEGP5gCcETgAdziP0OYgHIGDHs0BOCNwAC54560PqqtqBtYFRQgCx753OqZNu117MwD4GYEDSFcyI7Q5CEHgoEdzAAkROIB0JTNCm4MQBA56NAeQEIEDSMsbr759x9zadNYQ9MBxrOPM1KmlqX43B0DUEDiAgUt+hDYHQQ8c9GgOIBkEDmDgXPkuaNADBz2aA0gGgQMYoK0vvt5QvzD99QQ9cNwxt/aNV9/W3gwAPkfgAAYi1RHaHAQ6cNCjOYAkETiAgXDxexmBDhwvtG1vXNSkvRkA/I/AAaRsACO0OQh04KBHcwBJInAAqRnYCG0OAh046NEcQJIIHEBqBjZCm4PgBg56NAeQPAIHkIIBj9DmILiBgx7NASSPwAEkK50R2hwEN3DQozmA5BE4gKSkOUKbg4AGDno0B5ASAgeQlDRHaHMQ0MBBj+YAUkLgABJLf4Q2BwENHPRoDiAlBA4gAVdGaHMQ0MBBj+YAUkLgABK4b/mq1p885936gxg46NEcQKoIHIATt0ZocxDEwEGP5gBSReAA4nJxhDYHQQwcXp/1ARA+BA4grrsW373luZe83koQAwc9mgNIFYEDsOfuCG0OAhc46NEcwAAQOAAbro/Q5iBwgaP1J8/dt3zVgBcvnTVBUnGquqpG++sLeITAAdhwfYQ2BzJogSPNHs2llJsOl8JW4N4MQPIIHIBVhsckC9wxpqS4JJ1zP1LKTYenwpaU8tiHp7W/xIAXCBzARTwaoc1BsAJH+j2aSykf6ZgKW1LKo4dPaH+VAS8QOIALvBuhzUGwAkf6PZpLKR/p+C5sETgQYgQO4AIt44MEK3Ckf3eLlPKRjimwReBAiBE4gD6ejtDmIECBw5UezQkcBA5EE4ED+PSk9yO0OQhQ4HClR3Mp5SMd34EtAgdCjMABfHpSa1/dAQocrjxLUsqNHSWwReBAiAUvcJz9U7fhxNE/Ael75YX/bKhfqGvrUkrtz0CSplXc9tt3OtLfX+3Hdd+SUh45fEL7Cw14gcCBqPvgt8eqq2o++O0xXQ0ISuD47Tsd0ypuc2V/NxwqdjBv47dKGr7qPE9YETgQYgQORN1di5dtfvYljQ0ISuBofeLZFctXubK/zgfdy7K/MKroCu3HfgIH4K5gB47jRz4B0vGzp9ruXnqv3jZIKbU/D8lYtHDxL7dsc2V/Nxy6NZ761gIhxKwHvu4wT+CUNHw1N//Sy7IHXZY9aFTRFXdvuzHenFLKIx3Htb/WgBfMh28X80TCInBAv/3vHa2cPuPQ/hN6mxGUwFFcXOLKcyWlXH9ocjyjiq7Iyh7kMEPgqD0aW/bFkoa8UUVXCCEcdpDAgRAjcCC67pxft+OVndqb4fPA8fILrzXULayqqvnud6e+/qvfuLK/DodndWw2fnzwvYlydk5u/qXKzAdGWeavWDbCeHRs2Rfv23XRyuXsnFFFV6w/NHnmA6PUPHdsvE4tcsfG6yyrumPjdZbpd2y8blTRFWrBUUVX1LeOiZ3/vl3yB23fVvPI2TmxezTzgVEPvjfR+HFs2ReFEBXLRhA4EDUEDkTUY48+tfL+1dqbcdzfgWPl/asb6ha+/MJry5Ys/0HjXXPn1P7sqbb093fdwUm2ZqwaJYSoax1tTMnKHiSEyM0fkps/JCt7UFb2IPP8uflD1AkDNYP6/9KtheYZsrIHlS8doR7Kyh5U3JCntjKy6HLL1tUajMULyq4yr1y1ZMaqUcb8xQ15QojypSPUmtWc8XbNslRxQ57towQOhBiBA1G0Z/f+qqqaIwe7tLfkuI8Dh/kGF+NsUPqnhRwChzquGz+qoGA+NjduGXfh2FydI4QoKLvKklfMSUJlCMtsKsdkZQ9asXO8MWXFzvHmQDN3w3Uq6DTvnWBs2pJ4VHRQOUPNZl5hPKrZ5lBF4EBEEDgQOUcOdt05v86VqwOu8G3gqJw+Y8/u/cePfHJo/4ni4hI18Zdbti1auDjN/V138JZYK3belJU9SFZ/yZhS3PAVIcSMVSNt5+8//F80UUWWFTtvMn7sjyAXzabOXpQv/ZoxpXzp14QQxQ1fsV2PIqu/ZG6Pal5W9qDmvTfbtjCW2kpu/pB4MxA4EGIEDkTOww9tevihTdqbYZB+LduQcWj/iaqqmjTXbH+srf6SEGLp1huMKXWto9URPTZzNG4Za3vkVgmjcctY2x8tazYvbkkYtmlGJQwjlFh+dDCy6HK1QpV+HAKKlHL/vkPa35OAFwgciJbXf/WbuXNqtTfDTPr1DIdh5f2rH3v0KRf3d93BibH674G4aGJxw5fVcTore1Bxw5eN6eVLr1bXSoz7J4wjuhCicUuBmq0/cBTYbi4re9CKnTeuOzhxxc4bzVtfuvV625Wr9RvNKG74svlHB3M3fKO44cvFDV8uKBumVmvbpHUHJ6pAtmjh4p891ab9+1OAuwgciJAjB7uqqmrUZQL/8H/gmFZx23tvu/axW0r58MEJFt9v/aYQonzp1bEP3buzcHx1tnH36AN75cMHJ6jAkZs/ZNGWgljGsipwmKcYxldnG1tU/5+x6lr10JKt31axwHnltzZ8WQhxa8OXY1fuYMaqa1XLbR+VUlZUTDNOBZE8ECYEDkTIiuUrn3z8We3NsPB54Hjv7UPTKm5zd39jD7QFZcOysgc5H6rV6YHx1dkPH5ywaEuBw2E7mcChUoVagzp7YX40dkqsgQUO55VLKZffsyL2IpRbva4BGhE4EBWqPwntzYjl88DhemesUsq17TdbZGUPGll0Wex0s4WbxwghcvKHGItkZQ964N3xDovk5A8RQizcPCbeo1nZg+Zs+LoQwrJ1teCCJ69zWPmt9cOFELfWD3dutu3OZmUPsn1ISvnCL16ODRx3zq8jcCDoCByIhEP7T1ROn7H/vaPaWxLL54HD9c/WsYGjcuU1QojKlddYpheUDjNPLCgdJoQoW/JV8485+UOWv1lozLPgyevMCcA5cJQt+aq6dBK7ddWkrOxB5sxx19Zx46uzUwocd20dV1A6zNxCtdF46UpKefDAkVtuucV86y5RA+FA4EAkNP1w2eZnX9TeDFs+Dxxu9Whu3t+H2ovMRhZdlpV9iWWimi6EyMq+JCd/cFb2JUKInPzBtjOY5xlZdJkxQ07+YCHEws2jY1f+UHvR8jdvUIvYbv2m6uz+W0cvrNw85+T64UKIyfXDbVdu3oRag3kvlr95g+38UsojHccXLVys0sYtt9zy5qtva38PAK4gcCD8/DBCmwM/Bw4vvtQjpXyo/SJZ2ZeMKR1qmahUrhwxpnRoTv7gkUVZlStHxM6w4Ml8NUNO/uCbqv/NMk/ZkrzJ9bmr3r3RduXGDDUbRto+etfWgpuq/02tfEzp0LIlecvfvN686cn1uQuezI+3cvNWVCPHlA613QuDChw/e6pNpY1fbt565/w6bhpFOBA4EHI+GaHNgZ8Dhxd9llgCR9mSPCFEMoftKFCBY/97R6WU6pzc7tf3kjkQDgQOhJxPRmhz4OfA4cWzJ6Vc0z7eoC40mKdEmezvaXTF8pXGM0bmQDgQOBBm/hmhzYFvA8eh/SemTi11fcQZS+D4j83fbNpaoP1I7xNG4LDEi92v7507p9Yno/8AA0PgQGj5aoQ2B74NHOkPmxJvf1cfuAm2ZPyxVF5+4bVFCxf7//0MxEPgQDj5bYQ2B74NHO72aG7e39UHboQth8BxnMyBgCNwIJz8NkKbA98GDnd7NDfv7+oDhbDlHDiOkzkQZAQOhJAPR2hz4M/A4XqP5ub91X5c962EgeM4mQOBReBA2PhzhDYH/gwc3nVeIqVcfeAG2EomcBwncyCYCBwIG3+O0ObAn4HDu9HCpJQPfnA9bCUZOI77vjs7IBaBA6Gy45Wdd86v096MlPgzcLjeo7l5f7Uf130r+cBxnMyBoCFwIDz8PEKbAx8GDk9vgikuLokdDZVSVVxcnHzgOE7mQKAQOBAefh6hzYH0X+DIwHd8jnQcRzwpPZNkDgQFgQMhsfnZF5t+uEx7MwbAh4EjA/3BHz18Uvtx3Z+OHj6Z6pNJ5kAgEDgQBv4foc2B3wLHkYNdxcUlfAMiWALU8Qwii8CBMPD/CG0O/BY4POrRHF4jc8DnCBwIvCcff9Y8tGbg+C1weNSjOTKAzAE/I3Ag2IIyQpsDvwWOyukzAtRtGizIHPAtAgcCLEAjtDnwVeDwrkdzZAyZA/5E4ECAheMPq68CB993CIfA9beLKCBwIKhe/9Vv7pxfF+iLKYqvAkdA+zJBrLuX3vuzp9q0NwMwEDgQSIEboc2BrwKHdz2aI/PIHPAVAgcCKUxnjP0TOHa/vreqqkZ7M+AiMgf8g8CB4AniCG0O/BM4wnFPDCzIHPAJAgcCJqAjtDnwT+AIdP9pcNBQt/DlF17T3gxEHIEDARO+uxp9Ejjo0TzEjhzsWrRwMZkDehE4ECTBHaHNgU8CBz2ahxuZA9oROBAYgR6hzYFPAgc9mocemQN6ETgQGGG9Du2TwEGP5lFA5oBGBA4EQ9BHaHPgh8BBj+bREY4BARBEBA4EQAhGaHPgh8BBj+aRcmj/iTvn1+1+fa/2liBSCBwIgLlzakP8gcwPgSN83/2BMzIHMo/AAb8LfW9Ufggc9GgeQWQOZBiBA74WmhHaHGgPHPRoHllkDmQSgQP+FaYR2hxoDxyhP4cEB4f2n5g7pzb0v2XwAwIH/CsiPUNoDxz0aB5x77196M75de+9fUh7SxBuBA74VMhGaHOgN3DQozmOkzmQEQQO+FH4RmhzoDdwvPzCaw11C7U/CdCOzAGvETjgR5EaUFtv4IjIdSskg8wBTxE44DuhHKHNgd7AUVVVw5cUYHjv7UNz59RG5OQiMozAAX8J6whtDjQGDno0R6zdr++9c35dpH4HkRkEDvhLWEdoc6AxcNCjOWyROeAFAgd8JMQjtDnQGDgida8MUkLmgOsIHPCLcI/Q5kBj4KBHczggc8BdBA74RbhHaHOgK3DQozkSInPARQQO+EKUe9fWFTgeWf/46uZ12ncfPvfyC68tWrg4gqce4ToCB/SLwghtDnQFDno0R5LIHHAFgQOaRWSENgdaAgc9miMlZA6kj8ABzejpUkvgoEdzpIrMgTQROKBTdEZoc6AlcJDzMABkDqSDwAFtDu0/UVVVw8ANWgIHPZpjYOgsDgNG4IA29DqlZD5w0KM50kHmwMAQOKBH1EZoc5D5wMEBA2niLYQBIHBAg/3vHa2qqmFESiXzgYNzS0gfmQOpInBAgwiO0OYg84GDHs3hCjIHUkLgQKZFc4Q2BxkOHPRoDhfRXy2SR+BARr339qHK6TP4Wp1ZhgPHY48+tfL+1dr3GqER5XEJkBICBzIqsiO0Ochw4KBHc7iOzIFkBC9wfPZJt+H3H36CAHl4zaaH12zS3gy/kVJmbFsftncVF5d82N6lfa8RMvx2IyECBzJk1+t7586p5VAXK5OBY/srO++srdO+ywglMgecETiQCR+2d1XNqvnNrv3aW+JDmQwcK+9f3bLpKe27jLC69/+tfPLxZ7U3A/5E4EAmcJxzkMnAUTWrZtfre7XvMkLs7qX3/rS1TXsz4EPBDhydH34C/9v+ys75tXXam+FbUsrMbOj9vUenTi3Vvr8IvWVL7/1pa5v2ZsBvzIdvF/NEwiJwREX7705Uzap5d88h7S3xrYwFjp+2ti1beq/2/UUUkDkQi8ABb/F3J6GMBQ5eC2QS7zdYEDjgoeeeebHph8u0N8PnMhY4pk4tfX/vUe37i+hYtHDx85u3aW8GfILAAa+8v/do1awajnAJZSZw7Hx9b9WsGu07i0g53N61aOHil375mvaWwA8IHPBKfd1C/tAkIzOB48ebnlp5/2rtO4uoIXPAQOCAJ7g/MXmZCRzza+u2v7JT+852fvhJ6awJkopToTwLReaAQuCA+97dc2j69BmH27u0tyQQpPeB43B7V3FxiU9eESnlpsOlsCWlPHL4lPbXyIt3IJkDBA64b+6c2td2/EZ7M4IiA4HDV12hSCk3HZ4KW1LKDzuOa3+NvHC4vau+bqFPTrNBCwIHXLZx/eMPPrBOezMCJAOBY+X9q3+86Snte2rs7yMd34WtEAeOzg8/af/difm1dTtf36u9JdCCwAE37Xx979w5tT45dR8UGQgcVbNq/PNXnsAR2cDRSeaINgIHXHO4f4Q27S0JFq8Dh996NJdSPtIxBbZCHzg6yRwRRuCAax58YN3G9Y9rb0bgeB04/PaNIQJHxANHJ5kjqggccIevbksMFq8Dh996mJZSbuz4DmxFJHB0fvhJ++9OzJ1TywnRSCFwwAWM0JYOrwOH33o0l1Ju7CiBregEjs4PP3l3z6H5tXX83YgOAgdc4LfP0MHiaeDwYY/mXgSOH+2e8MPnb9AeFwgcqSJzRAqBA+l6fvO2RQsXa29GcHkaOHzYo7mUcsOhYnfl5l+am3+p66vNvKgFjk4ylyS7RQAAIABJREFUR5QQOJAWRmhLn6eBw4cj2kgpNxy61UV3b7tRCFGx7Bp3V6tFBANHJ5kjMggcSIsPj2eB413g8FWP5ub9XX/oVheNLftiVvag+3YVubtaLaIZODrJHNFA4MDA+e37lgHlReBo/92J7a/sbHn0qXl33Kl9B2P3d/2hyS7Kyh40qugKd9epS2QDR+eHn+x8fe/82rr2353Q3hJ4hMCBAWKENre4Hjh+2to2reK2+bV1FeXTJk++1T+dmhv7u+7gJLfUtY4WQsxYNcrFdWoU5cDRSeYIOwIHBogR2tzibuD4aWvbooWL1Z/sqlk1//mrPff+v5W+6pDN3cAxsujyrOxBlokzVo2KjSDlS0es2DnePGXFzvHlS0fYhpjY6TNWjaprHZ1wnQSONJE5QozAgYFghDYXuRg43t97dFrFbeq0U/vvThQXl6jp06fP8E8PS+4GjqzsQQVlV1lCgBBCCGEODSOLLhdCZGUPMueDrOxBQojc/CHmxZduLVSLjyy6PHad5hxju04CR/rIHGFF4EDKGKHNXcXFJdKlKi4uMb6ibL7DZu6cWrc24UqtO3iLK8qXfk0IUdc62jyxuOErKhwUN3zFmJibP0RNbNwyVk1ZsfMmFTiysgeZF2/cMlbNmZs/xJhYUHZVMutMnyRwfPhJJ5kjpAgcSA0jtPnZztf3GuNTmHtjM0/XzsXAkZs/xBIXjHxQUHaVecrSrTeMLLrcHBfWHbxlxqqRuflD5m7Ityxe3PCVkUWXL916g/M6G7eMzc0fYlln+oHj/vtWan+N/OClX762aOFiPtiECYEDqWGEtqCYVnGbP79kKKV8+ODE9N2788as7EHjq7/kytp8Qp0BavrhMg60nWSO0CFwIAWM0BYUPuzR3CClfPjghPSNr87Oyh50785CV9bmE8ZVp7lzarmg0EnmCBcCB5J1uL1r+vQZ/vzQDAsf9mhucCtwZGUPys0foj0ieBQ4pJT8uilkjtAgcCBZjNAWIH7uAVZKubb95jQtePI6IUTZkq+mvypfsdxdW1xc4p+bbzQic4QDgQNJYYS2APFnj+YGKeXa9qI0FZQOzcq+JP31+E3sN3puueWW5zdv0/6qaffcMy82/XCZ9mYgHQQOJMYIbcHi81ttpJQPtacrK/uSkUVZ6a/HVx7Ya00bxcUl82vrjJ7cIo6xFIKOwIHEFi1czGesAPH5N4nSDxyVK0cIISpXjtAeEdy14vULUWNaxW13L1uh/cXyGzJHoBE4kAC/4YFTNavGzxf+pZRr2sen49qirKzsS9JciQ8teWG8lHLqd6e+9MvXzJ3Gwoy/SMFF4IATRmgLHHOP5v6UfuCYXJ9buiRPez5w3aKnx0sp97z1nnqiVt6/2m8D7/kEmSOgCBxwMr+2bvsrO7U3A8nz/99iKeWa9psQ655f3WTu2vz9vUenTi3V/nr5k5+/+I14CByIixHagsj/316WUq4+cCNsWcZS4fYpB2vXbFq7ZpP2ZiB5BA7YY4S2gPJtj+YGAkfygcPPPcb6AZkjWAgcsHG4vWvunFo/33gIW7/ZtX/69Bnam+FMSrn6QCFsxY4Wy0kOZ2SOACFwwIbPv1eJeAJxYZvAkVLg4CRHQmSOoCBwwMrn3UbBQSA+DUspH/zgBtiKDRydvv+esx/wjZ5AIHDgIozQFlw+79HcIKV88IPrYcs2cDCwQDL8f7s0CBy4CL+0wRWUU1PFxSWxI4ZQqoqLi2MDRycnOZLDny+fI3DgAj5IBVqwrmR/2HEc8cQ+XfxuJonM4WcEDvRhhLagC9aH4CMdJ7Uf1/3pSMdJ22ds6tRSfj2TQebwLQIH+gTifkPE4/8ezZGmQHwFySeafrjsuWde1N4MWBA48ElnEPrDhrPnnnmx6YfLtDcD3jnc3jWt4jZOciT5XC1auPilX76mvSUwI3Dgk3f3HKqaVdP+uxPaW4IB4zRyFHCSI3lkDh8icIAR2sLA/z2aI31B+eazT5A5/IbAEXWM0BYCgejRHK6gh6uUkDl8hcARab/Ztb9qVg0fmIKOM+3R8f7eo9MqbuN3NnmH27vq6xZyEtcPCBzRxQhtocE3jCKFkxypav/difm1dfyt0y54gcNc5tYjVRvWPfrE409pbwbS9FHXn0tKvvNR15+1twSZ0Xm0q6y0THszguX0iU/q6hr27W3X3hIormSAJIvAodk7v3m/tvZO7c1A+n698926ugbtzUAmNS1esmPbG9qbESxkDl9xJQMkWQQOnT7q+vPMGbMOHzquvSVI36ObHn900+Pam4FM2re3vaZmrvZmBA6Zwz9cyQBJFoFDpxX3/ugXbS9rbwZcUVMzlz+gEcRJjoEhc/iEKxkgyXIncFADqP379y9ZskR3Kyh36vz581OmTNHdCkpDnT59ura2VncrAlnnzp1rbGw8d+6c7oZQGSoCh57q7u6ura3t7s5ouqS8q7feemvlypW6W0Hpqdra2tOnT+tuRSCLzBGpInDoqeXLl+/du1d3KyjXas2aNW+88YbuVlB6au/evcuXL9fdiqAWmSM6ReDQUG+88caaNWt0t4JysyorK/mLGeXiJEc6ReaISBE4Ml3nzp2rra09f/687oZQrtW5c+cqKyt1t4LSWZzkSLPIHFEoAkemq7GxsaOjQ3crKDfrpZdeamlp0d0KSnNVVFRwV1Y6dfr06cbGRj6MhbgIHBmttra21tZW3a2gXC7uyKF6yZ1uFJkj3EXgyFx9/PHHtbW1PT09uhtCuVk9PT0VFRX8iaR6enoqKys5yZFmkTlCXASODFVPT099fT23lYWvOjo6GhsbdbeC8kVxksOVInOEtQgcGarW1ta2tjbdraDcr2eeeeaZZ57R3QrKF9XT0zNlyhTOYqZfZI5QFoEjE9XZ2VlfX6+7FZQnVV9f39nZqbsVlF+qpaXlpZde0t2KMFRHR8eSJUtIb2EqAofn1dPTM3v2bL7uFcqiR3PKUt3d3ZWVlRwmXan9+/cvX76cJzM0ReDwvDZs2LBjxw7draA8KXpfoGKLkxwuFpkjTEXg8LYYoS3cRY/mVGx1d3dXVFTobkV4iswRmiJweFiM0Bb6okdzyrbomsXdInOEowgcHtbKlSvfeust3a2gvCp6NKfiFWPWu15cvgxBETi8KkZoC33R6QLlUJzkcL34oxr0InB4UozQFoXiiEI5FCc5vCgyR6CLwOFJMUJb6IsezamExZj1XhSZI7hF4HC/ONMehaJHcyphcduBR0XmCGgROFwuRmiLSNGjOZVMcZLDo+JzXRCLwOFmMUJbdIoezalkipMc3hWhP3BF4HCz+AWISNGjOZV8VVRU0BmPR8Wf3GAVgcO1YoS26BQfW6nki5P/nhaZI0BF4HCnGKEtUsX4OFTy1dPTU1lZyUkO74rMEZQicLhTHIEiVfRoTqVUnOTwulpbW9va2nS3gkpQBA4XihHaIlX0aE6lWj09PVOmTOHLa54WIyn6vwgc6RYjtEWtduzYsWHDBt2toAJWjFmfgSJz+LwIHOkWI7RFrejRnBpAdXd3V1ZWcpLD6yJz+LkIHGkVHd5FsKZMmUKP5tQAipMcmSkyh2+LwDHw6u7unj17NseeSBU9mlMDru7u7oqKCt2tiERx4tmfReAYeDFCWwSLL+BR6RTX4zJTPT09y5cv379/v+6GUBcVgWOAxffcolmkTCqdYsz6jBWZw4dF4BhIMUJbNIsezan0i5McGSsyh9+KwJFy9fT0NDY2MnBXBIsezan0i5McmSwyh6+KwJFycRU/skV/spQrxZj1mSwyh3+KwJFaMUJblIsezSlXilNlGa7z5883NjYS8rQXgSOF6unpqa2t/fjjj3U3hNJQ9GhOuVic5MhwkTn8UASOFIoz6lEuejSnXCxOcmS+yBzai8CRbDFCW8SLLxdQ7lZFRQVjMGW4yBx6i8CRVJ0/f3727Nn8dYhy0aM55W7Rl4+WInNoLAJHUkVHuREvejSnXK+enp7Kyko+xmS+uru76+vruQE880XgSFyM0EbxXWjKi+Ikh646d+5cY2MjmSPDReBIUIzQRvXSoznlTfX09EyZMoU+i7UUmSPzReBIUBxpKHo0p7wrxqzXWGSODBeBw6k44Un18g1Gysvq7u6urKzkJIeuInNksggccYsR2ihVfAalPC3eYHrr448/rq+v57p5BorAYV+M0EYZRY/mlKfV3d1dUVGhuxWRrtOnTzc2NpI5vC4Ch33xrQRKFT2aUxkoupXTXmSODBSBw6YYoY0yii9FUxkoxqz3Q5E5vC4Ch7UYoY0yFx89qcwU7zQ/FJnD0yJwWIsR2ihz0aM5lZniJIdPqrOzs7Gxka8LeFEEjouKHqwpc3FxjcpkMWa9T2r//v3Lly8nc7heBI4LxQhtlKW4d5jKZNHji3+KzOFFeRU4Wlpa8vLy2tvbPVq/F8UIbX4r7e8i+pmlMlyc5PBPkTlcL68Cx44dOwoLC0+ePOkwT0tLS3l5uUcNSLXeeuutlStX6m4FdVEl8y46efJkwnkGVufPn6+oqODPDZXJ4iSHr4rM4W7pvKTS3Nycl5ensQFGMUJbcKu9vV0I4cVZEP70U+3t7Zn/s1BRUcGF3djS8lr08nfA1bIGjpaWlj179pw8ebK8vNx8+qGlpaWwsLCwsLCpqcn8qp8/f76pqamwsLC8vLy5ubm5uVkNPnL+/Pnm5mZjzj179sybN6+wsHDevHnqw2hzc3N5eXleXp5aas+ePZYVFhYWmscxUStUCxYWFrr7RRLOnLtbHr2Lzp49a8ym3gAtLS1NTU1CiKamJmMp522pFapzJ01NTc57QYfTUS6VZdWfnUwWQzjFlq7XQhWd8bhV1sChMkFeXp76Y21MzMvLU3/T1f+Nv+BqzubmZvV3Py8vb968eb0Xf+48efKkmt7c3Dxv3jx1BFJpQwhhzhZnz541rzAvL884XLW3t6uVGDO49RTs2LFjw4YNbq2N6vXmXaTWYH5v9Pb2qvxhvIvUUgm3pRZXwcVhL+jRnDJ/FrIt9XfJ3RNsPT09lZWVnOSwlJbXwigyhytlEziEEJZPiuZX8fz58+pPtvHQ2bNn1UPqHIb6v/lQEe/SSex0lUKMH3fs2CGEUG8ytcLCwkJ3z6oxQpsX5cW7KN6lk9jpDtvq7e3Ny8tL5q8SPZpTyZRHV/Q4yTGA8u7qqioyR/plEziMP/cJp1gSg/lH82vf0tJiOfzEzq/KfGAwpqiTGWqF7l5JYYQ2j8qLd9HJkyeFEMY5DKNi/8o4bz32PWZb/HEJbs2bN6+lpWXz5s0qXKqJZ8+eVZ9n1Mkt82flPXv2qNNgxjk549RXeXm58YdLXYZTs6m3kArHsSfYHLZVXl5+8uRJy+nb2Orp6ZkyZUoIPgi1tLTMmzevvb1dPXXGzd3qGVBlPjRYnjpV6tOIrtfCXPxZSLMSBw514SPPVOpF7e3t3bNnjxBi8+bNvb2958+fN/+iWg4D8+bNUysxXwqxHGnU9RRLGdftvEiv9LLgUXn0LlJvGHXBxTgjEvvGcNhWrynCOhf9TAe31NtPHYrUgUed5VLHm/b2dnW9Tx381J8ddVDcsWOHms04sBnvFvNse/bsUW/RHTt2xN5C5LCt3v6rh8aVQYe9CMctRObf2aamJvU8qASwefPm9vb25uZm88dR9eS0t7cbGcX4bdX4WpiLS/DpVFKBw3gHGKX+3KubM4wqNH07MfYwcPLkSRU7jPXbBo6mpibLtuKtMM2i/1rvyrt30dmzZ40/YWpx28ARb1u9SQcOejQPbqlPuubPsupTrPkFzeu/T8jyV8i4PciYzfkDT+x0h2319l/RS+at1d3dXVlZGfQ/UCpPmH/j1AcM87lq40q6ejKNF07Nac4Hul4LS/FJdcCVOHBY7qswl3G5vb293dIRQrz3hLq8YnxRJS/mkkrsOXPnFQ6sGKHN0/L6XaTuDlMfYmLncdhWb3KBgx7NA13xrqmZA2i8K3rxAodxP7vlvsV4V/Rst9WbdN5VFYKTHLF/5NUU8/NjPOeWJzNe4NDyWliKzDGwShw4Nm/ebLkD4+TJk0ZiUJfVja8y2p7o3rx5szHd/P5T4UNFXRUz1Skvy+XV2BWmX4zQ5ml58S7as2eP5aOP+lHd26HOiKp3kcO2epP7K8Nfk0BXMlf08vov28deUjF/5jG/W9StHuocrfHXw/YEW7xt9aZ4kOvu7q6oqBjo0+CLsv1mQOzzY8xjPj1peR31vhaxxV+JAVTiwNFrusHHuE9HvcbqZHj/nT0XPWR+7dUnTmMG4zU237RhTDTejsb88c6cD7gYoc3r8uJdpL57YixuvslL/ekxT4y3rd7k/srQL0ugK94ZDtuZVcgw7iuMd9O6UcahTkXYeJ+q47Ut1YNc0O8lig0clnNI5lJHBOO1KC8vNz579PrgtYgtMkeqZQ0c5s+C5jp79uzmzZubm5vNl8MLTTcDG1OMF7j94hs41H3j5jeQsVp1w6Bl5paWFku8cCVtMEJbBsqjd5FavKWlJXble/bsMZ8aibet3iT6KwzNFwQiW7GHGXXq1Hbm8vLyVI9J6lZE8/0E5pOyDtuKt0KHCvqY9bGBQ52AtO1RQ32oiPfrqf21sK3W1ta2trY0VxKdSqtrc9sPBP4ZHsW2GKHNb+W3dxE9GQe9YgOHugZndHOsPtKok16qs5880xdizZ9/jGNSS0tLc3OzSq7mG9Es35hw3lbvgA5ygT7JYdsJU57pDgzjg0Gv6Zy3cb7TfGHUD6+Fba1Zs+aNN95Ifz1RqLQCh/rWieqO2jiJ7cUwWm4VI7T5sPz2LgrBnXoRL0uH+qrMPTfkmb4MpQKH+i5lc3OzejfGfhVTXXmJvQTc2/8xWr2HnbfVO6CDXKBPctgGDjXogfn5VCHPSAzqtbD0kOGH1yJekTmSrHQHb9uzZ09zc3N5eXlTU5PPu8ZjhDbflq/eRbNnz+brS2Gts2fPWq7Mxp5gc7jwf/bs2XhROHZ67LYGXGEds97y/MRe3rLNK6p0vRbxisyRTOkcLTbDtWTJkv379+tuBeXrokfzqFXexV9Lae8fs0ljk2IrIpf5Ci8e9kh1A+hwh43fisyRsKISOOgejkqm6Lo4amX0gG58Scqfd6GF9SSHuVTaM78W6iuyutuVQpE5nCsSgYMR2qgki3uKo1nt7e0tLS179uzx7S1oETnJ0dvb297err66GKyooaqnp2f58uWcSo9XkQgc9fX1jNBGJVP0aE75tioqKvg+v/+LzOFQ4Q8c9M1CJVmB/joAFfpizPqgFJkjXoU8cDBCG5V8kU0pP1dPT09lZSUnOQJRZA7bCnPgYIQ2KqWiR3PK58VJjgAVmSO2whw46MGJSr7o0Zzyf/EuDVb19PTU19eH/utFyVdoAwcjtFEpVXS+BUAFuvgcFaw6f/58Y2MjmUNVOAMHI7RRqRZ/x6lAVHd3d2VlJSc5AlRkDqPCGTjofYVKtejRnApKEY4DV2QOVSEMHIzQRqVa9GhOBai6u7srKip0t4JKrcgcveELHIzQRg2g6NGcClYFesz6yFZ3d3d9ff25c+d0N0RbhS1wMEIbNYCiR3MqWEUndQGtc+fONTY2RjZzhCpwMEIbNbCiR3MqcMVJjoBWlDNHeAIHI7RRAys+LFJBLN63wa3IZo7wBA5GaKMGVvRoTgW0ojBmfVgrmpkjJIGDYwY14KJHcyqgRW91ga5z587V1tZG6mJuGAIHI7RRAy76iqYCXZzkCHSdPn26sbExOpkj8IGDEdqodGr//v1LlizR3QqKGmBxkiPoFanMEfjAQad7VDrF+4cKelVUVDCMQ6ArOpkj2IGDEdqoNIsz0lTQizHrQ1ARyRwBDhznz5+vra2N2l2+lItFj+ZUCKqnp6eysvL/t3cmz1FdVxj//o7WjtZK7WWqUDebu5GVMqAqhBeqsgYWVNmRYiM74I2EYEMKiC2MkjJGgipjW8HGQ8AOgx0PWEmqTOKxyk4RK4PjJJITaA/gIZ2hnMV99Ht939ADrb7T96uz6Hf79u2re75z3umn7nd5kcN2fPgyosUFB3doIzcJ72hO3IAXOdzg0qVL09PTDtccthYc3KGN3DysWYkb8MdWzuB2zWFlwVEul7dv385LiOQm4R3NiTPw68/O4HDNYWXBwR3ayM3DO0MTlyiXy0NDQ06epTzE1ZrDvoKDO7SRtrC4uDg/P697FoS0DV7kcAknbxFkWcGxuro6OjrqXt1HOg/vaE4co1wuDw4O6p4FaRvufavdsoKDO7SRtsAv2REn4Z71juFYzWFTwcEd2ki7cPJyJSH8ZpJ7uFRzWFNwLC8vj4+P8yMpaQv8bzdxFV7kcA9nag47Cg7u0EbaC+9oTlyFFzmcxI2aw46Cg59HSRvhHc2J27CedhIHvlRgQcHBHdpIe3HjswIhaXDPelexveYwveDgDm2k7fCO5sR5eJHDVayuOUwvOHhuIG2HdzQnzsOLHA5jb81hdMHBHdpI2+FX6ognDA4OcsMpV7G05jC34OAObWQt4EbexBModbex8fK/uQUHd2gjawHvaE48oVKpDA0N8TObw1hXcxhacPB3BGQt4B3NiVfwIofz2FVzmFhwcIc2skbwJ9bEK1hh+4BFNYeJBQd3aCNrBO8gR3yDmvcBW2oO4wqOxcXF+fl53bMgbsKbExDfKJfLQ0NDvMjhPFZ869GsgoM7tJG1o1wuDw4O6p4FIZ2GFzl8oFKpTE9PG15zGFRwcIc2sqbwm8jET1hqe4L5NYdBBcf8/Pzi4qLuWRBnseXfnIS0He5Z7wmG1xymFBz8+QBZa3jjReItvMGuP5hccxhRcHCHNrLWMOESz+FFDn+oVCrj4+MGfkHeiIKD17rJWsM7IBHPYc3tFdevX5+cnDSt5tBfcHBXQ9IBeEdzQvizcK8wsObQXHBwhzbSAXi/RUK+5ac7/zCt5tBccFhxrxJiO/xKMiESXuTwDaNqDp0FB++LQDoDb3xEiIQXOTzEnJ9laCs4uEMb6Rj8VEdIFf4+3ENWV1cnJye11xzaCg7u0EY6A2+zSEgU/mLLT0yoOfQUHNyhjXQM/ueOkCiVSmVoaIgXOTxEe82hoeDgDm2kk/AuL4Qo8CKHt+itObB96DvCdXi7G3Og3giJw7jwGX+8DyHE/16D2yaE0K0oEkC9ERKHceEz/ngfQoj/vgq3TQixsrJy5coV3boi33qiN4qNNIUnccE8nIg/3veo4FhZWdGtK+JRaOleaWIT/sQFQyOOP96HEOI/r8Bto9DNwR+96V5pYhP+xAVDI44/3ocQ4t8vw22j0M3BH73pXmliE/7EBUMjjj/ehxCi8jLcNgrdHPzRm+6VJjbhT1wwNOL4430IISq/gNtGoZuDP3rTvdLEJvyJC4ZGHH+8DyHEv16C20ahm4M/etO90sQm/IkLhkYcf7wPIcQ3L8Fto9DNwR+96V5pYhP+xAVDI44/3ocQ4psX0axN3o6BDU2/SpdR6ObQgt7+fBKlW3BoQr+QmtKb7pUmNtFaHrbLmIfTaM37Axuw7bv63dqU9yGE+PpFJNrx+zGwAd1d6O4KMn71qdIt6O4KD2WftHHW1N47joENGNiQ1YdCN4cMvR2aCHTV3YWBDXh6b9D+658AwN5tweGFHwUdOqy0vdtqpvenk3X0pnuliU1kxIUzxjycRgtZ8esXg/Py11qz4vH7w+mVbqmZXqL3IYT46gLiNtYPAN1dGChhrB+lAgAMlIJnSwV0d4WdSwWUCgmDtGxj/eF7ZdjebejuCuaZ0Y1CN4c0vUmBdXcFrpdunZ3AVxfwqx8HBYfseeEguruw4/a2ie3d4ygVcGpvVh85pVIBO24Pp/rHn2bpTfdKE5tIiwuXjHk4jRay4lcXgoy0RllRJr3sAWcnggph7zaM9QfTu3Awy/sQQnx5Hort2AoAY/01jecPhC3FAvJd6qvaaI2ML/vMjtfvTKGbQ6LeigUAmB2vaZwdD1p+OQcAe8bWSmyNjL9jK/6wGB4OlBImrOhN90oTm0iMC8eMeTiNFrLil+eR70KxsIb+qjv++QN491h4eGxXcFUiw/sQQlw/j6gtLwbvpLRHTZ7jq4dLc3jnmNrnnWPYM4YHx9WnPnkOS3PB44Vd2DOmdliaC8ZfmsPSHD55LnkOO7YGTymTiRuFbg5xvS3sAoDR/lT3Ld0oCKItcVVILZ07kKBDKbDlRTw4jgfHsbxY86ycwI6tgd4yhKTMOTqluN50rzSxiXhcuGfMw2m0kBWvn1dP04lZ8dwB7BnDwq6apFc3Ky4vYmkuGL/xrCgTdVrlEBYc184hag+MA8DMGJT2qBULyOfCw3wOxYLaAUA+h3wuWLjqUzNjyOewNBc8q3SQ7x4leybxycSNQjeHuN42lwBgaS7VfVLHVRkoh9fOYWFnqCVp0dGKBRQLYR8py4WdoXSjZAupwRhhwUGaJR4X7hnzcBotZMVrtafdeFaMnmGlVZNe3awo3z1K9kykPTkDAPdszfJ+QsHRyJ+aXXBsLiGfw9n9waHMztU/ZmYs+PPkzD58IqhO3l4IV0qOL2ur1Wfr/J0sOCwirjep+Az3ZRccZ/fXFKxSTlE1Snnkc3hgPOgffce3F7CwM4gTqbdGUqeMkarCE/Wme6WJTbRccNyzNcylUX0WCzX6fHsBxQI2l/DhEzU95SlncylhTKWejo/ZrDEPp9FCVrxWr+CQz1bdPdqPfC48zM6Kq88G9Ur1Ckdd5z45E4ygCEzxPoQQX5xF1OTp//XDUNqVPvlceChnJh+/NQ8AM6M1/aMdZkbVDvKcEW1Rxs+2up0pdHOI603KNMN9rx+ukYdyuLmovnx+Z42ApZ7P7g873DNY00EZsK5JuVb1nKY33StNbCIeFw1a9eOpon9FopuLNy4Y1+pcRkc0HH7/eMKYD3wvYcxmjXmDkw3sAAAFlklEQVQ4jRay4he1Z1UliUl/RZOedGu1Q92sqIyfZjOj4TWSYgFvzdfxPoQQn59F1HoLAHDxMJR2pU8+Fx7mc+gtBI93jwLA0Z24eDi0aH/ZITr+xcMAsHs0dfxsq9uZQjeHuN6kXjPcp8hDOZTai4rt6M6aDnF5KAqMy68Rvb05X0dvulea2EQ8LhpXIxCm38/P4vKNiuHuwbDx5ExQQ5ycqXn53YNB++XHmx6zWWMeTqOFrPh57WlXSWIyR0Wz4sXDNf3rZkVl/DR7cx67R7F7FHcPBnM+ujPL+xBCfPZzRG1TEQBeewhKe9R6e5DPhYf5HHp7gsdy3sp/j+IdouO/9lCwWGnjZ1vdzhS6OcT1JuWR4T5FHsph9dOYYkd/kCoPRYFx+WXYyK0AwsEz9KZ7pYlNxOOicUvM1b89mtBy+bGGeiaOefmx5J6NG/NwGi1kxc9qT7tKEuvtSc6KI7c2mhWV8RvUoXyXRJmFBcenLyBqB+8CgO9vgdIeNTnd6qGcmXw8PQIArx5KfW28w6uHAGB6JHX8bKvbmUI3h7jeZIH7/A9T3afIQzmMaq9BeSgKjMsvzYb7AOCR++p0Y8FBmiUeF+4Z83AaLWRFJfUpSazuObFuVvy0gdQaN5khE8/+YcFRfgFR+90JrMthXQ4fPw3lqWpLbw/W5cL2dTn09gSPj9wHAAfvUl9bteofVm2pLla1RRk/2+p2ptDNIa43KZiNxQTHSb0p8lAOpVabkoeiwLj8Ek3GUoawFb3pXmliE/G4cM+Yh9NoISuWa0+7ShKTyeo3j7SeFZXxG7SNRXUQxfsQQlx9HopNbAGA3h6c2Re0fHACUyPo7QkO5XSr/eXMoofrcvjgRNjywQn85VTweGoEAF6ZDZ99ZRYApkbCFjl+dIQMUyYTNwrdHBL1Ji8ADveFHr90BMN9mNiSIA/lUMpJ9owqKkMeigLlgMN9WRKSAZzdR9Gb7pUmNpEYF44Z83AaLWTFq7WnXSUrntkX1CvRAS8daSIrXr1xHs9w6MZiWCHIN814SVbBcfVGhgWCIaRV/9TsguPIfUH/3p7A1uXUM0R2wSHrOzlCtF3xh3yX6DyVJabQTSNNbzK6qkqTj5+YTpBHXC2yrK7qTRF9I6El3z2jcq1OSbFoDCt6073SxCZYcPhMC1nxambBcfXGVYNoVowmvUayoqwBZM9oe3x68i3k42gJEvc+hBBXziDR3jiCqWGs78HGXuy/E+8/Gj61/05MDYeHU8PYf2fNa99/NHjt+h5MDeP0vvCp0/swNYyPngpbPnpK7XPlDB6+Fxt7cUcf3jiSPD05B8Uen0roSaGbQ4beTu/DxBas78EdfXj43lR5pKnljr7gtdlaTVTg+48Gb63IOKrwREvszIKDNEtGXDhjzMNptJAVr9SedhOzYvW1G3sxNVxzJm0kK8pu63swsSXVpw/fG75FWvKMeh9CiH+ehttGoZuDP3rTvdLEJvyJC4ZGHH+8z4KDdBR/9KZ7pYlN+BMXDI04/ngfQoh//AxuG4VuDv7oTfdKE5vwJy4YGnH88T6EEJ88B7eNQjcHf/Sme6WJTfgTFwyNOP54nwUH6Sj+6E33ShOb8CcuGBpx/PE+hBCrz8Jto9DNwR+96V5pYhP+xAVDI44/3ocQYuUZuG0Uujn4ozfdK01swp+4YGjE8cf7EEL8/Rm4bRS6OfijN90rTWzCn7hgaMTxx/sQQvztabhtFLo5+KM33StNbMKfuGBoxPHH+xBC/PUU3DYK3Rz80ZvulSY24U9cMDTi+ON9CCE+PgW3jUI3B3/0pnuliU34ExcMjTj+eB+bNm0SrnPbbbdR6Ibgj950rzSxCX/igqERxx/vQ/7BK36gV1Wkim4hdALda0zsQ7dmO4TuZTYU3W7pBP8HuyRy4hQqV34AAAAASUVORK5CYII=" alt="" width="510" height="542" />

比如我在zookeeper服务器端有一个znode叫/Configuration,那么集群中每一个机器启动的时候都去这个节点下创建一个EPHEMERAL类型的节点,比如server1创建/Configuration /Server1,server2创建/Configuration /Server1,然后Server1和Server2都watch /Configuration 这个父节点,那么也就是这个父节点下数据或者子节点变化都会通知对该节点进行watch的客户端。因为EPHEMERAL类型节点有一个很重要的特性,就 是客户端和服务器端连接断掉或者session过期就会使节点消失,那么在某一个机器挂掉或者断链的时候,其对应的节点就会消 失,然后集群中所有对/Configuration进行watch的客户端都会收到通知,然后取得最新列表即可。

Master选举:

Zookeeper 不仅能够维护当前的集群中机器的服务状态,而且能够选出一个"总管",让这个总管来管理集群,这就是 Zookeeper 的另一个功能 Leader Election。Zookeeper 如何实现 Leader Election,也就是选出一个 Master Server。和前面的一样每台 Server 创建一个 EPHEMERAL 目录节点,不同的是它还是一个 SEQUENTIAL 目录节点,所以它是个 EPHEMERAL_SEQUENTIAL 目录节点。之所以它是 EPHEMERAL_SEQUENTIAL 目录节点,是因为我们可以给每台 Server 编号,我们可以选择当前是最小编号的 Server 为 Master,假如这个最小编号的 Server 死去,由于是 EPHEMERAL 节点,死去的 Server 对应的节点也被删除,所以当前的节点列表中又出现一个最小编号的节点,我们就选择这个节点为当前 Master。这样就实现了动态选择 Master,避免了传统意义上单 Master 容易出现单点故障的问题

清单 3 Leader Election代码

package org.zk.leader.election;

    import org.apache.log4j.Logger;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.data.Stat; import java.net.InetAddress;
import java.net.UnknownHostException; /**
* LeaderElection
* <p/>
* Author By: sunddenly工作室
* Created Date: 2014-11-13
*/
public class LeaderElection extends TestMainClient {
public static final Logger logger = Logger.getLogger(LeaderElection.class); public LeaderElection(String connectString, String root) {
super(connectString);
this.root = root;
if (zk != null) {
try {
Stat s = zk.exists(root, false);
if (s == null) {
zk.create(root, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
} catch (KeeperException e) {
logger.error(e);
} catch (InterruptedException e) {
logger.error(e);
}
}
} void findLeader() throws InterruptedException, UnknownHostException, KeeperException {
byte[] leader = null;
try {
leader = zk.getData(root + "/leader", true, null);
} catch (KeeperException e) {
if (e instanceof KeeperException.NoNodeException) {
logger.error(e);
} else {
throw e;
}
}
if (leader != null) {
following();
} else {
String newLeader = null;
byte[] localhost = InetAddress.getLocalHost().getAddress();
try {
newLeader = zk.create(root + "/leader", localhost, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
} catch (KeeperException e) {
if (e instanceof KeeperException.NodeExistsException) {
logger.error(e);
} else {
throw e;
}
}
if (newLeader != null) {
leading();
} else {
mutex.wait();
}
}
} @Override
public void process(WatchedEvent event) {
if (event.getPath().equals(root + "/leader") && event.getType() == Event.EventType.NodeCreated) {
System.out.println("得到通知");
super.process(event);
following();
}
} void leading() {
System.out.println("成为领导者");
} void following() {
System.out.println("成为组成员");
} public static void main(String[] args) {
String connectString = "localhost:2181"; LeaderElection le = new LeaderElection(connectString, "/GroupMembers");
try {
le.findLeader();
} catch (Exception e) {
logger.error(e);
}
}
}

2.6 队列管理

Zookeeper 可以处理两种类型的队列:

 当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达,这种是同步队列。

② 队列按照 FIFO 方式进行入队和出队操作,例如实现生产者和消费者模型。

(1) 同步队列用 Zookeeper 实现的实现思路如下:

创建一个父目录 /synchronizing,每个成员都监控标志(Set Watch)位目录 /synchronizing/start 是否存在,然后每个成员都加入这个队列,加入队列的方式就是创建 /synchronizing/member_i 的临时目录节点,然后每个成员获取 / synchronizing 目录的所有目录节点,也就是 member_i。判断 i 的值是否已经是成员的个数,如果小于成员个数等待 /synchronizing/start 的出现,如果已经相等就创建 /synchronizing/start。

用下面的流程图更容易理解:

图 2.5 同步队列流程图

aaarticlea/png;base64,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" alt="" width="921" height="557" />

清单 4 Synchronizing 代码

package org.zk.queue;

    import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List; import org.apache.log4j.Logger;
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;
import org.zk.leader.election.TestMainClient; /**
* Synchronizing
* <p/>
* Author By: sunddenly工作室
* Created Date: 2014-11-13
*/
public class Synchronizing extends TestMainClient {
int size;
String name;
public static final Logger logger = Logger.getLogger(Synchronizing.class); /**
* 构造函数
*
* @param connectString 服务器连接
* @param root 根目录
* @param size 队列大小
*/
Synchronizing(String connectString, String root, int size) {
super(connectString);
this.root = root;
this.size = size; 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) {
logger.error(e);
} catch (InterruptedException e) {
logger.error(e);
}
}
try {
name = new String(InetAddress.getLocalHost().getCanonicalHostName().toString());
} catch (UnknownHostException e) {
logger.error(e);
} } /**
* 加入队列
*
* @return
* @throws KeeperException
* @throws InterruptedException
*/ void addQueue() throws KeeperException, InterruptedException{
zk.exists(root + "/start",true);
zk.create(root + "/" + name, new byte[0], Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
synchronized (mutex) {
List<String> list = zk.getChildren(root, false);
if (list.size() < size) {
mutex.wait();
} else {
zk.create(root + "/start", new byte[0], Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
}
}
} @Override
public void process(WatchedEvent event) {
if(event.getPath().equals(root + "/start") && event.getType() == Event.EventType.NodeCreated){
System.out.println("得到通知");
super.process(event);
doAction();
}
} /**
* 执行其他任务
*/
private void doAction(){
System.out.println("同步队列已经得到同步,可以开始执行后面的任务了");
} public static void main(String args[]) {
//启动Server
String connectString = "localhost:2181";
int size = 1;
Synchronizing b = new Synchronizing(connectString, "/synchronizing", size);
try{
b.addQueue();
} catch (KeeperException e){
logger.error(e);
} catch (InterruptedException e){
logger.error(e);
}
}
}

(2) FIFO 队列用 Zookeeper 实现思路如下:

实现的思路也非常简单,就是在特定的目录下创建 SEQUENTIAL 类型的子目录 /queue_i,这样就能保证所有成员加入队列时都是有编号的,出队列时通过 getChildren( ) 方法可以返回当前所有的队列中的元素,然后消费其中最小的一个,这样就能保证 FIFO。

下面是生产者和消费者这种队列形式的示例代码

清单 5 FIFOQueue 代码

import org.apache.log4j.Logger;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.data.Stat; import java.nio.ByteBuffer;
import java.util.List; /**
* FIFOQueue
* <p/>
* Author By: sunddenly工作室
* Created Date: 2014-11-13
*/
public class FIFOQueue extends TestMainClient{
public static final Logger logger = Logger.getLogger(FIFOQueue.class); /**
* Constructor
*
* @param connectString
* @param root
*/
FIFOQueue(String connectString, String root) {
super(connectString);
this.root = root;
if (zk != null) {
try {
Stat s = zk.exists(root, false);
if (s == null) {
zk.create(root, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
}
} catch (KeeperException e) {
logger.error(e);
} catch (InterruptedException e) {
logger.error(e);
}
}
}
/**
* 生产者
*
* @param i
* @return
*/ boolean produce(int i) throws KeeperException, InterruptedException{
ByteBuffer b = ByteBuffer.allocate(4);
byte[] value;
b.putInt(i);
value = b.array();
zk.create(root + "/element", value, ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT_SEQUENTIAL);
return true;
} /**
* 消费者
*
* @return
* @throws KeeperException
* @throws InterruptedException
*/
int consume() throws KeeperException, InterruptedException{
int retvalue = -1;
Stat stat = null;
while (true) {
synchronized (mutex) {
List<String> list = zk.getChildren(root, true);
if (list.size() == 0) {
mutex.wait();
} else {
Integer min = new Integer(list.get(0).substring(7));
for(String s : list){
Integer tempValue = new Integer(s.substring(7));
if(tempValue < min) min = tempValue;
}
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;
}
}
}
} @Override
public void process(WatchedEvent event) {
super.process(event);
} public static void main(String args[]) {
//启动Server
TestMainServer.start();
String connectString = "localhost:"+TestMainServer.CLIENT_PORT; FIFOQueue q = new FIFOQueue(connectString, "/app1");
int i;
Integer max = new Integer(5); System.out.println("Producer");
for (i = 0; i < max; i++)
try{
q.produce(10 + i);
} catch (KeeperException e){
logger.error(e);
} catch (InterruptedException e){
logger.error(e);
} for (i = 0; i < max; i++) {
try{
int r = q.consume();
System.out.println("Item: " + r);
} catch (KeeperException e){
i--;
logger.error(e);
} catch (InterruptedException e){
logger.error(e);
}
} }
}

三、ZooKeeper实际应用

假设我们的集群有:

(1) 20个搜索引擎的服务器:每个负责总索引中的一部分的搜索任务。

 搜索引擎的服务器中的15个服务器现在提供搜索服务。

 5个服务器正在生成索引。

这20个搜索引擎的服务器,经常要让正在提供搜索服务的服务器停止提供服务开始生成索引,或生成索引的服务器已经把索引生成完成可以搜索提供服务了。

(2) 一个总服务器:负责向这20个搜索引擎的服务器发出搜索请求并合并结果集。

(3) 一个备用的总服务器:负责当总服务器宕机时替换总服务器。

(4) 一个web的cgi:向总服务器发出搜索请求。

使用Zookeeper可以保证:

(1) 总服务器:自动感知有多少提供搜索引擎的服务器,并向这些服务器发出搜索请求。

(2) 备用的总服务器:宕机时自动启用备用的总服务器。

(3) web的cgi:能够自动地获知总服务器的网络地址变化。

(4) 实现如下:

① 提供搜索引擎的服务器都在Zookeeper中创建znode,zk.create("/search/nodes/node1""hostname".getBytes()Ids.OPEN_ACL_UNSAFE, CreateFlags.EPHEMERAL);

② 总服务器可以从Zookeeper中获取一个znode的子节点的列表,zk.getChildren("/search/nodes", true);

 总服务器遍历这些子节点,并获取子节点的数据生成提供搜索引擎的服务器列表;

 当总服务器接收到子节点改变的事件信息,重新返回第二步;

 总服务器在Zookeeper中创建节点,zk.create("/search/master", "hostname".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateFlags.EPHEMERAL);

⑥ 备用的总服务器监控Zookeeper中的"/search/master"节点。当这个znode的节点数据改变时,把自己启动变成总服务器,并把自己的网络地址数据放进这个节点。

 web的cgi从Zookeeper中"/search/master"节点获取总服务器的网络地址数据,并向其发送搜索请求。

 web的cgi监控Zookeeper中的"/search/master"节点,当这个znode的节点数据改变时,从这个节点获取总服务器的网络地址数据,并改变当前的总服务器的网络地址。

原文地址:https://www.cnblogs.com/wuxl360/p/5817549.html