javaweb(二十三)——jsp自定义标签开发入门

时间:2023-01-07 04:54:14

一、自定义标签的作用

  自定义标签主要用于移除Jsp页面中的java代码。

二、自定义标签开发和使用

2.1、自定义标签开发步骤

   1、编写一个实现Tag接口的Java类(标签处理器类)

javaweb(二十三)——jsp自定义标签开发入门
 1 package me.gacl.web.tag;
2
3 import java.io.IOException;
4
5 import javax.servlet.http.HttpServletRequest;
6 import javax.servlet.jsp.JspException;
7 import javax.servlet.jsp.JspWriter;
8 import javax.servlet.jsp.PageContext;
9 import javax.servlet.jsp.tagext.Tag;
10
11 public class ViewIPTag implements Tag {
12
13 //接收传递进来的PageContext对象
14 private PageContext pageContext;
15
16 @Override
17 public int doEndTag() throws JspException {
18 System.out.println("调用doEndTag()方法");
19 return 0;
20 }
21
22 @Override
23 public int doStartTag() throws JspException {
24 System.out.println("调用doStartTag()方法");
25 HttpServletRequest request =(HttpServletRequest) pageContext.getRequest();
26 JspWriter out = pageContext.getOut();
27 String ip = request.getRemoteAddr();
28 try {
29 //这里输出的时候会抛出IOException异常
30 out.write(ip);
31 } catch (IOException e) {
32 //捕获IOException异常后继续抛出
33 throw new RuntimeException(e);
34 }
35 return 0;
36 }
37
38 @Override
39 public Tag getParent() {
40 return null;
41 }
42
43 @Override
44 public void release() {
45 System.out.println("调用release()方法");
46 }
47
48 @Override
49 public void setPageContext(PageContext pageContext) {
50 System.out.println("setPageContext(PageContext pageContext)");
51 this.pageContext = pageContext;
52 }
53
54 @Override
55 public void setParent(Tag arg0) {
56
57 }
58
59 }
javaweb(二十三)——jsp自定义标签开发入门

  2、在WEB-INF/目录下新建tld文件,在tld文件中对标签处理器类进行描述

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

  gacl.tld文件的代码如下:

javaweb(二十三)——jsp自定义标签开发入门
 1 <?xml version="1.0" encoding="UTF-8" ?>
2
3 <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
6 version="2.0">
7 <!-- description用来添加对taglib(标签库)的描述 -->
8 <description>孤傲苍狼开发的自定义标签库</description>
9 <!--taglib(标签库)的版本号 -->
10 <tlib-version>1.0</tlib-version>
11 <short-name>GaclTagLibrary</short-name>
12 <!--
13 为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写,如这里的/gacl ,
14 在Jsp页面中引用标签库时,需要通过uri找到标签库
15 在Jsp页面中就要这样引入标签库:<%@taglib uri="/gacl" prefix="gacl"%>
16 -->
17 <uri>/gacl</uri>
18
19 <!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述 -->
20 <!-- 一个tag标记对应一个自定义标签 -->
21 <tag>
22 <description>这个标签的作用是用来输出客户端的IP地址</description>
23 <!--
24 为标签处理器类配一个标签名,在Jsp页面中使用标签时是通过标签名来找到要调用的标签处理器类的
25 通过viewIP就能找到对应的me.gacl.web.tag.ViewIPTag类
26 -->
27 <name>viewIP</name>
28 <!-- 标签对应的处理器类-->
29 <tag-class>me.gacl.web.tag.ViewIPTag</tag-class>
30 <body-content>empty</body-content>
31 </tag>
32
33 </taglib>
javaweb(二十三)——jsp自定义标签开发入门

2.2、在Jsp页面中使用自定义标签

  1、使用"<%@taglib uri="标签库的uri"  prefix="标签的使用前缀"%>"指令引入要使用的标签库。

例如:在jspTag_Test1.jsp中引用gacl标签库

javaweb(二十三)——jsp自定义标签开发入门
 1 <%@ page language="java" pageEncoding="UTF-8"%>
