源码-mybatis-01-SqlSessionFactory创建
import com.suntek.vdm.gw.util.AESEncipher;
import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.*;
import java.util.Properties; /**
* @author Binglong
*/
public class MybatisUtils { private static SqlSessionFactory factory=null;
/**
* 获取SqlSessionFactory,只创建一次
* @return SqlSessionFactory
*/
private static SqlSessionFactory getSqlSessionFactory() {
if (null != factory){
return factory;
}
synchronized (SqlSessionFactory.class){
factory = getFactory();
}
return factory;
} private static SqlSessionFactory getFactory() {
try {
//读取配置文件
Reader reader= Resources.getResourceAsReader("mybatis.xml");
//创建SQLSessionFactory
return new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引入配置-->
<properties resource="conf/db.properties"/>
<!--sql打印 -->
<!--<settings>-->
<!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->
<!--</settings>--> <environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="net.sourceforge.jtds.jdbc.Driver"/>
<!--<property name="driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>-->
<property name="url" value="${url}"/>
<!--<property name="username" value="${username}"/>-->
<!--<property name="password" value="${password}"/>-->
<!--poolMaximumIdleConnections是空闲连接数,就是没有处理请求的连接,默认是5-->
<property name="poolMaximumIdleConnections" value="5"/>
<!--poolMaximumActiveConnections是最大的活动连接数,活动连接,就是正在与数据库交互的连接,默认是10-->
<property name="poolMaximumActiveConnections" value="50"/>
<!--<property name="poolPingQuery" value="SELECT 1 FROM VDM_VR_NODE" />-->
<!--<property name="poolPingEnabled" value="true" />-->
</dataSource>
</environment>
</environments> <mappers>
<mapper resource="com/ned/gw/mapping/UserMapper.xml"></mapper>
</mappers>
</configuration>
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfkAAAEeCAYAAACJ92zeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAGKZSURBVHhe7b1tkx011x6aH5SckzxPDlSdMbb3tmvAkMEws42JCTZmgBobB2KOeXtqZgwuEoqCqtT4rgNVJ4Tki80H4Bfw43Ra3a1uaWktaalbu99mfdjl8e7damnp0rrWm1r/6sKllZKPyEAwIBgQDAgGBAPLw8C/kkld3qTKnMqcCgYEA4IBwYDGAI/kr+yql95+X71071/Uxc++Kz/6b/3dheKagEnAJBgQDAgGBAOCgelhIEjyL63W6qX3PlEXn/wPdfG//W/8U1zTv9G/lQme3gTLnMicCAYEA4KB84sBmuSvFt77//M9Te6A9PVvLxT3zBlMHz39W/39/FTtT6JO4S11/HxK/Tm/i6TCtD8fPLzIPM5ZJ0jfz/u6n//4UZIvPfgEgjdevr5nFI/+6B/q778LQmw+/1AfdSBqVGlnajtdWQxADt7YahlmN3TuqbNibp6dvDWoEbh/8hzgohrf2VGXhSskn47hLnKWe0TOgoGcGMBJXofoqfB85Hsduqc6uHtnrQ6+X6ubT9fqjdMr6tKr/SezUuTP1fHGamtzqp49vZdMKJDkc7adc9KytVWSPJBdB+Mo2h89H6ORvDs+Q/zdiN7Fq3jy/ddvFDvbwKO0mawbZZ7mi3Wf5ItCOioH/+J//kb90388Uv/2jf+k/vndB+r//pcz3xgocvRYMd7F3ZW6ebZWrxyu1JWCkPe/Xau9R33z+Hk9RFdp5217kovkHJL8hUv55lVIfr6Kb5LrUYwPMT62gAGP5F+6+b5P3P/1f6l/unGo/vWV19Q//6f76v+6+5n6d5v31P9x7UC99F//p/d73QZcROv9yoO/cLlSDNfuFd78SR6S/5vjtYPQ9NlRLPxakQGr7dpTbdIFXn/qtup0ghu2pq5R4Xr391j4uSSfv3XKAvwW9otJ8l7YG5V33V+TMqlD/lVf3E9o/OR4dHtmDou/P2/GSHvXZCTGCdlTcq6/b8Yaw0vdDwbOyrURwUxjQFhjnkatiBC7GAiCgTlhwCP5i/e/9kj7xQen6l9f/Q/qwuOf3Wvf/YqH9Ys2oBCuHBSevCb5QsGtrq/U3meFN/9krdYb96Ov8QXYEksw/ForSptcGvKx8s+uZ8Zs2wtFQ+PANxb2T07rmoHQNYR8kHFcCI2tJHqXfByC5ZB88RvnHiz0bgjLJv/iu2OT+6bC9Snjef5cPbNrBep73Xl3vXSf5DFCz0jyTJwZgm/l6uOgwiIY8xasfP5aS1mX8luRq2BgKhjwSf5hsQ8e5N3/6eaHpQfPztMXbfgkX3vyhaLSHrwmfOyT7t1b3ipaMAY9MgO++j6S5PXvmG3D59rkWRMcaoSErnnV3NQ4Vqr13KuxVf+HuXbaaAh72nCxwnYYBYIoyfcdDxJ2B0YLXnjHkItdTc/25Lk4I+QF+o7PoSjOqShO6YdgcS4Y4JP8O/d6kbwtkLwkbxNbHRYGHiVe9MUMvzakmdC2Q97GUMAq/kPXQP9CxWsoQfjP83LIHE/e8R4xo4eR4w54/2jFfcfxlOOz5h4N13vediZPnpwf5jwCgw8abnNRKNJPIT/BwLQwwA/XF/n4nZP/1yH6na//Oztcv22SN+17YXjSW+aTfKxt6Amb/zfeu5N/RXYCNDlr+xpODmhEAISuKYLoRPJOjrkyHJx2gtGIGuwBkmePB4vSOMZAZWzY7aEk3xhtxgjKS/L+ePB5jGGGV9Q3LWUiyl3mQzAwPQywC+/+bVFo92/WReFd4dH/+/ceqv/z9Vvq3xTE/9K3/x+r8G4oktfPcZR7RpLnt01MdEP2MGRsF2KZa0wPUHvaHT1feJ+/QHEvHSP54B74HJ48moqx+lfKwI1eUCTvfj8Oyce28AnJT09ZCoHJnMwRA/wtdEWFvS7A0/n5f3dwR/37u/9FXTh1PfsyZ09soRuS5F3yIqrkDeEGc/IIqB1CpfPKJBhCYXfnGpH7Rirb8Zx8hnA9aiDBWoaBcvLEC3pKwi6uHYNQvWeQWWkHlry8YsJY5IeLMx5mhOSFUOZIKNLn6eF20JfhGADky8lrxQrJzFfG/gtQ6t/oMDlJ8ry2ser2snratFv8fWa/6Q0U5ZHXkNeoos9CqszzheuJqm8gN9MvZ7uhXV1vChjRLXzgTXjUeKi38JVkrKvQ/TfZ8XLyJhJi98PCB7vwzkSQ7H7gOItiBqZEpKo+YcfN9JSsEJ/MyZgYWMBrbf1941joGFZax/fJg+p6dI+7uz2tybMCQnL3iruhevoa4SHD/dXIG+vykbydRqgKD7VsUS8T9gvdcdC20YCeOx7yVbuGSP3IRcprbUl8JJB8Gz0w7wXQcx2qprfeH4BhJvvrhUXZjqls5dmCvzEwcI4PqGGEmcWDmoEHVc3j0O/FH2OxyjOFJAQDgoFUDJzjo2aF5FPBMsnf1+F65+wCMc5mYJyJsp7kepK1s7i1EyT5BoTF++xfevt99dK9f1EXPytellN89N/6O+w99fMAr5D8POYpTAZwb/wSxiRjEANAMCAYyIUBHskv0roTks8FojHaaXLokrdenOcxBp7kmUKqS8XAOSZ5AfVSQS3jEmwLBgQDgoEKA0Lyi4xSyAKXBS4YEAwIBgQDQvIS6hQjRzAgGBAMCAYWiwHx5AXciwW3WPHiyQkGBAPnHQNC8kLyQvKCAcGAYEAwsFAMCMkvdGLPu/Uq4xcPTjAgGBAMSE5erFcxcgQDggHBgGBgsRgY3ZNfr66qD65v1ONbh+qnO/fKj/5bf6eviSUm1rhgQDAgGBAMCAa6YWA0kr94eaUebt5Rz+9/of568DX60df0b/RvZYJFBoIBwYBgQDAgGEjDwCgkf2V9Vf339+6T5A5JX/9W3zPnyZ3W+eDytr9pYSl2Vj21qGUepzWPacpX+i7yGgIDg5O89spTCN4Qvr5nFI++Pt+8OUbWO7+eB1SU5DO1nQ6UAcjBG1t9rGr219BWRw0PfQpdyjG28fmZEsnXfSmO2J2WYcpbZ3FZSzsio/OFgcFJXoffqfB87Ht9LwXQ3TtrdfD9Wt18ulZvnF5Rl17tP5GVInfPf7+gTz1rzhjnPwMqzJxtT3LRliQPZLeN4p76PPpxSN4dnyH+syM+Lqi54xFsfmOtHENjiMkxvpNcW9tYR9LmrCPFIZwOSvLrIuQeysHHSF7fq9uAA7q4u1I3z9bqlcOVurJZqf1v12rv0brnpOX1EF2lnbftSSqic0jyFy7lm9dxSL7qv2OklPP4D/WRkEBPfdLf8JvkOhdcTB4Xg5L84esbx4s/efOW+rmopv/uxrvl57fDT9XvR4/UD2/fVdU1P2+v24BgX+9XHvyFukDv2r3Cmz/JQ/J/c7x2EJo+O4qFXytlymq79lSbdIHXn7ot3Z4XtqauUR6g+3vdHvRKS/IplT74LewXk+S9sDcq77q/9RiNp1n1xf24Hj1zPNpzNXNY/P15M0ZXMdvES0ZiHJlRcm5D4hWWY3ip+8HAWdleBDPNOKwx7+v7UEJHiF8U++QVuxgEYlQZDAxK8o9vve+Q/N4LO2rvxR11e7Wrbuys1PXi783OJfXWzmV1Z/VyeU2Tv+3h6zYggK8cFJ68JvlC+ayur9TeZ4U3/2St1hv3o6/xwd8SSzD8WitKm1wa8rHyz65nxmzbC0VD48A3FvZPTmuvK3QNIR9kHJXSd/PdLbFa3h15byRcX9znkDIWejeEZZN/8d2xCYlT4fqU8Tx/rp7ZtQL1ve68u166T/IYoWckeSbODMG3cvVxUGERjLlYO+X3iJFFfc9fSynrTn4rchUM5MTAoCT/450jj+RPD6oc/R8ff6nuFmSvyf3PB1+V3z3Z3C7J3yZ53YZP8rUnXygq7cFrwsc+6d695QmiBWPQIzPgrO8jSV7/jtk2fK7tIdcEhxohoWue50iNo1b8Vri2InlI3rTREPa04WKG7TByzijJ9x0PEnYHkQm88I4hF9tzbwg15slzcUbIC/Q9NIdYbYObpxcFnFMBS1uCp21jYHSSt0PyD1/bV/pjSF2H8rU3HyN5W0h5Sb4CoBMWBh7lM7SyO6a0W2Ant+2QtzEUsJxp6BroX6h4DSUI/3leDpkZrm/nDjN6GDnugPePFuN1HA/0ZtFwvedtZ/LkyflhziMw+NqUi61gq7ZQg1Hy8gkRQCGtbZOWtJ+GsUFJHgvX//Leg4bEOSSPheu3TfKmfS8MT3rLfJKPtQ09YfP/Rhk7+VfgSZLXcHKgFXyr/HGCqA0hL+QdD9fDrYmOsRCMRtRAD5A8ezxYlMYxBvy8NEryjUFojKC8JO+PB5/HGGbwor5A7l1IXkhe6jBmi4FBSR4W3umcfKonjxXeDUXy+jmOcs9I8vy2CSuuIXSEWL1rTA+wKcZq28xH8riXjpF8cHtcDk8eTcVY/UNIjiJ59/txSD62hQ8nefHkxUNM8xBFXvOQ16AkD7fQfXj1mvr18JPGk/+myM/rjwnP62sfFb8x/6e20A1J8lUxmiE9okrekGowJ48AxGmbziuTiysUdneuEblvqujKy8lnCNejBhKsZRgoJ0+8oMfkoo+RgjSeJ+/XNDjV7+ycPBdnPMyESF5y8vNQ3EKwMk9cDAxK8rpT23oZjhlwvpy8VqyQzHzS8V+AUv9Gb+0iSZ7XNlbdXlZPm3aLv89O3mrDSKAoj7yGbNlCn4VUmef25O1qbmxXgumXU/VtV9ebAkZ0Cx94Ex41HuotfKUhoqvQ/Vw1LydvtqXZ/bDwwSZ5E0Gy+4HjLIoZk1JAxizV9UIcXOKQ380HK4OT/Lxea+vvsyY9HWu/dnyfPKiuR/e443ujbcPBKwoEVe/uPnI7jE94yHB/NfLGunwk7+/n1rJFvUzYL3THAfKeAO54yFftGiL1Ixcpr7WFv23wkUDybTrHvBdAz2eomt56fwAYH/miHdknP9u8q5DufEh36LkanOT1AJd/QA0jzCyFLDNQqNU8Dv3K3KGVANzhIG+8E8IYD4Mi+9yyH4Xk9SCWfdSskHxuoI7SXh2uPy5elTzK80cwBOXd9ednrs8Lps/7OEcjeSP49eqq+uD6Rj2+dah+KvbF64/+W3+nr81zgoTk5zlvroI/n296a4v3yLD+CMbHEvAkYxADagwMjE7yYwx6+88Ukt++jLenMJocevZjcbfX5znLW/ouuBAMbA8DQvLilcw0WrK9RSEKR2QrGBAMLAUDQvJC8kLyggHBgGBAMLBQDAjJL3Ril2KFyjjEoxIMCAYEA90xICQvJC8WvGBAMCAYEAwsFANC8gudWLF8u1u+IjuRnWBAMLAUDAjJC8mLBS8YEAwIBgQDC8WAkPxCJ3YpVqiMQzwqwYBgQDDQHQOjk/wyX4bTfUIEzCI7wYBgQDAgGMiFgdFIftmvtRWA5gKotCNYEgwIBgQD3TEwCsnP5YCavK/19N+Cx2t/Lm/Ps44+LY/onUu/7cUzxz6nL34e7tLb7aaIz4fMu8lmqDmQ5yx5fgYn+TkdNZtXGeYm+fYd4xCg/jGo9jGz21nQ/hG0U1fe1THC7glz2+1zbzyVR8FaR8iWxlT6fKL9yNR2urLcrszL/nhjq2WY/bXFGKbS5yddhvIMkRmNgcFJ/uHmHfXXg687ffS91GTu3lmrg+/X6ubTtXrj9Iq69Gp/4PdWyhEFzGsfV4LuaWH1WM356Z7y0sqnGyHwFg9tcPDu7z9Xyc+pZTXsMbLdj66tDDdgrOkxNGfS82UIcZez7eR56GCkJD+jJPntG7oXRsEUf96T5TbE3Mgztr6rYVCSX6+vquf3v+hE8Now0PfqNiBYL+6u1M2ztXrlsDirvjgWdP/btdp7tO4tPB4Jd19kvPYxkq88Bufc70vVd393UPr9F7+QPFuGJeGkGlx5PUQXd3nbZsthSOUuJN9bF05yXofE0IyfNSjJH76+cQj+5M1b6ufiaNnvbrxbfn47/FT9fvRI/fD2XVVdu+8ZBLoNCLj1fuXBX7hcEe61e4U3f5KR5I2HbEKlDpFS4UZIfMxwPQgtnh0h7SNE4YfLY8ZHbRRY4V/XaFiptk3wW3v8WCi0vE7IBfz+2ck9dfy8ME6a6ANXnnX/9H2mTSuC4aUsrD5X43I/lUdPPTuTrEpFAQ00Trg6wYBj4AcjeZZxGFwH7diMbN0oiSvD9toAMmeSfAgzrc6xa09a3NKYMuuQiSGA589LrPpGIc9BiOkAuX4ejJdBSf7xrfcd0t57YUftvbijbq921Y2dlbpe/L3ZuaTe2rms7qxeLq9p8rfD+7oNODFXDgpPXpN8oURX11dq77PCm3+yVuuN+9HXUia1XbjWIjOKriENLikxSL5W0LZybPpgEZh/znkCCVg5SkcJh55tKxnkdw05xowf1vi48jQk/1w9g+mJ4jnO2LAwKhpapQwqkLvvJau631H8IAWBXvQG4JklX8s4Ko2OlrSgkeesFU9eEHM+BvdPTuuagdC1AWTOIfkEzDgGUSGX4yM3XealgLA1Q83Vc4Dn+ndY1G7YVFOa7kzRs/Lb7cp2UJL/8c6RR/KnB1WO/o+Pv1R3C7LX5P7ng6/K755sbpfkb5O8bsMn+dqTL5SW9uA14WOfVO++Ilg/l1dZ/Ib4uaQUI3kq5F0rSODpRkmMDC/RoXUYDcDHj40XaxP+Lm18rWdvFoB/PzU/vtJA+swi+W3IqjBANX6Si74sTxC9lytfSPLAAw+1jRhTzfqo5YkaCqFrXvRkCzInCu/CJEngNzRvIUwhaTTeekPSKRyjZcbhZSH9vKQ/OsnbIfmHr+0r/TGkrkP52puPkbwNiuwkjy1qZ5FlInmyaAdXNo4yTSn4Cf0WKA8qBeCHChkknzg+PsnH8tsEOXJIfiuyMtXesX7jC90JC9vEwZYvRvLVs5LbdsjbyBkbV+gawPc2ZJ5MihhmGLUL7IhRPbcd15sfyctLCkKyy5LnoCSPhet/ee9BQ+IcksfC9eOQvCl8y0vyvicE26eL7ljhu5BXBUKD2yD5+Pi48qTJyt0yVZGOZ5gkkDzqnXaWVT+SN1j30jjkvMYiSL5Co9qGdQzm/418nJw9iICR13CSzypzDsk73j6CmWA0IhCuT11vUacCW//LIiUxMvLO56AkDwvvdE4+1ZPHCu/GIXmjxLikFFG2bCVdteMqQaoPCFi24SmZkGsoJ584PrYnj24XhPvf+5E8ajx19MJKrHaqsPfn0tn6xpZvwDiyQry8tgll1BC6n+oy28zaNNgUPHncS3cMQ060LIcnj6YDrP5lwo4QaV4inbI8ByV5uIXuw6vX1K+HnzSe/DdFfl5/THheX/uo+I35P7WFbqskj+TkoVeIerxG0QUKrFhVzqadUE6eKqZD83KpOU9OZS8jXE9t8fPGZ1f1WwvRkydBVijZwbqGol2OJ48aL3Zou5UNP+rRNSePKCXH0CCKLyn5xmoCsJRUyvbMECk617i1Gz4u2DKPefIszDAM6RCmuDl5Yl5MHcexrhNKmQfJzScVW0+ZrLv2bVCS153c1stwjACy5+T1Vit74WHVrl6lbK0QnH3r8bCp2cLTeulWO8Hq+ooAmi1AnhIAL8MJVPvaEQK2EuV48lb/YuMz4XZvmxV4DwC+jcgnO2yHgtnK5ipMRJFnl1WX6nrsZUZ+X5Pw0+CJ17Y/J7WhZNopCO6s3IaI5JtD17Bti7llHiN5xABFMWNC+qAWoqmupwzZlPFQxldpQOjKexjFOz8eaVeSO+/3DU7ys3ytLajOxfKFcI9ts7+d7ckDoi73cetwJ0U8VOGWvx8XffmKkyPFdxHkJnnHEKn3qaPvAbANFvg7uN8dU4pgbNpYQA0Ca16D++SzyqrLPnlQAV/LBEsjkDiERqIjNx8zdIrCer8AkL27V9wN1dPXCA85p8yjJN9Gduw9/ihmYL/QHQeVjLAdMG1dg5/KwI1WsLsk+UVKYgQIyY8QzpnLATXTBceSim/o9MF05d9DcQ6eU2WEmUfQAYuc263KsZpHVnHtVvvRA/vSr1FSB4N78mZxy1Gz/RZLt73W/Z65FcXMqVpejHIYQ1ELyW8Ft0Njsg7XHxev7V7EeIaW3zl+3mgkb4C6Xl1VH1zfqMe3DtVPxb54/dF/6+/0NQE0tajn5wHrcCT6qtNYEdhCFmg4HLst5S0kvwQdInvjt7U+lt/u6CS/hAUoY+AvFDc3K5XC28eOkPz2ZczHf2pfmhqLc2IIp8pHfh/HnpD8QrxEAXsc7CIjkZFgQDBw3jAgJC8kLykRwYBgQDAgGFgoBoTkFzqx581alfGKhyYYEAwIBnwMCMkLyYsFLxgQDAgGBAMLxYCQ/EInVixa8WoEA4IBwYBgQEheSF4seMGAYEAwIBhYKAaE5Bc6sWLBiwUvGBAMCAYEA6OTvLwMR0AoikgwIBgQDAgGtoOB0UheXmu7nQmVhSJyFQwIBgQDggGDgVFIfi4H1OR9DWn8qFl8Ycoby0RhxRVWXqzGnxeeE8GsYLYvhuT+XBganORnedRslrx9bpJv313vHy869gKpTsljHVfqHZ0ZuDfLPOSVTW9yBccYo8cCM8YdO0q3OuKUOp44r0wuYGfEM8aQpNQ8udVH4GZ//eu88Jgkw9xzIu1NsnhxcJJ/uHlH/fXg604ffS8F4t07a3Xw/VrdfLpWb5xeUZde7a+4eivwCOh57eNekXcKHefM7KEWYX2yHCT5yhgB52jr31pnxF8g7p2u8up+shxLHsw5g1jK2fYkZT8U3meHx/56b5LzzVwH0veRX4azXl9Vz+9/0YngtWGg79VtwIm8uLtSN8/W6pXDlbpSHMW4/+1a7T1a97aqeCTcfVHx2sdIHjlPfiilx1lsqGJkekRzVKqdzohnyoMj7+I3Lpbytj1JxTkU3ueIRyZmJjmv0vfevAXndVBP/vD1jUPwJ2/eUj8XR8t+d+Pd8vPb4afq96NH6oe376rq2n3PINBtwEGs9ysP/sLlinCv3Su8+ZOMJF8v9CrkCU9Oo/KP8ChYZrgehCHPjpD2MVJBlF514psO0VZKH++/RRAZxumdMteE7es+2F47WND0vVYfjXzssGyw3xUmYErjb9CPRlagrbMjfX89B+j86+vQ6OLkpOPyaHDOwARG8nCMqFKPys7FDnpUcC2X9ho1foDD4r5Kvu2Hi9kLTJKPzXv1bDC/NbZCeKzuY45Ht2fh9vNmXSJjz55u6O6EiBGwDNkNSvKPb73vkPbeCztq78UddXu1q27srNT14u/NziX11s5ldWf1cnlNk78d3tdtQPBdOSg8eU3yxcJbXV+pvc8Kpf5krdYb96OvpQC3XeRWLtMoxYYkMpJ8rQhsRdr0wVr86NnSJMmDXGzoGXbOtvM4Cxmj3k+rSKFid+aE8JwqEnuunkEl6P0eIc9izA45Ic/w5ewq/qbPof5FMWHjjymPFEw0smG2HZWdL8v9k9PCaLQIzjKW2muUYQrqNLhYRH7HInnGvBusOgZRIZdjY3xQnjzZJ3eMKG7re911cA6iL+KlJ/FPCleFfjsoyf9458gj+dODKkf/x8dfqrsF2Wty//PBV+V3Tza3S/K3SV634ZN87ckXINIevCZ87JPq3VeKH+SQG6/QEH8ukoeevyGEWtECBe4VtZEkD/tPRBSyjZMieeD5UB5LiES9PhKyj3p5TBkY78vx+pk1EiyFZnmCqDy4mIDheo6sGbKr5wI1ykLXvMI7ahx1vy3jEl9ztNHQRKe8aAJm0MN2GBGXkMGKRKXaSET1fHw8CKFHMZvmoOQiCGln/nIfneTtkPzD1/aV/hhS16F87c3HSN4GYnaSx5SvsyAzkTyZ+8MVk6d4g+H6cFiQrA3oNM4QyduKD0t90PdC5VnOOSWzIAHhxBpqHw0pQ1x0ystH5MHGBEbyHdt2ZGdkhVXlh64BzIby2gC36Dx4NQfF2JJJEZt3hveM9X0L40GjcyxDcf4kJIbEdudwUJLHwvW/vPegIXEOyWPh+nFI3uQT85K87zXB9pGiO60MtkbyqeOMk7yZLywVQRE3aojAfLJdd2Dne52cdkVYsL0xSZ6UB2msMOs7vFy3TnkU+WHLQIKesPk/TE9U34OokCN/+xpO8mhEAISus5J8bN6DxmCteAMkzx5P1FEg1rSQ/Cjh7aUZHYOSPCy80zn5VE8eK7wbh+SNUhua5KvnzdmTt+fL2+oVzMnXBGWUH0dJ18VRML0xRZJvCwRrbGUkeX7bhFfRELqfvmry2o0RMAVPHvfSnXkPeeQAY7GaDrdIspURvYPG6l+PKNDSCEnGk9+rH5Tk4Ra6D69eU78eftJ48t8U+Xn9MeF5fe2j4jfm/9QWuq2SPJKrTiGItqAn5n0R1dZGuXbOyfuhVrz/vvLuNk6+J1/OG4xApJC8yf0GKvYNAWFFTo1X2+ROgawIksUUt/fegq5emCMPLibocL2jNLH0S0h2cAwhUnSuEblvdg47jtlouB6dO7y+xcaBRzI5cvJE/YnBzLGu/UmZh67YkvvOZWRgUJLXC2hbL8MxizN7Tl6HKe1FilXGepW2tZJzttvFSL7d5tUSktVO5+r6uMJEw+adx4lXXlfbjWBfsCgITmzhugFQta0VcyMvvz1yxwLsXwLJuzlVRkEXUx5mCxgLE86YGbLGKsRt2RV/n5281SpG20gIXcPeeBeoRrcNsHzhet68V8YCINlibE11vdkmB0k4ZTzBIlO9YwSJzAkhn0tC3kYkY3CSn+VrbZ3cHr4g/VfLworiOMm3IVWzp11711RlcavEqdfachVmQ6BZxlmHm6y22lCnv6849upbc50Oe5pogPUeAGKbnck36zZTohTxwrsu++RBBXygOpzEFjT8nHGny7qUD5BdYxAhOXn6GmHkeDUURPQIef2uN/+cwjvwPGze7QLOpj4BLaqs8IWF7du6hng0zFXixogf6nXD+UPB2yAlaTPvPA1O8noC53JAzXTBlrdQJ0ig4lHEPYrBc6qcSEFeRTHdtTDncVbziBq6su7i605kxJLRKCSvFYYcNdtPOWXLAWPbk2TxsBZPRXxjKGoh+UUYHWWkASlklPWXsP766dFF4CiCl9FI3gh3vbqqPri+UY9vHaqfin3x+qP/1t/pa+dhErqNEaYDuoNdPPm5yU5Ivtua6T7P23ie7I2f1nxsY46n0OboJD8FIZz3PgjJz03ZCMnPec02NRbynnpx4gaI2gjJDyDkOSsk6fvcDADpr2BWMCAYaDEgJC8kL9a0YEAwIBgQDCwUA0LyC51YsWTFmxEMCAYEA4IBIXkhebHgBQOCAcGAYGChGBCSX+jEigUvFrxgQDAgGBAMCMkLyYsFLxgQDAgGBAMLxYCQ/EInVix4seAFA4IBwYBgYHSSl5fhCAhFEQkGBAOCAcHAdjAwGsnLa223M6GyUESuggHBgGBAMGAwMArJz+WAmrxvguOdQucvTnm7mSisOSisZeI0rw7oO4/LlLGs7764CN8/OMnP8qjZLHn73CTfvrueOmp2vMVTnZIXO0a2OqITHrMZuDfLPGx3QZEyB8f42sfejjdPXWWBzVFeAupNrp68ux3nivYjU9vp855XxujzCZzCI4jT+w6xttB1PkEdNTjJP9y8o/568HWnj76XAtfunbU6+H6tbj5dqzdOr6hLr3ZVYO19vRVNZMJ57eML2zuFjnO+9lAArM/xhiRfGSPg1C3926f32nkl7u2vVPrjoVcfsPkx553b4x9qjvo8Z5A56n66HwtnzPHDNZqz7V54YvY/+RlD6ZFBMDTymt/WHCW2OyjJr9dX1fP7X3QieG0Y6Ht1GxC4F3dX6ubZWr1yWJxVv1mp/W/Xau/RuveWEB4JdwcSr32M5JHz5IdanByAoQuYabkvdfET84OSBkfGY/5mqDkqZZbqgTNxxpSfu0bztp1MwMw+92p3KD0yFIaGkNnEnzEoyR++vnEI/uTNW+rn4mjZ7268W35+O/xU/X70SP3w9l1VXbvvGQS6DQji9X7lwV+4XBHutXuFN3+SkeSNx1WGl4uP43lRITR4FCwzXA/CZWdHSPuY8kMWZ6mgSiVZKScTInb7v1KNIsswzuqZ7qfy6Os+BLxW+l6rj0Y+9glewX5XmIApDVQGWlagrbMjfX89B+j8M408SnmC75u5wMYJ57HoT9U/JPrEkMmFyG+wvnxOzi+xDqL9cLHpRn+gMcsJV8dx1siLsdYwkofYQUk1w7j9lA41frC+KVwwdMEFJsnH1lMlE7Bu6jUbWufVfczx6PasdVJh0zcKec4Ucx1PnNAxLA5K8o9vve+Q9t4LO2rvxR11e7Wrbuys1PXi783OJfXWzmV1Z/VyeU2Tvx3e123AgVw5KDx5TfLFBKyur9TeZ4VSf7JW64370ddSrNwWjBZwvBBrRpKvAWsruqYPFqmh51CTJA+AH3qGvUA6j7OQMWqltwseEpMzJ4SFXy3U5+oZPJ7T+z2i5IsxO+SBPMOXs6ugmj539UCCnnyLL3KcyLxVCtmtfeBhFpsjX258mVsKHTG+WtnDZ/jP3D85LYxSYLQ0hiGH5Jk4S1lrzZiYbUcxGRp36Bpl8IP6Fy4uSEyBlBokNsZ6agxIkIo7NkYptY5ScA71QX2vq1/OQfQlYngMSvI/3jnySP70oMrR//Hxl+puQfaa3P988FX53ZPN7ZL8bZLXbfgkX3vyxWC1B68JH/ukeveVwvQBX1mxRjHnInno+RtFVy96oGi8ojaS5GH/iYhCtnFSJA8sdOos7RDJe30kZB/1RpgyMF4CK3ITMSCxPpHKmJgzJArSRmuq5/fCLBZVQHARNOIgIcJ5tp9Rz3XI6PNqT1ielOUJojjjrjUrgtQ8l9l213EHZQJxS43D4AAYj5z1A6IbvAJRol/UGteyDDkCnXGOEHpUF6Q5filO4lR+OzrJ2yH5h6/tK/0xpK5D+dqbj5G8LczsJI8B1QFOJpInPUR8AXmKMRiuJ0K6teIiw1mdxhkieZuIsNQHfS8ks3LOKZkFFSWupEPtkyFxFuHUskeVp29AJo1TP58K9yPeV2OwMuWG9iWmoM16YT3DzEUg716OLzUvH8EZe61hJN+xbQeToXGHrgFdEIoqoQYbI5SdTIrYemJ4z1jftzAeNOqZsm4X8NtBSR4L1//y3oOGxDkkj4XrxyF5kw/NS/K+VwPbR4ruEGXfenXxhR0m+dRxxknezBeWiqCIG+0jzHuCWoBGlg7BVvKA7Q1D8pEwKNIv25hBPV4QomTNJVNuZFshLwyQPKzPMP+H6Y/qe0Q+PUiexBlpBBIRnoBH6mGYKVu3HgKM22nDvoaTPBsXnHw1h+Rj64kRoUHXeei+JJwbmRG6cgHEnRIlGJTkYeGdzsmnevJY4d04JG+ANDTJV8+bsydvz5dXXR7MyReFNvYC5SiTuogHpjfmSPL0ewdaImBFZVhyo71YVrie+YwGCw2xAcLLQPJt4WXddkaS57dNhIWpcVsRk9b4mYInj3vpDu44dSs5PHnU+LL6lwk7KYQ6xd8OSvJwC92HV6+pXw8/aTz5b4r8vP6Y8Ly+9lHxG/N/agvdVkke8S5SCKKtxI15CURVsFECnXPyTE8+2zj5nnw5b9BzSCF5U70b2meOKnRY5+DnMEMedKdqXY6HRHnygXFyc/Jun+lcLlqpDz0fjifPmRtGu91y8gihOvLnrrWAoWP3HUtrpbz7IESKzrW+Ofm4LohW17PWE+X4WPMSwhA3J09EWAxmjnVNVco8LNTDH5TktQLZ1stwjHLKnpPXYUQbTFgFp1dAVYPc2W4XI/l2m1frpVvtdK6ujy9sNGzeeZxWgZ2zwLRihX3BlAGugGNhaK96vpEXUTUO5rVPuJ6V9+tF8sYYwquo7ahO97msjTOIs4C3FN1KihQWllEAK6R/Vm6vtOsWXE/elS2DPMrITRxnZgsYa605WIq3je16YI+7kA8tE2T8mIyRtUvVV3jrKopT3noyMnAwUoytqa6nttSmjCdYvKt34iARz4USeSiCMDjJz/K1tqBoCsuB+a+Whd5SnOTb0J/ZZ64VHrWwW2VDvdaWu7CbhZ5lnH6hmbeFysqdx159a64HvWdY1EZss7MrhVOiMeHCO2beL6o8rYKuyM6DNs/t57BT5rJRxGY+wHO5Mq/miCDgyNw0Rgmak4ey5ZA82MVRjw3DGblmg4aOv4c7huFyvjDZNusAMWzQa8T4vToAAhe5cvLgeXr8rJoZdMdBpeuwLa4snKOkbZyjbgWbUwy59+nT4CSvOzuXA2r6CHa79zKJhWm1dgo/M9verhwmsP2lVHi+Uh1r3Iuay8FzqlwjYgK4k/UXeOdJNY+o8XUO5TYKyWsFKEfN9lMU2XKVZB64X//GIrnBn6uJKLQfeGClshySH0NRC8kPvn62sT4mZniPLdPRSN4MfL26qj64vlGPbx2qn4p98fqj/9bf6WtjC2i6z+cVT3H6vxxiEMNkKXM5zjiE5Dn6Yuq/YdXIbMO4mGibo5P81AFzHvo3jkIVQt4GtmQu++BKSH4bmByqzabGYkKRtaHGPqnCuykMWvrQRxHKvYIfwYBgQDAwFwyIJz/REMtcACT9FGUnGBAMCAamiwEheSF5qXsQDAgGBAOCgYViQEh+oRMrlvV0LWuZG5kbwYBgYCgMCMkLyYsFLxgQDAgGBAMLxYCQ/EIndigrUZ4jHolgQDAgGJguBoTkheTFghcMCAYEA4KBhWJgdJKXl+FM1wIU61zmRjAgGBAMzBsDo5G8vNZ23sCRhS/zJxgQDAgGpo+BUUh+LgfU5H17GO8UOn/RyFu4RJFgiuR84CLvGuyrkM+HzGW99cXJtO4fnORnedRsllxNbpJv311PHTU73mKtTsljHcHpHX8ZuDfLPIy4AOGxq73Gvl3C6U2u0bHy5gHtR6a209fHdmVe9scbW33sdPZXtS54nc1dT2Tu/+Ak/3DzjvrrwdedPvpeamHu3lmrg+/X6ubTtXrj9Iq69CpPiYQWem9FF5ksXvu4YvFOoWOeV56u2DrIsT5vGpJ8ZYyAY1n1b5/ea+eVuHeQfmdeXHaf5zf27qfAscbKlDVcIznbniSmhlrHC11nk5xTJta31fdBSX69vqqe3/+iE8Frw0Dfq9uAwri4u1I3z9bqlcPirPrNSu1/u1Z7j9a9q0V5JNyBBOtJ57WPkTxynvxQyoEDWFSBMD2HRSqfmY6903nuzLFycOQdg5y37W0p1V7tDrWOF7nOuuviXnPGxPJYzxiU5A9f3zgEf/LmLfVzcbTsdzfeLT+/HX6qfj96pH54+66qrt33DALdBhTWer/y4C9crib52r3Cmz/JSPL1gvi7CEGXH9vzvESF8OBRsMxwPQjXnR0h7WPKF1EOpRFRhoQr5Yj3f6UaYyPDOKtnup/Ko6/74MjOXZT0vVYfjXzs8GWw39UzYErDncO6fS0r0NbZkb6/ngN0/jmKZRtjJ/DEmG8sLPzs5J46fl7MmxMWhsYkJ1wdH2uzfhlYdw3hhLajmHDXhBt1oq5R4wfrq8BJhZv2w12LVbgeRLsQEonhuXo2wG09t6F1Vt3HHI9uz1qPnzf6Bhl79nQDZ93Jb/R8Dkryj2+975D23gs7au/FHXV7tatu7KzU9eLvzc4l9dbOZXVn9XJ5TZO/Hd7XbUCSv3JQePKa5IsBra6v1N5nhVJ/slbrjfvR11KsqXYxaKKs7zXKoyGrjCRfLxhb4TR9sBYJel4ySfKG6Ov+h55h54g7j7N4DuoltAoHKkBnTggPo1L2z9UzqCy83yNEUIzZUeLIM3w5uwqy6XMnD2gbY6dIPj7fJu8bw5meFxdrHJJnjjUF682cM9uOYsLHyP7Jab3GQ9cogxvUn3DXGPI7Fskz8GzWoGPMFnI5NsYHhWOyT+4Y0fVY3+uu73MQfRFPviXWH+8ceSR/elDl6P/4+Et1tyB7Te5/Pviq/O7J5nZJ/jbJ6zZ8kq89+ULY2oPXhI99Ur37SvH7VnVlRRviz0Xy0PM3cquVDlB0XlEbSfKw/xQ55BonRfLAQ6As+xDJe3NByD7qDTFlYLwUVuQmZkBa3tGWxo7jFY6VizMrApLshcXGyu+Dn9Jitg37bGOixhhqbIaueVE7ahxWZMhOzXHwSxTeoUWsDbkQcxyat5AhjkTb2khEhQscawihR9dibN3I9RTHFPvtoJ48RvJ2SP7ha/tKfwyp61C+9uZjJG8PLDvJYwvFAW4mkic9RHwBewoqGK4Ph8/I2oBO4wyRvK0gsNQHfS9UMuWcUzILKmqcJELto6HXZOLLPHYkTYSOAea12TizIz9WJCvBa3HCwqziSmZKqyEZBEMsTBgMYOMKXQP9C0V1wHpkzY2WbTIpYnhmeM9Y37cwHjTqmIChvgQn908gXP/Lew8aEueQPBauH4fkTd4tL8n73gVsHym6I5QDV7GEST51nHGSN/OFpSIo4kb7CPOuoBagkaXjHVWKHbY3FMlnG3tPko/jrD/Jk2MljTA+ycfahnUh5v8w7VJ9D6JYDq7sazjJoxEBELrmrkUWycfwHDRy3bQjlsZijyfqABG6Skg+KW3c11AZ1JOHhXc6J5/qyWOFd+OQvFn8Q5N89bw5e/L2fHlbooI5+aLQx1YQHGVWFxHBcOfYJN8WA1okkjL2GZG8N9aMJM9vmwj7NoTup6uavHZjBEzBk8e9dAfPnLqRHJ48Gs2y+ocVCAvBD0rwgxfewS10H169pn49/KTx5L8p8vP6Y8Lz+tpHxW/M/6ktdFsleSQnn0IQbeFLzEshKoeNEuqck/dDknj/fSXXbZx8T76t8u5JdIGKfaOosWIgu5J8aE8+29hhQab3gh0YteDirE9OHiFUJwzN7wMZZbLJAksrhTABiSZEis41bn0DlZOPr8WoJ48aSHjdjrtTAsxJjpw8kbIy7/A41jVNKfMgBsBWDIBBPXmt2Lb1MhxD9Nlz8jqcZ4MZqyD1KlJrZeBst4uRfLvNqyUkq53O1fVxxYKGzTuP0yqwcxa4VkSwL1gUBCeAWErBCzs28vLbw8bbh+TjecdtjJ0qHozPt9l+FcNZt+p63li5fXDnndc2tnugNPYMJoq/z8ptnXZKojY0Q9ew7bKBanTbsMwXrufhuXlzHqiFaKrrqS2tKeMJFpDqnTBIxFGIfCtEHgrpD07ys3ytLah4xXJW/qtlYeVtnOTb0KPZZ64VD0KEIAxGvdaWq1gaRZplnO5WPZ3zbAnY338be/WtuR706GBFMrHNzuRldZspUYpw4R0375h77N1J3seZVsa0weUZA9GiQ95YyTUDDVpk776dc49hqPwt6LNTFAiidfQ1IjXn1YYQUbFolIVZeAeeh+HZLkxtZIXuOKh0DZabb2Ucj/K5JGOck24Fm31z0HK/G7UZnOT1BMzlgJrpgoVLLLztJ6yQqFjguAVeKlwknzs7eUGj1BDOkIqaqm/h4Xi66/W89b+ax/C2v/Mmk/HGOwrJ68UoR832m3Tv3fU9SEVIvsdc6ChC1LPt0X6PeU0iPS/XO4aiFpJPmrOhsJH6nMUYvjNYt4y5GY3kDZjXq6vqg+sb9fjWofqp2BevP/pv/Z2+tgjQMyYifZyI59XxOULyy1jMXAzp+UZf4xoMkw8hIyF57hxO+XfxGpUhsCTPMBgZneSnDNbz0jch+fOnENy881SqoIXk56xzmhqLJUS2OjpMU5w/IfkFTeYUASZ9On8GhMy5zLlgYDoYEJIXkpeUiGBAMCAYEAwsFANC8gudWLGkp2NJy1zIXAgGBANjYUBIXkheLHjBgGBAMCAYWCgGhOQXOrFjWY3yXPFYBAOCAcHAdDAgJC8kLxa8YEAwIBgQDCwUA0LyC51YsaSnY0nLXMhcCAYEA2NhYHSSl5fhCPjHAr88V7AnGBAMLB0Do5G8vNZWFtfSF5eMTzAuGBAMjI2BUUh+LgfU5H0THO8UOh8Q8hawsRfJNJ8vuBhmXpYp57y6rS+RL1PGw+AzLvvBSX6WR81mydvnJvn23fXUUbPjgaw6JY91BKh3/Gbg3izzEF8UW5MbPBK319gnohi9MSFHl85m3jDs5ZVzb3KNYoiHb7QfmdpOXz95ZYw+n8Bp/sOlpqe/Bif5h5t31F8Pvu700fdSANq9s1YH36/Vzadr9cbpFXXpVR7YQ4DsvSAjyo3XPr4AvFPoShBP5MjT+kQzSPKVMQL6qH/79F47r8S96Yqj//znfOZix47hzpx3bs/rHIh+EOx1P92PhSGmnKHuydl2znWTra2h9OMgGErTbYOS/Hp9VT2//0UngteGgb5XtwEn/uLuSt08W6tXDouz6jcrtf/tWu09WvfeEsIj4TSB233ntY+RPHKe/FAg5igRFOhMC3eCi6S/olnw2AncoaTBwc6YvxkKe6XM/qE+ShorE0PMNl3dk7ft/uulu04lnz2UfhwKQ8x51vIYlOQPX984BH/y5i31c3G07Hc33i0/vx1+qn4/eqR+ePuuqq7d9wwC3QacyPV+5cFfuFyB49q9wps/yUjyxjMpQtB/64/joVChJngULDNcD8JKZ0dI+5iSQEBcnTSmlUm1iMu+e/1fqWbBZxind7pZE7av+xDw7uh7rT4a+dgnXQX7XWECpjTcOazb17ICbZ0d6fvrOSDkF1dq2xg7gSfGfJf9BTh7dnJPHT8v8JF6ghilPMH3Dcaw+YP4LORcyb398DBa/z6CB6wvn5drxf1UkShifUcx56457GjfdoyccHUcQ428GDoEI3m4JlBcZxi3kXMrE2r8QG9RuOBgnknyMT1RyQTog3rNhPRXdR9zPLo9a51U2PSNQp6TODDJP771vkPaey/sqL0Xd9Tt1a66sbNS14u/NzuX1Fs7l9Wd1cvlNU3+dnhftwHBd+Wg8OQ1yReCXF1fqb3PCqX+ZK3WG/ejr8UVMlAs5cK3BOyFIjOSfD2xtkJogAPP+oZkSZI86H/oGVnGWcgPtWbbhQEVuDMnhCVcAfq5egZJyPs9ogyLMTtKFnmGL2d3ITd97mSpb2PsFMnH59sQfAxnrLUS9OTbdUPOH4LHYP+CGMWw5+OBjyVLoSNGZSs/+Az/mfsnp47n7p65ziF5JoZSdEgzJmbb0bUWGnfoGuXIgLoeru4iMRVJZzL0hNFtjkFUyOXYGKWUfkjBOdRz9b2u3uRHXwb15H+8c+SR/OlBlaP/4+Mv1d2C7DW5//ngq/K7J5vbJfnbJK/b8Em+9uQLktcevCZ87JPq3VeK3wdGZe0ZBZaL5KHnb4yNenGABekVtZEkD/tPkUOucVIkDyxZymMMkbw3F4Tso1Y7UwbGmmZFbmIGpGXFb2nsOF7hWLk4i42nvo7JmlTGBBaR6E4bhaqe02stYlEFrH4lZJxCQoRzaD+jbidkzHo1NazwawxD/Ln1vUBm213HHZQJF6NWxK2WFw/zfuTKjyZgeCf6FYp2hTDUGecIoUd1XDue0UneDsk/fG1f6Y8hdR3K1958jORt0s9O8tiEOgLORPKkh4gDzVMgwXA9Efq0F0q2cYZI3lbYeOoAjwL4i7ucc0pmQYWCKzNIKnb7ZOiYpZgR2VNh/6CBA8N1oXB9YL7ZOEsheRjq9g3GkHzpXRhtO2RoEiFXrz2AB7QvJJ6AnFmYMxgL5N3Lfqfm5SPrJ2FuKXk6IWdOQawj29C4Q9eYMm7STAAXnFB2Ail6ofVGNzK8Z2wOQtE/1ACNh+bdSFB4rQ5K8li4/pf3HjQkziF5LFw/DsmbvGFekvetf9g+UnSHgL/1fpiAIUk+dZxxkjfzhaUigiRPhOphLtX8v5Glk6Os5AGV3FAkn23sSK6YIi9nrKQBxAkZI8qEqTxRUgkZYyBEGSb5GqMwXwxy7AYPZFscT575jCasW/YBCRP3IHkSQwlzG8vnemszx7idNmyZ4CSPRkIwXOQi+ZieYERoUP2VDedGZgQHEE7HoCQPC+90Tj7Vk8cK78YheSPwoUm+et6cPXl7vrwq7JA3S5B8MMdfF7tA725skm+LAS1llzL2BZF8bk8+jAffwGvwmEDysWfANj2iz0DyHoYykjy/bcKLbAgdMXC8a1Pw5HEvHTOQUbwags3hyaPpAKt/idgZlOThFroPr15Tvx5+0njy3xT5ef0x4Xl97aPiN+b/1Ba6rZI8YoWnEERboEGEV0EoyKtwNQuic06e6clnGyffk2+rvHsSXWg/Nqr4YJ1DOB2QM1zv1JNAL3gIkjcVvlBmHs5SwvWIIgdeBe45Ujlkbu4VEjbdHlqpDz0fDskb4yrlHQBIu91y8rFIClGBj8xtzJP31yZPtpwiWj/V1jcnH9dxVTFnAKcsPcGIdoUwxM3JEzl/g5ljXSuWgL9BSV5P7rZehmPAlT0nr8NtttCxSkev0KgGg7NdLUby7TYvb2sN6AOaj+mbk882TqvAzgGiVkDxvHKzzQSAOBau9arnA8YTliboE66P58e2MfaOOXlrO2EnnEFijClPVt0HXkVtG1doaoe1FmujE+5OCXhL0S2yWKW0Vu6mzeLvs3L7HV2c6GKGQR6lcRZfP2YLGGtunTUSbxvb9VCGpznjDsoEGX+gGt3HRQaSR4zfEObI6nrKiE4ZT7AwV+8wQiK5gfqgwUl+lq+1dXI1uID9V8tCyzdO8m2IzBQyacuTWgAtsKnX2rJytHZ+Oss4bcUGX3Hq7xONvfrWXA96HqDf3l5vkE/UbaZEY8KePDc/lnvs3Unex5nGNLP2IzfJWwVvbW2F73E188XAKHwHAMQDF0vBffIRzDkFbJ4HCTHDIXmwO6WuN8DWD6mLgoZOOj7L+QKEFBo3fY0Yv1cHQOAiV06eoSfsKESDV3THAfJ6Z+54yOp94zymFWwOTvJaSHM5oAZu1ZvO/7nEwgu5skJ3HSrJpyMvnhw69bdcuPFwdae2B5U5MEonNq5FYTQxp9ofO1wjYovrZFAsL3Uc1TwGawIQOY9C8hq0ctRsPyBmy+khleb9lUq/sc3q+Vphh/bNzkW5wZzkxMa1HJLvpqj7rQkh+X7ym4g+62h4j0byRujr1VX1wfWNenzrUP1U7IvXH/23/k5fW8TkbEXRdyiEIfqxHAU6kcW4lfnONzY939hrVqdsrCwFo+OMQ0h+CTwSr/3BdcToJL8E4c99DOMonnykNXf5j9F/Nz+aVq07Wn+XEDEZxQAUkh8Ds7me2dRYdMS/kPwoi04ILtcCkHYES4IBwYBggMaAkLyQvKREBAOCAcGAYGChGBCSX+jEimUr3o1gQDAgGBAMCMkLyYsFLxgQDAgGBAMLxYCQ/EInVix4seAFA4IBwYBgQEheSF4seMGAYEAwIBhYKAaE5Bc6sWLBiwUvGBAMCAYEA6OTvLwMR0AoikgwIBgQDAgGtoOB0UheXmu7nQmVhSJyFQwIBgQDggGDgVFIfi4H1OR9ExzvFDp/cc7pbVVz6itPCeTFAO+ZtIJennyFjPpiQu4XDIUxMDjJz/Ko2Sx5+9wk7767Hh4vWR2DOPTpaPlIqDe5wqNAkeMoOcoB7UemtjnPd3+TT77ks72x1cced3ylJj3G6iTF1BO10mUmJCgyO98YGJzkH27eUX89+LrTR99LAXb3zlodfL9WN5+u1RunV9SlV/tPbG+iiRgHvPZxxQ5PoatI3j1nuHo/+ZBEn5OEup/WVckCjFuf4PT0XnIFMZyjnG1PUvmWJD8AZupT74Tk++upSeIoi2Mksskxt4OS/Hp9VT2//0UngteGgb5XtwEHfnF3pW6erdUrh8VZ9ZuV2v92rfYerZMVOmyXR8LdgchrHyNO/zx5jOQvXBraW8pJ8oVcO527nXfM7hzlbTvHAs7ehpB8b72RfU6EMGVOemBgUJI/fH3jEPzJm7fUz8XRst/deLf8/Hb4qfr96JH64e27qrp23zMIdBtwEa33Kw/+wuWKcK/dK7z5k4wkX3sdVQgcnthFERs8CpYZrgfh0rMjpH2E/EIk/zf0YIPjqWTohf8xL5jTVw3OyPMaIjXtNaFhaMxwjIjqHm/M2CJh9B8jeVbbURnX/awxhR796l2jxu+2pTF6duQan1VUR0d6wG/hvDJJnoWPS3V/zbqp59U7Ac8L2zPHo9uzMPN5M0Zk7NnTDd2NezECRHZDYmBQkn98632HtPde2FF7L+6o26tddWNnpa4Xf292Lqm3di6rO6uXy2ua/O3wvm4DCujKQeHJa5IvFPnq+krtfVaQ1JO1Wm/cj76WItxWGVlhcKO8G+WYkeRrhWUr/KYPlpLCzhVGSR4LiXrfIaRY9MMhHawdZl8Nwbft+c+riPS5eoYoYnesHJJviQUSnTP3zP67JM9sOypjXwb7J6cFAWt8hq5RBh/IbYfGZqd0kN9V0ZNIuJ6DD2+dVMbesTE+qHA92Sd3jChm6nvdeT8H0ZceXl6KPpTfpvHHVOQ1KMn/eOfII/nTgypH/8fHX6q7Bdlrcv/zwVfld082t0vyt0let+GTfO3JF2DXHrwmfOyT6t1TOW2XUHORPPT8DaBqpd8QIJ6r9kke6xfR16hih/el9fVvSN7geaHaAVh7wFs4lieIenDc/q+Un1Jhth0ac01wqBESumY8Y4AFLLLQeu4VjnAZ00ZDE7VCIw1Q2RH4CHnPKMlT82L63xrb+HgQQo9ie56Km7cOZGwip5UaneTtkPzD1/aV/hhS16F87c3HSN6eyOwkjykqR3FkInmyEAlXoJAgsOp6j0SoZwSJBSE1bl+Zz4OE5HvcbkEhd+E6YWE7LM3tvyFHKsKApW9YYzYyxcYVugawECpeQw0p/3meEZNMipjRw/CeWVEmi6Q6jgeLenHxI78TI2EJGBiU5LFw/S/vPWhInEPyWLh+HJI3ec+8JO97d7B9v+iuzaFHPB2YJzYkVf/bPNvJVVdtOmRAGgU4CUGv0PzfPC9YgNip+A7LR+uUQJHDtWoE4rLGPHle27Exu3UKIDzuzJN9DZcvGhEAoWvKkOpE8p3xYckuQPLs8UQNcHytLEFxyxjEAOFiYFCSh4V3Oief6sljhXfjkLxRvkOTfPU83JO3PTWkX0GP3U0PwK1NfUg+mBsPeMvlvGYg+dYIqueMa6TE+lbnQp1tdSwZ+2SH5sEbsiewNoonj3vpGD6C2+NyePJoOsDqXybscJWp/E6Id4oYGJTk4Ra6D69eU78eftJ48t8U+Xn9MeF5fe2j4jfm/9QWuq2SPFKEBL0f1EtiFOixKrdNO8k5eUOQdsESnfNsZIiSFKwLICrYib7GqtFDnny3nDyibJxwL7f/cU++NUQAEafsyQ+RtXONWxtB5bAzhOtZ+KAM34gnb2oOENmhNQZEzt9g5lgXdKbMgxSwJRUmT5HQpE++7huU5PUEbOtlOGZys+fkdSjbViZYBa9XEVwrOWcrl6/4ILmZvHrr+VrtdKmubwquLOWOVS9rxQ22rdnKEavw5/a18sRB9bfzvDCRplfXawKHZObLntt/3xCLtx0dczH+s5O3WoVqGyCha17hHWbItd/ZEZR84XpidwSxThySLcbWVNcjuwhagwnfLeCNhyrsKw0RvVvDj3gJCYi3fd4wMDjJz/K1tt5+an+hwMK3Zn97YKsd5sG67WjvkKqAdskG3ydv7VFHDJUmbwyVJcjd67Br5742Iff6HQOQDIIh8S775K1taFbNARY6JucMGlSOfPw93GhYGmAG7jBwigJBtIi+RnjIXq0FyPFjxl7ttXbKyTPx4b0fAd1xUOEC27LZ1jUQ4yGr941x3K1g87yRgIx32YbP4CSvATWXA2qmC/5zUlA0eE6VEWaWkO4MQrrVPMorc5dNXtPVz9OS+ygkrydHjprtB4RsuerJktYYilpIfhGKsw7XHxevuF7EeCa7RkW+c8DXaCRvhLNeXVUfXN+ox7cO1U/Fvnj90X/r7/S1OQhxnD4yiuhmrByC2+q2Ni4h+XGwnJcsZG98XnkuARPneQyjk/x5Fr6MfWrKSEh+zphsaizkPfXiHG3NEZiazor3R0hewCAKQTAgGBAMCAYWigEh+YVO7Jw9Mul73DoXGYmMBAOCAQ4GhOSF5MWCFwwIBgQDgoGFYkBIfqETy7Hw5DfiCQgGBAOCgWVjQEheSF4seMGAYEAwIBhYKAaE5Bc6sWKdL9s6l/mV+RUMCAY4GBCSF5IXC14wIBgQDAgGFoqB0UleXoYj1ijHGpXfCE4EA4IBwUA6BkYjeXmtbfpkCcBFZoIBwYBgQDCQgoFRSH4uB9TkfbVq/KhZfOLm9Ba2OfV1LopimTLNu7b6zuUyZZxCBPLbvhia7v2Dk/wsj5rNkqvJTfLuu+vhsanVMZ3+EZ3bXcwjKEt4pGt9vOw8TyCrThd0+55Xpr3J1ZN3t+Nc0X5kajsd43lljD6fwCk8gji975BcMAxNl4D6j1fGFpPh4CT/cPOO+uvB150++l5qQLt31urg+7W6+XSt3ji9oi692n/yeyvEiHHAax9XQPAUOuw8+epc8iGJfgBlCWVaKk8wRnPe+dN78yomqvu9XQOl++l+FcYQWXeQM8R+zrZjSm+U6xhOszgPQM8NgqH+unWUOdiGvGfQ5qAkv15fVc/vf9GJ4LVhoO/VbUCAXNxdqZtna/XKYXFWfXG85P63a7X3aN1bwfNIuDvgee1jxOmfJ4+R/IVLQ1v1EyH5YuGhpDH1BTmUgi4JJ9UDz4slF/t5254kgQjJ99bHk5zXqeuUon+Dkvzh6xuH4E/evKV+Lo6W/e7Gu+Xnt8NP1e9Hj9QPb99V1bX7nkGg24CTvd6vPPgLlyvCvXav8OZPMpK88QzrUPDfjudCERs8CpYZrgdhvbMjpH1ESYdI3u1vIaPgeCoZeuF/zFvj9FUvgsjzGoVv2ks5RYxSnuD78DMqkqlSHNXn7Mg13pr7GbLrMt7Py6iL+6k8egJf0X64Y3KjA9BI5BhndXscr52BC4zkPZxiCjTDuI2cW5lQ42fiojSYwG+hnJgkz1p3BhMGL/V6qSJ3GIYMlpnj0e1Za7HCpm8U8pyU7k6QkHoe2Q1K8o9vve+Q9t4LO2rvxR11e7Wrbuys1PXi783OJfXWzmV1Z/VyeU2Tvx3e123Ayb9yUHjymuQLpbC6vlJ7nxUk9WSt1hv3o6+lAKddNBbAvVBwRpKvF5atkJs+WMSHnZeNkjzmGXrfIcq76IdDClg7zL4awmvb859XKYvn6lkKuRsCIJQnlAf5DGQcF0Jjs5UdlhZgyJfsC+rJI/iKPsOX8f7JaUFELf5dDHFIvv4NYgA5a4qJC5cgmG33GndIJpQhDeojuLggMRVJnXHWHYG5Y2OUUtGgFJzDtVjf6xq+5yD6MgMvncNng5L8j3eOPJI/Pahy9H98/KW6W5C9Jvc/H3xVfvdkc7skf5vkdRs+ydeefDEp2oPXhI99Ur17KqftEkgukoeeP7C+GwLEc6o+yWP9Ivoa9TLgfWl99YqLMC+7a+0A1ndSGUMlS41jpaq5b427XljgjpdF8ow5rNuB0Qh73cCaDo6yMOmf0ltEDTIuLmr5Om1YXmaobXjNlm1o3EGZcPHNxQVtNIQ9beiEEP0KGcMhDCFRGB7OEUKP6ow0h4qHP2mzi5xGJ3k7JP/wtX2lP4bUdShfe/MxkrcHnp3ksQXlADwTyZP5WHyhQwWOVdd7Sp56RlABIsqX21fm86CiSQIyCA1TuwrQZ4Ry4FS4P1T413e8HJJnPcPMWSDvjqR8uHJ3wsI2cXBxUciQCvUmt+1gNzTu0DWwxlJxwQllJ5MiZvQwvGdW9M4iS9QAjYfmsWgiFz/yu2GNlUFJHgvX//Leg4bEOSSPhevHIXmTt81L8r73Bdv3i+7aHHrE84T5TCoP7RBn1aajlEmjAFeW0HuBee9euT2m8kSfETJuQIiS7KP9O6Z8ybYSSD4mU7cuAAkT9yB5s968VBIXFwGSj7Xda9zO/NgywXGLRkIwXOQi+c7rziKNAMmzxxN1bHAdJOQ9LHlz5T0oycPCO52TT/XkscK7cUjeKImhSb56Hu7J2xY4ncsNhXGpivw+JB9+Hu3VsUCcgeTRLWs9PPnO400g+dgzGtk1xAaIPgPJt8Zl3XZGkue3TShWatxOISixhkfx5HEvHVt3wS2WOTx5NB1g9S8TdljreyF58THHOijJwy10H169pn49/KTx5L8p8vP6Y8Lz+tpHxW/M/6ktdFsleSRXDD2xUCi4rRj2SZdVYWyUVXJOvlB+Xm6azkFDUsCKbNo8LFFpTfQ1VjU9midvqpQ75yqhgcKQb8iL5ZB8oM+kIkHa7ZaTRwjVMYa4uGAadlhajFPdb4ghRNbOtb45+Xh4u1qLSEQF9DW87iiHIuLJp+KcyPkbzBzrepWUeRCiTir4zm0QDEryuvPbehmOEUz2nDwsMsIqTSky1fc2iyFG8u22tXah1/eAPrCr6w2h2OFErMpWK7xmYRPV76APpgYg1lesUr0MJcPdAohiYeX9YsqzVjCxcLvjHSFzjO1yMGNzFHNUviGCw0iSLuLydkAYGRbyPSu339XKH5FRenW97hskM79vXFz4Bm687SiWQuMOyoQpYxIXGUjebMGzyDOEOYdki7E11fVIOyUOMFxS46EK+0rDSO+C8SOJuYlJ2ssX+h+c5Gf5WltQ3IWFSmHhW7O/PYHk2xCl2euqLX9KAbmKBd8nb+1RtxcuLFaDixrkljWZYCTpjpnoq6VgmnwqeB5OwMy8X1+Sx/bxh6I3DCwYhZo2XpuQq/kP7pOPzKFTwOaNp8s+ed0/f581Fjom10LQsOO1zZJtU2vies60TAgP2aux8D1xqmjUwzQHp8x1572HAd1xYGOoxhZ3PGT1vnE6Ul+klI+whPzTZTk4yetJmssBNdMFFJMA5xwmq72G4+INhlOYh14phanNw+A5VUaYeWoykv4g666ax+2+dnka630KOidXH0Yhed15OWq2H5iz5VSnqsw0EXV5Oc6WxrMckh9DUQvJ51LYo7YzMcN7VFlsSc9sY0yjkbwZzHp1VX1wfaMe3zpUPxX74vVH/62/09e2MehltMkr8lrGWPsZRDlksBSSH2ccQvI5MDh2G6wamRmR39jyHOr5o5P8UAOV54xPlHOeg3HIcSlzJiQ/Z+w3NRYTiqzNWZ5D911IXixPiZYIBgQDggHBwEIxICS/0Ikd2lqU5y3F65ZxCJYFA0vCgJC8kLxY8IIBwYBgQDCwUAwIyS90YpdkicpYxLMSDAgGBAPdMCAkLyQvFrxgQDAgGBAMLBQDQvILnVixertZvSI3kZtgQDCwJAwIyQvJiwUvGBAMCAYEAwvFwOgkLy/DEat5SVazjEXwLBgQDEwJA6ORvLzWVhbClBaC9EXwKBgQDCwRA6OQ/FwOqMn7lrP4UbM4wOb0trA59ZVSaEsYQ1xZ58V2/Hlh5Xk+ZL5EApEx9cX+9u8fnORnedRsllxNbpJ3310Pj/esjjn1j8bc7qIcSVnDY1e9c8+rU/t4p2dtdwy9yTU6Vp7SQPuRqe10jG1X5mV/vLHVxzlnf1VrCtZ4c5UuT2lXZNZiYHCSf7h5R/314OtOH30vNXm7d9bq4Pu1uvl0rd44vaIuvdof6L0VcsQ44LWPK0B4Ch12nnx11vWQRD+AsgYyrcYNxqhPy3p6r8VKfY42j+T744bjtXbpC2usTIMUYi9n25NUsJzz3JmyC45vUljbNpal/UliHeB4UJJfr6+q5/e/6ETw2jDQ9+o2oGAv7q7UzbO1euWwOKu+OH98/9u12nu07l0tyiPh7kDntY8Rp3+ePEbyFy4N7VUMTfLM8U1N8XY6z505ViZRudjL2/YkFZ+QfG99OMl5ZeL9PPd9UJI/fH3jEPzJm7fUz8XRst/deLf8/Hb4qfr96JH64e27qrp23zMIdBtwwtb7lQd/4XJFuNfuFd78SUaSr0miCoEXH9tLvEQRGzwKlhmuB2HFsyOkfYQkQiTv9reQUXA8lQy98L8z5tqw4fRVL8LI8xrCMe2xQ6gVOXnjsxZ+Fc1wP8aLxp9LzFOZAqifh+IAl8mzk3vq+HnxfGdM0EjjGEfxsTbrgjEvGMmH5Ni0HcWOKyM3YkFdo8YP5F3I/ezINaqr+WXMDZPkWbg3a97goJ7bENYq+THHo9uz1sLnzRiRsbPXSndn5DwT5BLGPijJP771vkPaey/sqL0Xd9Tt1a66sbNS14u/NzuX1Fs7l9Wd1cvlNU3+dnhftwEFf+Wg8OQ1yRcLaXV9pfY+K0jqyVqtN+5HX0uZtHbRaiVS32uUXEN6GUm+Xti2Ymz6YC1m7FxnlOQxD9b7DiGPoh+OcsbaYfbVEHzbnv+8inCeq2fJCquWPaL8nXkmPHn8uRTJGzJxydyRE1cmBZbcOeSQPHOszD64JM9sO4odf273T07rtRO6RhmyoI4iNDa7DgP5XZWTj6SuOLj31n9lxB4b44OKGpF9cseIYrK+1zVwzkH0Rbz0JL6iuG1Qkv/xzpFH8qcHVY7+j4+/VHcLstfk/ueDr8rvnmxul+Rvk7xuwyf52pMvQKE9eE342CfVu6dy2i6h5iJ56Pkbg6RWjg0BVr+DOV2f5LF+EX2NKkB4X1pfXS/WFEG1Crdf7YDlHVFGQojkPcVPkTwkiK4ysSIlyUZNbKzceamNDCS6UEY90H4xsFPLGXrb5XoNXfOiYdQ46n5bhI5jhzYaqKgOriCJOQ7NG4q1vuNBCD26ZtMcmhTnR347L9mOTvJ2SP7ha/tKfwyp61C+9uZjJG+DLjvJYwvaWWCZSJ7MG+OKBipSrLreU7bUM4IKGCEWbl+Zz2tDrt0XjxMqhamFIMlbUZrScwiF6wPhUq5MjHfSKS9fPZ8ca0IfqHqQ5LYd7BisQJnaoWrsGpB5qIYCkBuFHW98yaSIGVQM75kVPbNw1HE8WDRPyLe7/liy7AYleSxc/8t7DxoS55A8Fq4fh+RNfjAvyfteEGzfL7prc+itAkU9HJhPBbnq5tlOTrdq01GapFGAK2voPZn/m+fxChB5CxhLb/gpA4ssPSOuH8nH588O92OExxunQ/ZmDNx5gfOJhEU9OXKx4/wORD/Iazhu0IgACF1nJfnOuLfmLEDy7PFEHQtcByyZqGRsfL0AZTUoycPCO52TT/XkscK7cUjeKLChSb56Hu7J26SB9CvosbvpAZgO6EPyqHKDxXHJoWsa9N52sGBOvihyckhuPiTfGnc1FjOSPL9tYh4aQodpDrsQk1hDo3jyuJeO4T64/TGHJ4+uBat/PaJAQpbdyXKushuU5OEWug+vXlO/Hn7SePLfFPl5/THheX3to+I35v/UFrqtkjxSrAM9T9Sb8Ap0CPJoFjRRPW3aSc7Jm9y3nb+nc4Owehor8mlztWl9jVVt5/Tky3HA0OwQJG8qp4lUAcxzw/ccdFYgzli584Ll5BHlh6WlsF0WVIFUiKyda9z6Bion70dEksP1qIGE18PgNQtuYa5rCCTm5AmD12DmWBeqpsyDFLBlKWDrvEZHlv+gJK+FtK2X4ZgJyJ6Th4VIWKWrVzlbL2pne1eM5Nttay3BWu10qa5v8reWEsSqfLWCCxgbWAjc1ADE+mreNOZV68PxIIotnnfUSjieU2+2LgHFiBsXHT15a9thVCadqut5Y+XOizt2XtvRuSxwdHbyVqtQbSMhdA3bhhqoRrcN0HzhemLXB7H+HZItxtZU11PGXsp4ggWkeheKH8mbKwFJv7cfWRic5Gf5WlsnV4cvMFj41uxvD2y1w0jGbUeHM6lKYZfc8H3yVmjUVhxgPJ5nAvKvmqA797XxrK296kCJ4WTLzTv6e4/RcKo1Zm+ffI5wfd0GiYPe++Tt4rVWlthYOX3wZZ4uR6wS3yncA1Ew+hqR8vLqAPzQfz6St9MIlXwp3HvvfYCkjGDN3mHQ1qgQ4yFTV8bo71fLIcS6fWKdkowHJ3k9+LkcUDOliXL7wiXAGYO5VPBIPnfk0Fc6JpBQ7eA5VapuZMb4mB0Ocsi6mscur0ROx22O/kobU5D7KCSvBy5HzfZbANlyulNVlpoIMxbjjbbYvFzvGIpaSH60+c+5vhZj+PbTfYuYy5y4iLQ1GsmbiVqvrqoPrm/U41uH6qdiX7z+6L/1d/qaTCi1IBhFdAMCSeapKgpDX+PKqD/YrvyE5Lcr32FIK16jMkw/liDL8zSG0Un+PAlbxrp8JeTmnadSBS0kP+e119RYLCGyJY7H4I6rkLyAbnDQzVnhSt+Xb6jJHMscLwkDQvJC8kLyggHBgGBAMLBQDAjJL3Ril2SJyljEsxIMCAYEA90wICQvJC8WvGBAMCAYEAwsFANC8gudWLF6u1m9IjeRm2BAMLAkDAjJC8mLBS8YEAwIBgQDC8WAkPxCJ3ZJlqiMRTwrwYBgQDDQDQOjk7y8DKfbxAngRW6CAcGAYEAwEMPAaCQvr7UVcMbAKdcFI4IBwYBgoB8GRiH5uRxQk/ec8/hRsziY5/S2sjn1NfK6YHm72JZztEvAio+hvDqjn3K/gB3hK+nJLeO675zlv39wkp/lUbNZFkZuknffXQ+PF62Osxz6FLeRFDc8Otc7Y746tY93etdIY4AY88bUHn86P88Gk39eOfcm1yiGeMoX7UemttPnPa+M0ecTOM1/uFTKGubNVbo859nu4CT/cPOO+uvB150++l5qYnbvrNXB92t18+lavXF6RV16tf+E9FYcEeOA1z6+UOEpdNh58tV71Ick+gGUCpBpNW4wRn1a19N7LVbqk+B4JN8fN1mUR6k8kXFp480eWxYDdMtjHkT+3U/3Y2GIKWe4pnO2nQVXzHGwn4XhNPczdHuDYGjL62AbcmG0OSjJr9dX1fP7X3QieG0Y6Ht1GxCAF3dX6ubZWr1yWJxVv1mp/W/Xau/RundYhkfC3YHBax8jTv88eYzkL1wa2vodmuSZ45ujgiCUJ0oajIXOVtrbaGso+Zcy+4f6KGkMTAwx23TXdN62R51DavxC8r15ZtvzOijJH76+cQj+5M1b6ufiaNnvbrxbfn47/FT9fvRI/fD2XVVdu+8ZBLoNKJT1fuXBX7hcEe61e4U3f5KR5GslVYXAoSdFERs8CpYZrgfhr7MjpH1EmYVI3vP8guOpZOiF/zHvkdNXywrH5Vcd0VqG90x77Hx4pURDnq13KpwVtsefS8xTSR7181Ac1MYekMmzk3vq+Hk9PiZRlPimlCf4Piw70N+i32dHrlHa3M/AhPGmUubx8zKa5H6qiAqxbqL9cMeEHe3bjpFjdMYx1OgbBt4xkmdFXjKM28i5lQk1fiYuOJhnkjxLnxhMGLzUeiC0hqu5YY4H6JgKm75RyHO+ujt32yZ12P6gJP/41vsOae+9sKP2XtxRt1e76sbOSl0v/t7sXFJv7VxWd1Yvl9c0+dvhfd0GHMSVg8KT1yRfTPjq+krtfVaQ1JO1Wm/cj76WIuAWXBYQzGJsSC8jyddKxFZcTR/gmeSAdFGSxzwo7ztEyRX9cJQn1g6zr36YzX9etaieq2dscjfzWMseIS9nnglPEn8uRfJAISDjr4jZzf1j88fCYNCTb/FIyi61f7ay8zCOhUsT5hGVP7Juotj0n7l/cup47u6Z6xySZ2KIObcuQTDb7jXukEwoBwHUp4TGZuOCxFQkJcjRJwTmjo1RSkWDUnAOdUx9r2v4Li/6MijJ/3jnyCP504MqR//Hx1+quwXZa3L/88FX5XdPNrdL8rdJXrfhk3ztyRckrz14TfjYJ9W7p3LaLqHmInno+RsiqxdxQ4B47tEneaxfRF+j1ji8L62vXhEO5o12rh2wrHjKSAiRvPdciuShIusqE6ahic0JqYyJviHRlwrTwEhAZM/COHceWSTPwGbdDoxG2PoA1qqwDCrbE0QxxMW7FZVqojYxfPYcd1AmXIzW/Y7igjYa8GgNdwcLwxgLYagzzhFCj+pC5vpNidpt+bejk7wdkn/42r7SH0PqOpSvvfkYydsLOTvJY4veAUImkifzlvhChYoOq673lCH1jKCiQJQUt6/M50Hi4SlmJOxMhdGDJA/DdaFwPRHqDhYGMRQYtshBaJjaLYHKLpQDp8L9aHV/bTz0nUcOybOeYbAYyLsjqSwunpywMKtwk8AKojOS23bWZGjcoWugf6m44ISyk0kRM3oY3jMrKmmtT9QAjYfm3UjQ/Agdw/qgJI+F639570FD4hySx8L145C8yW/mJXnfS4Ht+0V3bQ494qHBvB/IlTbPdgimatMJQ5JGAa5UoJVv/m+elzMHhobHg+H6ohbAIbh+JB+fP6biYCpPVHYhow2EKEnZ279j4oZsK4HkY1hx6wKQMHEPkjd6xMMQF+9wnSDGG9V2r3E782PLBF+PaCQEw0Uuku+sT6y1EiB59niiDhuuW7lG4lR/NyjJw8I7nZNP9eSxwrtxSN4spqFJvnoe7snblirSL0a4k6rI70PyofCqnrucJN8aPJayO6ckj24Z7OHJd57HBJKPPaNZ6w2xAaLPQPIehjKSPL9twhikxu0UuBK6aRRPHvfSMX0S3OKaw5NHUzFW/zJhZ2pkPyjJwy10H169pn49/KTx5L8p8vP6Y8Lz+tpHxW/M/6ktdFsleSRfCUkpFDJtK2tjoT2iytcs6uScvKnQtotsqNyibzFjxShtbj2tr7Hq4twk71WmD0HyJq8L84Pe/A3gyZsq5c65Smh4MXATMtY4JB/oM6k0kXa75eSROXGMIS7emQYrlu5LefdBiKyda31z8vHwNrkLxEQxUAMJrzMKvkAnhCEuzomaHYOZY12vkjIPW86l5zIWBiV53eltvQzHCCR7Tl6HtG1wYBWZXkFUvbic7V0xkm+3rXlbgEAfsLwRvoXOL6jBKsDLEGgzRqJqGvTB1ADE+hp/Hq0Y4/kx3dd4Tr3ZYgMWMG5cdAzXW9sOYzKJjyuwhQ4olli43fGOEOyi6Q0WxuuKe7jrI+AtuQqULuLydnaYNgucnpXb7+ztiq4nn15dz8MQF+/ufPDajq6R0LiDMmHKmMRFBpJHjN8Q5hyMFGNrquspIzpQXW87KkFHojQg9O4eP0Kai2jHbGdwkp/la21BERQWUoSFb83+9sBWOwx4bjtagVEL1V2AFMk3OUzEUGnygFAxgxysVrqd+9rs+bb2SoPn4QuQmx/z98jSYWr31bC5Sb4NxbZj9d9zwBxXn5w88KLafK+fw25kwMC4ISMKN0FFarUf3CcPCw4xrDS1JHA8ULbcokcehsg1HjR0eG2zZEuM2ynqcyKPxPi9GgsCF7ly8kx94r2HAeolD0O1sccdD7lF1zhlqS9SYkblRvb4Byd5rQjnckDNmNZX+NlMohgZXL3kV1vXx8UbDHu1M7oMQKh7YuPKnioZU96D51S5RsTcMbz0/lfzOKvXXiess1FIXittOWq238LJlntMAMugZKsVdvLLcfrJdCvjgznJiY1rOSQ/hqIWkt/KmhlaJ03M8M4t09FI3gxkvbqqPri+UY9vHaqfin3x+qP/1t/pa7kHvJz2eMVQyxnvBAkcyY9jr1mdsrGyFJIfZxxC8kvQL6wamaENj4zPG53klwASGcP0CXioOXLzo9Ov1h2HHJeCFyH5odbVNp7T1FgsIWIYMAqE5DNaTNsAorS5FEKQcQiWBQOCgeExICQvJC8pEcGAYEAwIBhYKAaE5Bc6sWIxD28xi8xF5oIBwcDUMCAkLyQvFrxgQDAgGBAMLBQDQvILndipWZPSH/FwBAOCAcHA8Bj4/wH1aKM9sxjETgAAAABJRU5ErkJggg==" alt="" />package org.apache.ibatis.session; import java.io.*;
import java.util.Properties;
import org.apache.ibatis.builder.xml.XMLConfigBuilder;
import org.apache.ibatis.exceptions.ExceptionFactory;
import org.apache.ibatis.executor.ErrorContext;
import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory; public class SqlSessionFactoryBuilder {
public SqlSessionFactoryBuilder() {
}
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
SqlSessionFactory var5;
try {
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
var5 = this.build(parser.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException var13) {
}
}
return var5;
} public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
SqlSessionFactory var5;
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
var5 = this.build(parser.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException var13) {
}
}
return var5;
} public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
}
public class XMLConfigBuilder extends BaseBuilder {
private boolean parsed;
private XPathParser parser;
private String environment;
private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
super(new Configuration());
ErrorContext.instance().resource("SQL Mapper Configuration");
this.configuration.setVariables(props);
this.parsed = false;
this.environment = environment;
this.parser = parser;
}
//解析
public Configuration parse() {
if (this.parsed) {
throw new BuilderException("Each XMLConfigBuilder can only be used once.");
} else {
this.parsed = true;
//从配置文件configuration节点作为根节点开始
this.parseConfiguration(this.parser.evalNode("/configuration"));
return this.configuration;
}
}
//从这里可以看到,解析是按顺序解析,也就是平时配置文件的标签顺序
private void parseConfiguration(XNode root) {
try {
this.propertiesElement(root.evalNode("properties"));
this.typeAliasesElement(root.evalNode("typeAliases"));
this.pluginElement(root.evalNode("plugins"));
this.objectFactoryElement(root.evalNode("objectFactory"));
this.objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
this.settingsElement(root.evalNode("settings"));
this.environmentsElement(root.evalNode("environments"));
this.databaseIdProviderElement(root.evalNode("databaseIdProvider"));
this.typeHandlerElement(root.evalNode("typeHandlers"));
this.mapperElement(root.evalNode("mappers"));
} catch (Exception var3) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + var3, var3);
}
}
}
public class XPathParser {
private Document document ;
private boolean validation; //是否开启验证
private EntityResolver entityResolver ; //用于加载本地D T D 文件
private Properties variables ; // mybatis.xml 中<propteries> 标签定义的键位对集合
private XPath xpath ; // XPath 对象
}
public class DefaultSqlSessionFactory implements SqlSessionFactory {
private final Configuration configuration;
…………
}
源码-mybatis-01-SqlSessionFactory创建的更多相关文章
- mybatis源码分析(1)——SqlSessionFactory实例的产生过程
在使用mybatis框架时,第一步就需要产生SqlSessionFactory类的实例(相当于是产生连接池),通过调用SqlSessionFactoryBuilder类的实例的build方法来完成.下 ...
- Mybatis源码分析之SqlSessionFactory(一)
简介 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBa ...
- 【iScroll源码学习01】准备阶段 - 叶小钗
[iScroll源码学习01]准备阶段 - 叶小钗 时间 2013-12-29 18:41:00 博客园-原创精华区 原文 http://www.cnblogs.com/yexiaochai/p/3 ...
- 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器
1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...
- dubbo源码分析1-reference bean创建
dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...
- NIO 源码分析(01) NIO 最简用法
目录 一.服务端 二.客户端 NIO 源码分析(01) NIO 最简用法 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) J ...
- AOP源码解析之二-创建AOP代理前传,获取AOP信息
AOP源码解析之二-创建AOP代理前传,获取AOP信息. 上篇文章对AOP的基本概念说清楚了,那么接下来的AOP还剩下两个大的步骤获取定义的AOP信息,生成代理对象扔到beanFactory中. 本篇 ...
- myBatis源码学习之SqlSessionFactory
上一篇博客 SqlSessionFactoryBuilder 中介绍了它的作用就是获得DefaultSqlSessionFactory SqlSessionFactory是一个接口,其具体实现类是De ...
- Spring IoC源码解析——Bean的创建和初始化
Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...
随机推荐
- JMeter写入文件
之前我们推文讨论过如何使用jmeter读取文件, 比如csv, txt文件读取, 只要配置csv数据文件, 即可非常容易的从文件中读取想要的数据, 但是如果数据已经从API或者DB中获取, 想存放到 ...
- Linux如何查找文件的创建时间
Linux的文件能否找到文件的创建时间取决于文件系统类型,在ext4之前的早期文件系统中(ext.ext2.ext3),文件的元数据不会记录文件的创建时间,它只会记录访问时间.修改时间.更改时间(状态 ...
- 从0开始的Python学习019更多的Python内容2
书接上文,接演Python全传 话说学了这么多Python的基础知识,也该写一点让别人看不懂的代码了. lambda lambda表达式,是一个方法的简化形似,它没有自己的代码块,它后面的语句就是它的 ...
- java有关 String char 常见问题 编辑中
1 输入输出有关 Scanner 的next()方法 返回值是String 所以尝试获得char时 应该用input.next().charAt[0] 2 空值 String 中null是指 对象引用 ...
- ajax实现用户登陆,退出,java做后端
最近http老师布置了个任务,用cookie完成登陆,退出.Http老师讲的是node.js写后端,由于自己还是擅长java些,还是用Java做了. 以前跟着教程写过一个网站,当初是用jsp+serv ...
- Ubuntu 16.04.1 LTS配置LNMP使用wordpress搭建博客
今天想用wordpress搭个博客,我的服务器是腾讯云的,然后腾讯云里有官方文档搭建的,但它是用centos为例, 搞得我的ubuntu跟着它走了些歪路,然后结合网上其它资料,终于一点一点的解决了. ...
- Oracle知识点总结2
1.聚合函数:也叫分组函数. 常用聚合函数:返回的都是NUMBER类型的值. 注:避免使用 COUNT(*) ,而使用 COUNT(ROWID) 2.分组统计:group by 字段名 having ...
- IDEA Can't Update No tracked branch configured for branch master or the branch doesn't exist.
IDEA Can't Update No tracked branch configured for branch master or the branch doesn't exist.To make ...
- CentOS7.x安装cobbler无人值守安装系统
CentOS7.x cobbler无人值守安装 cobbler介绍 自打若干年前 Red Hat,推出了 Kickstart,不再需要刻了光盘一台一台地安装 Linux,只要搞定 PXE.DHCP.T ...
- Vue (三) --- Vue 组件开发
------------------------------------------------------------------好心情,会让你峰回路转. 5. 组件化开发 5.1 组件[compo ...