JavaWeb 后端 <十> 之 数据池 C3P0 DPCB JNDI

时间:2023-12-12 23:19:02

一、数据库连接池原理:(理解)

//模拟数据库连接池的原理
public class ConnectionPoolDemo {
private static List<Connection> pool = new ArrayList<Connection>();
static{
try {
for(int i=0;i<10;i++){
Connection conn = JdbcUtil.getConnection();//创建的新连接
pool.add(conn);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//从池中取出一个链接
public synchronized static Connection getConnection(){
if(pool.size()>0){
Connection conn = pool.remove(0);
return conn;
}else{
throw new RuntimeException("服务器真忙");
}
}
//把链接还回池中
public static void release(Connection conn){
pool.add(conn);
} }

二、编写数据源(DataSource)(很重要)

编写一个类实现javax.sql.DataSource

public class MyDataSource1 implements DataSource {

	private static List<Connection> pool = Collections.synchronizedList(new ArrayList<Connection>());
static{
try {
for(int i=0;i<10;i++){
Connection conn = JdbcUtil.getConnection();//创建的新连接
pool.add(conn);
}
} catch (Exception e) {
e.printStackTrace();
}
} //从池中获取链接 > com.mysql.jdbc.Connection
public Connection getConnection() throws SQLException {
if(pool.size()>0){
Connection conn = pool.remove(0);
MyConnection1 mconn = new MyConnection1(conn,pool);
return mconn;
}else{
throw new RuntimeException("服务器真忙");
}
}

	public PrintWriter getLogWriter() throws SQLException {
return null;
} public void setLogWriter(PrintWriter out) throws SQLException { } public void setLoginTimeout(int seconds) throws SQLException { } public int getLoginTimeout() throws SQLException {
return 0;
} public <T> T unwrap(Class<T> iface) throws SQLException {
return null;
} public boolean isWrapperFor(Class<?> iface) throws SQLException {
return false;
} public Connection getConnection(String username, String password)
throws SQLException {
return null;
} }

三、编程的难点:(设计模式)

难点:用一个实现了javax.sql.DataSource类的实例时,用户如果调用Connection.close()方法,会把链接关闭,失去了连接池的意义。

明确一个问题:用户得到Connection的实现是:数据库驱动对Connection接口的实现。因此,调用的close方法都是数据库驱动的,它会把链接给关闭。(这不是我们要的,我们要把该链接换回池中)。

解决方案:改写驱动原有的close方法。对已知类的某个/某些方法进行功能上的改变,有以下几种编码方案:

a、继承:此处行不通。

到底针对哪个驱动的实现写子类(很多)

数据库驱动对Connection接口的实现类,不允许被继承

丢失了原有对象的信息。捡了芝麻丢了西瓜。

b、装饰(包装)设计模式:(基础IO)

保持被包装对象的原有信息,又可以对某个/某些方法进行改写。

口诀:

1、编写一个类,实现与被包装类(数据库驱动对Connection的实现)相同的接口。(使这个类和数据库的驱动实现有着相同的行为)

2、定义一个变量,引用被包装类的实例。

3、定义构造方法,传入被包装类的实例。

4、对于要改写的方法,编写自己的代码即可。

5、对于不需要改写的方法,调用原有对象的对应方法。

//目前要包装的是:com.mysql.jdbc.Connection

//1、编写一个类,实现与被包装类(数据库驱动对Connection的实现)相同的接口。(使这个类和数据库的驱动实现有着相同的行为)
public class MyConnection implements Connection {
// 2、定义一个变量,引用被包装类的实例
private Connection conn;//引用具体的数据库驱动 private List<Connection> pool; // 3、定义构造方法,传入被包装类的实例。
public MyConnection(Connection conn,List<Connection> pool){//依赖注入
this.conn = conn;
this.pool = pool;
}
//把链接还回池中
// 4、对于要改写的方法,编写自己的代码即可。
public void close() throws SQLException {
pool.add(conn);
}
public Statement createStatement() throws SQLException {
return conn.createStatement();
}
//5、对于不需要改写的方法,调用原有对象的对应方法。
public <T> T unwrap(Class<T> iface) throws SQLException {
return conn.unwrap(iface);
}

c、默认适配器:(为了后来做准备)

//默认的适配器
/*
本身也是一个包装类,但并没有对任何的方法进行改写
1、编写一个类,实现与被包装类(数据库驱动对Connection的实现)相同的接口。(使这个类和数据库的驱动实现有着相同的行为)
2、定义一个变量,引用被包装类的实例。
3、定义构造方法,传入被包装类的实例。
4、全部调用原有对象的对应方法
*/
public class ConnectionAdapter implements Connection {
private Connection conn;
public ConnectionAdapter(Connection conn){
this.conn = conn;
}
public <T> T unwrap(Class<T> iface) throws SQLException {
return conn.unwrap(iface);
} public boolean isWrapperFor(Class<?> iface) throws SQLException {
return conn.isWrapperFor(iface);
}
/*
这也是包装:对ConnectionAdapter进行包装。 包装类即是被包装类的包装,又是他的子类。 1、编写一个类,继承已经是包装类的类。
2、定义一个变量,引用被包装类的实例。
3、定义构造方法,传入被包装类的实例。
4、覆盖掉需要改写的方法
*/
public class MyConnection1 extends ConnectionAdapter {
private Connection conn;
private List<Connection> pool;
public MyConnection1(Connection conn,List<Connection> pool){
super(conn);
this.conn = conn;
this.pool = pool;
}
public void close() throws SQLException {
pool.add(conn);
} }

d、动态代理:(很重要 AOP--Aspect-Oriented Programming 核心技术)

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

l  基于接口的动态代理:Proxy

如果一个类没有实现任何的接口,此种代理就不能使用了。

package com.itheima.proxy;

public interface Human {
void sing(float money);
void dance(float money);
}
package com.itheima.proxy;

public class SpringBrother implements Human {

	public void sing(float money) {
System.out.println("拿到钱:"+money+"开唱");
} public void dance(float money) {
System.out.println("拿到钱:"+money+"开跳");
} }
package com.itheima.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class Client1 { public static void main(String[] args) {
final Human sb = new SpringBrother(); //代理人:如何动态产生代理人 /*
ClassLoader loader:动态代理,必须有字节码class。加到内存中运行,必须有类加载器。固定:和被代理人用的是一样的
Class<?>[] interfaces:代理类要实现的接口,要和被代理对象有着相同的行为。固定:和被代理人用的是一样的
InvocationHandler h:如何代理。他是一个接口。策略设计模式。 */
//产生代理类,得到他的实例
Human proxyMan = (Human)Proxy.newProxyInstance(sb.getClass().getClassLoader(),
sb.getClass().getInterfaces(),
new InvocationHandler() {
//匿名内部类,完成具体的代理策略
//调用代理类的任何方法,都会经过该方法。 拦截 /*
Object proxy:对代理对象的引用。
Method method:当前执行的方法
Object[] args:当前方法用到的参数 返回值:当前调用的方法的返回值
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//判断出场费
if("sing".equals(method.getName())){
//唱歌
float money = (Float)args[0];
if(money>10000){
method.invoke(sb, money/2);
}
}
if("dance".equals(method.getName())){
//唱歌
float money = (Float)args[0];
if(money>20000){
method.invoke(sb, money/2);
}
}
return null;
}
}
);
proxyMan.sing(20000);
proxyMan.dance(100000);
} }

l  基于子类的动态代理:CGLIB

前提:被代理类的要求

1、不能是final的

2、必须是public的

package com.itheima.cglib;

public class SpringBrother{

	public void sing(float money) {
System.out.println("拿到钱:"+money+"开唱");
} public void dance(float money) {
System.out.println("拿到钱:"+money+"开跳");
} }
package com.itheima.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; public class Client1 { public static void main(String[] args) { final SpringBrother sb = new SpringBrother(); //产生sb的代理:
/*
Class type:代理类的父类型
Callback cb:回调,如何代理
*/
SpringBrother proxy = (SpringBrother) Enhancer.create(SpringBrother.class,new MethodInterceptor(){ public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy arg3) throws Throwable {
//判断出场费
if("sing".equals(method.getName())){
//唱歌
float money = (Float)args[0];
if(money>10000){
method.invoke(sb, money/2);
}
}
if("dance".equals(method.getName())){
//唱歌
float money = (Float)args[0];
if(money>20000){
method.invoke(sb, money/2);
}
}
return null;
}
});
System.out.println(proxy instanceof SpringBrother);
proxy.dance(100000);
proxy.sing(50000); } }

比如普通的JavaBean就可能没有实现任何的接口。代理类是被代理类的子类。

四、开源数据源的使用:(很重要,非常简单)

1、DBCP:

Apache组织开发的。DBCP:DataBase Connection Pool,对数据源的一种实现。

a、拷贝jar包

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

b、编写配置文件

dbcpconfig.properties

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=sorry #<!-- 初始化连接 -->
initialSize=10 #最大连接数量
maxActive=50 #<!-- 最大空闲连接 -->
maxIdle=20 #<!-- 最小空闲连接 -->
minIdle=5 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=utf8 #指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true #driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly= #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=REPEATABLE_READ

c、使用即可

public class DBCPUtil {
private static DataSource dataSource;
static{
try {
InputStream in = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
Properties props = new Properties();
props.load(in);
dataSource = BasicDataSourceFactory.createDataSource(props);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
} public static DataSource getDataSource(){
return dataSource;
} public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

2、C3P0:

开源数据源的实现。

c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///test</property>
<property name="user">root</property>
<property name="password">sorry</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
<named-config name="day15">
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</named-config>
</c3p0-config>
public class C3P0Util {
private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); public static DataSource getDataSource(){
return dataSource;
} public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

3、更接近实际开发:JNDI管理数据源

JNDI:Java Naming and Directory Interface。属于JavaEE技术之一,目的模仿window系统中的注册表。

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkMAAAFqCAIAAACWEMmvAAAgAElEQVR4nOzdeTzU+R/AcbW1W7v1a4/a3Y6t3dqurbZ0nwoJJZUjRMqRM0eOVHSgk5AU0kEhoUsnHQi5Us7Q4cqdY5h7vjPfef/+IKvRpSbT6P187B87fOc7n9HMvOZ7zGckACGEEBJnEqIeAEIIIfRJsGQIIYTEG5YMIYSQeMOSIYQQEm9YMoQQQuINS4YQQki8YckQQgiJNywZQggh8YYlQwghJN6wZAghhMQblgwhhJB4w5IhhBASb1gyhBBC4g1LhhBCSLxhyRBCCIk3LBlCCCHxhiVDCCEk3rBkCCGExBuWDCGEkHjDkiGEEBJvWDKEEELiDUuGEEJIvGHJEEIIiTcsGULdnLu7+3yERERbW7sLHuRYMoS6OV1dXQmERGTYsGFd8CDHkiHUzRkbG4v61Qx9vcaNG9cFD3IsGULdHJYMiRCWDCEkBO1LZmVlFYfQZxYYGIglQwgJU/uSnTx5UtTDQd1fWVkZlgwhJEztS3bkyBFRDwd1f3l5eVgyhJAwYclQF8OSIYSEDEuGuhiWDCEkZFgy1MWwZAghIcOSoS6GJUMICRmWDHUxLBlCSMiwZKiLYckQQkKGJUNdDEuGEBIyLBnqYlgyhJCQYclQF8OSIYSE7AstGZ/HZtKaKJQmKp3FZDRTKJRmGovBoDZRKE1UJofH73CF4juB27cFlb19lQRB8Mh2N8Dj8sgOq0GfH5YMISRkQioZn9FQkZeVkfoW6Q+ziqupXE5DYVZqWnpGZnZ2VlZWZubDtNQHubnPnj17lJqampqa9jA7v6qOzgeouXVg+hxZNQ0NFfl5EyXnLlfX0FCWnTJzjuIqDY2V8gs0zW91TFbjQ4vZ4838HrxxfM33vdQMdz+qJ3m06orSahaLdm6f+oHbVR97f9HHw5IhhIRMSCWjX3bQnDpRarXOev11a9Q6UJw3dZHKsdK61L0W6isUpaeOGzdl0r+SU+cqq6112Ozl6Wmiqqqqqqo8Z+w4ResLXICy0I0/TVy1z9PTee2sPkPnbPU96b9VddD4KfpOnp5b10oukg59witJiAzw9w84eSY0JORkgH/A8QArxVF/jFi80y/gzNmIsOBT/v7+Jy6k1BMAwL1pv2b11lAaEHFHLfQ2X+QARGyftz2WJsS/JPpAWDKEkJAJqWSUYEMdp/13nz2Ov5z2suOvm+L9VRbuftpygVYY4up80udIYEjc60txb27VXWAUwgSAipRDbnucnZ1ddu9zd7aTlfx1wTont/37d7s4O7vs9gi985IHj8972NnYGK2Y9uc/4zVNbW1sbB0cd2x32mpnbTZzeK+fJiy1sbFx8LpayQGy5o7+Kp2gDCpAucvqcaMWrbWyNJWdOmSakp6FhYWF5aYLWY0fe8dRp2HJEEJCJqSScavycp4VVQVtHPvd4CnKKwWprHQ4l1LEgKbre22WL14wecyYSRMm/Dt5luJKLadLBa9WwrmxbZ2MxUV6Y5K96TojU3NLS0tLKysrk3ULpgydo2JiZWVlZWlpaWlhZqhrcvB8XcuVSs5pWm95+NrGVYOb5kybS21B5T7w0uz7r0pCHdQmBK5V0D129vSpY4fXKYxZannw1KlTp04FpZbQP/aOo07DkiGEhEyoZ3yU7leduvFkelEH5dWslgU8ly3XN92+1XSDnYWV07YDLpvVF++53lxbnJuZkZ5+122tkqxFBI1ozM/OSLoTdSbwuK+vr+/Bnctm/75k40FfX19fP/+Tp8NvxqdkF1WxWk7f4D5z1Vix6WRa28kbTRlHlKX0YmtaLpH1+Ve0Rw34dobJvScVJzdKrfXPbfl5yHbpXbHNn3Z/0cfAkiGEhEyIJeO9vLxq8K8qWwLPCgiLvHI3rqQJAF4c1dLf43nm2Nb9x3wOnQu/d/fqvg37fL3MFcbPUVi5crnk4N9nG4Q0AwDwEn2NJ0prWFlZWVlamJoYmW60tLKysrIwkpeT23T5RfvbfXHVfpaSRV5Llch6D30Z9aN3Wn7F5zSe3aFraL1ZzWHz+YyyjPORpa+uFbZTxiUeN8VEAEuGEBIyYW6TUZ+EeOzZ5mD7GptN1htXjRs0dHccD6AqQHOtpdUmQ5e7j6J26yyRV5SX03Xx3m2zySWmDgBK4qKCrucRAADN1w+sHSuzfteuXbt2Obu4uLo479q1a9eu7fbL5BboB+e/drvcimM6yzQcY/gAD7115izdm8Ns3ULjsxn592MrH1/RsbYJv5cWcsB5s+0ma2trawuTxdOHzlA2tLa2tra2djmZSP2ke446AUuGEBIy4ZSM5LIYNBqDeMuvs3dIqQQ94gHUHl0+d+zIf3c9ACAqE66e26qvvNb50B5b6x1Rxa9fpfm6u96/yzZ6CXB3Wa0sYxiSL3gLdRm2iuPnLpkvpWJ+p7zDMIouqm+0jkjOu302MKCFr9da+dEK5vtbLp29lcf8yHuOOg1LhhASMqGUjF2a4Lxe7s3UHKOiQ82kDS8V8QEqvVcuXbPRIz710aPsx8+Knwfv19d19tpj86pkzEJP74MBqRQAdrS7zshZysYCNuhKzZu7IbRAYAC1JU/DnJb9NODHn2brhyflCx7+enZRzWzj+Xxeux+Roduld8XilpgIYMkQQkImlJLxSYJBa3oNjdX2W7IgdIWU3X0aAFT5qMgtXKpjYmRoYGBgYKCvsGiujvPhvZttd10tBQCgZ20yM9h2pRKAc8Ndb/JyS28Bnns0Vsi22ybjZcecDjq6T09N03TfbQ6XGevtsEJq0mrrQ6cj71a2levZRTUzi/Ptt7vYDQH2C7Zcee14G+oaWDKEkJB9rtmq6E9O79u5ZcuWLVscDOT/kd16sZEHABWHV8jJq5nv2Nliu7aytLazl7Pu+k3niwEASi7rrFEPKgAAiPPWGyOtu13ANpuli6VMzpcDwKPQfbaWRsamGzZuPJhSzWl30/m+dhYbdDQ115vanYynA8CzCMX1hmHZjP+WYdf7bJxidaEUUJfDkqHPgsfjvX8h1E19tpKV3gw+6e/v7+/vfzwwJLe25dhVuY+Kkoaxi/+xFn7W2kvUj8Yke1vNk1yooqKybMFMdavDVy8fMlBRmjlxzMiZHfYuGupKTR85Ypqcyga34NOnjp2OePq2A1z8mjthAf43slkAwKhKzcyqaG73OCc5Jbn38qrw6JgIYMnQZ5EZYOUW0eEQOgDRXJWfm92m+CUDgHnHfedBnw87eZnkNjfWNrNJAOBRysP3brtZ8tqheDLrxHrPiHbvk6G5uqjw6dOnBbnZ2dl5BYXPnuXn5hU+f1qYm5OdnZ2dnVtQVFTN6Dh5LPoEXTuDMNFYUctu/w/Iaaho5gCn8dmj9OTk5JT07EoKh/byaUZySsaj7JzMB8kCUlIfZuZkP0xLzniKZ9CLKSwZEhZWcXr8+fCzwcHBwcHBR8xk+/8itS2w5VLIuchrD57UAUBD2kk99eWvKLveqASAu47mjnvu/bcm4uXDuOvhocHBwaHno67lVrV7eaE8P2gr555ABQDglARuUJunu7uQ0VRwK6rllnztlv8po+F1vOXSjYJ66oNQ60lj/v57mszy5culp038a+SMRVKTBo+dJKeovHz5cuXFM/8YrXe1ggFIeNqXLCgoSNTDQd0flgwJyzPX+TPmK623tLS0tLS0tt3s4GBn3XLB0lxt4bQ5lhe5Ha7DLLi2xd5aZbbk7Hmqlvb2Wxx3+l5Oqi2+ozF6upKBubm53uwh/db6ZP93BW61l+0iz/RX78BpBdt1VV3O3Llz2LXlljasnD1UUkrPtOWSx70yBkClh72l7aWXAFB+4bC+fmRtWZC8qVthy1xEBSel9Z3TqjoODX289iVTVlb29PQU9YhQN4clQ8Ly5ICizqnEN8+amhfmKGt3iQMkweFwCC7JBx7B4XA4dY/vHjmyV3PW5LlKG32PHNmmPX3qQsvk3FTrJbtyAAAgwmCRjtFO2/V6WhrqampqasoKk0YPmrRwhZqpd04jAACrpLQgu6Jt3xLrnut8myMN7W+bLPe1Vvx7poK6uvqSGVMV9c/RiCSjJXZXS2kAUH7ReuUWzzLcqSRUZmZmEq+ztLQU9aBQd4YlQ8JSfEBu5j9TF7zp4z+y00aPnGUTTTKzdpqqLJGVmj114uxFcnJycivXu1cA+7yFvo1XGgBUX7dXXWKT/Dh1o5ThyeS8vLzE7QpTDHZFxly/di0+OTkxMfF6mKm6pIlPTGJ6ftGzwvzCohoGh1143lBNesro4eOmLlSWnztpxvxlSxXl5JYsmitpezYX4KW3nb7W3iu5ubkXdttoagc1QLmngoZ/Qi0AI8RCb5v3XQYeJhMePp+vo6MjULLBgweLelyoO8OSIWF5ekBxtXtkVt0b1KRd8HEISObyiWZKQ3FysKGyRlQRm2AzKA3NBFnmraFv45cKAAXn7LWX78wuTdefPHmOwvLly+UnDR5oFZAQEWBv45cCAEBUeNnJeqUDAHnXw0x2zvgpihYPKEw662XoZtVVq60OBUdnPkqJffi0rq7qpO4c/f13gWw8Yqu9zPpoVFSUt9V6Ve0TjQDpXuqaRzOBcs/YwPhkGn77hjDZ2Nh88803AiXT19cX9bhQd4YlQ8LyzF1Ry/9u7XuXu3/G0urow4bc6Cv3MgkAoKVbrNF0jCoFgLRj2wzW+hdXJZrJbElkAgA1QHOuhd+j6sfn1i5bH1TIAE6xm9Wi/fGt8y2URjuunLM+mQ4l8YHBsSWNeVdc9oeFHTZZsi8GgJ994WLcg2oga3ytl0+U0TQ1NdOQXbBsbWAzAJF7YtUKK193Jz3zHfl4toeQnD17tuN+xcWLF2/fvp3Px81e9BlhyZCQsB5uW2JxJj4j/IC2hsZqARprjDxvFwEAcPIPqBtda+A3PvJVWWByq5Zg5p1WX6MTVQIAvFj3jao6vsUVieYyW5NYAEAL0Jxj5P4AgHfTY+sO/3gqu8bT+r+SPbu+TWWBQTIdihPP7rE3tnMNqgFIOays7nmLINpO4ijzcNi05Vo9ABSFe+lqHH1B8AAo0baz+/wq5Rz+lOz6v1W3c/fuXS0trZ49e0p0gOcuoi6AJUNCUhyxXGdfzP3bm9dO3Oh3N+410TsMFsm6JwFwbnsoK5kGpN6/stNkieSwEWs8L4U6rF1mFdLIAwB2rLuFyrqAFzVJxvM3nErJz89P2i7/r5FnKheAbK6rf9lIUEoObvqvZE+vbl2tYBd/L8psrbLC3HG//v73YsUlE0YMlpRZtlJJUV5e3ioorbE03kZbXfNA4Al7/XmTxw4ePEnB4ND97CfH9Yf1GjXHNwW3yD5JQ0PD7du3f/nll44Na/H5P0+GEJYMCQnl1s7lW/zzs1Nd7FUv1gj+NiXIeKVPOkC5v5XG4mVKGuZO8aX1zQWXVJfPlFykcr517lb+BQuVBabn6Zy4lUNGTV28bNky2VE/SGh4PWg3j0LFAZM5zrebWi4U3XZZIalkt8PjXPyDOg4A72Wch/qAvpPWuwcllTRzmdSm5sbrBzXllyxZorDxQkZ+3PG9etreSWm3Ny6cr2584MJlNw3ZNYdjcaK8j1RcXDxp0qTevXu3T9egQYP++usvLBnqSlgyJAzky2MGypYnUulNzx3V/1pqsM3pNQ7qS2YpH04RvFZlqoHsAuuIbICGW6cOOW2zkJ02zTr4MYvzPPLI9RIeABCpZ7wjYkt4wMqNCd7h5LTVSmvRHLXzz1tnki26uvVnie+n21+kA9SmBblY6K5SU7eysjRZq75slfmpuGcCN1gQ5jJ/1PRJC+attAqr4QMAZEe4ycxb6nopEw/jdAqVSvX09Jw8ebLAFpiJicnt27e3bNmCJUNdCUuGhICRF6SjvibsGRuoWQ6rR6ttcvd4zf71K+Yt904WuBa34tHFqEdUAIDGxMhADw+vE5fu1r85KewnCZe9PDw8vA5HRBe+mtiVlRyxW9U2ojI/ZpOhhpLGhj2HTqa/aDk81nA7wHGl/BLX87ntJ7OiV2aGBfj7X0xtv0uxKj0qLO4xluzDOTk5SUtLd9yRuG/fvpYFjIyMsGSoK2HJkBBwm6tf1FQQAMChVVeXszsswGdUl9QJ/ePHPCqtmUYAMMru34vNKBacubWpKOtxSQOe0CFENTU1NjY2HRtmYGCQlZXVtljXzruIEJYMIfRh/Pz8+vXrJ9Cwf//919jYmCRfe8OAJUNdDEuGEHqP+Pj43bt3CzTs77//trCwqKur67g8lgx1MSwZQuitnjx5sm7dukGDBglkbNSoUdnZ2W+7FpYMdTEsGULoDZhMZkFBwejRowUa1qdPn4iIiOLi4ndcF0uGuhiWDCEkiEKhKCkp/fDDDwIZmzt37sWLF997dSwZ6mJYMoTQa/z9/ZctWybQMDU1tcOHD3/gGrBkqIthyRBCrY4dO6auri7Rgb6+fqemAMaSoS6GJUMIQWNjo6+vb69evQQaJi0tnZ6ezuFw3r+KdrBkqIthyRD62t2+fXvgwIECM9kPHz5cSUmpubn5I1aIJUNdDEuG0NeroKDA399/wIAB7Rs2YMAAY2Pjd5xk/15YMtTFsGQIfY1oNJqpqemECRMEdid+//33N27c+MSVY8lQF8OSIfR1IUmyoaFBQUFBoGE//fSTu7t7Zmbmp98Elgx1MSwZQl+R9PR0CwuLn3/+WSBjJiYmDQ0NwroVLBnqYlgyhL4WR48elehgwYIFDg4Owr0hLBnqYlgyhLq/6OhoU1PTjhlbvHjxy5cvhX5z7Uvm7+8v9PUjJODJkydYMoS6LTqdfuPGDYHdid9+++2YMWMSEhLeOJP9p2tfsoMHDzYj9JmlpqZiyRDqhhobG9PS0iZMmNC3b9/2GRswYMCVK1coFMrnu+n2JevXr99AhD6zn376CUuGUHfT0NCgqKjYcXeirq7ulStXPvetty8ZQl0MS4ZQd7Bjxw4ZGZmOz/BDhw51zQAMDQ27/vULoRajRo3qggc5lgyhz4VGo1lYWAg8sfv162diYpKYmNhlw7C0tOyHkIhMnTq1Cx7kWDKEhK+goMDb2/u3334TyJisrGxNTQ2Xy+3KwTQ3N9cgJCL19fVd8CDHkiEkZDExMf379xdo2NixY9evX/9Zz+xA6KuFJUNIaPLy8jZt2vTjjz8KZGzcuHG5ubmiHh1C3RaWDCEh4HK5eXl5o0aNEmjYgAEDwsPDnz59KuoBItSdYckQ+iRcLjcnJ0dBQUHg887ffPONl5dXVVWVqAeIUPeHJUPok5iYmHQ881hZWdnHx0fUQ0Poa4ElQ+gj+fv7a2trd8yYiYmJqIeG0NcFS4ZQp7FYLG9vb4GAfffddwoKCrdu3eLxeKIeIEJfFywZQp1QXl5+6dKloUOH9uzZs33GRo0alZOTQ6PRRD1AhL5GWDKEPtTjx49Hjx4tsCn2888/q6ur5+fni3p0CH29sGQIvV9DQ8PWrVvHjh0rkLH//e9/MTExoh4dQl87LBlC79HQ0LBo0SKBhn377beenp7p6emiHh1CCEuG0NsVFhaamJgMHTpUIGOWlpZlZWWiHh1CqBWWDKE38/Dw6HiG/dy5c+3t7UU9NITQa7BkCAm6du2atbW1QMMmTpy4e/fupqYmUY8OISQIS4bQf3JycpYuXSowBXCPHj3Gjx//7NkzUY8OIfRmWDKEAAAoFMrDhw9HjBghsCk2YMCAGzdu1NbWinqACKG3wpIhBLW1tbKysj169BDYFFu5cmV0dLSoR4cQeg8sGfra7dmzR0ZGRmBTzMDAICgoSNRDQwh9ECwZ+np5enrKyckJNKxnz54WFhaiHhpCqBOwZOhrVFJS4u7uLjB3ooSExLJly549e4ZTACMkXrBk6Ktz5cqV77//XqBh48aNW7NmDYPBEPXoEEKdhiVDX5HMzEwXF5d+/fq1b9jPP/+8ffv2wsJCUY8OIfSRsGToq9DQ0KChoTFy5EiBTbGffvopNjZW1KNDCH0SLBnq5jgcTmlpqZSUlEDDevfu7evrW1JSIuoBIoQ+FZYMdWcEQRgaGvbu3VsgY3Jycn5+fqIeHUJIOLBkqNs6ceLE2rVrBRqmqKi4f/9+UQ8NISRMWDLUDV24cEFNTU2iA2VlZZwCGKHuB0uGupXa2trz588LnJ0oISExfvz47OxsKpUq6gEihIQPS4a6j/z8/L/++kvg886DBg2Sk5N7/vy5qEeHEPpcsGSoO6ipqdm/f7/ASfY9evSwtbW9c+eOqEeHEPq8sGRI7FlaWs6aNavjUbGAgABRDw0h1BWwZEiMVVZWGhoadmyYra1tXl6eqEeHEOoiWDIkllJSUnbv3t1x+sSZM2c6ODiIenQIoS6FJUPiJyoq6rvvvhNo2JQpU2xtbXEKYIS+QlgyJE4ePnyora3d8ST7f//9F89OROir1emS8fn8mpqaaiTOxPH7t6hUanp6+pAhQ9oHrHfv3kOHDo2Ojq6oqBD1ABFCItPpkjU3N//xxx8/ILH1448/lpWVfY4H02fCZrPj4uIWLFggsEfx22+/DQgIwN2JCKFOl6ypqel///tfx7PFkBgRowngSZLU0dHpeBd0dXUDAwNFPTqE0BfhY0r2yy+/dP2LLxKW3r17l5aWfo4Hk9AdPHhQSUmp412wsbER9dAQQl+QTypZjx49Bg4c+Cv64g0aNOibb74Ro5LV1tbu2bPn9X71GDb411WrVmVmf44PihGNtTU04jOsGCH0+X1Syfr161dUVERFX7z6+vphw4aJRckKCgpCQkL69+8vsB028DuJqLh0giAA6LkZKfcfvGjXHX5zRcGDzKfNXADg1hY9irtz8/LFixcvXrx0I+EF+9VSRFNe6u07cbG3bsU8qRc454Vz2VFFZ9tVZscBsV5mJt++evnSpUuXb9xOKqOw2M3lyXduXr506dLlKzEJD140cT/TnwIh9IE+qWT9+/dvbGz8HMNCQjdixIgvv2QZGRnDhw8XaNhvvw02NzffLjNkrv05AOBn+k8ZICHxnez5av6r63ET3Fb+PlEnvh4A6o7qjP7hj+kaenp6enq6WlqrDWzPplQBANBfRO5ZObh//zFLDK494VRn3/Vz3+fi7Ozs4uLi6uqgMb23xJBVdjtcXV1cnJ1d9+w/FZneBACPT86YPk/DxMbGxlR29AyXsIdZlw7MGiltYmNjY649bdy4bTdffshdS0lJOYIQ+ijPnj179/PrU0tWW1vb2TWgrsfhcNoK8WWWrLq6Wk9P788//xTI2KBBg5KTUwAg3Fp6sskJEoDMClj456DevSTmGQe+evBxkzxW/zlNL6EBAGoPqU+caRDIaf1V4y2vdVPmyR6MqwAAYNzXmjNv2/U6ALixVXOupLrroUOHvDzd3dy8jgYEBQYccndzc/fw8vbeZaw0eYJdLgDkn5o5fa6aoYWFxQbpv2fsOZ/7+Ir7rJGLTGztbM3WTB033jG67kPuoKWl5buPXyKE3ub06dPvfn5hyb4KX3LJCIIoLy/vOAXwL7/8EhAQUFBQAAAAzGCz+ZJmJ0kA3iM/mUnTDBxNp/04wSK8EAAAuEmeGn9N128p2WGNSdPWHq357xb4ZzZMGSW3q4gEqL+tNnO2TUQRAMQe3OXtl8LjMIrunfT2CK8hgQ/Azg3b6eSdXU+lF9zYvMa7AABeXFm7YeuZ6OTk5Fv715v4RSZlXA8y0d4ZeiHswvnATTqrfNPfsEuyo61bt3bpUx+hbuTcuXPvfn5hyb4KX2zJkpOT161b1/FzHVu2bHn9y53bleyh7/yxkkcTS2Ncl/4wYfnNUgKAfGfJoP664z9/S58pAWi8ozZztk3EUwBoKsq4EXHMXnW1geXRWymXDBZOmShnHZddVn4vcIOC7Hon35sZL3jAep52+1xkVMzduHtJ95Pi4/etm6xgdzz2epD67N9mGhyIjAyLuJ5Y3MCB98GSIfTRsGQI4EstmYuLS8eHrKKi4u7duzss+3rJ/p64J4EJ1PxN03+cZnyeBMjw1nxHyeCh7/R/5U8UvlayukcXXC3dH1Lo6cFu+qqKK52OnnDbuk5L5+D5BDZAeugB92sFAKyks0e3bHGwt7MzV5/3vYREj+Gzp//RQ+L7Yapmmzfbb3bYsmWzy5GEYvp772z7ks2YMcMUdSEjI6O2Gc569uypra0t6hGh9xs1ahSWDL3mSytZeHj4unXrOmZMRUWFTn9jFVgh5vOnmJ5oK5lLTDUAvIw9OH60pG96zSN/vZFvLxn1ruuU8aoX6tpK9qTl51XxJzfqrVi0XM//cnLLCYjliYH7dtlamm0ISKEAALs4zsvJyt7ezmbTJkdnZ7/AwOs5L6uzrwcdd3PdbmNjY2Nnv9l25+H4Tpbs4MGDn/b3Q53Wdgi2V69er2/uoy9U+ykRsGQI4EsqWXNzc1hY2A8//NA+YH379p06dWpqaiqVSn3L9TihpnMnG7cr2a0qAABgXd6xaNp844OuGuNnG76tZFH2MhPUD1QDQN0ttZmz7aMq+JSCgxsU5NapTu//02+SCmtWqyopKCgoKK5Q1VJfItlX4s8FK6WX620ISylLCbX6/XsJCQmJbwf+tWjZisO3CiuybmyQkhzUOnNWf5V90cWNndu76OLi8ql/R9QZ7R//vXr1Ki4uFvWI0Pupq6tjydBrOlUyCoWSmpqanZ0t3DFUV1ffvXt3xIgR3377bfuM/frrr3FxcTQa7Z3XLrSZOUHTKwkAuA+PtisZAPvhphnDvvv5x7ELzRIbAKDWW33SLMPTrz5tRs06aSs1Q9Yj9gUAACNZe+58x5svATh1FSVVjcm7Fq3xjX5c0k7pi1g7OVP384mlFRXNXICiUHmdPen1AGSDn7qk3s7Lcae8NFR8agCAlrNDbZ5r3Nvq+xosmQhhycQRlgwJ+vCSlZeXt0wQ9cMPP1y9elVYAygvL583b57AvsTevXtv2LAhPj7+HVdk1tWF7BhO+DQAACAASURBVN27y1BdSdMlpY4NAOwUj0m/DN1y/b/J74uvOPwuISHx77rEegCo9VId9sPfS7bs3bt3715HC53F81b63i4GAGDVxh43GtHvf5JajsnlLZ+MfrRLRv+a4HTKLz1ULH1uv/oTPQ5csFDJ0tnDw2OP5oy/DD1vp0V4y01Vc/bw8Nhju3jGlB0xH3QWPpZMhLBk4ghLhgR9eMlu3LjR9uiZOXPmp980j8eztbXteJK9xAd8RgQAmHV1Z1xdXfeeymlonZWD9zL3Uui5jPJ2U+CTzSkhvv4X79WwAYBdmBh+2Mt9t6urq6vrbo/A9LbQsGrunjt86PBhj0OHk8oIAAB+5mbJKfOWaa17zYpJv8t7J7zqW96JWbNlDR1cXV0dlScOXucek3rOQ2r8MgdXV1dH03mTxn/gJ6OxZCKEJRNHWDIk6ANLRqFQJk2a1LJYz549VVVVP/F2m5qaOs5kP2DAgK1bt6alpX3iyoWAzN69RMXBO+zya3zXLzQ41lYyes3j4oaW/2WWFxaX1VNqqkvLWk/xqHueW/YBB8kASyZSWDJxhCVDgj6wZDdv3mx76PTv37+u7oP2m71RVlbWrl27On5tgpqaWn19/UevVti4TOobPtdMMlksjpC/jBRLJkJYMnGEJUOCPrBkI0eObHvoGBkZffTNRUREtE2930ZSUtLc3JzD+aAtmO4HSyZCWDJxhCVDgj6kZAEBAe3n2qisrPyIG0pJSbGwsOjTp49AxqZPn/6Vv3xgyUQISyaOsGRI0IeUbMmSJW2Pm759+z59+rRTN1FdXS0nJzdkyJD2Afvmm2+GDBly8+bN8vJyId0VcYUlEyEsmTjCkiFB7y1ZdXW1tLR02+PG39+fx/vQA0UMBiMzM3PGjBkC22F9+/YNCgr6ko6KiRKWTISwZOIIS4YEvbdk+/fvb3vQTJw4MSsr6wPXzGKxtLS0JDpYvXr1mTNnhH0/xBiWTISwZAL41PL46KtZ7T/KAgAAROPzmAtRj168f/a1LoAlQ4LeXbL8/PyZM2e2PWh27Njxgat1d3dXVlYWaJi6unpAQMBnuBPiDUsmQl9tyWjPbjlvMDAwMDAwMNxyILJtCjfukwuL/x1he15wUoCmDN+J3/1ifu55Z26E/SjiiE/wfRr//Yt2CpYMCXpHyfh8fnBwcNsjZvLkyR/yPA8ODl60aJFAw77//nsNDY23TAH8tfu8JeOTHBaLTZBCXm13IRYl45NcFovFJYUVBP6j0xtnSC+23HM2MjIyMvzUJuWJU9ZtT6kFAOA+v7pq/qTtV6sErsNj1j/JyaugdOoE46bDq8aM1QgQ3L77ZFgyJOgdJWtsbBw4cGDLr7799ltLS8t3r6qoqCg4OPi7774TyJikpGRRURGLxfrMd0Vcfd6SNWfvWLHU4sQDYb8t7ibEomS0rNMqS5cHZTQLZ233PCaN+XP9yYfcVz/hNz10WDFKcsOxWh5A6dWVUtP33y4pzUqJi4u7n13SMk8pyaHXVlY1MVuvRFLKku/FxcWnPG1q/yaJfPEoIS4uLjGrkkPQirLCjaVG/q1gH5WQWtJIgPBgyZCgd5Ts2LFjbQ+Xn3/+mSTf9b7+wYMHgwcPFmjYsGHDtLW18ezEd/u8JWtKN58pqemVhCV7I7EoGTXtyFzJ6T73G4WxMkao4dxJyu41r//0ZfSOSX/Jh5WQUBu7Zt4oZW0bC2MDTU316VPn6R5OoPGBlXt64fDxWy+XAgCnKsVRS2Gekqamyvx/V+5KK2cCAHAqzh9yWLZosaamprb1wdjMZ2G7V0oO//Gnv2auMrCOzHn3POCdgyVDgt5Rsl9//bXt4bJv3763reHFixe2trbDhg1r37Bvvvlmz549ycnJXXInxNtnLlmG9fxZaw8ni6xk/MabvnsORTwU8swoQiIeJXvgt2jWXN8UihDWxSt0WjxhjVuy4NvSp2EKY6bsjKPw61N0R0uMmOPwiAYAUHHR/o9h8uGlLN7zs9Ij/nG8Wgnw8tj6uVPUPOoAAKrdlGfPMDvbDJB2SHvoWJWwJywAAKLkaSUfgHZUe+p0o7NcEDJxKhmnPGWfiZKSktJShSWL5eQUlykpKSmt3XGxrouekWWnbIx2R+R3zY2J0NtKtmPHjr59+7b8vE+fPm+cnookST09vQkTJghsivXp0yc4OLhr74cY65qSAQBUP3DRWajiHF7JAQDmvRNOSxWVlJYu2+CfxAOovHtwnfqm+LrWl53UQGuT3RFv+t5JXmHUXjlFJSUlJSVlx5iyll1e1aEORjtOP3rDZjtZ6ig1YqpByJc5g4sIS5bsa7bOzLf1+cZ8fth8zZagTOCxn9/0UF+hpKSkKGe8P6OaB60lmxfwiAmU9O3r1h++1Xo6RsODEGNLx/iyln+y+stuVvLLlJYpqW4Oy3nryySRtWnRGAPfLMEFCsPkR4+yu/qSXxWnNn2kw+VX+1Eo8WtnzNh0pZT+PFJu5MSdN6t5leHz/xhtGVrQ3FBXV9+YdFhz9JR16YzGfdJjV+1Jen2l5QfVJ0uuP1Ev7KO04lQyPpv64lleXl7eJcdFPYdO8byVl5eXV1haL8y9re+SrTdp2IpDeV10a6LzxpLV1tZOnz697bFy8uRJLlfwfVVeXt4bT7LfuXNnRUXFm24KvVkXlGx9QB6wSnfI9/97icHlgpcEn5t+3HzqLPVT8Xl5D04snTR3Q1A+83nQ1MG/WFysAgDgFdjN+nuZc2yHd9OczOMbpWV1Tt7Ly8vLS78dtj8klQsA8Hzj9KGLXVPfOASCzWITvC9z96YIS1YcZjJi5MobtQAAzMzj04b8s/V2I1Td9Qm7nJiZV/gs3UVj1gLD4/UksB/5L5o173g2B2quLh48RP9Ebssaqq45/f2vdGgBCcC6sUdjysINFx/m5d52nzdu0bbLz9+cD371weVT5DdFCbyx4OeekBordSSHCdW3VBZNd4159erdlKw79w9Vv6ymwotLRk3cdbOafH5y1s+DJBctk5eXl5eXl104e4mBS27pQ+OZYzeFCxxHwJK1UxSkM2iqosD3Y1QlXfHz8fHxORqZWNjyE5JemXj1el7Js7uRgT6+xy6lPAGAqoSzPj4+xyLv1bYLIFGUePqIj49P4J2c1u2Ml48u+fj4+BzxP5v6AgDIuoIoP6uZfwyassruaOi158LYpv9ivbFkTk5O7eN08eJFgWtt27atY8Pk5ORcXV1FcSfE22cu2QNrqUVmnpeO7Vo0Sck8vhoAgFsRrT5prEnIi5ZFCvzXT5DZ/IRs8lGdtGx7NB+AleE1fZ7yubyO55o+2TZ3nOz2hLbLfJLPbXh2/aT9vL8G/rPMwufMpafN0PT8fkJKXlHWVR/fi4+r6osy4pOyKwCgvjDxzt2Mqrq8CB8fH7/jUVntXiIo+SHHfX18fMISs/OS4+IeFAt9l9QbibBkvMYEvekTbCLLAKDgjOlk5b0v2v+6Lst5+aT/TTB6xAEi+7j0rHnHs9hQe3PFmLHmZ1r3FVVH75acu/xyCZ94Fio9erLz3dY5r+/sUJJUPVD25v25/AcHVQdPWp30+ukjiftW/7Ni23MmQHm0ytThNhFFrb+ovLpyxsxdd1+ynkcsHjlx581qblWk4uQZHikM4BEE8eqFlfbIZPYopV0CXyhYdkB10jSDwEY8Cx8A8o9rDZwiH/XfP3JT7Bn7hdIrzTY7OGw2kF44yzDwPguAV3JN6TeJkVLGuw7ss9WTHz18gq6Vta213RaHzQqzp2vsvlHPAwD+05jjyovl9cwcHBxs9wXGVDQC8/l1lz3bHRwctlivHjtrRWBKFVmVcdJZe+LvP42V0d3qGZT78dO+iwGBkpWUlACAi4tL2wNFRkam/fRUYWFhxsbGAg2bNWvW/v37/3tYo874zCXL3rrsn7Gj/ug/Vf32q2ckNcN36s+/zlU1MjM1NTU105AePWyqehINSoO0xy6yLQJ+ostSOYtjDW94KXzpqTDy52kaD9q9vSNqc4L3rZMc+tPIBVoO7sezGyDVU2bw5PnmGyzsnAIeFOfukBk+Zf0ZAEhzl+nfZ7Cy0TZXBwcHzVk/TFcJz6YAANSmOWlPGy6t5+DgYGOl+s9PfcdqneqaT2yI8jgZSQ+xmj9TP4gG9GM6U7WPpgMA0Av999uYmZpt3rzXXGfO0Dmmmez2JbuxYsxY8+DWktXE7Jk6T/lqCY8W7zqy/zC5NRtNTU1NTU2UZwwZJbcp+20nC9dnblMdNUF7T0rr44HMPGc2fvLCvdHlAECW3dX6U+K3BbsKGADAuemyeKScRS4deE9CZP6c6HitEoByzGDqn1puRSwAgNqC5Is3ngBwHx5U+W6k/PFHjQAAtILcIg5Ava+W5B/LPBqE/ZfrDiVrygyUmjzO4kLr7uXcQN2hvy+IfEFCbazGSImpukFNAAAlO6UHSAyYHfkUAOD5acPho5Sja4CsurNm4t+Ku2NbNnYJen0jA4j6589bP+9Q7bL4r0k6p2gAAHnGs8et8X8ilLvwJRMoGYVCycvLGzVqVMtPevbs6eHh0bLk/fv35eXlBaYA7tWr16xZs168ePHuW0Hv8JlLlrl5ieQiVc35C5bo+99v+VnzQ1+pP8eaeYSHhQYHBweHX7qWmFXYzANe6bmlkxYfj4t3WrrULjTvjfuEarMDlAf2Gj5ZzeNKAeu/JYpsFo5d4fGw5UKiu9zvwyb7JLTEqHzXknHzzc4BQMZhpd9//GtbeAkAADy1mP/HbKsrAPzUA6sGSxs9aqljTaTi74P+XRss9A8hvZFIz/jgP7u0ZbGMRXreXa2Zq07nswGYt5xVp8ro+waHxOdRK+7YzVi4No3xWsmWjxptGdL6uvTy9t4pc5SvlvCo8S6Sf07d4n/ubEhwcHDI+Ss3U/NLGG/fp0dWP/Jz1Zefp6SsrKy8XEFRbp1fYl7LBh23OGat7BRtA1tdfU1lZbm5iqqnHtYCACPnjMzIiduiygCA+eK2qersqTLKysortDb5JmRXAwDQSk66rvtngpSysvIqo92JpVwAfu29wzMnjpNbaXg2kyrEP1w3KBkvxXvNqJn6qW1HomujV/073urKS7I6VnX4QNPTLUe2mkMs5s7V9WvZmqqP3zdrutzFMqI6bses8SuvVwvcArso70FSUtwpR7Mpo38Zq+FLAQBq0rrpo1U9voCvfPzM2j+Tv/vuu9ra2vYn38+ZM4fD4dTW1sbFxf38888Cm2KDBg1KSkqiULr17tfP73PvXbSaP8/0ZEZJrPNvI8bpHEkhAIDy0FJuwuoTj18tRDY2cgCAz28M32m4cKGc9Pp1196+e49WmLh52fAxo4YPWbY5qYgGAMDMMJ37t6JLbMtupHv75P+ZqJvecoEsc5Yf31KyNE+lcaPUklpXzA/eOH220VmAF06Lx8hsi361+kbPFZNnrjslzLO230605y6S5Xc2rFHW0FaUt9hfxgGASle5v6Tt7wAAAMV/zdQBf5lkcltKNvfYIwJYeSaTBkg73gIAAO41e5kef6reLAeyKmb1vMmWV9pOrScoze/dO8sqe5ybk5OTk5NbWtPuqBmXWVfXwOHQy54/zsnJK3nZum3cnHlSespcr/utr7wktbogLycnJ7eopv1bDtaLwsc5OTl5RfWvtufJ+opneXmFNTRhnrvaHUoWu3/lJCmLR227Hhri1ef8tfZ0KbcyTm3Eb8ansgEAoDlk43xZfb+WZtXH75szV/FaMf3xGcN/5+jff+18LGqat+G4aYtUVQ2PRz+7dFButo5XPXylJfvpp5/S0tL69evXcvF///tfUFBQVVVVxymA+/Tpo6amhifZC8XnLRkl1XDimJXuKQDw5KzFkEG/q26LKqXBk8vbxkrO0N/l6+t7dPcer2Ph2S3v4CsTTkyX6LVkZ0Dte155+NX3A9SmDh0s5VjAAuA8bF+yeLelU1buLG1Zw+slGztSPa71pY8XZDl9nnkEwDMHmTEGRzJfbUI0+mhMmbX+qygZQMMZa0UJCQmTyHQuAAD93mGj0ROU9vv6+h3apTx5YK9RehlsIB76SI75xyOJCsBKOKwx8J85Ww75Hvd3Xjf9z57D5SOfkACc+8f1h0lK2br5+vr67HQ+HHa9c19Y8V6l5y3/Ga959+X7l+wC3aBk/MKz1n9PWXH11axgnPxTi/6YuCeFzq+9o/LHr0YnW+a3bQo2nye9/mjLjCt1cXtnz1a4XELU39s3YcQ8/4ft9h8zEnQnjLSObBkqw09j6mRV7wYAaE7QkRyl7v1IKHfhS9b+mdynTx8tLa22b8L85Zdf9u7dO2vWLIGMWVpanj9/XtQD7z4+b8nYVbdOB0alt5xUxkiL3Lt15+nHDQAABbeOb7G3s7Pb7BWZ3bY481mk2j8TtkcJTlb0Rpy7O0b/LXfuBQD3odGskcv2tJ4JEu+2dMqqHSUtWwWCJVOLbX0byg20mD7PNByg2lVu3FyrqNbTAojHG2eNltQN7P7HyQAAoDb7uqerf2pV25ZNQ0yAm72d3VbfS2mpd8PCr1YSQNZmhgQGPaxgAQDw6mKCXDfb2W074JOQkRF6NuJxXctbBmbKBe/N9nZ2do7HYzo1O+J7PIsJsN1orLJ4hUNo6hcy3ZxYlizPT+X7sQsvvkoX2ZBmqTR2mkXg80YKpbHg8AbJf1fufMoEKL+6dGC/9cda2kMJ3DBtjpZ3yzdCvrzjPGWKVOgTAM5z5xVjh8k7ppdSKJSinOyc0srsTXPHSm+50tREeRK9c0Kfb4Yo+VEAgJtnM2fMZJMQCpXevaesa/9Mfq/evXt/+CTC6AN9STMI859dPqCltiXzrR/+Kr/ocjI2t4xCoVAotVGOK/+V35bPAuA/3yEzbqzOsbpmGkFC7F7ZsYpbW3dPkqVOC/+cbhgCACkH5IYPXn77VcmOG0+cphfIBV5+gNGIMZMOxdVSKJT7vnqDvu0zUS/0KzhOJh5qcuLOnj5z8U5e15xN+iHEsmTPIzbNVNa/0+49Ir02wWHN8kWL5eQWS2lbe+dSuQDArYgzk5rtFFkAAADUy86aax1CWzaFG1P91dX1rj5jAwCLkrFLd/k8aTk5uVWOgWksLlmXFqQyZ56cnNxqe489thoaDsEUAABeVbT7jCmz5fQcE7v1h6M+vGRr1qx54/dwok/0JZUMWE31NbW0t795Y9UUxOxYuUxOTk5OTlbD6WRhTcteQLIx3mf+9FmLtW3jq+DxGWNlM++K1r2LlT76Clq7rgNAdqCRvIxFauu54rwLLiqaOy6yAIBHjffRnTpbVk5Ozmyfp7nizFmGgVgy9DZiWTLg8/n8Dp9H4BMMOp1OZ/LetmCHC+0W5DEZdDqdSby6Mp9g0el01qsD0W3LkQSLzmTxvvptsilTphgZGb3hXwEJwxdVsg/BZTHpdDqdzhD41AXJZdOZLC4fBJ5x/z0XBZ7Lr1/ishkMBgug0nXFxOXu9z/jHWgHSyaOxLNk6HN6d8mGDx/u4uKCUwB/VmJXMqErTTwZltR6hkJWwMZ/RipefN5Fn03EkokjLBl6gxEjRrwxY0OHDs3MzBT16Lo/LNnLglg3WyWlFStWrJAfO0/z6JXnXXZIBksmjrBk6DUMBqOwsHDIkCECDRsyZMjNmzcZjK45VPG1w5IBAFH39GFGRkbGw9yKN81a/NlgycQRlgz9p6KiQk1Nre2c+/a0tLRu3rx569atrKwsUQ+z+8OSiRCWTBxhydB/Tp8+/cadiu0NGzZsVzv373fRcfivCpZMhLBk4ghLhv5z7ty595ZMwNChQ1e2k5SUxG9H1HdIXGHJRAhLJo6wZOg/VCrVwcGh7es0P8Ivv/wyup24uLjiV0R958QJlkyEsGTiCEuGBC1ZsqTtMdGjRw9paemlr0hJSXUqbD179uz1yvHjx3m8L/P77r84WDIRwpKJIywZErRgwYK2x0Tv3r0bGv77LiGCIJycnBzb6TgH49v07duXShXm9zh0Y1gyEcKSiSMsGRIUHx8/cODAtpKVlZW9Y+Hy8vIL7cydO/dtJRs0aBCN1jWzmYs9LJkIYcnEEZYMvcGff/7ZVrJOzaxYV1dX2M6CBQuGvxITE0OS3XqaL+FpXzI3NzdRD+er0/b479WrV319vaiHg95vzZo1WDL0GoHvjP6UOYJ5PB7nFSGOsNtzdXVte1rq6upGoy507dq1X3/9teWP/80335w+fVrUI0Lv1/6YCJYMAQi1ZOgjFBQULFq06G07aRFC74YlQwBYMlELCgoS2WsAQuIPS4YAsGSidvXq1f79+4vudQAh8YYlQwBYMlHj8Xj29vZtT8tRo0bJoS4kKyvbp0+flj9+jx495s+fL+oRoff77bffsGToNVgykXN0dGx7Wh44cEDUw/nqtD93EV+1xIKWlhaWDL0GSyZy+HkyESIIov3nyUpKSkQ9IvR++HkyJAhLJnJYMhHCT0aLIywZEoQlEzksmQhhycQRlgwJwpKJHJZMhLBk4ghLhgRhyUQOSyZCWDJxhCVDgrBkIoclEyEsmTjCkiFBWDKRw5KJEJZMHGHJkCAsmchhyUQISyaOsGRIEJZM5LBkIoQlE0dYMiQISyZyWDIR+viSseh8Buu/i2w6tL8IACSXT6fziXd+Sx+HwacxOjlk4NOagPu2X5J8GgV4b/oNj8NvZgC/s7f2JcKSIUFYMpHDkolQp0tGUsjM53wA7rntLM+LfCDJ/Cw+G/ghlmz/aH77TtRlspyd2A+agVbJTU0kom8RMa/+i75NJObxmVx+UTTb1JxIqwZgkw9TiJgYIuYWcSuWm5xKxN4hYmKIm7e4WeWCQ7hxgOXiRzLfNDxeCdtMhx10lxsTy72fRNyOIaITyXIqAPALr7J03bhvvJa4wZIhQViyj5acnHzkyJFLly594no6XzKCvHeNe7/kDb/h1ZJXU4D4xBF9RTpdMm4psdmRiHjEC3dk7g0gQv1ZB06SdCqx2Yy4XfbakqwC1o4t7AKAZPfmKYsZNpsZdg6t/9ka0Cau4aVWADSR4W6sFRs50eeZCxRpxnYMOweGrSl18lia6kaG3WaGtQPrdAI//x7H25vldZh16DDLy5u1SbNpUH+qjjPLy5vl5c066MMOj20NW2U0Q9uRiDrHNtKgTJWlG1gwbPcTmU0AwH8cyVq1i9vpLcAvEZYMCcKSfZz4+PihQ4e2vPyFhIR8yqreUzJaCWf/Zrq5FcPMguG4j1sF0JjMkFrMOZfTcVXcsG10jT1k5l2W6Ua6hTXDchPDypZha8+wsOIkCr61R/Bxexcbi8jYXF64E3Pvce7dO2QTQGMCa4ksfbURw8qWYWHF8LnCu3maab6WOl+KqmPGtjGn65x4fRXV3A1bybtFLRf4KQncu2dZGi7cln2GJdcZ5q785raF2TwXM+ZiE9ZRP7b/CXbACXZAIDs0gh10kn3Uj33Uj73fmjZtPecFCQBwzp7pdgUAoOAM2/EwnwsAQKZHErcyyMfRLA1XLNn7YcnEEZbs47i5ubU9l/r27Xv69OmPXtW7S8Yvu8VYuYQVGkfcCWGoKHDSK3lu65r/mEZds56ua0BXUaLZniKpACSLd86NqrWJKKJDcyXvzl0iNo6IS+Tej2dZr6T8MJm4V/Fp9/g1ZHoITcWcm9cs+POci3RdW24hE7iVxDYT9tVnnVsvn+A3NgKXBJLDp9LhnceY3oBJ5zM4nbpGp0v2KJJhZU433kCdLdk0aTZVy4jp4cZxtmMauxDx8cQlX4bKckZwNr/kMTcqgKGrwwi4yQve2Sy5iKapS9NeR1NfTVPTpq1Rpo5azUsq4EV5M0OzAACoCSwNV27uI/YWPepSJaqSLsPCgr5eh655gE+r5fl48k7nQkMaa09w6wY3LYt7IOrVmArY63dxXgDAS2LDUvahJAAgQ5zoC+ZQV6yhu5xmeVsz3c6SeXEsTSzZB8CSiSMs2ce5dOnS999/3/Z06tWr10fH7D0lK4lhWliSJADwODvXMLfuo08Zwdh4gqxv4lfnsdbLMRyi+CTBu3mAOtuQk17Dr64m272Yk7fO0NVMiRv5wj3UTz4Ipa225D7uULLEI03j5IgHNCCec5RnMgMyO7Va/r0jjIU6vGo6P8mbpWzDq+zUtRuJbWvZWy/wO3NPO79NRpIZt9nH/JjaStSp4+lWftyka8wFw2jGIXwAqIkjtlrxWt4zMB6zdmzjlADc96ar7eMzmXwmk3fMkrYnms8s5XqGQFkzP+8CY7Eiy+sK+TKJtfYANyWauX41Y/8ZTlgYO+gMe685dYo+WU4Fdsu5JFxeqAt9rRERV8x/fp2z3Bk4fAAAPpdPZwIA3A+gjv6D6ZMN/Equpwc35jEv8RRr7T52gBPL5zyZF4sl+yBYMnGEJftoZ8+ebfuSRgkJiR49eoSGhn7Eet5TssoEhqosY/cx9jE3+mJJhvUp4upt8sBewi+C8HWkmbrxXgIAk5twjZPDgOYM5npjbgELAKDpMeeIGX2kJG3pHrL2jWezCR+ZHtA8TZl4RAeimKOxiBn0uBNX5lEImxV0o0A+AD9qM3ORGSkYyndr5BrJsuyj3r9gO50uWc5t7kEX9rkETrgza89RToAH2+wAsdeAuno/r57Jjz/CNHLltRyyan7M3r+F6RfNPW5PXajD9j3G9g9gbVhFXWPP9g9g+/qxI1KABKh9xAkP5+XdYa87wE2/w9RToVu5Mve5sfYdYNroUqcbkxUMAIBnCbysIgAg86I552+RqZdYq1xaS9aCWcbeYdD8x3h2WBY/8wpnuw/JBv5Nb7bDWd65baxDWLIPhiUTR1iyT3Hu3Llvvvmm7Un17bffGhsbJyYmdmol7y+ZphJDT79ZZhXz+DWSDQAAdTfpfw5pGjabk0hrt+wLjo0u3esa0GjckL10LVOWhz/3zi1irwtjgxHjRCK/szvr3o7/YscQDAAAIABJREFUNI61z59X1vK6WE8E7acbmDJdPYjwY9TZK1tLpiXPCowhTx1kGhrTt3oRT/97ESUzrzKtjOimW1iRWf+ttOgGfbEC83Y13DzEWD6bOm4uXd+ac6OlhVRekAfTwIRuv4/IaWpdvjqNbWFJN7fk3HwCzTXcQxuokpOos5cztu3nPaF/4B3pdMmyonlP6iD3Ett2K/GwjM9lkEnFAFVszdWciw+5J10ZO67zAQC45E335lkLaXbHOIE7qWqWrKMdS5YMXBZ56woRV8R/EcPScOWm3WauW0Ez38ncvY+5Zx/TUps62YCsYALwoSCet82CdfDV6UWJR2j6R1/b+MyOZvvsZmzawPELJw46Mvwz+cAg7LVYETncs1uwZJ2AJRNHWLJPdPbs2d69e0u08/vvv9+/f//D1/CeMz4YL3lPiyDnCmPrAW4xg99Yz4s+zdy4jhORyLt6iqmqyfS/QVIYwK3n7ddtXmRDJMWw7ZxYYbeIzKq2dZBFWYSrNSvyoVDuMgCQt92aRskQD6gATMJnA22ZITsymoi9yjGY2zhanchmAK+S0BhDmahBBF4mrt9gb9GhLXPklhIAJHnJja6ozzp1hYi+zrl+k/uiZZVcrs/aZjVHkgZQlMpxXE2fqco+e5v3vA74VJ6/FVPVlrh+k+NnT5XbxHnCBEYaS02N7hRMRN/ihd+CpiYy/RxTaS5j9XYiLpls+NDTNztdsoQzTANV6nTJ5ulytA1m9NU6zDMPAEh+oBVd34JhYEQkUwCAH+nG2ulIX6PPSm7kJx+jb78CwOezmLxjlrTdV/istv2/FWwjXabnPf7zKLaGG5/JIjPvEVfOs9Yq0LRdONfucDPLgMvlN1SSVfVkyi22nTWx5TRZU0+edaKuPcB7UUlWVJIVFWRVDb+2ASgVnD16LJtDxNEz3LsRDLWFzfPWcRt5vGB7lheW7IN95SUjX5RzU1PJqqr3L/olwZJ9upCQkPbHzCQkJAYOHJiamvqBV3/PNllFEst1Dy/6Gn2FFE3bhLXNlq5ryjoRSsSncBPuckLcWbp6zENXeUFb2VIyVBM/XjWFzErmxiRx01O5yWncB6lEXAI3OY17N5lsENrLGBnv0zxtFZFHh8pouswS1o3Whz15YUvT8JVENh3Ico7S2OaNwa3bgU2pTFkl1uVnwMlkLJRi+j54tSYuvyU6lMcc1fkM/0et9/qCA3OxBdkIAMB/eJo+ZxmR3nKsiMExV6HvvU0WRTLGSHEyWhZv2XdazzWRZzl85r2LtErO+tnNsyzIBi6/PIOzfjkn6gkAADOJOX40VdGjdbGmOn5pGsvZkf2oibywi2nnTugvoK7Qpamvpqmuoa1WbpZcx8trBvZTtqMFJ40OUU406zAAgjjpRyTnc32dmLtPsM8cJwqZAE3cI3Y0dR26vgldZw1t5Tq6pmLzqMk0TWO6+Ua67jqaphbd0IabzQAAjtNqtmcMsHkATVyb5TTHSADg+psw9+IZHx/s6ywZcfU6OziUExZOXSjb0KtP8wJpXl5njg2IGpZMKM6ePaujoyOwZfaBMXv/GR8brXiXLjK2e/KaAKhZzDWyVFVThrUNw8qWpjCbsS8Kmqn8m6Fk7GWGkzu3lgf5N9hmFnQLa/pymaZJcgxLa4aZBcMpDAihnfVBxvs0T1Mh8pog8QBTSpdb8urnaSebp7cdJ5NmBr96LnCLWbqLaR5xZH4ES1qL+1RwJPzoPUwpA15Zy3noJBlqw5QxbTl1gozcSh8vw9wfwD7qx/Y9zFg8lm58kqSXsdXk6bN1WScu81oPp5URhnIsm/DPfMYHkzh1gOXmRUScZ1task7cAwAAHv+GO2vBCsbSjdyyV589pmSxtjuy72dwrIw4Hn5cx428tldEfjZDWZ9IewkvrnM2mHDLmTwHZUZAMi/qKGOLL1nD4LmZMw7F8RJ8Wfr7eLWvb1++SOGs1aTNU2C6e3HCbr1+Ig+T46jBPnwPAPg5oWyVTUQ+FQDIpHDiziOy8Baehf9BvqqS8QoKGZvsmQ6OlN+GNXzXr/GHHym/DqX8MbJBojdzz35Rj64TsGRCtGPHjvYxGzp0aFJS0nuv9Z6SvYhl2tjzoi4wHD14VIDmB0wDU86D1pdL3qXtzN1nWg+AFYQzNu/jlv93NIwf40HX8RPWvWvvv5Il7GMqmnLrXv08/W0lK2GtlaG53yXv+7OktbiCJ+dXc9Yp0zZdbFs9GbKJKfuqZOEOjOlKjINHWF7eLC8f1lF/Ir0IAKDpMXF0J23CRKqKK/clH6CCMJRj2UZ85pIBUB5zNhvQZBYztvsSXr681AIidDND2YSX/px3dit1kTH3QSUAQEUSy2oje/dWppU3+SCR0J5BW//qk9EbdZrHqfNyyvm3vdkGp/gppxgr1hExd1kbHYi8BgAu94Ap48gDAB7Pezv9ZHrr7eZcYW4yYuhqs3ZdJNJj2ce8WI52TAMThlsUv+XoKTA5W9TYfkn84iSG+ipWaG77UfPTT7FW7MCSvV/3LhmfweBTqXwqjem4nbpkafPs+Q29f2j8/kfKkBGUP0ZS/hjZOHBw44CBjd/2Y/keE/VgOwFLJlw7d+4U2DJ7b8zeU7K8C4wN6mzH3bRpc5p1bdlBoSxjQ1ZkJlldTVZXEz7mzN2hLR+AhdxwhsMBbnEzv6am5bfcY3Y0xe0t/09W1fCbhDZVUevexXwqPA+mT1ZgJTYAAACPd9y8+c9VRDYdeOUcpbHNthGtWSm+zlBYxk54CY2JjHnzmSfaTvTgAg+gIJg6V42VQWlbPRlsxVhgyqsHAOCnnqAt1SFKBEbw6lBTcSRj/GTWuVL4f3v3GR5F9TZgHASkhPTeCAmo6Is06U1KCBBKKKFLDb33XgQpUmIBRAGlqPyR3lGkI703IUUIPYFkz8xO78/7YZcQVgUCJJvB53fxwU12Z082Ljc7M+cMpCk96osjN2XrB8l2yX79UujUVPxyp3YtFQD0MweU8f3YftOVZNsrwGpLxgt9p6k/fsW1ieKGD5X6zFeP3oKHZ9Vh7cWVj1er2rSYazJAO5OsbVgkrdijfTVZ+PaIwVj0uw+BPicM7cy26iJfEAAA5Efa5fPqjK5M647SvB+U3TvV8zeyvAhE3b9T/nwsP3CUmgwAsjyrr/zNZmX+WD5+T2bQ9SM/813aMI1a8BM3v8azfpwIS5Z9iqKdv6CeOcfUbUC/X44u9xHlH0JcvYlPoC1gVGAJUsyDFHa1VqtlrVNfmDzVEMy0tBmW7LWbPn161pg995jZM0tm6N8PZuq1lZYfNu7f1+/cM/46KrSuTNdqzXbpxnbpZq1Yipv4i/1TyMWfuOGfqYd+lXr3ZDt+wnbpxsbGsi3asV26sZ27sO17Ct9m76TKZ9APLbJWjFEusGBYlDHRbPuR8r5D6oFNfExZi18T5TwH2l25iS8p31XaeEDZt0caFM2O/E6XAEBQlg6m63SSVv6uHNqr7Nmv0aDO7Mh0+NLIsiqucXIpW6EJ/91uPcUCapo8vR3TdrTy60Hl0B5l0Wrt6F0gp5WVG5WDh9V18VzHIfJFBkBUZ/ewfjxQPnDGIDl2xof1kX4/7amv0I8MNmsfNCMjw7A80m/fMVjWsCoAAIYCwtPrC3McyCqIvCFLBsM9WfNX5fS7t/U0kvXFNlJv6TdTDObflg3m9Pv37R/LeAY43qDopxYRZol+66Z+J80Qc2kyRk4zS8mMR4mn913JeNmHvx7qH8fkNf/jx4wnxb0o/xDKL5jyDab8gqnAElRwSSoknHj5Wwq5UEFh/PBRXP/BWlI2lzPIG7BkOeHTTz/NGrPAwMBTp079252zt+4id1P+foV61QKGAYahHf1F3n7M/g/tu6fkdTs1i2b7FmTuZcu8ma39bs+kH15srdVOucgAAPC3lC/Hst0H8LNWK+cOijO+1m5JoD1Sl32p7NwjL5zKduslzF6mM5mPlvQt3wg9+rD9R4vrr0D6UbFedWnTX08/A62unc/26CfvvAoAoNyWv5rE9erLDZgs70kGA0Dj9O/Hc337c/2myVct9gdlXBKnDeNHzNCu59hZ+CgPMEvJ4Pbv08uU77r5OuvwdYlcWDJ0YJ+4Xr169erVK65vv/4D+vXuZb/Vu//wLw4lZW8u5d8Jn88XJkwWpnxKv1fWUqgY8fSjgktSQWFUcEnKP4TyDyE+gcQ7gBR25br2lJYuV7Zuf8VndC4sWQ5xiFlwcPCQIUP+8eU141r4+o4ZXOMh2oPXsK9KXzaYqz1Qz3DOssdYMjPKwyVTrixo3zKqSdPo6Ojo6OhmjWuU8PIuWal+dHR0sxat2sa2GTDnpwcAXMKSKJ93hizetGnTpk2bfhgQU+fD9tM32W9Nq1Gh9oStKdkdNiiKwXLKzt1MVDM2pi1x9yVFXEkxd8o/1L7/0C+YePhSvkH0u/9HhZWWflilnjylHvnDoOjnbzzPw5LlHIdjZvny5Stfvvz9+45LMJmvZEqGPKYLN3KN/hp2VulGyjU9+dGrb+jlYMnMKO+WTKH3DizbfMnhWw8e3P0rMfHS6dMnTl1LSUlOTEy8fvHY7u07zt7MUAAsV77tUrPdkcf/ENy3ZFLcqswrKdwY0z12YjZLpj9IZVq3o8uUpUuVIcU9ibuvbc8hFRpB3H2Iiwd5uzhdtqK1bgMurq/xKF1/Mw7+ZYEly1F/j1mlSpVSU1Oz3sd0JdMTb3Ljl6vMm3DxGCyZGeXdksnUwYmNeq3ad+z08WQd4NHhxV2bTrsOAAA31o2uWbPnUSsAAElc3Sbsg+6T4uPj4+PjZ3zStHaFlkPj7bcG16jcZNav2bt0BT96HClQhPINogJCqdAIKiSc8g8lRd0shVzY9p35YSO5uL7qH88/kdq8sGQ5bcaMGQ4xq1KlSkpKSuYdTFeyN+O6wzZYMjPKwyWjD01tMejLBSPrN+5wwAJqypqudRqsTgQA7eeRtWoMXmubBUEl/dgqpHSbwZMnT548efLI1vUqfxDZY7L9VvdK5aPm/Ja9knHDRpK3XewNCwknHr50pWrSDyvFJd8ZrONRujeSQ8nu3Xud1/5ANqtWrXKYN/3RRx/dvm3fnWC+kr1BsGRmlIdLRvaPaTj8yIVDA5q1mLTzHqg3Z/SIHrzmJsCfo+tXnrzHfh5j+pWl3Wp1/OPx3sW930zstTLl8Tb+Gt0tdlI29y5qf92w1q5HvAOo4JLEL1hcvEQ9fTZbWzA7h5IlJCTw6LUSBAEAMjIyWrdunTVm5cuXt71HsGROhCUzo7xbMiFxc6+6k69oqat6teszZ78O8tqhnZtP2Jt2dVHNmgNPPD6lNv3y6m4VWn296+DBgwcPHtwyOa51/YGLD9pvLWzRsPmMXXeyO2ymdTvi7kOFhFPBJa016lgrVuVHjNauXTfpWfXZlfWdnD9/fn9//yCUA8LCwjLfHZlsf29iyZwIS2ZGebdk/PnVrRvPvAZw/fseDfrPzgA4saBn89hpC8a3bTFlfeaR5dTf55ULLBfdoX379u3bt4+p/mHp0AoN29tvNSj1TsN5v2d755i1XiRx87bvYPQLJj6BlF8w5RdMhb8r/7RG/mW9npr2/K2YVtZ3MspN9erVs1gsgCVzKiyZGeXdkj3YNan60BU8gHh0ZqVqbXc/VLibR/esmdW6aqv4A09O9Pp1SpPKn6x4HDZp64JRn3xz2X5LvzKsU+uJW1KyO2x5zS9UWGkqsITtUJl94nNQGBVYgrh6Wd4qwraKFWbOFiZOVnbuyu7G8z4smVNERkbStH0WR9bzG7FkuQxLZkZ5tmTS1knNBy4/ylLpGbcu/bbx19N/3SeMeO/XiWXrddh6NS09Pd1i5YRbv3Ws/v64jZn7Dx/+OK1vq7nHDFUglvT0q1s7desUfzj9Wc/zj3SDfq8s5RdMhYRTJUrR7/0f8fInXv5UUJj9dHxPf1LU3VKgKP3u/7HtO3M9eumpaeZakuoZHEpWuHDhIiiHNW3aVBAEXdc7derUqFGj8PBwLJmzYMnMKI+WjDnzfatPJvx2/tQ3/Ro3atK8ddvWzZpENWrUqF6NSuWqVo2MjGrUqFHsxGX7Ny/s8/nPWZYCsOxaOnPs/5L462u7t27UqEHdFsPnX2GyfYKwwbBM42aUXzAVEEqXrSgt+55pEMXUi6QCS5CibqS4J/ENsk+R9g8hrl7E3YeuUIV+t6y44EstKVm7dt1Id/LCWq/C4Z188uTJeygnpaam0jR948aN5s2b//2zGpYsl2HJzCiPlixx+7Jlm46yYKiylJWs6qDrsu2Liqrr/1IpXZMlSZJf/uJL2qXLlF8wFRRGPP2YmLa2L4rxX3Hd47j+g6yVqlneKkyKe9knTQeHU75BxCeQCgilgksSD1+meWtl2w5l168v+/zO5HDuYlram3xQMI8YM2bMv+11xJLlMiyZGeXRkjmddvmKvWTuPkx0S4fvqqdOi/MWCJOnETdv4u5jX0Q4IJQKLEEFhVFBYZRvECnmQdx9+fGThMnT1DNmOo8fZ0bnsuHDh/9bxrBkuQ9LZkZYsn+mnb9AefjaP2A1aQ7qPy8npx48pB48zDSPoQJCqYj3qMASxNOP+ATaTxUJLklcPC1vFbF+VJ3t0o1tFSvO/wJkGeQ8vagPlizXfPvttw0bNszarYIFC7Zu3TouLg5L5ixYMjPCkv0z7XqCtWwF+95CL3/hs1nPuLNBUfqdO/q9++KCL6wVq1qr1SLFPYmLZ+aKw8Q3iLh6ExcPKijMWrmGtXod9dgJLSHR4PPi5VqxZLljyZIlhQoVypqx0NDQs2fPchw3c+ZMLJmzYMnMCEv2r+Q1a0kxDyoknBRx44cMf9GHGYb+IJXr05+L60uXKmMpUJQUdSdeAfbZaUFhxCeQ+ARSwSWJuy/Xf5Cy+zd563bt4qWc/FGyB0uW006cOBEfH++wFzEiIuLiRft1k8ePH48lcxYsmRlhyf6VvGYtKeJGhYSTYh786HEvsQVl16/ivHhx4WI2pi0pWIx4+NmPpdlmpwWFEe9A4uptKeRirVBFnDNPnLvAEKXX/oNkF5YsR+3du9fLyytrw1xcXGbOnHnhwoXM++DMaCfCkpkRluxfyWt/IcW97CUbPgr0l7+EoP4gVdn9m7x2HRX+LlWiFOUfQrz87fPVQsLtFzwr4kqKurOt27Gt28lr14GqguL8Kw1iyV4jTdN+//13Hx+frBkrXLjwjh07HO6ZtWRz5sxxymj/y8LCwjJL5nDBHZQ3Ycn+lcFy/KChpLgnFRRG+YfI6ze++jb1O3f123f4oSOtFarQ5SqRYu6kuCdx87YnLSScuPuSou5UxLvWGnXp8h9xffrrKSl6lut95AIsWU64efNmxYoV3d3dM99v+fPnL1269JYtW/5+56wlGz58eDLKRdeuXQsKCrK9+AUKFDh48KCzR4SeJT09HQBiY2OxZP9KmPIpKepGhUaQt12k5T+8zk1rmnrhItu5G9erL9vxE+LiQQq7Ur7B9sNpAaHEO5B4B1B+9q9IP6xUtm3XU3IjKliy1y4pKemDDz7I97QvvvhC/5cP+llLlj9//rdQ7sr6a3L2WNBzVK5cOSkpqWvXrliyfyWMm0iKulEh4aSom7z2Oa/OyzMM8evF4oIvrdXrWAoVI55+VGAJ+5/gkrb/IB6+loJFmcimYvyXwqzP5Y2bc2owWLLXiqbpadOmffjhhw4Zi4+Pf8ajspYMIfRs06dPHzJkSOZNLJkjYeIU4uJhWxHfWqeBlpiUo0+nXUtQduwSv1pIbB/FQiPsn8xsaxmHRhCfQFLU3VKwKFWiNNcjjuvaU79xE7R/nuv20rBkr4sgCI0bN3Z41/Xp02fXrucsPI0lQ+jFzZ8/f9CgQZk3sWSOjAwLExVNPP2okHBLUXf16LHceV79xk095ZZ6/jxTL9JavTYVGkGKuhNPP/u+x9AIKiDUNmXNWqmatfxHwrQZesot/TVd3BlL9uo0Tbtx40azZs0c3nJ9+/aVZfm5D89aMk9PzwiUi8LDwwsWLGh78fPnz1+iRAlnjwg9S4cOHSiK6tSpE5bsWdi2HYibNxVckngHqCdP5fbT6zpomvTdMja2IxPd0lLIhRR1Iy4e9vUeQ8KJbxDx8rfN4KY/KK9s26Hs3af89vurPCeW7NUNGTKkQIECWRtWpUqVIUOGvODDs5bs008/1VAuEgQh61n4ycnJzh4RehbbWwbP+HgOJiqauHrZSqZdvuLEkRgZFmHW5+K8eOHTzyifQOLiQXyD7Ms82g6nBYQSdx/i5m0p5s6PHifOnqsePvIST4QlexWrV6/u3bu3w0exevXqZWRk4/IIWUs2c+bMnBst+jtd17OW7Pbt284eEXo+PAv/OZQDh6jS71MBoZRfMNelm8Ewzh4RAICyd5+yczfboQvx9LdVNnPpEPtnNVcvy1tF6A8rcj378EOGGwwDhvGCU+KwZC9tyZIl+fPnd8hYw4YNs3s9AZwZ7UQ4M9qMsGTPoxt0hSqUXzDlH0KFhhvp2b9uZ44xaKuWlKz8toeuVNVarba1Sg3i4UuKe1KPTxih/IKJiwdx97HWqGutXd9arZayd59+65bBss/YLJbsJdy5c2fx4sWZx1dswsLCzpw5Q1FUdreGJXMiLJkZYcmew2BYutxHtpLRH5QD5fmH651AUUBRDIri+g3kOn5C/195S4EixNXryZL83oHEO4B4+VOhEZRvENe5m7L/gHrkj3/cGJYsu/bv3+/h4eHwUSwiIuLy5csvt0EsmRNhycwIS/YchpWhSpWxX4EsNEJascrZI3o+Zd8BYco0fuiIJ2uIBIQ+OZwWWILyDSLFvSjfIGHOPHHREvGLrwxCMh8uaxqW7MXt27fP09Mza8NcXV0nTJiQuRzwS8CSORGWzIywZM+jqtL3Kyi/YCq4pG03nbMHlA3K9p3Kzl3yxs10mQ8p/xDKP4T4BD5Z7zG4JHHxIEXdLIWKsS3bcF2629YxkWXZPzTU9lsrUKjQbSzZv0hISIiNjc38P9zGxcXludPFngtL5kRYMjPCkj2fnpRkP33Rw9dap76zh/My9JRbWlKSMHkaXeZDulwl4upFXL2Jmw8VXNI+BdvDlxRxo0qU4uo1yqjboHIxl+ACBUMKFHirUKG/LNk46e6/IzEx8Z133snasLfeeis+Pj45OfnVN44lcyIsmRlhyZ5Pv3HTWq2WJV8hS6Fi/Mgxzh7OKzFEUUtKZtt3Zjt+wrbvTDz9LIWLE+8AKjSCCg2nAktQXv7Ey/9hUNjD4JIkMGy0p0/Cz2u01/G38xumatWq+Z727AWosgVL5kRYMjPCkr0QLTGRnzBJjP/yVa7tkgdJC78Rps9kIptY3ipC3Hzss9OCwtiQcDY0gg2NkEMj6KLu1pp1pcVLpG+XgmE4e8h5RUREROY7p3Pnzt99991r3DiWzImwZGaEJUOg3bgpr9sgLV1um15NBYUJoRFiaAQbYlscK9x++TQXD65rD27gEK5Hb+dOEs8LNmzYULhw4Xz58vXt29d43YHHkjkRlsyMsGToCS0hUUtI0K5cTa5Q+Zp3QHpISQgtRXv5k8wJ127exMWTFHG1VqxqrV6bHzVWT0vT0/6jv9br169fvXpVyYELomLJnAhLZkZYMuRIAXi3ZMmi+fL3KO66PzjsUWQTq6s3KeKWebE0KjSC+AYRDz/KP4SOeI9+5315wyb1j2PKgYMgSs4e/psAS+ZEWDIzwpIhR7IsBz0+Cz9fsWI3/rymzZ0vfPoZXf4jS8GipLgn8Q6ggkvaJ6gFhFL+ocTLn3j6kSKu/KBh4sLFyp69zv4hzA1L5kRYMjPCkiFHDu/kW3fv2r6unj0nr10nb97KxfUjxb2ogFDiG2RfxTgk3LbkI3H3tRQoSpV+nx88jB88TMff+EvBkjkRlsyMsGTI0XNXqzJYVrt0WT182FqlhrX8R1RQGCnuSdx8KN8g+3qP/qHExYO4eFhr1bNWryN+uVB/+EhPTcsj6y/nfVgyJ8KSmRGWDDl68XUXDUEweF78fD7TtAXbriNdsaqlQFFS3PPJkvzeAcTdlwoKo9/9gAoJZ1u2Vo+fUI8dz80fx4ywZE6EJTMjLBly9NIrCKsnT/GjxvIjxxB3H1LUjfgG2Q+nBZag/ENtV8Yhnn7Ew1eYMUtatEQ7dz5HfxDzwpI5EZbMjLBkyNGrr4Uvb94ir9vANoshrl5UQCjlH0L5BtnWrrT9Ia5elvyFrVVq8CNGc/0HS18vyokfxLywZE6EJTMjLBly9Lqu6mI8fKRdvKRd/VOct4COeI8uW5F4+BE3b8o/xL7Yo28QcfEghV2pgFAmKpppEKWePKU/fGTIefLSObkIS+ZEWDIzwpIhRzlxfTLDyuj37rOdPmFbtqHfed9SsBgp5k48/e3rPQaF2fY60qXKUMEluf6D1NNn1OMntITEV39qM8KSORGWzIywZMhRTl9pU966jR8+Spg0lWneyvJWYVLckwosYd/xaN8VGUy8A0hxT7pCZWnVj9L3KwxBeL1jyOOwZE6EJTMjLBlylGvXjNbvP5BW/SitWEWFlaa8Aii/YPufgFD72Y/+IaSou+VtF7ZzV67fQHndhhwaSV6DJXMiLJkZYcmQo1wrWSbtz2vahUv80BFUyXfoDytR4e8SVy/i4WvvWWgEcfexvO1CRbzHRLdkGkRx/QcbhBgWS04PzFmwZE6EJTMjLBlylPsls1NVg6INK6Ns287Uj2KiWxJ3H1LElfg8nnAdEEo8fIm7D+UbRL9fjop4T/5pjXrilH7vfi6NMLdgyZwIS2ZGWDLkyGklc2AYwsw5wpjx1hp1LG8VJsU8iIeffVms4JKUXwjlH0J8g0gxDyYqWvrxZ+mHlcrOXc4Z6uuGJXMiLJkZYcmQo7xSsse0y1ekH1bKa9byw0aSYu72qWl+wfYljEPCiW/rpmqUAAAZuElEQVQQKeZuKeRChYTzY8bzQ0foN1OcO+ZXhCVzIiyZGWHJkKO8VrJMhiSpp06rx09aa9a1LX9FXL2Jl79tZSwqNIIKLEGKuVsKF7fW/Jip30iYPtOgrQZFGRzn7LFnD5bMibBkZoQlQ47ybMkyGQxjEEpc/C3zcSRTP4oUcyfF3ImLBxUUZp9z7R1A3LypwBJ02YrUOx8wkY21c+fV02dA15w99heCJXMiLJkZYcmQo7xfsqwMC+FHj+NHj+NHjqF8gy1vFyfeAfbDaUFhT87s9wkixT35CZOlFavU4yecPernwJI5EZbMjLBkyJG5SpaVvHmrtGIV26ELKeJGfAIpvxDbiSFP1nt097UUKEKXrSBMmMyPHifOj3f2kP8ZlsyJsGRmhCVDjsxbMhsjw6IeO6Fs30l/UI4uU5Z+vxzxDiTuvpRf8OPLp4WQYu6Wwq7EO4Bt2YZp1FTZf8CgaUOSnD12OyyZE2HJzAhLhhyZvWSZDEIMQoz0dK57HNOwCf1BeUshF+LqZT9DJCScCgoj7r7E1YsuVYaKKMN26aZdvKRduuzsgWPJnAlLZkZYMuTojSmZA2XvPq7vQK53f+LiSYq4kWLuT5bFCgh9fDgtkPILFr9eJK/bIK3+yVnLiGDJnAhLZkZYMuToTS1ZJmnVj9IPK6UVq+j3yhI3b8o3iPIPsVctqCQVFEZcvYmLh6VAEbZdR370OGnVT7k8QiyZE2HJzAhLhhy98SXLpF39Uz1xUpg8lQoKo9/5gHj6Ew8/4ulHBYXZ13v08LVNuGZbxbIxbbQ/rxksZzBMTg8MS+ZEWDIzwpIhR/+dktnpuv7woZaQyDSLYSKbMI2bUb5BpIgb8Q6wnyESWIK4+xA3H/r9cnT5ynSpMtKSpdqly/qduzk0IiyZE2HJzAhLhhz950r2N+KceVz/QUy9Rpb8hYmLp31ZrOCSlF8w5Rtk2xtJ3H2sNT+WN2yS120A7TVPuMaSORGWzIywZMgRlsxGT/5LWrRE/OJryj+EuPsSL3/7tdMyrwvqH0KKeZAibly/gcLU6fyocdrlK6/lqbFkToQlMyMsGXKEJXOgnjqtHjuuHj/JNGxMlShlO35GvPzt5z3aln8s5m4pWNRarRbTvBU/doLBCwbPv/QzYsmcCEtmRlgy5AhL9m8MmtbT0qSf1lir1WLqRRI3b/t6jwEl7Os9+gQSVy/KL9hasSpdtoK8bYd2PUG7fCW7c66xZE6EJTMjLBlyhCV7IYLAjx3PDxzCDxlOlShlKVjMfvk024Rr3yDiG2TbFUlcvfihI+R1G9TDR15w21gyJ8KSmRGWDDnCkmWXvH2HuOgbrldf8nZx4ulvn51mO6IWFEYFlyRe/pa3XaiI94TpM4XJ0/S057wRsGROhCUzIywZcoQlezkGwyr7Dyp79tLlK9NhpenSZSi/YOLp92S9x4BQUtTN8rYLE9mE7diFjY5Rtm4zRBFU1WFTWDInwpKZEZYMOcKSvSL90SP9wQM9NZXvP9haow5drhIp7EqKe1HBJe2H0zz9iZs3cfGgS5WhP6zItorVEhK1P69lbmHi9OlYMmfBkpkRlgw5wpK9XurJU1y3Xlyf/sTTn7xdnHgHUqERmes9Ep9AyjeICixBvALEufOVbTtg+87BbWOxZM6CJTMjLBlyhCXLIdKqH6WFi5nolqSQC/HwJd4B9sNptouCBoURD19S3Etw9d7p5jXbw2uQq3u+fPkmfv65swf+34IlMyMsGXKEJctR+t17yu971UNHhM/nU/4hVMR7xCeQePlT/qFUaAQVEk5CSsqhERBWWgiN2OTjf6H8R+qZM4YogmE4e+z/CVgyM8KSIUdYslyj372rpdxiW8daa31MlX6fFHYlxT2Jpx8VGkFCwq0h4UaJUoJ3AP1BOfqD8lyfAYaFOHvIbz4smRlhyZAjLJlTyJu3cJ27cX0HMo2byW4+UKI0Y78iaATlF0J8AkmBomL8V84e5psPS2ZGWDLkCEvmXPq9+1sio0a5emSEhEOJUnxwSRIQSgWWsOQrLMye5+zRvfmwZGaEJUOOsGRON3TG9Hz58tUoXKRxkWLLfQKUiDKUXzDbrJWegr+LHIclMyMsGXKEJXO6rDOjJ4waBXfv6bduG9Ycv8InAiyZOeVqyR49evSy40S5R1EULJlzPbXGx+zZzh7OfwuWzIxyr2Rubm6iKL7sOFGuKlmyJJbMiXC1KifCkplR7pWsYMGCUVFRzVGeFx0dXbRoUSyZE2HJnAhLZka5VzJkRlgyp8CSORGWzIywZOhZsGROgSVzIiyZGeVsySiKKliwYG7/7Yteqzz3TiYJ6s+/avzjm6pV+227eik9p57OEPRjvykJdE5t/59gyZwIS2ZGOVsyRVF27dq1BZnWtm3beJ5//m/6nxFl8Wfi1isAAFe38b17CrN2Zvkur6+bLy/YYmgASpqyeCz7SW+ud3+ue3d2xDzlqsV+r/Sr8meD2Q5d+bGztHsAoOsbp7Dd5msWEVQdAIw7+4UObaVD9w2eN0QFsq5NyNyUp/cVlx0G/cnXjBM/c3G9ubh+XM84rv9I9VQGAMClrcKQ3mz7TsKizYYEIIuGLBuKZPC8YflLntCdW3nJ4HlDkECVDV4EzTAOr+D7xHG9+nG9+3O9+3Fx/bi4flzvflyf/lzv/lzvOLbbTC3ZAi8la8nmzJnzchtBLy0sLCyzZA8ePHD2cNDzdezYMQdLhv7b7gkdP2Zm7gUA2D+X9ilCh9ZXzloff5fWJkTzzT/TFQApQWpWge69UD1/QTt3Tt2yXIitwS85ZCgAslX/da71/2rz6y8ZYro6Yyhbtba1RUeuQytr7BTttgDH4/kajZjOPdjOXdnGLbhR32uPu6UfX8545aMqjdEsTy5lqf0wlK4VJ528oJ07r/1vOl+/i7jnFlgfKLO6UlU+ka/dBx2MH8dxUZFsi0+4Hj3Zjh2YmlWtDWPZzj24Ht3YBtFsz2nqZQLpieLoHuzYX/QbN7VNC8TGk7RtX7Gd+opbT2nnL2j7lzMxA5VTLzntJGvJRowYcRPlosTExKCgINuLX6BAgcOHDzt7ROj5oqOjsWQohzwQ45qxCw4CABz4mq0ZyTaoysTM0Tjb5yarNqO90HG+rgBISVLbj5n5h548NGkrG1lDWJUAAJCyjY3qLF7VAW4r3Yapmy+ByBt39nP9JihbD6mzR6p/8gbLGAyjr53Bt5puvwKzliGPb8k2bc3VbCftu5e5YW3VWGu7WY/LRikDmtCDfjQA9E1TrW1nqBoAAEiUtmqOFDNOu2ExSIo8fSD/82VDptWVU4Xmk437PKgGgKIun8D2na/s2CnPnyB+sgLUy+KgGdqfLABAyk5x4lT1pvJyL1zWkr311lsFUe7Knz9/5uvv7LGgF5L1V4YlQ69XlpLtXcBGdZX2beerV+O/sBWLeapksR8zs/dk2TWoqzM6W2Om6TJA8kY2soN4XgC4o/Qer+1LAQDgLwhjZvD92/PLTmc+xti9WOq+SLd9Jru3X2rYRD59R5/Whu/xXeZ9tNVjrbEz7LUDQRndkR2+1gDQ1060tpqiCo/vJ91Xh8fKX+8ARVS+GMn/aoGENVKvAdKvx8H+qZJXvx1hje4tTP2U79lZiP0GIE2JG63s+AsAjM3x0viFeubWsilryRBC2YIlQ69X1pLNZ2p3lO+q+s4pXIUG0jkWQNY+e0bJAHZ+Zm00QLYC3MhasrHatsuGKBqpf/BDp4qrN+hHt6kXbNc6MfTt3yr9Vtn+W9v4Gd8pHgDg6g9C/dZqkn2fo7Z6rLX1FJUWDUHQ9y5kG7VWfrsPAPr/HpdMV0EUDVmD9AT99FkjPVWZN4zffNP487Ce8AAADFkAWQWwKt9M5RefAQC4vFHu9DWAqn8zQvpmH2hWedZ4YdmFl76e2OjRo539twFCZrVmzZpnv7+wZChbni5ZrVgp2QAjQ+nXmO7xvQGaNqvjM0pm/DbX2niYymYtWao6qDNbsxnbqSvbpjFdd4B6S4XEn8QuE9U7KoCuLpvMx30PAKCmiB0aMKPXaAnXtasn5Y51uW/O2Darr59If1Cdad+Fje3Ith8inb5rOx/EXjIN4NJGIa4z264L260P13cw16oRXSqCrt6E7TWI6xnHdurKtmkrLtoNiqp+P5Su0oTt2IWp35BvHQ8AkPATNzDeOLFXGTVASVThZc2dO7cEQuilbN++/dnvLywZypY0sU8zZt5+AFvJ2kkJIgBAyl6+YU1x3Wn9qx5Ch38tmbZ4ANNuPgBAUpbPZH1GqxvOGjRt3NrPD5ignLYAyPqisXz/hTqvaSsmcUPWAAAkrhfqNGI79+J69uZ69WGb1GWaT7aduK/9ONYaM1F5SBsUbfBPjmPZSyYCqKJhtX1XhntX5Glx1g/LsK1GqNfuGhJv0LRBUQYvATDKkkncrN8NRTfOrZM/WQoAAKnKhO58yx7C2P9lOV8y2zRNkxFCL0XXn/Pmw5KhbLkttW/ELzwJ8HTJAGDzZK5WjNStqdjtyyclm7P3Scksp/imDbg1VwAAkjeyjTqKFyX7cbLf/wIAYM/yQycpJx4CAKSfEdvEShsvqZsX8LP2AoC6eCAzZPWTgaQdlBo2lvdbwH6c7DP7mR1Z6GsnWVtPVaUsX8q4qMRPEtfskRd/Kny1SV059+lZZYqyfJaw6rhxbJvYtzNXNUaYt1pLA9g2kAotLx60Oj4BQihvwJKhF6PrIElwYhn/cQ89yQoA8NscpnKMdD1zCek0Oa4OKVSc7/W1oQBIiVJMdeu07YYsgyTppzfz0ZHcrE26AGDocPVnpnaMeNIKxh2l93ht/y0AAOECP2yyvWQAxrU/tcS76to53Od/AH2ea/oR9+2FJ+PRHsmDmzHjNhsG6CtHWFtMeapYAKBr+spRdJMxKmNPnHFug9C+l7D+LGiMMn84/9t9I2GPMHyYuPGcbcqasWUGW78KXbuHsnilPGsEXy9O+t8u+Zv5Qot20uzh0tCFemrOvb4IoZeHJUMvxLhyRYiJYaMGKn/csH/p8Ldsq37yX1KW+2xiq0Zwo1cZKoB8Wx7Rkq7bku3UlY2NZToNEteeMmyHmR5dkkbH0uWqsX2na/fuqoNGKst+0xKTtDMbuF7jHCZsqV8PYr+/DmeW8ZGdtBtZTxyU9Z8mMDFT1DRZ3zGH6fOFKj894nPr+dhIunx1fv56I/2+9t1ILq6fvPeWAQBqmjJnKL/xBgAYty7IU3pyw2epV9OMlGvaxQvq2WsGD/DXNiVmtLp0Clu/j7zvFmiM+vUYts0k5dIjeJWdjAihHIAlQy9GUYyMDIPOchEfXQVJBoeT+WQRFFuvDFAkg6ENCzEsFoPJ+kDFYBiD4wyGAS1F6d6KrdGC6x7HtW9MVe6mXKBAzlB/3yZv2SavXcJGthB/vQGqDOLfJnLpqsGLoBugqyD/7VwMRTAY1uAYgxXgt8XCjGW65fEYhPvK1F7cmsTHY7Zqv8TzY1ZoWUN564D8SQcmbopyMXP3o6r+OIf/YovhkEyEkLNhyZBzZWjrdxs3aAAAPVXZvkd7IAJ/U5o7kR87gR81SVqy//U/p8poB7YqlzNe/5YRQs6AJUMIIWRuWDKEEELmhiVDCCFkblgyhBBC5oYlQwghZG5YMoQQQuaGJUMIIWRuWDKEEELmhiVDCCFkblgyhBBC5oYlQwghZG5YMoQQQuaGJUMIIWRuWDKEEELmhiVDCCFkblgyhBBC5oYlQwghZG5YMoQQQuaGJUMIIWRuWDKEEELmhiVDCCFkblgyhBBC5oYlQwghZG5YMvQCxEfq7t1aQoazx5FN4kN1924t0WzDRghlE5YMvYCHh9j3y/Dxx509jmxKO8CWKcN/ceJVt8MnKz/s1KTXMSSEUA7AkqEXoHJ6UqKezjt7HNmkcnriKw5bA5roV7dLzaZqDx4ZnPzaxoYQen2wZOgF6JKRmmow9r/HjbtX1CNH1aOntDQRAIB5qF9LBkmzf9dyT0u6AwAAgn75hHroiHr2um77QJOarCWnGPb7cfqff2qp3JNnESk98RbovH7hjHr4qJr86Mm3FEo7d0w9fES9eMOwPY8mGn/dMGjKSL6kHvxDu5kGAMbDRPXwIeV8sqHa7iMZqakGKwOAcS9FT7cCfUc9eFg5fUVnjCcbZ++rx4+qR4/rDyj9dsrT5UtTv5zCdx8oNIkR+vQX15/P8jCEUF6BJUMvIP04V7uW8N1ZAICU48rcSVyfgVz3Vmznafp9Ga6t4So1lE88BAAATpnQim0bb0hW/dhacfQIrlc/Nqa5MHOHIYFxOJ4pV03acQ8A4MDnXO320pF7T57l8nq+/Lv8iNnypMl8jzZ0g1j59xQAAPGBvnu5MHwo16s32zxGXPIH6ABMstz0fbb9KGXuZ3zH5taajcXlq6VPx/FxPdjmLcWvDoAGkHGUq1VLWHYBALQxDa21O8nz5wrd4pimdZmhyw0aAAAenhMHxTAtevODhsmj+jIVavALHfZGstrCUUxsV2nNNQMwZAjlRVgy9ALSj3N1agtLzwIA3Dyj3dMBAOCu1KoWP+MIaHfELi2Fr48DAMgXxZhW8prLIFP6n5cNBQAALv/AVWyiHCcAnDI+lm/+qZFxX+1Zj//i6QNvlzcJ5bzorj8YAACqPLE50+xTg9NBuKtfTbDdxfh9Jlu5o3pTBuWO3DyQipqqWgGAknpVznD/P3HnXQAw9s9mK7ZVEwTgT3G1awvLLwKAPr4OFRElHboLAJD0C1O5prT+JoAsf9bB2mWmwQAAwL4p1oAK/MKTT40qaT0/cJ56YJc8erqaqufEq4sQekVYMvQC0k9wH9e1lwzAEGnj0R114VSm9PvskHUAYCzpx3WcrQPAxVV8p6HqHdV+TyrduHtC6taCRDSUdtwEALh/RIqux7WM5YbO0R49/SyXf+E/rCL/8dD+2K1T2cb9tTTbzkTdsKTr1/eJMfXI+22Vizxot+TIcvzcAwAAoOpLe3NtZ2q2/YKJ2/kGUfJRAuJZrm5d4fuLAKCNiGQ7LLB/pBLvyB0+5hefA+WCGFVX+jnZPgDxElf3Y/7rp/v66IZ62wK6DKk3DSt+JkMoL8KSoRdgK9my8wCKtn4W2zyGbTlM3XJCm9SKG7kGACDhZ7Z+V/kBoy4aKgxfqRsAQrI0sae1cTtu4CJj/0YxJkrcdtO2MXVRVypfhLgj2fFZLv/Cf1hDOXjXfnPbNC5msEYD0BekwZ2YqA782FX6nuV8dCv5HA9aihxZUfh8PwAAKPrSfuInn9tPL0zaJTRrKh+nni5ZFNdugX3L7B2le31+6SUQD0lRDZX9zOOvX+Gi6zmWDCGU52HJ0Auwlez7K6CekyIbyJtugaoD6NrQltzQnwEA4J4SFyut2CH27S6tTwYA/dfpQsP+2l0NNICHfwh1GorbUwAA7h2RurVk6taztpuhMU8/y+Vf+A+rKwfu2G9uncrFDNMFRf9xqBAzRScqGADXNvA1WsjnbSWrIMzZBwAAiv5dX6HzbE0AAIDEnUL0P5Usdr59y+xtpWt9/rtLoJwS69UXN6XZv04d42rWwZIhZDpYMvQCMkumnBZr1RZ+TgEAOP8NG1aSGbDedhf953FsjcZC/37KLR0A9B1T2Kq9lFQAAD2+JXGrJ++5C0BJw1rwQ/4HaTf4lvW5L/8AAP3oBvGbrYYG8Ocv/PuVlf237U+6eTLXfIguyPrKgWz9sZoIAJw6tjbxbaNc4UG7KdcrK8zaCwAAir4kTugw016yhB1C4yj5GAXiGa5mTfsZH0MbcK3n2rfM3lI61+EXnwWglSHNrLGTdQYAdHVhd9q7vPDNGQBZ/WWptP50bry2CKFXhiVDLyD9JFevrrD0PICob5zH1W/FduwiTpord23CTdxou4txZzsXVF6YuAZsZ0Uwf8mje7ORHdj+I5Qp4/lmLeV9qbB9ElOvi5zAA4C+aTJdvb106r72bV+65mBdBkjazFf+WDn0eO/ijhlc7EiNBiPjktSnC9ukIzd0nDppGNesk3xRAO2WHF1NmG87TqboywcJ3efZS5a0W2gVI5+kQTzPRUYKKy8DgDa2Odf5S/uW2TtKr8b80jMAAA/PSUOaW2O6cz16CDM+Y2rU4xefAeDFrvWZnt/n0suLEHo1WDL0AtL/4Bs3FrfcAgAA1bh9Q7t2Xc8QQbAa1szZV4px/6FhzTJ3WKb1hOta0k2D18CaYYgaZNzTH1nt39UF/f49nZGBp410GgwAVTAePjIez0sD0WpkUGC7xWfo165pN+6AqAGVYcgGgGakPzQY25ExAzjKsDD2k+RV0cjIMGQdDMV49MjgFAAAOt2wsPYtG5pB0p9Mc9YoLTFBS7hhZJzlY5rwG28CGAaVYVBmmwmO0H8Vlgy9gMtLuWod1MQ3b70mA87v0x+vy6j9MIqPHKg9cOqIEELZhyVDz6NpwrAx3JJ9+hs4mcow9i6Txw7mx03ix/dhogbIu5OcPSSEULZhydDz6Lpy6sYbPJHKOL9b3rBJ3rBNSSLOHgtC6GVgyRBCCJkblgwhhJC5YckQQgiZG5YMIYSQuWHJEEIImRuWDCGEkLlhyRBCCJkblgwhhJC5YckQQgiZG5YMIYSQuWHJEEIImRuWDCGEkLlhyRBCCJkblgwhhJC5YckQQgiZG5YMIYSQuWHJEEIImRuWDCGEkLlhyRBCCJkblgwhhJC5YckQQgiZG5YMIYSQuWHJEEIImRuWDCGEkLlhyRBCCJkblgwhhJC5YckQQgiZG5YMIYSQuf0/bz7GOIHV55kAAAAASUVORK5CYII=" alt="" />

a、在服务器中注册JNDI数据源

1、拷贝数据库的驱动到Tomcat\lib目录下

2、在web应用的META-INF目录下建立一个名称为context.xml的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource"
maxActive="20" maxIdle="5" maxWait="10000"
username="root" password="sorry" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test"/>
</Context>

3、获取JNDI容器中的资源

public class JndiDsUtil {
public static Connection getConnection() throws Exception {
Context initContext = new InitialContext();
DataSource ds = (DataSource) initContext
.lookup("java:/comp/env/jdbc/test");
Connection conn = ds.getConnection();
return conn;
}
}

五、编写自己的JDBC框架(为学习DBUtil框架、Spring JDBCTemplate做准备)

1、数据库元信息的获取(为写框架而准备)

元信息:数据库的一些定义信息。比如用的是什么数据库等,表的定义信息等。

DatabaseMetaData    PreparedStatement    ResultSetMetaData getColumnCount

//数据库元信息的获取
public class Demo {
//数据库本身信息的获取
@Test
public void test1() throws Exception{
Connection conn = DBCPUtil.getConnection();
DatabaseMetaData dmd = conn.getMetaData();
String name = dmd.getDatabaseProductName();//能知道说什么方言
System.out.println(name);
int isolation = dmd.getDefaultTransactionIsolation();
System.out.println(isolation);
}
//参数元数据信息:PreparedStatement时
@Test
public void test2() throws Exception{
Connection conn = DBCPUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement("??????????"); ParameterMetaData pmd = stmt.getParameterMetaData();
int count = pmd.getParameterCount();
System.out.println(count);//统计语句中的占位符个数
}
//结果集元数据信息:
@Test
public void test3()throws Exception{
Connection conn = DBCPUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement("select * from account");
ResultSet rs = stmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();//有几列
System.out.println(count); for(int i=0;i<count;i++){
String fieldName = rsmd.getColumnName(i+1);
int type = rsmd.getColumnType(i+1);
System.out.println(fieldName+":"+type);
}
}
}

2、编写JDBC框架:(策略设计模式)

/**
* 框架的核心类
* @author wzhting
*
*/
public class DBAssist {
private DataSource dataSource;
public DBAssist(DataSource dataSource){
this.dataSource = dataSource;
}
//写:添加、删除、修改
//params参数要和sql中的占位符对应
public void update(String sql,Object...params) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try{
conn = dataSource.getConnection();
stmt = conn.prepareStatement(sql);
//设置参数
//得到sql中的参数
ParameterMetaData pmd = stmt.getParameterMetaData();
int count = pmd.getParameterCount();
if(count>0){
if(params==null){
throw new RuntimeException("必须传入参数的值");
}
if(count!=params.length){
throw new RuntimeException("参数数量不匹配");
}
for(int i=0;i<count;i++){
stmt.setObject(i+1, params[i]);
} } stmt.executeUpdate();
}catch(Exception e){
throw new RuntimeException(e);
}finally{
release(rs, stmt, conn);
}
} //读:查询
public Object query(String sql,ResultSetHandler rsh,Object...params) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try{
conn = dataSource.getConnection();
stmt = conn.prepareStatement(sql);
//设置参数
//得到sql中的参数
ParameterMetaData pmd = stmt.getParameterMetaData();
int count = pmd.getParameterCount();
if(count>0){
if(params==null){
throw new RuntimeException("必须传入参数的值");
}
if(count!=params.length){
throw new RuntimeException("参数数量不匹配");
}
for(int i=0;i<count;i++){
stmt.setObject(i+1, params[i]);
} } rs = stmt.executeQuery();
//有结果集,要封装到对象中。策略设计模式
return rsh.handle(rs);
}catch(Exception e){
throw new RuntimeException(e);
}finally{
release(rs, stmt, conn);
}
} private void release(ResultSet rs,Statement stmt,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
public interface ResultSetHandler {
/**
* 把结果中的数据封装到指定的对象中
* @param rs
* @return 封装了数据的对象
*/
Object handle(ResultSet rs);
}
/**
* 适合只有一条查询结果的情况
* 封装到JavaBean中
* 满足约定:数据库字段名和JavaBean字段名保持一致
* @author wzhting
*
*/
public class BeanHanlder implements ResultSetHandler { private Class clazz;//目标类型
public BeanHanlder(Class clazz){
this.clazz = clazz;
} public Object handle(ResultSet rs) {
try {
if(rs.next()){
//有记录
Object bean = clazz.newInstance();//目标对象
//有多少列,列名和值又是什么?
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();//列数
for(int i=0;i<count;i++){
String fieldName = rsmd.getColumnName(i+1);//得到数据库字段名,也就得到了JavaBan的字段名
Object fieldValue = rs.getObject(fieldName);//字段值
//通过字段反射
Field f = clazz.getDeclaredField(fieldName);
f.setAccessible(true);
f.set(bean, fieldValue);
}
return bean;
}
return null;
} catch (Exception e) {
throw new RuntimeException(e);
}
} }
/**
* 封装到JavaBean中
* 满足约定:数据库字段名和JavaBean字段名保持一致
* @author wzhting
*
*/
public class BeanListHanlder implements ResultSetHandler { private Class clazz;//目标类型
public BeanListHanlder(Class clazz){
this.clazz = clazz;
} public Object handle(ResultSet rs) {
try {
List list = new ArrayList();
while(rs.next()){
//有记录
Object bean = clazz.newInstance();//目标对象
//有多少列,列名和值又是什么?
ResultSetMetaData rsmd = rs.getMetaData();
int count = rsmd.getColumnCount();//列数
for(int i=0;i<count;i++){
String fieldName = rsmd.getColumnName(i+1);//得到数据库字段名,也就得到了JavaBan的字段名
Object fieldValue = rs.getObject(fieldName);//字段值
//通过字段反射
Field f = clazz.getDeclaredField(fieldName);
f.setAccessible(true);
f.set(bean, fieldValue);
}
list.add(bean);
}
return list;
} catch (Exception e) {
throw new RuntimeException(e);
}
} }