2 <!-- 使用taglib指令引用gacl标签库,标签库的前缀(prefix)可以随便设置,如这里设置成 prefix="xdp" -->
3 <%@taglib uri="/gacl" prefix="xdp"%>
4 <!DOCTYPE HTML>
5 <html>
6 <head>
7 <title>输出客户端的IP</title>
8 </head>
9
10 <body>
11 你的IP地址是(使用java代码获取输出):
12 <%
13 //在jsp页面中使用java代码获取客户端IP地址
14 String ip = request.getRemoteAddr();
15 out.write(ip);
16 %>
17 <hr/>
18 你的IP地址是(使用自定义标签获取输出):
19 <%--使用自定义标签viewIP --%>
20 <xdp:viewIP/>
21 </body>
22 </html>
javaweb(二十三)——jsp自定义标签开发入门

  标签的运行效果如下:

  aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyMAAADpCAIAAAC4Kn/dAAAgAElEQVR4nOydd3gTZ574x7ndu/3d3u3e3u3dluwmu5tNYVuyIbRlE0IqEDB2wJRQEgg1QEIoAWyacQVsg8GGADbVxrg3uchd7l2yLNmyLNmymiVZliXZkos0o98fI41GM6NRsSkhM8/n8SONRu+MZkZ6P/5+v/MOUF9fT6PR7ty5ExMTc/To0Rf/MtsLXvrrG3he/tscmFdenUtB8TSBnNuEZ753XyIKCgoKiqeDvXv3njp16urVq/fv38/Pzwfy8/MTEhLOnz//4l9mz/rr69dvJRtNFi+ZekowPCrG8Ey6xai36PFMUHiAjoKC4vuK9z8duB9er3/D3ewj8J2Lp92TyQxt3bbDPNNTXPyVmW3w6pfbZ7bB6UwbPnzXBELXbyXP+uvrL/5l9sGDBy9cuHD37l3g9u3b58+f/8Wzzyfcua82QIJhqFPpGRwl1KmAOhX2pwhcGNW04HiH0kuIP6YC6lRAbCI6MAxCHYMQyxGmI+1yNGAbggxstdGCRgo222iCkYBNErARR4PYTj3CAFg/ANahqIURgbUisMaRakcYRFQh9DtQ6ZwKZ/QRU/7EIgTLhWCZjVIhWCoAS2zQYXpBei9YTEFB8cihO0NATIlzSjEIrZQRAf8yID8UmB+0Sph+sNLxN5MBY/tpRf/21gxYqbVh/QEXg3Won/cGMdggsYP0BU0SW2dh7TsghBaZA62OtMHIoWEj9PHGHRqDSaqZJGOEAJkThsdM5y9eGZ0AnS3gKZoxU/zuLWpejygvR5SXI8nPkdJypLScQVqOgpajoGWradlqWraGlq2lZWtpmXpa5igtc8w5o7in+oJMbUGmtiB7pCBbU5CtLsgeKshWFGQrCnLkBTnSghxpQY6EliPKz1F1sNa///bIOCQYhtQGKOHO/V88+zwsWwAczUq4nSzVeeNYHCVWsGC16rLRrYK6h6zwPKTbO1R2ujzBqe0pIa6bTuZSxez6BWJgyu20o0A8rBXG0cOaEaT271WTcyGzfiExKia2fnutoG3MEeTLT+5n7tKPhfFkg3FKRArx1kX5FgXF48V92SJXrun4VrnnvuUgW175FvoHH90dNKOUq0VKJluwb7lrWk5ki9C3HoZpxe34TN3VLcpKhxFnpUuz06XZqYPZqYrsVFV2qjonVZ2TOpKTqs1J1eak6j1Em5OqzU3V5qaO5Kaqc1OHclNVOamKnFR5Tqo0J1WSnS7OThdlp4uy0xVtbWvefXtk3OoDUh2UcDsZjmwBe/bsmfXX19UG7zULL1hor+pRW+F7SI93DNnxVOwIUFnpxuGmqGFibJ1KqFMJYmAr7HQgYDwMxpWNOROyFpSQ4SExM6yiOYbNMLrmLgPE1D3xoHUTDvgh4uWgXI6+9di7HAqK7yff3fgWuW8RypanvtXi6Ft42Ro2uG1abge3hsdMkTFxM2tal7ZuUHG4ggfJggfJ/Q+SRQ+SxWnJkrRkaVryYFqyIj1JlZ6kTk9SpyeNZCRpM5K0Gff0ztFm3NM5PtVmJI1kJGkyktQZSUMZSYqMJEVG0mB6sjQ9WZKeLE5NFqUm96cmC1KTFU1NAYv/iZhWpxJSG6BZf3191apVwOzZs6/fSu71JGnozLHg8BUPFh01xFdDvWqodxgS2BC6jWDa9HoCnxD3LdBlQM6uaGC3CuxCwbXBQaO0YxUyBdjpRMgQCMxsEGQOgu0wjkKGReaQu2wlzGNKHSCUNq8hCMg9eSDSaQ0EwuJlUy60b5UKKdmioHj8OJWtx+1bFZ76lnvBrXp3k4mug1uwaalHp0TqcTQDHiJGMaSfDI+6rDVMiR3ni9XjMXF3Vq3ZQUJM/B3x8DiGIf3kpc0BClYH724i/26i4G6i4F5i/71E0b1EcVKiNClRmpSoSEpUJCUOJSWqkxI0SQkjSQnapARtUkLckSCk8bgjQYRztEkJmqQEdVKCOilRlZSoSE4cTE6UJidKkxPFyYmipMS+pERBUqLgXiL/XqK0rm7VWwvQptU7DF2/lTx79mzgxb/MHjE6r09yVpiF0iwkjgU7FuwivYhaaaA+DdSngfpH3KLPazReIiTEufB56m2EsTdiJ3MjrUlYiOasmAxbQ4aCBeOkkgyL3IF2J7SRICMG/4/Uk0+LFGq2iVeDGKwTE/gWOrhFyRYFxWPHU9/yIp9IqFzljso13fgWzrdqvY1voYu3CCu3YNNS6iZ6B8cECtcI3UCpnQg5FzsyNoV/adWaHRbSadWaHX3KMQxK3UTsOr/B1tauG/HdN+J5N+J5N+IFCfGChPj+hHhRQrwkIV6aEC9PiFckxKkS4oYS4tQJl2HQa1y1Zselg0cxc2xLxqkS4hQJcYMJcdKEeGlivDgxXpQY35cYL0iM702I5yXE8xLiuxPiJYwq/wVz0KbFUUIjRujFv8wGXvzLbMOUx5rVL+ep2MFDjOWykvdEzecEg1IeEseCHQu2Kw3UPwKJRqCBEWhA+9AYsSPyBDflz6kFOrM0G+4oGrmQOcuBInLWhUAoZ04qzMirzdhonFwH4OKyANwlAoSwvoPAFzS0ya3KBftWvc23qtHBLUq2KCieJLyIb82wb3lRv4Urlq9B5RPJZavemWxJCIJbeN+CTUs2PNYpGu4UDXNEw5wBF3BdIRkaPRkerdIa8S+5Y1pd4mEMEvVolP+Hkob69pizrJizHRfOsi+c5V4823Uxkncxkn8xQhgb0RcbMRAbIY6NkMVGyGMj5LFhitgwRWxY7FcHMGqFfhz71QFFbNhgbJg8NkIWGyGOjRDHRohiI/piI4SxEb0XI3gXI7suRnIvnO28cJZ94Swr5mx/SbHv7L+hTatTCRmmbKZlnLK4FKxzDOnSRO6sZNk/C2RVvUcMbR+m3ll9PMjv7Kn1NyJXDLTF9KihXrU1jtVnEyzRCDSghcRaSKKFJDpISorEO7R2xDMHRuZEGDz0NnTUzaWQ4eWMMKGJr0vDVKe5vGjAg2sCvLsy1NvLP59YOpVWrYSVC/atZinUJLWmFGHZYqAiW/Y04uPuZigoKGBm0Lc8SimS+9Y084noZKKzfKKDbBH5FjqZqDZAH2/cIR4aZQpVMCw36EDoI2BAqT8RGqUcMeBfQkQHnzdE5rP7VBgGVPrzK94V19a0Roa0Roa0R4awIkPY50I454I554J554L554MF54P7ooJFUcGSqGBpVLA0Klhu4+K+/XjDW7Vmx8V9++EF4OUlUcGiqGBRVLAgKlhwPph/Pph3PphzPrjzfDD7bAjrbEj72ZDWsyGCooLlr/0ZY1rGKYvNtExkplXZM7o6uff1Qsvmdugyr9oiOGzpXnFg/3sHz+xc8vUNOGlYnrrDqlkau2YN1Mb4hDNRjiW/5w8AQMBdvhPNqovx8StoI/WqtowAAAi4wyfQLDu1MT5ANJ3gJdYpH+BkrYOT0cN9TtZiNEt+xw9AZg5omScB4GStQwiNLFQGR/I0UL8GxNCHZxgUohDgyA8FgFBm7zDYq7bDR9GDhhENANG5QyCPBBXIU4HdbtPlHC4JyiebTtqHQMC3nR6/kaME0b5ljW/JoBaZPbiFjmxZa7aosBYFxRPGzMa3HpFvEca3plEsT168pTZA/ht3iJS6Vr4CSy+WNkfandA3qA0KOTc4PIZ/adWaHVqtVqvVrlqzA5nJdJzPFCgw9Cu055YuElVXNYWcaAo50RJyoi3kBDPsREdYEDssiBsWxAsP4ocHCSKC+iKCBiKCxBFB4oggKYoLe75EVgGv5cKeL5FX4eUHIoL6IoL6IoL4EUH88CBeeFBXWBA7LKgjLIgZcqIt5ERLyImmkBO9+bnL/vYK1rRM7pkWrFkbWywlbcEW7ruVaS/t2vLhwejwnWzLkS7LG4cLLxVXXY8/AicN4YwhHMpqTQ9Yni6HNas9IwAAgNN1kEzHOu0DLE+Xy3SQTAfJ6mJ8/AraYd9CP+YXrACiS+x+5nxC3oKiJMKHcL6UX7AcFrW6GJ9wpkQH0SN8TtZBEh3rlI9NznoKlgMxdCRIVhsD+BW0OsiZdc0na6GB2hj0tpysQZQLRIO3rsIwAPCjNdmUqyktAAACbnbZ3IsRDQABiV0gLRQAQpmIePUiqIncixENANF5hCo25BRnTtZtIyfE+umOVtlnOsVzY/MOxv3V6D2/JEXmwds7aR8CAdc43qyXqwS5jrKFRLaQsq2aAWvNFpxDhMNalGlRUDyBPC7fKvO6fssT3/K8cssuW7BptfbI0irYeL74+gx5Afuer89kVrIzqxxo5A7sPHiSN6DKqmJjWLVmh0KhUCgUq9bsIJvPcKCJO3D8hf/pTL6XvnRR1tJF2csW5S1bRFu2qHDZWyXL3ypf/iZj+cK6FQvrfRc2+y5s913I8l3IdiRi1SpkFfBaIlatQi/Q4buw3Xdhq+/CZt+F9b4Lq1csrFq+sHz5myXL3ypa9lb+skW5yxZlL1uUtXRR88WohT//D29M6xxD+tMci2+jhSPYD7IX3In73fK5fww8E/JKouztfGhDG/RJNTT/6+yUZo5jQEt+G6NHfgEr7E8CVvgDABBdpodk9TE+/gVMPSTDPO4tWAFEl+ohmV5+zz/gXi8k07NO+8BzIKul6SAZv2CFP2xUpEIWzpTqWKd97DNORcT4YBeKpltjZqjF6iB6hMNCy9PlcNBrebrc6mFADF0LiUeggZoYAAi4zYMGRkAEB99C0ID91dEAEF1oi3UVhAEAAByvtopXY1oA4EdrJA13ObgXrFyMaACIzsfFvbChLwyuxUt2fSWwJEVGEirLCQGAECYcMMPgfvyMmMpowCcmBze/+v5qYCWtxrs2O2lLgIBrHG/eC8sWHNmC04hkYS3bpYhUApGC4knm0YS4PL1EkdC3GE7yicTFW176FtQMm9aGHS3d0vtlLIQUG+6UVaWWs9Icqevs3/71iS6RMg330qo1OyQSiUQiwUsbMj+9nJVezkqvsNPQ2R/4/E/Zd28/eHdB+rsLMt5bkP3egrz3FtDem1/8wfzSD+ZVfjCn5sM5tUvmNC6Z07pkTvuSOSwUEf7+SPvItGrNjgh/f2QZ5pI5rUvmNC+Z07hkTu2SOVUfzqn4YE7pB/OKP5hPe29+znsLst5fkPH+gvT3FjRGn13ws//njWnNudg+q2SiT3Tc1Dq3KuF/Ni/8cWVDG1cJHY9P/cWViVdToLUt5jdv6HccjsCkDsVa+V1/AM70SXWQTAfJ9ViwdkVsWraXiAzqdB1iXfJ7/uindpgZAUA4U+aqSkyKxN4imBIdJNHJ7/oDpzIKlgMBd/nW/CM9HFieLpcQmpYt7bg8XTagBQe0oAvf4tE+AoATNbB4MY8DAcv8ACCM2acB+zSym34AEMoUOuYWiX0LHdxCmRZhqhHLkAPO415umxZ54tI7qqIBn5gc3PyalNXASlqNd21yaEuAgOtcj9+IMi3QGtayFWy1yKBmlGnBlyLaq7Uo06KgeOJ5clKKHuUTXQ8G4eFIEHBwCzat5m5pSlkHnlVrdmhIp1VrdqSWd6SWd6ShqO8U7TgAm1ZHWnlHOopVa3b0kU6r1uzIKO+wUmGloVMU+Px/se/dTntvYfp7CzM/WJj9wcK8DxfSPvxH8ZJ/lC6ZX7l0Xs2yeXXL5jV9NK/1o3ntH81j2Yj4+GP0SjGPIz7+GF6M+dG81o/mtXw0r3HZvNpl86qWzqtYMq90yfziJf+gffiP3A8XZn+wMPODhRnvLWyKObvgv//dY9Oq5ukXnskrrjthan9vMPPHs9549c+r1i7afOjNbYFzNx366RbBT76xrMoxvxmn+2D917BpIalDcU/Bcv+YU/4Bd/kQ0x4oii7TQ3I9xMoMWJEhl+shuROFQi9cFuEDAMCKiJgVQEASH5LrIDkcwQpnoozKpWnZFuAXrPBHB9hQk19BSUYAEMGEq8ru+lvjYUilF2Jad/3gB5DEblqgWCuDTUs84qBZTnxLdssP+ChNZo1v+dGa4L8asE/DPG6Lb9HCACCMKRwGG1MDgJW0xFDbptpTiswgx52WP4xYl31hxMPg3GLdgwCHxytpdWrZjZW25VfS6hyCYbIbK4GlD2Q9arD2QQCwknYD2YwQZs8Q6o0AcKwK7BkCa1OQIx5wgwv2DIG5IQAQEn3MOod5DACOpdCWOi7TMwTWpqxGvxH1FPAJZaL9rzZlNbCSVouZg16dT0zukOy6L7A0hXbM1sjSB7KeIbCHQ1tiX2n7Mfs6YnLh1qqiAZ/oYyH2t+SG2JfJVoEcpeyqL/DBmZgPAADwiXmASiDC42xhE4iUaVFQfEd4Mn3LZT5xOr6FvzKxWQqqDaD/hu3NXbKUMvYDR1LL2KvW7JCSTqvW7EgrZyOkl7PTK9h1naIdB091DwylV7ARMirYGRXsVWt28EmnVWt2ZFSwMxEq2ZmV7HqO6NgLP+9MSc5YvjjDd3G27+Ic38W0lYuL/BaX+C0u81tc5be41m9xvd/ixo8Xt378dvuqt1mrFsGg17hqzY6IgADMHHgx5qq3W1e93fzx4saPF9f6La72W1zpt7jMb3Gx3+JCv8W0lYtzfBdn+y7O8F3cEhe94Of/6ZlpsRVQQ4849uYhsDvAVPa/c5a8D7z2OXDVCCRMArfNwJ0J4IoauCT/9QPdv1wwvr1qjwB1yaGtSIt5z2ZaKzLkcj0r2Ce6rD7GJ4JpNy009TE+/gUs+HFvwQqbaaFgBdu87HSdLdxlhTR7GMGU6SFmZsCKDLmsPsYnggmnIKU61mkfhwr9dsLsoTXKBdEjgOUZcjjcBZuWuDYGAKLpWlCsBVvTAwAg4A7PhWNZ0YAtaQGAH61ZAzanBQBhzP5u2jIg4GY32FcdDQDRBXBWMdQa3GpMDQAAYFmqDF3FZdUsuGR+WJawErDGtBjRABCQwIXDWsxAAFj6QMZXMwMBIJAB8m1ShTxe+kBm8y3CbKOjaQHA0hSZVUccRIppM54AxIGQx7khaKNiHgMAuHjfKmohTIw82R9XRdsFCOtVyGTfDJ9QJkqkZNd9UeutigYAn2NVaNNqP4boF7yRyEod58OexxsCs88APiFMrlJ21RcAfGLSbXXx5KZVZivVeuy9CAUFhZs8mlEhvPMt9y9OJE8mOr0y0WZarTx5agXnQTk3FabCyt5DoeR1WnsPhWZUcjE0cMW7Dp7uFg1lVHHRZFZxj565TN7g0TOXM6u4mVXcLBSNXPGxl37JyUjNXrsiZ92KvHUraOtWFK1bUbxuedm65ZUbPqrauLR249KGjUtbNi9t3by0ffNSlo2IT9YjjUd8sp5wDmvzUubmpa2bl7ZuXtq4cWn9xqU1G5dWbVha8clHpeuWF69bXrhuBW3dirx1K3LWrWj9Nn7h//3MA9OCB0kSa0pqag+aal66EDof+MNG4OMbwLobwPJMwD8J8E8CfBOAdy4AiyOBN88sXvsVxrTo4fZY1XJ/VEzL0bTKInzsyoU2Lb08yR84XQexMtHqE5DUS+BVp+usc3D6BcGCBZsW7FjMzIAV6fKSCIJQ2qk6a/YQiWmdqrOmEZdnyGHTss6xZw9RoSMg4DZOs4rDkFeji1Ca1a8B+7tpHwHRhRrZLT/gRLU1aXi8GmxKCwDCmH3DYN+wtSIeiWk1WnOIzCAACGKAAjhdiJRq2bKH1isWbdlDxKLyQgEglMnn0pYC0XmMaCCUyVczA4GAG1yQz4UjTAE3uPhaLpRpoSwKFiY4iIUyLYcQF2AzKrSKod+IsjHYilATLFgkpuUY00IFqHxsjcuu+9qFyf4UMS1M48TzUUEveFpJYyhlV32BD+/LOyjToqB4evFOtjwIcc1cfMuD4i3nVyaig1tqA7ju8y+buQNZ1fyMqh6YzKqeTIadLDzVDmQ70tQl33XoTI94OKe6B0OuVzR3yU/86bmuvOz8betp29YXbltfvG192Y71ZTvXV+1cX71rXe2udQ271jXvWde6Zy1rTwBrbwB7bwDHOZ24p6y9Aay9Aa171rbuWdv4xbr6Xetqd62r2rWucuf6sp3rS3esL9q2vnDb+sJdm9rv3Vr0y/9zy7SQsSi5Cr1Kn2homD9a8F//8o+vAd8LwK4HFZ1yDureO/jRSu3ZQy0k0cntMa104piWS9OS6yG5DmI5hpocHMuaJWSd9gm4xyfIHmLK5+9G+Jyqg0qc/G3PCADCmVItBKcIT9XCeUPmKSDgbg8yB6nTAsW10XBMizBdOIAvz3IY9AFWK+ZxWwQLdixaGBDEsBZmIdceNqQGACtpDaiMYSADV5jlaFpIPZY9XsWIBoDoGw8CbI4VnceIRkJZPWqwx+pb0bl400qRYeJVJKZlDXqhcNO0UFZkwzPTgnVtxk3L2iBSqgVnDz9Mdte0qOwhBcV3moebUpzZ+JZXyUS8bA0ZwG1fn2hg8YubB/Lq+xHyYRqs0BwpIKWtR7XnSLhAqits7MdT5DntfNWJV1/kFxeVHNhdemB32cHdZQd3Vx3aVX1oV+2hXfXf7Gw+urP16E7m0e2swO2dQds5Qds5x7d3O6cL95RzfDsnaDsrcDsrcHv70Z2tR3c2H91Z/83O2kO7qg7tqjq0C15p5fHDrRmZK1/+w4gRYitITQs96jd/SDAyfMlS9MetB1YDi8KBQ3TgYveLX93KrRe0iowHblb+MNzyWrHl3xMtz6RY3l59EFcRD0msRfEOMa1SJLCUIZfpodIIn+UZchm+Il7vUHcFuxrGnEojfOymVRfj41fAtL3kpOCdddonYLl/wF2+3a5O1lkHeqBH+JyshdrSA2yFWXbTwo2zhap8r40GgOhiErVydCzMeFq0UGDZSnuwSsiIBlYGLLNmBkEBYlpqsP5BALCSVq+2JwQDGejMIJITjM6zGhUQyIBL3ZmBSL7PmraDLccafFqaIuMNgTUp0dYKcS6+WtxeEV+TEoCqQ7cKE6YiviYlAEBaqIqG3+hYMm9/I7rNmpTV6DcufSDztCI+JwTwCWXyqqJt7ciu+wLI2+3t2yvi248CgE8o017XD7fpuNKcEGsj3SqQcT/gSAXIUcquwKZFVcRTUHxveJp8i/zKxEYJKNVB0QnpIdFXWEJNRccgvV1e3CpDoLfK6G1WSpzRbqe0XVbaLmP3afYHnetXjJW2y8pmAk6/JnjunwQV5VUnj1SdOlJ96nDt6cP1pw83njnccuZwa8hhVuhhdughTvihrohDvMiDvMiDvZFfCzyBF/k1L/JgV8RBTsShztBDrNBDrNDDrSGHW84cbjx9uPb04dqQYw3nQjpTklKvJYZs3ACbFiJbWNPC3F9FOMwe5+8wpcz587abwIp4IIwJfNsHZBmB2yPAZf4epuWfDAtwR/+LTMu/vB3c0KVwMspDwF0+1JYRsDxdLtPZh2lAmxZhsAoTsmp3EtM6VWcfE3V5utyNMehZp3wAAAhY7g84OFaddQjT1nSHFaEHNR0YYZ4EgJM1EJIQPFkDimqikbRgP3HgygEhgn3cLGBZqsyhvH0lrcE2fAOSB6x3qKOympZttFLrdCw02hqOcqhJd7hsMCcEAIDoHLwS2STMujxqmAZkPK1jlWBNSgDgS6u2DnnAPAoARyttYzEAAGB7irwFWRg2rW78G1VgdUoA4GsdryH7jO2N9hEc2o8CAAAAPva320Z5QE0+IczsMwAyHoTtseyaL7AkJHqJbSnrStGjPHTSlgC4lWKHlpBd87WviKsEOUr5FV/gg2Q5+SgPFdQoDxQUTx1kvjVzJVwe+5YbxfLEI285CW6xlWCXSBnw6e6TkZcaO3r6h8aFSqONcTx9hKjs9KvG+1XjR0MujoyZ+m1Pp8+5N19T8QWCIlpfEa2/KF9UnC8qzhcX50uK86Ul+dKSfEVZrqIsV1WWO1SWO1SWq/acobJcVVku3M5gaa60JF9anC8ptq5LVEZvpeUnXY5f8ddZfLFKOGz3KEfTmrLg72TXN9w2VTn36pE36wVjPm+dAI7WADelv620BHEs+9mWV2ssP8y2/KnI8szSiAfFzU4SiPK7/gF3YNMKj1kOAIBfQXud9WJDmyQ5Q37P375Me0YAXqTguJR1mFPrqFokd+yBHQsAgGg6dmh4+R1/q1e1pgcA4UyxFhrQym/7wUPDM08iPbFfQYvzwUiJB4LHjdQgdDYaFum4DM6GvyIfgNT1QKNuDz36kAYgfcjIvvX1cFDTmR65tIwauZSC4mnk4fqW1/EtT4q3XPpWm3SiTzUWl1y465sQvw3bEfw3bPffsMPORjsfu2L1hm0zy5aXf+P3Ryv+L/7G/6XfrnrpuVUvP7/6lecDZv0u4M9/WPPnF9b+5YW1f31x3d9e/ORvL33y6sufvPryJ6++suHVVz5BeM36YL3j03WvvrLu1VfWvvrymr+9HPDXl1b/5cVVf37h4z+/4D/rD36v/N735d+teOm5FS89t332rEtbNkjUhm7FJEalUHfjITItgZoLFr4eH/ghWwFlVbF+8/FJn0MFwF31zwstP863APF9Pnszn90UVdAqhqu18HfjEWmRgi3vb2XoPl7f05D87jr9RHfXIbivjoZs1Ctyo8IPJUo8npMnA4E6FYXv7i10vEH2rS+w5L5sphokvxtPg5NhS6m78VBQPMU8+fEtxLeqPSyWb5CAnUpQpgOHDHbUDkB4hvEYXaB5MhiZHkIN1qNcm1aXSjNR9n5L4pacrOvijgJ1zcnrp/5xOuTLFWGZy848+PrbYnqHAq6Lh299iLnDNN63xI/jdtFYqXJ1o2iXd4nG3x9aqIGEXtwc2qM7Q6uI7wlN3QraFXL4CsFHfIfpKuoO0xQU3zMevW+VO7+fD/lgEN4lEwnHlEcGlMfcnbpFBrWiaIOR22nHwZRDzEECWJ7QgUbhDXgXmiYuTIutgPoG69UP3pLde7/k8tslSZubWK1sBdSpgDptHQ9yESIiW3AasXcYEmjs8S20cpExYofsFnUQh7MAACAASURBVM6e6BGhLVnRQH2E2oSTp14cfBQ9akcctQkjT10weGFSQlzSDh47DAeMG4eZ7KwaJMOj8/t7AvzNb5c7OJb1ekOcZsGDO1ABLQqK7w8zm1KcZnzLzWJ5THCL8B7VrsaUnxnZan8aZcu1aTnDQbaUVl2wyhbGt1DK1TdCisZLCD0JH2EiFCZCc+KrcfKkdhJzwgWZujABJLwwKaBOVxrEQiA656zI7RCer+1yh3Mai4yMVgrntMjg3xQQdqwGm2PBFxuio1mUZlFQfD95BCVcxL7l3sWJ7iQT3QxuNXkR3Hr4ssV6kmTLe9PCyxYXUY0he3wLVi7+MMq6XEEiQy70iChJ55Ctcx5zIszTdasgwvImDozSgU4l2KkA2QqQrQA7EAbtsGwwbbTDyME2QmRgK44WGKmd5hmlicIV8I9Lgy2IVTdgjWOhHasckzSkNIuC4vvKk+Vbroq3nCUTycc4bXoIwa2nKZM4LdNCZKsTHbaxRXTgHFm3zbp4hFEiXLkSb9qgPcnN2iZMrZItPQd2OvoTWqFYeHOSW2m3gThTKwziSTKwGYbQciRgk2MuHOnaGyRgg9iBeo8YIKOOwj3gX5+aAbBGZBcsuPgdcSwklEVpFgUFRbG3Ia6Zyie69i2XyUQ3bpiID261OPpW6+MIbj0JsjVd07LKlsJaNoSUEKGVi2sLdKHdy0kAyQMIKr7dqXBy3HhMxZLt2NgsSg6y5B4oVLMNbCAE70yOnlSHgLoGpBbdqQ+ANSI71Z7S7xQGhYcgP0+VtgiWg2AJ7T+IsGNRmkVBQYHwsEq4PIlvkRRvuRjm1NWY8k2ou1M7+NZ0MolEvvXdkq0ZMC02ZjsclasTFeuaqevd8LXheIUiECkFcWkzUvBkO64EybsWVNrORfwJH3DChENEYK3IqTYxHKmCwfXueCqc0eeUcgqvEVpL3RG7KhU4ChblWBQUFM6ZqfiWO77l/sWJXlTKu1m55SK4JX+0mUSvZGs6vjUDpkW2NUo7eDFCmObqHMNRRCI1SFAzji4MRx1yW3SKKKmHT+Q5RKSIolAOCuUYEbFrUx8B1i+D0E65E/D/xFgROAUbfKbwEPyPHWVXFBQUnvId9i1XwS2XY0B4mkn8TpdtTde0vHRDb8cRILz+zuU1d/gLx+zYzgC7VOGNSuKQnHZTqvA6RRBPIlKlUluMhKRfd+jd8Tj56j72nxUKCgoKCjxPhG8RFW+5HOPUncotNzOJrU9vJtF70/I6/ub1WE0zrlnNKM1CX1aG1iysY4kda6JdBa6QkBVBzs6ZYwldOJangkU5FgUFBcWTz8yXzDu5n4+bxVskVya6rJR3Edx6rLL16DOJXprW4w9lOdGsNqdpQUfNwoeypNMKZTFwoawqUscq98qxnGoWJVgUFBQUTwse+Zbr+BaRb5GPdEoyzKmXwS0pWXDrqc8kemNa6DUx5eam/jFGl6qKq6ziKhldqqb+MabcPE3NapeZG/vGqriqSo6ygqOs5Koa+sbaZGZkh3oaymolDWWR1GC5H8rCFmC5ly7EO5ZnoSzKsSgoKCieRqbvW/hkIolv4ZOJJFcmelG5RTzAqRPZciu49d2RLY9NC26dNQjW9AwXNAnSyplpZe1WyplWytrz6nj09gFG91CzyOCOZjHlIKxWxW0DuXW81LL2tDJmWhkztYz5oKwdJrWMmd8oYHQPt8nAh5QxbJODHBWIHdHU+QAT+Cso3RwC3robbaPAu4jeuRog3p3B4ikoKCgonjSaJGBVv4NgVfWDTRKwXQ45XLWHR+YuDh2iHGrF3S+EcMOYttCRg5dgPMPxijfMKAHweOZcx94Tf0tfntoOZqxNwkHI0fSqCcYzd2eAdAQhGpJb87kCbq1nCOIS3SLPA9NCdm69QJdXx8tidGYxOrOrOVfS6o7FFnx+ir7xePG2U/RjsbQrabU5tV3ZNdzsak4WozObwaE19JYyJWUdcka3mtGtru0ZYXSrGV1DJUxJcasor64ns6ozs6ozi8HJruZm13Rl13TdLWy6klEem1xw4V5+bHJBfFrpbVp9RmVnemVndi2vhq9DTgjvM4a4UBZXCWaWNh05Hblm0+dWNmIJcMVqPBu8ZBUFBQUFxVPKgROR94ubmqUOptUsBe8XNx04Eel1s173OPjOy2V/h+8i7b2nI2vdY50XbCZg/SPnmxNh6UU1PUPTMC0klFXOlufUduXWdWcyuvZFFgYcKg653pJVLqxpl7dylLVMeXaFMPRGy5rD9K/Cc3Nr+IVNQlpDb349P6+uxxn59fz8ht6CJmFRi4jWJLyaXn45mUarbu7gD/TLlQOKoX65soMvolU1x97Lu3S/OL2yM6u6q5Qlb5OBM5sx5Kuho8FnBVK1CbQ8PKYoKCgoKNzgiz17n+KmeGL1oVNnOxQQ2rQ6FNChU2d5YvUj2L0PtafzFPN3HJF8+HLC/d5hb00L0axSpiS/gU9r7A1PrPTdX5hW3tfVP9LepapqkhZV9RdU9BUzRNUtMnaPukesy6zqX7m/4Pzd2vIOeSlLWsqUljAl9HYxvV1Mbxugt4tL2sUl7ZISpqSUKS1jycpYsruFTZfvF7CEEo1hUmOYGJ8yj0/a0RgmNIZJlkASey/vejYjt55f1C5ptcmWdxlDTPF77zD0yZadJtCiMUIww05QozE4ZchzVHjGKCgoKL6PfL5z71PclAm0rPt0J9vRtNgKaN2nO02gxZs2cd2HF30QSY+G7vicdY4aJ4yMk2CB0ZIwYUf3RGKGLKfDowVemBY6I1vJURQ2C4tb+3eH5H4Z19guHKlokt7P60lI5cQndVy6zYy9xbx0m3klqSMxnZtW2FvbLu8U6/fHN+0JzS/rkLskLqUkq7JJpjXqDFMjY5PO0Bmm5FpjZnnThaSivEZhKVvhnma5VfwuGIY2bN2FNi00blmXK/eajoRRUFBQfK/4fNfep7gpE2hZ/9kujtLBtDhKaP1nu0yg5aHuWHc6KXzX5qldaYyQhkywIK0DWKPC4J0A6R8VZsgSHHnBY9PqcKzNKm7tL24T7YksOJrY3tAznFLYG5fMPpfQHhzXHHih4XBU3aHztd9E1QVdbAy50hx9k3n1QWdmWR9LpAu82b7vbHE5e5CEuNSyokb2gNqo1I6rHFESIVIbabWsi8nF+U391T06rzOGmHEcBMPQ5m1fmEGLZhzSjFtPlErSSWeYmin3cpOH+vWjoKCgeHLYNnN69AQ2ZQItG7Z+wVU5mBZXBW3Y+gViWhY64BHedy5ue5VrzRp3IVg4x3KUrXHvA0sufUg3Do1OgGMT5rEJ8+gE6FqhJt3FDFlCz8UKNATXJDo1LYehHGSmUqakjCWNTmncEl1XzlHfyOk+d4sVdLnpq/O1O0KrPjtZsfF4+WenKzedKN9yunJnGONAVN3JKy0xdzvuFvAbBLrPo+tjUhorOgcJuVfUnFbe3KsclWmM8pFxPIO4OVKNsVc5mlbaeJPWVNgmaRabXGiWe+M4CDXQll1fmkDLyLj9pKmsrDSbTGazCQTNIGiGIBCCQLPZBEFgc3MznU5XjIySxbpmzrEoKCgovlds27UXP1M3YTFMEaObsHjUlLVBo8kwPmkYn9QZTV5vlReYQMunO77scjStLhX06Y4vTaD1gyAKNU7zebimBTNNx3IrV+hEsyZgPItgeRR2GpsAR8enckWaCLYihqMsEo8YJkyufctt04qIjoNNq8Md08JcyVnHHylny4vbpW/to+W0D13J5Z1OaNt/oWFraPXaoHK/b0q+udKs1o5rRycPXG5cfojuf6R0/fHy7eE1hy41hd1iJhQKCjmat74sKGZKKzgKDHSW5GIyrUuukwwbJcNG8bBxAIVk2KgenVSPTspGxpGZYnhJtZEr1124l09rGajijXiUMXQ2JKlAA2374mtM9rCiosJkmsLLFgSBtbW1RqORXlIyqNZTmkVBQUExsxA6jWHK8vc83t8L+BheL+CTyJZzPQIN45OvF/BfL+DXDuqGDaB3W+UFJtCyZffXeNPasvtrjGlBdMDX1/eLTxenh7/4cE3L4JlskRVmeeFbEw6+NbOyNToB9g0bNhcL5qRwEPZW9Cv04zMiW2bIcvbiVaEGNQqGM9PCj/nElJsrOQpGl+pQXOXpB90Jpf1BCe17Yuo3nqnyO1b2wcHivbH1E1Nmi8VisVgyGP1v7itYvL9wycHiVUHln4YyvrrYGHybdb9OHpLRcyi2rJKjRFPBUX6bVVnVIRSpDEKVoW/IKFAZEIRDRrFmXDU6CTOgGRcOGQUqg1BpEKqMAqWhX2moYAmvZjLoHYomiRkzlIOnmlXjxLTKysqmpiYJZYtOpxcVFRUVFdHpdLxjSdVjZ0LCuoSyx/5rRfHIUOimYmLj6ts4j31LHhn1bZyY2DiFbuqxb8lDgiuUBZ04yf0efJGfwE/qzLRez+rCJxlez+p6PavLmWw50yOd0XSFNfjGA+40Y1rOAmMkATNPTcvX1/fzDe/NrGkpdJMh4WdrmjuwL82Ubz0S2XLpW7pxaNQ4uTW9e35c27aM7rxOZTprcP197vy4tgN5fMOEyS1d89C0EN9yMC3C0TWbB4yM7qEqruofu/Ju1AwGJ3P2xDZ9EspYfqz0nQPFOy/YNctisaRW9b+2M2/uF7R/7Ct4/xDdL6h8c3j1V3HNkWldSc1Db+6lVXQqqrgqmEquqpw9GJtcwBKP8JWGXqWhR2noURp4KPqHjYP6SbmN/uFxntLAUxh4CkOPwsBTGNoHRmKSCukdiro+o8cZQ8zddUSgYBjase8QxrRKS0v7h3Tp3WNVDSeNVX8vj36lNPo32o7T8DdcLpOJ+vsR00KHsqTqseCQsBn/2eIKZcEhYRL1GP5pSlYBAAApWQXIwtXN7J/85KcAACDzQyJjAMcpJDIG3X6vVP3LX/0aAICf/OSn1c1szNrJXyXcBvSWHzx4aPfu3bt370ZcRKIeOxYYtHv37oMHDyH7yv0l8TthRjr+xDvJiXeSkac0eiW6TcxTx58tD0zLi01NvJO823FCb+djwaNP4dGRrW/joBfDNEKjV5K8nXBFztqEZ+7evftYYBDyzVLbzquWTr6n/jHjh2lmGyTZsd8Z00rjmM0mDK+ncYxG4+tpHELZImxq2ADW92vmXW2/2iB1U7OcbtX45NC5c0PnzqGlCtYsZD7mLSbQsm3voe4hB9PqHoK27T3kzLR8fX29M61B7WRI+Nm1tikk/OygblJtgNh88cHDR9CnvZ1HEtx6NJnE0QmwsFM5P6ppaxJn1Dg5OgGOjpvV+nG/68z5UU1cqW50ApqmbJkhS9Tl63jT6nDHtBr7Ruv4I/fLet7cVxhbKvnyatuGiNrlQRWLDhR/HlNvmDAhmiUZMiw8WPTytpy/7Mz7+27avH0F7xykrzxR+VlU/cEbzBt1yrf3FyWVdDO6hhhdQ1VdQ1VdQxmMrjv5Nb1KA3dwjDs4xoFRGBC6VAbRyLhUN2lFO8kfMnIUhk75WKd8jCMf4ysMt/Nr02v4DP6om6EskrvrCIah3V8fxZjW6cTCN9NHU3M28ovfiP7qtTeOM/Oq29LubEP/R1VUVIRPF0qITEuhn7pg64nRj92HRq9E+hjkqXTY+Oaid2bPmTd7zjzEcnql6tVrN0iHjWoDVN3MfunlWb1SNbop/Ey4Hdi9UrIKfvmrX3v6KmYb0HvjWGAQ/GGRH3TYS+CPU9/Ggfs595ck3CczYlroRuBVo3vxxDvJ6EPgcHwfsmkhOzPi7HniH8dp42lYzv1PIVGP3bh1D14SkWPCIwvPPBsVczYqBrMlCt1U/LWEkLAI+C2enkL4Nkm2H/Nde+yHybsG0QeUZMc+mTgzrdm32vGmNftWO4Jhyi3T0hlNV6vF82Oa7zVJR4xm9HySEJcz01KEh8PA7x0Zm8TMxLzFBFp27j+KN62d+4+Sm9ah7W+mhL4kTP5P900LbVRsvnjvl1+x+WK3jsJMVG499kzi2IQ5ukg4P7Qus0WG5ArHJsxxZX3wzDFXCcRXiCaMaV28etN702rsGw2+Qv/nruLgbOFnMY3+Z6rfPVK2LbbRMGGPZo1NmD6LbVgWXLk8uNIvlLE6vHrD+bpFh0s/DKxYHVaz7VLzuSLxoi+KT8cXM7qHqmzEp1WkV7ZzB0c75PoOub5zcJSjGOtSGWC4SgNHaeAqDaKR8QHthNhGz5CRPTjKkumZMj1bPppe0R6XXsPgj6I16yqN84NX1uGJz+eQ3MRQMAztO3QcMa1hI1Qp1D17y1BSspKf8lzY9t/7ReesYVv+9ytRwPFQ0OxoWkQ/iy5MS+exaWHaxDyFXYcwniQdNi5b4YeJQoVExqzftAU9B+1e+NbIXyXfBvSmIo/RsSikP3B/ScKdMCOmhf7nHu7e4r+9gRy1+GsJzv7vp0zL/bXAu5HkyBJuCWw/iOy6fwoRtklyNAm/v4/3ME3ftLw7xI8Rl6Y1+1oLoXK5NC0kqTc/on5+RH1EYS+S44Nfmh9R70y2ME1ZJWN0wjA+KTt9GgZuDf2UMHu45+BxvGntOXic3LTijrwKP976yfvXAv/CSvy5S9PKyqfHX0uEH7P54vMXLsExLXeZtm89XtkamzBfKuydH1R1r3pgdMKMzDyX1zM/qCoPpV/uyxY+pnX5+h0vTat5wNg8YNx17M6sgJz9ybwVwdV/25K+7ECmbmzS4moa0hr9jmTP2ZW7Orz+WKbg7xtouwJvwzfkgTl1JT2rms2WjbaKR+v46jKWiC0a7pKMdIm1HMkIV6KxItZwxRqOeKRLPMKVaHlSXU2XvJqnbBGPMqWjWQx28LXcWqEBPSrpD15ZB1c4YvjBK+tIbhQtGIb2Hz0NmxZ8xnx6tS2ncJUx95d7/f5tcmJ8cnLiD1fBRamW//5UZDabENmi0Wj4UxP+pc4pKEGi/UiaY/fu3SFhEUh240JsnEQ9FhMbV1HXgiyA+Y8cbhPTq2GekphWr1T96t9no0NQvVL1Sy/PwrhXSlYB2r3Wb9qCzi2Sv0q4Dejth5Nu8CdFghDoJAjSfbq/JPk+waSQ0PEPNSoJiM80obsieNVw76527NrRBxQdYsEfR0LQm0qjV6ITWOTt4Htcl1m57IISksgNsuoesQpZY0xsHKu7H/mwzj44vCT6YOEPCuG3A/4IJEcWLwRcoSz+WoJCN4Us5v4pRNgm3OD1xDvog4j5COgP/hgPE2GD+DOQ/ICiw7SE2UPvPql3AEQTZhmnpnWtxWw2vRFVq5uwzDldgTjWG1G1sH65NC3D+OT8k9V4rPqFeoo3JELTQmRr4MgRDM6MzQRavjxyGm9aXx457TJ7uHbVMl/UBJGaFpw6hIuxJOqxg4ePwAEtRLngiFdxZR2cW8zKp8NvZPPFW7d+vnbt2q1bP0/LpsVfS3zUmcSZKtsaBxu6VfMPla44Uy1Tj42Om8bGTT0S7TtBFW8eKROrRvXuZQ/tmoXLJJohS3xikpem1SaZbJdObT1wA/hd7H/+8y4wKwb49Set7D6XmgVP567mA89+Cvzpys/eSQJ+/+3WgzeqecMI35y9czuvtrRDVsqSFbeIKpiibqmuW6rrkuq6JTbEui4EiRW2eCS7llfElNGZspu5NYEX0upEE+iM4RUa5wevrJsf1YTmB6+si8vn4DWLIQIZ/SCjH+y1mZb1dNHqCm8ssJS9uHfjH5/5IPKHG+48syYBWF/4P1/X/OL9YybTlNlsAs0mEDTn5eUR/iweCwxCumckhUEY04J/yJCkGJIHwZhW4p1k9A8c5imJaeGtKCWr4M1F78C5RQRMlAvzLvJXCbcBvf3wZ0RXwyD6gnwctK+4syR+JyAdpEI3lZZNg7sWZH+iX4U7G8LF0GuE20f6eKRrR8c80K0RHkfCnz/CvlyNEgJn7WB6XMKPgM6gwa0RduHOVo2IPt600C3D+wduGW1XmIOCB61EbpoW+qnLt+NPIcI20RVLzr5ryAd/jIeJsEHCM5D8gDqbgzkZPP2kXkOuWWrnpvXG5cY3LjfCxVi6CcuccIbZbJoTztBNWF9yM6Y1/0g5Gqtm4WZiPAm/VXbJ0I8bxicFX32FQJKFnI5pGfL/JXL/G26aFiJM8ITUv2fl02Gpysqnr127Fg56xV9LhB9k5dO/2LMXPsqdfPHWrZ/XNHc81uCW92VbYxNmtlC96Oui+Xtp7x4qDr7HPHGrHX56p6R3zBblclO2CMu2pmVarEGQNQjuPnYL+G0U8OwXwC+3As9tfXb+vj7JkEvNqmnl/+m9I8BvtgL/txH41Tbg2cjdgbdqejQI34TduJ5RVdExWMFRlrMH8+p4LXxlt0zfLdN3y3TdMl2XFIO+S6rniLWFLYL8pv5StrKEJf82oyIw5n6j2IwpzIrP5/zglXXzD5XCkGtWVT9Y1Q/2DkOHjocgpqUfTBlufP36N795Zt6Rf3x1e9xomBg3TkyMT05MTE1OmuALEs0ms9mUk5ND+LNo/x3UW5MUeLvCP3b2U0hSCw/jzLTWb9qCyRI6W3LGY1qEewPp0ggDEu4vSbgTMNEUzL/mhOlI/GJqW7RDoh5DDhz8AB1NwRQp0+iV7hxH/KbC3S26FIy8HcIsEuYjkIc/0ceFZNWEpuWsZWTfukxyoS84cD+mhZYq8pgW4SlE2CbmsxCeVxjFfCyHibBBwjPQ5UaSnJZef9LpQKJZahLTiqqFNWtOOENtky1EvN6IqnWnTssqW/uLYayaZXuKBlNiRVxcb4SGjZBSM2oYn+zeuROB3LQOBIXgTetAUIgz09rz6WILHRAm/2fI3nnux7QwqUO4SGtQO3k+5hL8AH35Yfy1xJrmDkylvEQ9FnjilPXpdy2TODZhZguG3v8yZ9629A2nS+ZtS4dZtDvrTmHX2IRZ52Y5PGmNvBmyfHs7xUvTYisgthIKvUYHno0EXrkG/Hor8NLXwKsHf/tBIKdXrNfrdTqdTqeTyFWzt1wGFgYCC44CC44Ccw4As78CXt8P/PVr4A9fAr/cDLwUB/z6wpmrRbW9I1b4IxFX02Nu55VzBiu7VJVdKjpTmt8kzKzhZtZwM6u5GdXcjGpuTl13q1DJFg13iIY7RMOsvqGCpt785v5SjqqMoyztVMTcyou6WdREdB9DWLZeX3MN1izCjCGiWZX9YO8wdORUhN20urfp7/z6+SW7gX1Vb5/N4vKEaZWczyrNvnng4bhsu2yZTBkZGYQ/i+j/OKdvWph/3zFP1U4sB69ZaicF8mrHQBe+NfJXSbZB7aRLwxee17dx3F+ScCeg03zIFWrojhNuECl2drYY3Ku1dPLhUBb8xupGJlLWQ9gpetQhYTZegSq996gLJ/wIHnXhzlbtkWmpbUVU+IOCBnNdp7MjS/gFwYgFHHZy8xQi3JNIqBKzJPojYKT8MR4mvGk5W5hkI0lOS68/6TRxpllqJ04zMm69tBDOG845XaE2QMgc+PHIuLsV8Ybxyflf5KErtAzjkxH3WfO/yIPnuxPTgoE1q37FCgwk2cPDJyPwpnX4ZAShaW3f+G5H4v9EHXh9Jcqxtnzyfk38r0nqtDAihSgUmy8+H3NpUDuJlirEqNBypnZ0NSsP2bdmSrZGJ8wdPYq3t9x+fc21g1H0UcOkVKGrbOmrYQ6oNGPT1SyUb5khS8K9dC9Nq1MJcVRQRrXwmV8e/tHcbODF/cCc08A7F4B3Ip/1i2xkdYttE7dH8Nq2q4DfTeDjJMDvDrAiEVhyBXg7Cnj9OPCHff9vdtYzv9j7oIJXL9DV9+rqe3V1vbr79Lb9Jy/V89XV3UOV3KFKrgqhgqsq5yhz63gN3bK2nsG2nsE2vqKlZ7CggZ/fLCrjqMo4qgquqqZH/eXx2AxGd7MUO5QDfI0hLFuIZlXjMoaIZlX2gXw1FBQahZjWaN1bRade/ePGb4HDzf9aZHmzCny3yfJ/hZYfrbxSVFw+OTExNTkBD7WVnp5O+LNIaFqEdgU/Rn7cafRKTPbQnV86jOWgLxXEgAlHVTezf/Pb56qb2egWEK9y81XCbUC2H1NjDmdM0J8CnUpzc0lnXQgS7UAbADpYdfHylYuXr+CFCb2Y2gAl3km+k5yKrj2K//YGcvUcJomWlk1DylnwxxF/CNCbyhXKWjr56MNK3g5Jj4ss6X72kHDV+ISaOy1j9i3JR8bMxBxZkpMcOTToLKE7pxBhm5ijQPhdQ+fUHtdhImyQ8AwkP6CEOwH9JfXukz48SMYIRZdnzT1UrDZAcwNL4RyiR03hLzMcMZrvFnDmfnb/aibLnYp4GDhvmPrGGzCwoqGfElbEB4ZE4U0rMCQKb1p7P3s79vDf/VauQBzL32/53eBZmLHj8RuGFinYupCMIfIAsaia5g4kdYiMBFHT3IHOOdqZkcsSH6Zs6ScgZpdkfsC5Py05sy84bdQwoR8H9ROQfgLUj4Mz41g2zJDlVkq296bVpYJYkomX527/2dIS4IM7wPuXAP87wLpU4OPEZzfGl9S0dNqm44l0YO094PMi4LNCYGMusOYB4JsAvBMNvHvzZ+/TZ/1jT71A2yDU19uo4Wv8NnxV2SFm8NQMnrqKp65CPShmSopbeuu5Ypg6zkBeA6+gVVTRpS7vGirvHqrsUpe2iz7e/HWLZLJJ6nooB8JQFqJZFX0gXw2dOhtrN62qBTd3PBcXe/7FXdd/cTL9hQT+r0Nr3zySVFHTMm40ToyPI7KVkJBA+LOINy21LX0A/54ijyXqsZjYuDvJqfgcFvIjiP7nG/MU9ht0xUNKVgE8tBUyISNgYdwIMwcZggsZxMHNVwm3AdNVI9EI9K88XCOM/uF2c0l8QGI3apwhdBTkxq17mCvUXC6mxg07JEEV3mE2abdjKT3+OGLAbCoyB5lJ3g6+AIjwIyCbR15qjVk14SmKaRnJW+FbRsq28CvCZLuQ5BT+yOIjGXUzlQAAIABJREFUWBjfQoep3DyFnLUpQRWVI36J+a6hA6KP6zDhGyQ8A8kPKPw7g9kJeNPy9JM+PJxlD2GpQjP3ULH9cWCpm6M8EKIzmuLuN7y2Kq6WKSIcMt7ZKA8XZs2CMYxPqkbG4AJ59EzMW0yg5WRkLN60TkbG4u/GE3Pw7+h0YfCe+dLUf3dnlAe4Bguetm79HK6Fl9jq4glTh/ACX+zZC7/r8JFjTsfcMjxc2XJZtuUioDVuvnSz4PcLdu488q1Ns2ZMrbCmBVruped7mz0chHgqiDcEHY1K/9c5t379TQfw8W1gUw6wswT4uhHYTf/Vnge5pTX19fX19fX7rhcDX5YBQV3AN+3AV3XAtiJgYybgd/NXB1g/fP3m0XOpTX1jjY4ERV6JupHFkhprekbg4q1qG2Ud8qJmfk1HX01HX01Hf14dr6hNwuBpqnjDVbzhym5Nm8R47tv04As3mYNgI06zSK4xdAhl2TQLb1pabog4/pXm86/w78zPuRcWn1GZX9lqGBs1GsbGDQabbI1PTU5cuHBhmj8oLqPxmDGcSIZ0+v7wFO+Emc3OqB/hSO5PwUHBfAR8LeBTcJgIeZSf1E3cNy2MdXltWnCIa9YHJy7eLnN/PK1hI2QYn/zquee+eu45WLPQVyMi8zHv8si0LHSAEffsutXLPv/k/Yarv3yId+PBQZA6xPDYMomuauTHobEJc3J6/qhh/KFq1jRMa9BKlwrqUUMt/WO//fPGlwI7fnaSC+wsAU52PxMt+9HlwR+Htb1wPC86lR6XUTLrZO5PLvf/51XVv10aBM5LgcBOYFvRf5/gvHSE9fzfNlR3Dzf1G9A09hsqOcp3Pvqkvkve0j9ax9fW9tqp7hnOqeOVtvSUtfbk1vUUt0ur+dpq/giDP1LdM9LQN1rDkbznu7lRqGuTO73BjsuMYYWN8j6wRw2FRF8xgRb0/czDwsL0Wu2oTjeq143p9WOjo3jZCgsLc3YKunlTd4VuKvri5YZ2LuGrEvXY6TOhXKGM8On3k+/QTpCox46ixkTYvXu3swONQH4+uINCN5VwO0miHkM2AC6X9nRLPIIrlJ0+E4pe6cNb18M7WJjzikavjL54WaGbemoOkzMe6if1jm279uJnGqYsc/cXkpjWvL00w5TFnaYwDBvAyvrO5+dueX7uFsP4pNoAurNVsGSoRsbgjKEW9jMjNGyE1EYIHr8Uno9pZwq0nIm6gjetM1FXpkDr9mNEaqrQBywmGyN+mjsc7raqm1iZecXw48y84i/27BUPjboQMiMWb5RrHNKQxreIrMsCoxt3nkMcB7XjkKeDnXphWvezioTDUMeg+6Y1iEIB8dVQ7zD0bWYD8MLxdx9o/i9O+cyFwV/eHf5dmvaP2foX7/b97mLt72Kq/nhH8HLu6B+zdM+njvzvHTUQPfiLy4p37qt9/nDsamZTy4ARTbONuCTa6k1fdsnGWsUGa2JRYKWyS1XY0k9rEpZ3KmoFOpiaXl2zyMCR6P0+2XMjvaRTYc0bepcxRDQLNq3wi9enzA7/DB11b5rm+Q3/y/id6IooHgEzcj5wUKklGr3yYW/zzbv3vys65SYN7dzdu3cfDQwSq8eemsP0GD+pFzgzrXl7aeR4Z1pDBkhrK4rHi5Gzpgj/r3bnn+0psyXs4nW8aYVdvD5lJjYtl8zIbhcPjSKpw/hrifgFPIuKuSFeGNlyR7lGiHzL05EgPB6Xyzkm0JKaW2I1rUF3TMvmWCwbXSpIOAwJ1ODXZ27969zIgKrxRbXgS3nGV+nG+Yypf9ZNvVVvWtRgeqve9M+aqfmMyb/Rx1/IMbxVDQZUGH/4RvjBsKQ28QSaVjQDEwdPRW3a/g1/0MhVTjb0jTb2jTX0jTUIRxsEo/WC0XrBaJ1AXyccrReO1gn0HMUkT274ZNvBwLCLXSqoTeZEs9CO5VKzhGC5EOxRQ+fib8GmNc0zVUVBQUFBMT0+37UXP1M7bjFMuUA7bnGnqRnZKme/+S77gkmzJTLuFt60IuNuTZqx2/+ImWYP6I5+uRvrcs+97LJFwsTMqxiCCbSk0yoEww5RKiemNUigWTA9aqhPAwmGwYNnEn3+FLgyZ/DAiOVTqWU517Kca1nNt6zhW9b2WHy5lo+6LJvFlsPDlhWZsmf+dPRgyM12ySRCGxqxnQMnoz7y39rMlfQNmzoHp1oHxpv7jU2i8WaRsVFkbOw3NA8Y2YNTQrWpgS1a4vfpsbAL3UNQh4I4Y+hMswhDWeVCsEwIlgnBHjUUcy1p0mzxzJnGKCgoKChmns937n2Km5o0W6K+TcKbVtS3SZNmy2Pf+QTMhJ8RitewwZM8I5l1WTCQ+9YMupcJtGQVMQTDEGsQmxV0NC3nmgUjGIZEI5BoBLqWXv37V1f/ZuODbVXaC2OWSxbLWYsl3GI5a7HEWiwxo5bPK7W/+iT5hVdXxadWM2VTTNlUh3yKPWhiK0wcG52Dpg65iSWbapdauXg7Z84/l50Mi2vtkklGzEK1iT9k4qlMPUMmodrUpza1dEmDQi/P/eeyGw8K+GqIo4TcKcwizxgimgWb1s3MUv7g6KTZQkFBQUHxeNm9Z+9T3FSPfDQxoxRvWokZpT1yqhuyTHkE6CWmGUI8NFbAaIVNCyNbxKZFqFkwvWpIrIXEWqhTMno88saf5q//0YJTf96VsSymec01zpKoplk70/9t/sk/L/gkKDKhpU/XozIL1GCfBoQVTaS1MQKJRqD+Eah/BBJqoF412KUyc5TmWp76cHDMgrf9Pl63K+jMpYTk3PuZxYn3coOCY/3X7Fjwtn9Q+EVm/4hgGOpUulX/7jJjWIaiQwFVsMS5DHZacUMqBQUFBQXFQyObwS5niZmDDqbFHITKWeJsBvuxb950SEOgO5COI4PekFFiJxNDaUNmaUMWimw0ZQ3ZZQ05juSWNeSWNZKQB1PulHyvKK5lNXbLe9R2X3JqWiSOha7ZGhiBpDpIqoMkWrCksftiQsaBkzFfHQk9eCL6UmJmSRNPooUkWkiiszOgtUnVMNSrhvhqSDAM9Wkg0YhV3QZgRiDRCNSjnMytbD135c6B42H7jpw5eCI8+tu7BdXtArWpXwPx1VCbzIPCLNixKp2HssqEYKkQLBWCdQNgxyDEG8LSTUFBQUFBMdMwB6FqEYg2rWoRyByEuocIBgt4vLA9pBNBCXUqIQ4GFcRRQVwVxFVBXY50q6w7x94Lq6EeR/hqiK+GetVQ77ADAg0k0EBCIvoc6ddYYz2EiEgZcAQOG/VpIDjVhlEmrGm5o1kI3UNQ/wgk00NyImR6aEALCTVQzxDEUULMQahNbkMGtaJokUFtcqhDAXUNQXw11Kdx8DNYwhAV61FDzEG3CrPczxhaNUtgpcQROp5eLMUUFBQUFBRPO/juD99FYvpQpG8tdex2y4XW7hjpnSv7wEpUGgruyuFuvUZk7ejhTr9uAKyzjevUILbeHga58XGTFGySgs1SsFkKNUuhFinUIrOD1o82GcpM5FCbHGpHwYQZJMYjX/LStNAr4yihHjUk0EC9aqhnCOpWQZ1K+7ZiPgZes+xIoWYp1CwFm6VguxzsUICdSpCrBLuHILYSbJPZxyadwYxhqUeaRTkWBQUFBcX3G5e+RSJbpRjZEpLKVr9dtqrJZUvsTLbAGZAtJ771cE2LWPHkENNxEz3SrGaUZjVJwSbULkPfytBrzSqnNIuCgoKCgmImmHHZKp+ebNXjZUviIFvN3soWeXDroZiWszCaO5rV+jA1y6OhHDzOGFKORUFBQUFB4ch0fMv9TCIDk0l8CLLVOg3Zcse3yExrcNRhIA2lM0YJULjNoB4GRJCj0YEyIqQoJDBaK2JCRsABJ4jI0WDpp6CgoKCgoMD1jyKNiy7VWUcsHiHuu5GeHe7o0V0/oRvIdQ4KMegANKj3QE4I3caZCKFlaXDUbdMaHIVupuRu2htIQUFBQUFBQUHhDjdTcjGy5dS0VGPQpr2BFmqiJmqiJmqiJmqiJmpyb9q0N1A15qFp6cdBCgoKCgoKCgoKcijToqCgoKCgoKB4WHhmWsoxaNPeQAiy6IwgBQUFBQUFBQUFORBk2bQ3UOnStOCrFr9vpnX79m2L5fvyYSkoKCgoKChmHMS00ANAYE2LiTUtaMQAfh+ATeuxbwYFBQUFBQXFdxQIgtCmxcSbFpMyrce9GRQUFBQUFBTfUfCmxUSbloHItEAIGh4zfx+ATevhtW+hAx7x2HfIo6SSdNKNTTz2LaQ+I7UfKCgoKFwCEpmWYQZNi1cfURH337z6iMf+Ub3AfdNqzvYvufAfzdn+HrWPKNQ47RnKtDBUVlaaTSaz2QSCZhA0QxAIQaDZbIIgsLm5mU6nKzS6x76R1Gek9gMFBQUFOS5Mi3CUBxCEhkbN7qDSmyou/Qc0Ka+6+vOh0Sn33sULnbv9wah5aNT8YMuC0A4ni3XEzJkb04R+4ISmsws2Z7m1tXhg03K5mNZgqrj0Y2hSXnX1f0bGJtxvH/YniA6sXLlyz2fvpIe/RG5aLhrsKw4JK+726pM+gVRUVJhMU/gOGILA2tpao9FYUlIiU2kf+3ZSn5HaDxQUFBQkgCDk8Xha7puWfKCFX7bGYuzsr9km7ily71020yJQKF7oXMDFhLOuR2BaXQ3R/LIAi7Gzv+ZzduUx99tHm9bKlSu3bXzffdOqSdxnncKKa/Ij9jlOIfmyoVHzUF9xSCIT9S5ZdlhEdh9mM5jX9pFMt2rgxfAa13jLupaHQ1lZ2dTUJGEHTKfTi4qKioqK6HQ67o35m8nOD9upRbaMze+zts85y7M2m7UdmLt981wC9X+wBXA4wdDvelif0eH0dmN1vNC5gItvQUfMHMD6H46zVaDXhf0vqCNmzpZ8zG55+PvB9anbjftquPVNwX5xzN35Edca4W8Qrgkn/95050c4e4mCguJ7hRumpYCs2EzLDEJKvdkdWrP9x6RpFuUlo/xB4/1FLpZnxryxJV+p54XM3Z6iN6dswfWAW/IdFp4b04h+oOeFROYr9WZlxnZyGduU4dbGK/VW03K5WM3tV5GPWX3tj242rtRjTWvlypXkpoVvgZsXEZInsz4VFIeEFXP1ZmXjLWQmNy/iWqNZqWde23eLAS+TwFTqzUo98xq8sP0BHllW2C2G7SkjYZ99XY5reRiUlpb2D+nSu8eqGk4aq/5eHv1KafRvtB2n4Q5YLpOJ+vvpdDp5IylbFoQwnZ1pZqWeFzIXcz7wQuba3pKx/Y1IHrwMAGxP0fNC5i7YtGUBbGNIsylbHFuwvuvhfsbGyAXOTm/r2pkxb5DapHX77V8fc2PkAtuWW7+D2H2I/q6hFkDvUoKvLbJJM78f3D11UTMjsgREy9u/F0RPce9lJNgeI18623eEbMK2SUFB8b3AjDYtm1M5mFaHAupQQB2DUIenpqUzlV/8MTTBs/RvtozWVsb9VKWfIlsebVoZ29FKZP+tz9ju4Fs24E6iMXK7rUvgNaJesneEqPnu4I5pacZM5Rf/HZrgWfo3WUZrK+N+ohmdcLN9QtM6vOOtlNCXhck/cW1ajbf2hRVz9U7+s3cQKXs/Ye0kHJTr1rWEYq7esdtovLUvoRjurjD9x7VG2wKodWG2jaSTd3PnnE4sfDN9NDVnI7/4jeivXnvjODOvui3tzjZ0wKOoqAj3RliMnE3bU/QkWrAghAmbFqqRuds3Wd3LLmFogZuOaXn7GR3Paj3R2lEKhQe1/SiztPtT/ib7e/M3Oeyc7SEYyduSj9qNC0KYDtuGsreHsR9cn7rYE3Uf8ZkcknArZN++fQlMbh4uPGz/d4J5zaZKzk0LsTHnVjejXxMKCoonH8S0YJWCtcrRtAYhBNi0Rg1TEo2JEHbp0dLo/6Cf/1cYPt3PokmxdK+wSCN7C95B5tPP/6gtfxv27W3Rsz/Nl2i6T8/ZtuHTBafDt80O75ZoTBJN9+k5C063mSQakyRtG/Bpfk2403/ogTnRNXBTtsc14Qs2pJkkmvwNAADM2Xa3jXjLCYFNCz+/LuX9krM/op//IQyfvtKiSbF0L7dII3sLFiPzCyP/teb2ApL2CU0r7uhr8OPPN3xwLeivrMT/RUzL8e3tV/bdqkDP4RedCS1iaUySultncmWYdbFyw6/UOTy1LdN+JbSIVXfrTK6MlRt+JbfozI12icZUcWPflTpZWqjjKtAQrQUN4fFxc88XdmmevWUoKVnJT3kubPvv/aJz1rAt//v/2zvz8CiOO+934jfZ9002iXeT2N5ks06ceONkfYEkYo0PbMd2HHvtGMfGh8CSbXnANtjGGGFOC5DEOWa4dCKQBAIkBAgEo/tAByDQgbBgQANCJ4eOQQIkJJrpfv/o6e7q7urqntGMLn7f5/voGXVXV1dV10x95lfVPZ83vDk/zHFLMvqqZ2IN9aMCUnG7Kk0+gaZQP6TD2OmSCH+fCKuss/FbuJTBAX7+oRHBHFKE8h0pKVB9tPQzeamOhLcA/67Ra77iyMZU4a2H2yu+p2RNmoG0fHCS3flu9ea11td1yzZPj6tSnld4RxzfG7E4bvPiuCrxPSIcotLJC+IiUuukbzphe1nmYjzX4d9KA3mbgMHgEeFrPTclpHWRqZHNHp645OSvmkvapJW9/MeOGzaWbmL7TrG95WxHPHvOyFY/w1S/zNYGMqemMFVvMmXP0Tljspf/sMXeLzkcIa0kO91szwhwfkxnBPDDYXMqN85RAancXmtooKnEzo0NGfyBEmNGBd1WI62s8H9RVPMjtvpppvoltvY95pSRORvBNCXeqpqWvfwHhPzVZg/ffuPlfyBisKRVxn9TD8ss2Bsh+1BfvLe12d6aGia8lo03ralh/FDBDVd2uiDOORgc3xuxeG9mZFjmcTs/XAnDCTquaJFWs2IU0d/yAeuPpVv+2bv3nmmv/Ut/343+/r77ohzjU9h/D2y4dYsWBuD9+/fLDiRxD08/JSgWcFBOUTwTYEmL2yLuSgqUkJZ7HcztOpJ6NQ9JpG8jMiCrNPkI7y9ZC9jppEB/Hydo+vPfXrj3I/KuFN68QmMq2tw77aCj68p6PtJpBa4qiJsuUJo8mfOF860kfFeRkBZyoLC9IG46+sXGS28TMBg8IiySFk9TJy4pSEtwuxZpHc+aXRL1u/6L29m2NeyZN9kTLzAVTzKHfJnCPzNZv2Uy/oPJ/EP3rnsLV/zLsd0fyA+XkxY/niHfsDmXRPgHpGYEoGNnarBPYDA3fOoaa/W1jhppHUx4viTqt3w132BPPM9UPMEc8mEK/8Rk3ctk3MPY1vxPyk/Oly6pscwg5K9GWj0Z/2fZDD8N0nLaOdg02+Vfr50WhxaEriQp+RzKNk93bmxNDRNYjRuunC8kgTEdpNWMjCIu9MvLdkucP5t3/7RJf/j+C8t+EJD4/YkbqXcsP59Rcvfzc2j65q1btOMW7XDc2rdvn0om1tAIeTRFpBNcTMsJ8VzgqlK2RdmHBkxaA6ujJmmpvLnwhZEErpSBKHFLRoCfqYT/tiMhNo6x+ANLIvz1RLMG3A56uq4mabWmhkWklpFJS0hfFSn7ShO3GUNa4hmRt6fH3yZgMHiEmCOt9usMClQIadHsd5cZwe09GqTVbKfPVO44sPiHraWT2IsmptyfKX6Eyb2fOfCfjt0/d+z7TX3cnQcW3WE9HIc5ttLkExgcQFEUxYemnFuEUY2fxxFjWrQzrFVp8kEGP8QZAX7BAYpBV6fVSKvZTh/e9fGBxT9oLQ1gL5qYmonM6a+Zc2uZOhNzajlz+lt75dKHdt75wp6fk/OXkda0oGfZbOpc8k+XTH9MM6blHCfqMhfHVRXEKWYqsJEn5wDQmhqGfuHmBoOqyOmbU51jT1Xk9Ol8Sudwhc7IHJeH0ITwGN6ujh/tTcmdR8bGhvzn9/8y2/B5wo3enr4bvX19N/r7+m7299PcTWq36Fu36PT0dGwOahEdhLSECJawk+t1XETHuV1KLZJgj2Ac2WNiq56to87ZQylcEt4FGfy7LCNA8j6StQ8axxJe82kCM5qlECZK/dQDawddXRclLfSrguRrAxeaqlOZ+IurkqUnzR7W0Zj3o/rsodtvEzAYPFLsJK0eBgWqXhohrdrLjGA9pNVsp1s7rhWs97GXvc4cepzJ+i2z725H2k8dKT9p3/yTHNPvW9s6sUeVRPhTVHASEtNyLq5CP6YrTT6BGcqYVlKEP+VnKhEmE8XDnVExvd+wpSaQVrOdbmypzwz/tb1sAlO3KHjP/Q/tvBP1r5P+37KWWQ9s/TEhf5S0jJOfq4n/xaqZPq8hjPVBwAslG36NX6dVl7k4LLNANlqQYlp0s50fAyTLVqoiwzJT47hIgPN1ZBk3ZojDlbCWpVmx5EscdTzkKyc/vJr4q3tf/JiaXvT08t0nT59LLawNKrz16j7HrPV7xAGYptPS0jA5VJoC/DAxFQ3sqLSW2GnSOi08Oijxy4qdxfZsHfXFtJCyyeb1lGFdPgEmW2lMK1RGlsLKSOX0q3Sa1QvtoKvrIqQl+Y6BIS3J20QORnjSQmivwK5c16g3pgUGg0exBdJCgUokrRs0e7KNOdnG1LYxtW16SavZTu+d94ObR15iLPc69vzSsfsuR/IPHInUzaQ7MuZ+T748S27nQFUS4U8JnERJBr+kQOk6rUqTj58pNNA/tFIIdHGRBmTASw3GjyJEk0mr2U6nh3z/5pG/M3WrfVPvMXfP+6L9remX3vikZcKUhlc/sL086eQLey4n/yrp/6odLpDW9PefWRMydsJrrwqM9fqEV5IW/Vn27HjZ4fx4IJ/R4CSs7V28t4qfN5Su3HKaO1wclpx76zIXh22OREYOPpQlxA+EYniYtLpLn8xc+MgfJkVTs47+MJN9ssjx13L2Lgv7f/8RmZmV39/Xd7O/j3v80s6dO+WHc6uOVIIrUtLiYV1CXUrSoqWL66VRH/kiJ1onaQ2ojjpJC+3zGjEtdAUkbldgRkmESSWmJc2/MiOADwcmBWovzx9YO+jtumIH5gPA8olvlLQ4MhNnJMXDI8vogrjNBZI+z9EVz1u4RZOy2BgYDL7dLJJWG1PbxnBYdQMlrVP81pNtTIdO0mptLFr2E6bgYcfee26m/fK0+Yc3Eu5wJFKOROpQGHXuZD7xcO7eQ+X4R1GBGUmB/qGp3NiGxLS44aHS5MN/vqtBlXOiR3d8i0xaJw6nFi37V6bgIeb0St/UexKvmhO6zPGdpti2FdEXl61vDp9YNT6tNfF/Un+iloOAUN9+NRadLlw0zb8l5cfKpzzIDncGqIjrtLg0znlGfoCRfmUnfO12fkeXRcJcnT101VcL/eON/7V+zcr7p8bevXDn7zfW/Sqs9MnZWwtKjt3o7e27cUMYgDdu3Ki4xKp3vanGtAQscy4TVJIW0nkkM4PWUD8lTOgirYHUsVnX7CFHhBkB3BZ10nJmJfmKIn37cO0TmMHt0rUOTCRdjaYYWDtod91m4a0hBR3xfSEk4OO1wlsDfS10e/4dJPZ55/2GYZkF4v28ekoIBoNvF3Ok1dEj0tQpGWlZ2xnBnfpIq3L/HGv0zx27f25P+FH2/O8d3h5kmUdd3EA5Einbaqpsy8Qhr7ZOk0krL/p5a/S/O3b/+/XioMkp9/mm3YP63i0/2dma9EjavxHyRynq4Pr/fOfNl4MDXjgc9R9qTy5Fjy1wTpoouUf5Bbo1NWz6dPknvrCiBTcYIDc2KscJb88edtQsalz/wNGVD9QlPpa+JXxDWmFGYUXP9Wu9Pddv9PTwA/CNm/19q1evxmeiGdNS4xSK4gKoHH8I4C6wiPgvFznD3F2hi7QGWEfNmBa6Th9/jwiRnNDvJM7l7Xxl5bkh+Yj8J1IXj3peaQftriv/NiIxMpkorHeUhZ3E7yfo7bqyPl8VOX364r1VuEeiAGmBwWAnaXX2MChQSUjrdAcjWCdp5Xz754sbf2xbc8fer6mTJbHNdtp2Iit71R9rVlAd0dT+xXcNebV1mkxa+xf/8uLGH9nWfD/f9N+nS6Oa7XSzNc9atPxS6cKeYwt90+4hY1azlLTYbOqm5fuOLNIz4oe8QQbT4eHhV7u6rnV3X7vaff3q1evXrikH4PDwcHcyJ02l4Ze9j7w6jihDO4DB4FFsgbRQoBJJq49m6zoYwfZeXaR17mR+zrd/PpQc0HKpDdl+83ju0v2L7zpVFj/k1dZpMmmV75u/f/Evs1ePOVmVLWy83NVfEP8Pa364b9o9mvmTf3vnNietr/VpyMsJdYR2AIPBYII50rL3MihQ9aGkZetkbB1O6yStUWPNFfFgMBgMBoPBBAukJdCUrRMlrVvsuU7mXCdztpM528lc6WUmT5t7vfd2IS0wGAwGg8Hggfh6783J0+Ze6XWiFIdVfbcQ0qq3M4K7bgBpgcFgMBgMBus1R1pdNxgUqETS6r/Fnr/CCOZJa+jLDQaDwWAwGDz8fb2X5kgLBap+lLQauxjB3X1AWmAwGAwGg8F6zZFWdx+DApVIWjdvsS3dDOfmbuYqkBYYDAaDwWCwbnOkdbWPaeaBqqWbuYmSVutVprXb6WtAWmAwGAwGg8G6zZHWtT4GBSoJaV28ygi+3sdMnja358bQlxsMBoPBYDB4+LvnBj152tzrfQwKVCJp0Q728jVGcE+/Kmmda2jOyivasj0NDAYPjrPyis41NA/5hwgYDAaDCeZIq6efQYGKdiCk1X6d4dx2XZW0bGfrD2TlXbx0mQGBQIOli5cuH8jKs52tH/LPETAYDAarWSCtNh6o2q9LSauzl+nsZTp7mM4epvcmnrQOZOV1dNpZli05R4PB4MExy7IdnfYDWXmejShDqAwMBoP1++v5u7+ev1v5WjBHWr03nSjFYZVIWrccrL2X4e24cdMxedrc3hu3ZLls3bHL4XCU1tNgMHgw7XA4tu7Y5dmI8rD52NLjAAAgAElEQVQKlT00/uwfnqz+w/iqZjt9pKZh3ISicROKqk4BCHrSdU3tO3fujI2NjY6Ojo6Ojo2NjY2NjYmJ2blzZ11T+5AXDwx2w3VN7Zl5xes2RM+ZM2/OnHnrNkRn5hV7rz+TYav3xq3J0+beuOmw9zoEprqFktaVXuZKL3Ol13FFnbSStu1kGObQeRoMBg+mGYZJ2raTiyh76iNDCJUN+Wdls51+8Q364afqqR9Fc5hVXOUornLclrDlxV/m4Eir90afzKmpqUBa4JHnjr6s/JLly1clJCZnZhccKT9+pPx4ZnZBQmLy8uWrsvJLmjv6vHFeAmwJpMWhFIdVEtLqusF03XBw7qMdk6fNvdGHJ60jDTQYDB5Mc6TlcDg8+5HBhcqG/hPTTv96TNFPfrOD+uF74yYUVZ64sjIyftW62BPftQ4ybB2va509Z/70z774+JNPP/l0usyfTpv+6bTpIV/PrT7T4q0ydPZ7r3ZqpAUxLfDIc0ffzt37o6LicgsOx+489eHi0898XPvM1ONvzz66fOOx/VmlUVFxO3fv9zhskWNaN/puTZ42t492CDTVdUNKWt03mO4bTNcNpusG00czBNI62khr2nr+1IXqby4XvNyc9eyZQ8uqzzXpOQoMBmPNkRbDMJ791OCyHfoPTTu9KrrkD+Orxk0oOlzTZ46MyywqzywqD1+38Xht22DC1uw582fPnj1jxoxdu3Zt3749Ojo6PDx85cqV69ati46Ojo+P37x586ZNm0K+nuu1MtxM0actW5JczbyuqT01NZVVaDBjWiUR/hRRPhHWpEByEooKzBic0uqwNdTPP7RSI1lSIEVRwUlDX1rBGQGk9uWLWmnywSfQrrK3nZVfEhUVl1d84rNVZ56YemZeTMu+kq4DpVfW7Wh81njw3dkFKXsPR0XFZeWXePCkmuu0eNJiBKDqRkmrj2bPdDCcT7cznT0k0qpoopUOz2v8W1ztn5Jbn8hoKTgT0lPxtx0J/5wz59XweW9Fhb9sK1+JPQoMBuvx7UBa4yYUHa65sTYyNrOo/GRdY421/kDhkWUb4o+f7Bw02Joy9eOQkJAVK1agC9pOnjy5devWpKSkbdu2paSkJCcnf/jhh94rQ0pKihKGOJ2vqLQuX9mSmNTQ0OAeaaWlpQ0taUmtA1MqTT5+phKVvSUR/lRgRrPdGuonUkBAKt1sp5MCKZ8I62DUIjWYUi+hs5B+phKVZHwVaJR+BrkKJRH++BNVmnxwUJsUKLlqSBVkcCYm82xd6praly9flV94+MtvreM+qP3756far9x03OpnWYZl2eJjrX9+bdc7Mw9kZBYvX75qMPs2R1qdPczpdkZgqj6aJ62em+zRVsfRVkd5i6O8xXHxKmn2sKqZRp1b2/X6ljNjDrDvVTHrThezZ2ex1le+/OK5mYunvDgjjkuTnfyR7KiqEtPDARnIFutXPhRF+X9VQstTNtNVzfTeUP9/JuF3oTnoSIM/xdoA+bG4M8oOV80NDPasRzdpcWuzymt6Vm+IySwqrzvf2nyx83xLW8V3tn15h5ZviK852TE4sDVlytT58+evXr06LS1t165dubm5Z86c4XirpqZm+/btKSkp27dvHyrSupKXX/v737e88lpDQ8OmTfH680zcuiMkJGQZUSEhIZsStg7GFU8NVoulcIThQsTFyS4IsVWafJwDvK5okztWjfQo4z3WUD8kApcaLI9siVXICBCrbw3145J5rQpSk0hLs44oCqcGy3dJKuWxumTmFSckJifuqTV8VOP/wbFnp1ZMW1b1vDHrvfmHr17r6+/rfzZo929fSFi8LichMTkzr9jbDSiYI62LV50oxWFVz02etK7fZMtbHEeanb5AJK3jLTTq17ecGWthJx1jcyoXsSf/Wpj631Pf/9tMU8SUE+zsU6zvLMuqfQUb1s6SHXV8S/DDoVbudUaoP0X5zyqlj7dkvEFRb2yhhe1qr53HlpoeJvV4MSv0vJSPKaNFsb3FOsvHf1YpfbzU9HBABnJG6yyf4PVcGn7Xcey/zooI57XO8iGWBAzW7VFMWhxmHau5alofzWFWy8XO881ttsZLJ20th6qse3JKBw22pkz9ODQ0dNGiRXFxcVFRUevXr4+MjMzIyLh06RLDMFarNTU1dQhjWu2Hy21B718MXewSaa1c9W1ISEjpse/mEFV67LuQkJBlK1Z6/aKnBmOn/0oi/EXS4gZvJKaSFMiN2RkBPKzwW2jZKC6GT1RONFCrRHr4s/MlSQ1G2BE5lhKjO2IV1EJ3XqqCouXdjmkhVwGFRaT8Alx6ri7rNkRnZhd8HH7U//3yxwJL/SYV/GnCgV8+k/bwhJ31Z8+fOtP4+xdi73oi+pUp2zOzC9ZtiPZ2AwrmSOvCVZGmylsc11HSEnYc1iKtE6204OUFjT/dw756hK09+4XjhH/i+t++7Pf7Od8sfiC+9ekMJqCSebeYeWzGnsSyE+hRIVJOftQHnbkPfmMSRfmY9rfS+0P939jiPET2+tFQ64lW+kSZ6dFJGSda6RNbginuBWLxkC2qX6G4E0VOQpAo1PSoPFFwpDwT/5Ayen+ov2zLiVY6chLlLFurNcTHufFEmelRPgEY7IZHMWmNm1B0rKZr1bqYzKLy882XWy52Nra22xounq6/UGs9W3XCevDoybTM4mUb4r47eXHchCLNDB/ASWdhpkz9eNGiRWvXruXiWPX19RaLJT4+PiEh4cKFCwzDbN++PSYmRj9pffFliNLkQ1JSUmh19fb2trW1NTQ0xMbG6CxDSEhI0aGKokMVRqK4NCEhGsUbYAs326UjbmqwMMbjSQv5kJWSFkpXKqSlgi/YocCF8qP8oaAHjkKSAikq0ITOaaIDSig3nygpNg5TvFcFqQcQ00KqgJ8ezQigkHCjh+oyZ868I+XHn/0oz29ykc+7uX98de9dT2/73YtbN23LqztV8+Hc9F88vuF3z8U88o/4I+XH58yZ57Guq2WBtA43i7CFkFY/K2DW4WbHhW7H5Glz+/rlNzpxn/W1F2jB41ZX/Cmnr75hPl0xrmjjz997/McFZcdqL9Dz1m2/O7Lvke3MW8duPRl39cMZYehRtRess339H/X1n11GS7dLbFnk/+ZW/OtHF1mFZFGTcBfK12QRstoajKZHnPEmmoxsMRPrbF//2WWSY6MmOesSNYmSJhMLqVIGMFjbo5i0Tp5tWbkuJrOovP8m/dGUT194+W3/x5+xnms9c/7iQ89M+vX46b81BBaWHUs5UBS+bmOtTddNf25/kk6Z+vHSpUujoqJKSkqqq6s53jpy5MjatWu3bt3KMExlZeXatWtdimm5hFnNdjolJaWXKDdIKzu/ODu/+HWiuDR6SGsgLdxsd5G0VGNaYnBLZfZQlkZiDzGKav4yq6CM9HDnpKosQ29XgVA8PTEtpHh40rKG+qFBL8/UhSOtp9/PeGRi5r0vpv3b44k/HBP3bVxR/ekTn8xPu++5uAdfTXr4H0mPv5MsI63mAXZdLff1OyZPm3uh24lSTtLql5IWt+9wk6OVSFqnLtKcy6z2JxbtzSpbQFc9d3HXj//k+8j//HPiU5O/fDJ4zrhJM3/2/tmfhrD/TL/15Pruv078XDjq1EX61CHTmEmmOb7+cw7RWYv4yJCvKesifeoinbXIf2Ky8wWepylqzCLrqYv0qYsZEymKooLnLPKnJmU4M08Opij/OYeQ0yUH8+llzpjoa8oSznjINMY3eKIvntuyxEysc3z9J05yFpJzzCTnGWMmUWgyoRjIdjDYZY9i0mq200vWJF5su9J/k16wZOWqNYnjn3vtxOlG67nWp9+aZ3hr5e9eiS46WJyef2zJmkT9ebr3STpl6sdr1qyJiYmJiopas2ZNYmJiQ0MDwzBpaWkrV64sLS1lGMZkMrk6e6gfs5qlpLV37z6ZBdJav36tzrOHhITsO5C170AWmbT2Hcjaz0bpJC23W7jZLiEthK5cJC1JgARdES9bJqW6NshdRrGqRKoQKYADjzK4GI/z3kyRb7xRBbndj2nJFmnhSQsfehxIXbjZw/fnWP7zuW13Gjb99C8xv3g8JmpLyfbdpX/8+ya/N1Mef2e34Z30oJAD2NlDL2FWM09ard2Ow00ibElI6zBPWoe0SOv0JZrzsTPn12z6ymF9k877pd+Lz1OPfkhF9VIb+6mEW1RiHxXZQa298Ksd3Xes7h0/4RPhqNOX6OzF/mMWZ8z19Z97hHttPX0p4y1fU/a24DGLrdmL/d/aRqPpuUOEjfwh0jTb+Nm9yRmqu3AIlX2JPr0teMxi6+ltweixsZP95x5Ry8RZcqFIQuLYyRRfNitXwdOX6NNHTGMoaW5gsCse9aTVesnef5NeEr7i9beDH3/mHzUnz5w617pqQ/yvXoq8+4U1BwqO7Mo96hJpcZ+nrpZkytSPzWbzmjVr1q9fHx0dvXbt2sjISIZhzp49u2zZsv379zMMEx8f78Y6LZ2Y1WynU1JS2rTU0NCwdq1ZZ4YhISHcQ+G/q2simEujn7Tca+FmO0paaMDD1dlDlZiWxBoxpwExisq8oSSBinisUSseOpPozSrw9kxMS3Odlufqwq2IX5+Q/5NxUT8dF/mzv6z7j6ciX/94W8CXu/zeSBs/yTJ+Us5T7+aaYg6qrYj3BmY1I6R1iCetw1jSOtSkTVp1l2nOF69klpTOpEv+e3XYY9R9k6jX46i346j/3UVN2EpN2Eq9upF6djX1zDLqycVPv/mZcFTdZXrjZBFZ3posxrRytwePWWLNXeL/1na67rJ1nm/wRv4QfiPnjLd8TbmXrfPQ+NPkDOfe7Uj/9jXlXqZzl/iPWWJFCyDNh647YhozOYNLlrsEE0h7aztdtz2Yz8Q6z9d/3hFnRbhSbZwsbkGSidXk9oLB7nnUk1bThQ579/WOK9c6Oq+0tXeUV5+urWvelhTx02fX/stTa/bmHtqZfcRV0nLDxilTw8PDKysruYc7xMTErFixoqamhmGYNWvWpKamMgyTmJjo7RXxDTpkNn+rM8OQkJDr13quX+t5avxzqampq1aueHXaipmLlj3zzoRnJn6wcuWKtLS0p8Y/x6VxibQGaO7pANzTs6Qjvc7ZQ61gSaXJx1tPsbKGRgQ7b5D0M5WorbJCaqoye4gEh0SmkW73/oO4cMXTGbpDrwIXkFO799CTdeGe8pCbX/ryh/H/6mP+ma/5qUmJJYcqyyutb07PG/fPgifeKf1gVnFmdtkgP+UBJS0BtuSkxe3TJK2zbfTZNrq+7cqVq3E9hx+7duDOOwwzqFdXU1N3lJ1o4vbqsHW+r//8cjp/if/YJdazbRlv+5rytwePXWLNX+L/9nYuQXA8n57fyDnjbV9TvpgPrhOICWTHYp3xtq8pfon/29udiZV/z24PHrvEipacfx0c30bHv+fcEv8ehUsGBg/Io560zre01TVcPGlrrjp1/shxW3GF9bu65v9+/ss7HjdT/t/uyz44OKT1kXFKWFjYtWvXuBVa0dHRq1atKioqYhgmJiZmx44dDMNYLBZvk9aWLUlbtiRt2hS/aVN8bGxMbGxMVNSGqKgN69evXb9+7dq1ZrP52+XLl+rMMJrXfff5cE8ufXkbfcbe+eqyz//8iYl7ntZ99/kIyQbjonPBKiRewvGWS095ULv3UPRg3LiHFFX9XGpBI6QKkme6inQytPceCqUSn6YhrylaBfHK8iEGeZDPc3XhnlyalXf4pfdjf+m/+ol3t+YW1Rz/7vxLHxSMeeVQ0MzD6ZYKjz+5VNMy0uJgS0Jawo4ynrT6b+JJq76drm+nWzrrrnWuYTP/8MGXb1DjI6ivsimz9Y+fx2cfqqttvBYSn/+DCPbRLPZH8ez3t7Pj35jBHYXYusCPoihqrB/fvfxMhTuCx4ZZC8P839nBJQjexKfnN3LOeMfPVCjm47+gXJa5LIGYj4qtC/yC33nPf0G580TKv/U7gseGWVXOKG7Z9B6lngwMdtOjnrRsDRdP2pqrT50vr7GVVFjzj9SeONN015OzKf9v73h81eCR1kdGk8lUVVXFMExtbW1kZOTq1as3bdq0bdu20NDQFStWREVFffbZZ14lLa96586dHGmtL9hx33t/ufvtMJZld+4cvD7gfP47/lGfwmQiH9PCGJmBIj7UdLCepyUGaSRQoj51yIl8d6S3q6DnKfxcdfAElhqsuwpeq4vwazz5pes2Zb/3ZerfApNffn9X0JeFazYey8o95KVf4yG7/6aTtMqaRNiSk1YZ50YN0mrooBs66Etd1f1nPrq13fehj+KpVzZQ4dVUdD21u5dKuEKtq/u0mn3iIEslXr17F3vH04uOnWzljuK80BmW9F94lD4Y5j82zNrQkfGun+lgB93QQR8M8393B93QYV1IiF7yiVWTCQl2BFPvZaBnVzGXj/+77/m/u8NZBvRvww7JOq2FR9FjM96lgjd30AfDnNTIl1+WDAx206OetE6dbTlubSivOVtaebrgSG1WyfGa042P/GPOr1/59tevfJueXTI4pDVr9hxubRantWvXrlq1KiIiYvHixXPnzp05c+Znn332+eefe/PXeLxr7K/xDCZpedbc/CN2iBi8Z8RDFdSr4N26DNEvTBMsklajE6hUSKvRUSqSlvxjnfusb+qkmzrptu5jNwv8Yr9+vLah+3tPzqe+LqE2tfymkJ1Xy35xgn2khP3BHvbPmez3/x6xK/sId4jU1lA//9AKujjc3ycwmIskN6VwNOMfWqFMjzojwM9ULM1HLUFioGZudKIT8IMTO+nicP+AFNku/9AKuikl2CfcKj2jJG5MPgUYPBCPbtJaG7dTp71dkuozLSFfz/2QKO/+wrSXvXPnzpiYmNjY2NjYWG6uMDY2duSSFhhc19SemVe8bkP0nDnz5syZt25DdGZe8VD9Ynr/TYYjrdJGJ2zJSYvDLI60Woik1WKnW+x0W9cJ5sDYmPkvtNjp3NKq37y+4HszD1BJHb+wsD/OYKkN9d/7dNdvJq8orG7g0oPBYLc9ukkLDAaDR4E50moRSKvRUYaS1jWetEobHSVapHXhCn3hCn3pSjud/9cTmwNz90VfObXvWumC+G8eiwif/sbStAlLts2Lsxw+eYFLCQaDB2ggLTAYDB7mFkirpFEMa12TkBaPWZqkdamL5mzvLOlOefJS8l8L1j9VtG1y3cmjwi4wGOxBA2mBwWDwMDdKWgJsSUhLwCyBtG7SeNJq66bBYPBgGkgLDAaDh7lv0hLS4mALR1oNjuIGVdJauWbz1V664yoYDB5UX+2lV67ZDKQFBoPBw9YCaRU3OEoacKQlYFZxg6O52zF52lxaQVprorZe7aXt18Bg8KD6ai+9JmorkBYYDAYPW9M0M3na3OZuJ0pxsCUnrWIiaeUXlacfKLraS3ddB4PBg+qrvXT6gaL8onLPfi4AaYHBYLCnLCOtYiVpCTsONjiauxyTp81duWaz4MiNKZbcsqu9NBgMHipbcssiN6agb0wwGAwGDx9Pnja3uctxsEGELQxpHWxwHDzvJK0hH1fAYDAYDAaDR4qdpHVehC05aXGYVQSkBQaDwWAwGOyiOdIqOi/CloS0BMwqOu9oAtICg8FgMBgMdsWTp81t6nKiFAdbUtLiMUsgrQQQCAQCgUAgkA6xLIuSFgdbeNIqREjrYxAIBAKBQCAQUV1dXQJpFaqRloBZhfUS0mJBIBAIBAKBQOqSkFa9CFsiaV3tZwXMKgDSAoFAIBAIBNItlLQK6kXYuoqSFodZQFogEAgEAoFALglDWvWOQixpFQBpgUAgEAgEArkiGWkV4EmLx6x8IC0QCAQCgUAg3UJJK79ehC2EtPpYAbPy6x1NV4C0QCAQCAQCgXRJJK0rTpTisOpqn5S0uH355xyNQFogEAgEAoFA+iSQVuMVR/45EbZwpHUOSAsEAoFAIBDIBclJ6xyOtISAVh6QFggEAoFAIJBuoaSVd04MaylI65wjzy3SoigK+1ozsc5DdAqbDyFzN9Kryb3ieari3hD2mnqwwMOnG3ipGCAQCAS6fSQjLQG2pKTFYxaQlkvpyYeQk7lHdfrZbiBSu6Z6rq+eouppDfeqr5az25cJBAKBQCCylKTFwZaEtIQdud4krQHGG/QXQ0/mg09a+vlJlif5X29ID2npASByelebQmAmwnkJ/+q54oPf1CAQCAQa6UJJKxcJXWFIK9d10tIzlKrtxW7nNtrMBmGLwWxB/uNltJBLotw48PTkCipkMfKl1DPGE3ZpDP82swHTHu7LVdrQXxHCdj0psZeJ0JH0nEV3U4tX03OymQ0UZTDbJBstRlwft8nfA/LDZMkIZdWTRqVsIBAIBMJIRlq5GqR1dkCkRUiAHcNI45zNbEA/6S1G8YOfG4ykwwBhSMby0EDITHu7xYgOZKOAtAhwSfhX5y5yUyjPq+cUasWWld+FppZ1yIGKJypJljazwXklOR7iL6uIXyTQEnudtP+5mgZfNhAIBALhJSGts+qkxWGWS6SlNvihCbCvWWQgVEtPIi3nUGAw2/ChMrRU2C2E9ITK6t4uiX/IWklNsjzJUivkwIW2iZ4zKncRLjpLvO7Ys2BzUzuFGy2DLYlqhjazwaORLTm8WczIPwhBWyySk1qMOASSFs5ixHGSnjQqZQOBQCCQiuSkxcOWhLRyEdJqcJ20NMYn3Ebs+C3ZQiQt6Td++bEoK6gVSW0IV2ML/dwjG7/UikFABNeGf49KWSPy6ZTtoIk+hGuh/zIREpCvJrYf6r+4nmUtMs2oBZ3UQQvZjs1aTxp9ZQOBQCCQIIG0GhDSysWQ1llH7llHjm7Sko1qyl3kjdoDs7ukhY6RAxnC3ZUEtAjF8BhpIbEPyWoeowX5V7LfaJGnxJZW9YzIdmXVyLyCPQWh2bH5kK+d2gtCj1UrCSaxR1FLE3X0g5aCy3CcpieNrrKBQCAQSBRKWjlnRdgSSau7j8096xpp6RnzlIMWefSVH0IgLQ4TdK/TUhZGMz2h2ATx5ZQPXmQKkbUGtulU/+WJyWiRtpjQXNJmdK4DwqXU2VbKxiGnYVUuh3ZLKrJVvpZtkeVA4TokoZyae1mWJdOJqyLRjM1sUCEq/BFAWgORbegqOoSn1pTNwg7j0oG8q4FcfcuAPyKH8/sCJzxpnXV0K0krx5WYFifsQIgdfQm4gB+tMaSFSDEGqGWoNr5qF0BdhGTY5enY9GQ00Qki2FPK1jMjw6nNbJS0G3blM7mtZBv1NJ0yJaEzEE5NJi1lMix4eYS0hPbCXA5XRKAZdaBSPUDSC7AdUU8aHWUbdbKwFMXKGsJIsQYz6SCjQWscsrEGitUYcWysgWIpo65iygugVUKsLEYXTmczsxTFutcLjLh6WYwspdkmw15mA0sJV9/GGly6EDbW4G6TsixrMSqOteCvEfbaudb+XOfU7Ocq5dRzIptZ2nQ21iJGBdw8NUFmA77lzQaNN4VqdcSPDhlp5aiRVs7ASEsTXPQMrlqkRfrgJxRA81z6cUEzmSZpuXouzX+Vs4dGi/JWTYPZxrIWo1AyfEr1gqmV1r2m08lMsvx1YpMsjSwx+Trq2DIYpCXegiiXKmjBOi33hYUPs0FjnDBSLKVpgzhyYCUfaVySHpLDSQIK6sMPVzy0ZdSqrOyssmFSiE8Y0QLbWPPIZC6LUVJlSaUsyC6OVBRdwsayZq2Lzg3t2KaW90wba8BRgqyQQlFJD4DBBbGMyj5m0wVAOpneYkTeAgiGom8Ns2EAbxNEakRFeAtgCinZIWSoJK0cJWnleIe01BIo/8VsdJ201IZYtQKQ0xPKRikkpiPOHqL/ep600FNLmotLYRYDWqopcfkrNpKhVtkyyubVQ1qEfNSaRXY5vEda3p09RGnKZpYMRuqgJVvXpcJJetLo2juqZMSFBNDxjAsPWBRHyQc82VdwC/5LOTotYjYqEthYo8qgopyRwWzBja8sy1rMyInQKAhPAypkr2uwVE70mA1yRDCYnc2oSWmK3N0P+2Eyk5WBz1YJkTKW0qZqlWMlMK3sJEgd1VpCRsbCRotwLK5xjMqNKh1SciKddcTlI+/MNsnXDJsZf60l25H2kZGW7M3o6hUU8pFxsIXf7h3SylEjrWy3SIswBHqbtDCsozWi60xPKBshGfbWeT0jOmGvTtJCnzUpf+6kxUhR0iFWLaWL4Ss8buIO1OwVmq2k2YWUYKcEtYGSlnSdOrnimsJ0avmTs4x6QYtFux7xeVqaadTKNjrFf1YShhnuQ1YWh3CftHDAoTlI4DFFJfKBi5NKhj1hGMZCpLJxXFo0I4yR8tgP3xpqOKiS3dCQFqU+J0iKaeHOKCMtC7YDGPCELTamWdKXxPCMgrTUmENWbItR2j8tkp4g3ysWiDUYWJsNE6yVx+EMrNEg36J+ozVrtpFIC/ny6f4VlJMWH3L2NGllk0kr213S0rlRGaVQO5D0jHji0+H1lIqQngwZeoCMxaEWFhE0gYZ8uChx9lAcpQ1Go0HSWrL5KEJKbdzUZCb9NSJzDyEfQhsqM1c7ixukJbshcACkhSIVSr0ugZack3HPf3cjDaZso1aEpRuas4fukxaBG7BhJBtr0BH+sZlJAwZ2xgo/xWNxATswRRUy5Advi5E1myXzhgNZqzRwKZfdyFeV8aG+gRdSTgYCbiLkpNolLPiZNRbttzjSkjQ1d0YbazCwZikMGZAolGSGjjuXRYJTXMgKE4UVCksEaDmsSKdWjRbWbGQtZpYyOLfLgqCaC870XEEladn47Vwyo8r3HFnhxViyKmlle5W09Ix/yn/J5OGe5COWyoiITSZL73pR5axFGOldGuzxZ/f0NA+5drIyExIrSyvboqfu2L06aQnbbsr21xSStzd+kwc0hOKRQphEUBIGpfLhq3OdFuaNSZ6SUyEtXStjzMRkFpcX7sTQ6GsAAB8HSURBVOhaaiMjAHQk5iAAt2Zccj8BNmpl4fFOcbiEXdCQhlGexqLMTagXeZzmcxAaRxxrZfdP8MWTjOLSfLCzhzYEPfHHKnsCAtyukpZyKb1qnIYrj5E1GBVBKa1l4y6QFov0atfJ240ryPLt7PxCIiUt5+eA9PsSNpBstiEBP9dJK9tDMS33gMmzmOVBYSuoPSRL6UcY47HVRA/XbAdMAk8/uNydMuhOScAsYTthFzlP7CnQDN3oZsghnlyhBRoWMhtYCzKeofEtNKaFnR5yO6blDmnpX0NDXIgjv19Sz8IdYYqKeEYOsLBBNSMfnyBExbjaSQO4/BYpaWHaQZj8lS7zR0dZ2Y147o3TznFX0WJCT8Biq+o6LYtYHuyqc+xqejM/xrtGWjjIViMtYbv4FrDImwsrN0jLuQrVgptqJH7bce0KSmO0HBZzUCU0stiYuHcEWniLBakpQlo7g1jKsG+ySFrZStLKRknL7gJpgdTl/fgHP8kDw7/3BdGs0ScL/ymMIy10uPI8aZFpSeeaJNejX7JVyRq3dNkU4xD51DgZFbijuvReuQgdgTw0noQWRkAoCUsJJecLKRuYtcdpabCTk9nAGnAtJvQELm4km6VVJS3h1getxpTlYOQxSD9pGXgYlbGssi6yHmKkWDN5JZ80Q3LHxjQdHxlSQpiSeNDFgm5fQSEiiO6VNKYWabGslLT42gXtZFnbviffarA7UKBSIS0bkBYIBLoN5FwVPiSk5XpMy7nTojelmvQHKmxm1sDFtISUaBDCyLIW4gCMy99mc866YkNfYnVQ8EJIi/DsA/QQ7hkTFrNkKEXbCj9OqwdRuPTCUh6LFiurznVKQ2JcIFDz/gBsONDldVp8S6K4aSBAIVp4fd3M5ZgWXwshFCqylEXeQ2T3ZLh6BYXTGS2Y1fcDIi3F7KHdkW0D0gKBQCCREqSkpTZ2YiZ3ZJ/Ig0Jaklk2t0gLvdeSPMCjU6tcnEYyHWNkWfXb7jiywYMRv3JLRh7o2CkZRxHSUrtAXEUEVnOOi8KqJsVKLz3jtIRp0RXQsvGbXzyuFkokPOXBZmbNFu2HoqE5GLFhGPK9h9JJVXSxmqwDWBRcgoYSNTub5h18aocIa/vIt+XiJ5d5ka+gcDryivhBIi0bkBYIBLqtJOUVYbDReAS85gygYpBTO6NLeyVDBa4MLszyaFVQNrUqObsFmdqT5oMJWclCX8i/NmkyIRokiW/JSEu92MJe4QFpTlZQzDnqWeWDERcTkk11cTytiMGIB+FIyzm0qz9fXi16Z+Fjse7EtKR0RQhBoTE8SU2JfZv8tAv8icysDX30l0UMXqJhJ2Wwzb0rSCItC7/C3UOkZVMjLRuQFggEut1kkS/vcI7NWktnMPeFeX+dluQhq7hC6nrwlfRGPKycYQaLdEYP9xq9PxG9nw692c0onbTCjOLcSQ1OapEkUMwekp5oz03tIff3yaYR0TK4Nk5blLebOU+BfdyaLIGMnNCW0fPwDs/MHipykJ+acN8DUnL88j73Iqysc0raeUWGlLQMfHxU+ax8kbRsrNGsl7RsStKyifvOA2mBQKDbRYoRglufRAYRTDxgEGYPLSxlRB6j4PbsIRcaUR+ZxFsIpVOrYo1l1KVCPwIXomBKiHxwqGSQBa4UK+JlQ6zIHBYFqnLHKn6DxdVxWvK0C4t8Po5/EjBuilm2YAgXYcL+RIEkGyxpCd3AI6RlQcJUaoeQVxC69DRaoWyy9hkU0nKGXS242UOuXGb5pRRBmX9khjppnUdJy6ZCWllAWiAQ6DaSylOLNH5eWs/KLU+TljjlhAuu6JHs5wiNWhOOAiHJH98gPbUaK4iAwjeF2k+y8OcTn1op20h6yoM0REQpHqGEZkh6wrhaY8p+n9GiQl24yy3/uSTsM9BxP3AuOYhPiV+fPgDSwhOeG6SlfhZVYQFdB2m5cwWFBBRrQH/FSKXMAmkJ51JyHpG0soC0QCDQ7SnGbmfS05nqaulm2fjBP0SR+xar8pNGOA7zNmkpHheuZ5EyKiMOH53goj7kcAvY5T8Uo/P3EM3inAsHK2YpQil/0YUrj2QAJj+5FMdVyolCXb/lovsOO+X6dPFcZOBQo2QLpi6sYpW31g/C4I/C/tS3ENokFVLrRILcWAuPl3dIS/loNJbVYFAxlIt7Jj6etKpYo3meHtLKAtICgUCjTkxhIRMUxDzzjAKzWMn4IQv5sLJBi/jhi3KVUXEIKu3fPcQ9JQvzK8Lq671kw56SP1TLo3z2o9oorj7oatSOWNRhK3ShFffAC+w9g2RyZfkfDcRcTW4BEJ+jLBSHz0rlWhBiWoRrjc9Zs2cq450DkPJHHtWiSh4R4QFgRtzPLejq22Pa7E6UwpNWFpAWCAQaRWLsdsZsZn77W5aimKAgxm7HpbI4H7FD+DSXzHmp32UmE2GJNDmmpfqAR1flyo/3YZYZqawQcr88I19mYWG+u1fEYnF9oo0od64FLpqI7sX+1jW+52Pju+5KDdrcuKtx0CWbPRRgS0JaWS6SVgIIBAINV2V+/XXdE09w3zL7f/Sj4uDgoS4RCAQa8XKVtLIGSFogEAg03MScP8+EhnJBLM7Mo4/iZgxBIBDIkwLSAoFAo1zMnj3Ma6/J1kyozxiCQCCQJwWkBQKBRqeUQSwnY/3sZwwx1A8CgUAeFJAWCDQy5dI9XCPLAxaTkMA8/TQ2c5gxBIFAgywgLRBoZMoTRDIcpaNeTEICk56O2X7+PPP558ydd6ox3NDPGMofVgkCgUa/gLRAoJGp25W0mOpq5s47mTvvFJiJsdsJQSwPzBhKfm6FF/ZRn4LMit94YVldz5eXH6H4VT4QCDTSBKQFAo1M3bakNWaME55ef52prmaCgghBLI/NGMpgS+1RUoKwz/jhfnxX7UlaWGk8XgsEAo0AAWmBQCNTtyVpMTNmuLrqy0MzhrJfDsY+CB5NrPzJZCEH4uMcJT/VrPIcdpd/rBcEAg2lgLRAoJGp24+0mPR01xjLW/cYSh+HjbKR8PMgRv6nPCz8o8PRKBchUiWbdsSS1kj5jRoQCMSyLJAWCDRSdZuRFlNfrzlL6IUZQ2zmRslvnJlt8t88UU4dyrYYKdZsZimVH3VGQQpLWhDSAoFGlLxOWhTyuUlpjQ3KBJqH6BQ2H0LmbqRXk3vF81TF9ZzLU4n1px94tiOoL3mpGLcdaT377KDPGCKyGCVzdhaj+gwgP3UoTPNxbIT+HLUz0MX9CLSU0oC0QKBRJyAtL6YnH0JO5h7VabKdG+05ECrS0yx6quAl0vJUG3JbvESZhIw8k89wE65ezKJFQzxjqJ+0hJRGirXYWIMUjGxaE39AWiDQqNMwIq0Bhgr0F0NP5oNPWvr5SZYn+V9XC6OnJPrLM8BmUSuS/o2ulp+Qudv11X+4a7ptSIspLNSLWd57Kqle0rIoSmUUF28JESxu5ZbNLA9oYQ7HGdZpgUAjSt4lLdkgRBjwdG7nNtrMBmGLwWxB/uOluDcHOxwSBjk30pMrqJDFyJdSz/BM2KVn5NZfPMJ51ZLpL6qrZ0ETD+QK6i8MNmdCb9RzFt3XS+wSuqRad5vZQFEG2WhsMeLeHDb5m0d+mCwZoXx60qiUTSppvRi7XefyLO8+lZREWhb88nZn8MnCms38sfxdh9zEouajIlhcTAuefQoCjTQNKmkREmCHH9IQZTMb0A9si1H8/ObGFOmnOWE01QQO98Z10naLER2PBoe03MhKZwH0n1ST88iZaPcK9S5Hbk9lkQjHYvuPDL/0HI75V9arycLXiCcqg3QKyuDsbxwP8Z1PxC8SaIndVdpxXU2DL5tGvZjXX9cV5qEoprCQkKvLMuo6KWLco035RheTcWjF3a6oJC2bWT4ziLlL0UZ8wAQIBBp28iJpqY1baALsa1bPmEogLecnusFsww/taKmwWwjpCZXVvV0SupC1kppkeZI1sOK5I5dOyhIbHNvysgPJxcamIRxI4fohdqPmqQnl0fkvazMbdEa21EsiBzaLGfnHZjYIUCQNj1iMOASSFshixHGSnjQqZVMKqRdjRufdtEjr2WcJuQ5UsuVTpBXxvFDSksW0CKRFURrP0+JmGGECEQQaORoM0tIYWnAbscQg2UIkLekXd/mxQqkICKU2+qrRjH7ukQ1DasUgjO6ujdzqGwmJydKZFSGlS4XEJtADW9gt+q81IQG5S2A7s/721Mta+klLKrWgkzpoIduxWetJo69sLCvWi6mudjGq5OmwFirZOnQN0rKxBnRZlUukZdTYInuGKggEGvbyFmnJBiTlLvJGzQHPbdJCh7eBjL7uSgJahGJ4nLRcwibNDDWTEY5SO7Xb8ITd7kZ50FKRO4DaC0K3VysJJrFO1HKTtNRyx4OWgstwnKYnja6ysSzrrBdjtzO/+53LpOWlsBZmsZQKaTknCg2szd3ZQyAtEGjUySukpWe4Uo43agSABx0CaXGcpXudlrIwmukJxdZgGtwYhOZPOhZXNs1/CRsJ211No0xJPiOWS9QwRWgBZZsQGkfX5SAWW1kebAHU6qWnlVREIhU0I7U9JJqxmQ0qRIU/YqhI6/33WYpi7r2Xeeop0Z99xixcKLqgQLSXbjnkpHywwgBnD7ldQFog0O2hIVgRr3zBKoYf8oEsiyUtRIqPcrUMCaO7RgHURUiGrJHRSE/IRD9DaOamZ7vOWqOJyYXH/lV7oefsWO4h9ChskdRek9sTC14eIS2hC6s2glukpQ5UqgdIeiy2B+tJo6NsTrnS3wZDshVanAZIWiy/HUgLBLoNNEikpQkuesZFLdIifX4TCqB5Lj2kpRNNNEnL1XNp/its1I9lyiLpOYRcANku/R2DnDnh2ulkJtl5dWITlu0IpyaXWbHFW6Ql3oIolypoDeE6rWEhtR8ZdI+0BLQSfsxHlonFyBqQ3/lxJlA+ZAtICwQaSRpK0lJLoPwXs9F10lIbHdUKQE5PKBsJTYizh+i/btOGdtO5uF0TrZQH6qcxzY7hUjJyztjEWLoiFEN2Tb1HWp6fPURpymY2W1R24TITCqPCSXrS6NrLssOGtDgYUrsKssdrYSWQlsXImm3ODNGqG90DJgs8Ix4EGlkaDNLSM2p6ibQwrKM1GOtMTygbkTMwd8DrGYwJe4cPaek/Sn/HUG4hXA7NrqXZ1JqNqYRvJagNlLSka9aVHVLYgdnIsiz23SB/cpZRL2ixaJ8lPk9LM41a2WQaJqQFAoFAHtLgrdPS3KgMMKgdSHpGPPHp8HpKpWeMxybQA2QsDrWwo7t+NvI4ablUHf0Fc7uQ2L2apdJJWoSzEC4EGfsGSFqymwNdJC0UqZwdTfEgeE3Qkj/JHff8dzfSYMqmu14gEAg0UjWopKVn6FL+SyYP96QEO7VSEeRuUeWsRRikXRqnyc1LrgWhAJoHqrUeYRf2crtxCbCFUbYJ4dRqe9Uuiloy9Lz62xB3FXT/Js9oJZLRWi8QCHS7arBjWuRxTn8+w0TYCmqPptKpT2F4JqMG9nSa5XFpu6vtrFZmzWSe6hhqpyPnSSi2WjurlV957dyoCHKIvhVa/GGunmhkaLTWCwQC3a7yLmmB1OXizwmDRr889QvTI1yjtV4gEOh2FZAWCDQyNVqJZLTWCwQC3a4C0gKBRqZGK5GM1nqBQKDbVUBaINDIFOXabwKOJINAINAoEpAWCAQCgUAgkLcEpAUCgUAgEAjkLQFpgUAgEAgEAnlLQFogEAgEAoFA3hKQFggEAoFAIJC3BKQFAoFAIBAI5C0BaYFAIBAIBAJ5S+6TVhcIBAKBQCAQSEvukNZQAyIIBAKBQCDQiJHLpLUGBAKBQCAQCKRPENMCgUAgEAgE8pbcIa3uzk4w+Da31WqFfG7DfMDgQfCw6q7DqjAj0UBaYLCbHm4EAPkMTj5g8CB4WHXXYVWYkWggLTDYTQ83AoB8BicfMHgQPKy667AqzEg0kBYY7KaHGwFAPm7nk19Usy6peMba/Pcisj9bmWuKyc/Jq7rQdKGro8MjpwaDXbX+bt/V0dHS1HT61KmS4uLNmzYVFhRYT5683No6JIWprK7Zlb4/MnZzZOzmXen7K6trhrwlh4M9RVoVEb6+ERU6TpkSSAWmdKcEUlRg2lBXHgweiEcQSUA+2Hzsbe1dHR1rt5b878qNk1MXz85fNS157z+WFQWsqXp77sEZ20zHjlk7L7d55Ozed0qQyodqdZivX1hKhC8ll29YtXCs+JrLSvF5XhHmp0wv2ahwSqBfWIXuT3tlGSRHVYcpKyBoFI4mOrt9Z1tbYUHBnj17Nm7cmJKSUl9f39LS0tjYePjQoapjxwa5MFmVjaaopMQ9eVmVjSXWS/uLjsVuScuqbBzyxhxyey6mxSGU5ikrwvy4ZMILMHhkeviTBORDzqero2NuZOHYRGNQ9jezt+1ZcSrhtejSNxIq3086+dqC4neXpX+zNLf8yMkr7e2yA4VRPyjFAwXzkNVIi/sarPgyjCUndK8sN2f6CgyxSaANMUdanVqjQ0qgNKvAIOkpuEyqw3yduXXKho+KCN/blLQ6Ll8uLCzMysratGlTeXk5y7Jbt25lWbalpaWlpaW2trb80KFBK0xldc3yDYnNXTfP2tmfvb7rZ6/vsnWyZ9puJuzYC5GtAZCW7O2hEPcZRPwiQumCMzB4WHr4kwTkQ85neXTRA3FvGU4+eqQjp5u2ZpbZgtNPBBU1fphyZmL44a/Str0yd51pfU7DuWZlbmmBlDjwY1wR4eslDlPLWYW0RELCk1Ya8kEelJISpGAo51EaMS3lga592qcFUpSvbxDfpNzAgbYwkJbMLY2NGRkZ2dnZ69evz8zM5B4lsGvXLpZlHQ7HlStX2tvbKysrG86dG4TCdHd27krfb95RUHOJrbnI/uz1Xf/27oFTbay1g80oObUrfT/+qJRASv51RehIfksrSBv5foskSwmk/MJVI6xD6gGRFuGDpjrMVyAtSTtCKAs8Wjz8SQLyIeSTV1DzxyWf/k/5ux/WB5y/UdbLNJ5pvLzy3IXJpa1BqXXvmipWXg4Mu/zck8b1lizMB91IIS0eUHCxKExMSx7cSgvk4mEIjQUqv2OrgI7uT/u0QIoKDAyiAiPCfP3CKtICKb+wMO5fgc9g9lDmwvz8/fv3p6WlJScnCw9tKisrE153dXW1t7cXFxUNQmG6OzsjYzfHZh3nGOvnU4rv+qr6nm/q/iPsfN7RusjYzYr0FUv9KMovMMgP7cwVS/2oceF8HNR5WXEbhShpRfg4J12pzp4PBw9s9rAizE+l4wttJyct9C09jNsFDNb0MCcJyIecz8yVO78f8/C9O/53fNXHCd2m1svdK7ceDqq6/HpO4ztbrRMWly1sfuKrC4/7LZm5Ym2eMjeEtFKCKN+IMP4rdliFJMCjCPnwR3HAlBLkTKPMpLMbc6Ay504kpfITNSXIeaAQ0+KT4WcPsaTV2c2BDrdL/h1bPaSkJK2KMD/5CjABHJ2n5tGQL2dKICXZrsz5No1ppe/Zk5OTs3///pycHIGurl69GhMTM2vWLJPJxLIswzDlR44QMnkAJzcK093ZGRm7OSGnGmWsu0Ntv/iquvDoGRxpOa/dUpS0KsLHiX2Y34XbWB3uxx+VEuQXzoVmh9NUvtxev/dQ8kWE+0BRvm3A4BHoYU4SkA85n8c/Nz365paHJ281TEn+++c75q4veLe265Wyyy/urn9tw4lX5pSt6PhroO3RB6P+OvkzzNyHlLT4qTGRJNDIE7rAXNjOBYqEIQSbieqBOmNa1WG+fr6yT1pVIKO42UMV0nJO1jjvZ8KElBQxJ9+ICuzyL9y9U+prUfyQ+URkSL6tSSs2JiY/Pz8vLy8nJ2fPnj2bN29evXr16dOnaZretWuXxWIpLi5euHBhYmIiy7I2m418Ik3MIhdG8K70/Vsyii5cZS9fZznGauth23vYvOKTO3fvUzlKSlrS9XxpgdS48AqNjcI9dp6YK9PJnW7YfdLSWIDFv0NE0hSXCwSmKZdbgsEjzcOcJCAfcj73GWePe+vAwx8XPLrqO0OSdfzO+vG7G8Ynn31+Q+1Liyqe+7jkbzX3jcm56641fxn/z3RlbvKYlshDCtJSYIQwnYcAEy4TXQeiOcg/VNPCwtLUbjx04hC//FxYd6VIEVHBfXr7+vmGpYX5BgWSY1ooXXmSgWD2UPB5my0uLq6srCwlJSUmJiYsLKy8vNzhcLS3t0dHR6enp7Msm5CQsGjRIpZlz549q3kuTarQuSJ+fezms5d7OnrYOz86+K8TM+y9bFNnb9LW3Zk5+SpHSUirOtxPCVXYjd3iOq3ANGfP58O9A1uq5UHMYlm2urpaeD3gmJY4Y6qclUeWYUoXYA7nQB8YrMfDnCQgH3I+D330zUNBa3wn7X3o3dSHJiU/HJA45v3tj39V8ML8o899WvrYu9n3xwY8/O0HY9+LeeuDAZMW5tY8faSlfSCaA2GdFn9soK8f5esXliI/lp8ZlMUGuJhWWiAVFMbPNqrEtORZ8a2k+VGv+aWd4gcOiGkJPm+zRW7YEB8fv2DBgsLCQofD0d/fz7JsSkrKtm3bWJaNiYnhJhDr6ur0nI5MFfqf8hATn1h4+GhJeeWRY1WHK45v2ZY27/2XCnIsKoe4G9NCMuE6htA9Bj6N6Klo1sWLF/fs2cO99gBpSaJWQos4PyOQNz/fXmmBwk0oitgyGDxyPMxJAvIh5zPrm8wHxu198LnUsRNS/1L7z9fqPvr43LygtI3Pflz0xOTixwMPjp9a+NSUvYag3RGrcpS5uUBanSlByHfLtEDnOl9t0tJ1IJqDBmmlBfpGVKQEUYFp8rVWGos60sLCqhWPzhImFuXFQJOh38N9w6rVZg9R42eCpDh125NWd2fn6draZcuWpaWl9fT0XLlyhWXZKVOmREdHR0REfPnll6GhoSaT6csvvzxfXz8IhRGMPrk0bU9GwrLPIt97cN77LxXkZOLSK0hLjEjxu7AbO5FDAlO6OyuW+omkIUMxN+ypSUPBAyStighf5N5dGWkJs6f8dyAOPLl4dVAK3IcIHtke5iQB+ZDz2Xeg8oFxBx54cvt9W176SeFrj1dMebJm6itnpk/aFfPsjLLnZxW+sa4mMNX68melezPKZVlJn6eFhSQ+jWJWjh8n9JAW9kBpzp1oDhr3HvKl5ZdViR+/HB7hHlgq2ElaKk9zQBfXi6GuFGGMcBZDnbTEb+DcqFER5ofeGSAL7wFpdXZ2d3aWlZS0tra2tLR0dXWxLHvgwIHdu3cnJycfOXLks88+mzt3bkhISF9v7+AURs2pX/ivefePX7+HhS0ZOSH/ioCF3chZ6PNimiFfGi9MGnpm9jAtkKLk7xnJmzAoRf6lB4lmOW8bhkXx4JHrYU4SkA85nwtNFz6fnf3AY+kPvLX2ezEP3WH5y+8Pv+FTbfStft/31KuGKVve2Vz1/BflEatzbXUj4iHXBNJKkQbYJPMMTm4LTCE/uEf2OPi0QMovLCUiEF2SpbZkihsXVBmOK4AzekFJxgVhl3z45EhLwNDRODeis9sfO3q0qamps7OTZdnExMTNmzdv2LAhPT19xowZ8+bNW7BgwZCTVlRUVOoXT5gm3jfz/TeR7RVLpUsC+Zmx8HGUoiNhN2LuWxT4figvnDBp6OHZQzD49vQwJwnIRzOf8nJrwEdZDzy257cBYXcnP/+7nAn/VfLsfx3+m8/RqeNn73h6WumspQdLSk4onxE/LO3l5+ZwpIVMUDg3Do/hbfRZf7c/Vl5eV1fHsuzevXu3bt0aFxeXn5//1VdfhYaGzpkz50ZPz2AWBuuoqKiUzw3TJr4w5K06VAbSAoPd9PAnCciHnE/n5bYjR059NT/3z0/s+fevX7or4cV78h4fuzXshZV5L4UdXGQqKCk50XbxskfO7n3DEwpHlV3q9h2XL7c2N4eEhHzzzTcLFixYsWJFSEjI119/vWDBgp5r1wa5MLenlZOGnr73EAy+LT38SQLy0czH3tbecK55b8axTxYmPvrOrEc+XPVaYPriZbnp+8ptdY0j5+elwaPNLnX7q3b7ta6u3mvXbvT09PX29vX29vX03Lh+vefatWtdXYNcmNvTwlxhU1NTampqN8wegsEe8YggCcjH4/mAwYPgYdVdh1VhRqLdJC0QCAQCgUAgkB65QFp1Hcz6pPTJ0+aCwWAwGAwGg/V4fVJ6XQeji7SOtjB1Hcx5uwMMBoPBYDAYrMd1HczRFhxp+fj4xCYklzVK4l1gMBgMBoPBYLdd1uiITUj28fGhPvzwwz89NLbxytCXCQwGg8FgMHh0uPGK408PjX3ppZeomTNn3v+gz8aE5O8uM94+KxgMBoPBYPCo93eXmY0Jyfc/6PP2229TJpPpk08+ufvX925MSG684jjUNPTlA4PBYDAYDB6JLmtyNF5xbExIvvvX906YMGHmzJlUXFzc0qVLP/nkk/sf9PnTQ2NjNyd397FgMBgMBoPBYFcduzn5Tw+Nvf9BnwkTJnzxxRcLFy6kduzYERUVtXTp0qlTp77zzjv3P+gDBoPBYDAYDHbPL7744sSJE7/88suFCxeuWLHi/wODlC2vzBCyzQAAAABJRU5ErkJggg==" alt="" />

  从运行效果种可以看到,使用自定义标签就可以将jsp页面上的java代码移除掉,如需要在jsp页面上输出客户端的IP地址时,使用 <xdp:viewIP/>标签就可以代替jsp页面上的这些代码:

1 <%
2 //在jsp页面中使用java代码获取客户端IP地址
3 String ip = request.getRemoteAddr();
4 out.write(ip);
5 %>

  这就是开发和使用自定义标签的好处,可以让我们的Jsp页面上不嵌套java代码。

三、自定义标签的执行流程

  JSP引擎遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法。
  
 1、public void setPageContext(PageContext pc),
JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。
  
 2、public void
setParent(Tag t),setPageContext方法执行完后,WEB容器接着调用的setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null。
    3、public int doStartTag(),调用了setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法。
    4、public int doEndTag(),WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法。
    5、public void release(),通常WEB容器执行完自定义标签后,标签处理器会驻留在内存中,为其它请求服务器,直至停止web应用时,web容器才会调用release方法。

  我们在tomcat服务器的"work\Catalina\localhost\JavaWeb_JspTag_study_20140816\org\apache\jsp"目录下可以找到将jspTag_Test1.jsp翻译成Servlet后的java源代码,如下图所示:

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

  打开jspTag_005fTest1_jsp.java文件,可以看到setPageContext(PageContext pc)、setParent(Tag t)、doStartTag()、doEndTag()、release()这5个方法的调用顺序和过程。

  jspTag_005fTest1_jsp.java的代码如下:

javaweb(二十三)——jsp自定义标签开发入门
  1 package org.apache.jsp;
2
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5 import javax.servlet.jsp.*;
6
7 public final class jspTag_005fTest1_jsp extends org.apache.jasper.runtime.HttpJspBase
8 implements org.apache.jasper.runtime.JspSourceDependent {
9
10 private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
11
12 private static java.util.List _jspx_dependants;
13
14 static {
15 _jspx_dependants = new java.util.ArrayList(1);
16 _jspx_dependants.add("/WEB-INF/gacl.tld");
17 }
18
19 private org.apache.jasper.runtime.TagHandlerPool _005fjspx_005ftagPool_005fxdp_005fviewIP_005fnobody;
20
21 private javax.el.ExpressionFactory _el_expressionfactory;
22 private org.apache.AnnotationProcessor _jsp_annotationprocessor;
23
24 public Object getDependants() {
25 return _jspx_dependants;
26 }
27
28 public void _jspInit() {
29 _005fjspx_005ftagPool_005fxdp_005fviewIP_005fnobody = org.apache.jasper.runtime.TagHandlerPool.getTagHandlerPool(getServletConfig());
30 _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
31 _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
32 }
33
34 public void _jspDestroy() {
35 _005fjspx_005ftagPool_005fxdp_005fviewIP_005fnobody.release();
36 }
37
38 public void _jspService(HttpServletRequest request, HttpServletResponse response)
39 throws java.io.IOException, ServletException {
40
41 PageContext pageContext = null;
42 HttpSession session = null;
43 ServletContext application = null;
44 ServletConfig config = null;
45 JspWriter out = null;
46 Object page = this;
47 JspWriter _jspx_out = null;
48 PageContext _jspx_page_context = null;
49
50
51 try {
52 response.setContentType("text/html;charset=UTF-8");
53 pageContext = _jspxFactory.getPageContext(this, request, response,
54 null, true, 8192, true);
55 _jspx_page_context = pageContext;
56 application = pageContext.getServletContext();
57 config = pageContext.getServletConfig();
58 session = pageContext.getSession();
59 out = pageContext.getOut();
60 _jspx_out = out;
61
62 out.write("\r\n");
63 out.write("<!-- 引用gacl标签库,标签库的前缀(prefix)可以随便设置,如这里设置成 prefix=\"gacl\" -->\r\n");
64 out.write("\r\n");
65 out.write("<!DOCTYPE HTML>\r\n");
66 out.write("<html>\r\n");
67 out.write(" <head>\r\n");
68 out.write(" <title>输出客户端的IP</title>\r\n");
69 out.write(" </head>\r\n");
70 out.write(" \r\n");
71 out.write(" <body>\r\n");
72 out.write(" 你的IP地址是(使用java代码获取输出):\r\n");
73 out.write(" ");
74
75 //在jsp页面中使用java代码获取客户端IP地址
76 String ip = request.getRemoteAddr();
77 out.write(ip);
78
79 out.write("\r\n");
80 out.write(" <hr/>\r\n");
81 out.write(" 你的IP地址是(使用自定义标签获取输出):");
82 if (_jspx_meth_xdp_005fviewIP_005f0(_jspx_page_context))
83 return;
84 out.write("\r\n");
85 out.write(" </body>\r\n");
86 out.write("</html>\r\n");
87 } catch (Throwable t) {
88 if (!(t instanceof SkipPageException)){
89 out = _jspx_out;
90 if (out != null && out.getBufferSize() != 0)
91 try { out.clearBuffer(); } catch (java.io.IOException e) {}
92 if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
93 }
94 } finally {
95 _jspxFactory.releasePageContext(_jspx_page_context);
96 }
97 }
98
99 private boolean _jspx_meth_xdp_005fviewIP_005f0(PageContext _jspx_page_context)
100 throws Throwable {
101 PageContext pageContext = _jspx_page_context;
102 JspWriter out = _jspx_page_context.getOut();
103 // xdp:viewIP
104 me.gacl.web.tag.ViewIPTag _jspx_th_xdp_005fviewIP_005f0 = (me.gacl.web.tag.ViewIPTag) _005fjspx_005ftagPool_005fxdp_005fviewIP_005fnobody.get(me.gacl.web.tag.ViewIPTag.class);
105 _jspx_th_xdp_005fviewIP_005f0.setPageContext(_jspx_page_context);
106 _jspx_th_xdp_005fviewIP_005f0.setParent(null);
107 int _jspx_eval_xdp_005fviewIP_005f0 = _jspx_th_xdp_005fviewIP_005f0.doStartTag();
108 if (_jspx_th_xdp_005fviewIP_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
109 _005fjspx_005ftagPool_005fxdp_005fviewIP_005fnobody.reuse(_jspx_th_xdp_005fviewIP_005f0);
110 return true;
111 }
112 _005fjspx_005ftagPool_005fxdp_005fviewIP_005fnobody.reuse(_jspx_th_xdp_005fviewIP_005f0);
113 return false;
114 }
115 }
javaweb(二十三)——jsp自定义标签开发入门

  下面重点分析一下上述代码中标红色的那个 private boolean _jspx_meth_xdp_005fviewIP_005f0(PageContext _jspx_page_context)方法中的代码

  ①、这里是实例化一个viewIP标签处理器类me.gacl.web.tag.ViewIPTag的对象

1  //  xdp:viewIP
2 me.gacl.web.tag.ViewIPTag _jspx_th_xdp_005fviewIP_005f0 = (me.gacl.web.tag.ViewIPTag) _005fjspx_005ftagPool_005fxdp_005fviewIP_005fnobody.get(me.gacl.web.tag.ViewIPTag.class);

  ②、实例化标签处理器后,调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器

1 _jspx_th_xdp_005fviewIP_005f0.setPageContext(_jspx_page_context);

  ③、setPageContext方法执行完后,接着调用的setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null

1 _jspx_th_xdp_005fviewIP_005f0.setParent(null);

  ④、调用了setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法

1 int _jspx_eval_xdp_005fviewIP_005f0 = _jspx_th_xdp_005fviewIP_005f0.doStartTag();

  ⑤、WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法

1 if (_jspx_th_xdp_005fviewIP_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE)

  这就是自定义标签的执行流程。

  这里以一个入门级的案例来讲解javaweb的自定义标签开发,在后面的博文中会进行更加详尽的介绍。