tag:blogger.com,1999:blog-32820002539684117742024-03-28T18:43:36.972+10:30Improving Life Day By DayA blog containing tidbits of information that I find on a day by day basis while working with the joy that is XUbuntu and Java. This may include various Unix commands and how to use them, how to setup various servers, and anything Java related to my daily work.Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.comBlogger26125tag:blogger.com,1999:blog-3282000253968411774.post-63779737727676238322012-10-10T16:03:00.001+10:302012-10-10T16:03:28.937+10:30<h2>
How To Print A List of Comma-Seperated Values Nicely and Remove the Last (',') Comma Value</h2>
<br />
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">I recently wanted to take a list of Strings (i.e. List<String> list) and print that out with each value seperated by a comma and inside a set of brackets. The idea is I'd have something like this at the end:</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<code>
<span style="font-family: "Courier New", Courier, monospace;">(String1,String2,String3)</span></code></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">However my first cut attempt at a loop was creating the list above but with a superfluous ',' at the end like so:</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<code>
<span style="font-family: "Courier New", Courier, monospace;">(String1,Strng2,String3,) </span></code></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">Which was based on this code (where list was my List<String>):></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<code>
<span style="font-family: "Courier New",Courier,monospace;"> StringBuilder sb = new StringBuilder("("); <br /> for (String string : list) {<br /> sb.append(string);<br /> sb.append(",");<br /> }<br /> sb.append(")"); //close the end bracket </span></code></div>
<br />
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">So I decided to find a way or three to do this more nicely. What follows is 3 different ways of implementing this to get the correct implementation using a TestNG test case for testing. Each implem</span>entation, which achievs the same thing in each case is in one of the getVersion#() methods. Feel free to use any one of these 3 possible, simple implementations of the same thing to get the nicely comma seperated list with the end comma nicely removed.</span></div>
<div style="text-align: justify;">
<br /></div>
<code>
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"> <span style="font-size: small;">@Test</span></span></span><span style="font-size: small;"><br />
<span style="font-family: "Courier New",Courier,monospace;"> public void testClass() {</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> //Create a list of strings to be used in each test case</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> List<String> list = new ArrayList<String>(Arrays.asList("String1", "String2", "String3"));<br /> <br /> //setup the expected result string based on the list above<br /> final String EXPECTED_RESULT = "(String1,String2,String3)";<br /> <br /> StringBuffer sb = getVersion1(list);<br /> System.out.println("1st string test:" + sb.toString());<br /> Assert.assertEquals(sb.toString(), EXPECTED_RESULT);<br /> <br /> <code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">sb = getVersion2(list);</span></span></code></span></span></code><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><br /> System.out.println("2nd string test:" + sb2.toString());<br /> Assert.assertEquals(sb2.toString(), EXPECTED_RESULT);<br /> <br /> <code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">sb = getVersion3(list);</span></span></code></span></span></code><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><br /> System.out.println("3rd string test:" + sb3.toString());<br /> Assert.assertEquals(sb3.toString(), EXPECTED_RESULT);<br /> }</span></span></code><br />
<br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><string><string> /**</string></string></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><string><string> * This method puts the comma first so that we have the extra comma at the</string></string></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><string><string> * start and then uses the deleteCharAt() method to delete the 1st ','</string></string></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><string><string> */ </string></string></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><string><string> private StringBuffer getVersion1(List<string> list) { </string></string></string></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><string><string> <code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">//begin 1st case: ',' at start and deleteCharAt(0 or 1) <br /> </span></span></code></string></string></span></span></code><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><string><string><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">StringBuffer </span></span></code>sb = new </span></span></code></string></string></span></span></code><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><string><string><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">StringBuffer</span></span></code>("("); <br /> for (String string : list) {<br /> sb.append(",");<br /> sb.append(string);<br /> }<br /> sb.deleteCharAt(1); //remove 1st ',' symbol (or if extra char's before bracket increse number)<br /> sb.append(")"); //close the end bracket</span></span></code></string></string></span></span></code><br />
<br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><string><string> return sb;</string></string></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><string><string> }</string></string></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><string><string></string></string></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> /**</span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> * This method puts the comma at the end in the common wayand then uses </span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> * the deleteCharAt() method along with the length of the StringBuffer</span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> * to delete the last ',' symbol from the list before appending the ).</span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> */ </span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> private StringBuffer getVersion2(List<string> list) { </string></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> <code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">//begin 2nd case: ',' at end and deleteCharAt(last character)<br /> </span></span></code></span></span></code><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">StringBuffer </span></span></code>sb2 = new </span></span></code></span></span></code><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">StringBuffer</span></span></code>("("); <br /> for (String string : list) {<br /> sb2.append(string);<br /> sb2.append(",");<br /> }<br /> sb2.deleteCharAt(sb2.length() - 1); //remove the 1st ',' symbol<br /> sb2.append(")"); //close the end bracket </span></span></code></span></span></code><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"></span></span></code></span></span></code><br />
<br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> return sb;</span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> }</span></span></code><br />
<br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> /**</span></span></code><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> </span></span></code></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> * The final method of implementing this places the excess ',' at the end like </span></span></code></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> * is standard but then does the delete and append(")") steps in a single step</span></span></code></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> * via the replace() call which replaces the lat ',' with the ')' bracket.</span></span></code></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> */ </span></span></code></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> private StringBuffer getVersion3(List<string> list) { </string></span></span></code><br />
<code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"> <code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">//begin 3rd case: ',' at end and replace the last character with the bracket achieving both at the same time<br /> StringBuffer sb3 = new </span></span></code></span></span></code><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">StringBuffer</span></span></code></span></span></code>("("); <br /> for (String string : list) {<br /> sb3.append(string);<br /> sb3.append(",");<br /> }<br /> sb3.replace(sb3.length() - 1, sb3.length(), ")");</span></span></code></span></span></code><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"><code><span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;"></span></span></code></span></span></code><br />
<br />
<div style="text-align: justify;">
<span style="font-family: Arial,Helvetica,sans-serif;">So there ya go, 3 different methods all very similar, to implement a comma-seperated list without the pesky comma at the end of the list and implemented in a TestNG test with Assertions to prove it worked as expected. <b>Note:</b> In all 3 cases the performance is pretty much the same. When looking at the deleteCharAt() followed by an append() as compared to a replace() call they are pretty much identical in terms of what they are going to need to do. Although the internals vary the key performance hit is the call to the System.arrayCopy() which is where the time is spent. Either way there are 3 calls to System.arrayCopy() to perform this work, which reeally should be unsuprsing since in both cases we are doing pretty much the same thing just reducing the number of lines required to implement it. My choice is the 1st option as it looks the neatest (even if it does take one line more than the replace() method).</span></div>
Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-29031049100362021522012-10-10T15:17:00.000+10:302012-10-10T15:17:15.362+10:30How To Use: javap With Eclipse IDEI could write a blog post about this .... but instead ill let the following link do all the talking for me:<br />
<br />
<a href="http://stackoverflow.com/questions/7056987/how-to-use-javap-with-eclipse"> http://stackoverflow.com/questions/7056987/how-to-use-javap-with-eclipse</a><br />
<br />
So there ya go!Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-11409535522461090622012-05-09T15:45:00.000+09:302012-07-22T23:02:02.429+09:30JDK8 Roadmap/Timeline to Release<br />
<h2>
<u>JDK 8 Release Timeline Information</u></h2>
<div class="MsoNormal">
<br /></div>
I’ve been following both the JDK7 and then JDK8 development blogs for java for some time now as they both have large numbers of changes to the language (much like the large number of changes in JDK5 (generics, enums etc) and unlike JDK6 which was not much of a change at all). Thought that you may be interested in the following links which now give a timeline for the release of the next Java version JDK8: <br />
<br />
<a href="http://openjdk.java.net/projects/jdk8/">http://openjdk.java.net/projects/jdk8/</a><br />
<br />
To quote from the above source, here is the proposed milestone development schedule:<br />
<blockquote>
<table class="sched" summary="schedule">
<tbody>
<tr>
<td>2012/04/24</td>
<td>- M1</td>
</tr>
<tr>
<td>2012/06/14</td>
<td>- M2</td>
</tr>
<tr>
<td>2012/07/30</td>
<td>- M3</td>
</tr>
<tr>
<td>2012/09/11</td>
<td>- M4</td>
</tr>
<tr>
<td>2012/11/26</td>
<td>- M5</td>
</tr>
<tr>
<td>2013/01/30</td>
<td>- M6 – Feature Complete</td>
</tr>
<tr>
<td>2013/09/??</td>
<td>- GA – General Availability</td>
</tr>
</tbody></table>
</blockquote>
<div style="text-align: justify;">
The expectation at the end of M6 is that all features and new
test development will be complete with the exception of work on
component JSRs, which will be given additional time to bake until
early May 2013. Between M6 and GA the tolerance for further changes
will decrease in steps, with general bug fixes admitted up until
early April 2013, only P1-P3 bug fixes until mid-June 2013, and
only showstopper fixes after that.</div>
<br />
<div style="text-align: justify;">
This version should have the following main changes (of which the inclusion of closures/lambda calculus functionality will IMHO be one of the biggest changes ever introduced in Java ... larger even then the introduction of generics in JDK 5):</div>
<br />
<ul style="text-align: justify;">
<li>Project Coin – language changes...half of which were introduced in JDK7 and which you can read about on the web</li>
<li>Project Jigsaw – breaking up the monolithic sized JDK into separate MODULES with dependencies (a bit like Gradle/Maven/Ivy but for Java) ... more detail/links at: <a href="http://openjdk.java.net/projects/jigsaw/">http://openjdk.java.net/projects/jigsaw/</a> and quickstart guide with examples on Mark Reinholds blog: <a href="http://openjdk.java.net/projects/jigsaw/doc/quickstart.html">http://openjdk.java.net/projects/jigsaw/doc/quickstart.html</a> </li>
<li>Project Lambda – long standing effort (discussed since JDK5 and maybe even earlier) to introduce closures and related functionality into java: <a href="http://openjdk.java.net/projects/lambda">http://openjdk.java.net/projects/lambda</a> , see here for one of the latest documents providing information: <a href="http://cr.openjdk.java.net/%7Ebriangoetz/lambda/lambda-state-4.html">http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html</a> IMHO this will be a huge change to Java and the way programming occurs (as this pushes java towards a LISP style functional programming type language) and this is without doubt the change I (and many other developers also) are looking forward to the most.</li>
</ul>
<div style="text-align: justify;">
<br />
Its still a way away yet to the release date ... but worth
keeping in mind when considering updates to the SOE used by your work
place (or home projects) and when to make the jump from JDK6 to JDK7/8??<br />
<br />
---------------------------<br />
Notes: On JSR 337:<br />
<br />
---------------------------<br />
<br />
<br />
By the way the following link also has the dates for the JDK 8 JSR 337 Spec and its various Milestones:<br />
<br />
http://openjdk.java.net/projects/jdk8/spec/<br />
<br />
This is the primary web page for <a href="http://www.jcp.org/en/jsr/detail?id=337">JSR 337</a>, the Platform Umbrella JSR for Java SE 8.<br />
<h2>
Expert Group</h2>
<ul>
<li>Andrew Haley (Red Hat)</li>
<li>Steve Poole (IBM)</li>
<li>Mark Reinhold (Oracle)</li>
<li>TBD (Google)</li>
</ul>
<h2>
Schedule</h2>
<blockquote>
<table class="sched" summary="schedule"><tbody>
<tr><td>2012/7</td><td>Expert Group formation</td></tr>
<tr><td>2012/9</td><td>Early Draft Review</td></tr>
<tr><td>2013/1</td><td>Public Review</td></tr>
<tr><td>2013/6</td><td>Proposed Final Draft</td></tr>
<tr><td>2013/8</td><td>Final Release</td></tr>
</tbody></table>
</blockquote>
<h2>
Mailing lists</h2>
There are two mailing lists:<br />
<ul>
<li><a href="http://mail.openjdk.java.net/mailman/listinfo/java-se-8-spec-experts">java-se-8-spec-experts</a> is the Expert Group (EG) list. Only EG members may subscribe and post to this list, but the <a href="http://mail.openjdk.java.net/pipermail/java-se-8-spec-experts/">archives are public</a>.</li>
<li><a href="http://mail.openjdk.java.net/mailman/listinfo/java-se-8-spec-observers">java-se-8-spec-observers</a>
is for those who wish to monitor and, perhaps, discuss the EG's
progress. Messages sent to the primary EG list are automatically
forwarded to this list. Anyone may subscribe to this list, and any
subscriber may post. EG members are under no obligation to follow the
traffic on this list.</li>
</ul>
A formal feedback channel, most
likely in the form of an issue tracker, will be set up when a draft
specification is available for review.<br />
</div>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-4990127345551582742012-05-09T15:13:00.001+09:302012-05-09T15:36:05.666+09:30Differences in Creating a Servlet in versions 2.5 and 3.0 Of the Servlet Spec.<h2>
<u><b>Differences in Servlet Definitions between v2.5 and v3.0</b></u></h2>
<div style="text-align: justify;">
The following 2 examples show the difference between how a Servlet Java Class and associated web.xml deployment descriptor was changed in the upgrade from version 2.5 to version 3.0 of the Servlet Specification. I found this a simple and interesting look at the way the definition of a Servlet in code has now been simplified through the use of annotations from JSR 175.</div>
<br />
<h3>
<b><u>2.5 Version of Servlet Definition </u></b></h3>
<h4>
<u>Java Class Of Servlet in 2.5</u></h4>
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;">public class MyServlet extends HttpServlet {<br /> public void doGet (HttpServletRequest req, HttpServletResponse res) {<br /> ....<br /> }<br />}</span><br />
<h4>
<u>Deployment descriptor in 2.5 (web.xml) </u></h4>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><web-app></span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"> <servlet><br /> <servlet-name>MyServlet</servlet-name><br /> <servlet-class>samples.MyServlet</servlet-class><br /> </servlet><br /> <servlet-mapping></span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"> <servlet-name>MyServlet</servlet-name></span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"> <url-pattern>/MyApp</url-pattern><br /> </servlet-mapping><br /> ...<br /></web-app></span></div>
<br />
<h3>
<b><u>3.0 Version of Servlet Definition </u></b></h3>
<div style="text-align: justify;">
Here is the much simplified version written to the Servlet 3.0 API. As MyServlet is annotated as a servlet using the @Servlet annotation, it gets initialized during the start-up of the web container. Note that the deployment descriptor is optional in this case.</div>
<h4>
<u>Java Class Of Servlet in 3.0</u></h4>
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">@Servlet(urlMappings={"/MyApp"})</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">public class MyServlet {</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> @GET</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> public void handleGet(HttpServletRequest req, HttpServletResponse res) {</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> ....</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> }</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">}</span></span><br />
<h4>
<u>Deployment descriptor in 3.0 (web.xml) - Optional </u></h4>
<br />Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com8tag:blogger.com,1999:blog-3282000253968411774.post-72275355842129420392011-07-30T04:09:00.000+09:302011-07-30T04:09:26.620+09:30Java JDK 7 - Finally Released<h2 style="font-family: Arial,Helvetica,sans-serif; text-align: center;"><u>JDK 7 Released ... Finally!!!</u></h2><h2 style="font-family: Arial,Helvetica,sans-serif; text-align: center;"><u>A Detailed Overview Of New Features/Functionality in JDK7</u></h2><h3 style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"> </h3><h3 style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">Introduction </h3><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">The following long-ish blog entry is a relatively detailed overview of information for the JDK 7 Release of 29th July 2011 by Oracle. Given the release has just occurred I have collected a large amount of relatively detailed information regarding the JDK7 release that developers looking to upgrade from Java 1.6.0_26 to JDK7 will find useful. This information includes a general overview of the entire release with access via links to the various documentation you may need, release notes, installation instructions, JavaDoc API's etc., as well as changes that have been included and whether they have caused compatability and generally known issues that you may encounter. </span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">More importantly for most people that will find their way here Ive also included information about the Programming Language enhancements (these are the ones that if you've heard anything about Java 7 you would've heard about these) and include the various Project Coin upgrades, and new functionality like try-with-resources, multi-catch, Strings in switch statements, upgrades to numeric and binary literals, etc. Besides these Ive also included other enhancements that generally you are less likely to hear about as they arent discussed as often as they arent focussed at the programming language level per-se but can include things like JVM, Garbage Collector and various new Framework (fork./join, NIO2, etc) inclusions and improvements. If your primarily after this information which I think most people interested in Java 7 will be and you want to bypass the sections on JDK7 Release History, Release Notes and various JDK 7 Documentation, then simply skip ahead to the two sections on enhancements further down towards the end of this blog entry under the main title 'Overview of JDK 7 New Features' and each labelled with their respective titles:</span></div><ul><li><span style="font-family: Arial,Helvetica,sans-serif;">General Enhancements in the Java JDK 7</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Programming Language Enhancements in Java SE 7</span></li>
</ul><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Since a lot of this information is already accessible and has been provided by the implementers (Sun/Oracle) rather than copy/paste large slabs of text or re-write it myself with new examples etc., Ive focussed more on providing a brief introduction and over-view in all these cases and then providing a series of links to much more detailed information in the form of tutorials, explanations and specifications. The general idea of this blog entry is to provide a single point of entry for any and all information regarding Java 7 and to be able to get some initial info on what it is that your interested in before being re-directed to much more detailed information via outgoing links. Lets see how I do hey :-)!</span></div><span style="font-family: Arial,Helvetica,sans-serif;"> </span><br />
<h3 style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">Overview Of JDK7 Release History</h3><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">So after almost 5 years (four years, seven months, and seventeen days) since JDK 6 and after 9,494 bug fixes, 1,966 enhancements, 9,018 changesets, 147 builds, and four JSRs, JDK 7 is done (Thanks Mark Reinhold for that info: <a href="http://mreinhold.org/blog/jdk7-ga">http://mreinhold.org/blog/jdk7-ga</a>). Oracle announced the release of JDK 7 today (2011-07-29) which interestingly followed the scheduled release plan exactly which is reassuring to see for the future JDK8 release as it raises my level of trust that if they say they'll release JDK8 in 2012 that it'll actually happen unlike JDK7 which as we know see was delayed over and over for 5 years:</div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"><br />
</div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"><a href="http://openjdk.java.net/projects/jdk7/"> http://openjdk.java.net/projects/jdk7/</a><br />
<br />
The plan above was made up of 147 builds as mentioned comprising a total of 13 Milestones. Information on each of the milestones with further detailed information aboutwhat a particular feature in a milestone entails, along with a detailed calendar of build dates and milestones (for those interested in such things) is provided in the following two links:<br />
<br />
<ul><li> <a href="http://openjdk.java.net/projects/jdk7/calendar/">http://openjdk.java.net/projects/jdk7/calendar/</a> </li>
<li> <a href="http://openjdk.java.net/projects/jdk7/milestones/">http://openjdk.java.net/projects/jdk7/milestones/</a></li>
</ul></div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"><h3 style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">Overview Of Release Notes</h3></div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">The next link below is the main download page:</div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"><br />
</div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"> <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">http://www.oracle.com/technetwork/java/javase/downloads/index.html</a></div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"><br />
</div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">This page has downloads for both the previous version of JDK6 (1.6.0_26) as well as everything related to the new JDK7 release (ie: JDK7 with EE, JDK7 with Netbeans 7.0). Incidentally Netbeans 7.0 is a version of Netbeans that is already built to work with JDK7.0 so you can start using JDK7 with the Netbeans IDE straight away and get access to the cool features within the IDE (ie: the Project Coin features are useable and visible in the IDE and it gives correct information and code-completion for them already, which as I say is nifty and great that its available so early on the same day as the JDK 7 release itself).</div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"><br />
</div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">The index page for the Release Notes of JDK7 are at: </div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"></div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"> <a href="http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-429209.html">http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-429209.html</a></div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"><br />
</div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">These are detailed and include various documents. The first of these Ill look at is the Java SE 7 Features and Enhancments page located at:</div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"><br />
</div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"> <a href="http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html">http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html</a></div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"><br />
</div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">Since this is a major feature release this link includes information on the various features and enhancements in Java SE 7 and JDK 7. The beginning of the document above has a number of sections that highlight the Technology Changes as well as the various RFE (Requests For Enhancements) that were addressed. You can follow these links for more detailed information and I suggest doing so. Furthermore one of the last sections is a list of the known issues which Im linking to below as this is an important section of information. Skimming through this section there are a number of known issues in this release which its important to be aware of. One are where there seems to be a number of issues in is the use of Genereics and how Re-ification of Generics affects the type of code that can and can't be written. I found these useful to skim through simply to be aware of what can occur and when writing code I'll now be aware of what to look out for. See link for known issues:</div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"></div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"> <a href="http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html#knownissues">http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html#knownissues</a></div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"><br />
The Release Notes also provide info on compatability. Much like the known issues section this is also useful to read through to be aware of problems that may arise during upgrade from JDK6 to JDK7. Although in general and despite the introduction of a number of new features (which JDK6 didnt have compared to JDK5) the upgrade from 6 to 7 is actually quite painless. The list of compatability issues in the link below is quite small and limited to very specific cases. Though still usefull to read through I would recommend upgrade to 7 as soon as possible as these few very specific cases can a) be dealt with should they arise and b) the benefits from the new features more than out weigh any very minor upgrade problems.<br />
<br />
<a href="http://www.oracle.com/technetwork/java/javase/compatibility-417013.html">http://www.oracle.com/technetwork/java/javase/compatibility-417013.html</a><br />
<br />
Again the page above is very well written and the sections on incompatabilities are very detailed indicating which sections of the language are affected (eg: NIO, API, Language, etc):<br />
<br />
<a href="http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#incompatibilities">http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#incompatibilities</a><br />
<br />
The final parts of the Release Notes are info on a number of sections. These are listed along with their associated links and some short info below along with links to a variety of other docs and information links that are important for the JDK 7 release.<br />
<br />
<h3 style="font-family: Arial,Helvetica,sans-serif; text-align: left;">Overview Of JDK 7 Important Documentation and Links</h3><ul><li><b><u>Version Numbering and Naming Information</u></b> - This is information on the various numbering and naming standards used within this release of the JDK. Useful information since Java has an unusual set of naming standards. ie: the version string for the product is reported as "java version 1.7.0_3", the product will be called JDK 7u3, JDK 7 update 3 or, when the update version is not important, JDK 7. <a href="http://www.oracle.com/technetwork/java/javase/jdk7-naming-418744.html">http://www.oracle.com/technetwork/java/javase/jdk7-naming-418744.html</a></li>
<li><b><u>JDK and JRE 7 Installation Guide</u></b> - Provides information on performing an installation of each of the modules. If you've ever done a previous install of the Java Platform this is all old hat and Im providing it mainly for completeness sake: <a href="http://download.oracle.com/javase/7/docs/webnotes/install/index.html">http://download.oracle.com/javase/7/docs/webnotes/install/index.html</a></li>
<li><u><b>JDK and JRE 7 README Files</b></u> - High level README files which provide information on libraries, packages, endorsed override methods, the location of jars and libraries and packages within those libraries etc. </li>
<ul><li><a href="http://www.oracle.com/technetwork/java/javase/jdk-7-readme-429198.html">http://www.oracle.com/technetwork/java/javase/jdk-7-readme-429198.html</a></li>
<li><a href="http://www.oracle.com/technetwork/java/javase/jre-7-readme-430162.html">http://www.oracle.com/technetwork/java/javase/jre-7-readme-430162.html</a></li>
</ul><li><u><b>JDK7 Specifications</b></u> - This page contains links to the Java SE 7 Edition Language and Virtual Machine specifications. It also has archival links to previous specification versions. The specifications are important as they are the final word on how things SHOULD work and I have often turnesd to them in the past when new versions have come out to see why and how an implementation has been done (ie: previous Java Versions introduced the Integer/Char/Short/Byte internal caches and the specifications provided the final word on initial cache sizes etc). <a href="http://download.oracle.com/javase/cmn/spec_index.html">http://download.oracle.com/javase/cmn/spec_index.html</a></li>
<li><b><u>JDK7 API Docs</u></b> - This is one of the critical links and also one of the pieces of documentation any developer will return to time and again. The link is to the root of the java API doco (with new doco for new functionality added in JDK7 labelled using: since 1.7 in the JavaDocs as is standard). <a href="http://download.oracle.com/javase/7/docs/api/">http://download.oracle.com/javase/7/docs/api/</a></li>
<li><b><u>JDK 7 Tutorials</u></b> - A set of brand new tutorials has been created with the new functionality added in JDK 7 as a basis and added to the complete existing set of tutorials. All of the tutorials have been updated on the basis of the new release. The new tutorials based on the newly introduced JDK7 functionality are grouped at the start of the page and cover Project Coin functionality amongst other things and so are useful even for experienced Java developers to get a feel for the correct use of new functionality. <a href="http://download.oracle.com/javase/tutorial/">http://download.oracle.com/javase/tutorial/</a> </li>
<li><u><b>JDK 7 Trouble Shooting Guide</b></u> - This Java 7 Trouble Shooting Guide contains numerous links to various trouble shooting blogs. Although many of the performance links are JDK6 (since JDK7 has minimal performance features as these are saved for multi-core processing imlementations in JDK8) they ar still valid in the context of this JDK 7 release. <a href="http://download.oracle.com/javase/7/docs/webnotes/tsg/index.html">http://download.oracle.com/javase/7/docs/webnotes/tsg/index.html</a></li>
<li><u><b>JDK7 Documentation Index</b></u> - This page contains the high-level overview index for all of the API's and various JDK 7 components as well as a section on 'Whats New in JDK7 Documentation' which covers the new features and components which were implemented in this JDK. The first section is a series of tech notes for each section (such as JDBC, JNDI, AWT, Java2D etc.) while the 2nd section gives a good indication of what was added in this JDK release (ie: changes made to the garbage collector, the API's, NIO packages and usage, etc). </li>
<ul><li>JDK 7 Docs - <a href="http://download.oracle.com/javase/7/docs/index.html">http://download.oracle.com/javase/7/docs/index.html</a></li>
<li>JDK 7 New Features - <a href="http://download.oracle.com/javase/7/docs/index.html#NewFeature">http://download.oracle.com/javase/7/docs/index.html#NewFeature </a></li>
</ul></ul><br />
Ive list the changes mentioned in the second section in the final point above in more detail in the following section as these are a good way of seeing whats changed in the JDK for this version.<br />
<br />
</div><h3 style="font-family: Arial,Helvetica,sans-serif; text-align: left;">Overview Of JDK 7 New Features</h3><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">A good source of an overview for fetaures included in this release is the wiki page (at: <a href="http://en.wikipedia.org/wiki/Java_version_history#Java_SE_7_.28July_28.2C_2011.29">http://en.wikipedia.org/wiki/Java_version_history#Java_SE_7_.28July_28.2C_2011.29</a>) and this provides not just the main features but also info on things less well publicised as they are not code features but underlying functionality (such as the info on the XRenderer etc). Another good source of detailed information discussing the various Project Coin features in detail is Oracle's page located at: </div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"><br />
</div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"> <a href="http://download.oracle.com/javase/7/docs/technotes/guides/language/enhancements.html#javase7">http://download.oracle.com/javase/7/docs/technotes/guides/language/enhancements.html#javase7</a> </div><div class="br" style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"><br />
<h3 style="font-family: Arial,Helvetica,sans-serif;"><a href="http://download.oracle.com/javase/7/docs/index.html#NewFeature" name="javase7">General Enhancements in the Java JDK 7</a> </h3>The enhancements listed here cover the entire JDK 7 release. Actual code/coding enhancements will be listed in the section 'Programming Language Enhancements in Java SE 7' below while here I'll list things like changes to API's, the garbage collector, the JVM, etc. While the programming language changes have been discussed at length in the leadup to the release of Java 7 the following set of updates and new functionality have in general received less coverage and so are covered at some length here.<br />
<ul><li><b><u>Swing Enhancements in JDK 7</u></b> - Include a number of features that make the use of Swing and AWT easier to implement as well as the implementation of a number of cool features. The Nimbus Look and Feel has been moved from the sun.* packages to within javax.*, and features such as the ability to now create translucent and shaped (ie: non-rectangular) windows which is cool and to use JLayer to draw on top of any components without actually changing the underlying components (also cool) have been provided. <a href="http://download.oracle.com/javase/7/docs/technotes/guides/swing/7.0/index.html">http://download.oracle.com/javase/7/docs/technotes/guides/swing/7.0/index.html</a></li>
<ul><li>The <a href="http://download.oracle.com/javase/7/docs/api/javax/swing/JLayer.html"><code>JLayer</code></a> class has been added, which is a flexible and powerful decorator for Swing components; allowing you to draw on underlying components and respond to events without modification of the component; see <a href="http://download.oracle.com/javase/tutorial/uiswing/misc/jlayer.html">How to Decorate Components with JLayer</a>.</li>
<li>The <a href="http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/nimbus.html">Nimbus Look and Feel</a> has been moved from the <code>com.sun.java.swing</code> package to the <code>javax.swing</code> package; see the <a href="http://download.oracle.com/javase/7/docs/api/javax/swing/plaf/nimbus/package-summary.html"><code>javax.swing.plaf.nimbus</code></a> package and the link above gives you the start of a tutorial on its use as well as a quick look at its Look & Feel.</li>
<li><a href="http://java.sun.com/developer/technicalArticles/GUI/mixing_components/index.html">Mixing Heavyweight and Lightweight Components</a> which historically was difficult is easier to accomplish in JDK7.</li>
<li>Windows with transparency and non-rectangular shape are supported; see <a href="http://download.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html">How to Create Translucent and Shaped Windows</a></li>
<li>An HSV tab has been added to the <a href="http://download.oracle.com/javase/7/docs/api/javax/swing/JColorChooser.html"><code>JColorChooser</code></a> class which allows users to select colors using the Hue-Saturation-Luminance (HSL) color model.</li>
</ul><li><b><u>Networking Enhancments in JDK 7</u></b> -The <a href="http://download.oracle.com/javase/7/docs/api/java/net/URLClassLoader.html#close%28%29"><code>URLClassLoader.close</code></a> method has been added; see <a href="http://download.oracle.com/javase/7/docs/technotes/guides/net/ClassLoader.html">Closing a URLClassLoader</a>. The Sockets Direct Protocol (SDP) provides access to high performance network connections; see <a href="http://download.oracle.com/javase/tutorial/sdp/sockets/index.html">Understanding the Sockets Direct Protocol</a>. <a href="http://download.oracle.com/javase/7/docs/technotes/guides/net/enhancements-7.0.html">http://download.oracle.com/javase/7/docs/technotes/guides/net/enhancements-7.0.html</a></li>
<li><b><u>Collection Enhancments in JDK 7</u></b> - The <a href="http://download.oracle.com/javase/7/docs/api/java/util/concurrent/TransferQueue.html"><code>TransferQueue</code></a> interface has been added, which is a refinement of the <tt><a href="http://download.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html">BlockingQueue</a></tt> interface in which producers can wait for consumers to receive elements. The new class <a href="http://download.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedTransferQueue.html"><code>LinkedTransferQueue</code></a> implements the <code>TransferQueue</code> interface which is a new implementation included for the first time in JDK 7. <a href="http://download.oracle.com/javase/7/docs/technotes/guides/collections/changes7.html">http://download.oracle.com/javase/7/docs/technotes/guides/collections/changes7.html</a></li>
<li><b><u>Java I/O Enhancements in JDK 7</u></b> - This release includes the addition of a new method UrlClassLoader.close(), the addition of Sockets Direct Protocol concepts as well as the general introduction of NIO2 in JDK7 (see the java.nio.file API JavaDoc that was introduced for Java 7 for an overview of the new Files and FileSystem methods available within this package: <a href="http://download.oracle.com/javase/7/docs/api/java/nio/file/package-summary.html">http://download.oracle.com/javase/7/docs/api/java/nio/file/package-summary.html</a>) and the ability to create custom file providers as well as an implemented Custom File Provider in the form of the Zip File System Provider. <a href="http://download.oracle.com/javase/7/docs/technotes/guides/io/enhancements.html#javase7">http://download.oracle.com/javase/7/docs/technotes/guides/io/enhancements.html#javase7</a></li>
<ul><li>The <a href="http://download.oracle.com/javase/7/docs/api/java/net/URLClassLoader.html#close%28%29"><code>URLClassLoader.close</code></a> method has been added; see <a href="http://download.oracle.com/javase/7/docs/technotes/guides/net/ClassLoader.html">Closing a URLClassLoader</a>.</li>
<li>The Sockets Direct Protocol (SDP) provides access to high performance network connections; see <a href="http://download.oracle.com/javase/tutorial/sdp/sockets/index.html">Understanding the Sockets Direct Protocol</a>.</li>
<li> Developing a Custom File System Provider - <a href="http://download.oracle.com/javase/7/docs/technotes/guides/io/fsp/filesystemprovider.html">http://download.oracle.com/javase/7/docs/technotes/guides/io/fsp/filesystemprovider.html</a></li>
<li>Zip File System Provider provided in JDK 7 which is an implementation of the Custom File System Provider - <a href="http://download.oracle.com/javase/7/docs/technotes/guides/io/fsp/zipfilesystemprovider.html">http://download.oracle.com/javase/7/docs/technotes/guides/io/fsp/zipfilesystemprovider.html</a></li>
</ul><li><b><u>Java SE 7 Security Enhancements</u></b> - Include the ability to switch of weak crypto algorithms, the addittion of a new native provider that contains several implementations of Elliptic Curve Cryptography (ECC) algorithms, and the inclusion of 10 various major level improvements to SSL/TLS which are detailed in the link below. <a href="http://download.oracle.com/javase/7/docs/technotes/guides/security/enhancements7.html">http://download.oracle.com/javase/7/docs/technotes/guides/security/enhancements7.html</a></li>
<ul><li>A new native provider has been added that provides several ECC-based algorithms (ECDSA/ECDH); see <a href="http://download.oracle.com/javase/7/docs/technotes/guides/security/p11guide.html#ALG">Sun PKCS#11 Provider's Supported Algorithms</a> in <a href="http://download.oracle.com/javase/7/docs/technotes/guides/security/p11guide.html">Java PKCS#11 Reference Guide</a>.</li>
<li>Weak cryptographic algorithms can now be disabled; see <a href="http://download.oracle.com/javase/7/docs/technotes/guides/security/certpath/CertPathProgGuide.html#AppD">Appendix D: Disabling Cryptographic Algorithms</a> in <a href="http://download.oracle.com/javase/7/docs/technotes/guides/security/certpath/CertPathProgGuide.html">Java PKI Programmer's Guide</a> and <a href="http://download.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#DisabledAlgorithms">Disabled Cryptographic Algorithms</a> in <a href="http://download.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html">Java Secure Socket Extension (JSSE) Reference Guide</a>.</li>
<li>Various enhancements related to SSL/TLS have been added to <a href="http://download.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html">Java Secure Socket Extension</a>. </li>
</ul><li><b><u>Concurrency Utilities Enhancements in Java SE 7</u></b> - The fork/join framework was a major introduction in JDK 7. Along with this the ThreadLocalRandom and Phaser classes have been added. <a href="http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/changes7.html">http://download.oracle.com/javase/7/docs/technotes/guides/concurrency/changes7.html</a></li>
<ul><li>The fork/join framework, which is based on the <a href="http://download.oracle.com/javase/7/docs/api/java/util/concurrent/ForkJoinPool.html"><code>ForkJoinPool</code></a> class, is an implementation of the <a href="http://download.oracle.com/javase/7/docs/api/java/util/concurrent/Executor.html"><code>Executor</code></a> interface. It is designed to efficiently run a large number of tasks using a pool of worker threads. A <i>work-stealing</i> technique is used to keep all the worker threads busy, to take full advantage of multiple processors. See <a href="http://download.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html">Fork/Join</a> in The Java Tutorials. <ul><li>The directory <code><i><java home=""></java></i>/sample/forkjoin/</code> contains samples that demonstrate the fork/join framework.</li>
</ul></li>
<li>The <a href="http://download.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadLocalRandom.html"><code>ThreadLocalRandom</code></a> class eliminates contention among threads using pseudo-random numbers; see <a href="http://download.oracle.com/javase/tutorial/essential/concurrency/threadlocalrandom.html"> Concurrent Random Numbers</a>.</li>
<li>The <a href="http://download.oracle.com/javase/7/docs/api/java/util/concurrent/Phaser.html"><code>Phaser</code></a> class is a new synchronization barrier, similar to <a href="http://download.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html"><code>CyclicBarrier</code></a>. </li>
</ul><li><b><u>Client JRE Enhancements (ie: RIA) in Java SE 7</u></b> - Java Rich Internet Applications are becoming increasingly sophisticated with each release of the JRE and JRE7 continues this trend with a number of new features added. <a href="http://download.oracle.com/javase/7/docs/technotes/guides/jweb/clientJRECapabilitiesCheatSheet.html">http://download.oracle.com/javase/7/docs/technotes/guides/jweb/clientJRECapabilitiesCheatSheet.html</a></li>
<ul><li>The window of a dragged applet can be decorated with a default or custom title; see <a href="http://download.oracle.com/javase/tutorial/deployment/applet/draggableApplet.html#decoration">Requesting and Customizing Applet Decoration in Draggable Applets</a>.</li>
<li>The following enhancements have been made to the syntax of JNLP files; see <a href="http://download.oracle.com/javase/7/docs/technotes/guides/javaws/developersguide/syntax.html">JNLP File Syntax</a>: <ul><li>The <code>os</code> attribute in the <code>information</code> and <code>resources</code> elements can now contain specific versions of Windows, such as Windows Vista or Windows 7.</li>
<li>Applications can use the <code>install</code> attribute in the <code>shortcut</code> element to specify their their desire to be installed. Installed applications are not removed when the Java Web Start cache is cleared, but can be explicitly removed using the Java Control Panel.</li>
<li>Java Web Start applications can be deployed without specifying the <code>codebase</code> attribute; see <a href="http://download.oracle.com/javase/tutorial/deployment/deploymentInDepth/deployingWithoutCodebase.html">Deploying Without Codebase</a></li>
</ul></li>
<li>A JNLP file can be embedded into an HTML page; see <a href="http://download.oracle.com/javase/tutorial/deployment/deploymentInDepth/embeddingJNLPFileInWebPage.html">Embedding JNLP File in Applet Tag</a>.</li>
<li>You can check the status variable of the applet while it is loading to determine if the applet is ready to handle requests from JavaScript code; see <a href="http://download.oracle.com/javase/tutorial/deployment/applet/appletStatus.html">Handling Initialization Status With Event Handlers</a>.</li>
<li>You now have control of the window decoration style and title of an applet launched from a shortcut or dragged out of the browser; see <a href="http://download.oracle.com/javase/tutorial/deployment/applet/draggableApplet.html#decoration"> Requesting and Customizing Applet Decoration</a> in <a href="http://download.oracle.com/javase/tutorial/deployment/applet/draggableApplet.html">Developing Draggable Applets</a>.</li>
</ul><li><b><u>Java 2D Enhancments in Java SE 7</u></b> - Contains a number of different enhancements. <a href="http://download.oracle.com/javase/7/docs/technotes/guides/2d/enhancements70.html">http://download.oracle.com/javase/7/docs/technotes/guides/2d/enhancements70.html</a></li>
<ul><li>A new XRender-based Java 2D rendering pipeline is supported for modern X11-based desktops, offering improved graphics performance; see the <code>xrender</code> flag in <a href="http://download.oracle.com/javase/7/docs/technotes/guides/2d/flags.html#xrender">System Properties for Java 2D Technology</a>.</li>
<li>The JDK now enumerates and displays installed OpenType/CFF fonts through methods such as <a href="http://download.oracle.com/javase/7/docs/api/java/awt/GraphicsEnvironment.html#getAvailableFontFamilyNames%28%29"> <code>GraphicsEnvironment.getAvailableFontFamilyNames</code></a>; these fonts are also recognized by the <a href="http://download.oracle.com/javase/7/docs/api/java/awt/Font.html#createFont%28int,%20java.io.InputStream%29"><code>Font.createFont</code></a> method. See <a href="http://download.oracle.com/javase/tutorial/2d/text/fonts.html">Selecting a Font</a>.</li>
<li>The <a href="http://download.oracle.com/javase/7/docs/api/java/awt/font/TextLayout.html"><code>TextLayout</code></a> class supports Tibetan script.</li>
<li><code>libfontconfig</code>, a font configuration API, is used to select fonts to use for the logical fonts for some implementations of Linux; see <a href="http://www.fontconfig.org/">Fontconfig</a>. </li>
</ul><li><u><b>Java XML Technologies Enhancements in Java SE 7</b></u> - This release contains <a href="http://jaxp.java.net/">Java API for XML Processing</a> (JAXP) 1.4.5, supports <a href="http://jaxb.java.net/">Java Architecture for XML Binding</a> (JAXB) 2.2.3, and supports <a href="http://jax-ws.java.net/">Java API for XML Web Services</a> (JAX-WS) 2.2.4. Further information on each of these changes is found at with the following changes to each of (JAXP, JAXB, JAX-WS): <a href="http://download.oracle.com/javase/7/docs/technotes/guides/xml/enhancements.html">http://download.oracle.com/javase/7/docs/technotes/guides/xml/enhancements.html</a></li>
<ul><li>JAXP - For more information, see the <a href="http://jaxp.java.net/1.4/1.4.5/ReleaseNotes.html">JAXP 1.4.5 Release Notes</a> and the <a href="http://jaxp.java.net/1.4/1.4.5/changelog.html">JAXP 1.4.5 Change log</a>.</li>
<ul><li>The Java SE 7 release now contains <a href="http://jaxp.java.net/">Java API for XML Processing</a> (JAXP) 1.4.5.</li>
<li>There have been many bug fixes and some improvements over the previous version, particularly in the areas of conformance, security, and performance.</li>
<li>The specification is still JAXP 1.4, however StAX has been upgraded to StAX 1.2 in accordance with the JSR 173 Maintenance Review 3.</li>
</ul><li>JAXB - The Java SE 7 release supports <a href="http://jaxb.java.net/">Java Architecture for XML Binding</a> (JAXB) 2.2.3. For more information, see the <a href="http://jaxb.java.net/nonav/2.2.3u1/docs/changelog2.html">JAXB Change log</a> for JAXB RI 2.2 and above.</li>
<li>JAX-WS - The Java SE 7 release supports <a href="http://jax-ws.java.net/">Java API for XML Web Services</a> (JAX-WS) 2.2.4. For more information, see the <a href="http://jax-ws.java.net/nonav/2.2.3/docs/changelog.html">JAX-WS Change log</a> for JAX-WS RI 2.2 and above.</li>
</ul></ul><ul><li><b><u>java.lang.* and java.util.* Enhancements in Java SE 7</u></b> - The primary enhancement was that potential deadlocks were eliminated for multithreaded, non-hierarchically delegating custom class loaders; see <a href="http://download.oracle.com/javase/7/docs/technotes/guides/lang/cl-mt.html">Multithreaded Custom Class Loaders in Java SE 7</a>. <a href="http://download.oracle.com/javase/7/docs/technotes/guides/lang/enhancements.html#7">http://download.oracle.com/javase/7/docs/technotes/guides/lang/enhancements.html#7</a></li>
<li><u><b>Internationalisation Enhancements in Java SE 7</b></u> - These include the introduction of Unicode 6.0.0 into Java SE 7 along with the use of Unicode 6.0.0 in Regular Expressions, various improvements to the Currency class to allow the use of ISO 4217 and the use of new methods in <a class="APILink" href="http://download.oracle.com/java/awt/font/NumericShaper.html" target="_blank"><code>java.awt.font.NumericShaper</code></a> and Locale support for these changes. <a href="http://download.oracle.com/javase/7/docs/technotes/guides/intl/enhancements.7.html">http://download.oracle.com/javase/7/docs/technotes/guides/intl/enhancements.7.html</a></li>
<ul><li>Unicode Tutorial - <a href="http://download.oracle.com/javase/tutorial/i18n/text/unicode.html">http://download.oracle.com/javase/tutorial/i18n/text/unicode.html</a></li>
<li>Numeric Shaper Tutorial for Shaped Digits - <a href="http://download.oracle.com/javase/tutorial/i18n/text/shapedDigits.html">http://download.oracle.com/javase/tutorial/i18n/text/shapedDigits.html</a> </li>
</ul><li><b><u>JVM Enhancements in Java SE 7</u></b> - JVM Enhancements Tools are both described here. <a href="http://download.oracle.com/javase/7/docs/technotes/guides/vm/index.html">http://download.oracle.com/javase/7/docs/technotes/guides/vm/index.html</a> . The changes to the JVM include the following (along with links to the VM Options that are now possible through Java SE 7):</li>
<ul><li><a href="http://download.oracle.com/javase/7/docs/technotes/guides/vm/multiple-language-support.html">Java Virtual Machine Support for Non-Java Languages</a>: Java SE 7 introduces a new JVM instruction that simplifies the implementation of dynamically typed programming languages on the JVM.</li>
<li><a href="http://download.oracle.com/javase/7/docs/technotes/guides/vm/G1.html">Garbage-First Collector</a> is a server-style garbage collector that replaces the Concurrent Mark-Sweep Collector (CMS).</li>
<li><a href="http://download.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html">Java HotSpot Virtual Machine Performance Enhancements</a></li>
<li>Some operating characteristics of the Java HotSpot VM can be controlled by the use of command-line flags.<br />
</li>
<li><b>Standard HotSpot VM Options for <a href="http://download.oracle.com/javase/7/docs/technotes/tools/windows/java.html">Microsoft Windows</a> | <a href="http://download.oracle.com/javase/7/docs/technotes/tools/solaris/java.html">Solaris and Linux Operating Environments </a></b> - The command-line options supported by the Java HotSpot VMs are described on the reference pages for the Java application launcher.</li>
<li><b><a href="http://java.sun.com/docs/hotspot/VMOptions.html">Non-standard Java HotSpot VM Options</a></b> - Non-standard options recognized by the current implementations of the VMs, but not necessarily by future or non-Sun implementations, are described on this web page.</li>
</ul><li><u><b>JDBC 4.1 in Java SE 7</b></u> - JDBC4.1 is newly created and included within Java SE 7. The new programming language changes, in particular in this case, try-with-resource, is used to close off the various Connection, Statement, ResultSet classes. Also, included is the use of the new Rowset 1.1 API/Package implementation which allows the use of a RowSetFactory to create RowSet (such as Jdbc/Join/Web/Filtered/Cached RowSet) objects. Detailed examples of proper code and usage are provided to give a feel for the new functionality with an example for each new concept given. <a href="http://download.oracle.com/javase/7/docs/technotes/guides/jdbc/jdbc_41.html">http://download.oracle.com/javase/7/docs/technotes/guides/jdbc/jdbc_41.html</a></li>
<li><u><b>Java Programming Language Enhancements in Java SE 7</b></u> - These are listed below in further detail - <a href="http://download.oracle.com/javase/7/docs/technotes/guides/language/enhancements.html#javase7">http://download.oracle.com/javase/7/docs/technotes/guides/language/enhancements.html#javase7</a></li>
</ul></div><h3 style="font-family: Arial,Helvetica,sans-serif;"><a href="http://www.blogger.com/post-create.g?blogID=3282000253968411774" name="javase7">Programming Language Enhancements in Java SE 7</a></h3><h3 style="font-family: Arial,Helvetica,sans-serif; font-weight: normal; text-align: justify;"><span style="font-size: small;"><span style="font-family: Arial,Helvetica,sans-serif;">The following programming language enhancements and new functionality (as mentioned earlier) have been discussed at some length on blogs etc., prior to the Java 7 release and so here I will cover the new features and aprt from a breif overview provide links to further information. </span></span></h3><ul><li style="text-align: justify;"><b><a href="http://download.oracle.com/javase/7/docs/technotes/guides/language/binary-literals.html" style="font-family: Arial,Helvetica,sans-serif;">Binary Literals</a></b><span style="font-family: Arial,Helvetica,sans-serif;"> - In Java SE 7, the integral types</span> (<code>byte</code>, <code>short</code>, <code>int</code>, and <code>long</code>)<span style="font-family: Arial,Helvetica,sans-serif;"> can also be expressed using the binary number system. To specify a binary literal, add the prefix </span><code>0b</code><span style="font-family: Arial,Helvetica,sans-serif;"> or </span><code>0B</code> <span style="font-family: Arial,Helvetica,sans-serif;">to the number.</span></li>
<li style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"><b><a href="http://download.oracle.com/javase/7/docs/technotes/guides/language/underscores-literals.html">Underscores in Numeric Literals</a></b> - Any number of underscore characters (<code>_</code>) can appear anywhere between digits in a numerical literal. This feature enables you, for example, to separate groups of digits in numeric literals, which can improve the readability of your code.</li>
<li style="text-align: justify;"><b><a href="http://download.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.html" style="font-family: Arial,Helvetica,sans-serif;">Strings in switch Statements</a></b><span style="font-family: Arial,Helvetica,sans-serif;"> - You can use the</span> <code>String</code> <span style="font-family: Arial,Helvetica,sans-serif;">class in the expression of a</span> <code>switch</code> <span style="font-family: Arial,Helvetica,sans-serif;">statement.</span></li>
<li style="text-align: justify;"><b><a href="http://download.oracle.com/javase/7/docs/technotes/guides/language/type-inference-generic-instance-creation.html" style="font-family: Arial,Helvetica,sans-serif;">Type Inference for Generic Instance Creation</a></b><span style="font-family: Arial,Helvetica,sans-serif;"> - You can replace the type arguments required to invoke the constructor of a generic class with an empty set of type parameters</span> (<code><></code>)<span style="font-family: Arial,Helvetica,sans-serif;"> as long as the compiler can infer the type arguments from the context. This pair of angle brackets is informally called the</span> <i>diamond</i>.</li>
<li style="text-align: justify;"><b><a href="http://download.oracle.com/javase/7/docs/technotes/guides/language/non-reifiable-varargs.html" style="font-family: Arial,Helvetica,sans-serif;">Improved Compiler Warnings and Errors When Using Non-Reifiable Formal Parameters with Varargs Methods</a></b><span style="font-family: Arial,Helvetica,sans-serif;"> - The Java SE 7 complier generates a warning at the declaration site of a varargs method or constructor with a non-reifiable varargs formal parameter. Java SE 7 introduces the compiler option </span><code>-Xlint:varargs</code> <span style="font-family: Arial,Helvetica,sans-serif;">and the annotations</span> <code>@SafeVarargs</code> <span style="font-family: Arial,Helvetica,sans-serif;">and </span><code>@SuppressWarnings({"unchecked", "varargs"})</code><span style="font-family: Arial,Helvetica,sans-serif;"> to supress these warnings</span>.</li>
<li style="text-align: justify;"><b><a href="http://download.oracle.com/javase/7/docs/technotes/guides/language/try-with-resources.html" style="font-family: Arial,Helvetica,sans-serif;">The try-with-resources Statement</a></b><span style="font-family: Arial,Helvetica,sans-serif;"> - The </span><code style="font-family: Arial,Helvetica,sans-serif;">try</code><span style="font-family: Arial,Helvetica,sans-serif;">-with-resources statement is a </span><code>try</code> <span style="font-family: Arial,Helvetica,sans-serif;">statement that declares one or more resources. A</span> <i>resource</i> <span style="font-family: Arial,Helvetica,sans-serif;">is an object that must be closed after the program is finished with it. The </span><code style="font-family: Arial,Helvetica,sans-serif;">try</code><span style="font-family: Arial,Helvetica,sans-serif;">-with-resources statement ensures that each resource is closed at the end of the statement. Any object that implements the new</span> <code>java.lang.AutoCloseable</code><span style="font-family: Arial,Helvetica,sans-serif;"> interface or the</span> <code>java.io.Closeable</code><span style="font-family: Arial,Helvetica,sans-serif;"> interface can be used as a resource. The classes</span> <code>java.io.InputStream</code>, <code>OutputStream</code>, <code>Reader</code>, <code>Writer</code>, <code>java.sql.Connection</code>, <code>Statement</code>, <span style="font-family: Arial,Helvetica,sans-serif;">and </span><code>ResultSet</code> <span style="font-family: Arial,Helvetica,sans-serif;">have been retrofitted to implement the</span> <code>AutoCloseable</code><span style="font-family: Arial,Helvetica,sans-serif;"> interface and can all be used as resources in a </span><code style="font-family: Arial,Helvetica,sans-serif;">try</code><span style="font-family: Arial,Helvetica,sans-serif;">-with-resources statement.</span></li>
<li style="text-align: justify;"><b><a href="http://download.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html" style="font-family: Arial,Helvetica,sans-serif;">Catching Multiple Exception Types and Rethrowing Exceptions with Improved Type Checking</a></b><span style="font-family: Arial,Helvetica,sans-serif;"> - A single</span> <code>catch</code><span style="font-family: Arial,Helvetica,sans-serif;"> block can handle more than one type of exception. In addition, the compiler performs more precise analysis of rethrown exceptions than earlier releases of Java SE. This enables you to specify more specific exception types in the </span><code>throws</code> <span style="font-family: Arial,Helvetica,sans-serif;">clause of a method declaration.</span></li>
</ul><h3 style="font-family: Arial,Helvetica,sans-serif; text-align: left;">The Future .... JDK 8</h3><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-weight: normal; text-align: justify;">Although Java 7 has only just been released today the future is coming (some might say its already here), since Java 7 was part of a two pronged strategy undertaken late last year (2010) to ensure a JDK release in 2011 (given that it had been 5 years since releases). With the takeover of Sun by Oracle last year and the Java release having been pushed back several times a proposal was made by Mark Reinhold on his blog (<a href="http://blogs.sun.com/mr/entry/rethinking_jdk7">http://blogs.sun.com/mr/entry/rethinking_jdk7</a>) for one of two options. Push ahead with the current plans for Java and take another 2 or 3 years to the release or trim down the functionality set and aim for a mid-2011 followed by a late-2012 release with the remaining functionality initially proposed for Java 7 to be released in Java 8. The descision to go with the second option can be seen on Marks blog:</span></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-weight: normal; text-align: justify;"> <a href="http://mreinhold.org/blog/plan-b">http://mreinhold.org/blog/plan-b</a></span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-weight: normal; text-align: justify;"> </span></div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-weight: normal; text-align: justify;"> Labelled Plan B it looked roughly like:</span></div><ul><li><span style="font-family: Arial,Helvetica,sans-serif; font-weight: normal; text-align: justify;">JDK 7 (minus Lambda, Jigsaw, and part of Project Coin) Mid 2011</span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif; font-weight: normal; text-align: justify;">JDK 8 (Lambda, Jigsaw, the rest of Project Coin, ++) Late 2012</span></li>
</ul><span style="font-family: Arial,Helvetica,sans-serif; font-weight: normal; text-align: justify;">A detailed list of functionality for the two JDK's followed: </span><br />
<ul><li><span style="font-family: Arial,Helvetica,sans-serif; font-weight: normal; text-align: justify;">JDK7 Features - <a href="http://openjdk.java.net/projects/jdk7/features/">http://openjdk.java.net/projects/jdk7/features/</a></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif; font-weight: normal; text-align: justify;">JDK8 Features - <a href="http://openjdk.java.net/projects/jdk7/features/#deferred">http://openjdk.java.net/projects/jdk7/features/#deferred</a></span></li>
</ul><span style="font-family: Arial,Helvetica,sans-serif; font-weight: normal; text-align: justify;">Along with both a JSR for JDK 8: </span><br />
<ul><li><a href="http://www.jcp.org/en/jsr/detail?id=337"><span style="font-family: Arial,Helvetica,sans-serif; font-weight: normal; text-align: justify;">http://www.jcp.org/en/jsr/detail?id=337</span></a></li>
</ul><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif; font-weight: normal; text-align: justify;">And a set of project pages for each of the JDK 8 features to be implemented still:</span></div><ul style="text-align: justify;"><li><span style="font-family: Arial,Helvetica,sans-serif;">JSR 294: Language and VM support for modular programming - Enhancements to the Java language and virtual-machine specifications to support modular programming, at both compile time and run time</span><br style="font-family: Arial,Helvetica,sans-serif;" /> <ul style="font-family: Arial,Helvetica,sans-serif;"><li>Lead: <a href="http://blogs.sun.com/abuckley">Alex Buckley</a> </li>
<li>Spec: <a href="http://jcp.org/en/jsr/detail?id=294">JSR 294</a> </li>
<li>Links: <a href="http://cs.oswego.edu/mailman/listinfo/jsr294-modularity-eg">mailing list</a>, <a href="http://cs.oswego.edu/mailman/listinfo/jsr294-modularity-eg">http://blogs.oracle.com/abuckley/resource/JSR294AndModuleSystems.pdf</a> </li>
</ul></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"> JSR 308: Annotations on Java types</span> - <span style="font-family: Arial,Helvetica,sans-serif;">An extension to the Java annotation syntax to permit annotations on any occurrence of a type</span></li>
<ul><li><span style="font-family: Arial,Helvetica,sans-serif;">Lead: </span><a href="http://www.cs.washington.edu/homes/mernst/" style="font-family: Arial,Helvetica,sans-serif;">Michael Ernst</a><span style="font-family: Arial,Helvetica,sans-serif;">; team:</span><a href="http://blogs.sun.com/jjg" style="font-family: Arial,Helvetica,sans-serif;">Jonathan Gibbons</a></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Spec: </span><a href="http://jcp.org/en/jsr/detail?id=308" style="font-family: Arial,Helvetica,sans-serif;">JSR 308</a></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Links: </span><a href="http://openjdk.java.net/projects/type-annotations" style="font-family: Arial,Helvetica,sans-serif;">project page</a><span style="font-family: Arial,Helvetica,sans-serif;">; </span><a href="http://groups.csail.mit.edu/pag/jsr308" style="font-family: Arial,Helvetica,sans-serif;">detailed project page</a></li>
</ul><li><span style="font-family: Arial,Helvetica,sans-serif;">JSR 344: Project Coin - Language support for collections</span><span style="font-family: Arial,Helvetica,sans-serif;"> - Literal expressions for immutable lists, sets, and maps, and indexing-access syntax for lists and maps, plus unsigned literals</span></li>
<ul><li><span style="font-family: Arial,Helvetica,sans-serif;">Lead: </span><a href="http://blogs.sun.com/darcy" style="font-family: Arial,Helvetica,sans-serif;">Joe Darcy</a><span style="font-family: Arial,Helvetica,sans-serif;"></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Spe: <a href="http://jcp.org/en/jsr/detail?id=334">JSR 334 - Project Coin</a></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Links: <a href="http://openjdk.java.net/projects/coin">project page</a>; <a href="http://mail.openjdk.java.net/mailman/listinfo/coin-dev">mailing list</a></span></li>
</ul><li><span style="font-family: Arial,Helvetica,sans-serif;">JSR 335: Project Lambda - Lambda expressions (informally, "closures") and defender methods for the Java programming language </span></li>
<ul><li><span style="font-family: Arial,Helvetica,sans-serif;">Lead: </span><a href="http://blogs.sun.com/briangoetz" style="font-family: Arial,Helvetica,sans-serif;">Brian Goetz</a><span style="font-family: Arial,Helvetica,sans-serif;">; team:</span><a href="http://blogs.sun.com/abuckley" style="font-family: Arial,Helvetica,sans-serif;">Alex Buckley</a><span style="font-family: Arial,Helvetica,sans-serif;">, </span><a href="http://blogs.sun.com/jjg" style="font-family: Arial,Helvetica,sans-serif;">Jonathan Gibbons</a><span style="font-family: Arial,Helvetica,sans-serif;">, </span><a href="http://blogs.sun.com/mr" style="font-family: Arial,Helvetica,sans-serif;">Mark Reinhold</a><span style="font-family: Arial,Helvetica,sans-serif;"> </span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Spec: </span><a href="http://www.jcp.org/en/jsr/proposalDetails?id=335" style="font-family: Arial,Helvetica,sans-serif;">JSR 335 - Lambda Expressions for the JavaTM Programming Language</a><span style="font-family: Arial,Helvetica,sans-serif;"> </span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Links: </span><a href="http://openjdk.java.net/projects/lambda" style="font-family: Arial,Helvetica,sans-serif;">project page</a><span style="font-family: Arial,Helvetica,sans-serif;">; </span><a href="http://mail.openjdk.java.net/mailman/listinfo/lambda-dev" style="font-family: Arial,Helvetica,sans-serif;">mailing list</a></li>
</ul><li><span style="font-family: Arial,Helvetica,sans-serif;">JSR 294: Modularization (Project Jigsaw) - A simple, low-level module system focused upon the goal of modularizing the JDK, and the application of that system to the JDK itself</span></li>
<ul><li><span style="font-family: Arial,Helvetica,sans-serif;">Lead: <a href="http://blogs.sun.com/mr">Mark Reinhold</a>; team:<a href="http://blogs.sun.com/abuckley">Alex Buckley</a>, <a href="http://blogs.sun.com/jjg">Jonathan Gibbons</a></span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Specs: </span><a href="http://jcp.org/en/jsr/detail?id=294" style="font-family: Arial,Helvetica,sans-serif;">JSR 294 - Improved Modularity Support in the Java<span><sup>TM</sup></span> Programming Language</a><span style="font-family: Arial,Helvetica,sans-serif;"><a href="http://jcp.org/en/jsr/detail?id=294"></a> </span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;"> Links: <a href="http://blogs.sun.com/mr/entry/jigsaw">introduction</a>; <a href="http://openjdk.java.net/projects/jigsaw">project page</a>; <a href="http://mail.openjdk.java.net/mailman/listinfo/jigsaw-dev">mailing list</a></span><span style="font-family: Arial,Helvetica,sans-serif;"> </span></li>
</ul><li><span style="font-family: Arial,Helvetica,sans-serif;">JSR 296: Swing application framework</span><span style="font-family: Arial,Helvetica,sans-serif;"> - An API to define the basic structure of a typical Swing application, thereby eliminating lots of boilerplate code and providing a much improved initial developer experience</span><span style="font-family: Arial,Helvetica,sans-serif;">. </span></li>
<ul><li><span style="font-family: Arial,Helvetica,sans-serif;">Lead: </span><a href="http://weblogs.java.net/blog/alexfromsun" style="font-family: Arial,Helvetica,sans-serif;">Alexander Potochkin</a><span style="font-family: Arial,Helvetica,sans-serif;"> </span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Spec: </span><a href="http://jcp.org/en/jsr/detail?id=296" style="font-family: Arial,Helvetica,sans-serif;">JSR 296</a><span style="font-family: Arial,Helvetica,sans-serif;"> </span></li>
</ul><li><span style="font-family: Arial,Helvetica,sans-serif;">Swing JDatePicker component</span><span style="font-family: Arial,Helvetica,sans-serif;"> - Add the SwingLabs JXDatePicker component to the platform</span><span style="font-family: Arial,Helvetica,sans-serif;"> </span></li>
<ul><li><span style="font-family: Arial,Helvetica,sans-serif;">Lead: </span><a href="http://weblogs.java.net/blog/alexfromsun" style="font-family: Arial,Helvetica,sans-serif;">Alexander Potochkin</a><span style="font-family: Arial,Helvetica,sans-serif;"> </span></li>
<li><span style="font-family: Arial,Helvetica,sans-serif;">Links: </span><a href="http://swinglabs.java.sun.com/hudson/job/SwingX%20Continuous%20Build/javadoc/org/jdesktop/swingx/JXDatePicker.html" style="font-family: Arial,Helvetica,sans-serif;"> JXDatePicker api</a></li>
</ul></ul><div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;">So there you have it....JDK 8 and definately stuff to look forward to in that lot, not too mention that there will be multi-core performance improvements made as part of JDK 8 on the non-programming side of things amongst other changes.</div><div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"> </div><div style="text-align: justify;"><span style="font-family: Arial,Helvetica,sans-serif;">Keep watching this space!!!</span></div><ul></ul>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com6tag:blogger.com,1999:blog-3282000253968411774.post-10029763868824059902011-07-20T15:51:00.001+09:302011-08-05T15:05:41.666+09:30(java.util.logging/SLF4J/Log4J) + Glassfish v3 + Per-Application Logging<div style="font-family: Arial,Helvetica,sans-serif;"></div><h2 style="font-family: Arial,Helvetica,sans-serif; text-align: left;">java.util.logging + Glassfish v3 + Per-Application Logging</h2><div style="text-align: justify;"><div style="text-align: justify;"><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;">After reading a lot of stuff on the web ... java.util.logging in Glassfish (up to at least v3.1)...per application logging (ie: server.log captures all logs, then individual app1.log, app2.log etc logs capture logging just from app1, app2 etc.) is not possible (using just the <domain>/config/logging.properties) to configure. See the following (in a roughly chronological order over the last few years):</domain></span></div><domain><span style="font-size: x-small;"> </span></domain><br />
<ul><li><domain><span style="font-size: x-small;"> <span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><a href="http://www.java.net/node/666057">http://www.java.net/node/666057</a></span></span></domain></li>
<li style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><domain> <a href="http://www.java.net/node/684267">http://www.java.net/node/684267</a></domain></span></li>
<li style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><domain> <a href="http://old.nabble.com/Configuring-java.util.logging-per-Web-Application-in-Glassfish-td19689665.html">http://old.nabble.com/Configuring-java.util.logging-per-Web-Application-in-Glassfish-td19689665.html</a></domain></span></li>
<li style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><domain> <a href="http://stackoverflow.com/questions/3394416/glassfish-logging-to-multiple-log-files">http://stackoverflow.com/questions/3394416/glassfish-logging-to-multiple-log-files</a></domain></span></li>
<li style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><domain> <a href="http://forums.java.net/node/803338">http://forums.java.net/node/803338</a></domain></span></li>
</ul><domain><span style="font-size: x-small;"> </span></domain><br />
<domain><span style="font-size: x-small;"> <span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">As those all suggest there is a single loaded java.util.logging in the Java Classloader (as its part of java) and hence there is a single logging.properties for configuration. This means you can only define a single java.util.logging.FileHandler in logging.properties and hence output can only be sent to a single location rather than one per app. Whats more....as a cool thing, since there is only a global logging solution, theres no reason why my app cant get the root logger, set its log.level programatically to FINEST and Bobs your uncle I have every possible log, logging in Production (possibly spilling out usernames and passwords or any other info developers may want to see in DEV but lock down in Production...DB connection details anyone?). So not so good on the security (tho this does require you to have access to deploy to the domain so where not exactly hacking anything here...more just subverting). Funny thing is this is known, and has been for years if you read the links above...but personally I dont see how they can get around this security risk...which is why it probably is still an ongoing issues after 4 or 5 years.</span></span></domain><br />
<div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><domain> </domain></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><domain> What ways are there around this? A number but none are really pretty. First of all you can add the following code to each and every application in a block in some class that you know will be loaded by the classlaoder initially:</domain></span></div><br />
<domain><span style="font-size: x-small;"> </span></domain><br />
<domain><span style="font-size: x-small;"> <span style="font-size: xx-small;"><span style="font-family: "Courier New",Courier,monospace;"> private static final Logger loggerRoot = Logger.getLogger("org.some.app");</span></span></span></domain><span style="font-size: xx-small;"><br style="font-family: "Courier New",Courier,monospace;" /><domain style="font-family: "Courier New",Courier,monospace;"> private static final Logger logger = Logger.getLogger(AppMainClass.class.getName());</domain><br style="font-family: "Courier New",Courier,monospace;" /><domain style="font-family: "Courier New",Courier,monospace;"> {</domain><br style="font-family: "Courier New",Courier,monospace;" /><domain style="font-family: "Courier New",Courier,monospace;"> logger.warning("This will only go to server.log");</domain><br style="font-family: "Courier New",Courier,monospace;" /><domain style="font-family: "Courier New",Courier,monospace;"> </domain><br style="font-family: "Courier New",Courier,monospace;" /><domain style="font-family: "Courier New",Courier,monospace;"> Handler h = null;</domain><br style="font-family: "Courier New",Courier,monospace;" /><domain style="font-family: "Courier New",Courier,monospace;"> try {</domain><br style="font-family: "Courier New",Courier,monospace;" /><domain style="font-family: "Courier New",Courier,monospace;"> h = new FileHandler("app-1.log");</domain><br style="font-family: "Courier New",Courier,monospace;" /><domain style="font-family: "Courier New",Courier,monospace;"> h.setFormatter(new SimpleFormatter());</domain><br style="font-family: "Courier New",Courier,monospace;" /><domain style="font-family: "Courier New",Courier,monospace;"> loggerRoot.addHandler(h);</domain><br style="font-family: "Courier New",Courier,monospace;" /><domain style="font-family: "Courier New",Courier,monospace;"> }catch(IOException ioe){</domain><br style="font-family: "Courier New",Courier,monospace;" /><domain style="font-family: "Courier New",Courier,monospace;"> ioe.printStackTrace();</domain><br style="font-family: "Courier New",Courier,monospace;" /><domain style="font-family: "Courier New",Courier,monospace;"> }</domain><br style="font-family: "Courier New",Courier,monospace;" /><domain style="font-family: "Courier New",Courier,monospace;"> logger.severe("This will now get logged to both server.log and to app-1.log.");</domain><br style="font-family: "Courier New",Courier,monospace;" /><domain style="font-family: "Courier New",Courier,monospace;"> }</domain></span><br />
<domain><span style="font-size: x-small;"> </span></domain><br />
<domain><span style="font-size: x-small;"> <span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">This works but .... theres always a but and in this case theres 2 .... but 1) you have to add this initialiser block within some quickly loaded class because until the classloader loads this class and hence initialises this block you wont have you app-1.log defined. So its kinda YUCK to have to add this programmatically to every class. But 2) Sometimes if you redeploy without stopping and starting the domain completely app-1.lck lock files hang around and before you know it you have a app-1.1.log app-1.2.log, app-1.3.log with a new log file after every deploy and ... get this .... the logging going not just to the latest log file ... but too ALL the log files. Thats gotta be great for performance once we get to a stage of logging the same log statement to 20 different log files. Maybe theres some way around this....I tried setting various parameters like append=true (append to existing file) and count=1 (max count of xxx.#.log files...ie: create only a single log file) but of course neither of these setting helped and my log files continued to grow, require domain bounces and manual cleanups. Its about at this stage, when I saw this, that I chucked in the towel in disgust with this method.</span></span></domain><br />
<div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><domain> </domain></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><domain> So, secondly you could extend java.util.logging.FileHandler with say MyApp1FileHandler, MyApp2FileHandler, and then define each of these in the logging.properties per app. But you need a new file handler per application whose logs you want to seperate, and further more you also have to package and deploy these MyXXXFileHandlers into glassfish in a MyXXXHandler.jsr, so that they can be picked up by the Glassfish Classloader....which makes this probably more complicated and annoying than just the initialiser block above. However as an example this shows how to create a CustomHandler should this nightmare tickle your fancy:</domain></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><domain> </domain></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><a href="http://www.java.net/external?url=http://blogs.oracle.com/naman/entry/configure_my_custom_log_handler"><domain>http://www.java.net/external?url=http://blogs.oracle.com/naman/entry/configure_my_custom_log_handler</domain></a></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><domain> </domain></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><domain>So what next ... cant be that hard to get per-application log files can it ? Surely not? Thats what I thought but turns out ... well at least with java.util.logging and Glassfish (and most likely other servers that dont use custom extensions) ... it is. </domain></span></div><div style="font-family: Arial,Helvetica,sans-serif;"><br />
</div><div style="font-family: Arial,Helvetica,sans-serif;"><span style="font-size: small;"><domain> </domain></span></div><span style="font-size: small;"><domain><span style="font-family: Arial,Helvetica,sans-serif;"> So what else can we do ?</span> </domain></span></div><domain></domain></div><div style="font-family: Arial,Helvetica,sans-serif;"><domain> <br />
<br />
</domain><br />
<h2>SLF4J + Glassfish v3 + Per-Application Logging</h2><div style="font-family: Arial,Helvetica,sans-serif; text-align: justify;"><span style="font-size: x-small;"> <span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">SLF4J Rocks! Everything I read about it rocks! The ideas and concepts (ie: parameterised log statements, greater speed + everything from Log4J that was good...thanks Ceki Gülcü) rock! Its the successor to Log4J which also rocked...so SLF4J is even more 'rock-in'! So lets use that for per-application logging in Glassfish. Right? Not so fast...that'd be frankly too damn easy. What you think you can use the greatest logging framework out there and just get per-application logging working. No...of course you cant. Nothings that easy. But why? Well again its all to do with classloaders (in particular Glassfish's), although in a slightly different way to the java.util.logging issues mentioned earlier. <br />
<br />
Turns out that Glassfish uses WELD internally (WELD being the implementation of: JSR-299: Java Contexts and Dependency Injection for the Java EE platform (CDI)). So what you say .... well turns out that the WELD implementation in Glassfish (at least up to v3.1 when I last checked) includes SLF4J internally. This means that when you deploy your app with its SLF4J libs and config ... errr .... well Glassfish ignores them cos the beauty of classloaders is we go up the tree via the parents as far as we can to get our implementation (which in this case means that we end up using the WELD SLF4J version) and hence we ignore our own per-application logging SLF4J properties file. Beautiful ... screwed again!!!</span></span><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"> </span><span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><br />
<br />
Again ... known issue and in fact has/had the 2nd largest amount of votes for a fix in Glassfish JIRA bug tracker. But that doesnt help people stuck on a non-bleeding edge version of Glassfish for the foreseeable future...even if there was a fix implemented....which at present (July 2011) there is not. </span> <span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><br />
<br />
Yay!!! Or....in the immortal words of John McClane/Bruce Willis(Die Hard) .... YippeeKaaayey Motherf*cker. </span> <span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><br />
<br />
I mean seriously ... Im not asking for the world here....per-application seperated out log files....surely given this was possible back in the 70's using a couple of shell scripts I should be able to achieve it today ? Considering were so technologically advanced and all after all. (Oh and in case it doesnt come across through text so well....insert a heavy dose of SARCASM right here). </span> <span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"><br />
<br />
So what next? </span> <span style="font-family: Arial,Helvetica,sans-serif; font-size: x-small;"><br />
</span> </div><br />
<h2>Log4J + Glassfish v3 + Per-Application Logging (+ Me Screaming If This Fails Like java.util.logging & SLF4J Above...)</h2><div style="text-align: justify;"><div style="text-align: justify;"><span style="font-size: small;">So what fun things did I discover with Log4J. Well for starters the classloader hierarchy and associated configuration of Log4J properties works in reverse to something like JUL. The lowest classloader in the hierarchy overrides the config from any higher classloaders. So if you setup a properties file in </span><domain><span style="font-size: x-small;"><span style="font-size: small;">/config/log4j.properties using the system property added (-Dlog4j.configuration=file:///${com.sun.aas.instanceRoot}/config/log4j.properties) as described in this guys blog: </span></span></domain><br />
<br />
<domain><span style="font-size: x-small;"><span style="font-size: small;"> </span></span></domain><br />
<domain><span style="font-size: x-small;"><span style="font-size: small;"> http://weblogs.java.net/blog/2007/08/28/hell-jdk-logging-ii</span></span></domain><br />
<domain><span style="font-size: x-small;"><span style="font-size: small;"> </span></span></domain><br />
<br />
<domain><span style="font-size: x-small;"><span style="font-size: small;">and the log4j.properties looks like: </span></span></domain><br />
<domain><span style="font-size: x-small;"><span style="font-size: small;"> </span></span></domain><br />
<br />
<domain><span style="font-size: x-small;"><span style="font-size: small;"> log4j.logger.xxx.yyy.zzz=DEBUG,stdout,GF_XXX_FILE</span></span></domain><br />
<domain><span style="font-size: x-small;"><span style="font-size: small;"> </span></span></domain><br />
<br />
<domain><span style="font-size: x-small;"><span style="font-size: small;">.....and then later in your app you do :</span></span></domain><br />
<domain><span style="font-size: x-small;"><span style="font-size: small;"> </span></span></domain><br />
<br />
<domain><span style="font-size: x-small;"><span style="font-size: small;"> log4j.logger.xxx.yyy.zzz=DEBUG,stdout</span></span></domain><br />
<domain><span style="font-size: x-small;"><span style="font-size: small;"> </span></span></domain><br />
<br />
<domain><span style="font-size: x-small;"><span style="font-size: small;">...you will only get the stdout appender added to this logger not both of stdout,GF_XXX_FILE that server property file had defined.</span></span></domain><br />
<domain><span style="font-size: x-small;"><span style="font-size: small;"> </span></span></domain><br />
<br />
<domain><span style="font-size: x-small;"><span style="font-size: small;">Whats more things arent cumulative as I found out so defining the GF_XXX_FILE appended in the glassfish server log4j.properties and then attempting to use it from the application log4j.properties wont work (which is to be expected i guess). I initially wanted to have a server level properties file that I could use to define appenders to at least seperate files and perhaps to standard out as well and then assign those appenders to loggers. This would've been great as you go to the single log4j.properties file and modify that for each app in the domain. However, as always this wasnt so simple for me. Since I already had some apps that defined their own props files within the app deploy these would over-ride the domain level prop file and Id end up with config in two places (server level for some apps and app level for the rest). </span></span></domain><br />
<domain><span style="font-size: x-small;"><span style="font-size: small;"> </span></span></domain><br />
<br />
<domain><span style="font-size: x-small;"><span style="font-size: small;">So i decided to finally only use application-level log4j.properties and package them up with the deployed modules per application with the config for seperate file logging within each prop file. </span></span></domain><br />
<br />
<domain><span style="font-size: x-small;"><span style="font-size: small;">And.....this works for us!!! A little anti-climactic after that entire spiel but hey....</span></span></domain><br />
<domain><span style="font-size: x-small;"><span style="font-size: small;"> </span></span></domain><br />
<br />
<domain><span style="font-size: x-small;"><span style="font-size: small;">And so now, 3 days later, Ive spent probably an order of magnitude longer on this than I should've .... frustrating .... but on the other hand I know everything about every known logging framework and their quirks. Hmmmm....I wonder how I can use that on a CV ??? :-) </span></span></domain></div><domain></domain></div><domain><span style="font-size: x-small;"> <br />
<span style="font-family: Arial,Helvetica,sans-serif; font-size: small;">Notes:</span></span></domain><br />
<ul><li><domain><span style="font-size: x-small;"> <span style="font-size: small;"><a href="http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/helpers/Loader.html#getResource%28java.lang.String%29%20">http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/helpers/Loader.html#getResource%28java.lang.String%29</a></span></span></domain></li>
<li><span style="font-size: small;"><domain><a href="http://logging.apache.org/log4j/1.2/manual.html">http://logging.apache.org/log4j/1.2/manual.html </a></domain></span></li>
</ul><domain><span style="font-size: x-small;"> </span><br />
</domain></div>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com13tag:blogger.com,1999:blog-3282000253968411774.post-64336011322338707162011-03-24T01:53:00.002+10:302011-03-24T02:11:28.884+10:30Getting MetroLyrics Lyrics Saved As A Text File<h2 style="text-align: left;">MetroLyrics - How to save Lyrics as Text</h2><br />
<div style="text-align: justify;">I recently installed Winamp 5.0+ (whatever version it is) and as part of this I wanted to look for info about artists including Lyrics for songs. I was directed to MetroLyrics.com to get lyrics with the following an example page for a song:</div><br />
<a href="http://www.metrolyrics.com/my-name-is-lyrics-eminem.html">http://www.metrolyrics.com/my-name-is-lyrics-eminem.html</a><br />
<br />
<div style="text-align: justify;">As you can see above, this shows you the lyrics but if you try to get the lyrics you cant cut and paste them, nor can you view the source and get the lyrics text that way. So how to get around this was my thought. After a bit of looking I found the following out. There is a div tag with the following HTML:</div><br />
<div style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;"></span></div><pre><span style="font-size: small;"><code><<span class="start-tag">div</span><span class="attribute-name"> id</span>=<span class="attribute-value">"lyrics"</span>>&<span class="entity">#83;</span>&<span class="entity">#116;</span>&<span class="entity">#101;</span>&<span class="entity">#112;</span>&<span class="entity">#32; ... etc ... </span></code></span></pre><br />
and above this there is a second div with the following id:<br />
<br />
<pre id="line342"><pre><code><<span class="start-tag">div</span><span class="attribute-name"> id</span>=<span class="attribute-value">"lyricsBox"</span>></code></pre></pre><br />
<div style="text-align: justify;">I'm not 100% sure how they stop you from saving the text with cut and paste...I have my theories that JavaScript is used to stop you right clicking and perhaps somehow marking the lyrics div as non-selectable via a CNTRL+A key stroke but I'm not sure. What I have noticed is that apart from whatever CSS / JS that is used they also take the lyrics which are converted from characters that are human-readable ASCII to Unicode. Hence in the lyrics div the huge set of <code>'&#xxx;'</code> values are the Unicode conversions of each letter in the Lyrics.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">My first thought was to view the source, cut out the Unicode from within the 'lyrics' div and then use a web based converter and convert from Unicode to ASCII:</div><br />
<a href="http://www.1pagedesign.com/unicode_ascii_converter/%20">http://www.1pagedesign.com/unicode_ascii_converter/ </a><br />
<a href="http://www.mikezilla.com/exp0012.html">http://www.mikezilla.com/exp0012.html</a><br />
<div style="text-align: justify;"><br />
</div><div style="text-align: justify;">However the size limitations of the tools and the fact that there are non Unicode HTML break tags (ie: <code><<span class="start-tag">br /></span></code>) embedded in the middle caused some issues. So instead I decided to simply use Firefox's HTML parser to display the div but without whatever CSS and JavaScript is being used to stop the cut and paste. By viewing the source and then searching for the div id's, ie: 'lyricsBox' and 'lyrics', I copy the source from the first 'lyricsBox' div start through to the end of the 'lyrics' div containing the Unicode and then save this in a new HTML file. Since I'm not copying any of the associated CSS or JavaScript the HTML I copy is just a couple of plain DIV's with no formatting or attached JavaScript behavior, which as I mentioned earlier is what I believe stops the use of Cut and Paste. Viewing this file in browser will then correctly and automatically display the lyrics by converting the Unicode to the appropriate ASCII characters without any further interference from you required and with no fancy formatting (ie: plain text display in the browser). <br />
<br />
<div style="text-align: justify;">Further by copying the div 'lyricsBox' I not only get the lyrics stored in the other 'lyrics' div but also get the Artist name, song title and songwriter name with a bit of bold formatting to make it stand out a bit. Great!!!</div><br />
So this is a quick and simple way to get around the blocked cut & paste and still get your hands on a HTML or text version of the lyrics (once the HTML is parsed by the browser and viewed it appears as just plain text so you can easily cut and paste this as just plain text if you so wish and want to store this as text rather than HTML/Unicode characters). I tend to just copy a number of lyrics files (in the form of the 2 DIV's of info) one after another in a single HTML file and then view the whole lot of them at once.<br />
<br />
Enjoy :-)<br />
<br />
B.T.W: I thought of this because I first noticed that when the page was in the process of loading prior to it being completely loaded it was still possible to highlight the lyrics text, use CNTRL+A to get the text and not only that but viewing the source prior to the page fully loading still displayed the text as ASCII rather than Unicode. This implied that the removal of the cut & paste ability and the conversion of the text to Unicode was something that happened after the page loaded (ie: triggered by CSS or more likely JavaScript) ... which made me think that removing the JavaScript (or in this case ALL JavaScript on the page) would halt the process and break me in at a point when I cold still get at the text. Originally I thought of using Firebug to break into the DIV element and try to manually remove any associated JavaScript or CSS but my final process described above was a much simpler and easier to use process. </div>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-78708560989055868122011-03-23T23:46:00.045+10:302011-03-24T01:20:12.951+10:30Firefox 4.0 - released by March 22nd, 2011 - Finally!!!<h2 style="text-align: left;">Firefox 4.0 - Full Non-Beta/RC Version: released by March 22nd, 2011</h2><br />
<div style="text-align: justify;">So we're finally there!!! After 12 Beta and 2 RC (Release Candidate) releases the full and final version of Firefox 4.0 just came out today!!! The actual set of release notes is at:</div><br />
<a href="http://www.mozilla.com/en-US/firefox/4.0/releasenotes/">http://www.mozilla.com/en-US/firefox/4.0/releasenotes/</a><br />
<br />
<div style="text-align: justify;">And this set of release notes provides the usual list of downloads, features etc., but this one is more detailed and contains an overview of ALL work done in the 4.0 version release over the course of all the various Beta's and RC's. This release notes page is actually quite good on providing the detail of changes in FF4.0. If you haven't been working your way through the Beta's and RC's and upgrading and installing as the go then this release will be a fair change in look and feel and functionality so the release notes will be useful in giving you a look at what was done.<br />
<br />
There are also a number of useful links Ive found associated with this release. These include the following which is a cool world map showing the number of downloads that have occurred, where they are occurring and how many per minute. Cool stuff...<br />
<br />
<a href="http://glow.mozilla.org/">http://glow.mozilla.org/</a><br />
<br />
Whats more you can break it down to a per city level using an ARC graph and see totals per country and city as well. Cool stuff I say again. The 'about' page for this reads as follows:<br />
<br />
<div id="about"> <i>glow.mozilla.org tracks downloads for Firefox 4. When someone clicks the download button on mozilla.com or asks for an upgrade from inside Firefox, we approximate their location based on IP address and store anonymous aggregate location information in our database. Each dot that shows up on the map represents someone who just downloaded Firefox (with a few seconds of latency as we process everything on the back-end). The counter at the top shows the total downloads of Firefox since March 22, 2011, when Firefox 4 was released. The arc chart shows those downloads broken down all the way to the city level.</i><br />
<br />
Whats interesting is that out of 6 million downloads Poland has 150K+ while Australia only has 100k+ and further of these only 6000 or so are from South Australia. C'mon Ozzie's download more!!! And looking closer there are 4000 for Adelaide in general but also about 10 lone entries for Modbury and I reckon I would've fallen under that category for the download I just did not long ago. Crazy I'm one of only 10 Modbury FF4.0 users.</div><div id="about"> </div><div id="about">For further download info there is a comparison of the Firefox 3.0 download stats (<a href="http://news.cnet.com/8301-1001_3-9983245-92.html">http://news.cnet.com/8301-1001_3-9983245-92.html</a>) as compared to today's FF4.0 release (<a href="http://download.cnet.com/8301-2007_4-20045726-12.html">http://download.cnet.com/8301-2007_4-20045726-12.html</a>) with further info on Mozilla's actual Firefox blog (<a href="http://blog.mozilla.com/blog/2011/03/22/mozilla-launches-firefox-4-and-delivers-a-fast-sleek-and-customizable-browsing-experience-to-more-than-400-million-users-worldwide-2/">http://blog.mozilla.com/blog/2011/03/22/mozilla-launches-firefox-4-and-delivers-a-fast-sleek-and-customizable-browsing-experience-to-more-than-400-million-users-worldwide-2/</a>).</div><div id="about"> </div><div id="about">As a side note FF4.0 has got obvious performance improvements which are summed up neatly and concisely here: <a href="http://www.mozilla.com/en-US/firefox/performance/">http://www.mozilla.com/en-US/firefox/performance/</a>, and some similar but more detailed info from a techy/developer point of view: <a href="http://hacks.mozilla.org/2011/03/firefox4-performance/">http://hacks.mozilla.org/2011/03/firefox4-performance/</a>. While on that techy/developer side of things this blog is also useful for all things tech in FF4.0: <a href="https://developer.mozilla.org/En/Firefox_4_for_developers%20">https://developer.mozilla.org/En/Firefox_4_for_developers</a></div><div id="about"> </div><div id="about"> </div><div id="about"> </div></div>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-11429032102236185332011-03-06T03:31:00.002+10:302011-03-06T03:31:22.816+10:30Firefox 4 - Beta version 12: released by March 5th, 2011 - Last Pre-RC<h2 style="text-align: center;">Firefox 4 - Beta version 12 (Last Pre-RC Version): released by March 5th, 2011</h2><br />
<div style="text-align: justify;">Another Beta version of Firefox just came out a few days ago. Beta 12 was release on the 25th of February to be precise and is supposedly the last of the Beta releases. A few releases back a feature freeze had been implemented and only bugs (primarily blockers) where being worked on. The Beta 12 release had been <a href="http://www.h-online.com/open/news/item/Firefox-4-beta-12-delayed-1194092.html">delayed</a> a bit but this is the last of the Beta's. The actual set of release notes is at:</div><br />
<a href="http://www.mozilla.com/en-US/firefox/4.0b12/releasenotes/">http://www.mozilla.com/en-US/firefox/4.0b12/releasenotes/</a><br />
<br />
<div style="text-align: justify;">And this set of release notes provides a list of the <a href="https://www.mozilla.com/en-US/firefox/4.0b12/releasenotes/buglist.html">Bugs</a> that where fixed. The release is primarily a bug fix and performance release (or thats what its been <a href="http://www.h-online.com/open/news/item/Mozilla-releases-Firefox-4-Beta-12-for-testing-1199014.html">described</a> as) and includes <a href="http://blog.internetnews.com/skerner/2011/02/mozilla-firefox-4-beta-12-fixe.html">659</a> or so bugs fixed to add to the total 7,000+ fixed since the first Beta release in July 2010. The bug list gives a bit of a run down and what I thought was interesting was that there were 5 individual bugs fixed for issues with the FireBug plugin. This was interesting as the Beta 11 version broke the FireBug plugin pretty badly and I had to switch it off. There is also <a href="http://www.mozilla.com/en-US/firefox/4.0b12/releasenotes/#issues">this</a> nice list which provides known issues...and these are all not really bad issues and not really browser based either (more a case of the web sites not being to spec etc.)</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Also, the <a href="http://en.wikipedia.org/wiki/Mozilla_Firefox_4#Timeline">wiki</a> page for Firefox 4 gives a good timeline which provides a nice overview of the release dates over the set of Beta's and the fixes that were done. The following web site <a href="http://areweprettyyet.com/5/searchBar/">areweprettyyet</a> also gives a nice round up of visual improvements that are being done in FF4 and also scheduled for FF5.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">So besides the various bug fixes and performance improvements there is also a visible tweak to the UI. The status bar was removed from the browser UI a few beta's back. For a while the URL of a link etc., was displayed in the address bar on the right hand side. This has been removed and changed now. While the status bar is not back a similar method is being employed. When hovering over a URL a popup appears in the bottom left hand side in the same way that Chrome and upcoming IE 9 URLs do. Another change that Ive noticed related to the UI is the popups that occur (i.e.: for a JavaScript alert etc). The shape and look of the popup was very distinctive in previous versions of the browser. Then at around about Beta 10 it changed to a rather than rectangular angular box, to a box with rounded corners and a button with rounded corners in it. Then in Beta 12 it converted to an angular box and button again. The border is lighter and light grey.</div>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-19850160143925958732011-01-20T19:11:00.001+10:302011-01-27T11:13:33.098+10:30Firefox 4 - Beta's version 8 and 9: released January 20th, 2011<h2>Firefox 4 - Beta's version 8, 9 (and now 10): released by January 20th, 2011</h2><br />
<div style="font-family: inherit; text-align: justify;"><div style="text-align: justify;">Okay so It's now the 20th of January. First blog post for the new year - 2011 - YAY!!!! And what have we here? Well since the last post we've got versions 8 and 9 for Firefox 4 Beta. From what I've read there will be a 10 and probably an 11 before we get an RC (most probably an RC1) followed by the real deal, a clean, no tag, Firefox 4.0 deploy .... finally!!! Crazy days!!! I've been using the Beta's at work and at home for a while now so I'm totally used to the m an din fact the 3.6.xx version or whatever it is that's the stable branch one right now seems so 'old' ... he he he. Bring it on I say. Time to get rid of the BETA tag and go full force baby!!!</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Ok, so as always, here's a few release notes links... Just thinking that it'll be a pity when one day the BETA is out and we move on and these luinks will probably die. Ill have a pag3e of broken old links to release notes that dont work. Can only hope that they keep the pages up cos I'm pretty sure I wont be going back to update broken links on past pages. That just ain't ma' style baby.</div><br />
<a href="http://www.mozilla.com/en-US/firefox/4.0b8/releasenotes/">http://www.mozilla.com/en-US/firefox/4.0b8/releasenotes/</a><br />
<a href="http://www.mozilla.com/en-US/firefox/4.0b9/releasenotes/">http://www.mozilla.com/en-US/firefox/4.0b9/releasenotes/</a><br />
<br />
It's interesting to view that diagram in my last blog entry and see the original RC1 ship date was going to be October last year ... and at this stage we are in late January with at least one or two more Beta's to go before we get to RC1. Even Mozilla, the paragon of Open Source, with it's vast hordes of developer geek armies slips on timelines. Makes me feel a hell of a lot better about my slippage at work on project estimates and such forth :-).<br />
<br />
<br />
Update (27 January 2011):<br />
http://www.mozilla.com/en-US/firefox/4.0b10/releasenotes/</div>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-67978990019233721692010-11-18T18:46:00.002+10:302010-12-24T16:54:38.967+10:30Firefox 4 - Beta version 7: released November 10th, 2010<h2>Firefox 4 - Beta version 7: released November 10th, 2010</h2><br />
<div style="text-align: justify;">Ive just upgraded to the release of Firefox 4 - Beta 7 from my currently installed Beta 6 version. Now, normally there isn't much of a difference in the various Beta's ... they are Beta's after all. However, although they aren't mentioned in the release notes, there are a couple of changes that jumped out at me and were quite visible/useful. The first of these that jumped out at me is the 'waiting to load' icon at the top of the page on each TAB which is loading a particular page/URL. In the first few versions of Firefox 4-Beta this used to be a grey clock-like thing which would look like a clock-face and load as the page loaded (ie: as the page loaded the equivalent of a minute hand would move smoothly around and cover progressively more of the clock in a darker grey as opposed to the original lighter grey colour of the circle that it started off as). </div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Well no more!!!...... </div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Now we are in The Land Of Oz...behold all that is pretty, witty and bright...and I pity all who are still stuck on an old Beta tonight!!!! (Sorry was taken away by a sudden urge to sing...raindrops on roses and whiskas on kittens....etc.). In this latest of Beta's we have a light green circle along the outside outline of what used to be the grey circle and now when the page is loading there is a light breen pulse that is circling clockwise and chasing its own tail to indicate that the browser is still working. Much nicer. This appears where the icon for the page normally appears (in the TAB section) and the icon is replaced by this swirling green circle, until the page re/loads at which point the icon for the page re-appears.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Furthermore the link location under a link now appears, rather than in the status bar, in the navigation bar to the right in light grey text. This looks much nicer, much more subtle than in the bottom status area and now takes up less room as well. The reload button is also now next to this URL text in the URL window. Moved from the forward and back arrow keys where it used to be instead its now moved to the right of the URL which in my opinion apart from taking up less room is also more intuitive. Further with that intuitiveness angle, the reload button is normally white with the reload arrow on it ... however when you hover over it, the background turns blue to more easily show you that you are over it and are able to select it (push/trigger it). This entire background turns red and into a cross instead of the reload button when its waiting for the relaoad to finish since at this point its doing something and hence provides you with the option to stop it (ie: hence the red and the cross to 'stop'). </div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">The ability to select Icons, Icons and Text or just text to label the various buttons at the top of the page is great as well. IMHO once you choose this you'll never modify it but nonetheless having it there and able to set it to what you want when you first start using the browser is great. I personally have selected the 'Use Small Icons' and am also only using the icons rather than a combination of icons and text. This takes up the least amount of room along the top of the screen and I am a big fan of using the minimal amount of space at the top of the browser (unlike my mum who has a dozen different toolbars, icons and other bits and pieces installed in her browser leaving her only a small amount of space in the dead smack bang center of the screen to do anything.</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">The following is a link to the latest set of release notes for FF4-Beta7 listing the changes that have occurred in this release compared to the last release as well as compared to the last few releases:</div><br />
<a href="http://www.mozilla.com/en-US/firefox/4.0b7/releasenotes/">http://www.mozilla.com/en-US/firefox/4.0b7/releasenotes/</a><br />
<br />
<b>Note:</b> Since I wrote the above....its now December 24, 2010 and Beta 8 has come out ...with an astonishing 1415+ bugs fixed in it. Odd seeing as how I cant see any diff and wasn't hitting any bugs in the old version that there could even be that many bugs let alone fixed.<br />
<br />
<a href="http://www.seedol.com/20105652-mozilla-releases-last-batch-of-firefox-4-beta-8.html">http://www.seedol.com/20105652-mozilla-releases-last-batch-of-firefox-4-beta-8.html</a><br />
<br />
The image below is a timeline: Mozilla's timeline shows plans to issue a Firefox 4 beta in June and make a final version by November. (Photo courtesy of Mozilla Corp retrieved from : <a href="http://www.computerworld.com/s/article/9176553/Mozilla_sets_Firefox_4_release_for_November">http://www.computerworld.com/s/article/9176553/Mozilla_sets_Firefox_4_release_for_November</a>.)<br />
<br />
This also gives a timeline similar to the one below: <a href="https://wiki.mozilla.org/Firefox/4/Beta">https://wiki.mozilla.org/Firefox/4/Beta</a><br />
<br />
<br />
<br />
<img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfwAAADBCAIAAAClo5WDAAAgAElEQVR4nOy9d3CU17boef+aP6bqVc3Mral5b96duefdM+fcc851IGcwGDBgTJCQCCaDQOQkJEQw2GBsMElgggElMgi1WomcldXpyzmHDpJIyur0ffPHbjUCSYAwrnt8HrtWUa2me+209m/vb+21d/+T+SG9NhndJNMMmmbQNMMd5P2mcDfyIf3npnfpiJctB7xlmsZLCsNmIGwGwqYRNo2wYYbCZjgcNoyQYQYM0x953zSMjl/9HaTf2m5/7/rfOb07H/7pty7a7z11D/3fmsUfoP/3md4n9A3DMIwQkLAJJAL9sBH9VshonwyixP8A/X8U/e+cPkD/7yh11xk97aSe6nlfk8QH/b9pdhHpbjFhmCaAvhGRyDzxMvGjeoK/uvxvrMhvpPaD/t+oYG9OH6D/3tP7gs470uTvHpq/d/2/Jq+X5BXYA+kudSJ+sF3eV/rPap//mfW//7K9zYPgB+i/9/R7h9oH/b9dXl1n3SPot3/3A/T/AfS///Q2DsAP0H9DMrqRbtK7j/y3Th/0/+fq/5XZdZtvZMEfNkzjFbUmcPEYXWT6dw7916j9oP83SaEP0P/16S2g/3dtBB/S+07v0tGdN3I7Ehxs5JpAwqYZNtqBHjTNoGEGDCPUWVX79PB3nn7rcfF71/+eU+gtuP8B+m9Ib4J+R9y/38ftD+nvM73LBN8Z+pFonPbQHcMMmEbANAIvQz9gmgHDDBhmoLOq3wmLfu9Q/l1CP/QB+r8qGaZpho1w+7Ir/Eps/nt43APh2B2VdFzZvZ9KGEY4HO4YIGi8xn/8rvrB63DYNAyzPbsI5gwjFI40XY81v/JnJIwxFIr+Gf1YtAw90t/lhioo/ysfeBf9pmmY4bAZCEbC8KM92xIOhw3T9IeNkBkIhBtMI2AGo9H4hmGEDDNomMGwGQiY/vZDIaDMHQN7Olhd9/7HcDgcrdF7TB3b/x0a5+31m+/Uua9PnRvEMLqYnt8tAVUgn45mD2rRXpf34yHoVNo3QOkD9N+QwPALR6EfobP5Fs6+t5wMXoA+HA62S/chfT1P5kvkCrVn98JK3mToryt/tEFe+forLHgt9F+vv4sUDocB9KMgiGbd88Z5Nffu2+F1+rv7PKigYQbDpj8cddQYpmEGwmHTjDhpAmGz2TCDZhc9BTw8/g6HAV9pt5ff7Ar6b2qDyCKgp/8bnUi6/POt26frMWK0z+KhUCj6+jUlfG37d9Mp7WUGuYRCRihkvJxLdIXUrf63qC8Y2iC99K0Xnr0ew+T18/cH6L+fFOFyKBSILBCMkNnBJjoYR886rx2Fr67uuzemHttHl0jt/GzRYT57qdZvMr4Xte4OwUBVO/d7pr/L7KJt1eHxItwx357q7wptYA5+KXXXKa/tF9M0w8BFEzb8hhEyw4YZNsPt64dQIGyawUC4pS3cGjDCISBhMwy+bYTMcMAMtxntfp5XTQ6o68JcXzWkruyqp3b7igkZr7zo1ERvo/+Vk+2dDbXrR71fX/4uUxfKI+61nunv8FjS9YN7x4zeaSB07NbOZXhdrT9A/y1TFA0Rx0LPj0V23XmhUCCq3Iwsjd9FzxvtA3wZvAaPmD0cGG+fY2f4vnv7vCaX6Ho/2imdPAC/BgRvi4k35NUhFCeCJ0Dp6JI8HDl7FTSNoGmGAAIN04h+xgyb4Sh0gh0kbJrg6O6L6OyOC/32vg6HQqG38O30tH1e9DLQb75j+3cL/Y5GG51Oel7+rusSNZhoySPjuguFnS9ceRv9kcJ2dKyBF539VO80Xl76omGEjHDQfDG7vK4HP0D/zamDA840zUgwtfHizOSLkQeuTOlaoou4l+WVsRq5dKV7PdE7WN5Sompfzcg0QAHAx6KFeYfyR/VE3wyGQ2HDDIYMkG8wZIDX3SrvXn+0Il22W5cN+JK8sYmMTl8B/diedTAcCoUjyt+h/MBUIlUIm+FwJEgnFAqEwm1ho80wjFDQNMKmaZqG2Qa2c42Ii+/FBkN7FsEOeXbRpO2PA52623hDFXraPp3bvGv93TRLtxKtm2lGmz1a/ncYX501R/V3aTk9LXl3DdVZf1SCIeOVSr3+893Ji7yMF7NXFFofoP+rUnQ5Cf5sbvI31Le0tYZa2yLS7O8gbeGuxR/qUhpbA8+bWp83tTa0+BtbA/6wGTDMprZgd5/vqTS2BOub/M+bWuub20AWLYEwuMGr2R8CGbUEIsWLvuiiLt3oB18BelqDRmNroKnND+IHwH+BN0G+r379LfR3lKa2YLRl/GEjaJqNrW31zW2NrYH65raG5kB9k7/HTdRtGdqCkVoEG1oiaqMv3l5aXzaDltZQS4vR2mK0tLW2+BtCZiBkmo2N4damYNj/PNgim2282cqbrXK4zR30P2nzN7W2gUKa7SVsa/a3NfsDLxW+U6UaWvzPm1qb2oJB0wwYJjCzV8v/Nu3fzWcaWwMNLf765jZgTi2BMOiI92a3rYFnjS31zW2gx8FM9ryp9dfYzyv6QWlBRfxhI2SarcH3U/iO7QP+rW9uaQkEQ6b5vKlVcfs0b62i14iKR3XXyppPddcqes27iequ1XSfpvs83rq62mcduNXtg9oH6L85dQwUCYUMr6dOEnWWVVlWpTmV5lSKfyE07+6RsJKbFjRW0mhB4RX38+a2lqDhqXtK8XKX0lP9nORjJTcruVlJYyVNUN3ex88aWgOyu4aVNJKTKF5mRJUWFIqXaUGhBe0leZN+ilcZUSc5heJVTtZxRmBE9UlDS0NrUNJ9QDnJSSSnMKL+qvK30E8LCijbK/KsqbWxLaj56mhB5mSdEVVa0BhRB5/vQfk5PSK8SvEqySlAJLf7cUPDs6ZW1VtLCwojqpys04LSsa/fpt+BcoKPCMXpNOuhWQ8rqKKuPmmpbwiEWMEjMoJPqNSpq8+Z44+ZEzVMppvLUfm7Ig9xvMhwPorzUpyH4lWKlyleoniZ4nSK8zCcl+HdDK8xvNax4qykMaKqeGqfNrY+aWiR3TW0oLCS9mrJ26v/Fh3xUsfxipuTdVbS3LVPG9tCtc8aOVnnZL29g3qo/4Vm0H0K6FNO1nnFrdc8afKH61sC76n8kSxITgLjjhYU7+Nnz5vbPHVPo/8b/fy76QeaGVHnZA8jqpys+Z4+bQ2H6543EaxIcgrByiglULyK0wrF6Tin9UgIRiUYlWQ1ildJRiYZWRA1Ta/pwK0P0H/XZJhmMBzq+GimqB6C5AhaAoIzEs5IaLtglNqNaF0KSkooKeGM5MIYlOKeN/v9hql4ajBa7Fp6rF/BKBWjZJQSEJIlOclT97QlaEjaY4rTI7nTCkbJKClhlPyyvFk/QogkG6kFxasQzlK82uQ3A6Yp6T6U4nBGQikBpQSCld9BPygbKB4Q8OfTxpYmf0jSfRBO44yE0SJC8jitdGgo+fWa26VjGV6UTVDdz5pam/wh1VuHUhxKCaAinaoQlW7ah1YRWoUZFWF0hNFRWgfvw6hEisoTf2uzaRKMzuCIh7mhokebsA3PseQ6YoeXTFOpKwJdRtMsTXlxyodTHpzWQGUjOZJunNRwUsVBGSLvyxilohSHUpygegD0OVmHCQaluJ62f3ftA/TDBKN4aluCZu2zRozmEZLteftrLymPfJ0H+oHI7hq/YTa2hd6p/C9n0V48gpURkgfkRUjWU/essS3krn2KMwIY0S9n8dZV6DBUUUrAaBGnFZjgUIpz1z4JmGbts2aE5MH7KCkRjIoQIsGowE56IJSG0CrKaDitIYSI4ALFKpJa82aifYD+W6dw2AwZphkwTFHx4LQStbaXuoHSUEZDGa1j94B3IFLGWB1lNAcq4qwHZd12TMR5L0Qr4H2c1lBSamgOhcKm7q6JaoYZFW63iY5W/pbGEc0d59xOnCd41fv4eUNrQPE8RgiRYHSSdcOk6kBFRqpzERIoPE4rOK0ghAj+hCgVoVWYUqIS1Y/TGoxLCK0SvI5RMowLNKc+a/C3BU1Rq8FY2YnzGO+GmRdfx1jdiYu0VGNHeYRWKdHnxMVXGi0qoPqgFtERiNP686bmZn+IV9wILUfLA5MqTEkIraK0jrM+gqtxYgrOehBKo9gaCFVIxkfQXhhTScaHUx4YU3Fag0gZ6EcZDaYUUvAihMJLnudNrY1+v+z2YbQIMsWolzo32tcwpaCkAr7uwASEVknJ5yBElNNRWocIBaYUlNFchETyPhcuo7QHZz0cLz5paA6YJknSFIPL1PUW9IdWNDGILvMj659jP+rkFZauJmgJI90Y6Y5OIR2MQUNxmWLcJOtuL5KCMgrF6SSrIYTIyZ7mtnDN0wZe8aKMAlMKyqk454YIBaV1gvaipMpwPgSTYTJiwAilkbzPiUkIpcFkJ9C0C+gLnFYUT01zMFhXX49RMk7rCKVhjBs0DkwpTlwEn3fiIuho0FkYq9tRHmN1QvTClOIiJBchkYLXDtEUryIkizIKzrlRUiEZVdI8bSGzuS2MEnxP7R+0PMgRdC5EyhApI4wO0QpCyygjkZwkat5A2NQ8dSjBo6RECm6IVmBGRTnVRYkIK9FSjYuQEFp1ERJEygTvAWbTbdaMjrAayigoo6GkSlCap+Z5yDTrnjXglEwwbpjUEVpFaDlK8B4JSuswqaJ0RAlGySQjK3pdF3vCnUJOPkD/LVNn6MtdGF/30AcCYAeTKsq6cd5rx0SMd7sICefcMC7htOKrawiapqb73iP0MVYneA/KaCijELxa87S+sS2oeB5TnA5hPM17UVrHWY+LkMD0A1MSWINQXPs4oV6qBdAJxIUKJOuGSBFjVYSWUUogGbmxJRwyTZTicE5BaBlmVFzwwJSCc26C9wDu45wbzAFOXCQFb/fQl6PQ79ACWtfQpxSC1x2YgLG6DeYdqEhwXicmOXERwiRGqHEiAkqqBOOGcRklVZr3oaQCWik6q9lRHqNUXvI86wB9lFQA0Tr3LHhN8B5AFozVEVqFaAVhNZhRAQEBemBKITgvRCgo7bHBvCDKjW3B1pDJMBxGwDJ1vQn+vq0T9HFGQKhuoU8xboxSIUwEzQtTkgPjMEp2IizF6bzirW/yt4ZMnJEgUoy0J6UgtIqzHkF54oB5FFdo1hOdjwHLotP/q9IV9JsCgbr6eowWQRNBhAJMOrLaYD0Y46ZEH2AlaCJgCS5CAp1FCl7QRIzgwRkJpTiIFGFKoXkvgguK2xcyzaf1LTgl9tT+gUk7cREi5eiyg+A9EKWSkg9jVYyVUYrz1D1rbAnWPK6nORXGBYLXgdFCtERKHoSVoos2nIvMrzjnBhN8z6Ev/nbQD5tdxTh9gP47pV8L/YeVyKW8m5fyblqK71e6aBchYYwbfJ7gPffLIYQQRbWuqdUImaase98X9J242F4GBaFlWlDctU+a/CFB9eGMRHE6jEsIAZ4DRFapI3gPyigoKTGCxw7RAMoY53mlXlH6k6ybYHSC112EgDIKhLMMrzW2hANhU9S8JKdApIjxbhclw5QCFlmk4HXiIuALJfoYufY1i6aeQr/g5sOcglvncopvPbRFaU5LXpRUqp10tZNmBB/B6OARB8JEktWqneSN+1Uoo9FSDc65EUKmOO/rod+5l8EaFkyHgC+A8uB/IVImBTeoJlhTY5RK0WxzIBwwTRTGBJERiWI/tieALAkhy4Lw+gb0R528QjPVOCMhlLc76GOEgtMaSkZw9qgKthbdvZx7rejGQyfCErTU3Bb21T1XvXUuQih34FUQBVYAdkRwIgLFeStshN3JgK7BOXcUjl1b1JugD2rX8anOBvOWogfncorPX712/V4lWGtXwyzofRch3StzgQnARUiF1x+kbP3u2937Unf8uHv/8bsP7ZzoFRQ9ZJrPG9veAfooozkwAYwykCMl+q7k3z6fe+NMTtH9cmcVRNCCoug1LX5D89Q5ILLKQWCsClOSg+BxQX9Q4cotunUht7jUhkYgzmhg1R+dAD5A/x8yvQz9iMuvB8Z31Xr7m+/2L0hcP3vRqpsPqknBC2yxGqaTtuxctnbTrXsVVU7s8bOmoGnqvroO1HsB/Y7cf8t8Cd5z+mzupLg5k+Lm7PzxAEKy3sfPmgNhd+1TjBbvPKg6eOT0jTsVgPsuQoAp5aLl2rQZC1woR/NuYNmd3TtRKFTYiJVrt0z7etG0rxflXbtDsDJO8c1t4aBpSqr3+72Hsi9ZAQrBMjxu9pLxU2bFzlochXIVxHRm6Jugr3YH/eMZ51as3zxu8vTv9/1cZsdgSsJY1YFxV603Fy5Z8+O+oxU2DCUlGBcgjGcET3k1mrx5Z+qOH8GqEzhqCMbNye3Q93hQSohCH+TVeQp0EVL6OcvUGQtjZy1O2vI9JXpwToMpCUwGRbdLtny3FzhYIFKGCOXMhfyPPv703z/6tP+QERwjIqhT4260ILuCyJIwsjSIrI1CH2UFmPJipLszGjBKBXs2AGouQsgpuLXt273zFq2cs2D53YfVrKA2NAdqn9ajFJe85dvENSk37ldUwzQj12KsTnGenLxbcxas3J92EkAfdBPS7gzpKfQxSgMkingFSRnn3GV24vQZS+KalNmLVny/72cHxjlxnpa8KKPkFt2Jn5Ow/+fT4CEAxqXLudcWL1uzeNmaL2NmDRs9CcJEglZUT82vWelHnzBsCIfQqh3lv9tzJGnb7mGjJ2VesGC0iFKcrPmChll47faU2Fnnr1idOA823vf/fHrc5LgZ8xLGTJy2bde+SheJ0LIT58Fz6uuyfhn6ON0Z+up7gH7ECN8E/ZfTB+i/Zfq10HehwvXb5XcfVvcZ8NnZi1aw+U5x+u79R2fOT8y6mIcQIsHKDa3B1oCpuH0ILQODeAH9DoPt7fNFaLXUhluv39978OjsBQmWwuuP65ueNDTLmq/o+r2E5Ws3pOyotJM4rcG4gFEywXvOXM7/2ycDKU5nBA9wu3de6UfB50T4B6Wu3KI7a1O2z1qwFKU4lGDrm/ytQWPLNzsnxc68X+7EOa0KYhBaRhnl2t2KottlE2Pn7DuS7sAEUvACf8j7gn5pJVxSAW3ftXfZ6iRr8W1a0GCCs8Pk2o1blq5cf/3OI1rQCFYGG78OhDqRfvbjPoMWJK4V9McRXy0mwbjcU+jDlHK/HMq79uDnU+e/mBR/+1E1TEkooyCEbC26O2zkhD2HTuCchrEqTCk2mP/5xNk+ffqVVNoqHagi6SSJq+z1BueOELzYhJeG4A7QZ6TXQJ9k3TAuAXcKwet2lH1Q6rhxp6z/4DFnzlt4SQchg/vSji5KXJ154aoD43BOs6M8TmslFcjMOYnJm3feulfRwbn34nnlHaCPUG4nJiG0Sok+sA2DEPLDMuj2/co9+499NvorglExSqY4vfjmo8WJ6zak7HhY5kRJBac1FyrAuPCg1GEtvj0pbs66Td9xUi2M8ZLmCZlmfZOfoKWe2j+oF3h8YeRanHOTgrekGrtT4liQuH71xm0Pymw4I9Q8rtc8dTNnzdu5e39JpZNkNYSW7Si7csOWZauTLuTkb9y8Y+XaVEvBbYxVScENpjRguh+g/4+a3ta98woTO4xP+d4j2zff/TRjdsLt+5UoKZGMev+RbeCIMUtXJ2eevVp046ELY541tbUGTN1Xh1EA+nIE+pGR9i7QhykFp5XsC1fXbkzNOn9J89W1hkxO1PYd/PmrKdMLrz9wIixGyazoxWkFIuVTZ670HTjShXIwLlCiD6YUmH7JoY90cO+wYo3NxdgQZs+hE/FzFvGKG6f41qChu2v+8Me/nL9ihUgRrOwgUqQ4HaFljFVnL1qxdedPlS7SjrIQKeJcT1f63bp3SFbLPHt1zsLE7bv2PqpwICQP4ezPv2R+Pm7S+pRtOdZrD8vtEM7yihdnpANHflmzPnXC5LgFCavtKAtTCk5rBOOm2R67dwAiCd5TcLNk8PAvyqoQglERkn9Q6licuG75mo2VDhSmBBch4JzbRUiHj2WOGDGivsXf3GbiKMXzrEQU+vEfQvBiE04Iwasb0N3tPv0I9LveyCUVnI44mmFKgTA+v/jerh8OzZqdaC28I6ne1qBB89KY8RPnLFySfcly405ZtZNkxRoYl/annR43MS71m125BTful0PA7RN1tXUNtTe5d1DaA5MqTKpgGxZMSw6YS8++snr9lo2p34FgFRfKpR3N+OvHA/annbyce63STkKYSLJuktVgXLiaf33IqAnlDrLaSVOsJih60DQbmgMYKfTU/nFaIxgdwkSUVAhGt0MsQsgk6z5wNDN21sKT2RerXTiCM27fk8NHTowfP3X3nkM5lmIHQsG4wIreQ0dPTZ42a9XalFFffLV9194KO4KSEjDpNyz2P7h3fv+pZ9B/BZEIreK0kpt/a+acJf0Hf55fdBfGWIpVzl7I7TNw+LivYkd98VXKll33S6vrnjcFTVN2+94b9AmFZN2Hfk7vN3j4/ITEkkrb4+eNTW3BB6UV8xYu/Zd//XP8zPlbd+ypdpKRsE5azbqY16vfcBCebEd5lNGi0O8CyrgEYeLCZev+x18+STuRgZAsQtDPm1oPHzn+v/yv/2Xm3IXxXy8od+AwJQHTRGh55Lgpf+016LL1Blj7k4LbgXHvC/oIIR8/dW7IiHFLV66/X1oN4Swj6us2fjNw2OcTp04fNmrcj/uPEKwM4WzmuSsjRk/481979eo/tM/A4WevFLgICSFklFRRXOnpRi7g45GT5/72ycA5C5Y7EdaBUKzkLr7x8H/7538ZPGLMvMXLD/+SCXa8nbj4S/qFvn37fj1v4Zr1qQTKMAwlEYWt6M4gsjCMRKDvIS4B6L/Op0+pLkKK7k/ycs1V6825C5b3Hzi6oPgewyv1DS0PSitGj/ty7JeTh44csz55+4NSB0KICCEnLFs/9LPxY7+cOmL0uF+yroDNW9CYQGEXnfIW0MdZH0yqECkjhIjTCkYo5ZXYvoMnhn02fu6C5ZzodSHsozLnpi27/p8//DUmbu7UaXMyzuQALsO4VGHDtu3at2j5eozVad6LEqK37mnINGufNLwD9FFSQQgZo1SK82BUZA5ASWXHD2l/7TVox/c/VdgRBGd07+N585aOGfPV5Jjpw0eOO3MxFwSw7f4pbdDQz/sPGt5v4IhtO36osCMIIZKCG6akrp+EPkD/Hyj9WuijpARhfE7ejU96D7mUU0DQEkYK+w4emzFn0eHj6T/uP/L1/CWXLUVPGlqCpskr+vuCPkqqBKM/qnBs2LT1yymxGWcv+B4/awmEC67dnDh5WnLqjvUbt8bNXGgpuA3ClhFaPXXmSu/+I0BoPAhKQVn3K9WJCgjZvGi5Fjtrfuys+RjNEwz/rLFl0uTYpStWHzlxuv+QkcczLsCUBIIIEVq+kFv86YARm7b/YEMYmJLe70ofIRQ7xCZt+nbuomVX86/jjEQw6tyFK+YvWp5rvb4wYeW6pC1llS6Cloqu39u5e/+uH/aNHDtxzIQphdcfwLhA814Ik0ja3R30O+9mI+3BOTaEe1SFbt2xp8+Az6zFtxlRd8LU4aMZ/Qd9ti/teOKqDRMmxxG87sA4hFZdKGe1WnPzi/7wx4+suUUkiStUcQvyXWfoE/TroE8wuhMXcc6Nc247yhOMCqFcXsHt3n0/O515SZDdrW2hMxcuz5g979ipzD0HDs+YnZCTdwOjZJLVJk6ZuXJdymXrtenzFiZv+77MjgGTQxkFIkWElkH8a4+gDxEaQrkhQiEYnWQ1jJJJWsdJtaTctXHTt5+PnYxTMk7J9x/ZEhLXLVqyJsdSnLgiKXFFEiP4wGL/1r2K/sPGFN0ugUgZpzUEF2TdGzDM541tFNtVqPSboE/z3o7oB/Fm98uhuQmrlqxY96jCQdCC6q4dOXL8Dz8ctORfG/dlzP7DJypsGMXpk2Jnrli98fKVvNXrkpevSiq+9QAmuPax2a1P8gP0/zHS28bpg/H/gvXtrzPOWL7bfXhj6vd//XjQpSvXbtwuvXbzUdrPp0aOmbRlx87N279LWLqh8Nr9+uaWgBEGWYCYa4RV2qEP4vZ6GKeMy3aIfVjmPHMxN27W3BOnM311z5vbwgXFt6ZOm3n8ZPbFqwULlqw8nXU5clSEVrPPWz7pMxRAHyJFjNcQ9iWXTkfqOTDh2t0KB8Z9t/vg4BFjSEZkWPHZs/ovvvpqy46dDoSYGDtzz4GfHQhFMjKCczdvV2Ck9PXcpUuWbyirQgheBwPjdfbdId/25a32rLGp2R/iZD0ybAAHGfeBw+lJm3ZOjZs/d+GK/OJ7loLbN+6WLFudNCl2Ztqx0wuXrtq4ecfNu+VFNx7ee2SrchDVDmLF6pS4mQvBvjpMqhjjRkm1uzj9LgsGpNJOPih15Obf6jdo1OWrxTglO2Hm2C9Z//633g6IvGwp+MvHfVFGAmFUKCXQlECw8r/+6U+5V69QFCXg19rwbw1nQhBZ3IasaIZ31uBXaNaBsBJOuiNHvYC8gH5kIxfGJVLwEox+6er1bdt/2rLlh7/8R79zFy0uhLz7sPRijuXLyTFbt+9K/WbXirUb8opuXc69cft+9ax5CXGz5v6ScW5S3Jydew/bURZjVSfOg/CqLlb6nY4jvRKnj1EaSvsQKuKwhnEJ7BzsTzu9MfW7WXOXjv8qvspB5BXesRTeXL5m4+jxkw8fP7V8zcYtO3aXV6OnMi/ZXNS+Q78kLFsPeI1RGsGosuYLmubzxjaiy3H3ejh22KVAGcWOsiijbNy6a+u3P4wcO3FN0uaSSmd61nmc4mPiZi1avCwj+8KYCVNOZV04f8V6815p/Mz54ydM3n/gyKx5CQuXrsq/dodkNQjjKc4Tifd/F+i/1zh9CowLAP2aV65WNM0Pcfrvnt52pd8d9C9dvb56/ZZV6zZ/t/tgWRVy7nJeetbFO/fLjxw/k7zlmy07dmaetTghru7Z86BpqO7HUeiDpe47Q58RavYe+KV3/xEDhsalrC0AACAASURBVI5alLiy+Na94ht3d/2w7/LV/OWrkkZ98dXU+NnzF686e9H63e6DmWctKKMBnz5KSqzoRRnFRYkuSu4O+mV2YsLUr/sO+bzf0NE7vv/J5kSnz5jNMNzhY78MHTk6/ut5o7+car1+P/u8ZemKJCfM9O0/qu+Az3r3H3Ey4yLB606chymJEn3dV0HuBP3ISr8lEAYr/cj0Rikoo/247/iyVZtWr9+WdS73YZnz4JHT5y8XFF5/8P2ew1t37Nn8zQ+WgtvXb5eezLh4/XYpSkowxp84fX7foV9QRgOnlnDWQzDdrvS7m5DKHeTBIxl9BnzWb9ComXOW3C+xn0y/kLJ5Z37R3cHDRs+cu3hK3NdrkreW2tDpc5dcLbw7Z2HioIHDR4yeMDkuDoacJEm6+XvNyDcGtCSALm5DVjTBO71dQj86w7VbAsHoCK3inNuJ8Fnn8jam7FyxKvX7H9PKq6Bbdx9dzLFAGHn0RHpS6vbUb3aduZjzoNSx98DJvMJ7loLb23ft3bRt57ffH7AU3wX7zBApAm91NDCxo7wO+pHoHQ9EaDCpgoAZlFRu36/ee+CXlWtT1ydvzz5vKamADh/LvJhTdOteRfLmnZu27dzx/U8375bfuFOxY9fBkgpof9rJ4puPQIf+euhHY2ddhEQKbrC3tDZl+9LVyes2fpNbcKPCjmzdvtsB4XcflO0/dDRl87ff7z1052HFsZNnL1wpPHshd9OW71avSUpcteFk5nkXylGcjlGRMKe/i5DNl6EfNjtB3/wA/XdMPXbvvAL9cgd6+0H5nYcV1S4cwlknSpfbYBfGlFcT1+88uPOwrNrJoKT6pL4pZJqKXve+oI9Q2p0Sx/FT59LPXCq+dQ+ca7dBGEoJt+6XXcwpumK5nl98z4UKluL7ZXYCcPzClcLIMXFeR5nISh/ptIEJondyCu6czM45f7XoYZkTp/hLl3N1d43v8bOLV/Ku5l8/e6WgGqbLHWRu0T2EkM9cyD+dlXPhSqEDZlyEAM7gvLYKb4A+ynTw7dBqaSVadKPk9v1qGJcYwfewDCqvxjEq8v6jchij1Eo7WVKBIIRMcR6CVsqr0ZIKKHLWDJdRWn8H6AO6nc7KyT5vsRTcjkShFN11wMwVy/Vzl/ILb9y79bCqGqbP5RRXQUyO9VpG+tmC63dhkuRYGkVRjb3zbtDHqMimK8F7qp303fu2u/dtDojGSIFiJUF2u31PUEq4da/izgNbhQ0jGP3+I9gB8zAuPKpw3LhbUlaFACcbcFUDUIKY/Z5DX4+u9BGw1UHI90ucBTcf3imxgTm+pBorsxMwpTyogAtvPSp3kHaUr3bSdx7YMEq9X2KHcaFL6OMdrl54e+hHo5JgSoEpiRI9xXdKc4vuldpQCOMxSr77oEKQvQ3NAZRg75dW33tkgzC+wkaUVqIYJd+5X3n91sPrdx6BSF8XyoFJ8e/Fp/8B+r9ZeseQzSgUMFZFGQWmJJzTHBgH4iNRUoJJlZJUnBEQQiFZT2NroC0UVvQngPgvoE+3c7+nIWu4jNAqxqqs6MUZieQk35P6Jn9I9TyDcYERPDAu0bwXY3UnJkFE5PwUK3ohjIcwHqFlByZAdLdcJll3hZMChyoRQqR4FSVYf8DwBwzVXYszEim4UUarghhwFtcBcyipEIyK0LKLEEjB/Zo7GLqHvtol9FFGI1ktcrcELmFUZGyAqy9gUiU4rwuXXXjkGL0TFzFKJhgV/BnpL1rHKK27kM1u+7fd00KybrAYBCsDcBAMxgXg1QHRUCitIyTP0GJzwKxvbaVInGVZlbnZhn9rQEuCWIIfXdkZ+sjL0AetAfRH5zzgvEYIGSMllOB5ydPcFnbXPmVEHacVmvdCpAiTKs76UEKHcYlgZZSUcPpFjGYUZ11u4bwR+sCn33HzA+fcGOMGByZAACXYMbajfPRUduSqDNEHYSJCiCCgAKYUjFJ/JfTBkjx6QhgcxcA5N5gJIFJGSYnkFEWva2o13L4ntKBBGI+xKkKrDkwgGJ3idIJWSFajeTeE8TinEbwHHCT+zw/ZfEvov5w+QP8t07tAv2N0I3gBkTK4nAQmVXA8HWc9ToJ24izN1eK0/qyh1R82VfdTlNE6QL/dMnoO/eh6DWUUmOAwmq973tTkD8n6E5SUSFbDKBWmFCcmwaRK8j6IVkjBa0fZ6OWCYHh0WTVAGUauBWMYoWUXyhG01NQa8gcMRa+BCQ4EKSKMjjFulNZZpQ6mFISWCV4Hu4VgQPYU+sCn3xH6YIS7UA4hZILRMUoFMxnIl+C8DlREKA0MfsAUnHPjtAYWg+B2IPAOTvcY+iAiECFkCBNRRnPiPMaqOKfRUk01zFKiB5wRwzm3C5dx1gMTnKb6mvxmSyjEc4zL5RKJ4mbkGxNe2iPoI4QMkI223zBDsm6MUklGpViN5tT6lsDzZj8ne2BcgHGJlrwOVIQIDSZ1mvcSjArjAriACGm/TAIIODXdU+hHQneIyAkvhFYdqOjEJBBiBOY8QEzQ6bjgsaM8JdTYEQGE6xCMitFih1ntV0EfHBADL8DjC7iSAQTOEryHYFQXxrhrn7cFTd37GKNFgolMFZz6GAR0kawbwngYFxBaBk0UucvhrX36H6D/e0y/Kk4fZTSc9eCsByw5Sd4HUaoDlwjBB1EqyouUqJN8rRMRnjY0h0xT1h7jkSjJl6D/DtE7wL7RyJ1rGskpnrpnDa0B3VcP7BgEfmCsDq6psWORoY6SEgjsgymlwzGQV6uGUSq4gQQs9glGZUQdXCbBShrOSBirwozqwmWIUGBSdeFye4ghiNtxA096D6GvdYT+i/9ldQBfgtFhXALPFqTgdRAiuCUCpiSYkqLuC4B78CgD7opoB43eU/cOID7JusFZa3Dvgg1hHJhA8B4QCQMO9aC07sQkhOQ5Vq552tQUCLAMRVGUm7/XCG19DfRf79N3EVJ09xWnNYxQXAgr6bWNbaG6502spGG0iJKSA2NgSiH5WoRyI4SMECLFeXBSc+EyxoAl+Us3DfQU+uByIZiMPHkgrAbTGiH4MN4N0YqTlCBawQUdYRUbxroo0UHwhOhFWA0swyFShjCeYNT27v617h0nLhK8h+A9Tlx0ERLOelBaJ3kfuO7JgQlgU12veVLf5Nd9dQQr04KGsaqTlEDYGLATgveAF+DBFOfcLkoGBvM20P/g3vk9ph7cvdP50CbKRG4ZRGjVRQh2nAO3OCGs5CRkmOVdJOPEJIJxN7T4A4ap6E/eF/QB9QAUCF4neNVT96zJHxK1Gpp3g+UniNYAkX+E4KtCWEr0gVsKgNeC5H2doQ/eIVk3TCkQoQBeOBEWIcTGlnBzMKj56mCagymJEL0Yq0OEgpIqxrjbn4tljG0/7v86o3+zT//FDMTqYJ2O0xo4GeAiBJRTcUFHOIFSNBfNuiieEN0Iq7ioSDAoRMrR+9FAmCD2dheuIS+5d8BF0xGHePQKOUB88NAGnOY45yZ5H85IJME1B8ygadIUAaJ3WtDtJpIYwpe8PfQjXixQBt4dPd4MiCzptc+aWp83t3Gy5iIZnJdgmmOVGoxxu3CZEXwoKcGoiJMaOFEFeI1049t5G+jDpOrEJIBIFyVDlOokZITxIKwG0QpEK5TsdVEiyskYryCcgPGKg2BdlAiOhjGyz4VyUejjtP5e3DtgowI4kZyYZEeE9kGqYKwME4zqrQuaprvmMSfrDoRyEQKt+MBFm8C3GXUQYawOnlecpESI3g/Q/wdOPYN+5xgecIUTyki4oKK8iAmSk6IRjkc5HWZ5lBdRWsdp7UlDczCykRuhya+HfrRgCK3inFLztKHJH1I8jylehUgRBGVHj3TCtIbxbnAFDfAOk6zbiUndQZ9gdJSJrBOBe4Ti9PqWUKtpsqqOMLyL4qtRjuA9KKmgpEqLtcCZC56vwSgCGw89gn59c0tr0BBUzys+fTBLgT0DiBRxQYVoAWZEmGUghoVZDuVFF8U7SQFmZIhWACsRVnMQIhjDFOdBCLnnK303QijA0wLa3ImLMKOCuQ0iRZSJbOeAomK0yLFyfUuo0e+nKYKmaY290+Da0lPoY5QGfAXg6laIUkFf4LSOUTItaI1twccNDSTPE4IEUQzC8RDJg30FlFQQQqQYN0boGOMGxCd5H3CCd+m+eJuVPriGAWAR4zwwrUGUDlEqyukIqzkInhA1J8WgvAizHCbKTpJDORkXdHDSlRE8EMa/L+ij7SGboMrAt4Yx4KlOJnjdgTG0oKje2sa2oO6rwWgeZQWCV12UCDORK7IJXgfzN3hIRWi146Ph7xH6QdMIm8GQaZghI+gPtpmGafpN0wiHQ22G6Q+FW8OhgGmEAqbfb7aZhmkYBvgxzrDpD5sB0wS/xxswDMMEv/poBgzTD34V2ugiTjRsmkHDaDHNoGmaoaAZCrXHk4bNVhP88jz4gegAkLAZCEV/7tk0Q6YZAj9YbARf8wMx7y0ZpmmYRsgE1RFkL8HKOK0DQV8WmFJgRgXhLgSlk4SGYCrJ+wheLYPhM4WXV25fOW3RpC9njB4xaUjckmnzNy7cl3HofrXTheskozY01plm0K3VR+yG0SFCQwkdp3WIFCEWXDglY5SMU2L7GNAwSnMwKkxrBKUTlI5QGkxroBgYKUCIyPFPCdrrQgWMlWuet3ift94qLTl+Ln33zz/sO7nn9JVTt8ofoZyOMjVOxo2xOssoLKUisIxStRClI5yOkmr0VneMknFGwmkFpXUY+MQplaA8GF5D0HU45yYEqRqrOpKZtjPtuwMZada712CaxXGZxDyU7HVhDEqwFK+ijFYNcTTrZSgVZd04rWOEioKL3RkdTHI45cFpBWd4lFEQygtTtTCtwSz3pP55W9BkeR9Be3FaB74ImFEpVkJxhSBrMdyD0eJDe/m+02lLU1fFzI35fOpno6ePjFs2Zf3OdRcLrrgwBsc0hPFgrIzTCkrVIWwdwsswy8GkyvFK/fPmluaArj8GV8qgjIbTCspoEKXCtBthdIRVEFpEaBGnNYyuQ3GZY1UM4TmhBmzbOhH+XP6VE5cytv+8c9cvu89fv/zQWQHTHM16aFoVaKnpeX3QNCFehQjMxxU8hreZ0MoQsrwFX/eE/MFN5QiUnaAFmNaiv8ESnf/AagBnBBRXaMqLsaqDkeyMx4XrFCURuE6wcjXpPH/r8sa9qVMWxoyO+Xz0lFEzFs9Y903S4cwTVSiG0SKMsTinuCgeoTSS8bkQGSdVmtMRQkQoDSJ9YPpHSbWDKDClAM87Sgmq90mT3/Q9aQTuI4xScVqHSR1YIEQoBOnDiVoM91BsDUQrMMtY71i37UuZs27GoNiBn8eO/3za6CWpCd8e/q4UsiO0imAqRfpoqgYnVYRkMJ5RvN5A2KyvD7O0B+yQR316OK3htE5QOkFpXQuvO3GR5mpRXMFp8OisumgdJ1WcEhGSQTk290ZR6p5vFqcsGjvns5HTRn4556t5a5f8dPLIPVspyrEEIdCk7sJqcKqWoHQUl2nWS9JuCBNxTnNwspOVYUbGKBUnVZyMTEgo68aYyO4R+J0iAP3ap63gZBzBqCipgB2C6E5SVxL51Z0oajqMbgWhRZiSSNZNsDLB8JpPf/Hj2N3fwPNPISNoRFLIMIOGGQwG/YCshmEaAKmGaRpm2PAHwi2mYZpm0DT84XCzYbQARIdCIdNsBT8hHggFQ2abYbYZpt/vbw0Z/pARDBnBcDgYDgfDhj9stIWNtnC4OTIxmGHTDIbCbaFQIBQKBE0zYISD4UDY8JuG3zQDYcMfDLcFTH/I8IfDwZARDJjBgOkPG34z3Ga8+C3ogGEGDCMEJGz4u5RXP98u3X0+ZPjDZiBsBgKh1pAR9BsBVpZRjoVpDmJeEhfDuRgOF1SIle0Mj4sCTNAUq9GCVgFDW9N2TEqcPGbxqPHLh32xtN/ktYMmrRs0btWAkYt6jU0YMmHBF0m7Uu9VP3jS7AuZQUn1IqwEcxIsKggPfhlDglneyXEIK6GsgLICyvIoy6OsgDISwkp2joNYHmF4jOZhlncxnJPjIZZHeYGUxGoEQ1kBYrjbFSV7Tv00Y03c2IVDp2+Y8PWmCTOTx8asGjVq5tC4xLgffzl43+V0UgxKcSSnYLzi5ERM06oZBmZ5iBYgWnAxHMQxEMdAHOfkRELTnDQfOcBJc1m555akLho3b9TM5LHxyWNmbR0/Zd2oIdN7jZk9avOPWy4XWaswChdlmGbtGOFiOFJ3u2jWRdKQIKK8iLICwgkuXnCJoosXYE5AaBFhGZgjYJZBWAVmdZgTYIF81vK0zQjwio6yAsLxMMtAHAdxHEqxJKfgtFJ87+62nzbHr5g4IWHoqHl9JqwZMnHdkNEren+xsv+k1SPGzh0+K3H6nqM/PXQ4cIEnBAlmZBvNVVK4S2ARTuBVub6lodXfovtqEE5wMQLM8gjDobwAcwLMSQgvIgIHswzMchgnwpziJGhWVAhWqEIRy72irQe3Tpo/YcyCgTHrxszcMn76li+/XDnys68Hz02at+/0wUd2myC7W1r9rabfyVMEi2lEXhOzpw1Z1owlPqNW19Lfq/QFlinHGAZiZYjlgcAsD7McqKyT41w0RfA6QvJOGneJHKZ6IVqgOLakovLb/d9OWTxubMKgsSsGjls1eNLaYZPXDBuXOGDMkkHDvh4wZvaovSf22GAHStMwzQJrAY+hLpqBOA7hRScrIxyPcALCCcAbGXnN8QjHQwwNMbRU66kPtXnrn2MCD7McyvIIJ+CCCrE8KooIx2OUTFA6wegPbI7dx/fHJE4dO2/g2IW9xiz55Mt1A8cvGzhp9bAxCX0nLB0yacnoJSkJNx49hDCeYMVqBMNE1skQhCK1mWZdYzNGcwjDwWxUeIQTXh4Or4qTIklZdeIsKSrgQQfhRRcj4YJeicB7T+yZljj5q4TPxywYOGLeR5PXD5yybujni3qPXjRo7MKh4+aNWr9zbcHtazgjoILmpBiIYVGOhWnWRbMuhoNY3i7yToGHXxQDtI8A/hd0FkyzKMdqj+vaTNPz9DlMswjDQQzrohlMECEGVKQ7EboUF6e4GAHmJHAKHaNUkpFlRXsr6LcGQ2AR3RZoBdBvCTaHzKDfb7aGw62mv81sbmp9HAw3+INPgubjxkCt33waMuuCRo3f8LUYNY2huvrQ41bT12zUNYUfN5lPW8zHjaa3wfC0mk/azKed5LHffOw3nzQbNQ1BT2PI22Y+DphPW8zHDUZto/Gk2XjSYj5uM5+0hOsaQ3X1obqmF9962mY+bTafNptPW8ynfvNpm/m4XTpn9B6k2axpMWtbzNom09do1jaYtXQtjumIU3YCsb8sFVyVS6dLmGq7VAFLNoTH71Q9mLU67pP4P4xa3Wf6nlFzj4xcdHLY+ivjN+SOX5w1NPHUiNk/DRm14i/94v/fiQnD77pu1vkfa8+UahGqFB3VssMuQ04BdvCQQ3RVijabBDtE2CG6nKLLKTocosshumySq1p12mUnJLtcktMpO22K06Y47TJUxdoQFYLE6jvVt7fs3z4p8asvVg6M2dZ/0ncfzU4btPT0Z4knR87bN2Tixk/GLvvkq1VDp6+JO3HlpJ3FbBxSKTpsHmeJWFmluJwqZJNc1aLTpjhtur1as1UpjkoVKWcrYYWy0bTldtGs1bFfrRg0eVPfiZt7xez5j0UnhyZkjFh0cljM7r7j1n86cfXQgfGfrvom6RFSAQkwpuMVQnWFZKuU7U4drpLsNsnhkBzVsqNCdZSrjgrVUaU4HILTLlbZpTK7WGWTYJuI2iRHtVLpbeWfhNykF7eLdqfscKj2KrG6WrRDPFaJ29POHJ61btrYxb0nJn28cP+wBWlDlp4ftfrq+GUXR88/PXTu4WEzdg79cnX/0Qv6rNyx9OrdXERCXZLTobscbrhCcthVF1WD1frVpyG3+IR2ybBNgu0y5JIcTtlmkxzVorNadFZLNptQbRftTgGuFu2QhMMCft9VmrQvefjcAdM2j5yY9PGkHX+ee2TAkvTPlqaP+frgsC+SPhmzss9X60fErpx8vijvcUtzTdDt0CoItYrCztWwu5+yy+v45T5xrSru4sUsXLwDiXabiLZ3qNOhvhC75rRJDkjBnLLTrlY4dIdNRJ0Cmn75aOyi8SPi/2Ps8r/O2Tdk8anhK8+P3XD1y9UXxyZmfzbr8IAp3/cbuPDfBsT8eXHSzLxbV3ARs2muUrbCqaM2BSplq2yKs1p2VIo2u2i3i3a74Hwh4B3RZhOqbUIlXUf4gm6pgXcpTrtocymuKq7KpaFVYrVdsTkEm4uHYA4ruH9jYcriYfMHfrG274zdQxYdGbb4+OCkKxPXXRyz5vwXCcc/m/FD/9htfcYv7zV+/ucHMo44BRjRMJvkcuooXkfVm40evxvRXa8MOoficikul+KySY4upUqstkkOh+iCVKicLkPdqI13uSSquPJR/OoZfSb/6fOlf4nf0T/h6MjE9M/XXhiXdGXChstfLj42YtaeIVNSB/SP//8mLBh9MDuthCqzKw6n5rArNptcXS07HBpSLcNViqtKcdkkl0NyRMUmOWySCxTPKTsdkt2lOIWn3DPzidIkuxSnU458EtIRUJHuyl8t2qtFO3hRJdjsot0hOZyy06HQlRwKSTwmqjCpI7jG0B5dfdKVZ6XzSj9shkzTMMPBoD8cDJmm6TcCATPQZgZrw7VSG40+KSuXCu/i528ip27ip65hWTfwzJtY+l0i8y6VfQPPLMTPXOcu36YybpHZ17Cs63j2TfJsIZaej5wqJtKvYxlArrVL5B08+w599jaVcQ39pQj+pRhNv45nFmLpN/D0m1j6bSL7LnX+DnnuBpZ9Dcu6Rp65jp28gZ6+hWRcxzKK8KxCIusalnUdzbqGn77WQfl7l2Ls1DX8NJBC7FQxkXmuIu1s+aGMsq4ls+KnjNIjGaVpF6sPnS9JO1l4dMrqCcPm//WLrX9cemb0iqujl+UOXVM0LNHaZ3Hep4nXByzL7bva8tnaS2NmH+z92bJ/m7J6XPat9MuPTmWVHksvO5Revje78mBWWdqZ0sNnK3/OKNuXVX4kq/xIdvnh7PLD2eWHsssPZVUcyqo4dKr8QEbZgezSA9mlB9JL96eXHkwvOZRRcuhc2Ymz94+l5eyelTR1xNze49b3nn986PLLw1cUjVhqGbiycNBK64Cll/pusIxec35MzPd/GbPsb58v6rvpaPKFsrMnHx3KqN5/unJ/VuXPWWUHM0oOni45kFF2IL1836nSvSfLDp4u//lCxYlT147uOr17aNyASWv7zvzhk5UXRqzIHbEot++K4sELcz9eYum1wjJ4zeUxy9LHjU/5+JOv/hyzetwx609Z94+eKT92/P7ek2UHM8rTMksPnC0/dK4iLbsy7XTVoZPVh05XHcqqSjtXfuRcxcEzlfuzKw5klx/OKj+SVXE4s3y/FTlaSJy+bD+WVXYwu/JgduXB9NL92RU/n7uXvWb/soFz/jps+Z8XHBu+9srn6/JHrC4YtLJowMLcjxML+q0sHLQkZ8Dq3DErz46dsuuTwbP/MmfL9COWg5n3D50u2ZdReez4w4NZVWnZFQes8Il85JeL1YfTSw+eKkk7/ehgRsn+M5UHs8sPZ5Ydziw7nFWWFuma0uPnKtKy7x4/ePnA9I2xQxb1Grnh48WnPkuyfLbsSu8NRUNXWgcsy+2/yjpidc7ohNMjpu3pNXrlR/1i+pzIP1WEXrxoO3CuZK/l0ZaiB7NvPPji+sMvih5+ZX04M+fh6vOPvst6dPD0o7TTZfvTyw9klL0k6eUHMsrTTj7Yn12ZllW57/TDA+l3Tn57etvwmZ+OSvxo2o5+K7JHrrUOT8j5ZIml18qiAUvzei3N+2R18ZCV1pEJ2SNn7R4yfN6/z1w/Ie3yD2cqj556tD+zPC2z4khW+ZEzlUczyg5klO9tt7HDwPCitnemIi27/FBW+f5LzqMFVOZV5JessoNZZQfPVx87+XBfduWRzPKDWeX7s0r2Xyg5frLo4Iy1Uz6a+oexmz9NPD828crw1ZahK3MHLLvSe6n1bysKBiZcHrgqd9jay8MTjg0evvjPA+M/Xbt/zYXSM7/cPJRdfuSC87CFOHEVOZ5ZeiDr0aGMko4j7kBG2YHM0gNZFYe7lLPVR0892n+u+nhWWVpm6aELlcfOlZw8ce3nr1ZP/Y+Yfxuf8vHKM6NWXB68PGfAkpz+y/MGL7N+utzaJ/Fqn5VXB6+99PnMvYNGLP3b4K8/XXd4afq9I+cqT5x6sC+jbF9WxYGMskPpJYfTK45mVhztMCQj+aaXHswsT4swofRAZumBC7aj+URWDnQys/RARsn+zNIDGWWHsiuPpJcezCg71F35M8rTMisOZ1cCs0/LKks7U3HkXNVRC3zR4rx4G79RJbhQQYJJlSJ9Hq0pCv3XcP+fTNMMBv2BQJtpmGbANPxmyAw2GM+5ZlcuknGsbPv3t5fuvr1ga17M9oLYbUWTt92Yu6VwRopl6ibLlC0F0zYXTksunJZUFL/ZOmVrQcxma0xybsxm64ztxXO2Fk9PsU7dXhC3rTBua2Hc1sK4LUWRF1sL4zblTUu1xmwtmLK1IGZr/vSt+TM358dvzo/dUTRlq3XS5txJ26yx2writxTEbcqPTc6bsr1w6vbCqTsKYrcVxm0pik8tit9SFL+tID6q8GWJ31bUtXTz+bjuPr+9IH5H4fRthXHfFMVvzY/bfm3mprxpmyzxG63TopKS10Hyv9yQNzklb9rGKzGp52YPX/rRv8f988Jjo9dZh6+yDk242nd50YDEwt7zc/6aUPxpwvVey4r6JFztu/TqgDWWIUtOjegz719HJfZbc3RWcs7MTda49XnjNljHJ+dOSb46LbVg2rrcL5PypiblTU1+IVOSrFOSrFM2FsRu10XtxgAAIABJREFUyo9NtcamWmM3WeOS86dvss7cZJm1+fyc5IyFE1YP/yjmv8du773i3LBV+YOXF/RbWNBvcXG/RYWfLrL+x5KCj1cV9l9jHbg6d+DKrKFjkv7t4xn/de7eL1Mt89ddnZJaMG1jTuzmvNjNeXGb8+K2FMRtzo9NscZsss7cnD9/8/k5Cfun/o8v/vnzFR+tODVm5aUBqwoHLMrrtfTaoISivonFvVbc7L2yuPey3L6rr45Yf2XM7B9GfDz9/xix5M+p5+alXp2Tmj9rU+HMZEvcppzJm3OnbrHEbMqL2WCdui4/doM1NiVvWoolNsUyNcUyJTl3ysbcmI250zbmxmywxGy2TtmcH7spLyYpd/JGy+Sk3MnJV+M35c6ZvWvyX6b/n/2W/7cFmUNX5I9MyO+3IP/j+da/LM/vtcz6aWL+x0vyP00s7Ls0v//y/CGrCkfMTRvVb8Gfxq4buuHM7BTLrPWWGSmFX28sjEm2xH5TOP2bovhUa2xKXnyydeZGa/ymvGkplqnJlthky/SNufEbc6el5MZtssxKzf16y5WZa45/3X/23/489X+P/2nY2qsxy3I/S8z7aFle75WFfZbmfbI075Nleb2X5fZdax2+3jpyecbQL9b1+tPE/5qcPXvj5WkbLk3aYZ24w9J3j7XPj3m9d1v6fp87+FvLmG15kzblTduYN2NjQezGgtjk/NhN+bGbrHGp+fEpBfEpBfEbrTHJBTOS8+OSLbGpVxesPZXwt/g/DF78x/mnRi65OGJ5/qDl13ovv9FrWXGvZQWfrCjss6Lo4+XXPl1k/XT+hd5rr45bcPizvvP+24QNA1ZlTN5s+Tr56rQNOTGp+bM2WWakWGJTcr8C9U3Ki03KiwOSbIlLscQmW2KTLbFJuZNTrDFbiuJTrDEbcqZszI3ZZI3bkDNlgyUmOW9qcu6U1Jz4jdnxXyb1/tNX/2XS9k+X54xJsA5ekNsrsaDfquIBKwr7LL3x0fJbAxbl9VleNGhp7qdrLENXZI0bmPDHf/3i/57/47RvLSs2X43bUjBxa/HELYUxKblxqXnTU/Omb7JOT86fnpwfl5wft8kat8kat8EyrUtJtsQl509fmzM16Wrs1oJZSZfik8/OH72qz59i/68pO/uvuvj5cku/Zfm9Vt0YkFjcb0lB3xU3eyUU/m35jV6JRZ8uvvLxhvyxCac+77/kv38681/m75u8NWdp6tU5m/KmbQZjzRKfZJmZZJmebIlLbm+TZEtcUl5cSsGM1PwZoGyp+fHg32+ufb2lcEayJTYlbxr4r03WuKS8uI3W+O7Kn5QXCyCTlBe7MTdmY25MSt60zQXTv8mb+31h4uE7Wy9VnS7lylFRREn1/2fuvcOjOLL1YTbcu+vdtb1ee23vep0DSJqZzhOlUSCDCbaxCQYkTafq7hkFhG0cMRkMToAxYByIkmY6VFXPSICz1xlQTghJgMPuesO9m9cEaX5/9EjIBNt7v/v9vo/nfXikpumuOn3qrVPvOdV9tO/P34r0B073Dwyc7u8/le7PyPKn0n9p+M07L3+0eJFxt2aMFhM+FYXkuK/cyiszcyPxoGTlqnYYoJBgchL2gqS/xKJVzAGTVqE3ivKAni8nwpoV1nCuavoUiwMWJ0FORJwEOQn6gOXTUrmSwYgJQjODZcYYuaYAxHOjKBhFdBSxUehTzICs+yTDJ0GfjLwKJFWLVk1GsTgRZS7lXHkYfMPA/a8gagQ0M6gYXg0GZJ3TYAgYAcUMimZANAOycTYkkyqvDyimT6seO/Exz9WTR8xYRwk7Q0qCACYlY0ap8/ImIVtU2f7cUkiBFCdAFmCfCr1RPSxsK7zhrh/mardGXskrQ2EFUQB5VOhVzKCGg4JFysirQK8C/arlVy2/Ar0K9MqIlaBPNr2K4VUMr2z6ZSMkJ8JqbcGC6imTH2NuvPOyyY8xFfHRmkGI+igJ0SUmKyZ9EURHMKHtZSXsKa3Nkk2PWO2qSBSGq64Zee9FkRcLK/AEKeHTYEhNcJruV42AagRU06fofiWRp8SLqnbdef307/jUa8RthWpNnmpyKmYlzCqpUKlBlZoe3soByKNhGuhUOfRX6kVznmWunz5i8mIX2DVGSeQDPaSZeTGDqzD8ZYZfs/wyDMowqMCgZgadO2pm0OmvagVVmKvCXM3yAsPrPGvZ9AIjUAbHRV7JHzXnclq5cs4LHEC5cxOeiM1I9ay0l1Z1qrIuoCE2YnhAigMprtT0lBpEND626JFRN91zye3L6DJrsmzkyTAUSXCS7ldNH9AZOcECMyhZubLhPHqfaoUUKx+YucAMqlZINfM1o1DZmT/hYfJXk38w60mmwhpTvMsnWQHZdskWLVuUZJJKklExKyY8QKcUg43FKfBKfuGCm6+9Y0SlPjVmjZYTdBS7K0yi3PCUJ4jyBFWWoDXdCwy/YPgF6BUtr2x6ZdMPDD8Y9Dchwah2uDTOyYncWM1USrj++rt+PPNpP2/kqqkwb5PF1igRewTLIyY8ZbY3ikgButT9vvJX86SEL1ozZsoK1y2zfzBh8S0V8XEVsEBK+FQzTzXzYzAvanCDbhaUYUiGIcUKqVZItULACigwCKyAbHqB5ZNNP7ACGs4FVkBDecAMKmbAWdncsYq4ecZ/TFl8WyxepOFgiUXIdT7eYkoSLhESpcgzT3cLtjdikiKkYnZA3hNSdo0jS2+4bdZlsZ1T1N2BmOkpQ26hxl2OCxU9MNR30QyIpl92AEPnhxGI4rBg+IEZjML88sT4yUvcN07/4e3L3WBPYRnKky2i1MyeZ2RHECXbXARmRbBbSBKi7RKRW7E4UBMs2RZ0z72Cla6dt3H0AjhNjvukOFFm+aIJv2LlKVZIgUEF+hXoV2BQsUKKFXJaJRk+yfA5hpIMn2z6pYRX1n3A8AMrIJt+SfdLul82As7/OheSlbkgMIMOFCukoTy1JlRuFC3UJy425+/+YOOHfR+0H+3rPf77byXvnDx58nS6/3S6/9SJkwNfnkyn/9b957c3v/XggvhYUOMHSb+Y5ObXEEpNXtmescpLRUDPi9R4JSsIksFSgxAsT6yOUREBbFowsoFFqJZf2OOXasKKERbjnGLRANISInmbjNgkj2keMyJiBERI2KNCRjNDSnWRuLNArA4oBivqLsWiFeiVTb9g+CUrIGGviBgJuwByAeRxLsXbpIhJgDwSos8DyJz/+L8PABkFMYJFghTHQ1LEtAQZ0aIlzA5BRmcAsK/UuA1AWt458YoJI3IX/FLYwZXjcHmSiaU4AREiplXMyQYlGiTvwCQU2ysZTBT7pT3suCU33zTr4qlPjJJ1n4RzeDRSxgxvsBJmS1G2iD0iJoe3UMS0iEkhScmYApAEkJQQLUEOmEFFD81YR7n4S9myX0i7ChXDq0BX1CZk06NCL4CMjFgJ0RGLkBCtJDkZM3KSleO+ec8zjHKZt/IqkBgjmJycJCVEKohREAMgrSBKxRywAnxNqOiBrJvv/T6/PVc1cstTIUEnFIvRECfqtIb9sfqgCCneJBTEAItQEaUgVqrJnbzCc/mUEcUvh1UYFhKMAr2q5VFMN7AIERIRREUQJSBKtmglg8x9ZUzJiJWRV8aUCCkBUSImRUgBw6sZhWOXXH/j3T+esCxLrM1VbL9c5xOTvlKD4i1KMSkh7pZMCmDOeYIAc9F6v2r5lZp8f/k1HvnqOduCih2UbEaxgxJmFUQByy1Dt5xkBdsrQFpBrGCREuRE5BOgV4C0aNGSwYi6956N1DUzflB4/6hKPayYbhVzWiooohzBImXMiJDK/G3RGvYDk40lWVDLzNvku2nmD8Y9mgXiuZrNlBojxRQt2QyAjGIxisUoiJURy2NOSFJCkpJsKuPekJEgJ0FOhJRs+0oho+C8u56hrpo8YsLjWeKuQMSkQYqTk6SA3MCmNdurmJSScMs6wZvu2YlbhTpSgkyZGVZ3FQSrfk7Jl83eRGgwIFhkxKQF6JUgByDprI0EREUQFUG002XZokRISYiWEClCQoSEhEgJ0TJmeEiCpFeCjGixihmY/wJDyZd5Sq+Ud/g1y89bORErR0YssHwqZpUUoWJWSXJqvU+p80ZMUjAZBQYVM1C6peiGWd/Jf+g6pSZPtWgFu0r0UWoyoEJGQYyMGclmRDQMmD4vJETzFqWkfAKkRZ2V94RvmvV9v3yjsNNfmSwQDSJiZpe/FlTrfU4oFk2yguURECXZlIg9asobwyGxxjdjtXfUvIvHLslSjdGyRQGUo2FSs1jZokVIiZAQkVtEbgERAqQFSDtPPMMhNgtsNjNaIQVsVsaMjBlgsyKmJZuRbe5C/CNaGTiXHUJZKqRCVrO8sZrwEhgxG15u/qyp9/ffLpE7kE7/q//Ul+nTp/pPptMn/3HqKGxce1/1GC3uU5FPSFIRRPPV/o0HKqzu9ckjW7cfeeDBvdOAnhez82WTlXWiHNIVhke2KGBSmsUqtb4qOHFDY2xTa7TKHh01OMViAGRExPCY4TEnIp8EfSIkACQVg70PT3ryvei2tkef+lBYgPKj0KcaASkeUM3Chftuf+it6Qv2jhMSnIQ9AJIKJAEcepykAsnM2LAYxeL+3wCAjOPKSp1XQNQQ6Q9/AEMPRrRo2crnrayyZDD8QPZ10y/nN4ejtbRqMoLukhAp2IyIaQAzXAYgDWyWt3JkTEmQk0yycq+/9BX/zXN/Hr7/WmGXV4ZuEeUotlcw/BL2Zoa9zWSID3ll5M3MPTYlIRJYbtkiJERL0AeMgBoPjn7otpGR/5z7ok818/iEpyzFAMutWmSZRam6RzEpFbMODwqQFiDL215J90f3FMxcx15/z/dmbvHzpl9MeURMSjYjIEqwSAmRiu2VdP/8nd4b77lk6hO0ZhWUxN0SoqNJn5yg1QQjGySAtGRSvEHKyHF6UkRuySaAGVZ2T7v6ru/5H7xmzg4W4IAEOdUmVUTIFiEgImLTfNIxFKNCRoWsClkVMpkpDTIS9EmIzjwOm5Ego5gBeU84R/jPvPJR8zflK4k8BXoFk+INVkUBYLIickuIlDGT4SPoVaBX0mkVEaCWmb7aPXLeZbkP36CigAgpyfoK6YuY5i1KMCkVsyKkZOSVsF9EviHS5+N07qPXXzfrEnX79KhOS+Z1kpWtpfy8lSWnPCL28NAlJ1kJs4LJyMgv6l4RUipk1OqC6cuDP8wdAXbnAcOj2VxxylNiU6WQES2vbLISZETE8cjH2x4n0HECEdlkRYsVLVZBLG9xAvZLejBb/AElXVm6NRRDfhXTopkjohyQJEVISSapQUqFLg2xAiKkvWSpnSNCQtP9FbVFka2BnJKfjV1yoxhnQIrhMSNgf8Skgc0C5AHII+Iz4RqANIC0Q/oypiREypiSMSUhmjcJYLOyzUmQARan6IFpa7Ounf6du5aGY0aeYjEiypawS8Wcavll0wNwlmJSGiZ5faSMKRFxIBkULVpBlLo7FLz/yl/eMyJm3C4ngoJFqvXcfMOjIkpB1JlwZ5D0L0SaMmYyToJZ2fRPe3LUzyeMKHnydsXwApNWMQ1sOmIRvEkASGrYAyy3YtGOxwqIiBgu2aLL7NwFe+7IiVxCV145+yVKxKRa7xaMbMXiAKQBJAHySNglYY+IyUyrBsl9cHbMsL8ICSXJiJAQLNKZA4Ymp/O3H7HOHC+jTIjp9Bck/fNrs7UkVQ6DZbvGbdj/8K9793f/oevblWyeHuhPnx5Inzx56m+nB/78my8bViWLQcKnwRBvkDymIwnv3C25e3+3rbZ17YbXKta8Dh6pu7OqbnQM5qo1eWXVBWV7QgsSflATVKr9FYk86aW8TR8v2tmxZtWrUlXtxGjNOLk2PwrzgREANV4tEdKscCThl3RahV7F8Gq1wcdS0zd+oL7S/vCyV0tk3adZYbk2/7F986p71zx/6L5yo0g2qIzeAhmQCXMykY7jgudEvv9rkBA5iLNWAOeHZrtFi46aBbfeeWm+Rkp7/Ar0Rp2YCNMiYnjM8ZjjMcNjRrAZPuUuhSRIkkqKApDWsEerocILrieLfzFnMxcxacFmRYtWIClblIT9w+5+xhQiYhREKdAFDI9sUCpmZejWzODc57w+cJWv4jLVCGYCcIMUISUgAiAXgCSADLA4CfokyEmIFjEp4RxHSeBfDLDFV+dGr9Zg7ryUO5L0lEJSTrKi4VaRW4OUVOud/mzWxfkjlJ23K0ZYRqxgeVTMAkhK2BOx6YhN85gepCpSwh4JeyTsEqAXmOEJy2+4vOAiZVtBzPTKdqAU0xIiVeTWkDvD7GesTQLkAcgFkGvIjJJJSoiWbEaqYyKY0FDevOeCWTMvmfL4zZW14ejuINheBF4Zr+0aXVadG90dFHbnizvDZfFxlcbEWO14aUdBhT6pLD5J3DG2Mj5a3pzrE68lI78A1WFJJ1ToddYWEiJF7BGxR0IkgLQTWzgjXLYJ1XYr1qhKMzBvo29k6U/8D1xahkcDw6vCHMlwKziXt0kJkRGbnJ8iS5OkiJ2ohRQxWYopARGKxUV3jrss/zsTFv9SiY87N26VMSNjSkEONZAS9gDkcZ6+AkkFelSYJdtE1Cyq2D7hmqIfz1hLluymyrBv0NqeQSbK2K00FSpBJEhxWipXtFhgEWWWr7wm3y3+iq382fztbtVxCewXIB3BOdLQcMt4HTm4mjw/ZJuQTApYvijmogY3eSlxyz0XV+4uUE1GsTKXcvw2YtPFSVpKukTbJSBikKMpCbtElK1Y9L2bXD8f/b3yPRMUs1BK+UVIqDqZofhhrcq41gXaE016RZ0GSVK2srTq0YGFP/RX/ILfmaPofsWggZUDUI6IPTymIzZTajP84EQiIRIglwJdCiQViwN6aMra7BwwYvbzozRjtGRwip0NLEKEAQn6AGQUi1YGo1IwGKCci6GGnXP8QkoDPZzihhyDxxxvkzzK5q0c1Qo9ZN6bbN5+5Pet/emBgYH0wEA63X9G5Rn46k6mEQOn0ydPnzid/jKd/nIg/ZfOP735iHm3inwK9EcsQsS0auZFthaaPRtefG/x4ur5D+y5+wFj2qp354IduateL17zWsmTb5YsMsaueK103TvCYnz3Ujx/329f1g9vfKj23ui2cY/iWeveEx5I3v5o/fRVb86535wcqx69+oPih94YD0wamLRS45W2BZfiuTvaFq95VVB0v1wdqKidsLNzeU3Hkw/VzlZ25sWQ3+E4AJlM/+GQA/3/i/RlmCMhOmqFryj8zzseC2jxfAX6geWWUGbg8YNwri8kCd6iZJuQbUK2KA17yi3flCWeUTMvv+NpD29xgs1KkFERJVuUiHxfvXuG8UXEyBbhOCiwOGCzskWAhG/qmhz3/EvHPnZ9GQo74rKzcIlYbnF4VDKMaCREioiRDE7ZmTeu0nX9lP+IotzilIe3yVJISpgVoZNmYKU9/sJHr7l11kXangmS7neCGgUxIiQkmxjWTafjGdKXMcVbjAL9kVe4i7wjip8NarpXRL5STIuYVDChIgJAOjOwzyV97BExzWMG2KwEGQFRfJKK2KRoBqauyhp1z8XT14wqr8lfUDvmqXcqqtuefmp/+YN77t7wRvnOluXr365aDvlnXivf0bD4iTp5db28u235mvflBYkx91dPzlNvHTXnMn5HQNIJ2WQvTPqMggkJuyREKpgAZnY0EZj1lPfK20fcvTFL1jlgcSpyy6ZHRn4ngnPYrdSRyAZJP6NPWr5ozYSse382cu53y41JGg4Ol+wydkOk81AyNkTDaAV5ZIuIIErSg/wW35WjvztjPSHDkGT4hkyXcV3IOJmwCPaVZgRAH2+QAHnKob88XhCouN6tXHTXpptVyALMCZCNIEpIEmdIdtgFv470MaUkGclggMlGdronLMsKlF0X25WrmpnEngQzoRuPmVKbkZIuEXtESGTiWUxJ2COibM1mird6XHN+MWcDrcICHnMiJGKYO190/3WkL1geGTMKJoBBVhpTbr73+9PW0E6iSLE4ZZBwRcTxmInYDD8kQePMlQdjo4CwO98NfjR51a2aPkZFAd7KkRAtIp8EOemrLD/M8t+A/zHpRxAtJlkhSQg4RzbZhYmp1R881/3Hjm9F+unT6f7+/tMDJ/rTJ06m//zrvkRlzSQ5SQPsExAhmZ5oPBTZmLfv2IuvHn25tnntlnfvW56cv/6DWPSlianjm175+PFNby9YCmftOrT2hXcfe+Xjpc/uve/Nz+Pb3ln1wEvztr37cE3Lyu1Ni3e2P7Z6b6S65fHNb1c9/86CLe/f9/C+SUKNW0WUXMM+Ys+q7XzK7H56pV2ixf3qrrxHzNmvfrL91Z7dm15/6DE0Q9xFgTP8PoyCL6zd/+/xPnkmUBqGC5E+gKSACNUIXBr6Ucmz+Zo+BqCQZLkyAij2iLZLtF0S9jjrdMlmhomnFIDZFdA7+0n/zXdeMmHlrSLy8ZhxSB9AWkS+s1aCjvfzmJEQKcMcBTniAytjSkr4Rj92k2vOpXOeZWMwTzJJySQ12wtsNmK5nRict0ne9jjSgePrwPJJ2COb/vJ4wcwlhZf6R0StUGnSI9lUBNE85gSbFRClWn5hezAn8oPRD12rxQtFnXb0HwkyIqQkmzifDT0i9siI5U1CxXSFlfuTwHenPU6AGq+IfCWY5TEt24SCKIehnBl9sL/kYNCamasypA/piE0KKVo0/UWPXs/xV9/znJt/iV65f1a8/amaj5+v/eh5/dAm48Dz8Q/X6x9vrH7/Sdi4cf/hF19447FX3lv60X8lNjRXVNQWPBifVlTuGnnvZXNfIBXkPBHHizLNHtRVaAAZ2SacDsqYkQ0yWlt41xOBy8Z8V40HBWOUgChg05LpUaBXtmgJMhk2wbSE6AzLYI+QJARESFZATYwtWHTtJUUjqoyJFTAsW4Sjkg/dOhOwQ+4MlQxGPwB5JOiL2IwIg3c+efMNd/3wni0kqAtHDN85EVKmhkJEnJP7kUxKtGiQJKPYG0sUjH3kxmz++1PW3aiYAUfZEJIUb5PnxgSZSQifHwKkpaQ7Yng0nHvPltuY8ouLHrq+MpGnmD5g+STIAYtz5k4J0TymHVXkTBg3aHPV9ki7mey5Px/z2NWSlcsnWclmgEmfGYmDrfp6huWhB9QRCiY03V9ZO/WSou/O3hKSYVAxA454O7jS9YmIEzHNJ3N428Njxvl1iGoiJh2D47JKLh39YI4WL1KRj7coMcmKiBucfgbXsl/L8mfN5ReKKb8REUSJSY7HtJB0S9hTmRiz9fUV3X/qdl6+cBbpn/XOghH9J51jp7/s/+ff0n/Y17mzPDFRrKckzErYo0CyrCZYvM63r29LouXp599+8Kl9ymL93o2/rirfeuern2xfY5Q/smv+s6+Wv3XMMhq2vPu5/jR8oL5r55r4fWuMCqPl6Q11Cx/eOa+6ec0qC6yzyt/o3f7OJzufsSu13fmazqqI4PcwZbvvePaNR42O9c/u19TdIW174YbXq1KtL7+QfKL2g2dfPPRgeTzs8Ok5lr2gUf63Sf/cFcD5oSQ5HrqAyV4evlx4PgRqx8oonHFrRErYJdlZkp3lqCuO6yvQ7wjWIqREc1TMYO59OnjLHZeMXXKjbAciiHbkHQBpCfvPbYmjFMmYckhfgGwE0XKSBXqo4OHr6ZKrpBeLQMIvmSSApKNKC4jgMcdjmredSShHxB4R0xJkVDNPgFnAClTqBXOXj7s8eLGa4CJJD7BpAdKlyCskfRFEq1ZIeCl4zbQRM9aNjOpBEVIi9jgTmIhp3vYMG8MZGzqzC8AB3nSrtjtaS/9i3KVFC26T9nhl21ec5CJ2ZowNVWcN5W+Gke+gWAEpCTIg6S3FhEP6BY/8qrD8lrkvkPJOevVrMxPta42mzdUfr9/5/jq9ZQtq2RI/+Myu99e89PaSTa/ev9KU17+24OUDjy2qn1YZz1+wc8KYSk/2/Cvuem4ksNkhGW04nWWOQMoh/QhiJexVLX80PvaOJ/Kum3KVWuuVU7dEMCHbnOSkyk02k24dnMOc8Bwgj5xyRyxCxrlSonDiyusvzh9RXl1UqYdl6JahWzrT2WGkDxnHFc+scZFHQaxgswrOn7ziOtf8n8/exvDIJyJueCAyRKki4mSLdtInANKSzUhJNzDpaKJg0uM3uITvTVl3i6T7BUQJSbdcT5dYxPnSpBdkfBGTvMWJdg4PPVFccNfzt42SR4QXXVFl5A+W8DESZBSLVq3M5Dc4lofWIkzmFihH2EXnzLvCW3GRaAaEFBdBlGIxg7mNr1mRfzXStxkp6ZYsV8zIj+4ef3H+j2Y8T/IWo0KvClkFsQ7pA8vn2FNMjhRtVyZvBM+YkYceKR64efbF4x/i1Jo8AGnB9vKp4fYhv+Kf3w7/Y9LnbVKwvSUWHUm6pGR2pVXwbP0jXb/vHvjqn/OT/umTmfj/xMDJf6T//Hp3vMqaJtYxEmZF5FYRUVbjF9b7936y6an9Me2F8ermggdr79r80SKwaQo+8vzDO4q15yYvt/lk285tr6/e8trSh14qTXZtffjl0hfeXGy2PrV4R6Rq68ya5idXmbEn9Iq3ju756HfGtlcXx/aMrUB5fK2rIjma3zo+unm23bP55Q8filUXghcLN721yDq0ZcnWim37l+9qXRqtLcyY5hyl8t811r+LC80EFzpfxoxkE4pB/zR0SeQ5v1xTJKOwsyQ/i/SdLLRsUQr0K4iRECkjVrKyowZ3zzr/yDsuHf/4jYoddEomFEwASA6O/KGxNxTycDKmAHI52bAIouUkDYxA4SPX0fOuFl8YDRJ+J4SUEC1YTkjukyAjYY+EcwDKGZL4VTNPRNmKFapI5M9ZOubnuZeqtSxve4DNCpCOYN8g6Qf5l0O/mj5iyoqbonousFkRewREyYiVbCaC3cNV1+GkL0GfCCkVu2Jx5pdjfzov/sKgAAAgAElEQVTu/mxpFycjr0P6zmwqIifbzynWeYgmM0JMEmBOqfOWwJyITQqGr/Chazj+6tnPZ0dr2cp4YFnd7A3vVq2sF8t2TV22T9zwwYLF9vwHzXse0KeX7R4vvRyusiZXWOOFPf4FRn7Vronjqujb5lx69+aREiIj0DvMAb7iZs46RkhSDukrMEP610++GlRzamokj2kJs4LlUaDXobnh6SiHWQByybZriPTHLb/+0sLvxnYXlNWGnClB+irjyzYxnPQdvcW5lApdEcutocK7nnDdNP2nc7f6BJNyvGUwwfgVWR9ARoEuYOUASEs2xaNsSadj+uixi65xi9+/45lRshEQECGkXCBFOQLvv4UI9II6j2RTvO6b85Lb/8ClwaqfVdSGFStjTAk5qQiXAl0A5QxLzmdIn8eMs+YrfplgpWsLHr4MWAEhxc7TXWWp0DBi/YbwK0OOmBGxRzTcZWY4Vj36qskX3/XcSGDTKmSdajRnGeTIZQrKUdBIBboUi1FMn2JxylD9WB0r1nDZJT+bssSn1QYB8vCYLrVzhs2IZxH6tzLX/5iXBESIiCu1uEjSI+DsCrNw/d7FXb/vGRhIn0P6Z7+abER6IH3q1Kn+9MBAOn0yfeLD4/vu12dETBpYnGwRCvQoNYyw1a/3rVj9RkllYix4Je9+a+pTHyglz+XVdC1dbM0GL44G20fvbnji5Y+XPff2/Y8k7t3etHjBjqnLUclLHz+89d1FLx585OWWZY+ZkRc/XLb5zUde/mDJKx8/vig1VTWCfK17Yf2YNe8IG95/cEfr8uV1xYvq7lj66tx1byiJlqf3fLiupnHdtuYHlJq8s0hf/P+M9Mmvv2+p7tb2elWT+2noP+9ZSYt7wjIKCyaVWalgJ8vvctJxisVIiFSgV8nUsLJKioqZwduXUO57rpi6apSMvILNSDaj2h6APKJFnxU+nyF9iwDIBWxawt6ITYvYI+u+sUtuzLrrspnr2BjMFyHBWzlOLYGIaWD5hnRhgFwK9CiQVCxaMQMS9gArEKsJT38oeEXe92K6T7IJYLMiYgTbe0be2Rl0Sz/ktJ+rtYUaDoqY5KHHSTwKyD2oJwxvrUfEHsGkZMQqFl2RyPuJ77v3rPDJexjBpPgky2Pa0XYHSZ9RrDMR3JDNM7kTi3BK94qtbDFFAyswZfnIUTMumv7ELaCaVmo9pduJ4pc4OR7ga9iSPezc7e7iXaQY90oJr2Rwc/e4BcjymJNNfzThX1g9uajcc/OsHxXvICTs4TF3VqJo6NaO7ixiMoJYETGyQWnx/DvX+a8o/CG/3QssAmCfCCnB8kiQkzDr8OxQGlPEtIQ9ALkU7JYQLcOQVDPGX/WLyyeOiMVHa7r3PBI5ohREgYwlPUOSi4RoAEkF3hYxs4FRIL1Q+LPw9+5+llKhVzHdQ5OHhF2i7RJxRsRTMeeQfmY+Q27V5Mr1sSHtKkK6aOamHIADQpIqRS4REir+moFwARbDXinplmxK1Fmhlh295AaPdGll7RgFDokbnsEE6RnSdww7pFXymJGRV9oVuGHaRfw2Tjb9fJLhIalA73C1bRguOB55i5KTrGCRqukrN4punnPRxNU3DBbm0UOZNgnRAHkU6FJhlmp5htUEZiqGoyg4/0WWVn4+dSURM0JakuKhS8ys4AfX3Pa/Qfr/D3mJN90iYmTbJ9hMRCeq4re/8tbTR77oSfdnSL8/fTrz5rR0/1l1+yPS6f6Tp08478McSPcf/WvbynogJgKK4QWQ1pKUpJORHeyj+++qRIWqyfHVXqEmsKBu4twXyKWv31Eez5X2eEt3s1Xx29e8FdnUFL3PmrDIHl+pFynbc+/Xb1/z5rxnD8jlxqRo7aRHkvdW1d6hvTJm6f7ZlcnRquUHkOarPSvfvnvDAbAITgM7wiBR+Oibd1UYYxenZq5/J7rm1cii1FQp4R18tKT0lTXUecx3bmr3fxXfsBwTDbeS5KJGgJh9VVC8tvglRsa5gplJGQ1vWKb0zVlL2lQEE4LtVVNeaY/Xr90QEm6Yv4mTIBexSRGTqu0GyCWhwaKdM+JgRrF1SF/BhIgYIUkJOEcx2LuezHLffWXR/TdqZp4ICQl7nP2oAjpTDfXVTpEA0jLySlZA2B4MyjeNuuvHMd0nJd1OWbRs+0RIydCtQkaq9Y9eft0vb/8PsHOiYuXJmBKgS8GEhD2i7RpO+plbOJq+RcjIr5p5szcQP/F+P7I+HNVZwaQEm5EQLVuECKkzpD8ohgzZ/EwBO/QAyynxdIMUo8EQvzUv5+6Lww9er9QGopiTEStaXgnRIiSiSZ8ICTXFypjiTQKkOAFRgs3MM92K7VXibOT5EBe5npGu0nSvhHNk23fBnI3FOcYXIC0hWjZdUT04ez37y8kX3b7iFkUPqVbQSeHwyOdU7ABIRk1aNRkJMjymB1mPVBClmAFxx9hf3XERCS7W9DFn0etQf1WTAZB2DMvbHqfCJEP6TvGJHqisnXDt5B+HH7xGqvVqun8o++WwpLNLJmKTAHPOlOO4gWqTMdMPXskj518ZrLyyZCcpY8bRTyST1DB57lD6es4SEcNDj4RoBVGqyU1YmnP9jJ/wW/OcSN/JJA0lMB0BWYFOHoURERNBNI8ZPslGEt5ZG8lLckcssibJul+wGZDihDh5lrQ7VFB0ofYA5AHYJ0AaQDqmF4YWXu7iL41s8ytmcOhRDq6BnEnUWfLSZ/RkREuQU2oKRj98Axu79O71OaqZr2JOhm4FsWcq6L5K6N+S68/K056n/RdI5MoWJVq0bHMS9sqJ3EdhaV1T7fEv+r4l6Z861f/lQDrdfzqdTqf/lf7TSx8trbQnxsygYtGyTYiQAmawdDcrGwxALtkOFMcZwfBJCVaqccUsSkEMb1FqPFi6ixGqGbGWFGs9cg2p1vrk3UFpN1O8gxDiXj4REqrzlJr8qB4Wazg+TqqYky1KqHWp1R7+ZbdWGwTxXEnPFeJeMc6AGq+6OyS+4o3spsFXiwfOnUv/b5H+N2twms1EdCKaCNzzuPdX475/z6bbJBSUrMBQLddZbCjaOQKiJJuIYCKCOYC5eS8SN8348aRKj7azQEZsKSZ46FKwC6AcYDtVJWdIX0J0pibaolXklqFbgLSQpHiUFUPekq1sMHILI18hVHtFSKj1jKPwiJge0pqd9elQRlfBbhEGZBicu9V324wfj194oxb3SUmXs6RQbK9kehToUhEh6767N3suCoyQXp4qJ8LAZkWUA5BLsrLl4aQPv5LmUjAhWYGoNZaNXfrLMT+Tng9XIp9oOTuSSNkiZIsSESdh7yDpuwZJfzgJclHsUaBHwYRsExIi5bhvYe00Zu6VHuUXc15gIjohJjnBZkXsUW1SMWjZJkQzRzI9CmI02xvRCdn2icgnIEqzvLcvuTXrnssnPeqJmV7RHDVUjX5mdW+dIX0REgIiRMTINgFgdgX0z9/MkpFfuMUfVZgTFT0gm9nApoVkYJ7t4m0PQJ4M6SP6DOk7FX66v+SFwu8wI+58epSsFwlJQkCUgCgBDmk4jGpyqskBSDox+xnSh4MW28uVJNhyo4iTb7gl8p3ZL5JavHA4E/GYdipoIzYjWqyI3CDpkRAdsQgV02qtd84zZNbMq8Y9ckvUCvHQVQpJkPTLFqWY7m9kpXOnBNnmZMQClKNB5s61wV9NvXTCIyOdhY4TxQ9VbYqIAZbbmf+cCWOI9IurA0z5pTdNvaxizxjNDImYFhChIW5Y0cuwEtILbdJEdDTp4Q1WgCxIknJt/uyNo35aOGLWuiDQ82TTLyDKKWEQney9xQ152tDalMcMj3zRXZNvu/fHbOwSYRermoWCyak2qRheMKwvX79j4EJs/j8jfedNSiKkRMsbsyav3b/w46NvfPK7IdI/3Z8+PZA+dX7S708PpAdOpk+fSPenB06n/5X+a9df39v21kMP6tO0mkIN5YlJdj7MLrVzSpPkPEwOlnyQX6398Fz4TQa+weS4z9mWlUmbXOD8wVc1ZH4d4ibHXc7FILl8ezD/FnjMZUagzYiYLoWkmOQiNjM4is4uwYxYbrWOVgyWfzl01fTv+CtvKX45X4oHNCscibvllEdMkRHEinZAQBRIumXbHUF0iU3xKZeW8oM9Y0MLbrx51n/O2pQl7mZU6AWQFJEbII+KKBWeJSB6hsqBRJTjFEIA5BkaErJFFT0w8oaZ35+8OidqjAVGQMUcn8hREAVSlGAzPPIJOMijQKnFCYiSk6SYCip2MLLLP37xqGum/Udky1g1wanJmyXscfYcStilYLdi0XLcJ+/Ju/6OH4Xuu1GuHSuhUCkkBcujYVrVyQjOATatIFbSyfI6rwBdEewWUnSkflRJ3Ad2Trt8/Ihw1TVltaEo5JwyUAkNqVWZgjlnxa3AoU6d0fdkNEq2CBl5JcjINiGbHi0RmLr2lhtn/GDS0iy5Nl+CnIg9SoqQLUKxGMXOBsgDIKMin4p8ssnKuk8xg1ptMPJSrgdc5gKXzHuZ07BfhJSzuUaEzk402tlOKSDKydBmSmucBDjKlgy3nCDHPnrbFZN/cM/TBTHTryVHSiYpoWAEUbzt4jEjWAHRypXtgAgpEeXIqRxg5ciYEXbnB7Sbfj5phGD4SlM5EeyWUhxvMSrmJCs7YrlFOyTCgISGFVmd0RA8ou0qTd7mEJZseu7dSvxs0neCC3LArjFRk1ERJWJPCXaVYlrAfqdkRdPZKKIF81Y1mSVDt6KHpO1jOe1aVrt67lZONhgRuUGKESAtIELCLoCzJJwj4RzRzhFtF2+7eNsVSXqc6pHBAhJCSLp5mxRsphiSgs1INiVjRrWCczYzoapf3TLrYn53SNFDisVpNiPAbB5lg73cfMsjIVKxvaUGxVuMs/lITYbEhG/O+smXThwxefWNcg0ZtQmQ9PDQw2NGRYQDBXoU6AGQdKbJC1bvYEZM0RErByAP0DmlpuD62d+lwa/4XWGxNghMGiCPbBNykuUxN98gRcsrWt5Sg+IhCVIMD8mIzqi46PZl9E1z/2PiipuVWp+su7WkJ2Jmy0lWzFR2ujJWwh6nCi6CaDFF8zZZijyCzUgpTrIJ0XbCDkpCpGRTIiYFRDgb3C4I7Boa1womFEwo2K1gtwxzojaj6P6y6nErcCzZojf0tfZ+9vtBTf/0QPpkOkP6Z/8ZkflcyekT6dPpUyfTJ9Mn/zv9m6bf79/V+Ojj9kytpgAk/Irh1YZee6KHz4aRqxq5WiJwISh6wHljBjAyP3/dyWZQNYKqEYzqwaie+Xno4P99xIyQlgioCV/UCGi6X9H9qhWUdD8ww4rxFTjWAIkgqPGW1eZXVd85+VH/T/JHTF1BaTWFMZgPTFq13aDOU2x6eMyp9b75+q2SnSViWrC9vEmUmeHZT/pH3vPToopR4kt50ZoxMWusauarZp5q5qlGblQPq3rBIL5ifwdRPRzVw9FEQTRR5ODepwqz517uKrly/qZQVA8CK6esnhKRe57ullJ+IekrtTgec5LNOIQe0Qm+OjjzqeBNd/x4bFXOfdV3ltUUxnSfZuQ7N9XMvJiRF0sUlFWPi+2cPHPZuItCI2atD8XgOAX6JdNTudcr6qMimIggSsR0xHAp2C3hHCVFlOo5vEmUWZMp8drrJl2sbp5Stn3MAmM0iOdGdce1ChS9SNGLnHtF9dyYHowlcmOJTNfO9DThj+phJV6kGYUxmBdL5C40J/FbCj1zryNKf3nXU2wZHAMsjrdyZNutYFcEjhJtlzMIeehRMR3Ffs0MVhkTCx+8KbvkiqnLveXxqdFEkVgdUs1CEM/VjHzNyFf1sGoWqmahYhSoZqGqhzWjUDULVVigWiHNDEUTBdHaouL14391+89Y+RZ1dwgksmWD4g1a20eXIo+U8vOmrzjOAMypdbQAs0WUrRmElPDNWR/6ef6I2x+gK43JUpyJJchK01URJyrixALLEzVpxQgrVr5icU6vh/lbrmLkKmZQtfxyTUG5Oa6sNhTbNb6ggr5m8sWz1vnAHp9ieIFNC0miNEmWYipikqW6W8WsaOZoSQJY7igMVOgTJi3x3Drr8mlL/Nr2ieVGkaIHVDNf0Ys0o1AzQ1E9N6qfcbBhDShQzUKQKAR6ngZzVSsE9JBmFWlWkWKEgR4C8dyyxJiKPVPvXBHMmX114aJbtF1jK2CBGM9R7GzZdkUwoewNSJgVEKXUsVo9JRjZkk6relHxtrxb776KjFyjvDihomZ0NB4qt/KkeEgxC2NGflQPO62K6rlKIg/oeUDPPw8v6WFVD2vmGLE2qJmhciNcXltUFZ92z5rwLydfNPbR25Tdo6uSBXxNlmS5lCQjIErdFxAQJSdZba9fSTKS6VEtP4iH793iv3XmTwPaTeKW8ffpU8tq8x13PeOrRu4gY+QqRljRixSjQDXzgR6SE7mKUeCcE7VCZWaBZuQriTzHjEDPU4ywoocu1H7FyB3klmGj3siN6YVqdUFFzZRV+8urD2394Oh7LX3dRz/947cj/f5+5ysi6XTa+SDWqfSX/0j/4dNTH73Ru2PXoVVb339w49sVG96Irn+zbONblRveXLjhzQXn4pm3ol+Pp9+OPv32N5zzzFvRZ96JPfv22XjmndiGt8rPi3NP/ga8Vf5vYeOb5RveKFv/urbxzdiGt2LPvFm2Zj9YWicsq1OW1SkrUmdjzV51bT1YVxd9KvnAsuoH5jx+BzH7lzNX+sGOcCUMy7pbhjlKkomYtIxYNeWNJG6L2gHFyK1MjJm1mh6r5Mx/7PYlOyuW29qK+rLle2NL6rWle9Wl+8CSOmFpvbisThuEMhwr69SVderKuujKuujKVGxVKrYqWb4qWb4GVSlPz6VnZRVqWQv2FC2wOdnMLjFyhGQggn3O3mAZOxt6SVl3V1h54gvjuZLsIsm/1lz4BFZWYnFlXXRVXdmqurIV9WUr69SV9WBVSl1tl61BVct2PVgoMbdOu1R+YUJZYkwUBoDlBjhLSnmLTUJMsmKKFFG2bGZXpLwVKFBRO2HK49yoqdeqT5Q+EV+0zq5YgYQ1+7UVdfKKlDKsd9qKlLKiTl6ZklcmlZXJMxZeVicvq5OffqPs6dcXrKorW1kXXb0PLEWla+vKVsPKig0L8iLeXJAz79l8dVc4CgPRFF1q3qLUsUKSKsVUKSaEJKUgVq31KTsC0x9j8qM5s5dPfTxx39q9D6yqjy1JysvqlJX14Kk3K9a9WbFyX3R5vbpir7a8Xl1er66siy6viy2rjy2rjy7bC1bWg1Wp6Gq7bFnNwtmPzrxxwi/uWkqV1+RVWgVRGOATtzqJEJAMAuwDkBYNN7CImO2NVQfAKxNzZv5yRkXBRrj4yWTVk6m5m/ZO2lzv35Is3GAVrK+bsHbvXUuTxcv3Kctf4x0jnLFDnbysTl5WL66sl5bbseUoum6v9gSuenzng+PVglDpLbOf9Cs7CstxvoToEugWUzTYyzmpIwnRGvKpNYGK6ol3LefYkpuLn7j78d2Va5MLVtfLy1P80pS0NKUur48uq1NWJKMZpLThWFmnrkhpy2xl9d7o02+Vr31NXVEnr6rXVtZFV6SU1fvUlfVgOVaerl+0tLqqdOnd3Lys8QspflOwQg9W2LSGSd4gSw1Gwv6SuFtBlIrcmkEtNMbMf7aI42/N532Vm/inUw+tS1WuTiob37t/zWuxpfXy8vro8vro8np1ZT1YUSefNQrOxXJbW5FSVqbE5Ta/bm/sCVz1BHpkxqJJ1JzrxizIUl7OXwjzNYNWLJo33aV6jmi7ivVREcOlWHTMDFYlxs19MkTN/0WRzC7cIq2FjzyB71+FYyuT2qr95YttbVmqbFkquiKlrKgTV6ZEx43PmKhOXlEnr6xTVyaVJ/Yp698pe+rNipX1YElSXF4Plu0FS1PS0pS07MIdWVqnLa3TlqWiQ3AssKauanXyvk1vPIE6jPf6Pmw62tVy+Ognn/156ItY6fSpC5L+wEB6YOD06YETA+l+R9k/ffpk/8CXp9J/+69TX3x+oq/7vxtaf/tu1xfvdfz+g/Yv3m//4zvnRcsffn0BvHsBnP/81j++e160/+G98+JC518Y7/1baP/i/fYv3m/73Xudf3i/448fNv3+vTcO19nNVqo5cV7UtyZSTdWphur6BlR3sB5/nHx4U9WYUmp02Uj+uYLYnvyYHixDecAISPEASASr7EK1Op/fUjh1EVkwb+TyzVW/7tj/dvv+ZItut+pWs2626LDNtNpqzZY9qL0at9QOQ2IIdmsctyTs5gRuiuMm3W427GYr2QLrW2z4IV78/JJxJaHx0Sxxc6DMzI3VFUgoVJJgZeTVbK9YS0YT3iorrO70z13jLZQ99y6a+8reHfaB2rrmXam2Gtxs2a2m3QLtVhO3JHBrjd1Sk2pO1DUi+CHe9dqOGRWTcouzZq8ILohPFGvYir1B1c4rSbClFidhVkFs1PDFduWq2/LGl1Ps3dmLn19S/9Gr+w7W7Wu20KFduLXGbqm1m52+GLjFcPriHLSbjSE4/4RbEh99/vqhL369v6vObjZSbXHj4A67sbquGe5teOfZmk38I8WjeXbiAg+/OVym50dhQIx7ZSMkmCHBDGlWQVnNmHlPBiZUjJwIchdvfcD4QK9vTNkHzboWvb41gZtrXu00P/r89QO/ffONblzXEk+26MkW3W5OpJoTuEnHTSZuiuPmmmRTTV2TUd+AUgex/mt74ZMPhEs8ExZmaS+OU3flVSKfigJ8nAaWL4r9coLUdG+5UaDuCs9dHQjxRHQV+LBz/5sHzX0f73m/47n3DshNB+5p+qj00Ifq+x9Xvd20Fh980W41UZte32jUNRl1TUaqOWE3J+zmhOMDqeZEqgmhg8a+Vt0+qO9tfH3P67WlD8/KK3ZNW8SWbspVa/KAEZB1n6z7pAQrw2A5Gl1eM77k6fyxUfc4yXf/xgU179WmDsK6pkSqZY/dugs116BmHTdbVmMcNyPcjOxmy2627GYj1WQMuXqyUU81GW/31h/83Zu/PpasyzTGSDbF69r1uvYEbtiTarLqG1PWe3DptmWh2Uyw5Fb+mXz1lXAsEa6wi2KoQIgHy+0xZWZY3emPbc+f9qDbN3vkjAXTt+972f7YrG9A+9vQax1W85/e/fC3r8LmXXYLtFsgbjHsQTt8PdDBxN42M9Vciw7tqm+OJw8ZyYPYPmA/uOF+bkZ2KHKj8Gyuuj23IpFfifI1Mwggs2BfvmoEYzXhyl3jpy7y5M7NnvvAjK1o476mutSBJPzQTDVZdrORaodGo46bMW5GdrORaq4dxKDHttSmmmvrWuL1rUZ9s/52j930hzfeP7avriWOmqqTrfFka9wZsKkLtz8zHDL2twYHQgI1WHWt9W93f3Dg2OEDR440HT7W2nH080//a1hhfv+FPiU7wvnu6+mBUydP/ytz0qkv0+mTp04MnO5Pn0qn/zXwry/7/5lOfzmQ/vLE6b+dTP/lAvjn1+N0+p+nv+mckxc453T6nyfTf78AvvmaX8WFrnN+nOr/8vTAiRMDX55OnzqRPvGPgROHPz/e1NPd1NtxXjQcaWvsaW3saW3q6Wo9evRAZ2fDkZblzy2bGp3km5UzJpYze7V/3nq/sCVf3Fo0f0No7trQuIU5vuKbJ4sFi9ct6jrWejp9svfTow19bY19nYf6ug71dTUe6z7U13Gwt7Xpk46GY21fwdF2B4eOth462nqwt/Vgb+uh3tZDPe0NvR0NvR0fH+5r7O55t/HA2uefvFuZWhAhi+4bVbotDGoLtXhhTC+s1IsqakaXvTxm/trgxKqRuTM9wsPF1tupQz2dTb1tB3uamz7p+Ki35VBfx4GjHQeOdnzc1+p8vauhr7Wht6O598ihw+34nXrpQX5cJDC2zDVjNSO/kh9NjFYTozV9jJoYXRafALaOnnIfURjJypvhX/H8qgOdnQ3tR1qP9Lb2dR040nzgaOuhvo5DfR1OfwcxeKS3+wwG/+mLf/7pz/3/7PrtJwd72xuPdRzobT7Y29p4rKP5SG9T9xH0Wt2ilfdNF8fkl+SMLht577oQv7mg9PnRkS3jijeNnbLYmy/njI14Z0anPLXt6bcOvdvW19vS09t0uKuxq7W1r6PpSOvhT7v/9K//+u9Tf+n74njTkdamI+3NPR3NPR3NPW1NvR1NPV2NPe1NPS3Nva0tPW1t3V0tfd2N3X3vNDUt3rhkopgXLBk56f4c9YWC8vgZVMZHl20fM3t1cFylq6CYuXdhaddvPxlI/721/cP2noM93fHfHH70752Rf7SX/f3wY79tW/HZ0eqO7l83HWk/eKSj5Uh3c09Xc09XU29HQ69jmbYDR9sa+w439vY2He05eKTt4JG21r5jzb29+95/fcGyyulgXO682yZW5cxbF4pszCt5Lk/anD93fe6MFd5CkFVUTN2tTFm1eeWvmz74qL25ua/zUHdTQ19z4/HWQ31tB48ebug7crDncEPfkYa+Iw1HDzf2HW7s62w82t7c197c197U29F4pLOpp+vYn37z5/6/ffbXz5v72hp72pt7Dx/qaT/Y03Kot7XpWEdDb0fjkcOtR4++13Zo1Za1s8tnhed6g8VZUx5m5jwVKN4UmPucr/i5/PlPFU1/0DdWIiZEQhXLYsn397cd7zrU3dx0pLX9eGfP73r+lv7rFyd/d6jvQENPT0Nvd0Nvd1NPlzPimnu6mo50OsY5F0093U09XS1Hu5p62w51N7ceO9zQ29XQ2/1+W9vKzU9MBWN9M2/Nl26983Fu7lOB4o3Bmc8QpZtDs58Mjr8vOzdy65gS332rFybf3n+g81BrX1fzke7GI4ebejsO9bY2HG0/eKzzQG/voV6nSYMM0NvV0NvV2Hf4UE/7od7Wpt62pp6ult7O43/69B/pv/32L18097Q1drc093U29XY093U2dpBajbEAACAASURBVLc193RcqP2NPe2NPe2NRzodazf1djT1tjX3tB3qaW/o7W7oOdp85POGjk/bD3/e2Xn8s+O/H8btF/x4+IhTpzPvX+4fODGQPpFOnxzo/zKdPul8AH0g3X+q/+RA/4l0+mS6/5/p9L/O/Rqtg/TAya9D/zB8mzPPOTKQPnFefMPVzoMT/xYGBk6n0/2nT5/s7z91qv/0qXS65/hnrUf6mjqPnxctXZ81d33S2vNp0+FPmg9/1tTxScvho01d3bV7U+ojFZP4cQXFTHDeyNzikaH5o/KL3eFZzEQxf07VPS8aOw82t/3pv/8rnU5/+ukfmjqPD30Cu+Xwp02dxxs7jrV2f9Z0uO/b4Vhz17HmrmMN7b9r6fpNS2fvoZauRKpefrg8dy7nK7mloOzWsVWjCmM3jSm7bfICKnfebey0m8aXBB57avm+999sPtJ9sKPr8Cd/aOg4frCzt7G7r7G7r7H7WEPX8YOHjzZ29zQeOdJ0uK+569ihjt7W7k8OtXW/19iw8vlVd6iTigQ6UHzL2IpRRRWjxi5wj6n05MtZwTlZobvpueWzN+9+qfFwd3P7sfau3za1HWs5/GlDZ1/TkeNNhz9x0Nz5aXPnp0O/NnZ+NoSGrs8auj5p6Dre0HX8T3/95z9PpbuPf9HQ2dfc/WnTkeMNh3sbu/taO462dx3vOvLJ+wcaX9jzirxIGjMvr3AeV1DqCt2bHZ5HjeGDBfcGJ8wfv2jFI0b93o+aOtoPf9LcerTz8G/aOz9rauk73PN5c9uRnt5P/vLXf/39XwOffP7H1o6jLe19mc9ed/W1Zr5Hf6y1o7ets6ejo6+j45PGjr6Wrs8OtPYd6urZDmvnLrh3dLE3NHdkgXrDpIWuseW3jim7ZdICV27xrdyMUbfL4x58avEbDQ1/P5FOD5zu6uroPNzR0wb/u2v1ibbI6fayvzWW/7Hl0d8dfqmn89ftHd2tncda2j9zvkve1Hm8setoY9fRhsNHGw4fbeg81nz4s6auT1uOfNbQ2dfcfbyp82hH76dNbb3b47vVR6SpUtHYEq5wPpk/11Uw3zWa/z/svXmwJMV972u/53DE8417fa9vhOM6fH3t52dZtmXZlpBkhBFCYpGEhEBoAYxkJCQZkAABAokdAcMybLOxDPs+SGxi32ZYBgYG5pzuqqzcs/bKqurus8zZ117q/ZFV1dV9Tp9ZQRp0Kn6hQD19qrOqMj/5+31/v8z6xOf/41OH/PtBP7rwx48+/3QJM8gcxHwovDK2de4B4WvM13igcWlY1fxBZD3KycxTHd6rjIzPNysjYwZ3C700KFPHMAOdByXi6tTXqChR/uTGV8696hdH/uCYQ0886KDvfvQz3/ubz/7w7w749j987jv/eugJnzvux8etvefmN8rbgGmVmQDcopanY+aGlbkkGZmaMBgxcKiTUCdB/sZ2iAOIg85Xt7cN8kgngYZ9wAJkx2XqITvsQ6ZGA004v3rxqbNWnHX0qV85/KQDP3/Sfgd//yOHnfJPB5749wd952OHnnjg8Wd+Y91DN2+FoEydMmEaEoj5mAcaFRo31YjQWEVnkc4kYIEynUn1InudexqzdeoC7EEahJXt9SQZHp6BxFWvSjeIj3loEB8R2av9BnEN4hpEXaxrEBdRB1EL2q7G3DLxIa9BUqE8ZtSN5cCilO+G/myj3lDzQStJWvNJUq83ZurN+SSpN5NGI2nOJ/Vms95qzjUbM0ky264B6rKOgKJo9R7W6/u/qfMsZc3WXFYFldh+SEw3f129QnNuxBp4FziGiAAPy0Ru0y1u1wgLDS63QfbYi8+vuOnqc648+9yrzzrvqnMvXnnxL1Zec8sDt78BthlWpEFnfHxybma+Eo3qJIQ8Mrg0iIuYhFTqJAS0opiYWtbP1MRQtKx5IeYRIhJj37YGdORu7iv98sXHT7v8x8f8+MvH/PjLR5/6pWNO/crXfviVo7771bMuOefhpx8hbtxnMCg8jTj90GbOQJn4hoiAcHUeaFzqIgRmaJiBwSWgkUYcKELAAmyF2Paee/3Fi6+74Ds/OfbE879x9I++cOR/fvHok7/81ZO+9L2zv3vVuuvf6C8zT/YDqkGHiYrpDpaAjZ1KibgGCw0WooKpT3QW6SzSaUWn6ehSA2x0cmam3rK9yFB/K6IS9crchtQziI+tGIqwTJ03yuW7H33wopWXnnf12ReuPO+8Ky88f8VFN6xf++TLL71rUMBDbFYMFgLsU17FNIZUcrsKiGU6cnRidnKm5cdDivKYh4hJg/sGCw0WIxYq9CMSIBJBGlAzxjzSSUic2puadtUtK08693tHff8LXzvly189+QtfPeWwr59+xPGnf+O8ay585PmnketjJ5qabc7P1hGyNMSk9Ya9ZQV44mj52sna498aRpfH9G6HbmHUpjxGtIpobLDQ4BIIX5lu+mXqGWZYwh5xaiViA+EiU5YNG5MBIqIyJc9ufnHdvbdcdO3FP7/i3Auu/tm5l5172Q1XPPzMr98oaSViY6eCzAgxicxIw77BYkAjQKXBwjLxkVUr9jHlRihTvcsggR+NTs0ng6OTxPQhDRT0sV01RKTRQKPp32IrBlTqTJap9+xrm6+7Y83515537jVnn3XF6ZfecMml16645Z673yrp2AoAC6BZ1YhH7AgLDyAzkNVWkkxNzxuEQxKlbgFLRwGiMSSRweIeFiIRl1GgYcnd4T5gAyGRHeokBEJCKzLM4OlXNq+9+/Zr71h56ZqfX7jy7Auu/tkFV1+y/sF73wKaYbv92AJCIiYB9gziI+Yb1ATcMsygTPz2r2SdFvAQ8Bjw0DBDg/uABQD7mIZxbbyRJMOjc5B6BpdQhDoJkIjVJfRqfz7YIZWIhYhJxHzEXZ26gAUGC7E5aOCQkpBiL46Gdwr69aRebzaSloJbI2klStVptVoKeHOttMqzXp+ba833kooWzgLKGol6B+9Sn/T6q+I3e3116fPsudWTVitJGq1mK0maraSRJMIOIfUQ8w3etnwclnCgM2lYscaDMvOpU9Wgg6mEOEBMlrENTQdaJqCUChdCl6Ia4q7OHSBqgEZjE+OtZj0KahoNgJA6tcuEA24Z3Ac00mkF0CgzWRyKyu1Sn0AaQBoo7wBSRoWPUUBwBIlLTCccHqqOjr+plZ5+ddNTr2x8+tVNv35p42tv92OuWuhSpwpFWMY2toISEsiMykTqwlKeRZkFupCGGQIqdaKCHlunPqQSYA9RxyBUVmLdMja+/eqzr218ZtNLz726UWMUMAeblTKkzJbUCgCyEfP7oQktCS2ZtxxRD1EP0g6/KR3h7et1xifHpufnLM9H3Da4NMxQE55mOwb3y9QpM7/MAsOKoCXLTBjCghaFzDSwBYmNqIO4q3NP40GZSHWrNeIBKqEIy9TShckDf2hqcmRmzq7UgGkD4QLhaszVTV8XoS5iwEMgJGAeYIFOAiw8QASkng5jRAYBldB2S5Q8u+m1pzZuem7za0+9/tLjrzzzRmkrtj1IA425gDmzc/WkmSAmoQhs8ua2Jy9edeZHn7/5mPtXHDSArgvZgy7vI1hCVFO4N7gPhAtMW5lu2tDyS0xowumndpnb0HZ0ZmIeIDJs4NgMhoYm5gbH55lb0bGJmc2YB5kDWADMqCRkP/E05kMRAOaVkWewWCchYAEUQQlZUIRF0GfmAObo1Da4r1PXiQYnG62BiXFoOhqxkB30Y6FzD9pxibga84kdGdzXcITNWgm6OnWR6atejSwXMRMzV4cWpT7hnkF8JKoaqQEe6tTXoGU60g/i+XoyM9s0IAPM07mnicxUFMKkLnoYdQ0uIY90EpawpzFf5w4wbcACyKMyCgw6oOOaE45Ot5J4OBKCIcwRCSCvlIlfpp5u+prwDBIgFurIxcLBplkmzOCuRtPRB6kHqZd2Bh6osZ8+KeYovz6uba8nSW10ukwt3XR10++ntmFF6SX0aj9vD4Es3nIM7gLmITOCPIIk0g2fs5jTMPAGdwr6SVNlcLuPVo9jZ076QTpaasM6pWIlzflWYgexwrRSUQrxb6BzrzAztxFGiFecpRG3EbeUYSoBlYaIAPMws8fGJlqtJJTV1KcrYN3gvsHdoqcPM8tOvogBFkARaszVTVcTFra9ytDI5GzdlyOY+ZA5UEXrQmo00HlV41LjkfKvAY0ArUBSgaSCWd5sF7HQYFXl4EAaqF9RTVJgGp9OZpK6GfqAm4awNaaihEDLNZx0nASQqj+MIIkglYioO+ag9F8l4Oo+eIAF6juYSszc0cmpmdl5z42oioFYFfAQMAeYts5T/UHNGeqKEK6oP4fpQE1/F6XxRHtQGdw1hM08uX1iemJuzo8HAPN0HhhmqJtK98hN5qYLU+eOzgNAK5lJSAMgZDYNe+rRG8LSBTeErXE5OlVvNZoMW6YZ2WTLM3efvP7n/3Lr5YfcdvVhgb5iyN5g81K/EUA2lA9+jUcalxoPSqZTMi1dWJmaF6gIDzMXM9cgAaah5QxMzSZDI5PUCgziG6yq8JRZkBtifuq8szh/uAYLsz4WZNOwp3Mvk3oCg0s3HpqoN2tjE4A5Bi/iST3oIJPFrFwZy2duwC3EbcxszHz1NcR8Q9jAtIHwdR5AKgkPfL/WaiaTYw2OQ0IcRB31RNQjUL/SFenmBoQEPDRYCEmESIRIpOQgxG1EPUxDiAPCvSgemJtvVapDSuVDRKJsAOrcA0JF9iGiKuSqIlpV4wIRiUj7/qibo3NPV0Ehdw3uG8RHTIa1kfkkqY5O6NQFPNR5oJt+zpBe7Te4b3CZBxC6CJUB4Zd5epfU8CEslHJwEUQveH3i7yXNRVDeWoZ+x9FM8xZJs9FMHD/Gwsux0mV51Nke6tRD1Msc1UwV5Zb6D6TcWDPSeRv6MqyqaDEbk16GjA7od6I/WNTUeFDQ17nThn44iJkLmQWZBZgDhK/RQBdxiubUuU6jCkgqkDnqy5A5kOb/JFWsWlSZEPPHZ5pzSWIHkYpRdOrn3oqWQT/9E1r4FSqzabJNB0WQHNOQSkg9yCwFfdeLMJU6iXWuoO8BbhX5opqqsyiVBTo0igBQmYbkVOY/ZHAXcVe4cvvE9MRs3Y8HoHp8Qmqia44veGEpfPMrSvuAOnl6acxH3AXcAtw0qAmEHJ+pJ0mdEU6JJYxXNj506qa7v7X+8sPXrTgkgteF6F6OtxFrAImB1L0o3EZNeJpoT2+p1sEkYj5mLsQ+pdK2a9PTrZHRSW75iASIxp0+e5d0034cObuLHWmhKeiPzzdy6CtXV++c3RH12sRvK5Op0wqZ09ljHSBcleYBLCA88INKq5lMjM9THCCq3JQU+uo7S5mQBs/kkQzQBvERdyENEI0hDggPZCWHfoSphMqDYaHyA3TTV5NiOtZIpAwUxl2bAHlqigWAeUq7R0xG1eF6kgyMTOjUVWcGws8n7F6WQ1+JioCHqQlX4yYwbeVoprNjVF38nVnd0M9wVrTWAvXmd/tQaYxGkiStVuIHFVYcM50Ke1uOyMaSQnbRl8wsUDN8Bv0AcXt0bKLZSvwoh77sgn6bMqwD/Vm36LYc+qqHFaBfw8yGzEynH+FrNAA8BsLNpCqZ9bbYYLFCreJpgdRShSC5W2dwH3F3Yro530wcvwqph5g0SPsuFZz9FDE6rei0lk0hQe6HFoaQp3NPY66uzsM8yKyRqampuRT6Gol1PqCLWOcBZBailooVEAkQkZBkFMui4zwVCVig7nPxCSo0CzcanZidnK0H0ZCaPNKB2jUs208/P2dHx1A+ZhrHsBAxH6aTvYnMaGK6njTmOCYEUUlfYZsveXLtEXet/Or6a44M9TWD4jGLaTryysjLJ5VsMi46Fm0MqZ9A3CXEYyx0rMrMdGN0ZNKyfUI8TOPFyNIxB3TNal1f7nQpJGKhH22fnGsOjk5C6iEWdrLP65piOyaV9lgIcvclZ6VuuoqGWHhuUGm2kvHxeUKCjPjtKXBBq7qdns4vpB1AzQQGqxo4xDyQ8eBMvRXVhoiQiPlpa3mYuiliseebz5SLGo0ASzuzQXzM/Bz6KgsFqATCz0+4RPvTR9xpiLsGNQ1hA+aoHyLc8aN4p6DfWob+kkcrSdrQbyWtVhL4Fca89pPIhrQCdFd4m3mpXvfnKbijdJ4QYQ79epJ4URXwuDiwc7eo29PMh2XuAnRZCn1/AfQHEXcVgHTuAR5qNASsCkzbEHYalvKc+2EejwPmFaGv6j3ykB9xFzN3YrquoI+oh6k0iJ/34C7oZ0naWqEEIsVEUTTTuaMxV6Mp9AHPoR8i5mskLosBnVd1JtW0pKIrRII8KFGucSrKCSsfw2pm7RTlPMxcy41HJ2YnZxpBNIRIYOAQsTDPmiwG/e7iljSSoHGbyLSd/iXEoWZlfKrRmp8zKWOQVsVrI2jN3b/41xVnfnLleQd7/Wsi9CuTlomIdGrrwtRFevPbswhJ/zsVLkiEMukfM5/wwLLCmenG6NiE6aq6o275pdMF8YpWlOPybtaGDpGISEzDINo+NdscGplE1ENEFids0JY7HNXbC5a2IRXH2nJilqdNoe9h4TkyrifJ6MQsop19g7V11N7Q9LqIrwtLFxbgoc4ig1V1EmIeBJUU+sj0VfY1rb5jMitesLN5NzWQj50C+vP7Y+AwjUqpB7GPmV+pDjWT1uD2CYO4ys8wuJ85hTu4iuI9R0QiEmDmQ2Ij7uYyHRa9od95LEN/B0d2/5qtTk+/Pet2QX8BlNMxkwZlMrU0xR+n4BOxzgPMUui7lYGyGZaEVJJle0AWShu7RmMxAuiIBrKKT6WMUyvIoD+cejRKkuKxTmKDDhiiCP0C93lBo0zd/9DgOfSDAvTtiel6o5l4foyohZkLiQtVgM+cjomqCP325wtdTi+VPtshlDMyOdOGPg3LoqqgX/Au27dF45HK+3WNWMCchdBH1MPMN70O6EMcQioNsgT0g0Wgz4Ie0A8I8gkfmJxOWo2mJVxkUB++tB2senL1YXdd/eW7rj2maqwf4r92maEUjy7oIxKlYkUR+jRTooUPhA9FwJ1wcqaxfXxCuIHOHY0X+kYn97Oe6auUNRB+O5GYPZoF6OkF/baL3Ql92QH9VBYLdRHnnwOq6nDCLujPJ8nI5CwsQr+Q3l8ClwZxF4G+aSvog8Wh76qfKEJfN930zij6CwtwC3Crqz/vDPRhG/oStN3HHRC/cOcDRAJMQ4gzxYlEkESYB15U2ynoL8s7Sx9d0G+2EjeokELCthhrF63IZW0h9FPuKzU5AjwGTEF/SkG/ZMmyKYuuVtcg7Aq9dwb6kAbUCipDoyqRi1ha+qYaoJMY0SpiSr5sEz9PhS0K/fT8WUxjcBfxHPpRBn1bET+VhrKIO6u9i3RaKaYHs/lA6kwCIdufK0+QBQb3RyZnpuYarhdi5qpshIqWijcnv/mF29hdi2Jkmn6uMGAqFfRHJlN5B5EA4gCxcAnoF7MvXaWNeT/JBTdIA0ol4kPj08n8fENwF0Pmghe2g1W3/vRDmx74/uuPnBmXV8vyAw7VDOIb3M2ikyD19FMEtIWRVK3mUq1a0IRnmAFzo4nZxtD4OHV9TThlM+ycpQraMYvb1UGppfpGjtecTWnSdQH0MQ0zsaKt1bTn7A5ZLzOepSgV9HmaQAbCVafCwnNkZT5JRibn29L5gsLlhQJI2oaCvJMKR2m0p0ZHCv1c3sk9fRU9t4vuhdRNP58UDe5mnn5Hk9q/20PeGdw+1QP6Pdq/yIcBpAGmoUoVqGoLQCuYh140uHOafo9E7vKhjrR2MyvSn28ldlCForPb0aKCX3RzFgK6O40GUxzEkAaUumOjU43U0/cV4vM+YbBQzQ1dlno0vaoXFJRJoHxMagXVwdHJ2Tk/HFZVN2nzhNSpj1iISLceuqBirJCrZKnY3c5bch9xd3ym3mgmTqCg7xe8La/YcWFWvaMSoWoUwSz7mpWo5k50kPVvCVgwOjE7M6ugb+vU10VWQJnmBmRWqJM6m3Ax0gGVaE3HdpTnQjGV3A9HJmcmZutBNICoqtiTBnF7Q79j9OaOvwrhUy0irfIMAPMI96BZHZlNpuZmMbcI5SHZOI7XvLDm4CtP+dvLTv37sG/liHjUJv2QBsSuFGXxdqaHOXliPOULT+v3NeYa3BdOZXKmMTw2yWxP554uwkUbD6jMbqyXqxaF/EFUeNz5cwwgDRCTfjw0OdcYHJ2AqiohS2Xnqc6023CrGAPlUXJHIp1JnWXZKe6rn8M8cIM29PM+k3kMmcOxoMAh/cKCaSbr8K7OA4PFOglwIZHb1vSzJLwaQar0Pg2G2mWai/9u+jkLFiZyB7dPGcQ3CtDPILC4FfJzcVrDIyQQEjFfp246P9EI0GgZ+nvtaLYSVbOpMrlzrcQMqqmgUfSpeQ6XYFHut0dL5vNm9Qwp9BEJWAH6yq1Qa38IlgRHmMaoMxG3MGG10HTeC/qDiLvZ8PaAcA1qI+7m6jAsjisVmC8CfU9JCkXoG9wdn1Gafpxp+u1unQWqgarObOu/3ATcygo5VPa1AmglnyEMEugkBmqlQgZ9z1XQd7PR6EBSQW31I3e9nS7vqT0B8Db0lT+rSl2ZJ4enZlTJpqofRUx2Zho6qnfSGlMSqUo+oFK73DK4m0vkumgHLgbhQMix+WSmOUcswU3hk+e3GyvfuuNLT6/5yqNrjxo2bqjB+2zah3mkkyK5Mv4yBzKrlNXwqO6UQ1+nLmLScaoz042R7RPMcnXqAh4vqhtAKiGpQBIBFrTRTNteZHFdSLHic1Hoq6kiuw+RmncBN9UjBoXCKkgi5WQUR0oKXK7yQJLwwA1q80kyMtEotrwIfW1J6GclD+3ZS2dS1b0YLDRIQLjXBX2Ype6zxsh8eWDn0JPFPETRq9CZBKJdsglpoEo2B0YU9GNAZb7Oo1fjc+jnC750kcYcBnd1llbvqAtcSt5Z8BKVnrjrYb+bRzP39B0/zn2BRfymHvAt6nE58vIKE8IqiEhK3dGxqVYzCWUtfeQ81YLysrPe9byLmxJ2ipp+bWhscqbhpZq+WnbvZrr8UhHD4lbw9KFyk5k/MZ3MNxM7iCFzVMkmWFJ4hdkil0VrooptyCWUsfHJ2bmW7dWyWTPMSNEdCHf6hp0U63xexcXMlhuPTs5MzM15UVWlQFP1v9d96GWi7RAA4aeLLZhDsDSEPTrfmGsk2DQRxz7dNABufHjFfhuuOeLJtd+ubFs9zB4VZFsZ29gKi2JF5mkWBaUgB0S2PsNDtMqtwcnZ+vDYKHdCSGVG0kXvf8/nu2jHzjx9349rU/X64NhYu3pnkSC4/XCL4M4r3Hu1x2Ah5oEjK/UkGZucQ4XlBV0R9o7bv6BVqluqRbYyHp6ZTyrV4Qz63d5bN9x32BN4CERWZU8CTGVcG20kyeDIOKKeWrndbnnvs/XMEQpXY3Y+bAELMA+8cDgnfrvCfpE6/d6YW4Z+4VgI/cX6We+HtxBDhQUyKfQxc0fHppqtRIY9ob+r0FkI/ergqIJ+qj53Qn+XoZZHwVQqDQQzX5VsdkEfLMn93tD3FoE+c3YC+gsg0ub+IsTXszU+OfRHCtA3iI+yYH/XbAH01WUWoU9EG/qPXXfAmnP2v+7MTw+U1kXwIc/Sy9jN+08RoAuhr7i/l6Hfsz+3oT85Pz84NgaZswj021BeBPpLJDDzrrWn0F8Cpr2hnwuSHUN754m/A+g7ewP6XcPWwzxQ8o4CVseyqp2G/vJRPPYU+kuOH4lZBVKJmbt9fKqeJH6oWNYN/d04fy/o+xn0De5rzFds2o3Ggw7o+7/V0F+cR+3RBd5D6KuTF6EfGcIem1PQ5xn0V91+wUdfuOukZ+/44XZ0WwU/7Fi6Uuf2feh3/+2OIr+0a/0God/xJ78h6PccdGkddj5sPSw8P1yG/t48OqHP3d3oZz2NSsgrkErE3eFO6CtqtB/t3oT+YAZ9uafQzyYkNX7QktDvfZ4Fa0R3BP3puZblqZCoDf1dGJYLKAAK0De9DPpxbFB7T6BfvFH5VSCSQr/eSDBnhGGfbho0Vv/yhoNXnf+Zy370KbltTZU+SvG72KwgERcS0V1ec+dasFSh8heDftCuS9mDvppJeYtAvzshucdDQ13L+wD9IBqamU/iylAO/cV7485fVCf0EVsI/ULLdwP6LNRoWl+kzoOF54e1xaHfeSxDfyePPYV+zzCNpdAHGfTnFfRVKpV1Qn/XbSnop6k/qXrPnozM9D8U9LMVubsI/V62U9BXm5nsHPQXzC7ZAwLvAfSL6RB1ZsUsTOMc+pQzwqBPXx00Vj+08rM3/PwzZ5/w4Yq2ThoPujbQSVCC/r4H/T38oezu/Uagr9M99uree+jrpA19SJehv/eP91DeWdzTJ1FaP5DV9e8e93tDv4aoA2nae4zdc2OzkZn+B/HVxi/vM/R1lkIfiL0G/b0l7xSaLQtba0hMqoawJ2Yb9fmEMYKp4dNXB4y1fY//4Lk7v3/dOQdX9Zuq9FeWKJeJT6xqb3mnI2OhKNkD+nK3oF+4VwWm95R39h7xwW9C3kGmVLuHdnxzN4beey3vdA5bSD3Ce0N/Wd7ZrWPPob/g+3mvzTR9xNuavqqbzKDv73aideegH6Y1ZLs3MheBfv29hv7IxC5Cv9tT7q62eo+gn7n2Mod+upa1E/qEGgF7bcBY+8y6I+68/EvrL/3SMLxFgvswfJsHgyXs7QD62VW/N9BfkGihUW/oRz1vfufdblcAL9G1fougv5ivsER/eL+hHxAeLGv6e/fYK9BfVLNeJJEr9yXoe/sa9Bf/5P2BPqahWkbQC/oPXn7A6p/+2y9O/liltLpKNri2Xqaenu3vWOhIi0E/00N+a6C/SAFufrezNdg7QNseQ797DTbIN3LYCegXZFhv8SHc63ff+0RuG/pUZtAfXob+XjxS6NeTxPFj9LwIZQAAIABJREFUvOiWs7sb2BosVAvqDGqPTs7Mt5IgGkIkX4UbqkU9u3Hm9hhTL18kLrWCgeFxtaUMZn4B+ntB01fvllHyTr2V2F5kUHsPdWS1WlhBv1ivsuNE7m49C0iDvVun334hjNpFw/R109WEowsLOfZMI2nVE0KIKXAAnpvSbnz62k/ecdE/PLjywEH9uir5JRf9upAaqyxcVrYQ+oUtknxIPUSrogB9sJvQ7+jhXcVRXXX62WKlxWbc3f1FzAM3rDaSZGxyLt3EaW94+mCxOv2oUKe/RzeKBXnRncFCA4eYhnFt+27U6feytqfPAsC8TN5p76e/e3X6y0fxWAh9rxv6u9u5F4P+QBv6Qu5F6BPTf8+g76k3BO1t6Hs59MGSiVywZ9U7yorQ3zslm8wDymFUaymzjXGgCDQuRibnG3MJpZgLFOGN4+XVtc2nmq+czF45bZKtqsD7BH0HW6FK5HbtJLGIp8/fY+h3bHGzAPrtFy3sZeg7svI+Q3+R/TZ21YRakbso9PeqvMOCIvSXPf29eCxDv3f7l6G/ZPtTiUC98IiHKidv4BDb3mw9SVoJYdDA5Qp7M3rrevbMCeSFH5CNP9purBxiG0y2lZg+EfEy9JehX7Rl6L8PRyf0hbc49HfLitAfmZguQh9QCbLNNffkJ4rQr21fCP1gL0JflWzu69Dfa3X6haecv/MdUmngKhTeyPjM1NQMYRALJMlbm+87c+UP//yGsz+y7sL9ov6VFfwwJ1u5E+rIg4tdVxf0dSaXgj7bCyWbuwn9PbAc+qMTs+8d9FXJZrhEnf6uWif0EVsI/ULLdxv62dDbAfQ7j2Xo7+SxDP3e7V+G/tInJAEiAaWSkpCSkJKY4AiTAerEkzONVisRLkcc0r6ND19z/NaHz0AbL7/6rE8G/Wsr7Ne2DfqxZRQ3/e88+TL0Vd/bna61DP3lY8ljWd7p3f5leWfpE5KAKOgrIyHBEtEBZPqjE/Pzcy1AdJ0YsV2Gz151zckf/9mJf3/v9V8LyzfF9AnC+jTmYntgWd5ZlneKtizvvA/HMvR7t38Z+ksYTZuNmY/TF9RIwALMKtB2R6fqrSShFoOccv21tzb8fP25+/1q9VfvuebQMXGrNB7kdBsUQb/hLUN/GfpFW4b++3AsQ793+5eh39uyF1566abKwlXVOyXoYtefmG01mkkZGdjkLnkLPb/imu//z3efOLH0/H9WSpcP8w2Ouc0gLhO1ZegvQ79oy9B/H47uxVnLdfrt9n8Q6/RNR45Nzk3MNryoVnz99J5cS8f6IGIByxuemasnCTM9HWGHbJbv3LblgW+/9suT+l44cwCuCuFDjlUyuJ+/hHln6vTV4qzfVJ1+CfqQR4AFJeRgK9Spi61YLXnrMyyDhUjEgEoN+6pbQitKS9rNUGN+GbvYigELII/6oU3NEFEnrAxNzTanZpuQmNgK+iFPC2GpD9SORiTQoGMQn5qxjlzE0g1fIQ0QC3XkUbOCeQSwD3kEqEy3MyIRETHAHjNDGQ9PTDfj2nYiImrGZcNBIn1xYwm6yIx2+V4t1+nv+8dC6C97+ln7P4ievunI0akU+pA5i+y1uzvWhr6wQ8P0hqZnp+frmkGZ5Tpk81O3nHzzuQfct/LIs0/8i6q+tsYeY2RrCYmdLNl8z6G/E54+Nmsa9nXqYyveBvgb74J3NF7GLuYhEZHiVL/hULumEQ+wAFrRO0Bgp6LzwDBD4Q+WkIPMyOASitAgLmZuEA0oT9/AYksf6IcciqBMPSjCdzS+rczLhr2tzDEPS8DCPMQ8pGa8tY+8008xV2T3deQREZeRh0SskwDyCjYrmEcadDDzw8r2uUYSVYcxDxCTwhnQSaBhH1Bp+sP90N7le7Xs6e/7xzL0e7f/gwv98Zm6G1ZzT39PLiSzjPuAI1OOzTVaSUKFj7lFyi9tuPG7D115zDN3nnLRyf8UaTfH+BHB+qDp5O8W/u2Hfr/h6SQgduWNd+Hjz25auXr93Q89/trbZYP428qciAhSqZOAubUydnXqv/6u8dyrW4lb1akPRbgNmMIf7Ie2RjzqVDVoIerYXjTfTIZHpxC1Vt1y50133Ke2Nyhj9+Y7N6y+6Z5nX9z8k59e1K9zzAN17a9s3rbu1ntvu2uDjtyyYQPsqSCA2BUoQoPLEnQBlf26abpVgOyoOjIzn1QGRqgZatAC2MNmpYw8nQQl6BK7ssv3ahn6+/7RvbXycslmu/0fxJJN4e4d6BfRXDTOPGqGw+PT9UaCiYm5qPn9+nNXXXDC36y58PN3rfzqELlTokctUYLCM4gPF7uudg/M/lVp+otD/30p2USiCqjcBsxnXn7jtDPP/+4PTv/uD06/5PLrIPUA9krAUn/YZ1jErryrs1vv3nDOhVeUkFXGNnMrxI5KyMo2dPI0JExH1obGRidmJ2ca20rGj35y7n+e/lPAPGJHZeyedOpPTz39Z3ff/+h+/3ow5gE1wxIQmAcnfv+0Y7514n0PPaHUHsQksyoG8YmI+gwLihBbMbErREhIPcxc24um51pRdZiYPqSecGol5HB3EPIo3zlq12y5ZHPfP5ah37v9H0Tom15YhL6quilujr+HxmlgEHdsej5JEmAQTAnXnr93xTF3/+KAdRftv/biA6LSDTX2OCPvasQh+UtUfuuhD2ikYR9b8YZHnvnuD07f8OhT75YR4u6m195Zve7O+x56css7cGsfefnVd599cfOLm97a/FZ5ax8qAfHsxjdfePXtp1/avA1wwLyXN/e9uOmtF17eXAbEccNWkgyPTpUBOfm0s8/46fk6ddWW99/5wWk/Ouv8O+7d8M/7HbitTCH1dGS/WyKf2P9zV127bss7YNObfU899+rzL7/56ht9L2zc8txLb2x6/d0SEFv64KNPv/zsi5s3bd66rYR0yLjlv75l6ytvvFMy2HMvvfHcprcfe+aVV7aUuTewO899Gfr7/rEs7/Ru/wdR3rHc9wb6WfOQYWMeTs41G40WIcxxRUA3vv7Aj59a/bm3H/veT7/zJ4PGqgA8ZJtl6lQ1LPcVecdgcR+wS8jZ2ofOPPfCzx56xC233fvaG++uv+P+D/3dxw7/0jHnXXDVNdff+s/7HfiRf97/G8efePNt9196xfW/fmbT33/0U988/qRPHXDIbXdteG7TliO+dsIn9v/cX/zVhx95/OlAVubmW3PzrbffLZ982tk/OecCYkf90IQi+PHZF3zvlDPuevCR/T9zSD+gBrWpFaxbf/f/+NP//YlPf3btrXd95tAj/umT/3bA575w4S+u+qsPfeSAzx721x/+6PMbN9948x0f/qdP/OuBn/+7j35sw6+eOOOsn33juBP+z19/aL/9D1x/1wOf+fwXP/SPn/jLv/2Xy65Z+47G9xz6y/LOvngsQ793+z+g0B+ZnB2bnndkZU+g3/GiNCZzMwxHOLWZRjI3M8sIJaTsgSeHymsntUu3gyvlu5fWytdVyS9ts1xCFqDRvgJ9QCNiVTXiESHLkN90691HHXP8ZSuuu+/BR7953ImPP/nSG2+Vr7hq1dFf/7aGxHMvv37TrXdfcPGKp57f9PkvHPnKG++cf8mKw7/8tdvveejYE/7z8ade3v/fPu+4oQyrjWYyOTUHETvlx2d//5QzqBPr1NW59x8/PP3UM392z4bHPrb/QTq1+wwGhacR67OHf2X9PQ+tv+ehj+1/0KY3331ly7avfv34U88457a7H/z0QYfeeuf9xxx/4re/f+q69Xce8sWvrF633gsrr2/ZeuDBh9xyx91XX7/62G+fdMmVN5x8xnk/PvuiZze+tTsKzzL09/1jGfq92/9BhL7pyJHJ2dGpOfVWgHxR1a63f3HoUyqhCOdaSatZZxRbXI/os6Ngzfg7FwVvnM82njuK1kn9IUuUoAgg32egb7C4BF1sxdvK9K1tuoGttTffftwJ333iieePPPrYBx9+cstW/fpV66+8Zg0k9rYSunHN+suvvP6Flzcf/c0T3i2jq69f+8Ujv/70C6/89d/+8/4HHnbMN79tQEao2WwlI6OTwCBnnHXeD079yTsa7Yfm2xr5zKFfufHmO9bf+8B+B36uH4sSMbEjoeV/8qBD1tx+z+0P/PLUM3+2pQ8g0//K14+/7Krr77zv4XsefGTj628ffdwJl197w+33PHDfhkc2vvaGjui3/v07p5z2k6dfePn6NTefesY516y69c4HHn/iude2lhkUuz46lqG/7x/Ldfq9279P1+kvIKmCvu1VRifmRyZnme0j7qbpinRzm/YktBPmpBttMqmzCNAI0MjAIaEmstx6krRaCaWcc+Aavx411j695uCTv/xHJx/5J9X+G2K0wRYAW3EZ2/tKnX4ZeYBKjXjPvPD6Oeddtvbmu8+7cMX3fnD6k8+8/I1j/+OCi6+6+75H1tx899XX3WQQt09jt9xx34qVq55+4ZVvf+/krdvA2pvv/OZxJ77w8ubDv/y1K69dvWVr/zvvlm9cdRNl9vjELELWPfc8+vFPHLzyhvW33PXQGedevN8Bn3/1rdJ9v3ziwEO+XEIWtkJVHPW5Lx69/p6H73rwsTN/fnGfwcrYvOGm27941DevX3fbutvvfebl16+98dYjjznuimtuvPn2u599YdPFl6349GcOvmLFVetvu/vRJ577xnHfO/2cS26646H7fvn0lj7c64kv1QeW6/T3/WPZ0+/d/n3a01+QGkVMIuZbbjwyWYA+tRHzd534Qfs9TUzqTCpuGiTAxORePJ8k09Ozgju2bUq2aai8/v4r/uVXq4+89uyPV7XrB9gGDN+GItTIPlOyyd1BnQTbgLmlD9730BPnX3zV5VetevnVrdvK9N4HH//5hSuuvu6m519+8+nnN+vI7Yf20y9tfu6lN17ZvO3WO+/Hwnt+4+arr197+dU3fOTj+3/04/sfdcyxzzz70iWXrrhx1U2zcy0ITQDdLW8b55x3xRnnXnzxiuvL2EamfOn1d65be3v2NnMPW+Ga9fc+t2nLi69t3fD4M2/1G8SWZWyuXH3L2edfevb5l77w6hZkymuuv/mSK1ae9bOLnn7u5ZvW33H1dTf+YsXV51902aub3/nlY89ddMUNZ5x76R33P/Z2iar1Zbsm7i17+vv+sQz93u1fhn5vg7TjHXspponLWABFMJ8kzVbChWtAKtnb7pbb3nr41GfuPGXdRV8chOtC9IBgfWqZ0r4C/RJ0DRZiKy4hi7mV7NWDngqONehoxENmpFMfmZFOgj5DIFMqD72ELIPar7/V99WvH//YMxtffOXNs8658JxzL3how6Nz88nQ8DgkJuUREzHAHjIlMqVGHMA8KAK1fkrpMKqEXyOeTn1iR1AEgHnIlFAE2ApLyEKmeoGor0GLmD4Vviers/Ukrm2HxDawpZ51GbvMrWnE04i3DP3fwWO5ZLN3+z+AJZu+6cUjk7N7BfrFTgKph6gDiU2pD5gzlyTNpKEjSoRtwrfXnf+ts7/2Txd897DTvvEvsXbbsPWkYP0KoPtKySbkUQm6UIR9highC1oSCL9MHXXT1FJbg4XIqpSJb4gIWpFhhmXqIVMC5qlk7I033/H5L33t4EOPPPbbJ23Z2u/5caOZDI9OYWbrhkPNWCNeP7SJHVEn7jNEGdvcGyjjdL8EjXhQhNSpKnCXkJP2fy6Lc0PadbFThlzGw3ONxJNV26tA6hncR2akpg0oQp26uxzhLZds7vvHMvR7t38Z+kuecFHoc+FC05lLkrnGlAYN5jgWfvOaM48474SPnfudT5/9nY9H2s0R2kDQO5BHKpG7T0Bfw77BQihCbIVlbL/ZD5Ed6tzbBkzqVMvYRSLGdnWbYQMeQjOGVrQNWhrzNeZDEajIAAr1cx5kDiSmjAdn5pOR8RnTkYjJErCIXUFmVCJuP7SRGTG3BkVYxu1d0tQEUEIOKLj/+ZqsPsPCVtxnWNwb0KDF7TgaGFUrcjEPdGSrrSCwU1HzBxTBLj/6Zejv+8eyvNO7/cvyTm9r9xBaaD+xKbOw7U615hrJLLUYZMgir798/znP3XH0LZcfcvvVh9Xw9QG807X1MgoMVt1X5B1AZRl5JeRAEdz14GMnnXrWNsCxFSqdRNU+lqBbJj62q33QgVZUph71asytbQMmsSvYisvY7Yc2tmJmRQa2/LDWSJLJmYYOGeahTn2NeDoPoBVhKy4hp8+wVA8HLIAizNxz3+CSOlXAgnd1YXCpGqD+V32nhByduhoS0cDo6MTswPA4ERJbMbbiPuiUia8SKjp1VT/fhae/LO/s+8cy9Hu3fxn6O7yKrFJT/YRBXAMy7oezrdZ8Y47bFneEiV58+7HzH1/7udceOfnx24+LtZUxuV+wPrUt5b4CfbWNpcElFMHV19108KFHCqeCmF82bA061Kkq7nNvoN9wkIiVNN9nWKojlZGnQZdZVSRig0sd2aYTOX7cSJKR8Rlmen2GgCIkbrUP2ToPytjFZoVZ6dY9yp1X7rlGPOXOK1kJW7HaBk59p8+wkBkZ3Eem5E4Y1oan5ltRdTgNC8wQWRVoxuo81ExjhWXo/04dy9Dv3f5l6O/gEgrQV3QmPmMeMuVMI2klCUQMEVhxNle1Wy/57t9c/MNP3nrpUQNgfZU+Klg/MmUZm/sK9MvEhzzSiAept2rdnYd+4WhIXIBstTGOBh2VxTW4TLez575OXWRKKELIIw26pjNs4DALjDzMXD+szcwn28emEbWIHWEr3gYt7FRKxAVUatiHVIIsf5umiDNHHlux4rjy7lUYoVPfMEOD+4B5ZWwa1Pai2nQ9CauDgAXErpSwZ4iohD31JwA7eVf/IEC/mbSUvb8M3beOZpI0W61GkiSNZuL4MWZK0+94dcPCT3bGEI0h9TAPIKkgGg+PT80nLS+qqTo/jUtlytcjJCAkfedqNuV4Ovd07ulM6f4eYE46IZEIkgpQmiZNeyoRsjo4PjXbjMIhzHydSSCkTl2VpQCZT6qqjBVtEZGISEgiQCOdKcurDwNIA0RjQGqAVgCVBncRt8Zn5putxPUiiH2k+qVCM6llW8N3k1c1XgEdMidtDA9UkbuCWsoa5kBmjUxMT823LL+i/txgoeL1IusnlmAxD3Rh6dwpFtioUW258cj4zNjULHcCzFP9VL2fxODSYLHBqoBWAFU7rXvqbPmVQioh9SAzAZU6kxoPSiIoiUDjAWCBQVzCPWQHs0nSaDUJcSgxPfTqYOm2i/79T168+4fHHfRfatpNIXpAmH266Za5jYgkuEJRBZEIME+1GdJAPR1EJKZhbtkn0rLi6enWyMiMsENEPcQyZJMoNZrfMblLpjohZn4QDUzPN4dGJxD1MI0JCdS6XMyjVatuO/zQoyiViKVN6jhD9o74xc/PfMQkppLwwA0qzVYyPjGLsVuccjreT0ArBVMPxQHc6vx+1g9pBHisXimsUxcLL6gMTtdbYW2ImjFgnkYcjdlAuGpi0Knf8Vsd1ulApJa/ScYzuDRIgJiMqiP1JBkYmTKIr5ANWKBTVyeBwaq9Z9nFzeCuTm31thxlmAdeNNhMWgvq8ruP3+ul97da6VzRajVarUavnMDvxvEeQh/QCLBu6PthTZX6Ke7n9d2ISEQ9lAUZRbQp6Ovc07mjc0fnXt758ogbMI+YfnVwdGquEcntSLGbh23oU6kgVYS+IgvM/ik13u6RiIVqsOkkMLhriAL0iWukr44KdBbptIKILMxYQWHVkszvYfFOpjDNhlMB+pN7B/rc03nHU1NwV9AfnZwpQh8wL4N+mLIjG9vtU+VYYR7glvoVjQdati4XsMAgPqUSW+FckjSbTUpMRnGIn99eXjNHrnzrV6e89tBp2411Etxjm/19yNR5gIgkOCI4hb4mHNXsLobmJFXQF3Y8OdMaHp0Sdgiph5gsgKkYEvXst72gU/D0Bybn5wdHJyBzEAsR9RT0IY9uWH3bYYcdiZmPWNgRlxRudU9nKNv6gnDPlXE9yaGfn8FbDPpR4YqUAyQ7nIw29MMc+rAT+pAGGnE05gLhA5G+7GXnxnL7rhbytJ56o0sB+q7BQp36Ovcy6Me7yg0VIRnch9lyRSw8L6opD34H0E9aDWWK7ArurSQnfqvVaiRJ831h62/z0QH9zC/OvdH0Ae829KFIob99fKqetGRYQ9RBRdc7V3ULHb0wkORC6CvQqOGnsJhCf2hkaq4RyTFEY51WAI91qgSBfEikspKCfkeH7rjeFAqKgDqLdBIY3EfcHp+dbbUS14uMDPoaDzQeaaxCiEeImrfSq1Of59vLdNEhm2ai9sTQA/qAKeh73dsgL8RccQLjgc46CLg09NPpkIftP+fK7w4K67AinUU6D9SD0Hn7YeVEoCSkZjzfSlrNuiDUoiDCT41q1957yYdfuP1b553wl9X+60bMX1ms3+AS8gjSAJGI4AgRqXNPE44mvOKD6JKeFJGFHU7ONIZHp7gTAOa05Z1u4u9yv1X3uQ39sTHIHHX/1VODIrxh9a2HHH5kLostOun2/glHTbFYeI6M60kyOjGLqFPs/2mMm861XbjPZJMurS8LdAAPdR4sAn0eQxqkrr3wgch6yA5B33V1RLXEyaDvR9XhepIMjEykgyKHPvV3Q1zN5Z1c8MTC8aLqTkG/1ZxrNedazXqrWVfc71R7mpmlR+t37ChCX2n6dhAj7haJX+T+rj48nUU674B+M2nJsEaIQ0gGryKqckeeKUevS2ZNHZwcNzoJIa8sgP58KCcQreq0oosi9NOQPyv+k+kWAu3BuUh4m/ryTGo0MLhcCP1M3JAlXiHEIcTJoa9xqfGoxCsFtaED/ZmglMpKRehPz3VDP+VykWI9iF+IWqJ8d4Qe0A+L0NezFEsxUFgE+rSicakJTxOOEtwyUU4CGmk0RExCK5prJa1GkxFuMhjRZ0f0VU+sOvDeqw8759//cruxztfuEqwPWlE/cgFLnX1Ipc69kumUhKf1hj5gAWI+d8KJ2cbQ2CR1A8AcIPz8gRbMW+zDHVjqw3LfrQyM1+dr42OAOerpqPDUMMPr19x6yOFfRtwFIlXGuki95O862U+4joznk2R0ahYyBzAn29mi428z7DqAW4BbgKUhVzYxF6crCUmknmA39AcGKI8RkQbxAQuAkFoWau/Yuu5nG/qOynWFteF60hoYGTeonaYZuKdTGzBvCej3uj8Gi3USGkwl+RX0bS+Oc+gvwf3fazXrXZ5+q6Wg3+y0Zejn0K+q7guKObrdhb7GU+gD2oZ+KGsUe4R4SgkBbUc+0ISjQvssuk+hT3Cm+LflEQ+wpaEfa6yii1CnLmJ+GpVn5M2g3zWoUs29w5kSfhpb0MBgIeJuN/SFVxJeScgSjwhxVBCTX5fGI41HnSpzm/sZl/Ob7EHmIOrsCPo77el3QT8rdbfc6sj4zOjEbBv6LATM00Woi1AXsj282wJRFvyxSKcVJeXr3AHMQdRTTyeHvsFdw/ank6TRTChxGBMB3Tis3yJePef2FUc8cP1xVf2mQfEYF/39xC2bUuderrMpT78kPK34gERblEtFJN4L+otyf1ehn3ribjw0Pt+ojU0o6IMlob+A+EtBX3k2BnetMK4nyejUXCf0gyJqs/vvAG6ptqXQ75ilMuinndbLlgV0QB/T0CABoBLwUGXUdpn4KfSzu5RCf2gh9LOJrWck0Rv61QL0g4We/lLQ7/1POe7rhfmg99c/6Ie6+gL0U+K3u8VurZ9Snr7B/aKnH0YDxYRt9uw9TbQtV6IV9yleJM2bOu+LyTthOIpYqHGpC6kx2+AuYIFKxgIq1aZjKffzshMWdCZa00AeCF+lQzUaGCxGzF8g73iaUHJTBNM8s9fVrXPpo2i5SlMcuoh6iGbVO4tAv/sO95L49TzTsLinXx0Zn1sA/UBBHwjZZv1CcbxD7nfaqXXahj4wbd1xp5Ok3kgI8SizXfr6ALht/cWfuv2KI2+++Mi4dHONPUbou4YVlUSgCUc5+4gEStPXOmWHJT39qRz6S0kfuwKdPMhz4+3j800FfYNLSL1O6B+JmF/UCRecp9fvetl15Z7+XHtPi3TajgrAdfIgOHuyRRwvCP6EW4B+UIB+hJjUSQBoB9B3ekS3na38/6byThH6PAJUleTtAPq9LPf08xB/FzT9RpIoWzA5NJOk3krmW8n8MvSTDPpzrcQMqgb3U787q67Jfa7dgL7G3IXQz6sdMiVdybhWCv0FY6arBqMDnYslcsNwCDFfE55uuho3FfR1WsmcxIz7LCxsDylzATGlNpU6i4BwNdPUhVWEfmci1+tyzQrNTit2CtpIR3VjHrVkyriHqEeI1wX9rGSzKz/ZzgwvFKbaVU+La/pd0M+qWrnKdmT0TCth2inE9CmQrICn3f6URErTR9xGjjeXJI1GS3n6PttYNW55Yt3hZx//V+f9x0eqfWsG8C9tXi4Tv0z8kuno3MvS4AvAreo1MwNpaldyO56caQ2NTXEnzODS/Ye7aQr6LHTj0fG5pDY2qc6vygF0FkEeXb/6tlTTXyBftKOTHZ0fMd+RlfkkGZusZ96MyjxVsoS5mgUtNREqwVDjMs1pFVhc2O5UQd9ZCH0ipEp3F5dWLBnBL17Jo5Mw74Sdmv64QVzIo7zOWF1mcc7emcrggqafhsWYh144vFPQn0+S+SSpJ0k9SZqtpJnkdG9mH9eXE7lJkqhbqaAPxC5Dv+dDpVGahS8kcoNooAPfLNC5owlLM02tsxQkjxA7vJuCDg4Ky9BBoWQzjAYM7mrC0U1b48IQdgZ9T3lA6U7CKkmb1UVAGihHewH0uZZCv9oFfcQKkgttB0b5FIKohaiV5SGC7AuR+g6iTh7UK5eZEI/iRaCvcwX9aBHoM6cn9HPxainoRz2gr/hegVnFaj71IhIVSq2U85s+NUClQQLGHWp5jWaS1BsCm4xCjz07AFfddsE8r9aoAAAgAElEQVSHh8HqWv9N48bNVf1+j5YBkkgM9FuWzvPEQJYZJlHe8kWhn1XvzOTQbzsHXXoaiRa1LGrpNrWRMmKhH41OziWDo9OQeqpKJ4f+DatvO+Two1QvgguwrrYN7/m7LABpSZJ0ZK3eyqGfzrKQFKszPc00NeFoXGqsorGKxiONB5rIQdwBfY1LYNq9oK9GSoH4QSbn7tCK0I87oS8V9AdHJyH1IK/sJPR7l2xKlQHOQYF55IUjO1e9k8w3mrP1ZkN5+s30681WI83mpvpQ+s+F//4dsVTlauWfWFbIOmb4QszYO1juXffmERETPgBQhKkcmZydSxJbyn5sEWcQsEENVaAIAbcA4Vh4VEiAbEQCzCqA1ACralyWmANxiJgkItJhAMgA4kMatJAggFjqJ3QYYBpyLgcHRmampr3qIGQWFo5BbUQCblaBESJcM2AVo5BbkUYs3fR1JnUYMFohtAZ0j/MIQ4fzSDdcbA6WcUXHnJqhDgNghJjGnMUUy5mJpJEkljOMmYsYxczVqNC4KOGhPuxjawiSGjRCwSKCTUosSixMQ0ilzoNtyNbtSLPCPuaVRGBgC3EXYAcxn7AQIYdijxF/cnxqbroZeIOQuJi5iNuYBwB7hjkAzIrGfI1YOhOAUoNQzAVhlDKbkZDgCiUxxIGOPMwjjUc6k2qrFp0EkEcac3VhuU48OVEfHZkxzYhSSalE0Gc00rKpPa/G0WlFY7USqegihE7QT5jGbJ36BvExlRpzNeGVud0vbN10deoSFkLDc1HEhVVPkmS+JQzdJaCKXxiB195x4d9deOx/ufw7fzq07doR+GiFlLFhAypLImUQIgEhHsnSwnmkgmiMaYiz8MJAHuFBWr0zNsktHzMXF94DsbBWaucsz7io17UHQTwyPlMfGJmgVmAQ38CWwaWGfWZVVq++/aDPHCZEaBA/reunElOpinwM4hokr7uXXbIk5hEiAaIeY57vxUkrmZxsIGTpIjTMkAjZpwm1VhnzkBAHohiTqoF8SFzCnXR5MKkhOgDZEOAWclxAh/tRpZ9y3fQh9jHzEXI4jxgJIzk6P9OqxjXMfJRm3dXMnZvsYVGXYRpjGhu81g+lhiMkYkg9zOzKwEirlQwPDzNqEeIRFhlIIiIplQhZSptdaIoe7Vpk7CPqYeanCyF5iHmoI08l+WUw3vZRF6Rj29BvNuvNZvoPrVaj2ay3kvlmazZJkpmZmWbSaiXNRqteb84myXy9Md1I6otaM5n/jVi9h+2t8zSSZD6pz7Vm51qz80m9niTMC6DppNJ2plAXIb5LVrZcYIa6iAEPgXAHJiemkoY3WOGuWzZMzGqA1CCPiB31GUIjng5DKmoASR0GkEQGCaAIofB009WFNKyqLmJdhMAKdNM1bB9YDnSCtwFlwaAmPOzIeHRkeHrMiatQeNSp6iToA7bBJWAOslzEbWa5lFmQmBqxsBUyWwKDasSiTqymtzIKsFnTSQh4WKKyD7si3K4zqTFfp7ZhipGpsdnmnO0OGYZjWTEiETF9ZFvIqmnYRzQmvEpEDGnArEiDDmYVnQfIjjXmIzsGQpaIq5bsG6aH7EDnDhC+YQYG94mQiHrj0zOTcw1L1nTuAMvpZ0wTjmHLErKUCgSpR82QmD7iLjFdHdmYR2UUAhphK0bMV4G8RjzTrRIelHROeWRgBwuP2Z4IwpGZuaHJaeZJaDqG6encg1a6nRlmfs6v1L82Q2wF7wLIbI87vs5MaDoaF9QKILExtgV3CXGoFZSIrduRBhzsOmPzM60koZRCVA7pc0Pwshlw2njfGUPvnD1t3hjB+0z4DrMqfTzuF1HO/WKWop/7ZZVZ6QxxDC6RKakTjs01BsaniOND4SFTdkaEO9asu9X8tuiRhm5+dXRiPqmOThjcL2NXIxa0om3I6UP2jWvvOPLoYyH1II/UHgmd1QGd8lrnL2pcloircw9bgSNrM41keHJe7aXcr3NIXG5WiIhLwKY8YixARDJRY6KGiMTMJ6YPqadBBwsHs4oOwzLwAIqEN1SCLmTbAY+hGetMQh4ZLJaV8el6Eg9uN8ywXabJQ8BjwON2KcEiloXUPO4wMgDZIDYHER3QQQRxWK2ONppJZXTQMIXGbGjGGg0ADw0zaNfaLTC1vrpoebGsRtQeRyGkAeEBpW4cb98p6DfawUCz0ZxNWnNJMp8k8+rj+VYyOTvXSpJW0my25pJkfokyl33aeh3F7zSSpJ4kIoig8JTkjVhhUQyNEY2LUfbOmMalLuIyVvWIzvaJ6blmK6wOYmJi5gPsQxE+99rm867+xWHHfunPP/oX//f//MP/+n/+299+4kNfOvaIVXes6UMAcEuDlmF6Gg37YQxY1TA9jZtASJ0OIDsmbozssEy9MvWgE8bj4yOtGejxK9eu/Oq3j/qHf/vIH/3F//N//a/f/7N//l8HHP3pn/zi9Be3vKgj6PhVDVq6sN4GpTs33HXEd474x89/9Pf/7Pf/4H//wX/90B/vd9i/nnb+2S+++RpyqmXib4MWMqMydplbQZYz0ZhrJInjjUBULWvSMIYAkiWDYB4SHvTrfCswVtx83QFHHfg/Pvzf/9vf/PEf/vkf/dnH/uzArx10/spL3tbKOrK5WTVgpMO4THw1DoGQOgkglUxUEPRHJmcnZhLhD5apByyvxCyNB4CHlPqcR4RFmIdby+i2B+/91g+++ff7/3///f/94z/40z/803/8y48e8qnjT//ewy88blgm4i4TsaaZnMXKkWc00v9/5t47Lqo73/9399679+7de7cmEVBTNkVh+pzpFBFLojEmKkgvU06bAliT2JUy9KYoiIBKmWFmTh+6Sm+igPTebDExddMsON8/Rk12o3s3j9/9PfY+Hs8HDIfDezifc3h93uf1fn8O/dO9/ROjs9c++/buna+/G5250Ts61Tc22zMy3Ts690MOOHRrcOjWk0WtQ2PzV4emxyav9Q2Md/X090/NkI0NMXFH2H6+//3qK79etvTfXF3cvb22QGDambNdU9NXJ66PXpu6+/Deve/vT8zMjk6Pz4/av+jf/6A7wDGAOsY++Lhv343h4vGRzqHJm5fHbveMXu8dud43PD8wNDcwPDMwPNM/PNM/PNc7Otc3Mtc3PN8/PD84fG1gaL5/eN6ZgzsLuV99d/+TL74enbrmVIpHyvvji/Dve8fDc3+NM/68s8e3b3B25tqdr+86bn/2lTP37x+aHJn+aHDyVt/IXEb2qXXrNvX1jfcPzw+NXXemq1cfPxHhccHzUcCBobmBoUfv0jcy1zs23zMy6/RepuY/+u6B49Ovvr86Oj0xcW1wcHpi4sbYxK0rvRNDI9eGR68PDs9f6b05MPjF7Jzjxm3HF986vrr34M63n33j+PaTzxxTs18ODX06Ovbp6MTslb6hgaH54dFbV4Zme0fmewZne4dne4enZ27e+frugxuffNI/Mf+4G+2HynDv6MyzRPmZjE4Mjk32j0xcHZjpH7gxOnLro9ufPXTcv/n5Z32jE1eGZ66O3ewZudkzcrN3ZL53dO5xV9jf8kRehpwPWx270T968+rIjavj1/onrg9M3ByZun11dH5gdHp4ZOzmR7f+IdF/6HAsLDgWFhYcDx88XLj7aL+Fh9/fu/vd/QdOR/+ew/HdPceD+3/fBnn4DH7S/PnEMPl5+/9cnhX/Z/KkqPHQ4VhwPFhwTM5cHxie6h2deczcj+kZnX8qP3b/f0z/2LWhiVv9w/ODI7PDIxPffXfX8cBxe/5j59Lt+raO2MN7XpS6vSD5Nz/UI+SoJ3rcDzm2OjRe5qN+2U32r7ItvDzL6Uujo4Oj18cnP7k6MD8wNDc2PjMwPDE0cn1w6Hbf4EzP1dHhsenhsfnB0Wu9w9MDU5NYHSV+B3iO/x9AgGtkggzM9DbkbwCz3vbV815e89yrXksPpR3t7Bvo6B8sIkzSd+V/Yv+Wt22Z/yGFvmg9WrxKdUzx1g4PjzcXP8f+z137Yy719YxOXB8cnB0fv95zdfTqwMxfvnV8ce/+yOytq2PXhyc/7h26MTr9sXMdSu/oSNrpbBfBcy7ev16zwz0kTao57hN7ZqN/gmRttMfLPv/1hnxJxqmsps6e0enPRqf+0ts/NzBybWD8+vD4jf7huf7B2fGxWyPD17/8+u63dx0z1+5cHZoenpgbnpgbGrve1z83PvlJT//01dHZUhJfucXHVfRrr8iXtu0XgFk+hvwNYWl+G/dJPbYueU703yExYfaW8/3DM4Oj14bHb45M3LoyOD00eX1gfP7q+LWp2Rtf/OX7z7/+fnLulvN+zmlH9I/NORdnXR272Td+s2/8Wt/ETN/E1OD0bM/IdP/4jb7x6039Y6r9+37NXvHnt1f7HooOK06PshwLM2W9nbVPAAf/l4i1Yq3vaZzuHe93OO47FhzdvX2Xh/quj1d91vOhY0R9rxf6ojf246GjNybLpiev9PRP/Kis/aim4ix1DPzQGjT72JR4bJIMzwyNzkzO3Pz6uwefffmt86IdHJnuH5nqfzxh9A/PPXo9MvXTjPLHeeVPmB8cmR4anRsYmpu/cee7e447X/xleGx2ZPza4Mhk36DT3ZrJzS30W/Xm9PTN4dHrP472pAG/f2zmcV3nBwYeVUFmByeuDY7NDAxPzczfeuBwfPXNvavD40NTs72jU73j05eHxoenrvWPzVwemu4dmZ/77OvrnztaLn0fl9it1lS/u8m6bl25VtuTkNg1Me346BPH/K2F3sHRq4NTE1N3hsYmhwbnnT7M0Mj14bH5m7c/++77B5/c+WJk7Obw6PWhkWt/9SsNzzwZ23+Q/qmx/vHJ3uHJgfHrI9M3hyfmZm/cvvvQ8fFnnw6OTTpruU757n/clv1Uekfme0bnesfme0bnekbnnErSM3G9Z2r+yvj8pZHZKyNzPSOzo1PXhsenZuZm/1HRf/DgwcLCglO7Hz5wPLjvuHffcd+xcM/x4BvHd188/PLzhTvfOj6/6/j8G8etbx0fPYOPn8o3jk+eys/d/+dz+2fx3TP46uFH3zy8/b3jzreOO984PvnKcWf8zvDV+d6uua6uue6fwfzlp3Jl9krPXE/39KWe2c6e6Zbb305+u/DJtVtjvTOTebYzngEy1sZl/ocUUN5KfZlXjFUeYwcgKxe1iPQWb925Nevf5/ED3DfvCCTq669ODw1fu9o71d47ealnsrt3tqd39krvfO/Va1f65y73Tff2TPTXdjdE7AlzX7tswx4pdHx9TMkq+Cw/xgbE4HKwVA6b12jPbNRkbPIKEnJWs7foNy9Z+ScfmIWe2BxtWQeapSjJ1+Cv62guUgoYilbD2W/K3lvK8nn5LF52eeRqz0TXyK3LfXM9H9398kvHX3puXeqab2ufauqcaeue7r46N3zhSvPKIMUy7+e2HvJFzrypLhfDOFdHc0GLO4LJDFZftMBv2z7Jqz5/eEezgWqr7Rgf7p4Z6J692jXd3T13uWums2Oqs2eup2e27+b307fv3xi+PXRl9tKV2UuXpzt7Z/uujPd1jw+1DV/WHjG8snKJn5arK3gTLhZpy3ixFBBDSbSEIrJEoir2DUz2FYUs52z0yDyX2TPb3zM/fGm6v2P6Uvt0e/f1nkvXegZv9l37Zubat/ODtwYuz3Rfmb1yZfbK5ZnLXXNdnXPd7fOX2+d62ucvt893d853dM63tU93ds0NNI4NFdbVvLJ+1ctb14SdStCT+ZEXi7ZUHQ9pP7e16fS2+vwI+0nQemzVfuT3Mn7EAcOXD7/+fuFu/7WxxonLY9cuzo6kfDK1d2Zw78RY4vjc8d5J0/CN/q7J8cuz0+3Ts+3T0+0zk53TE07aZ36gc3qic3qya2qyc3qya3qma3qma2aqa2ay7+a1a/e+nvr6s6sfzXfOjHXNTHbMOpn6ET/d8tPv/u0+7ZNjXTNTXTNTI59+/JHju6mv73TNjnfNTLVNDnfMTl25dbN1ajwh/6Tnpg3Nw4Od05Nt0xNt0xPtM5PtM5Mds1Ptc5NOnNGcobpmJp/8hm3T45dmpy5NT3ZOjg/euvG54+GN77/unh1rnBhuvzbTNDvRNjtxeWaiZ2p2cP7z+a8ctW0Old7uu658pV81IK2UyM/LvZq8V7b7ra3y8juxZ19DS9f9+duOken7Pf2OnsHve/u/6Ru8d3VwoW/oft/wt1PXHR996pi57rg67OgbWugdvNc7dNdJz+D3PYPf9w7e+x/pGbj7hMujX10e+a5z4C+Xhu/0TE9fnu4f/XjyS8f3M18N9851XJ7pujLfe3mur3u2t3u6+8rs5e65p9M509051901f7lzvqt9pqt9puvStZ4rNwdapvraZga7Zsd7Zmcvj830jc32D89cv37nsfHy4O96+o57Cwv3f1D8Bw8fOBz3HQtfOO584rg++lV307yVHjl+rvNAQeOOs627TrUdeCr5rfufSl7Lvqfyc/f/Z3Gyee/J5r35rfvzWvafbN53su1AWv1OY1VsWt2O/xWS63ckVEcb62JSzxuSa7QnGj8o6Ug+XnlYl6HhBry8UvtqSKbUYFq9u3JtVDkbIYVKio1US9W0GKTEKKnQWfxCsn25kS96q72ijyszqndn1+1Kq9yZUr0ntW5HYq3WWLsjntFl1O7KrjnyfmH06mg5X7VEnb8q2rJOZ/GLxn1j6JVaSq7BBSAhhO0iLSbXnVujSl/HCXBdsfW3ylxfnXkVXCbT14jUJFtJeajsbJDmo6REb1PA5yTRJW+u2y143ut3GmN4OvNBEo1kXthxrHl/TtO+462xGRe1WecNqZVoZuUHKdaDnHeWeutehU+9rTe9rSdXg4QQqeKpGTZUBWirvCBMasC8t1esQwvWeMEvyyLfOFi6PaX6YHr9gYSqXfE10UnntyfWxRjrtxvrd57o+OBY+77UC7tSL+xKrolNoA1Zdfuyao8YrYe8VTxB6NKITF992TqtRRFNS7UUT4Vxo2xcDSnSV/tCNoXesjam7N13DgDS8JcjEjYlUwdSq/dnnv8wuTYmwa5Pqt6ZWrfjeMu+3NaDKed3J9ZsT6rbmVy/K6luZ0pNbHJNrLE2NrEuJrEuJrk2JqXGkF5tyKzZn1pp3HJI9af1glXxIFyZoTmfE34+J+DiiYj2swEN+aEtRQEX8sJbTodczAuszYk0Zf5Z9ebaHeH5daYEMifhfOFRMrWg/oPcOn0GYzjZuD+n8VByrTGlvshYU3aksuhwbfnh2vKjtaWH60oP1507XFf6iNryo7WlR2tL42pK42pKj9aWx9WZjtSZ4urKjtaWJpw3ZXXQKU2WxAvlR2vPxdeXxteXxteXx9eXx9eb4+vNj1+X/hDwf6S2/HBteVxdWVyd6UhNmfFiRXYXmdpiOVJz9mhtecL5srgLpoO1ZQerS2PKMoLT30++aElqsB2uLj1UU3a4tvxIneno+fKj58uP1Jcdri97clxPcL7Lk4My1pmS6s3HO+n0JouxvjS5znS0usx43pJZb8vEzbbG7sHrjoOZLaveoQBvm9i7VuTZACguylY2AV4XhJ7nebJqsU+116rqlWtNx07P1TQ7DLtaQ6PqA9Q2fyW5VVO1WcO8p7EG6anwmNpgtDoArPMHq/3Byq0aequG9geZrRr7Vk3VzyVIa1PtsusOVr2fgRtLz+XYs3Prj+Y17M9p2ZVUo0+siUms22Gs35l0fldiTUzy+e3J9TueSkrt9tT67en1O9LqYlJqYlJrt2fU78lp2F/QcfxsdyE9THfc6O6eG+wZH+8dnr1+85snov8j3f+J6D8yLxYcC/cd9+8vPHDcu+v48vOF6+P3Ok9dPPyhOegAs3kHthI1i2MJr+2Ypxb3fip6wuefgu4Z/K/FIVfqyZUx1Go97qvDVkaTfnpylRZfqbf5PBUt5vWz0JGrYczbwKxCCU8d6RWDr91pedffKHt96x89Y5ZpTktjCS+NmQfZhDpahtDiKIIfYRPCld4aRqQh2XpKhJoUYJEvS+3Gh1wC0iW7sE3b8Td12Cot6QXiMphYHUO/tR17W3liHQC94hH1vM72lsbCR3ARgklgXAZjcg0m1eAAbBdCDE9HSNASbwn8/MubfwkXrTJgK/WkFCWEaspdzbCVFFdNAypcCJFiBBcZKJkGk4HmVYHZ3r+ULIrIXrfTuiUGX6vDFSjmpSMFYIUQNa/cQ28ylLz7n16L/Ha+pjV7R2N+OtwbsopQCojCWFClWEWJlDYxTMm0tBiyCWGT1FCxVqx7/pVt/xF6zMtg3miwrtPafKPpVXraV0v66sjVespbR/igmG80vVZr89VbV+/A3lWdXsuJdGFH/n5LKmcntQa2ClUWtq5KqiYEGlqmoRVopSdIiBAS0OJiqFxksPq+c3TFirBfv2eU6Mo2xeDrtlOrYohVO6j1WnxlNL3aQPlp8ZUI7qMl/HTkai3hF4356XFfHeGjJb10pFc07rXD6rvT6qs/s2ljnN8f3nt9c8EHqprsyObj2xqz/JtzQ1sLtjWcCGzMC7h4Iry9yP/Ccf+GY6FdpyPO5wURaS4Rfu6RK3cRh1DaqMaSYpjDBvt+0Po+SuxD8A8g/DBoS4OIHJBK1RAZGiJDTaY5UVIZSipDSWapySw1maUhMjRkmoZM0xAZGipTQ2VriAwVlqbG0xEmR4WlgVS6mkh1flTj6X8LkaomM55B2mP+ajvEZGqoTCWeocTT1FSKmkpRk2lqMktNpKrozEg8Q01mafBUEEtSY2lRWDpIZoNktobK1lCZP+ZJwL85QBWdriYzQDITprPVWBpMZUTZEkEqBcKTESZHaUnXlWdl0OTQRw7trnqvdWZA3iKQtAGyS2LFZYnnJbF3u8irTShvk6xpEiq6+OIOb98W+Uos/eRnWQWfylefe1V0+iXB2WXCiiXCchegaJm4+CWR6UUhtkxYsVRQvoRfskRwdong7FJB6RJ+2c9iqaB8qaD8JVHhi9Ljy2TGP/vulwR/6H94u+5MyG5yjYHyRWzeKL4KwXxhYpWOXI3gPlrSB8G9ngqKOSVFobcp9DaFweoVbVsVY1uzHX831vzuh7bIUy3GulF68Obw4PTsxPSn/5DoLzy866xXLtx3LDge3Hf85eO7433zdYdt4btMb8dgfnpapiJ4ahqA7F5qTIFSwNMhhP8UEPLp/G/FAUkBTAh0jAQlABgToASgo8QICYCU+BkATwWmRE8HF0Gk2FCtUNo4WlpsIFdqCn3Yqt/KDMvh4rd0FQqtjRvNCCGcDxNCNcZH7HxtpURDCtUEC7W/oaNXxOLADqsvVLhhecR/y6OX6svWxeCekJWNkHzYLoIIOWSVGix+3jtfWh78XHj2OrTcR0/xIZyrpYUozUNpnpbhw7QApgENwUcrPN9JXLFk0y/CMv0M5g2ozRPGAB0lVRE8tEoE0lwN6aGrBlAK0FgFOtITokWgVaCr8BHrFv9+1SLD2eDt2HoU54GVfLB6uaHWU2X11REbXon8zz9u+IWuZIOWBGBMgNgEOlJgqOTpK3lR+HINxdPRMg3B15BsQ60YxkUakzda9vafNi7y2blYc1q+3eZrsEkNlESLAwgu0lMKmBCglAjGJSguhS2SWNJXZ161ev+LL/r/en0cGzH5oJgQJdkozQZJnoYUahgApIUqjIuSfAPD0+EsHcaLpaXouVVCw59eV/4mvNgHsimUFWw9I1eZRTpKrCVFKAHAhBAmhCglQikRQgIIIYdIMUgLQZoL0VyUEBowcaxFHprj82KIm9fhQHX1ibD6/PCO4vca87a0nvFvzt3afHJrx6m3G49vbsuLvHQmqC47qiE3vOFExPmTKjxrkfQP/tlBSuteZeWxYNwYSSaoqZQoW4KaPKrE49VkVgSWHsUYlYRRSRgjSWMkaYygjBFkUgSZEkGmRBJpkURKFG6MwhOj8EQlYYwkkqLI5AjcGI4lRuDGKDI51BqvpJMjSWMUleSMoySSfoTR+VNPJYJIfARu/CuIxAjcqKTSVHRqJJkQRcdHUUnhWJKaSg4njCFEUiSVGoklRFiPaMiUCDxZRaSqiFQlkfQkgjN+OPHoyyjcGOUMSySGk4lhlDGMSoogkyKJpDBbgtqeGo7HRdHxEVRcZFVqGJ5iwPPosenEEx0ynzNSz0aFT6tE0SySNsu8WgHFRZ6kXihrFsk72fJaic9VgaRT5tUKSGq91pmqOxxBurJXeaal7hVLWLQLm1jMrnDlWt3Y9FLW+SVscgkbd2Pb3NgWN7ZlCQdbwibdPCg3FvYMiCcsYZNPeI5V+xzH+kd+0R/4p56XZrO2HX7XGAVXrNWSEpQQayk5SEhAQoLQUpgQIqRQS4qeioYRqWmhhuJBFF9LC7W0GCXEsE2KkICOkOktK/faAvLPH20ZvzA0Ozlz7fN/LNN/eO+e466zWnl34cFfHB+PfNMQR6t2mvxirHKNlRVbI4MwqbrcCzKtUpWs1Jo9EUwOM1IVJYyycRFaDBMCkOShhDCSfF1T6wHSXLRCri/zgcpFIMlDMYkaE4KVQk0VV0WuQCi2luFDOBelBEqcraQFakKgxcWxpAyyCEBChBJiiBKqaI6a4UOUECUAlBAiFBei+P/HED6DnxdHSfIhig/apeoaiYp0j8VXr933ukvQos3pHMTko6cUIMbRkO6QnQPSQoiWOKcQiAQgEkBIACEBlABQAgBtIr+4l1aofvtuqiDa7qtiPFSV7upKjpqRoZhvUDrwRuCvRNFuiOUtGJehJBepeg2xc0BCCGGA3i6FMI6WBHSUNOKYnAc9z4/9JWrzNNjW6KxALCWHMT5Eip1vCpHOaUwMUlKQkoIMCySEWkKhKvD6vWLR+g9W6K1yxM5VUSIlCWir+DGYb0TGmn8TLAo94QVjnk6xRikRTPBgkoXSHJTmwYQApAC1lYOSfITiqgmWoVIGW+TvpLz6J29eHNsAACAASURBVL9F21JkerNUTwm1pATEeFqGA2EASokgXAATPJiSQTQXsvGR4rdf3fILz9g/Q6UrUVKhwQHULoYYd9juoaJ5IP3oBDkTAi3B1xNcPcGOJbyCj7GF0B8kumXRtvVaWoRQLC0thknOIwgeTPBAUvAIQoSSbB3FRnEBQgpBnKWjRIhZ8vZBwZ8Cl8KVGVEXira05L13MTOs+dSW9uKA5jz/lrzNbSe2tp4IbD4R0pgX2pAf0liw9cLJiI7icCaLr3v3ube5SmtSIJEcXpnpzySHWBLUpfFgaYKaSA1lUgNIYzCVvIVKiKpNDyPiouj4IPxQSJUxwJ4UYE8JIhKUNRnBeEIYleQklDSG08nBWLKqOisIN4bRqeH2lEA8PohICKWTgpikMCw+ikoKY5ICbXFRloQIc0I4kRpKGiOr0gKJhAAyIaw6LYROCqOSInBjBJkUQiRGVKYGkYnBlDGMSQohEsIoY0hlcihpjKSSw+nksOq0bYwxEI9XEamhdFIgHq+uyQzC4kOIxHDCGGg6HGqND7ckKvEUFZEaQiSFV6aH0CnqykwlnhJOGCOYlHB7SghlDKNTI5i0CDIlkkgJxhPCmOQwJjncnhJMJkTaU0LxeBWTEkElRFKpaiJpD1Xc+ZHDe32B50pMKmsVidqlsk6ZvEMibRFLG6WeLTKvZomiWaZoksiaJNI2ubxbJm1SeOMfHu4zM7c936KWLi95kVW9jF3vxiFdORZXNubiYV/sgS3hWF9kVbq+Rru8bn6JQz/3GubCsj6/vGwZn3HxoBe7Uy4s21IesdgDc3W3u3iQrizGlVXpwmYWs/DFHlYXFu7mQS1m4S+wzC5syoXNLOaUuUrTpard6BkIta3VkiKUEqGMQkN6aGgPXZUUpDjP1BOaC9FPUT+YEaM0W08uN1j5+zB/U3dBx+SV+TufPlpR9HdbExc9fPjgoWPhwaPlR/c/uT99qumwvuStGNJLS4ogmhtWuhwqU+T17rLfOF79UX7p7GGkYlV4uQCiZQa7ArQKEBJASGE0LUUrBUrKQ2nlw6Xexzr1JwcNMXZfLeahswuiCL6aksK0p8YK6GkxSnJRkq+vlaoogRoTwuWAtlSyx772g/oNsFUEE0I1w9fYBRAldAZ/6mH/s3mW6P+8yQCsFKoJFmKXRZB8hBHGmNYsD/lvgWFx+GkRavXWkXKY4MEMB6S5apIPUsDfhH1yR6Ij5cEnRQJksff7LyM2bzXJRmoEaoavJsSoZc3qPctf8/8P/0yBnvZR2jhahg9VvgHZOSAhVGNCHSOGca6WFME2aWCycPGmRRFn+cpyQQy1WkeINBaujnms+JQQooQgLXys+2KIEUC0DMYl2lLvldEvvvjWCzsoH5hhKyk2WMnXUMtjcE8Fsuz1Lb8Dz3kipBAmeDANwDQAkjyQ4sAMB6YFICGEGbEGF6AUgNI8NcFC7WId6RVVLHl506/W7V0Blwh1JA+lRBqCi9g5GoKPUiKYECIkHyQkiJ0PY8CmOMA96D82xvG0Nj+ElqsJAKYBDekO2z0ghvdkxno8UwpRkq8luFpcjJTIfXe9xIl6PiLf08BIIZoNkoKf/LE9HnNSjFBslGIhuAClAAjnanGpskjK1r32xvteYOPJsAun/FvyApuORTXlBTYV+rfkbW57JPoBzXlBTfmBTfkBzQUBracCG/PgiwVRZYmLeH8KOLUvzJasrMyOINNUZYm7rdllU83bq04GY8mqmmPhTEa4PSUUjw+tOATZUyKohCAiPrwyNYxOVddkbjEdDKOSIpiUcDrZSQSTEkVnBFbEIXXHQzFjOJGsrsmOYNICbQkRVWnhWGKoLS6yKjXEFh9VcjTrCn60rTySSImkUiPt6aFUSgiZHEmlKqk0kM6IIpPDbAmRVPIj7KmhtDGEMQYSCRFMShSZHGyNC8DitlGJ4XQqSGeE2RJUdGoEbgy3xmvo1AhLvK4y61DHuf3tJVEWY5QtSWPPDLQlhFEpgaajaiwlzGZUUmmhmDGMSgmnU8PwpDCbMZJIUVVnRDApQURCEJEQTCYoq9KCbUdDrEdDsYRwLAUh0osGrmTbrom8iqVyWiZvk8o6JdIOibRNIm+VKJqfIPVsFMkuyr06JNIOqbzZa6V99YZz9e2OcPTKa/xy19cJ1xXVbmy7Kxdz4+CuLOaF1+pfE1Y//+dzktWV249Oe24gXuKYXuJal7DKlrDKlnhUvMhm3Nzrnn+t8iVejSvL6uqB/1j0XVg2p+i7eNQtZtGuHjVuHhdc2NTz/ILlb+975yACmzajhBihuAgtB2mhmvJAGNHPSSIfbQcJIUxytDRbhwlizG+mV39wcfj81EfXHQuPnpbzP4j+g4f3Hzy8//Dhg4eOb28/HNlbEaon1obZ3FV2NlorQkmF+pR31XSepSvrdG3cQUqT2Igmdij1uJ+mVBKD+eqs3qBZqi2TQ+UitRmAy70Lr+7HxjISqjQ7KjYabHJ1OYDgPjCxGqrwhcu99VYZauWrTWyEFsOMVG2SgIWy5PqwstF9B6sCYJMYwsQQA4B2EUQJYUIIkgKY4YG08H+Fny/W//+isfNQmqey8VSUyMDIwzKBlzb++7oDbMQq0xIKhBBDlBC1AyDNVxEciAEQkv+EH18NOlyhLV/js/MVseEFuMIbIQG0SqTEeCgpicj3FCqX8KNeQEwrEUYI2dkQzVUxHhq7AKQANc7T2QUIwdMSMlWpxG/7K0s3/0ss44sQYi3liZB8Jc4F7WKQAv529JwySksgSgESIoNNAZ/yXvTar7UWGUixNBQHqRSA+IrtNp8/+Cxav4sXY/HRMYCG4jitJJAUgBQHZngwDYCEELSLNbgAIYUwLVCTbA3B15GeMfhqsdqFp/5D5CmuluAipBCi+JCdraF4j0w8SgBhYh0DaHEpV7VYqnKLOKUw0D4ILQYpMUSK1YQ7zLBBmvtE9CFSjDySfiFC8iGcv51atSmOtSLwd28fcTdQCg3pvDPggjQfpH/4S3tk91FSiOYiFBvC+VpapCVF2gqf4Ez5H7a+4HcKVrUWBl3M39aRH9iSE95wIrCpYHObU/Tz/FvyApvzApvy/ZsLNrcWBFwq3Hw+J6IuF67N/a+twOvQW7AtM6QiOZrIDkrf2fb52JkrVTuJYypbaqg5MbQ8Iaw8DsJSETwFwpOibIlhlriIiiS1JSXKlhRpNcJMZqQtKdySGGYzRpGpYTZjZEWSGksLLYtXY2kqW3JgySEllhxpNQZXHI2yJIRXxIVRSZFYYnje3orhhuyminBTYrgpUY2nq7C0cFOi2pKiLDdGlSWGlx6NLI/XWJNBLCnKHKfCkyLtqQFkQlRlWiSWGGWOU2MpaiYjik4LNcerKoygNVllTkTwNJU5EbYkRxYd0leknOy3J1+2QhVJkC0lymJUEakRlkRVhVFnSwOtyaAtJdJqVOIpUViyEk9RYskaMi3EFh9OGMOYZOetQzidFE4mqu2p6srsSEsybE5p/vRb9a5Wz5V1Ylk9X9Io9+oWSVsBSYtU0SbxagfkLUJZq0jRLvJsFHk2iuVNcq8ukbRZ6lkDKM4dL/pLSu7nIl/c7Q2bm3uNG7vKhU24cDAXFv4yp/r5VwuXrjjhtaEk59zsZpXF7fUMt9cL3hCeCwav+r1bs9S9YNmK0mUemOsb5qUssxuLcPOgXDxoVxbjyiZc2Zgrm3DzYNw8LriyKl09alzd65ZwKl9gl7spEkQR0VEFSgRXwNQKiJQitBwkeRDFhynR3xX9n2wkAYgSgqQAYUQILUasil3mAHufafzm6E9F/6mFXMfd+/ccjoWHC3e/u/vJyOcNOy3vamgZUi+OsrMicBZq9Y7K8qodLTxm3bc7NVx7fEtM8dZDleGG0nXx1SFHmJA91s3RpRv3VwTFVUbsI7d9aAmumimw9GTvLYrQn9gYXeR/0B71ARNw9GLEPjrgfcsmXdHK9Kbw/RfWo6QCxOWaMu/DdDg+mmafzolnVKhJBtukIAVADADSQpBwppbcf5ro/yAWf83P3f9ZMAKE4IAYH6HFiA3YuPdldsDvNicInQ4yhAtAQojaxRAlVJNciBGgJBcluQjFdVpeTmECaT6KiQyW1W8dfEOs/4PqjFhLSmBCAGFADCkLSONyQv/oFfOyDlutxD00lWyI4SlpnoYBNIxIRXAQOxch+SguDz0tAiKfA+ClkFWir5aoCUBNuUNVQBTF/+kAOkUQokUgJUYYoc4m0Z/z+1fBrwJyl0MkAFMSiBRrSUmsZc2i5Ysik9dHV6yMtstUNAdiBBADaCgBSPIevSZFKkqoIZ1XMx+kuSqCB2FiA7ny7b3sFzf9a/AxHorzIEoIMYCaYatoHkwIUApAKC6EiVEK0OGeL2/5zWoDCy731lFSkBZqGAlMSSCCDTNspyX649ME0kLnuCkpdjTlHZQOsEP+6BX7ohZTqAiWpoqvZvhqxjm2T44XQEhATUlBmg/RbDXOg2lAR0m15X7+id6/W+MSTCaEXMwLasr378zf1JK5pfn4ux2nNrflbW19pPhBTflBTfn+zQXvtRW83XYiqCVf2XI6uDpHFKf+pdersbacKGuasvDIYTJv8Ltr6UzR+xVZOkv6B9WnVEVH9aWpseb0fUweXJqgPHc0ljq2r+pUZhu2izi2v+b0nso8sDxpT3W+gcwOLTqkwzN3209GWzKCcz88cuGszpSqs6RDZYkRxYe20zm5g5Vp/biaSQs1xany92ODDScuWHTWrGgsR33OqC1P22E7toc8GWPKUBccPXK+qHC07lDdaX2pcS+du8ueE2aJi6hKi8KSdVTmgbqC7XimxpSop7NQW/q+usLUdssOLDvGkrHdlgUVxalOHkisKS7urc7uwreb0j8gc3dTuaGnD6KWtLOTjcYLJdpzRqTEuKfyhAHPAM3GoIK9MXQ2aklRkclPnJ8wJjmqMi2MSAixHo0g0zR46g4su+8vjnVb7J5enSJps8SrVezZAcjbhLJmkaJV7NkmUrQL5W2AohPwbAU8m/mSi1LvLom8UyCuX/Vmg1o/dI5Y8Nlge5FdsYxT48KqfIFlXcwqf8GjRLC2aPVWC1ueu2pj0WnzfARa4b2miCvJ/zMrKTCqfuM2a6ShJlRvfzeK5niWLvUodWPb3FiEiwft4kG7sig3DunKolzdaTe23Y1tc/WwuawglnBxF655sTjT473d2zJ0sG0lZH9Vg4sRygskBSDJQ2jpz9UiHQNApFhFSjSVYogWxVSsLe/ImPh46MlzMf8H0b9//77DseB4eP/ewp3G0dLd+DsRBFdjF0SRHEO1AipTaI75NVwrGfiqevDL6uaPS1PsSF7bDn3+upq5Y7bBdGoy96AVYgYLsKvHsMHs/MYjrTdsls6cAwWR5e0JrZ/YLt4+axo17rdFEeO5uecPFLQcONN1YDfzFmLzjiyV7qK2nL1qPNORlFG5y0hr9RZvBJNBJPBIYkgApIVqhv+/ovj/B0UfscuU5hXRdilCChEL7809LryQ34Rk8UGS55zMQUIIUyKYBpwZvZbgPtJ9ZzGAfiRPOkJksPq8a3xDqP31u+kva0kRhPN1jERvEwVmrOBG/Iff+y8ZiLVqAgjHPLTVYjUt1DAiiBZpCC5Kc1CSj2DybflCfuifFNGv6kjPKMwdtIuU9HKNXaBinqr4fITkI3YuSPORKp6OkMGFa5e994u3EpZpSR+YksCUREdJY8yrFr3+L9tPB+rNUh0lVdnZaob/qCzhNLhoIUiJVZQAdppIlBC2CyEGgDBAiymCk2TPv/nLgCwRggtBQqhhJGpaqKaFGoKrpYUQwYZIKYTzdbj3q/5/3LBLrLf5ILhQQ/EgWgJTEpjkQDRbQ3ARio1QjxybxzMlV81wVXY2iksjcmWA0hWAFqNWb4gRqCt5j0X/8VE/9oXUtBik+bCdryb5GkqgJSXRpnUB8b7Pr39dffHYloYToS1FW1vzNjZn+bed3NSe59+SF9CcF9iUH9KYH9pQENJYENBcsLm14O2W3IDmvLC20yENJyVG6N9XrTCYMpSWtPDTh44wp/q+nYu35J7sIMonmwv6qo41VpT0nS/rO3+uty63ndxZkW2Z7sjrpOuu98VhJ0+22M711kSfMaY1mRLrzx6ynyoZvXiikygdaogpTqbmuksHLxb21GS0VGjPxtumW+jrXRndttjzeeGm+M1GAzbY1HBz4OxY47nRxoNEfk6DpWKwsbDTnnnelMgU2ecuMde6j7djhZcY69CF0z3MBxdPR9rTVbbknfSxvCuUsbp4pzkj4cK5Q5UF5wbrSwYvmsdaysaadcVJB4n88oGLRZ32+vne4svVpv6L5QMXy0eaPiROFl6t6/hu7mQTtrM4qXK+u7C3qmiwTnvOmNZqMs+25F+162uOK/GUCDIpEI/fhsU56wdKKiWESAKxpJ2W9Mt3HCLfcqmiSyxrEXk2CGWtTrkH5C2AvAVQtIs8OwBFp9irWyBrFXl28MWtMu9eobhV5t0QBU2bK+/7bCxbxj67hE0+7066cGyL2Wdf8DgVf3IsrWh258ErARGYtfKLQ8a29OPzcPRFD37S3iP9O/Y1Ftuu5Zkn8szXjSfvKNaTS1kWVw+bqzvt4kG7sR/jUenGItzYZleW1cXduoRnc+GaXUS57puOboxHEWw1Wv2GGhPCpCdMAxAlRP9epv90YUEoLkSKo3CJkgE0dkEsvvpk/YGJTwf+kX94vsj5iLUHDx44HPcfOr6s6St6n9gEVYohXKAh+HpGrq3wUef5EhMZBR17D1iCdxW/e8gWfKpjB5jl0/2lOc6s3nk66Fjjvp47db1f1A58e/5Y9d7aqTOJFkNCGUT2pcdbg/ace6diKDGJ3JFUcbB+nGqYtWZQhu3WNTHUarXZM6ENvPBFWcMt84Wb50r646NtK1FcriGFGooH0kLnoDgTrn+K6D+2Av6WZ+//LJ4eB6SkKMlHcAFCCrczMr/tz/PCfhOWy1XRPJDmQwzgPN+PfXCBluCjJB8l+Qj5KGNV04CaBlACMGCem1NfF+p/9VaSi56WOd/XgIm3JL/CV/7qzYOvoNZViF2hIYUICYA0H6QAhBZrCC5CcRGCh2DygDweL/h3PtvfMNDeETgLrpKqKXcNxYPtf3tRPhF9rZ0FUiwN7RFNe6JFG1/yX/RW/MuozQ8kedoqPkKwDGbRv7j/6/6KbQYrF8Q4KjtXTQsfi77wsegDaoYP0wBMCNU4D2IECCNCCbHOJgtKlr6w/t8DMhUoIQYJoYaWqSihhgE0FA9hhBrSA6Zkapynxbzcw1zf3i2Jtq3S4mKQ4jjvGxCKi1BsiBIiFBuh2E+ceqfogzRXbRcghFhVoADUrkJ4sR73Q6tEUSTrry6YJ8UAQgxSgHNAVJRQSXFRCoipWB2Y4L14Myu8NXdze35oS5H/xRMBzXnh7QUBF3Odlk5gU35QY0FoQ0FoQ0FQY4F/c8G2joL3Go6/d+F4cH2uX0bsL31e05nSI80p4aVHt2XvbPp8KDw59ngXdqwbjy4xRqRsv/TN/IWbgw0fDVfP9xIzXSUDF5Bjh0414WnYqcJGW/mVmpj8uOwL5R+UZZT11zfeGWq4M9T19ez208nUeGcKcxbOOVjUbX/flF58ufJsT/UuWzZCZ0dWJIXl7LWNtJ5owMJy9hb11uY2Y7aBxu4vpnv+Mlc52ZXMFJd0VpX01sQUG/V5RzIrz1hHGrP7mFBrYpQl+QN7XnFvtZEq2H02JavRkkAXnr1ck9Ng2V2WmX7RfLyNyG6yHsHzD5iOlV+pO1Znij0Zn0iets90p18wZV0w46Ot7+cnJWEFA/du1d/sb/h8JKu5IvVCafXtnrSLJRo8Ncwcr67MVNVmRlalhRCJYXhiBG6MtKeqLAnRZYldny6wvQpEXi1S7zaBuJ4vaRQpWiVe7YC8SShrFHu2ib06AUU7oOgSeXaJPDuE0naJ5xWRtJ0vrg5XT1jrHD6bypZxihZ7WF/wIJbyscWsohdWHE8v/uRk+e0Aldk//ExB6USwqnBrcMn2D5vkK08mZ0/uPFB/vGhMHU16r889mD4dhNYu8TAtcbe5upNOh8eNTbuyGDePSld32o1FLGFVubhXunHI51jW54V5KzYmvpMIodhb2mqOGudBpBimnziN/wg/0h+CDVMiNS1W2wE1yY/F1mVX7534fPAfE/2HDmeyv7Bw/77jy8ZR827zRoQQw4QAYYQwIdTbfMKOiambaSmNKuScl77Yb49tY06nFj21qmou+6AlFMl/cz8dVtqZEmeCY0/6Q9kbbeM5u86FlFxJKOk+ut+0SZkpLhs6ZKQNR027Om7V9H5Fn7xogM9IYYsUssmgCj9t8TsflEecGzgaXxuutSgQTOK8+4aoH6Ttn1WwfdYJ+Pmi/3RUuHB7jURV4Y5SwA5m5eqdy9ghv/PP4qrtgJoWQgwA0wJnZJgSQSTwowZTZyONGKTEalqswQEd7r3B+DIQ85ttJ1agpAylRBobL5aUbEl+jRf12zV7/wxZ5DDDM9RIIQuAUFyYEKCkBCYEKMlFcIGWUASe4gtCf6cw/BmySpFKMUiJYYYNEzznHPPksnui1xDFRyl3kOJoSA8DpUCL1/9u5S+2prujVm+Q5CF2jpZm6yq4v/T4d33hGgPOBTG+iuGraSFIiRFC/MhVf+QdcUFS4OyPBEkBRAlRQqzH5BuPLF/y3n9ty/ZGKZGG4mkYiYrmaeycR9k6w9aQIogBEJvnG8EvrI7hG8r8DLgMpXkaggsTApTmwCQHIsVOQwwh+U9E3KnparsIJWWhJwG28g/imCU6wg9hRBqK97QMSwyRYogRqEkuzIjVtFhFc2CGE2PxCTJKn9/45621xvc680Ibi4LPFwY1nw5vKQhqOB7YnBfQnO/fXBDQVBjUWBjSUBjUWBjQXBDcfCqgvWBbx+mI2hPr0mIXyV9E8UyYyoowJ6xPQi98NRySuTPrCp7ZR0YVHtycqK39eGif+XhsQZL2ZBwxfSmryYbmxx1vsBotJ4rbKetQgz7/aPqFssNkXung+ZwGc3RRUnRBoip9b8NHo0dsBcGJO8qGGnaUphb1VRf3Vu/AsiPMxvDS+JCsD8r6LuQ2Etuy3j/WReU0285cqsqpLtuel6A/cXRHYXLZ5dqMi2ZdcVJi1ZnchorSvtpj/ZUReOqWc4c+rDt95mp9WtW5PWfSsi6Yk5ji0+10ek2p9uTR5LrSzEZLRkPFISI/5lTi6Xa6oJXOrjPnNRFnrtTmtlPxTDE23Bp97Oih8mPMVJfhVIL+dKKuMD4sY3d8VUHtJ32JV6wglR5iSfC3xAWTiSFEYiSVHIUbQ6kUlS15ly2773uHZGMxW1Et9mqSKzrFshZnCVekaAbkTSJFs0jRLFK0CuUdYu92gbRB6t0ByNvE8gaJV1UENGCyO7zeNi/jnnFh2VzYzBIu8cLyQrflJzneqdq9VfTFe9EfVJ2zfLRxy+lVbxbsPtC5av3pg4k9H8ZdzD83sS3ynLsobuehoQB1/RL30iUeVld30pXFPHL2WYwbu+qR28OqdVlR68qh/8QyvSDOcd9yOCBLg2IbEDtfQ3BhhgfTApSUIOQzdeZZ0g8+qo0JYLsQwsSx1ndOt2SMfjZy/8ei/7efn4j+g4WFhQWn+/P1vc9GP285iAehmASiuWqSrauSwhap6rTM/kl6WntUDOajK1u5m347rz9afcoLm0k8SAZCxT6aEoVtOMU+nXPh9unMxu0l48n7GdWOsm0VoylVc6frP84vG92fWBVlG84oaNlf2LGTnj1obNoKmXgaqwC0eINn1kWf3ZLVpjtUuwU2SSFMDDECjZ0HUXyYEECU8Im58X9H9J8N/xk8Yx0ABWgpjpYSQCQAmqVb4oSvbf3dO8k8daU4ihIoST5MCyCKD5ICp1HubNB0Zp0Q+bhvkpLCtCeK+frsXyyK/a26zBO0ShFaDpFiAyaMPCHjhL0g0bvoaZmKeAWlOQbMEyXZkI2HEmIEFzpvNXSkZ3Ah3xNa7BH+ey3hqSYEakIcUwNAVrYO4/2QaBDiH7lbfB3FQUghzPD0pBwqXPkr7nOhuTwd7gmRUhXGNlSKdWbBL91/6x/PN2BimPRWMXw1DUCkGCHEKPGD6EN2DkzwtKRIb5fCNADhfC0ujsYUqz50ecn/t/45XlpaBDIsiAFUNAeye2jsAg3FQ6p4KlyIVolgm+wl/9/7aFlw4Uq9VaZnBBDORUi+zs6FCLaGFD0+BY/GDSKlThHXMBIYl2zJXLE84jee77+CYr5qnIfaf7wGRYRSIqdbBVMSmOGpCRbMiNWMRGXnwnYPg00eaBS4+bpuNO/e2pIbcaEwrOHc1qaizY0nAtrzApvz/FvyN7cWbG4t9G8uDGxyUhDekL+5Nf+9llORVSfeQN5xC/NV2VJDSo9EmOO2Htte/VlvxMn3M67iH7YUKU1x207sSm/FsLluYvqSeaTlAJ5f/elwxVR745cTaVVn9pmzaz6+apvrOP/VaHJD2fu2nPKJJmL20vlPR3cUpdPTV9JqTEHGncUD5/fYcpIaTcSN7rK5tu31p9SWNGXuQctAU9PH4+aPrpjnuw7geZl15fhoa931vuLL1XutuWe7q2vuDBWPNVpmO5nZ7qqbPafGzquZrDAyA7RlHO+kmj8dq7txtaz/QmpNqWWg6eLtocr5KyWDF3dX5CRfKK+82Vd78+r5WwPFl2uw8XbzUFP9nZGSkaaD9Omub+fLr9QfMp/Ax9rJ2UvWmc7E+rN5VxjiemfLN+Pxl8wgkRaBJ4dSKRGVqSGUMZJKVhJJ4UyGBsuMNmd2f+vYhFaJ1tYDigaZ+JLMs10saxHJGiWKRqlnE6BocEq/2LtdKL8o8mwQyi/KvFpF8lqxt23v0Rsny++LV5cv5ZS4sWkXVqUbi3jhteKX2EUJHglyDwAAIABJREFUJ0ewhk9brjp27Dufd+aTzdvoVessuw/0ea/PPpLWsze+oZSaphvulNCfHk6b91lf6RR9Nw/KzYN57OxXurGqXdmYKxtz9aha7FHtysWe451ZrEjlhu6NOKWBsQ0QCYAUB7FzIIqPOJt5nuEEPFM97HwN6QERHijNQ3HFjooA69UzA58M/WOiv/DwgcNx1+G4t+C49+D+Z46ZOEyptcgMhEBHCzUEX2MVo1bvGMzPYPXRWT1hXKaxSDQmEWyS6qyeepsXWiHVmESx5rXbK96KrdhgqFivNa9Gzb5a82qd6c1Yy9YYy3vRFe/EmDdEm9ZFm9fEVvjFVvihhCdCyGFcBuMS2CaGLABqERlsUqdj+1NUDP+pPKlk/n/mGXYQA6hJvprkauwCJcVVUlyoUqwk+Y8yxx/x4xLrT3lkLPwEhHwDIT20DB/G+HrCU1Usc9m4aO0uLoRJYVwEkgI1zgFpLlolcpZMNRTnUbsLBYBVgJLmKXG2lhbpbBKozFuge06220WLeSEEz1AFgKRAT4o1p6WrdrzyauAvNeekBlq8nRHrK4QIuQImOTAlghhAQ7Ihgq21CVCzeP0eYMmWRXpMDuF8kBAhlCdCAjDuAWIcmBZoCD5sF4G0EKkE1AQLpDgILVUT7ijJ1pUrQlIVf1i1SFXkpa2UqGw8DcUBab7Btmr5tl95apciJh+NnYOSMhDja2mh3i5SY3wNDuhoGYyLYEqiwQUaiofYOSDxmoHh6qyC7ZjniuDF0mi3yGKB3i7REFwNJdBQPIjhQTRbRXCgKgCu5KoJdx0h89mzhBu1JPgYL8a2Rod7aqwChBGhdjFMiSAMiKTZ6iqRiharKBHMiCGKD2I8LQno7SLQ5Ln6wBvu4H9vyWWpbDzYzlfibIQRwQQPJdkIxdZQPJDmw7QAxtkgxYIYAUgL1SQfpIVaSgpVyMJPA68qX/ZJCVNdOB3ccCq8vXBr/Qn/xqKt7YUBDSc3txZs6irc2FHwbnN+cEtBWNvpgMbj29qPv9d4StNWrrYk/ctK15VHleG2tFAidRsRF2g6qrakRZYadWS2qiJZbcuILEsOOndEU5GGVmQasBy43KivSFHnHSy8XJNac3a3KQMpitebUqOxLMSUoilJ1JanoCUpu/BctCQ1xpqjN2cqC+MNFZlgaTJ0Lhk1ZeiwHATLVplSVeeSwLNJaEmqvjxjN5WnPpuktWTpKrL05sxoc5a+JA0pSdeWp+vK0rWlaWhZGlqRieI5EJETakkJL09CzOmxtpxYS7bubPKHltwz3XW57ZShJE1vzoTK05QlSQZrjq4sfbspCy3N0JZm6EsyDKWZ2rJMXXlWdFlWTGkWfDYZLUmNMWXEmjOjS9P0pakxprRdtuxIMjOSSo8g04JwY7A9NbwmM4RMjcBTw+3Hg61GsCILm/joYM6IzIcUAfUKzw6x4rJQ1gp4toq9Lglll4SyyxKvTpFno0h2UebdIJO3ScRNPt4NYpHd27eCOv+14cMZvifu8rp5yfLqF16nl3oQL7JNSzyKxasLvN48K19TJPI+JVScZony3xCc8pCeeUNwiivPeTPgxCnLtPaDSum6kzzv8pd55ctYuBuLcGVRi1m0iwft5lG51L3yRfeqZe61S1l1LiybC6fUhWN7nlv22vqDq3aEwab3EMwPxDgQ447YuSApgCg+SnOerQ+PW/UebWGDDBtk2BAGwLQAoVg6EjCYVh8wwXUjNcOfTP7wpMhnP0Z4kcOxcM9x/9sH9+49dNxfePCN43bNRMEe7F09JkUIsZoQROICFS5CSYWOlqGUCMZlsE0KW6SIVaazyvU2hdYqhS0SXamnrsxHa/JFzb6IyQsxK1Czt87sqyvz0ZV76coVunKZziTRV4gMZpHBLNThCi0m1+JSLS5FMZHWCugsYoNN+s9a2fssdCSgJYRaEjAwEi0JoIRQT0sQ/K/qKn/ltT2DZ67UpQVqko9WSjWkCCHkqHWVbKcrS/mnbcd5OmyVnvLS20UQzQ63vqqhWRqKo63igxhHR4lQRhJp5WhISax9tc6yMprw3Jy1gm/47cb05aAFgBk2yLBUNAckJDHkWxsOs90j/svv8Esas1RPy8AKvp4W6xk5RCnUhBikAL1dqsMVYJlYmev7RvgvNyS+ZiBWgxaxysKJrpJDuMBgV4CECCLFSkwAUmKllQ9TEq1drsaECC2GMClaus49+HcCjesuejNCSzWYFKmWgnaRskwWedzv36WLtGXrNZhMR0j0DABh7mrbcrRSANMCNc4xVAFqkg/bhWiVUE25o5U8yMbXWryQs77L3vvNhqMsxOKlZ+SPOkRpkRLngiQPsUuUJOBcu6DFFAFZwteDf/vW4dcNFW/qcV+UkcF2YZhtOVIJQAygq5QpMQFISbVVXiAhREhAz3jCNiloAWCzn2zHMoFhcVSZJ8xIQbsIrpLClAQmBDDBgyi+hhKoaQAiAQjnP5p4SKGSFIAUoKMVsFWhLJF77+E9H/yGpi43pDFvY31WaNe5rU2n/VvyQ5vyA5rzA1pPbWs5FdiYF9KYF9SSv6Ul17/1+HsX84OqT76Xt3OR5wuBZw+GEulh9owwOi7UdkRpS4j4f+y9d3hUR7boO999775w7jtxZmxsz4yPZ+xxIJigSDbGxjZgjI1NUs4Bgcg5o0RwICeRlTsHZRBRBKl755x3J0lgclDsfn9US0ggMYCxZ865rm99fE1r905V9atVq1atlb8uVpcRqdkQq8uKKs4IO74+tjAnPm9zcvHW+PzMxIKMqL0rt9QUrqs+kqb5Lur4pujC7BhNTnjBprD8jbHF2VGFG+M0WTFFWfGardElm8MLNkWXZEYVZ4Tlb4wozozS5kTocsI0WRHFmZFFmbFFWVHFObHarRFF2bMKMqaf2BBVsjkiLyO2MCe8IDO6MDu6MDuqICuiMCOyJCtClxOuzwmzbJ2lyQwv2hhVuDEqf0P0iY3zDTt2wZbMs/lJRVviNVujSjaHFWTGardG5WXGFWSHF2RG52fF5mdF52dFFmVHFmVHF2bHFWRHFWREFWTEFGbGFmXFFGZG5W+IKdwUV5wZpc2J0mXFGHLC9BmzjJnhlpwwXWaMLnuGITvCnJOg/2GN0VJ4rjn4w7yQkZXDgs4MDbg4ckx90Kgzg4MrAkeeDhxxbljwyeCRp4YNrw4aeSkguDZ0+JXQkPPDR1q/mK7XVzZ/9FX1G4OPv/R20WsDy14ZUPrqIOMrAwt//86RV97J/dN7R/747uHX3j78x3eP/+Ht4/3eynvtvZJX3j76pwF7Rkw8nrXXPSPp5OuDdr389tFX3jW8NkD3ygBtv4HalwZqXxqo7TdA/8oA/Wv9Ta/0L3npbXO/d62vDjL/x7sl/9p/9/uzVkXvm5NYNCVZ92G8YUiCaUCiZWi8PgA4KMYZepfHPEf8SmqKaWiaZWiS/v2U4pDFRdMOnN56Sb7EX3X2jHbfl03f19bqa2nztXt9Pm97R7P3ZoOXKoS+X6L5PKVobJw+NL4sNMYSEKUfHGUYGKl/L84wNM4QkGAITNIHJ+qCEnUBibqAJMOwJE1gsiYkWTc8WReapA9MNgakmAJTDaGpJaHJmhDA91R9UKo+KFUfkKIblqILBJYKQNIk3ZAk3dAU3bBk3ZBeJUU/uFfp25zyrNK7+SVR836iZqD/WtpBSdrByfqhSbqh3UMpJHeTPsMt9CFxppBYY3CCZXiUfmiCKWSOafTM/QFvRv+fHy1/M/Hw6Hna0fHFA9NKB6eUD4rWv51SNmyOdXCyYUCyYUCqeWCioX+S/v052tB5hWNS8scHpr8UkN4v5tgHyfoR8abBUfr3460h0caQVMOH0bmjQtJfGZTyb9EnRsWVBM4pC4opHpBoDEg0B0bp34/Q9Y/VDUw2Bswzj4w7PGzCuj+/Ffa/Yg+MT9eNSdEPji0ZGKcNjtMPitMPSi4NSDAPSbIOizcNTTYHJeiGRGvfTTKFpmg/nrB+4O8/+U3c3o+SC8fEa4Ym6YbHGYZGGQamWsbEHf7wD1P/j4Fx/5ZS/OkczdAU7YBkY/9Uy/uJpiExmvdjNO8nGgPiLYHRhsGx5sGJ1kHJ1iFzzaMTj495N/qfBsX+NvbgqHTD6CSd38CVYglOMA5NNg5LMQYn6EMTDMFzzKGpuuFzS8YHzf3tu5H/78xdgSma0XG6YXHG9+MsQxLKgsI076cYQ9MswxONAVGad2I1f000vJdifD9VH5BUPHrCxr8MTvr3r74dmqofm2gOjDYMDtcMTDQGJRmGAi+peNPQOHNAojEgxTAsyTA4weCfaSWZA1LNQSn64UnFI2f9MPb3X7w0bnNMROUPsy8fnHr+wNQzB6bV7Jp+cd9X53Z9dXbP9LN7v6nZ/WXNri8u7J18ad+si7lh54/OMu/4t68Gj1g5I9H0Q2Tpjq81GyKt2dGmrGh9RoR+U5gpI8yYFWnKjjHkRGozYjQ5MUU58Zqt0SWZkcUbw46tWVy6N7V0T7Tu29kl2RGGrRHmrbP02bO1GeH6rHDDplna9dGWzeGGzNmGzAhzzizDxghL1mzdpln6jFnGzFnmrNmW7DBzdoQxK0KfGW7Knm3KiijbEmbNmWnKDLfkzNJnRJlzZhuyIgzZ4fqscF1GmD5jtiETbM762po1w5gRbsqONmVFGjJmazZGa7MWVe+ZX7EzRpcdqffvDY405kRqM6M0mWG6zHBtZqQ2M1ybOUufOcuYNduQFa7PAoeF6TPCDZkR+swwfQaQCEN2pCErxrw50pQ5y7hptikjTL8x1pgz27gh0pQZrdmyxFRYxj8IS7cGj9EEhVYHhlwMGn42aMTJwJGngkaeDwq5HBhkHzGSCBpbMWx47ZCgC4EhF4JDaoNHlRwubklfaXszsODl946/9K7m9++Yfvuu4aWBxpf6l7zUv6Rf/5JXB2j6vVfY773iPwzSvTZI/8oA7SsDDX8YqH9lwLG3Qg5PDK8Z+mHJy+8cfOU9zWsDrf3eMfZ7z/DyAM3vB5b8blDR7weW/H6A7qX39K8MLHxloOXVQdaXB5/oF7zzncmbPl42J+7oV8naT1IMo5PMQxPNAxPMQ4Bn85Mc/IATWhcxTH6fjlTtkBTNkKT84EVFU36oWF3DVsEywbl6QL8v7v+mw9fa6mtu97W2t7f6vL72juZ7vhuuZrZGydtWtSAp75O4ojGxJSMSNMNTjCOSDSHxxuAEU0iCKSTRMBx0uQRDYKIxKFETnKgNTdSGJupC4vUBwNcwXh/g/1IbGq8L6ZI4fUiSPjhJH5hsCAKg9K+SGQKTdcG9iz6wV0l6YRLcq6QaQpP1ganG4GR9YJIuIMUYmmIckWwamawL7ZIU7UPp/v3TSHxJcIphZIImJKZoWKohNFkzIrXwg4/WvP7mF//zq40D5+SNnmcISdAPiNH3T7AGRmgHxemGJRmGJegGxWnfTjQPSLMEzNWOmJs3duz8/xwU8R9TNgybc+LTdP34hJKgJN3wBN3oqOLgxJKR6cUfR2wf9c7s/y9o7u9TtCNjNe8mG4KSTIFx5mFx1qEJ5UNjzYNitIMS9UPnGALD9wUPjH757Vn/ml44Yb5hRIJuSLwhNMkyON40KMrwbpxlYLj2nQTzsERjQKIuKNXcP0U7fPau0b//9DfjFvx1QeFnC7Rj5uqC0rSjUozBcypC40qGzdV8GvbDmH8e+5uJa96fUxg0RxOQoh8cqxsYrR2SWjpmTtnY6OKAaE1gojk02RqcaBoWUzggtWTEpI1//dPU/zEtZ8i8gvFpmtDEwsEpuuBkTWiKNjTNGDLPMDyxIDBN/0FC8YgU7cg07aiFuvFhO99/d+Y/B6T8Ljo3dI5xVIxmSKxpWKR+aIwpNLw4KMYQGmsaFm8dlFY5OMnwTkLhe+mGkBk/DH034v/6YPGf005MSCwakagLitcHxOtCkkqC52gD5+iGJmuHJuqCEvShybrgNF1Qqj4oWRuUpA1J0gYl6wNTdIFzNMPTSkbH7Ps4OGVIvynvhOetDa/eOaVqz9fnDs66sGfa+e1fnt0+7fzOGbX7pp/fP/38/unnD3x1dm9Y5d7php1DVoS/OnVo6olN8ZpvI0qyEo3r4rUZCfpNsbqNcabsMOPmcPP3s/XfRup+iDJmR+s2RxZvidZtjTBsnq7ZOLtkU4x+W7Tm28jirZGarVH676KN30bqN0dpc6L12dGmnDDtpmhTDohm0/XfaH12lC4rXJ8Vrs+KMGRHGXKi9dnR2qzwkk0gVg/YeTu7ZFOULiu8ZFOUYUuUIScGHKbPjtZnRxlyIo05EdYt4fqsWH12jC4rRpcVpcmMKNyYoN0SX5ITV5IDNlvFGrbG6LfE6rfE6bZE67NjdNmx2uyuISHCkB1hyI405kQYskEonhhDTpQhJ8qQE6nPjjRuC9dmRxlyIoxZsw2Z4abscF1GtDYrRrsp0bwt7HjGPM3+zaVlNYz3y0hdwIj84aPPDQ6uGhxcHTD8/JCgC0OCLgWEQAGBtmGjKgYFV4aMORc84nTgcNO85eieY7eCxxx7fdDRN94v+tNAzcvvFr3cv/DVQUWvDir502DDH94veHVgXr/+x/v1P/rqwOOvDDr+8oDDL/U/1O+94n79j7828MAbQw/9ceCh1wcWvDFI9/JfC/70numP/XV/GFT82uCC1wbnvTa4AJzqlYH5/QbkvTxoZ7/gpf2/SJm0Yl7CwZi0ogkpmnFJJSHJ+mFJuiGJ2mEp+hHJuuHJuuFJ2pDeRTc8SR+apO8iRjCwjqTljV1YNHG1Lnz3yUwrarbLOMqxouLu6Ojo6Oh4Mvd/4/W1tXkfeH2trS33gPXnQcv9dl/r3Y4G8tqlU84SPb9nz8WVOeVJ2eVxmyvjMqtiM6tiMyriMiriMivjsytjsyujsyujN1cnbq5K3lyVsrkqOacqJqc6Kqs6Jqs6LqcmOutUVNap6MyTURmnojJORWXWRGfWRGdUxmRUxmRWRWdWRWdUR2dUR2dUxW6sitlUGdergON/RqmI61UyqxMyK+OzT8ZvqojeWBGbUZW42hK9whK12hK15sVI2Pqy6NXm8DXm2ZtKI7NK47+tXri+JPWz1NF//uxfJq4amJz3QUJRUKopJFY7NMkUHK8LidcHzSkdkWoNidcHpRo+ij4w/oNF77436d9mrRq7oShlozZ2gylsvWX6xvKwlcbZ68vjV5ui1mpjNhWnha+dNGBav09XvLOgZHxyyQdJmhFxusBow5A4c0CiOTjRGJKkD07WhcYfHTNjy9g3p/7LuPS35uZNiDkRlGQckWoaHq8PiNYNSikLTjQHphhHJJYMn6Mbl1YUHLNv9Ksf/6/Q6PeXH0vIMMZll4ZlWGZkVSWsMH+9pnLGUtO01aaYVUVJUVlf/HHcv87eFjQ3/6P5xg8TdUGx+iFR2oHRmv5ppUNSjMEJ2mGJmsAU7fD5+vFTNr3358n/T9j6ietLktfqojZYwtebZ623xqy3xq40hq8rjdhSlZhZFp9RnrxKH7NKH7XOErPWEJFhiY3LDntz4ksjU/+SfOSj1OIxaaYRQKuILhsZaQ6NsgZFGgZHlwxON4xbUDQxZse4gdNf/nju4OWH4zbpU1YbI1eVha+wzl5XGbvOErm5OjanOmqddeZqa9hKa8QaS8Q6a/j60oi15og1lqg1log1lrA15tlrzRHrrbHrrPMXH54/MnzcG5OGJBVui6s8/HXFnpnndkWe3T379M5vzuz48vSOaTW7Ik7vj68+GGfenWo48HHGgpcmDF2Rm7W+ZNf6siMrDFu3lK/P1C7bbFyRaVyeWZ61wvLt8vLcxeZDy8xHl5TtWVp6YJk5d1lp7pLyg/Msu5ZU7F9o3rvCfGSF+chyy6Fl5tyl5v1LzfuWm/evLN2/3HpgufXAitKD66qPra06usJyYJlp33Lz/lXmgyssB5dbDy6xHFhiObDMcmC5+cBy84G11ty1ZYfWlOYmHMpIy9u6ynJgQ+XRVZYDy60HwQHLzQdWWMDn/cutB5aV5i4z7V9p3LfafGBj1bH1VcdWmvevseSu1O9bbz280nRglfngqtJDy80HVpoOrDQdWGY5sNJ0YFXn58XWh7IEXKVTVpTmLivNXVZ+ZJEJfH9gecWh9Wfy11UfW2nev8Z6aIlh/wrzkZW63AztiSpCPYP6vgrPGzq8KGhMafDos4EjrwSPrg8aWRswoiZ09KkhwedGjjs1LNgUFFqcmH7y5CXf0nXnJk0rGDsxb/zn2rGTtaMnFo2dUvzhF5rxU/XjvzCNnWweM8k0ZrJhzGTD6M91Y6boxkzRjflCM3ZS+ZhJpvFTjR9O1n30uXncRMu4z6zjPrOO+9TywWfGcZN0YycXjfm8aMznJaMna0ZP0o7+XPvBl8WT44/HrNu7YPfm1XnrMs3Ltp2cn1GRsMYUvrZ09hrrrJXmsLWlMWvM0WvM0X3xYXWndP9yrTlqs2XxvtM5xXVHTtE1iMrbKIbkFLfn6lNBv93b0uFr9fpafb4On7cdfNve7vV5fffbb19tUxwthHTHrtyHlPs2+sY59bZduWWTb9ilm3b5lk29bVdu1Su3rog3bNJ1SLqOSNch6UadfPOyePOKeKOOv1nH3bjC3bjCXr/M3qznbtn423bhDiTcqpdv2eTb9fLtevFOvXTHLtyx8bftzyrSzZ9XmFs29ma9eBfmbtRzt2zUDds58eQpprKUtnZJOfX8UskYrJi2mjadZIxVhM7mOU/fwC6Jl/WnK2cviBgw5a3xC4YkHPooXftxasmo5KLgueaA5JL3E4sGpWhDk0s+mL1r9PgFQwd/8/aqbSvN502nsZpKrLQcM1TTplLcUEaYywhzKW6opspP4TUVVyrX71wz9PO/jk0YmHJk3NyCsfMNo1L1QQmaoXMMoenGUSlFAXPzJ847PvWzBcNeDv2//zL+90GRf0k7OiXx+IcphaFzdSPnmkLjigel6oPmFI+YV/hB2vEPv1434g+j/u3L1K/zq/XnxQvllK6CLGTu1Np+PH/xao2RKCrjjRVcaSVVUWGvWv3d+ldH/8vH6UPmHJ0yX/9ZinZ4mikw3TIwTfvGfF1gumbEnBNj5p2YNC7tr29+/Lt1+1ZV1p8+SVVbUF0VaywnDRbMXE6VW3FTBWOyec5St+w1QlUpYS2nyspIiwXXl9PGKnt95sHvx4aPDg77a/T3Y9MLxiXnDUvXBkTo/xprHpRkDUw0hszVjptzZOLUlSMHTn0jfHH4kdKjNcTpKqKykikzUTorazTguhqhwt50tr6h5iRvstIGC22xkMZy0lBGGUoJcylhLSMtZZShjDKU0+YKutxEG81QeX6lLnxhwp8/Dpm6ZXVK+bHIih0RNbsjz+wNrz0w/fz+r8/uizx1MNF6IKlo18jE8D9PGGOpO8NfU6rQS3rkzBnOcsH+HVa/ioTWwNBaO77zNJJ3ijxVjtdWEvUWsrYUv1KBQ+UEbCGuGImLFvqKGb9sxuwWHLKSkJWELES9hai3knWlVL0Zt5XRUAWLXLmqXm5Syhm4nIKsuN0vJGQmIRNhNxF28NsKHLLCdaWYfe6WzDUHdpdiditqs6I2Kw5ZMLsFs5cScOdV7FYS0qN1ZrS+nLSflWnohvNyk2IlbVasrgyHKymslIBLCbiURCw4BMRMQlbcXorZSzG7hbAbSbueshtJu5G0WyjYQsFWsutI2EzC5TRmRe2VBFxJ2M9IBHLDZW+QThE2A1xnZQgzhVkIexUJ1TIS5e44Y7u3dNOVMZ8eGRxcNGLM+cHDTgcEnx899uKgIaWhIWdDRxR//Il27QakjmhG+Nv6MtFyskFX4dFXNGlKG7VlDabKhqrzN87VtZw6f1dXdlNjva4tv6ktv1lSel1T9qO+6oau8pqu4kZJWaO2orHQ5NCUXi00NpSYGk0VN/TWG/rSH/Wl13TlV3XlV7VlTdqya9qya9qqa0VlTt0pubyOrYTtFci5Wvkid5+66Kopo0yVrLWUtpoJUxlTWkpYy8jSMtLSq/TJGaTqHFt7iYfrWIqSPTZcpHhVcTU8lXmn3dvW+bnD6+to62j1+XzedsD/jnZfa6vvfmvbnQ5vs9fX3O677+to9Xa0dLQ3t3c0d3hbvB3NXu99X8fdDl+L19fq7WjzeVt9vmaf777P1+z1tXZ0+B4RbwfIO/igw9vs7WjuaH/Q0f7A62vp8La0tre0dTQ/k7T/zNLqa2nraPb52to7mr2+jpaOds7pgFnGJvA2gbfzj4vwTALzfD1JY4IIcxTCYU13rt/3eQVnE0a6TtbWrd2RNWJG6NuTXw2K+s+JSwYl7ZyQfnjMkrwJ8TtCJ658OyTpD4Nn/vGbBZN2FW6/UEdhnNtOKhCjwpyC8Go9JWC8A2ZoTJLqWQ7mpMsIbsfRPGNe7JKoQV/8buj0f/9k0evR24PSjoyff/yzpH1jv9747uiE996f+vonMWNyDmbuyN8RuWz2X8a/PGzWG58teTfmh7GL8ifPy5uQfnzCjIyAsfGvD5n2u5CpATn7tlacu1CHcxDHQSIFseiPt6/d9LVgqgRzAiSIlynKxjB2iq+D2N2F+ydEf/zmJ/2GJ739+fqA6B0jFx2fsPj4B3G7hn+1dvDYlPfe/KTfJ7Hjtp/YfQFCcNpp5wWIY2CBtLN0HS3aWNXOC7DE/njnVrOvnXZIMM8iklzHcTaBv8IRKOGsx4R8kyFuaeyQiW8Gz/7TjPWBEZsD550YmV4wLjF3zLTsYSNTXn93ykvjIkIW5iywnKrBOBGlBJST63n+EsfADskmsKzTdf3B3Wv3btIOoZ5nbIJg4ziI4+o52sbxNk60cbyN4+wiZxcFGy+hIm/jxEskU1p7bt2u74fPmvn61E9GrY79PHfN7IKcBOvuOOuuKcc2hWakvhU3td9no7+em1JYVXGn5UFbRysq8ja2xS3OAAAgAElEQVQRxwntj9S3zVhqM5Z6B53/I7lZIYto5iLCUjAn1POMneFAxnMbzds4HmJ5mOUvk3wdLdpYGeJVWFQgQbbzUj0n1jMSxKuk09PU3NL4oJmQnajgQHjVzkj1QDi5S2ysDP6E8Gr6yvVZ2/dCvFrPSLDggFmHnVbqGcXOOSDeaecU/094BRJkhJU4l+fHtnbHnTv1LAdzgp1TbKwMxM4pNl6x8UqdoFzhZRvrzx9r55Q6QbkigO9Fu6BCvNrth2o9p0K8E6IljJURhhfdDfc6fDfuPqBo/golYKrnIsnVMxIle+pwgZCuotINiG3WVzSty4Tjky58M6NmxKgTw0fkRYZfWrToypatfEVlK0a1U8JVgvOQ3PU62AHz1yDqmo1ogshGiHA4PLfvNvs8jfdRqslOeGCqCaKa6nGPjfQgdIOdcNkpN8y6Ec5poxRMaES5azDTADEumGqEqSaYvAYRVyHiR5i8BpPXYKoJIq4idBNMeWDKg9ANKOcUG5put7e5b/0I8zwkyJAg17MCJIh1DAtzzwYNOy+gsgMVJIQTbDjbmalbYVXXUy3kghy5vg5fS0tLu6+t3dcGjPten6/V1+YfEjp8vlaft6WH42e7z9fu83WmkW1t87W2+5He7vW1eX2tbb7WNl97Z5LZNp+vzett93nbvR1t3o42r8/nz4frj/vsH3b6Kn/HnOnt3g6ff9Oyr83n4xxuiOFQxtEtN/pDISjnMwmGu0mqkWIaYJjlePnmrTtt7T5VbaJJJ0Erpy5dNJwtzTqyecaCr8eFD//PkS+9PORf/hj00ttj/3PMrNDETQk7SnaVXziFEjzOCBDFErxqp0SMVTFWJVkHTskMqSCYBDEOXHDjjMCLgugSYB4+biiYt2HOR5HDB0x8/XeB//TbYf/0zoQ/BXz19syFn+8s+UFXZbwIQzaSqLx4am/J3vTMeSNnjho0eeB/BP7zfwT90x9H/3bo5AEzUr/+9vB3BWWa87YrJCnStBMhRDvBsazaft93r90nyDdIvIkmr+GkCyUlglYownEFJYynyr4v3B6XGR8wI+DVkS+/GvIffwr597c+eynwm/6zl83alr9De6rURlAM46JxF4zLJKcgJE+yLoa/geKNGOnCKPnureb791pFyYGRAso4bJiEsA6EVRhapigJwZnyM6ePaI+v/n7FJzFj+k/40xvBv31lyL++PvyVYV8M+SJl8rLvV+SXac/YbATJCrwTgXiSdqG0mxQb6wkRJSVJaLp/r+Pe7RZRdKOkgtJOjHLgpIqSCk47caoBI10I5cBYJ8I4IdJNwy4Y9UBCQ50gnMOwo5bKDceOTl09563PR7/+YeAfhg96bcSgv0wY8WFi+ILvNu8qKTKdPo3zore9w9fhhQkG4VAPq2uBNvrQSB8a2YYm38E3NRAlPA0htGxjPJAgwoyMkS6S9kCEgvEOiBRxWqE4D8G4MErtEjAwYJSKkgovN9640379VivDu1BcJmknQTkxyoGSKkL506MjlAMmVYSQQeLyxcs3bdt5yJ+7nHVQpBsjVIxQQW5u/8GUA6FVnFZwnFeUxgftvsab9yGcJWiJ4tzgVDjtQGgVY50wo0KMCtMOjHKQhIMkHBgFkgw7EcaJ0DLKKDjtwAgFJ1WCcuC0EyVVG6vCjEywMkKykrOh1ee7fb+FwFmKdRC0ghIiQ7sp0o2hKiU01tEiITQR/H0Ib70CtVyG7lyou3q+rsGO3UKoWxjpI9kHjOikWQ8EqyTtwkkXzDpg2oUxHoJxwRjr9jS2tbW53Q0058QIBaNUjHHBpIrSTpJ1YZSMMY0Y4wF5sFHWYyc8EOnG2CaMEzBWRhkHTrlxqgGn3ATjIhgnTngo1kFSHE6wFOWgKMXtueb1+a5fb8YIFScacaoJJdwE44JxmaCcOOnoVbpA0ZUh3V9rjNuGiySnkIyMEiLNe+yEIDdeBztyO3zevj02fb/xPmPpk8p9wfqZz/PCMqO/GPG/sw6vt93r87X5fKLiJmgJZZROcfxE8Xc/SsBo7vrtO20+n+q6hhMenHJjjAthlUsIWXb6gqa0/HBRyb6jJ/YezjtaqNOXnqo4fQUmVYxykLQHpMNGaBVhHQjrgBkVZlSE9vftzo4qU7zaeO3WvZZ2WnKduwIbK2ty80v2Hs3PLSjafyKv0GQsLz+NECLKOGDWgfIuTHBfRpnzdYjWVHpCo9979Mi+Y4cPFZzI0+vKz56/jBF1tIyLHphUcdqJ0w4EFyjOeet+e5vXJypNBK6ShIvAVYJWQPZnlFFgSsJYZ/W5Oo254nBB8Z7DR/cdO3pcZzim1Z+6bKunBIRVIFLGCJVi3BCjQoz/ocBAC/Jo3751v7mlQ5BdGC3CjIiwCszICKtglIwyCkSKGKsitFhde8lac/pwUWFuXuG+I/lHCrR5Gou58vxFO23DJIwBaakdXaz01wjr4KWGG7dbbt59wAoqwagYpeK0ozO1N8Cro7uAvO0Yq6KMYqdEOyVeRrmyM1eOa6wH83T7jhQfzjccKTAaK89VXbDbOQcuqDhD3PN23G33cazE86yAm1uw7HYssQOLb0fn3MY2uokinq4naAklnDbGBTEumPJgpAcnPDjpAlAAdwKSaKO0s1MXUcANM0LDnWbvtVt3GRHkH3d3Hx66CwAuRsmLVm7cvGM/wioQo8Lsow212yPLGKXitKK4m+61dly9eQejRZx2wrQLph2gvh4K44QYFWZ6XBEMBgjdl8go40BoFaNkyelp9/lu3mkmSZFgZRgXSNaFkiqMywTjojgPQigI7iAYFyc1UZxTcjbxiktQXZzs4KQmnHZQnIcSGusQgeDdCC3DlASDRkWLBCsSDO9qvNbc0uFpuEayDpyREFpEaBEkcAfvFsxRYEYGPQumHUD8x9Cy/7Yf1oW7qzpQUsVph6vpervP13T9FkpKBOOCSSdCq2DAw2lnX3Doq75QRoEpBbwihFYxSiVpl+K42YXWh5h93E//V+g/E/RbvX7oP1rZzysPoU9K3aDfRDENMKbCpIoLToiWUE62U7yd4mFKwFjZTgi44CQFD0QoCKFQ3EPo+xvl49Cn1e7QdzXdhCkBogVK9qCcWoczpKxinMgKboySIVLGeFc9KUG0QogulFFsuIhzDoyVCUGuw0iElepwDuWcMOsAaGCEBpRUKM6JkPyt++1tPp+oNGGEipMujFBwWgHPi3MOGy7ClIKxThvOgxPaSRoTVRvN2xnBzkgI68BYJyM0IpgMsTKAPugDAPoYLd6+db+5xdsJffkh9MEsR/D4wcHJKC/aKNpOcDacJXgV5xwwpeCcCyi5XcTvDn2UUbqgz4gqwQAF/wnQV2FcQggZ/BZjVZRzwoyKck6Md6GcE2UcECnbCQlhHQCm9RjHSWKLz9fi80F2jOFombbcql/TjiV60fg2JBVAn2PqCVrCSBfEOGDahVAujHRhpKvrut2hj1COvqGvPBn64HgA/S3b9wO6QUy3gdAPl16gf7e19RHoP2yBPaEP8NTVUJ8AfZjpHfowwWGUTLIujFJJ1g1hEozLNN9gwyRabLqCcDjnIHgnTAkQxdbjFE47IEzEaacdl2FSxVgnUAj8IxMtE6yI0T2hTyswJSCgXXWi/LmhjzKPQZ8SuqAPxjacdvb1HvqGvuMx6DsVx42u7bg9MPvY5qx/tPKsXP6Zyy8IfZzhu6BP0h4cTL0pxU6JlOyxUzLKOOyEhHMuP0Fo1Y7LGOWwo2JXX3qU+31AX3Q0QiSPMko9IWK8C2EdECnClARjPE47YEoB2EJYB0Kr9RiHMR4bJsGUAvRo3vEjzrrtuEpIDRCtXIZZhJAJxgnjAi04bj/oaPX5BLUB6NEoqaCMgtAqTDsI3o3QKs65YEqpQ3lS8BC8EyJFhJbrcI51XLNTMrionZAIxgm6WW/Qf9Dc4hVkD0L7DwD/QqSMsU7wZsDQAlMSKbhwTgEfCN4NkX71DSIUYKnoXh0Ams8CfRUACCUVlFRgSoJIEWOdKOeEKBXlnDZchEgZ51yk4LFTsp2SUd5F8G6CpO+2e9t8PppmSQp18uX34A3taEIHEvc49GHaT5Pu1+2EQl/Qdz4KfdrZF0T8TZH2Qx+8VfhJ0Fd7hT5CuR55pZ3Q7AX68LNDH2cknFYQQkYImeYbUFJFCBmjVEpssOEiGOxtOI9zDlJw2QmOFRtp3oPTDkB8lHHgnMOG892gL2O06Gr4sbnF62n4sRP6EkLL3aHfF9yfHvruxuvtPt/VG7cxWuwOffBWnxn6tBNYnzoPk0lGVZw//gr9F1G8/lvqG/o/lfuAyxgl44zQBX0YU0nWDaCPsA6UcwJC4bQTY1wY6wRWV4J3s2IjwTi7iP8I93uF/t3mNsV9jeQUjFWvYDzKugihoR4VKbGBpJ0074FIGWbUekKEGRXnXDjnwtkGiFAQWsVYJ865riBcPSoCKycuuDn1GkwpQNOHCa4b9BXwCCijAP2oHhP8mj7jAti14zLOuoEN2oaLlNxoIyU/xGm1S7fqNtuVMVq8dftBc7NPkBvBWIIwnUMU5cAYFzDdwKTfMmvDRZiR6wneTokQrdgpGWGcKPtQJ+3ex54M/Uf7fFd3JRScdiCEzAjuh1NvymEnJDBO+/s/57SRkp2SEcpBUhxY7KIohqQQmTa3kBm9QJ+VEcr18KI9Go8MjGbdoY8yAPqOXqH/N/SPbtDv+vKpoH/rFkaLGOWAya7G1kuD/OnQJxgVJSX/mkHn4gHBqAgtQ6QMkTJCq5TYUI8JpOBBGUcdxMK4BOMSwbthSoFImZGbYEqCaQcgJk4rGC26Gm7cfwL0/XTu2dN7QP+x7xlnl6bSB/S7Tvsk6PdZWbQbJp09oS8rzqu9Q79n+QeE/j9Y+YWg78YoFWeE67fvAejjtBMhFKCrAtUVIhRL+fmTZ2wE4wK4r7VRhfoKc+V5lFQeP+2ToP+gXXY0ISR/GaarztaXVl9CKAfBeWyIYEeFsqrayjN1BO8mBY+dkIBpoh4TTp63G8tPA6M8TEk1tbCh7IzWcspSdeESxFBigx0VCEYlaOnuA2+rzyeobphSEMoB0QrC+qFPCh6g5p+9jOlLT9ejog2TEMrBCU0E4yI4T+nJi3W4AAwjEK10dbxONb8H9Hm5sauPAejjrBsiFIhQMMYFEcolO2uprD13mcBYleCdNbX2/UdLMrbu/n7PUXPFBYxxdY0uPxH6NoSHcWnHniPfbj+gM1VduIyCCTjFuUHtgMkZeHaCd6OEk+WkFq+vzecjMJwXKNJe1ExsAtBvR1JvYxud5EPodzdDdZdngD7QxPuELJjVPQf0G++2Nl+9dQujZIx0AejD1KMNsle+P4+mTyswLmCUSrIuhJCrT9dt+W7vjj1HdNaT5+swhJYp0Y0yjot2usRUXWKqNpWe0RorcVpBaNlafb7IUHmhniR4t99STylg7uj0XL/f4nU9hL7y5Nv72+KHvgKgT1C/Qv+/UPmZzTuAIBjjwSgHzkgA+oqzESzrg3YPYKEznZw2I27Nhm11EAsGg4rTVxat3Lh931GgR/fVqQB9wDcU52y8dudec4fqaqJYxVpxNjJh7pyFq4EtxVpxPjx6zrQZ0VFxaZu27ABWF5xzkKzr7GUoKjFtdkwSwas4I8EEd7xQt2j52oSUxYuXb6LEBoRWCcaJkhJOibfvtbf5vL1CH9i+cVqZu2Dlp5O/uXAZpzg3TjtRXCZZV7GuIipx/tk6HGZUGylhrBO84S7bTpd559bt+/dbvJ3QdwHoo4wCk06/6YaUad6z50D+l99E796fZ8N5lFEOHCueHZPy1ayYxasyC3TlMKWAOXj3l/Zs0Kc7R1POrTFUTP06YnZUwqzI+NR5y06drQPrHGAgIXg3wbttuOifspAugVfafL5b91tInOB4UmEszXjm49DHGakT+r2goW/zzrNBH3lmTd/xOPRxyt079J8dan1BH1QE0PEJxnksXz9q3CeLV6ybNjNy+ZpNrOSyo5yptOazz6cvX525ZEVGTMK8kWM/rT59GSLFDTk/rFifc76OqMeE3qHfCGz6jhcFfYTtDv2b3mc377wY6P/Dm3f+wcrfCfowLuN+HvkvtD7j29BRn8yOSNQYKnDOgdCy5eT56KT0jK07u0P/EeN+X9CXHQ0IzmzfkztgSPCkr2YbracwWjx17vKO/cf25eYvXLZm8pczEJInWBmjZIySDWUn33k/MGTMhBJ9OU4r9TBz+kKdwVp16Jj27f5BKKmgjMOGizitUKxyv8XX5vOKihslJYRWIdpv00coB047KM5ZewUb/eGnA4YE79p/BCFElJQwUjp1tm5GWHzAiA8tVee63bYf+l1OsZ3Qv9sN+v6pOsooCOUi+Qacc2GUXI9Qcxcuf29QcMrcpWdq60lO2X84LzIuZe3Greay05dtJEKIfqejnux7wkJuD+J3gz7BqAZr1fhPp2zM3LI/91hEdNLOPYcQXMApmeFdEMbDlFSPcXkaC4wLjODGCCdFcq1eX7vPx9IMQcJusfLHy6u9aKIPie8F+qSr042kB+6fEfpPgsvzQJ+RHod+rzb9FwV9CBMpzg0WclFSOXxcMzhwRIHGsCFr24ixH1+yYTgjfTxx6tRvwor11iKdJa/ItGPPEYyS6zFm+brsuNSFZacuMdJV/1WeAH0KrNOqXWh+tvtnf27o/7ey6f+DlV8S+rRy/dZ9AH2EUFixyU5IKKNgrHzq3OWYhHkLl6wNj0rcmP0tRPIwJZTW1MalLlyX9R1wQXvEZvo3oO/01Jy9uHjFmvCYpHmLVixZuZ5gRZTiLsO0DWf3HDz2wcefEayI0SJKCWcu2NdkbPs6LG7xqk0xCfNhXGIEtx3lirWla9Ztnfp1FEb5V8mApn/nfkdHN+gDm34nMlQYF3bsPTRtZvjCZaumh0XV1iEoJVyqQ8OiE+NSF478cGLpyQsQKSK0SjB+Tb/7Toi+oS+jjITSbjsuY6wTpYT8EmNq+qLkuYsSU+bvO3QCJrj9h/MmfzkjIXX+4RPFZy/aSE4B0O9hOWEdCPvM0LdjjMlaPWrsRwsWr1i9LmNWeExhienM+bqI6KRvZkbFp6TnaUzHiw2Dg0elpi/Zd+jEilU5U6ZMTUydc+3mHZ7lKBplEG0zng2g34HOuYM+hD5EgQXSHosQGPWoy+ZPgT5wCOmC/iNLKY9DHycdOKkStKS6Pfdamq/dvIVTMkG5+1rIfVHQB+YylFQQQoZx4Wie7pU/vfndzr3Rcalffh1GMrLBXPmH1/966GghSvAM78AoGcYFjBYxVp6/bE1syoIL9aQd7xzSSD/0HQ3X77d2uBqb/NAn1Z8Mfccj0G9o+Bmg391751fov+jS0eF7CH3gHdEdrw9Z8OzQR2knQrkIxolSws27D1q9PtV1DSdVmnUjhIySEskpO/Ye+uKrGSlpCz79fFpC6vyKU+dhSjBV1MSmLMjctsuvRz/e08AiajelgOKcYCHX4Ww4cqJgzLgJiXMWhMckfTxx6mU7TtASgnMnT1+cO3/ZirUZJKfgjIRSQvnJcyM/mBCXPC957qIhQSMvXIFxRqpHqINHCz6eOPXTz6cBlxWwyEYy6u177e0+Hy85UVLCWP98HzAF49wQKX8wfmJMbNKKlWv//NZ7BmvV+TosMWX+2+8NGTV2wpvvDMnI2V5rI8BspvtyX+c7lzFK7gl9V5em799DRIgkpyxavvqzyV8uXrZ23EeTFq9YdwUiLBU12dt2JKQsDItKBgogTgN30ofjNxhaeMl943bLjbutjOgE052uIQcYarsxUUFJiWBUnakqeMT4L7+JnBUeN37C58fztblHCvoPGpaStuCLr2YkpaaX6Mz//tKrucfyTWVVC5du+O7b3fGpiXUwybMSSdsksuw+st4HJ7Tj8c1Y6j1kowcvotl6hJW6fDS7t7Eevjc9/PQV4GWEUw0sf/Vuc9uPt24yohOhHL23E9qvGdgJCWPVJasztmzfjzKKnQDmtZ7aSW82/XttbX6bPjC1vQjod/2QYFTJ2dDu892624KREkTywDEJo1SUEg4fz3/p1T9GxyX3++NfCrVmmOByjxX2Hxx0thayoxzBqCSjYqSEEiIjuNMXrU6cu6Sm1u53r2IcGKtilEywssP944NWn9NzjWRdOO3AehnXn1E6d5agtBMlnATl7LLp45T8CPSf4yo9NX25y7zzVH76vzg9/4uWx6EvPwr9523cvUG/CcVlnFQJxkkwam0dEhGbPHLM+PiktNlRCeM/nfLdzv04p1Scro1KnLdx83Y7IfSujPg9Zxzdod9w9ebd5jYIxhcuXTFgSGDy3EUzI+LGfjTx2x37cEq8YsNXr8ua+k3YxXoUpYR6hKqDyU05373x1wHRCXPiU9I/+HjSkpXrSU4hOaX6zMUt3+9+9fW3cM6BMko9xlGcEyOluw+8bd2hTylIp/XARsiH8vR/eWfQzLDoOWkLRo39KC55Xk2tfe2GnKTUBZFxKW+8Nei73YfqUNZOCBjr997peqJuC7l3H7HpA+hDmATjEsU5TWUnp82M/PCTz+MS507+YvrXs6IKtWY7xly4AustlV9+E5k6bxnFOZ8A/et3HkIfeIygTJ/Qx2lFa6wcO37ytu17S3TWjZnbxk/4fNfewx99MuXQ0cJt3+/5YeeBilPnX/7DnzFahHB2++6jhw/lx6UknDx7iSY5QcJForQF3/QI9CnuMej3eBUvDPoIDeZqyoLl64F5B2Dx0WOeAH1a/JmgLzo8XdBHGQmnHQihEIwTo8XcY3lv9x9UUKyfGRGXlLawHqHOXbK/PWDo6fM2mnehpERzTppz4rRiQ9glqzMS0hbX1NpRRnky9MGO5Z8MfaUP6D+q6b9A6P+q6b/A8ktDn2Y9dlQgWRdOK4ePa76cHr58zaYSnVVjLEucs2D1huxzV1BDWU1M8vzMbbv6NDRRnVvhH4O+taJ6Zlj0gqWrdeaKY/n6jJztcUnzz12y5x4rDAgdEx6TtOfgsfKT52jBUV5zYco3YanpSwzWqqP5ml37j4z/dEptHZJ7rDB72475S1a98dYgmJJwzoWxTpxWCFq5fa+9L+hDlDorOnV2ZFJBsbFIYzx6omT8p1OM5afPXLCfOlu3e//x0eMmFurLgPP+c0Cf4Dxg5WBj1vfTZkZmbd1eqDXnFRtiEtM2Zn9brLfu2Hto7abNEyZ9uXTVBoJRu0FffT7ogy6H04rBWvXBx5PmLly+IWtbVGxKyIhxeYX60JEfbvt+T+6RgiKdpep07e9eeV1nrtBbKqd8FaHXlX418+vqMxdRmKAYu0iUPkA3/L2gD3YSwJSUvnTtt7tyIVIEjkb/cNCnBIJxwrgM+svBo3khoz6AcNZYWj3+0ynZ23bYUS513rLw6JSDR4p0pqq8ItPy1ZmX6gmCURcsXx8/Z1FNrR2mJDCeoYzyK/R/LX2VntBnpN6h/1zSHfo37twH0McoB9juRPDunQeOb8r+oep0LckpBKPmF5u37z5cdqq2vOZizvd7DxwrBm7FfZ2/O/RJ1tFw9eadB60Gc/mCxSuqTtdilAxTUnnNxSUrNhosJzNytk+cMiM+ecG8hauKtKU2nNdaqmNTFlScrMUomWDUcxfh+YvX6M3VmZt3xCXNT5u/YlP2D4AOGOuEMJ7hXXcfeFu9vUP/CsZ/NSuuWFeG0SJGChSvzlu4qshQTrIOlJSM1lPpS9eWnaoFru4wpTwr9FHaaSekekzI2rIza8vOK3aKEZ04I+0/fPzbHfu+27k/Zd7iWZHxS1auN5ZWwwT3qEG/02uTk3uHflfgjZ5u5jJGi9VnLsYlzwuPSUqeuygmMe3g0YIztVcWLVu/dOWm1es3HzxSdLEOj0mevz77+8xtu76eGbN7V27Wtpx9h044FDeMXnRy1Y+bdyiuHub80H+cQQ9bYA+XzT6gDxa6+2gk/hkhJc1ftu77PYchUnxczX9+6P8E6YL+zTvNGCnBBAdiMKCkipKSzlwWn5KOECJOKz/sOrRgyVo7ylWcrF2+OnPNhi2r1uWsWJOVmLroso20E8J3uw9t23nwfB0GKtHfYEipJ/QdOK2A/SUvEPo4/Tj01RcAfX8d/S3o9yy/Qv8pyy8NfRiXGaER2FVLT16sqbXXQTRGyTAu2RC+rKr2Qj0OkeLJ8/Unz9ejjPKs0EdwpqL6HM5IGKsSvPsSxFSfvny2FiqrOl+osZ4oNOrN1eASF+2koayGYFQ7ylGcE8L4qppLtVewk2eulOjLzWWnL9vozrAKIsk6CFq5c78DQB+jZAB9PygpyU5IhfoKnHPAuEAwKkbJ1acvX7iM2wkJppQrCGetrq1DeZRxYKyTFDzPCn2YVCFCgUjZWl175gKMkhKMCxDG19YhNeevWCpqCrXmghJLVc0lGBdwWnk+6CO0ijDO7gt9MC7Uw4yptKZQYy0xlBqsVQjJwwRXVXOpRF+uN1dXnKytxzhr9fl8rdVSdc5cdlqvK0Vp/PxliGNElkcksqxXTf+XgX7ngq0yb8kaYN4BVfCPBn2wHA12saCMcgkiio0VGOvEaYcdFXSmk0B7QEkpv9h8otBYqK8wVZwDrev0RaTs1CWwZ7s79HFGAtDv8tP3b3z5Ffr/e5df2rxDcR6YVO24jPGuekIE3Y9gnATjpHkPhInAnAKUaLDm2cvJ+zbvKM5GMHQB3x4bLjJCgx3lgLeDoDRdhmmYknDO4V+k5Z0wJV1BGIxVweYsOyGgjIJRKkLINlykxAaYUkjWgeDc7XvtrV6fILtwWsFYJ0SCoDQO4JMDtqcitIrTDhvCg1Bl/vBnnY5G4JYQ+pnNOwitknwDTKowqRKcB8YlMEGBSJEUXBirIrQMngXcBohc2L3inmze8TvAUJ1xIsEbplSCcSKETPMusHvITgh1KItzDpRUOuvIBYZG4K2PUWFnf0EAACAASURBVCrPOdp8HQ/afSKvINglJ1d927b672jTB1Ox5euyt+440GUAeTHQf3HmHYKVQSydrhEOY52g5XTFJsFYZz0m2AmJljyk4IFIGaYU8AE0RfAvcCp7FPqcgtMK8Dr71bzzv3n5paGPs+46REBZFyU1QbQCuG8nJJRUIUxCCBnEkOmclfeh6fe9kOtw/4hSAsGowIqCcy6EVkE4B4pz+4eKTpNul98eKXhgSmHkpnpM6IqLQPMeEPAAoVUI4wlautfc7UX1hD7Y5QsGia4z4LQDZ90o7Q81AciIMg6ccz0r9OsxAaWdYJcvEIJxIoRow0UQQALsxQcUtmHSQ+h31t2zQh/4ejNCox0VUFKBcf9wQvBunHOBjXVgxlaPCXW4QCtNEK1AmCiJ7lZf+/02H0PxnIAqdMU9eN3fC/p+YxolHcrTFuhKAfTBi/qHgj7OSBAmEowLY1zghnHOZcdlOy4z0tWubc8QKQvO6zZcvIJwoC5suGgnJNF1AwwM4JERWu4F+ozkh/5PufNfof9fv/zS0LfjMiU0QpRaj0sw7UA5fzAGknWDXgdTfqe6Tjfqp4U+cNmUHU0EK2OsWo8JgPgQ6fdKhHEJoVUQGQ3Q2U5IoP+DewAABZ9RUiFZNzCqILRKMCrFKjfvtPYKfTshdP0W8B2m/HMFgvPUoyJCOXDW3X1L5zMv5PJuMEMiuEY7rqK0E7AJ6K02XMQ5F8a4wOUIzvMToQ9uFacdIMyvv3ZYJ6APICkY5yBSxgU3IXpAZCGKc5OE0OxtbfP5CIymWUgiy5qxjX8v6Hfqv8pFO3kFYfwB8v7xFnIxWgRNDqXdwFADkyrGNWCM6zLEUUIjaPBgiCUFD2hsNlwEsXe6QiE9LfSfW36F/n/14vV1gGwvrV6foDY8KfDWs+7YolwoIyG0SNAelFS7/PS7evLDIK7UY/IU5wctA5j/MEp9GHvH+aP/KRgnRPkt1PATd2w+gRfgfgAF/Db9Dp+ouP3mo26+EN0jgHY92lNeF+uM/I6T6u0791pafaJ8rfvGlq4Nis+Ele7vszP2joMXm27cbrlxtxlszgJ7nTrN+j32K/2N98+oCOXopLaM0CLMqBDjICgHzkstXl+7twOnKYrmnXjVHXitD4nvQJJakHm3sXVuMo8jYYxywLQLpl2PV3pnaF8RYXiEllHaiVNu/3Yz0kVQDlZw3n3Q/uPNe4zoBKEZuz2yyw9oyoHQqp0SMd5hw3lg/vJXK62ipIKBgICMpw6TMcaFMS6IlGFcIlkXSkqq52qz19t04zbBqBjp6mpswOMW+PsjneMHGAXB3BSEdUI6A+QRnMeOyyDGKsyoXZ2IYFSwOevW3RaMFICy1UfX671xPpTODCRoZzTQLp1AdV3rbtPvcf7nakvdt9HBpIrTDmfjj20+37Ub94G9ERwP+9PyPD/0O/uOTLCy7LraSawnhaT8FfpPVby+jg5f+y8F/Q4/9Gn1RUNfpni14erNuw/aZddVjJIRuif0nyvYSBf+UFLBaYWgpYfQp0W/9alX6PeIS/63L/QI9JtbvC8S+p2X6IL+9TsPoQ8CJXbPmfOU5++CPk4C6IM49S6CchCC7Ic+Q1A068QrbyFrvFhsd+gLpB0nuzWAnou3ne+tM+MH5Xgi9OWe0O852rEq8JHdnZu351D+ZRuJUTLJOvYdzJsRlhgdn75y/bZiQ3WepvS73Udqr2BgJQbC+NKqml0HDhRo9Cgl4GBsQARKaOzSpjHGRfINIP5d1/APop/irLseE4AyDnaHEaIHYR02UuoOfdHh7hX6DzvFs0MZ6Vz37hX6D8Mw/AzQB2ZVf/OgFP9k91k73a/Q/5lLx7NAv4+m0Odf+4Q+aAp9Qv8podMH9BWnH/oo4+iC/jMTE7S/XqHv7YK+0h36ffaTp3h7fuiDzFn/RaAPLoH5E12pGCUjlAOmPATlJHi1B/SJ8tvo6g4sth1NaEHTbuLrPASAfud99mbSAR3+MegrGOXoBfpdt/1YQ7LhPEpK1acvfzEt/LPPpxssJwlGRQkxPj5t+Kjxc9KXf/7l7AVL1q5cmx2XPM9SdgqnZJxUyyrPZW3+blN2TmllFcUqOKlijAcmncDgDnR5lHbWIQLIYULyDTjrtmESiKcNEQrBO204D1MSyih1KA9aLESpPwv06Ue5/4Kh3+383aHvT6LS8LNAv6sNEKysOH+F/gsrHb7nhv7fhloP6N+4c/8R6CNgFv8ck03w28eg77kGvHcA9OWH0H/emIKPQB9neoP+0zG3zwNoFeky6PcBfRBw4pnvvw/oc1LD9TstN3rG3nk+6GMPNX0AaxdMeXDaSfBqq8/n9XpJmqBp2g99PKYdTWjuBn2S7H4q+eFi0guFPsU5MUrO3rpr+uy4iZ9P37xttw1mWMGdmJS2cNHyOjuxaPna6IQ5KfMWJyTPLa86jVMyjPHf/rD/y69n7dy7D8JwrcFapLHma8tKT17MPaHZe7jgeLGp1kZctJNHCw079h/L01jKTtUePF6y6+CJ3bl5+VprTa09r1i3N/d47onis5cRgneCjGYwqT4O/Zt3ml8A9HvWO+gULxL6Xf2Ofmik6gZ979Xr934O6HfZ9Lsj61foP3fp6IJ+94XcvjpP70B5dug/zHn7NHDs+/xPgj4tAhBAtAKSVT2f/BLQf6jn/pLQf/ACod8ZEN+v6QPot/l8Pm87RREURTmJ0tvoyk7oz3sM+jJYr+viPkJ1rZr2Cn2VoJUe0KfFhwu5j7VMGBeu2Kl5C1et37RtxerM+YtWVtfUYqQQG5c0ZGhwTHzK1GmzV67LXLM+Myk13Wgtpyipvp7cunX3xxMmffvdDyazNSY2ceHClUtXbdiU892syNg58xfPW7T0SF7RsYKSaTPD0xcvT1uw5Ptd+3buy125btNnU75KnrugxGD5cvrstAVL5sxfuufQCYgUbbgIEQrBeV4Y9J+ojfmhz0jPD/0+DugJfYWglV8A+g7Hr9B/MQW8uDYAfZAYneyeR+1vGi7+hvRu3gHQf4T7vUTj+1vnf4J5B6fELj/93nXAp5GnNO/8TeY+xYUA9J/TvPMU5+8Off5Zof+E0/akM8yoMO3CaQchyO0+n8/bTtEYRVEusuIOtqYDj2lHklqQeTfx9R6iQCBhnHQgtAozYo9s3bSKUJ2ru51DwlNA/+Gmwp5ZdmWUlA4dKxnz4aSPPv3ys8nTRoz+aO+BYwjOJSaljRr9YVr60nUZW4yl1Rmbv4+JT6k6dQ4jBQQXjp7QRsYkHjmRV6gp+WLa9C3f7tibezxtwZLhY8bNXbgkIjZh2ep1G7I2B40YnZq+cHZU7LLV6ywV1UtXrR0x9sNvd+zesffA+wEh8xYtmxEeu2jZehvOk4LHb/d/VvPO09XvI7DuBv2mB62+ztDKvUH/Gc/fZWrHKLk79H8O8w6owV+h/wKLH/peX+szQP8ZuNkH9LsUus5z9u4h+vzQb/zZoa+6XgT0H3qYdIO++AtCXyFYGTza80Af1ALtghkVZkSY5WFGhBkVpx2EIHVBnyYZAP3Ohdz5IF2iQKA46fD/lhE70S/DdJdLj6sT+mpP6Mud0Pc+DfRhXEqas/jjz76KT14wZ/7SSVOnL12xtvayPSoqad6C5SjBg0iiWVu3R8Qml1WeIWiJZOQTBYa09MXmsnJTqTVt/oI6O3b+ErIha9v0sJiDR/N2Hzi8N/foD7v3T5o6fW/u8cMnik8U6U1lJ2dGxCXOWXCxHv1u5/4Jk748cCR/X27+sXw9xbnthFSPihjjevHQf7yHvljoPz6udE7O/NBvvNbxs0Efp2Sa/hX6L6x0h35Hh/e/N/TlFw19HqRX/GnQd/3DQF96Vuh30RlmVIjlIY6DWB5iZZxWCEHy+ny+jnaawmiScRFVd7B1Xiy2A05uQRbcRjPcRDFHYiArOsSKECt2ol+GaQfEuCDa8xOg311kfenpKd9EbMz6HsYFnJGO5mvmL1mReyw/KXVBQnI6iEwHU1LOtt3xKenWytMkI6IEfzxfv2T5Go3BeKKwYPHyFQTDI4S8c+/xmeEJy1ZlbP1hz/ECw77c/Omz45as2Ji9ddeufceS05b855sD45Lmf7fj4L7c/ElfzFyxJisjZ/vRPAPYvQx2Wvzs0AcN5r8X9J2/Qv//Z++9v9vInX3Bf3XP3fT27e4ve87ed166944tkd0I3U1JzrKyc5Bt2QoMHRmUxZxzJkVSObAT9gdQssYznvnO2/vj4HyOTTGggSpUoaoAFP6dikWIQS9RsYit26RYayayxX9oKPwDzDvI1A7ShUi2FEk1EpnG4PTCJqTR6FPVE83QqxhqoxP/qVo4U/49VH8GmjkrnKnS40vJbK3dP7kYmpXGYLQyka0dpKq3lzj/pcaPFGWmEc02IplmOFmNparxTOns0jAIKVQb0VQhki7frhn89oTnnyNFgxu/uiImnqyeXJxfDu1Cpfv95DCdIX5Sz8/o89sroigyxfrxhXF8YaRLjdGklapF083fSvUfb9Ldy1YPMtVIdrTaEc2UItlSOFdKxjuZUskklm2RTLaYSqWq0U9Xsf9OIv9Eov+kR/7DSfReJ/m+lDxIxivxRCecbYaz9XC2Fs5VItkRoqNcQHdRuznnXIuna7li4/zK7J+cpwu1HzMrfOdyOZIuf/gqTj17seoLRdLVZKGlhaLP599//OKbXXj3bPZtJFFOZpv70eL7Fd/Mi2WffzccL0USFa+88/rDSiSV2g6HZ5dexTOlaKbiVrb+zcn/p/86BrhH75bXfeqmE7j+3/88DvlnU4+XAPf0//nne//lX8Dko8VPX2XIP/7n/3L/nsO18PIz3dEfzzYjqRp1EOl5sXKjrRNydHqVzJTplrMR775fVFL5GX+jmVI0U6LE+RWnUrVIqkYHTzxdqXeOhiZpdgY3+/TLdyuPZko/F7GbafjXwniQGt3fSVOV3IR3yOHxeTw92swWzdXDqVIsW4/eHg/8a2jcvRw0ma2VG4cWsX+TP//H8rfS/9Pyfc6k4Z1CtRlL50fH1pPVH/CD7viNTP6IcLYZzhQj2VI4WY+lav2Tc90m1WrvdvK/3c9+kKqGk9VbgY9kKzfjcjQ6fxfRTCWWb9BNnwfJcixbbR4enV8blcZgtKyXre0nK+F07SBduc2M9o+0/FbL0J3+B6nR9evxTOni2tJtkq80DpL5cKq0nypTEaUZ2/8SIrcnFe5cpRJPVvsnp2eXRr7cufVU6Imb39D/ZjL7CX1+FnrKlhqDC6N/rlOlfzsdjk73/MMsPshUw5nvxwvoWm44VUikmsl8dmiZpkFS6UIqmavH1i4j90nk/7Cj//t15D8eRcdayXe51G4sUQkn2uFUK5y+vTmr/MNB5d+xBJPVeLqWLTUurq3+6WWmWP+Vv/Vr0yScqsQLzd1YIZKu0oPEyUIrHC/RhEL70UKudBiOj7xAaown8+39eDmWaRQbhydD4/D8bD+ZoY+gHEmXOjTbXb7ciSZLlEe0cno+lm7Pp/eb05+kiqOkSXuxUjhTjtzcuVaqt68t0ju5iCZL4VQpnBrdt3zwXfOWf8bf307MI8lN1yIpmhqkHEuVK83e+dCqNLuJDGXQ3VmkHEn/tP6f2l40oJcqhVMluiBET+S2+yfRZIluS6UXQUdSNXrb7e/iD5R+NF0Ppxujk+GpSjJbK9W7FrGp3v+D8rfS/5Ni3y03Sj+aKnw3wH+Ng3TlBqV/BOFsM5wrRXPlcLIeT9ePzq9MQqqNwY9m/k2mlzv1Vw7SlYNUdYSf1B/J1qjSp5syE/l6Z3B+odvV5lEsW43m6tHs908j6Z/W8zNEc/Wb413NSKYezdTimdL50DIIKdZa0UwpmquGM9WDdCWcqUZz9b9a/6/Im/1+Pfrx+cWFbudr/XiuEcnWornRMcvvBPkBP6fP7yJb6dwq/WimQrt5M739UPMfsTuaqcXT9USqmUq2U8l2ItWk4ZREppEo5gxCiE2SqXwqmWslfMMYIuH/i8T+43X0/z6K329k3uQyu5F0OZzpRtLtSLp9S+Tvk9nPwkrJUa7QC90enF1lS41opnJjHNAR1byD+kGqGs+3qJahS6n0OFUsW6cb6g8SNNRWi2eb+wma2qixHy8XG/2Todk5OUsV6/uJUjhZ3Y0WqcKiuaFucniU47laLFulCfvov3S7ToQm5U6W9+Plg1Q1mm1Esw3qHcYyjVi2Wmx2DEKOL4aJke08Eoqbe2hrkWztH+XvzViilgRNJRLLVmvtwaVBau1eKteMZetUIkbfzFSjmb9cfzTbimRrt5c+JjL1RvfYIKTdP4una9F0M5pt0W7GMo1ouvmH4cHfwe2nt0o/lq0Wa52/lf6/T7Ft27Isy7pr6Re/T+zp76Yo1Wt/CQeZBvUQ92KVcLI6OLs0CSnXRpb+bw+vfv9ttvEr/KR+amXTAE4kW0vk663e6dm1Wa736enQ2/DO6IK3v9j+kQuSrkWzjUi2Fk6VIsn8yaU+tEmuXA+nCrE8lcnKfqp8kK78D9R/l7yRm73qx+cX50MrV+1SgRyxI/nXKo/m6j9z21PFZu9seHh6nSrWw6lSOFM+SFdoN38fP6k/ki7HUrVYshVPdOOJTizZiqVqkXQ5kWlEc+khsYhN4olUMhlvJd1nB+P2wf9qRf/pKvK/9GP/rZFeymZC4XRuP9UMp1rhVOvusvbIbv2Nr0lxkKjEUtV0oXZyqXePzpKF2s3dk+Ubx7F+F1TRHyQqqUInVejsx8u3liZNk5AqHMYyrf14mer9g0SlUDsJJ6v52uEVIc3ByUEyH8vWo+lmPNukNYST1XSxS1NgRkY3c42ifNFMjea/o2+OrnDJVKPZxn6yEsmMxi2N8xQabYOQwdkVPVky6ki6dpD5c7n7mdKkP4xmaNSrUm31qdJPZhvRzO998y/WTw35SLYSy47c02qrf22SzuCcntU4SNXD6dp+qhxN1w8Sf2TO/74HkB4dxw2na5Fsjc6pdy39P9D7fyv9f7TctfRj6fxtoPAHT//Xslf/U0Qy9Ui2FMuWDxK16Hel373ZK1KJ5m4G3CglfeVX+LNnRUe5KqvRXD2aqSTy1Xb/hKZhGHUhV6fewMgK+4kS+YP6o5laNFeP5Rs0bBrPlC6Htm6TXLl+kMzHstVorko/jWX/IZr8qn46xEc3jlZosvhEunR8fnFxbeXLHbpQHM2UaIrdH+nznVB/2P7fxGpy5ebxhdE/1zPl5mjDTKoUzdT+Kn2oZR1NN6OpbjTVjWVa0Wwjmqumcq1oLnttWpZFkulYNh9pplf6u/+VxP5nkvyfhvF/Ok78l07mRSEbiqVz4XQtkmlG03SRlqI22kL6gzr4HtOvJjLVbKlxdmn0Ti5y5XosW/5V6D9dj6abt+vktzb+bbKEaLoezzZHuYgTlUiqth8vJ3ItGiGJJCp0/0+1eXRpkHb/OJLMx9O1nUiBzgqJXCuebe7Hy6O7du8oslimQR+3Fxul5dlPlGjW1Ui2tp8qxwvNaK56k0xwFNPvn15GE/l4pjRKn3drplC5+Ef5e0OffGMksKlSPFOqNHsXul1v9VK5UU6ISKYezTYimXo0XY9lfz4+f1L/QboSyVZi2XI8Nzr0O0q4NriIpyvRmwSFo8hh4o9SXv8Eo5jYwejMUDmVr9KY/t9K//9vuesp0cNZuXItksxGU7loqhBNFeiNDSOkCnfE8h9COFkNp3OxdD6arMaT1cHpmUHsaqMXSxZo/XeDkvQu1t+ARjx+v/5Yiia9KhwkiwfJfDJX6vROrq7Ncq0dTRVutlSWaKCZyu0d/Hn7o8nRjefhVGk/kYumcol04XpomxYplBuRZDacKhwk6e7yYixd/Kv0uVnbKH+vIZVPpvJnF+eXulWstOPpykEyH8nkY+kila6f4Kf13575ohykyFdaxxfDwdlVrlynvD5I5iPp8u9R/o9odRMHGAXiwpnqQaZ6kC3HUrV4vmgQYpskngonMtu11HI//G92/D9Yif/tMvZ/DmL3muk3ufRWNJmJJksH6VF0OJaoxBKVWLJEA9zRZOUO7gzFRD6RLmUL1bMrvX9yni/V45nCQSobSxfpobxYqnr3t7FUOZIo0mtt4ulKMlsLxwvRZInyjt5SEo6XMoV2OF6IJIqpXP0gVowmK5Vm7+yaZtnMx9OVdL5F73uIJiuJDI3w0HZWY6kazUI6ugIlWY0kKnS7VDheiqTLNN3bfqIQTpXoREtTYJbqLd0mg9OLRLoUS+ZiycL34H5q1Os/Gp8/UCZJk2iWD5L5aKoQSeZj6Xyl3rkc2o1OL5kpx9JFuggR+b67pvxX6w+nSuFUIZzORVOFSLwQT5XbnYFNSH9wmkiX4jTPWqYUzxSSuQrNHvq7uB2QP4B+epAsHiSL4VQhli6mc+VStfV3eOffoViWRTOUUkuf7t5J5UvxTD6eKcQzhXimdINCPFP4Fc9S5T9FPF2LprLJbCGVaSQz1aOTY9M2Gs3DVLqQSBfimUIiW6aIZ0qJdCmeysdT+Xiq+BuUfxc0pR8dJfFMIZ0vdQ+PLq+MWr19W38sXYxnSrF0Pp7K/87I+5P2V5LZWiJbjqXzsXQ+lSumM4Wz8+uhblaqzVS2lMgWI8k8fXosnf9HaHIXiUx1hGw5kS0mM8V0ppDOFM7OTq6HRqnaSmUr8UwhkS0kM8VEuvIz4fkZfW7rv8vEeKaQL9UHpxe947NcqZrMFpI5+tFvhPNP258txzOlaLYwQqY0cn2SpXSxaNnEHJJ4MpbMhKupjZM4dx75TxfRfz4O/9dudKKR/JbPRBOZfDRTimbz8UwhkS6kUqVUqpJIU5VRSqQrNyjdoECRyZbyhcrZ+XV/cFwoVpPZQiydS2SLiWzxzqAd9Tqdq8ZTRbr7niq+SDKfzFVS+TLteCJbjiTzsWQhlsxlC9VEupTKVpKZcrXZuTL03vFRNJmhJ7aSmWpilHu8nMxV6HWV6XyDTqsHsXwyW0tkRokfkhl69q0US5Vj6WKmWE/mKtFMiZI6niqnsqVyvaGbxvHJWS5fSaXzqXQhkR5ZP4lMNZmpJjPVn/L3jvj8wGJqoCTShVSu2Gh2r4dWq93LZIuJdCGWzsczpduxkcpWflr/d7L/mv7ZcjxTiKVziXQhniqm0+Vm69AwjOPj00KxViq18qVmoVLPlyvFaqNYqhcrzb+KUrVVqDbzlVah2ixWmpVGu93p/630/x2LZVmGTYhJSLPXq7UPG51uo9NrtPu/QqfX7B42u4fNbn+EzuCP0eqe1dudZrffap3U64PL6yubWP3eSavdb9E6uwOKZmfQaB/9g9XewWn78LTRPW4eHjU6vVa7d3p2Zejk9Oyi0ezWW71Gd1Br9xrdAe3CTfvvdOEPn1hvDVrdk0Z3UO/0m91+9/Co3mjpumlZ5LA36HQHre5RtXVY7/SbnUGj/ZdaTrt80mif1DtH9U6/0e632r1Wu9dud6+vLwkhh72TeqtXbx82u/1W96jRPmp2jn+Cn9Kn2Tltdo4b7aNbJjY6ve7h0VC3L6+Gze5ho9Nt946a3f7vtf9P6z9udgaNTrfebde73XqnV+8c1dtn7c6g3m7ZhBCLNJrtzqB7VN+/ys4NM4Ke5a+yD88K749qe512s97p1w4H1cN2vdttdHqtdr/VOmq1jhrto3rnqNE+abSPbvC9/Z3uoN3pd9p9yyJXV8NOt9fodH8YtPVWj1Kv3j6sN7rdw+N2Z1Bv9WrNw3qr1+oe1Vu9aqtb7/QqzW6j3W91j5qdQbPbrzc6zVav0z1qtnpHx6e6aZxdnHYP+81Wr90+rrcG7cPTZue43ho0D4/o6KV1dnontJ5KvUOJSfnb7By3uieN7nGtPbgdLfXWoNE+anYG/aOBTcj1td5sdNutXqtNu0B5fdrsHLfbf0z/45ux9J0+zc6g3uo1u/1Gp9dsHR4dnxJC+v2jTrfXavfq7cN6p9/oHje6x83O8ajjf1b/CN1+s9tvdAf1To+KdrszaLf6JydnhFi2bR8fnZ9f6Gfnw+Pzi+PTk7Pzy9Ozq+Pzi9/F2fnl72JwenFycX18dn18dn1yPjw+vzo7v7661v9W+v8uxbIsgxBi6gaxCbFs+vftBQXUA7AJuTYNk5CfnYkwbcsefZ8QixCb2PZ35oyqMIhlmCYhQ0KIaRHLpgk+bWLRzy2b0BfmDW65a9/BbbFtQhs/clboQyzdJpaum6OqbOtuEHB4Uy19ikGI+Zv6bz/V7REFTNMkhNB/DcMiNrEsi/7coDXTcw53Wm4SyyTWDRG/d+3Hp5gmsYmpG5ZNDEKGlmnbNjEtk1jD4ZVtWsQmNiGjuyMs27zhGiGWRXSbGIRYxKapk+5Q8rbLNrFt2yTEILZOeWQRYo0aaRH7lnFUnHTbMn+vnT8DzdpkENMg1tDWLWISYpnG0DSJaRDLMEd0t3VCjq9OMmZvm/QPSD9hHpWsywGxLWITMvzeYNO2qPc56ohl6MTQiWnSIWeP/rFsYpqmZZiEWCaxhrZuEmLb9tAy796zQbcn3CXI9yFkE3KHKZT4twrFpiPftIhlEsu0LMu0LfOmAaZtGZb529p+i9un3zbAsgltom4OKfusoU5FxrSub/j4K/m8K4bmD+23vtPkV42xLMswR4PcHEmzTQgZmrRV5uhbd0bXnX7cvjLuyMt3ESPEMOkbBlUFtk0MyzSJQQzdtk06+C0yerD9Oyeobhj0a75874VNLGIbhBjEpIPKsqwbYbC/ZwyzjN/OAX8r/T8tlmkbpn0jUZZtE3JlXt+MA8vQr219SGzL1oeWqdvWkILYOjGHI3k3R6qHmAaxTGLTQU5s2zYs3SbEsMxb4bsjh6ZFTNMemta1bRm3bxDLJKZhW4ZtDYlxfQN99CBDt4bXtj4khk4sqpl12zapHFJ9YRkj3WgYhm2bI5VsGbZptCyuBQAAIABJREFUWfaQmCOMOmIOiaUT49cY6TFT16/vzEwjKpk6IYTopmESotsWfQQhlmnqRDeJoRNzaFvXtnU9IpFhfieUZRL7Dohhmdf050PLNG4k2Lp5YRjUA7MMSyfEsi1az5CY1zePuCLG1W2nbjCiFTFNYujENkd0ICONYxm2YViU50NDN+3RAT06EfyKCH8MS7eGl8TSb4/4UUKZOr2VxyKEXF3rhBBCLoh5SEiTWC1idIg5IOaZZV/btklsYpnXo5Yb17Y+JLpODIPoOhV8m+iGeWXrV5R6ujmko9M0TfoYg9imaRLLNkdssm40rUHMoWVejxhN6f8d9h2mWMS2aBdMU/+VFrz5f2iZlAs39ZumMTSNoWXqlj38Dsu4BTGuiaXfSIR5O/kbhkGIpZtXlNWWQVW9MSTWjTq2RlOmTYhhEkO3LYPYpm0ZlmHa1GYyCDEsYlBeXxPj2jJ1YtNfGZZlGJY54rpNbJOY+ojjumlQKtn6kNj6jSzfvL7zjmlcjaRP18lwSIybLhBi26ZNdMsyTNO0RmqdDltqghiEGKYxtC3j+1x3F4Zp68bPR5ppmToZddIi5GbSpfPfjcTRI6V/K/2/VmxiGZZJlf7NZn3LtIe2NbT1K2JcD4/6J7XqoJTvZdO9bLJVTHWK6U4xfVjIHhayvRsc5jMU3Vy6nU11S4Xzbtu+PDP0C0IM0zauTYNO4ES3iUUMYpp0IjeurvqH/Wr5sJA/zOWOCrl+MUfr7BZSh/nUYT7VzSV72WQ/l+oV0of5VCeb6BZSR9X8eaty1q1dnxwSe0iIYd1YA0S3R2agaRBzaF+enXfb3XKxlc928sleNjnIpWhtvUJ6kE8f59LdfKZ70/5uLt3PZY4KudNy8bjduDzp68NzQnSLmMPhkJpJFrEvri5HmsW4JtcXV4NOq5gZpLODdPYonz4qpvrF1GEx2S2kurn0IJ8d5Ee0os/q5jPtQmbQKJ526kQ/J8YVMXRiExo70oc2lXZDvybEIES/Oj+67Lf7hcIgnz/KZQf5dK+U6RTTh8X0YT51VMgM8ul+LtXPZXqFLKVhN5fu5nODYvGsUb887NiX54RY16ZxSU0449Z+tIitE+Pauji9ajdOqiXK0H4x1y/mjgq5o0KOtn+Qz/ZzmX4uc/vnIJ/tZdNHhdx5vX7dPzSvzm2i62RIbMMaXhJbp9MMIcTQLwm51PXBoFtq52LtTLydSzSy8Xom1sknu/nM4U2zaf1Huewgm2sno51s4rCcP25Uzjut4aBHri6IbdC5cGiZdKY0TZMYBtENS7+4OO71G9V2KdsuZHrFXL+YoYymoJ2i/RrksyOmp5P9XOa0Vj7vtK6OerZxSWd527a/e4q2bZqmTYbG9Zl+PLhoNbu5dDuT7BVz3VKuW0h1C6lDyo4b6TgsZHvpFKVYN5vt5nNHtZo+GJDrK+vqitiGYV5Rj8EwiWVZlj3UbUs3h5apG6dnx/V6v1TqF4qdTLabSx8Wsr1ioVPMt/P5w0KhVyweFgo3opc6zKcOi+lBuXDcqJy165cnfWIObduk5jwhhFiEmGRIjBG79SvjuHdcLfVKmcNiuptL9gqjEdUpprulTKeYblFhyaeP87lBPtvLZg9zueNy+azROO91L0/6xLqkcjdyOAyTqhHTuJlCLk9OmtVuPtPN5zq5bCeX7eZz3XzusJAfvcjlf0AvX+jlC0eFwqBcOmk1LgeH5PqSWJZhGFd37MXvU/tvyt9K/0+KSUaOqm5Qglr68ILYOrm66OYzxd3thM+z9e6Nf2FOW3i+/WrRuzgjLc7Ki7Pq4px/YQRtfjawMBdcnA8tLQSXFtTFOf+rxfDaSimoNlNR/eiQ6FemqRvENkz7JnBjXA563XyuuBOKfPvqf7mkLS6FXrxUFmbv4Lmy8FxZfKYsPlPnp7WF5+rijLLwXFqYVpZmQm+Xdj6+PlhdLu8GLjs1ol9R8+gmvmQS49o8PT4q5AoBLba2uvXunba4JM9Pa3PT2ty0f/65ujijLs74558HZ6blxecjzE/TZwUXZ7eX5rc+vd9d+1IK71jnR8TWiW3SkItOx54+NHu9bipWCmnRja/aq8Xg9FxwZjY4N+tfnFEWn8kjPNfmZymUhVl5fkZamBEXZsSFmc13L2JrK8Wg2oyHjX6PmJZl2Lo9MsaJRcj11Um71khHswF5/8tycOlFaG4+MDujzc0oC8/lFzPK0py6OBdYmPPPz/rnZ7X5Wf/CnLo4py7OKQuz8tL85tvXkS+fUhsb7VhUP+qbxtAko7CUaZqmdU2IftVrN6OR8mZw7+P74KsX6uK8ujivLc1T5t5l9C3oO8HF+a2XS7uvX4c/LucksZ/LGGfHhLpTxLCJpZuGZZjEtM47rWJ4LxcMhL+uhBZfhObmt5cWQ0tzwcXZ0NKMPD+jLMzSZmvzs9r8nH9uLjg7t/liXp6fVl7Mb398t/f5Y2xjvZOIk/MTMhySm/CaZVnEMMj5+UW13oqHc0Ft9+sn7dWSvDirLMyq89PK3DN5flqenx6NqIXv7FBfzQVfLfgX5gILc7tv3xysfEoHlMN8ilycE8MghOi2pY/8YIsMry4PG61EJKfI4c/L/vlZdfa5tjQrzj8LzE4H557fIjQ/M8LSwuaLxeDSoro4ry4t7Sx/zEhyfXf3uFoll+fENkzTvDaJSQ1n45KYw8NKqbS3k5bl7ffvlfkFbWkh9GJJmXtG6UPHj7Iwpy7OKwtzysJz2jV5flpZmtFeLQbev9pcfpvQpJNqyTo9JpY18odMm9jEIqZxeXZRq7T399Lu9d0PbwMv59X5aXX2mX9xRl2cGUnBixllaYb2KzQ/E1ycDSzMqXMz2vxc4OXS1pu3+19XCtv+s2aR6Oc0PmDbxLKsoaET2yQX54NSvry3lfRtbL97HVycl+dnKKSFGSrdNyyY0+bn5PlZCmVhTpuf8y/Mh1683Hz7dvfL56Qo9jNZcn5OdN20LZNYxo2zYN9ofPvXtv7fSv9PikkINfOvh4YxUmRXp/VKMejXXi2tPZhaFwQPxj4MPcDhhU4Pj7w8Ejkkc1i5AxUBiXWKjENCUMLIi4CXR9KkIM09T66vHudz5PrSsPRLUyfEItfD02IhLcvqwqJvcsqHeC+AI/DIyyOfgH0C9AlQ4qHEQy8PZAHJAvIJ0MsDD8d6eeB1QXESb3BMaGE65V5tJ+PGybF949IS8/qwWsgEVf/LJffEhI93iYiXIC9yQMSsiFmRA6NHcECBLH3t5YGXBxIPZR4qHNQw9PH8OoLq7POiKvVzGWIZxDYNyxwSg9hGL5ku+ET/zHPvpMsnQB9iAoDTIKdwWOKAl2c9Aut1Aa8LKDyn8JzEY4nHPmEEr4BVBCQebkxg/8JcThIvKlVimrpNTEKIaZGzs0EmHf76WZubkR5OuQFQsEuFggqwhKDIUUJhiccyRjJGModlDtOniC5OdHEbGHk5zstxPt61vbiUU9R+qUgsXTcs27aJrQ/PB4f5VNq7EZiZ9fCC5HL5eN7LcRKPZYETOeTDUOQQrfO3cDNOCSOVE0TEixOT269f1Xa2rjt1a6iTW1/i/LQZ2Y+urqw+mpImJySeVyGnIiQh6EXAixgRsyJ3y3cs8VjkOBlxCuY1AXugcx2xXoF3c3iDF7Zfviyr8kWrSfQrg5gGsYltGYe9+u7u7qdl34MHbhe/iuEaBD4MFQFpAvZzyIdZkQM/QOLAOnb6BChiVoRA4vGGwHmfPNp6/7qyt3veaRHLpCYKsUy9d9hJxLfevvI9fewVeBlxIsOoCGkTnA+zMga3oCOHwgeBiKCIoBehDQjXOd47NSU9ebz58UM3EbUGh8Q0DEKGlk2Ma73fau5tbn944340KU1OiBwSEZQ44IFOETMSx8o8kDiWvpYEIPKsTwA+AYoc8GHWw7EeHnkmOO8DYf3BZPTTcmNr0+z1iK3rxLi2hrZt6kf92s7O/tu3/oePJR5TIviAU4GswkGZhz7M+jBLRc+HWRmzMgYS/dpoJPCyIKwCVpt5HP72sRbduT4eEMu27NHUddpulba3Aq9ebDyc8kwIXsBqDFBdSHZBSQAjcKzEsRJiZB6IPOu9A0kAMg98EHkwdnO8d2pq/+37WnDztFoj5uiOP4uYv1qH+Fvp/6VikJGHb9tENw1i6+T8ZO/rp/UJ1wpk3QjJGAV4vDXB+3lWxU4VAQ2CAARBAEIsCLEgCNggYLcwCkEQgmALo00E/YBRWEYF7AZyengu/P79cb5gXl/YxCC2ftSo7b17Kz16vMFAmYGbiNvmuE3MqwjR0aBwQOOABoEGgQpYFbAqZlXMKohREHP7WoZOGTAigt5J1/bbd91kglxdEmLpxDirF3ZWP68/efgNAQ/jDADkZ0AIYoWDKgIqYCXE0qGsAtbPMLcV0voDkA2wjN/p2OK5AEYSgh6eC7xcOquUiG2YtmHZ18eVYnDphTwxteF0eNnxAMduYmeIRSEWBBHUIFAQIyFGxqzKwwBkA5DV0I/Yg0h2jHmAQ54UvBOTkc9f9N6hZRlDW7euz9ux8NbLJZ+LExFUARuCUGOQ34kCLAxAoCIgYyAhVgaMH7ABCIII0kdrEPgxCPLI7+I0DFXAigzjw9j38NH+15WLStm0LZvoxLzs5xPBNy/cLl5E2H1vXGQYGQAVAaqz/Bjcxd2Wj95E0I9gEMEA5kQI1lhWefY4+e2TcXJKbKIbFrGNfjrhe/pwHTs9HJShU4WMhlgFMXTeFTkgQmbEa3QDwAYACkIcYBk/BgEeBwUugDkZIx/PeyddkbXVy3bDsoc20e3zs+rmlvTs2SqHNIxvAAMYBREMAtbPOGn9tNlB9B1+HgZ5FEQgiGCI52SMPJD1Ctj97Ener171Dy17SIihHw8qWyFtfk6dEHwQqABuIi7EggDLBiBQWMZHLQnMShyQR7qSlTGrYejnUACjAEZ+hGWMfBB4ILvm4vzzsxnZS64vCSFXl+fk/CQtub0PuHXs9AFHEIEtjHYEFBKgDMcVxGiI9WPGDxx+OOaHYwF0X0X3ZM6pYifliApYBY50tBewPoy1J8+qmyHz4sgmOiG6fnVaUOTA8xkfCxWWUSCrYtaP4C7HBwEIAhC4ETdKrgAEQQRux+1I7iCrsIyKgIiZNYFVX8xWw/vm2TldUdeP+lGf1/v48SqAHg4GpoQggrsAqtChQocMx2U4riCHhpx+4AgARwCNa2hcxeMyNy5z4yoe19B4EDtGEgRZGQAJc9Kjx4l1Nxn06JKJbZs3sWhC/lb6f7WYNORnEGITXdeJcV3e2Vx/MOnGQBa4wASvQSAx4xJz3wfHtImR/etHMARhCIIgGikCBTlU7KS81FinyjgCkA3ySJvAHpbxckLs27ezRp3Y+vVRN6qJ8qMHEs+rAIZYEGCcKuOQEOvDrIdjRJ6VOFbjgP9Gf6kASohVIKtAVkXgRoSgBkGI52QAPCwQXVPxLytXtSox9fOzQcnv8z57uMYBmYdBDod4TnI6VIQUAVFFKXHAJ0BZQAoHqTqgY1rGrIpZDbEBlgmyjI8ZC3I4iKDP6fRNTsU21snlCSE6uTwKr35zI05moIahKrCq4FTgL1T5+hHUMLwx/ViVhypkKPxgBDoNhAArsw7VhQJTvIdlpAcPK1sh+/zUJtfHjVL480cvAhLrDHBQg8CPoMzxfiz4OU7hIDXuRA7IPKTKdwQMbpWyDJ0qZql2ljm8jqA0/bSiyhfnx8S+1jvVyNeP3zjWzY4HObyFeQWyfg4FeKxhqGLWz8MgD/yY+UHv3/4pQ6cMnQpwBnm0OSFIiPVAp/pAKG2HiGEQy+pXy/5X827MKJAN8PzmJO/noQ84PMjhEYA0gRUOaiwTwpCyYGQsQ1aDIMjhAMsEIKtCRmUcfoYJYaRw0IsY78MH5Z2geXVCiH5ULmy/fuXGQOZHY0ZF4Ha0UJrczohBBEIYUo0fgqMeKcCpQsaPgYahhFgRMqvAGVxaqMb2retzYg37udTe29duwCiQlVinwjL+G62kIuDnEPURbx0IarvImJU4QIeuCtgAZP0YaByQMatN4FV2zD8/e5zPEUsn1xdHqZj4xOXhGJkHQR4FAas6xkXnmBc6vDx741tDFbMKcmhoXOXuK/iehMdU7PRjEEQwBGGQDgAOBTksM+yGk/EvzHWyMWt4TOzLdiauzj7bgNCP4KaLkzjWwzEeZlxxMAGMKN38HPJzaGTbYRTgIG2zxgGFZzSOUbFThY6dKV7hHW54f02AW+/eHBeLRL++vDiubPqVp88kzPk5TuKAyLMiO76JoMIBGbMSx1LppladH4Nbpa/wDoV3aJzDjx1B7FCZMY0dDyJmE0E/gusAKLPPG3tbpnFlW8NRlNUixP4dnfa30v+TYhJiDE0aHLUMk1xdfHv2dJ3jJX6kZ1XIBDgoYYcHjfmfCN9DH3QccIAy0udivILTxzkk7FB4xs9DBTEiO+6G9wMTvIQ59dlMZW/XOu11c3Hvi1mvgH0QaBBQF0HGrJtnvgnOb/zYGu/0cIzEUTcZaxirkKM+soSRwmENYxUhDSIVQBEyIgR+YUKEgjj1uL29TU6OBo3y9ovZr3Bc5IDGAQk4FA6KLrT5/JHoQjRA5OZZtwt6JhDV+ypmFQ58d58RoyE2hKHsgjJmVcapQeSfmvr2cOqsWTbN85Ny5pvLJbNoE3FBF15Hv7i5X0ThvgidMgaKgBQByTykzoTMQxU7b6Ehp4acAegMQGcAI5kHbuz0QkdQ4HwQibPPB/m0YRylQ5Iy/VDhgB8wGmIVDriBQ370QHkwJU8KHgF845zfBMY9iaSHgsojDUMVARWzlDUqZmXolBCjCcjPQwk4ZB56OLgucJsv5lulPLk+60Z21x/wHo4NTHCS0xGAQHXhwJSgTXAiZkToVHhG4RkRjSs8I3POH6DwjBc7tQkscayHGZMQo3CAOjfa0iw56pGL8/L+9gc0rrqQBpEfuoIQqwAqEFIzX+JAELB7LAhh6MdULwAagpMx0ASsIZZ6BlRHBxHQOKBMoHXEht696tXy9vAsG9J8Dx6oPApwrIpZaRQvAjQ2KAtIEUZajE6ctzNWEAE606s8pC1XMevnkB9BTUBrAtz+9umy37bOjzKKT3zgkqGTTociZCQOSDx0Y2YNjHsRI2EkYURnrJGzglkNsdSVkfHoTxU7JeyQsEOFDhmzvikh+PG9dXZCLk/9r+a9PKtMIBmzKmRCGIZ4TsTsGse4H+B1weVxTfhcgpdHPo4ReafIj/u4MYkfV3hG40AAAj8L/Syk9r7kdGzxnITgVw4mNe9lr0aO2tuf3/seujzQGRCQiMa/onu+x7z6cFLlBEUYRcDUCU6d4CgLFAFRTS1xLH2oxDmpPe4Fv4jol8AD6OHY9QlXORgiJ4PTTj31+ZMXoSBAWzznxc4NF+vmGUWAwSdT/ieT8iOX7yHvm+J8E0jiocQBBTGjRwiABnao1eXHjiDPBLEjABybHBIxuyIg6fWCOTwnxjWxTNu0bPNvpf8/WmiEjBBCdOOqVl176FrjGJlz0qCbiMYVfE8U7i+z/60kfd1anJMg9rNQgawInUEEAhz0AIfoQh7oFDHrd3EyYGQMVB5JHBtEQIbjGsdIHIh++qh3qhm/pMxM+wQo80BBjIIcEudcxw514dH2x4XNz282l18Hlp67eVZCrB+wfgQlBH0Y+p5O+RenvTwKQrzJYZVxbkEk81ASgMaBEAs0fjLj2SDHnWZs1wfHNBdQeEbFToUDbp71v5ir7gQCb56vYufqFFzF7Obi8+amvPP4kQiBwgLVwexgQWMZmYcSDyXEBCArIUbloYyBghgfcGxM4OreNjGuG5t+z6TLB0GAxz40Lk6wXsEpYoeE2LfOX7JBn7gw40N8kOU0iHyYVVigCVi9VaYss4l5mWEVAVGTUOOYAAcVDooTfNevkH49vPLOM4EkjlUho3HAh9k14NxZ/1wKKqGX818xs4rZ9Um8++5lyv11d/qpwmEVIU3AXsTIPAhhuOlwbnFMADo1DigC68X3N/A9eRIHnzwsbwbJ+SAneQMTLj/P+rEjCJ0+5/jm7POE9PUb59zgnPIk1hzjGgckHu5OCBJw+JBTdSGVhzJgaHBJ5oEPOZUJ5EPjEuf0T0AJjGkc43swedyo2cbl1vslRWB9mJU4EAD31ph/2Z7kNpBzjQOZly/oIPE7HX4ObTqYAEArgNHW3vknJuUxh8xhiQOic0xjxkIC9PCOVW5MnYQqdHgmhK8PJs5LeXLYDb59s8ZjlYd+OKagMUlgNAHJAHxDTODD4s6HF5uPJjWMgxwvM04VARmzImY1DDUI/IBVOCi6OGlS8NIesQ4/Bj7klDm89+rlcTF73anvfXwnC5wMnZscUMC4wjM+F7MqOL2PuL2FZ7GlmcDTSdEFRcwEBKQyY5uY3YRMkHUEBKBCxyYHNHZcQ06Zc7q5ca+LkTHYQA6ZB9rTh4NcirRbyuSkF47J/C8Svidih8gBD4/WXFzwzYuI+2tswx348jEmuw++fNyAUINIg0AT0CbiNAYEMCchKEJG5REVQJFDfgRlHkosu/Pq1VmzqOfSW3MzoguJ2OHD970Tjq+TIL72OfRyfsPFeyAr8fgbhuFvH7fev/TyyA/YTQ5TP1Kb4Nad9/yTnIgZH8f4OEbCDs3lkNEvHviLh0fJryuk224nozvPnwcFQWLGRcxICCoAr0EQer9YDUhZaf1gdTkhrkc3vrofTY4cfcBvQmGLExQWaBh6mHGFA4oAPa5xP+8M4jGRG/NxDh9ixAmX9/nT80aZEP2SmIZJd45aOjF+UGh/K/0/KbeHPmybkIvLbiK6Osn7JqCfHwUl/Tzr550SP/4F/Ft3S46+f6cKrhAvyDyU+ZGH6+HYNd7pm4CjJRrsULFT4RkJO0IYUpdQxMzumxdn1VzYs+qempR4KGJG40BAQCJ0fgNjiZW3F6mDfnRrENnKrH30TcCRiYpYD3B8GvsltfG55N/YEIDPOe7nocaBIGBlHkgCI3NOP2BFhCMrny9r+ZzfK2NW4YCCHCpkJMS6ORj5+sk+bJW3pY2HwvIUlmaedPdCV+X09swz5cGE6sIahjJgfIjxuoBvArrhuIIcIhqXONaHmFFQYgIlFa95fpJa/7YhcF6W8SMoIUbkWTcclzjWwzLK3DPSa1Q2/T7XRBBP+hEOTAnr0LEOx73Q4Z+Amy4kQ6cHONyY8WFW5FlFgCp2KsApA8aNQeHbylU5vfVucUMACgc0xGoc8EDn57FfSuEtq1PNiu6Npw++uJD/xdxJInKciUUWF30Y+yASObSBgU+AMgYBlpWww8uOKxz0Qofickr8uIiZwOREVpau+63ExqrM8TJmVTwegKzoGN9dnO/GdtYE6OZZN89sI6xA1gOdPmbMh5w+jnGzYzIGEuv0T/Lr0OHjGJFnRZ5VXWh9/BcVs5suTnGOuyeETi5rnB2r809V7JQxkHkYhOMyNx5EzDoztrXwnIT3/VMTG+z4NkZ+DLYw8iHm3di/HrfSvilhe8JF/aTABB+a4CTs8E8iH+fwwjGNYzw8tyJwvdjBRSGnLs6vcUjlYRA7ZPaeNgFFzPoAu+biituKWcun37/x8byI4MgJc2EPR81YIDvG/C781XnPIwAvdorseEiACrgvcayEYGh+rhXfPypnQq9fSDxWMashpx8z645/3eCcq1Mg+e39ya6/6Vurb6xsTT/yYdYHnAEB0QjeJoI+5BShU0JMYILzgvuaC4hoXBVYGQM3dkqc0zclNCP7erkkCoKEHW7wL5qL8U9AWUCfGIc2P0vq5camP+NeL6tyLaCRZj29/EGdEEQEfRDQBXy6dUKe5NbAuIhZCbFeHmkYehEjQqDMTB9Vs729bf/jBx4O+ic5Ed13c+PrD/FJfP84dqDOT8tTkx6MX/3rf2/vBePfPvkwlpnRupcXOmUeqjxSOCghVpvgvHRhGY8p/JgisF4BRz9+1MulWng38OiRn0MKoCYjVAB2c3hn5c0gvBn//KEiurubwUFkL+ddk6cmfU6nwiLRCXws9EGguQTVhSUO+BDj5h0ie19hfpEFhzIBJMR6Oc779HE3Hbet66vvJ/X+Vvp/vdDsC3QbMrk4r2yF1l1IEkCAY2XoVCAb5FGAY73g/gpz7/RgZ//9O6/gCj16pDyY2px+ovKch2V2Fue/TrHSU5d/ekLknSIaV7FT4xiNc4Qw9POsisclxAQXZ4/yyd2Vj+s8lngoYlYGjAJZlee8PIp/fFfyedYfCe/BLyto3COwXp5ddf7ixoxHAB+d99LyajboeQ9+8UCnMoFkHmiIlTEr8k6JH1ch40Zod/ndcSYW/bYsQkbjgIbYIIIKhOscH179Zg4Oy/v+nOhemX1cDCi9THTYq8mzT79N8f5nj7ZnnyiPJ9ZdYO0B1GYeeKfQ9rNJRWAlAfiQM+jCMhz3TuLdr5/M0+ODNy99PC8yDI2i0plJ4sCH+2PNrUBlf5McNrXZWYlz+VgYfDi1/XpWnZ7cfPZAxA4PuL/9/JHvESc9n9Qeurw8EHmWLsf5OSQLXOHrl9NUeOv1vNcFVR76MfDz0AMcy/f+NbsXOm8Ue6lo6NNb+dVCeUu7KOda8f3dpSX54aPtmdnAs2nPgwl1+knw6RMfxr4JGHg6tfnssQc4NBcICEBkxzWIUmvui2Yt8u2rD2Mfx0icMwBZ0eHcnJntpSMrGKjPHsqPJv0sVHluZ+bZBscEnk4FHk/KAtp98tAHgYdHnoeC/Ghye+bZ1vQjiQMqAtsCH4JAczo8k65yNKIf9T2TLj/j1DCWMApApx8zmxCs3P9Xz+MJkkmtYlaaFEIQKmBc5sEyHnvt+O/6WcU3PSlNYIkDIoIe6PQJwIMcGseo0KFxjOoCHg6ucqi7GRoc7GnPp30YKhzwY4cfO2TO6UPMBoTa0nzTE7O5AAAgAElEQVRuU7muF3LeDfnpoxXIylMu/5NJ8QG/yjPa04faw0kROuVJrD6Z3HvxfG/u6fZjl4bGgzyjCKyEWP/00/JeqJ2JqoszIgc0jpHAmAzHvdCxzrP+xae1oLi7/Gb/w+v8p2VpUliDjIeDa85xHwTU8RIneOnhxBoH1pDDJ0BNQCp0hBCjYejjGJlnfC6utB06T6d8GKvYqU6yKnaKzjE3YL64kF7Jd7Y3vyK8zvEbmPt4737x6zcrlZSmH78bvxeamQ7MPNmcffYNMcrTB9lvy+E3S/5HEyIeKf0N5FQ4vDrp6pVSRckrT7kkHqs8UsC4B9zfmOKO4+HzXKoSUJQnj9yC68W9f2sfbO9+eOtG3ObDR+KDye2nD3eePVFcfODB5M6zJ6rg8rAgNPlg59kTETOqwGoT2MtxB+/enWXSxZ2QOMGrCGjIqQqshFgRArcL76+/qyruL45xt4NZg2jn/ZvW/lb88wcfxpuPH28+fSo9nPJPP91w8esIbj59Gnr0KPJybntSUJz3Zc7pn+QkxHoR8jx+WN3btvSL0dnLv5X+/2ihh5pt27aJoRcDituFfXAshFkFOFXABhEMQNbHjH2896/ne/vBt6+02dmq11P0ult+WXv08KPD0doO7q+83n6/UBNX9+enFQFqHF1CdPoB4+dZBY0pHAgszJwUkgcryz6X4EWMIqAAjxUIfSxcByjz+UtNUrZfLQbnn2nTj1Z5sDaBlJnHu29eKDNPP3Noe3W5cBAUF6cPXi8Gph+vIUdwUlAx6+McEj+uYqeXR/vL70+T0fjnDz7g9HMohFEQIIVFHtfk9pcvzXzO/Wr+PBHLhrRmZF9cft2rZUPvXkW/fS6JGznvWvTb8nveKS08bW0p+bXluudb6LEgu6DEsRrHaBzjm0Cby2/JxUn05QvFxasAhiAMAkBjUBtOx+cJ4bKYff1k6rJeTmysfuO5NQ51RV9n119SNvrb/t03ix/Q/c6Oklz/mFz/mF9+qz10+ThG5WGAgxqGIsflvny6TMX3X78QXUjjgAKcGge80Pnp/r/l9rajmhiTvfWD7V48nAsqKb9Y3N2Mf/qU+Py5Lss1SYp+Wk5+/ZLbWFuddClzTzIrnw4WF3wQ0OiEHzAaA9LfNi5qlfDXFQ/mvTwQeacKWJ/TGVxYaCQPVqZc0U8fo5/fq5wQWVysutdXHsDkt/dlz7fMh7cd70b0zYtlzim9el4QNzKrX1qiV54UPIxTBazsGN9xCd6Hk/ndXXtwtIFRyOkMIU5EUENOH3NvC6M1ML76ZHKYTb3jmLxnVQbAj2Dk7eLqzNQb5Bi0s+qbhcSnt9IE70Vo/8X85vxTeRKrkAkhxs+zXjzuw6xXwL1g4GRra3P6ucxhmXOqeNyPHTIclwX0FYG87Nv1fI0q7k5kb/P96w8cG1ycTX5+F1x87n4yEf/8bv/1C+3pw8j7lxV54yy6U/etBh+51sb/xc+zCs+IkAlMP63uh7qZiH9xxodZuryhuYDMg2XHv22+XThOhYPLbz49mlyfcH3l8IrAbb1cCszO7C4trSK8IXCR5Q+RL8s7H19vvllSph9KPNzk0Bbr9CMo80BzAWlSKG2HzlJJH0Qacrq58aALbgu8G6HPD1zk/Ogzz/mQsME6g5MTXga8+pf/ZpZy8vsXK08f1vxqa9t/uB3wzz/LrH82isnejn9vaU7hOZ+AVQS8PFB4bsXF90qprGddezgp8bzIOEKY9TBjG1Nc2a8crK20Dnaqsig+e7Iwdq+yG9r/svwFwMibNxW/XPWtdfxi6vPHvVdLDUk8ePXqK4D5T58Ly8uygKg/7UYo8vbdWSpZ2g16eCQhRkNORWB9iPEBdt2F9tbellW3OjGxCYW1ceY9Dw/E1cqm4nswGfv0PrvxNbzyIeNd/fLA9UXgun5t4A8cSt7s0kIQARE6FQEqkBURFh8/qG9vEf1qlA/DsgmxDGL+oNH+Vvp/WiyaJsG2bWIaBb8sTvASGAth1g+YEEZ025YImY/3fjne3fUvv994Ph1b+xpxf73Op3dfvnjhGLusFWLeVXFh5iy8m/+0rAquAM+LDKNhrLFOjWMU5JB5EFiYOS2mDlaWReq5I7pRhJcg/jLmKK2tX0Rip+H94+2tncXFFYHL+jZO0vF+PHx4sK/NLe1trJ81y4WAchbeH2yG/M+euAHQECtih8SPaxzjE+D+8tvzRDT96aPCYT+HAhCoTlZ0Au/E1N63b41c5r2AEx+XB/GY8url+ycPTprl4OuXe5/eJ9bW8pp0Vsx8eDwZ/PDaKubK7o3ahnvr6ZQkAEVAEnAEXdAjgNDHN+TyNPn6tcJzGsYhjPwME8CcD4LlX37JKL5OPPJ1/nlpb+uykl979nhp/N7J/m5k5fPux/cZxddKHrx4LAzb5ZzkKbs3Um9fKVO8Fzv9PNQQq0DWh3H+ywpV+j4BK5CVmHEFMV7oXLn/S+VgLyH7Pj96WJB8nZ0t79zz8NpKY29n59370KvXyfX17u5uSRZj31YaW0Ht7cv9lfcln0d78lTCSGLGg4gJIhCEOLPqpkpfxIJPgCLvVCDrYZzB1y8r6YPPTx4kfRvhtRVpcir5abmseF9PseVNsbkp77xYqLrX2wHl3RSKBz2lTTWx8c3KptuSjx4XoPtbvFMTuZ0dcnLiRmjLyYQQJyLsx4C6FCvA4Z6fPsul5jnGapaVyQci4I72dpSPr+ec948Oq97F2et4PDQ7t8KCo61g7ONrnwCDCOxwWGbHNvCYiFlxgj8KBU43t7anpxWekxCj8A4VjgVdeAOx6w+n2gc7kY017eO7o2wi6lv/4MLbr1/WZO/mq4X1J1MFcWN/+X3ky6fO3vbu108Z2Rv++H6NQ6FHkz7EKDwjAyYw/bS+F+plolTp0+VrVWBFzLh51vP0QUrcGCSjxaDqff70DWK2Pry5LKSbe5sniWhi9evq1ORxKto62OkmwlflbHjlwwpwqJjdQmwIQoUbKf3yzubpjaUvT8GAgKTxsTWWlZfmyEnvM88FHzxRXFiEwMMyb8d+OSkklxee7nq+DpLx8MbnlPur5+mD7Xcvz3KRnY8v3ZPc/9fedza3rTNt//F33uc+iSWSaCQl9xJ3Se7dsiR2iiruJW6JkzjFKU5OHDuxJbHh+QDZcWKnnnPPPB+yw8k4EoUFFrsXQBDYS0PQkIgBeD2GTYLn4vK7J7uPcpl8S6OGsAH4RYlkubt6S9NR0dEGe+3kwIeN1Z30XEJG+4vO0vxMrqXtuWkcrS9tzU/uq5kXS4WV+ckDW9tOz5l9PYeKcjA+qYtYR7xJYAbC9aHhj7s7hyvFBRlpmLcwZ0oC22SxIKPF9NCBuZCB0OKgTuTxJmnRmH+5tax0tb9adraVuQd27nhnrTAxtDwzcXZ/cy+TfjA1ttXTXSBYg5yBBQsIBhH1lqZXS4vUrYT0iuA18L9IHUTpH9D/sYT145lBEFC39tA0lLiYF2EeRC3IOxiZAp/HwBLR6N2/TlaW7fGRIZFkBrpn+jrOD/a2Jib6Gho+HR0qyYF+ruHvcvlgcsqS4haRNIBsUXYEwSbARFGdgMJgz4dHu8sz41mCTQJVwOkCpyPBIHhOAAdz84eamu/pMdvacnKs0N/7uGCt5tJL83NvV9e3x+ZXMtm9xXJCluyBvtPV5QfT07ooOhixHQV5zGtYWB0d/nh/Y29y0hFFE0K2808R+LQorsxMvz98lBbFrIDWxkZHBLDQc6/y+rnW2TFJsNrdW5wYq758NhgXMz2dJ0tLWSmWBjgfF3OQY6BfjJEcEUoTw+HHk71UIgcFQ4Q2hhbPWQjM8ZFZzHsvn75aXXxRcl4tlejrF+WpsQQWzu5vFhJD043NI81Nn94c9XW1HD/azXa0ZSDRMVIgZ4jAwoIJOJNgXZYP5ucudrcXk4M5ERkYmICzEFABN9tw59Fi4cVScb4xrjY12W3tEwK/OTP1ermsdnfNtjZZif4XJeexrmY72/f03Iu1xWcFa2d2ZgFhWxILCNjgrgWjeYJ209mz54drM9M6JroENJHTEZ8RODs58GhndaQ5vmcbxYmRWYRXR4aeOfpIC3mYV7YWpkZhdDkx+GaxONYWO3/95Mmi88BUj2zzlaYoCOgEWDLWMJ+NSQfLy/TsNCeigsDnEdYQdIhgNEKdi05F7qTvtb3d2WjHHP34d0aOTd6JfNzYzE+N3YtGT9+9nI41HSrGczu/NTFxXHTyne0KAjYERQwtLJgS1LCgyuTvYv6kXHA62zWCDCzYMsgJdwwsTDX89VDJVB7uHS+VD03de3LwcmNZ7b1XSgwcqjmr5950k3yg58qjqZWZ2T3byk9OPC0X97MLMwLIAl7HiIF+ob3txVLxeHcj39ulIF7HUUsSVL7BkZAtS9OAn5TJytT4y5XyM8fU+7u3tYWDslWam3i+VHxWsOdbm99sLi/030vFiT0+VH24a3e2mBLSI3dLAFpYsAmvyuTxUvF0fzeHsUE4DUdNxOsCp8vybFOMvnmxNDo8GeUVEWUJnAb8bJP06XB/qqf19fZaaWZ8vInMNYqzBObamz7srs+2xRZkVJRlk2Bb4K0Y0SBIN8aOH20/VrL5xphBRBtDC0YVGNVaYm8WS6ujI2NRbjkx+GFjrTw/ebi95kyOLaeGT9dW81MjYzIZiYuHS4Wlhelcqm/PUN6sLD7SlHJHhwI5Awu2hBSEVpOp092dJ6vFhThWsaDjqCHyOhIshLIyXp4fOnSUOQx1Is9BNNYkr5qZxytOaTQVvHx8Pzf7fNE53lguTQzfz83vatnRuDgvAp0AGwnsSJoNgYlFvaXlxWKZVs8/ny5iqZaCP/v0f0mCkF6l7qu5jwv5bExiK48G4PME6QJnE6BLYPju//+wsWonE/OtrQ9t3Z4crj7Y25+aTjRETh7tZ/vuDUQb3jmFhxOTTrxRh5jtsCxCbAHBwIKCQGkocXq4vzI3lcZEg5xNQF6EihDNgugU3/A4l36k5eyu9uloJC0Im6NDR8vFLSNbmhxfGRvXG7vW09ndkpOSSLaj9bicf5KdtZpiNsY6ESwcKSJeR3BtdPjs/ub+9IyNsQo4AwNLxgri0yJenRp7t7+lIGBDMk/IpACy9zreP9pxentXk6knurE6P/3p+cFQq2wn+93NTQWSLC/oGKkQGARbCORFmBPR0vR4cPZhZyixgARVgjoRLCyoIDrJ/bUxmXSfHpQTA2ZTs9Xa/lhX/76/PtvZ/qJUXB2fmJTi043N73Z3xnu6zp48NLu6NEA0njcJdGKiTYABeB2jNEE7s9MXezvl5GBGQqaEbAJsDFXAzTfcfbJafJTXzY52jRAFwDmOWx8bOV4pL44OL02MbizMPi/mXzn52aa4PZw4fbx3VMrne3oWALYxLhFgwQYVRRRR2M5lz46erE9PGoiYBOhiRIPcvNDgJAae7KyNNcV3dXUzu2A0t25PT74u58ebpJ3s/PrMxAQC68NDb0uFyUb59PHedHtzpqMt2xi3GhtzAq+j+va7XIw8WV8Jzt5nGkkeRA2MVAzzmM+KvMVzCoDqvc6P+3v3ROS9OcpIjTMIn6+uFcdGBzE+PX6RlVvSJPbh4V747On21JQmxUw2UUCcLSEDCyqGGYkcl/PvVhbtrvYsgToBlgjNGFCEqCLh45XygaasDSZLnV2lwf73O/e35ubKg4NPc9mV4ZTe0/WsYC+OjxiJoddbm293d3Y0xey+p8VkHUEbQ5sAC8BSe+eLpeK73U2nr0dBgGGcBfmySDJ//UdBIH+vY5iPKl3t71ZKL4rmq/XFdWVucX5iNT2l93ZPx+W3qyW1tysJ+fn2FvrkUZogBXI2AYsA2kiwCa/ExcfLpQ8P97IE64RzJGBATsNCTkTD3N2T9ZXX5YLT35tvbjbaW4z+rp3c7MnW2piEHlvaQz2ndXda7e1Wc0u2UT7bXVf7OoyWJgtgG6KiAEwCDQDYmv6hplgxyZJkCwFNuKtgLtcsHVnG1tBIhoc5gA9mZ58U7fPjFytzM4Wu3te6vTwzobR3ZDvanpWd5dnJidbYQ0sNnxwcZNIqhiribMI7ElIxXkomzx7sPVwuzjWKWVHQMG+IQEfQgiQri0tzwy9Lht7WbLa1KW0tq3NTh0uF8tSYMdDzbq2cbm2ajUmZ5sZsS9NeZv5ZwZrvbtPaZLuR2ARoOMqOX1hE0pqbXy4vhbVzl4bBJegH1P8z0/9FCSm9An0/eLaynI1JGhZswptQsCVsAN4kQBOF5J3/d7a9sTw8orS3HZULerL/dG316Wx6GpI3O5vZ3s5hLLw09J1UqtjUmOU5Q4QaAUWITYE3MFAQWJ4YOXv+eD03vyBJjoTYuSFLRkYcT/B/7aUn95V5qy2uYiEHooWulodGenlhwhzsLfb3Z1B8cyG9v2jbo4n7c5PHZWN7MplBURNCFXE24spIsDHeGhs9391+mE6bEOqoflQ9g6JKk7QxPfZ6bVGBXAmLGYymAVDudZ4c7Dj3up8sZPbmZ4vjQx+e7M4PtOcHe04dKx1pcGKygZEpSgYijigagNdi4urcVPjpbHcklZWxGkMq4fMyzgoNU/DOyVbx/tzkLM85JJ6JCEZr26ed+5PNTSeb9x+ZWjmZOtLM/fRCiuCTrfV8Z6cOsYNJfX895G0MdRGnRfwgt1B5uFdODi6ImIG+hYAiROfu3tktGw9MRWmMGRjpHJ/luQezUw+1heJw4n5ufkdd2F6YfVsumt1dU63xw7XifjY9g7AhxnWOz2PeIndVOZqN8Tuacvbq6cbMlA1RHvM6blBgwwx/x+nve7a3Nt4Yd0aGn5WKD8enXun6IyU9RuDuwtzu3MyEwK8MJl4Z5ggCW9n5o3LpQS7zUlHXuruLsqwLnEmAhnmtSXy2teqd/Z1pIQaMsEP8FoyqMWhznMYBtbnlYm+vS+BPHx1spMaV9la6v19IJXr4hrM3zwqtHdMR/mAp//Hhw3xPnynGlGjUkrEiCmynry7iBYkcLxXeb67afV0ZCWlYMKGgxmA6emd7KPGiaJt93SoSVQHPQGFf17bn5p173S+yymE2szE9+apcLI0OFYZGDvJWeXZK7+/JNTXqInYwcqCQF6EN0WLnvVcry+/3d4oDfSqGBhbyMrYgb3OcA8FSa8ujqcli773VkaGT5dLSaHJHnX+YV9REj9Z3L9PeorS1fNpaXR0dVtpbH8zP/10sZAm2YyQvwkUe5DEoyFBvjh2uLn54tL8gYk3kHHakS4Q5EaUJmpXF9xsrHx9sP59LH2rK282V84Ndo7t9gosYXW2vy/lnuvoqp2wPJPWm5ndr5c25iY3BgQIUHYCWIDKhYCE0H5c/PH/43NTtuKxjpCPeFPkFdFdtjb22zKWu7gKO20Caboju6bnTZ4/KE+PzAtkfnToq5F9ktZe69VTX9N7uIcQvjw2/0HLF7i4VC7aETNRgoqiK4crQ0Pmjhw+WCrNNUu4yy4IKBENAbPfO2Vr5cS59ZJtvl8sXezsbc9MpwCtdHcelwktDP8opB+OTWkzW25pfLzl7Zua5md4fHnDiKIcaNMzbuA76bzbWqFepg34QBixv4x/Q/yUJKct6yjIx+OfHL+diko2xg4kucI6EdMKpEpgBDUPR/3zaWl0eG54gwsZIai3Rtz088HhmbEEU1pP9arO4IAp2a2y5q8WSETvOo+OoQ4QiRhaRMrH4I8f2j18eGIrW2lRGsARBAfF2XJjDf6Xl6Ppw74OJoYKMLRmnUXRaFJbGh99urZ0e7D5bW7IH+pYnx15vr354sv1s1VmfSCkicDDKY+AQqEcaCpKkSdLu3Aw9PtpbsjNIKDTJJuDYruoMbnDa4/dHBpVYNEMiakzQZKiIwk6iz46LxZamzamUM9CxNTfiDHRonfFyX8cCjOoiVCBXikklCEoQaHw0E5ceLtrexYfnVm6OcBrmC4h3QENe5HJiw8O5FNuNo4ggDfmMhBaT/dNx6f3m6qGprU+Nrgwn5mW4IArrg/fsZkkTuRxqsGRgitEi4YqA0/hotlF+sVxy3zxdn53MyqKFgCMI7OzoQuSvld57i13txZa4IUMFcznCm62xcl/HbJw4ffdWU4MryYG9uamFltjiWPJF2VpPpLKImASXEHJ4riACReaz7XC/YNH3x09sQ5HkgkCKAtBxdJb8pY8nX22uDCOgtjQ/GB/bGBwo93SW+7oyEip1d5itjWkCrLam4r32XIzMQm53aGR/bHR3fDjfFtcJZ6JoSUYmiuaaGj/sbtKPb4ujgzkC81x0PS4Zwh1b4BQRjMKGbHdr9eHuGIHb8zNHpfzRcvH1cslJDYxi8G5lMd3RMiTBw7K9l5nNtTbOA84QoYUFh0BHQgp3N09IJi79/eB+9eWz4lAyJxIbQxNwCuQsGa90ta31ddktjQtIyCBBlbDT2Wx3NqmtktndvDo2sDg2aA12Wcl7W5mFtxvrr9eWjsrOg4V5o6VJx8gRRUcQNASLqcH3D7dPH++tTI6qMtEFTpeAIcMs5qaFu1pH00Mj83Z3/fXu+qNcdgTDbG/Xq82VkwfbL1cX12enpmLS253tVyvLx8uLT7Ws09m6AKM6EUwJ5mGDAzkdI6Wt6fzpA//104UmUSfAkYCJoiaKqiiixuAsjMwDbnNgYHdibHdibGOwz2qKpUEkjaKZOMjEwebI6IPxifXuvoxEiqn+1amhpYFuS8YFICxB6HC8RlDuXqv36vHJ3rp6r03DgkmgiXhFiJgxtNzbsXSvTcUwR4Q0iurN0nKy2+lpncaROcKVe9rvTwytJ/sL7S05ES1gTpGhHRftGMmDaAFyDoguxiWNoM2JMffZ4bOt9WJ317wQdTBZRNiORG2IDIlYbU1rU0Pbs2P7s+Pbo6lyV7sq4QwScgRazU1bw6mDman7Y6kFGc1CzmyN7Y+nNkb7N4f7NFHIgUg+LqoYZgk2WltPnz+jtSoNAt/1vkWW+wf0fyCMlyDwwjCkvu/S848rE2MZQbAQsiHIi1BHvEr4jATyvR3V/furfb2qKBoEs8PoNgTZhjuOiNUYyhHBlHE+TjTI1TcjEy4vQpWLLADkDCaO93Zo5fRkd8vp77UhsAUuD6J5kdPEiB7njUY4z/21JIAygnnAK0I0Dbh5IEwDfoLjVEimG6IzUJhGQpoAUyRmJLLIgwLiixK2MdQI0lpbjsoF+unk6GDX6GpTJKxBzoFcQeRtGWg4mgMRCws6iFpYMISoGmlYbYwb0Ygt8DoBWSFix4hOgAb5kiTmgVACcKk5ZnKRPM+VRWxIZKZRPnv+mLoXbzdXzJ4OLSbmRWhE71iwQYV3svCvvAh1PuIQmEdQ5SI6AXN85GKlvJ1M5jDOQYGtgRQINqINZRGzYxAa9x/2ijUHhUJy8O3+Nq2cPiyYSluLjlGJYEfgTcA5EmLZBWwkOFDIg6ghRA3ImQQoCGUBUCFKR6IqRFZj4ytNeakpCxKZ5SOGCIsYFoBgQG5B4kvD3cdPD2jl9PXqiiY3mg1CEUJDhnp37LGuPFeVeSDkeE5piBg8Z2OoQU6NRIuiZEOkRqIOJkVRMnhB53hLEjMClxEiOhEKMtSEuwq4a0qC2ddD378OPx3v2ko2JhUQNBrulkW4BAWVb8hJYH1k0N1YyyKUFoQ5ITotRKYid1SZZJCwgIRZyKnNMn2yXxrsVpokVYKWCI1ogxWNlDEqYqgg5CT6z44e0fOTHU1Rm5psWbIQKEJgC5whRFkCGQcjlkXDhIIjYgMDFdXXx3MxUuzpeJTXV+cms72dG7PjL0x1faDXxtiIRoqIKIRszEzVXj333r3aV7NGYzxPiMVHjWiDA4WihDXIz3J3pmF0TkQqRDkIswRPA36Ci8wAPi0IKsYn66tOf+84H5kHnIJ4DfOWCC0sWDBqE6DK0tr0OD17S8/eLI4l2dYXC3N5zJsgYkqCIcM0d1fDgsYBG5IiIo4A8zxfQNDByMJClhdsSAoAZRsaFIbLkCsAYEYaCgJfFKVcTLqvpoOTl9Wjx4tTY2ZTTEG8CqJ5EbI30uwkQZ7nLZ6zgMD247P3bTYEOhLYETb2rUNgCcGCwC9isCQhW+AUyKmNsUPLoB9PT14825wazcYkHaMCAAVeWBKJjoQFviEL+JzAGwDYEDkA2TzI88ARIHvMzfERHQkq4EwCNT6qchFNhmxLm0lADkRzBGqtLfm+nur7d9R3KWPauWTd+QrT/oD+D4SZzPdDRq1AQ/fvvW2ru8uQJA3BPEEqF8kKkf2x4U8bK49NNSuLioRzkDNEaEvIJMCUkIbrRy4ZYjJUNQkwCGdKSBGR3dX5dHmpdvqehm7w/u3mQtqIS4YIixIuIF7l/6PjBksSbMIXhGheiDhQKMjYkpFGgCEhq0myJVGFQCMoDTgVC4W4ZAHBEQQjekcTIoZEMnGpNDr06dkh9WqVs5MdU1loieWIUBCRzTdYwp08iC7JWCdAw4IlIgMDja2oCBxDUpZ0hTmfLnBsW06ei9pctIih0yjNE7Q4PU7PP1K/Rs9OylMTowJnxaSlRtkB0SLhHMLl4yQHIiYBeRkbWFBgdF64e5SdWevr1mPiVVYAFlc2hmb0Pw6K2ELEIdAkWGtuPiwVvA/vw9r5x6NnW+n5nBzTEXQgMLmIBXkVCyridMTbhM+Lgk14g3Aa5g2JqBjasqRjpGK41td9rOU2UgNKI1JkoImCDqIFiRgSUVtje+r8ReUkqJ5dvHi2PT5lopjGgUJXy8ftxfdLTrmvKw0idoywly4aihgib/DcVfK7en4bIDgY6XykGCOOhCwYzQPekZARJ3qr/LBgU/cTpRef3jxPtzYbRLQhKhCsCXfToOFIn69uLT1ZmNJkpIswh6KqBPUYzggRK0YUEcyAhrd59chYyMVQjggGm+MLvMNzjiDYHJdpbnxzf82rvKe0+vHF09JQUh1s7xEAABY1SURBVCEkL0ssNQjLqaBBjr0s1UGDAXiWVycHuRwR0pCfx4LWEttXZo9XnPfrpbONxedK2o7LaqShCGFOAFZnx/PVJXp+St3zd7v3S329KkROo2RgcJmYjzNEoEsgR3gVcE6jZMp4XmjIioIiggW+IR8XP5aslZ6OHIraEirI8CrVjx0jaUGweu79/XCXup/Cysmb+2szspgjgoFBEUMHRPMg6hDBglEL8gYAJoQWgFfJnUzE6yCqEt5EvEOgLSG9EWcIZ4igJJMSgnkgqBhnO1rfPdqj7ida+Xi0tZXtaFaaJEOENhJsxDlEcAiXhw0lhEoE2xCogNMgz1KTGjxnEC6PeZZ2jeVispFgc1Hzr/8pQmASmIsRJzVwvLtF3apf+cQ2MuVE4oi4CEFBiFp8Q0lGhgg1yF+lLbrKDMg252iYNyXInoHYNtA8BhrXcHVyJS3iXGf747xNvSoNvTDwPoO+/2fL5i9KeElE5lNaYwyAF2dH6yv2QK/a0qzKkinLViymSKJ5r3MqJi7ExHkR5GIkQ/gcEfQYzhA+JwGNICsmmSLRMTIlZEhIF6ERJ7OQM+917qpK5d1xGNSCsEa92ruDg43pCb2lScXQgJyN2PurCDugy/L2KEJEgxxLhqOwzQaYL8RFS4QshZkGOQ1yi01yFkTnRKQn+p7f36BejYaBV3Pfv3rqTI8qzXGnUXKIUEA8y+rHMseyvB+WjFTEmRI0RGCJ0JbQlfNpkCvGiIUFNq/UsDBHhHxqoPL6iLoVz6tRr3r85JE9lErLkiWJJuAsPmrxDZoMMyiqEl7DUVMSTEnIoYZye0yToSFDTRQUzOVQlJ3CzYFIEQslAgoiyvANCyJeHB/7ePSCetUgCGjovXuwlx/sz0jEksQ8QXkR6jGsSlATBZ1wOuEMka/jDorqEmATtxyK6jFU6GjMSYKCI2YMGDLM8A05KKhNTStT42eHBzX/nIY1Wqscra+tjIzqLa0TQjTTKrMsj3oM50BEESKWDLLCHV3iWcKs63h6GZy8hblcw//YSHAwMiSSaY6Vx4Zq799R6nphhYa152ur+a4eBYqWFM9JwhyOPMlOPdfmFmJCBkVNCSpCREW8hgVDhLMN/7GapJwEnmdny30dloxNAllONxsJFgKWSJx4bH1h3j/92/MvXFqlXuVxuWB0diqSnBEiCuLNGDJjiB0OZ1mDWD4iDXI6EcxGUYvjecylCT8vC/nuFrOz0WhrNFriqoRNkeRlKdvc/MDQa++Pfe8iDKrhx5PnxYLd2TWPoSoTK0Z0IrA9+7YMcuCugYWs0KCJghlD2mVHWzI6nEitdDSydCAGjFhYsCVsYJDGJNvcvG3otHbhhRXXO6fVT5tq1upsy4nEhEIJwSLiWXJKG3F2jFgi0pHAssAaV6miJF5FER1HNcxnRV6RgS4BJdpgIaBjpLY0bxlK9eMJpR4NA+/s45aRNQd62K4wGwk6f9cEd0siz1I2XaWfMsT62GlKApuN6YjXiWDI0JSQjeEyEW0IsgRa/T1PVxf9sw80cAPfrb49Ws3MZtpbFAlbWHAgZwuRAo5aMmIJPOqZ1xBvEmCJkPkwe/emYI7NHU0JOYLAnmY0BDMSmWtuXE7P0o8faOgyajM/vCRUCb6mUvkD+j+QS+40RgkbBIFHQ49efKq+PcpPjWXvdeR7euyOTrWp2entVTq7Sj09Vmtbqbsr39qSb20qdXZYzU3lrk6jvc3u6DDb2sy2tnxnp97WrLQ1OX33VqfGDkuF81cvaOCGjJIzDGi1dvrk0f1sJt/brcVEPYaNJnEBc1kMcjxnEmyJxISQbR/KE2RCwRR5lmDWgryFBUdCpgTtGJ7HUGlrKk+OHu1s0MonSgPf9z0/DKl78vLpjppxujtzItIIKDTJhggNjHQEWaLNvIxVvoGNMSw9GYsl/TIlsol4FYI04Oyu9vLY8MnhQ+rXfK/GGFNpGJw+fbo8OWG0t5lNjaYs2rLE8qdbItEgzxIUsxnZla/bErJEqCPBiYm2hHNEWOCjdlOT3dFxfyH94fCQBgGldTpW/+z0eGd7a27G7urMymIGAw1hDbHs+fVckgYAKhAMyDkSMhGfF6EjIZYIz45hFXEaAWoMZWVsd3VuZxaOHzygtQoNGU2jF7qVN48Plmdnc53tRmdnlucMgktNjSzBsiNiZihmFgYEV4ivgvoMXRGBHZdVUVTaWrZyaXr2jtEc1mjND2u0Unm9urEzk87EWrIEpyGfwWAecBkk2LJkAFDCYoGINkTLjU0GAAZGGoI5KBhxSQGCjhEjIchIaF7CelfH2tTExds3XvWjR12Pen5QDU7ev1lbLyZTSx0dthzTEDQwshBiXZBHkKU1ZSch2CIPG/szGOViUkYiGVmcE9GEEJ2LSXbPvX0nX/37LaVelVYrYYVSj55+eL66spZM2W3tqigaGBmAN3iOPfo4ItYFjuFylmtguadUwGUQtwAjOcKrElBEoMclo6VJjTfmE4mjlRWmwqNBNajQ0AvOPjxx8qXEYE6UNIJULGQxr8mIUTWogLuyfD11swh0xLNuMgnMCbwpkqIsmwLISKScGHjk2N7pCaWeGwYBDWlAg08nj5eK+cF+vbnRbJSNOFEloGDOgJeFS9AQAcs5aIlQgZwGeRMKLNmDLmIdEw0gHSOtKV4aSj5eKjIV7Gw/9aunL589LheKqUG1WbabZTsuZmFEBVEWUzriVRC9akhBInmCLBEZGDFmDpZg0ZJkU5RyGCuxuN5zb8fUam9fMy6mOutnGFxb2PkD+r8ojGHQ80NGqxb4LqVeGFTD2rn397vjne13m1tv1taflxffrK0fray8XF1+vb767v7639sbx5urx5vrbzbW3m5tvN3aeL2+yv5+ubH6anPt9PED/+9jxhB0SdVZpwKnoed9eP/33vaOmimNpvKpgXxqoDyacoZSheFkcShZGkoWU4lCcqCQHCimBksjg4VkXyHZtzQ8uDQ8WEz155O9+aE+e2TooOycvXhK/SqlXs2rTwEuvAoNPXr6/t3u/R11IZ8acFID+b7e0lCCFVhI9q2MJouJ3uWRRDnVXx5N5JO95dFEaWTQSfUVhwfsRI+T6isOJdfTM4crZf/92zrbaugzymbf92no0dMPrzbXtrLzhVTCHuwvDw0XUwlW+XIyUU4OlhIDpcTA4tBAKdlXTPQWU/35wR6zr8tJ9OYHewrDSWugbzudfloun714zijufN/3KXVdl4YBDdzK66Mny6X7ufTq9IQzmComU6VL+9SvZKqU7CsM9pSSfUvDg+VUf2looDQ04CR6lxODTn+vkxrYmJs+Wlny3r6loRfSgHoe4zL1aRCG/vnbN682N1YmpzdnpuyBPqu/d2kotTycKiUGnER/ITlQGOovDPUXh+t/lEcT5dGEnejJJwZKoyljoFfv7d6Ym32/v+efntDQo6Hvh55PA5dRnlZd+uFsx7LXF+ZXp6ec5GA+MbA0MeokB+3evvXkSKFvoDyYtLt7S4lkMZlyksnS8LA5OLCYGiolBu2BPmugzxpOLC3MvtjZouenjHI2ZITvfo2GHq2cnz558sQ2NmamysOp0lCynEyUEoPsKif6FpP9S6lEOTlYHOx3Ev3F1GB5OLk0NFxMpgqJpDOUslJJa2z4vqm+3d+unZ4wQ3k0cKnvBS4NPVq9qDx/9qRYXJoYZ/1bSgyWk4nycKqYGmS+mh/sKw8nV8ZH8sl+rberPDZUHk0tjg0VhxPGQI+R7F+Zmd7V9bPDQ1qpMEZ7Rn0b+C4NfFqrnD55dGCZm7PTxZGUmeovDCfMwb7i8EBxeKA0Msi6IJ/szSd7nVRfaSjBOqg8nHL6+0qJwcXUUDmZemgab/fu0/OP9VYwGvcwpKFLqxfuy6PDglMaHTIHewvDidJIsjQyWBoZLAz1O6m+wlD/1X+vgrE0lHSGEvZwwk4O5Af7yyNDj2zr49MnwcdTGgZh6Lt1PlSfGert/vZGZq44PlwaSTqpgcWRBAuu4vBAYWSAFZ5P9hYG+oqD/aWhZCE5WEwl7IG+wkB/YaCfObbR17M6O/Nyay04eU9DLwxqQVBPuhCG1Pev8ul/scLzB/R/JHWeM1p/SGIUemEQhn6dg9ut0Mp5na3YrdE63/EFY+VmFLhhUKOBS32XulXqVqlXo26VslBkwRmGtVrNdxlbOg0prTAmdK9Kax+pe0a9c+pXaK1CqecHVc+9CN1Lsu+gSsMrbusKDarUrwTuOQ2qlLrUY6prNPR9poDSMAzdMAjDkAYuDV0aVMLaOa1eUM8La+dh7Zz6VepeUL9K/SoNatSvBn7VrZ3XSdJZzQOXhl5wfkbdauXshIae79UYSXrNc0Na57amoRfWzqlboV6NzaDD2kVQu2AMw9Sv+dVz6tfq6qhL/UroXVDqUurSoEpDl9aq9OKCuh4N/JAGl3zFbLGScR241K9St0or53XGcK8aeheBe079Cg3cejPdC+pXA/fcq36sq2Am9WrUq1K3Qt0KDVxGk0tDGvpBcElqWqteUK9GvVpQu2DLppS6XvVj3ciszn7l8xXWaFANvQtaYwz1Lq1VqO/RwAsC76x6wYLT9T2vTsgWMutRGtTOPwXnH6lfC8KaH1Sp59ILt96uIAhqVRrUSbED36XVKq1VqVulvkv9WuhWwqBGaVCtVhlpeK3mMZpv36uxarO60aDGuMLr9vEq1L1gPXLFwB5Uz2m1QmtV6nnUrdFqhbrVKyuFYXi1cOz6nh8GIQ38oBr41UuDV6hbCd1KUKvWu/vKebyqXz2n1KPVCj3/RC/OL+OiQl1WpYB6LuPdrZuIUs+rhQw0mVd7lbB2TgOPVi5oUA2DauBXfO/C9y4C1gVhjTG/e+4FDT3qVqjvsirR6jmbBjHi8stYD0JKa9WL4PwjdWs0cKlbobUKrVbrRrvq6KBa/2/w2XkCvxIyfwhdWv1YbylbHg6CgIZ+GLiu6/t+HfpDl9YuqFulbo2VzCp/WUiNuhc0ZFFQo36lHhTUpe4FvfhEfZdWL2itQgM3dCu16sX1Gf0f0P8HEoRBQF3XZ1SJzKoeZdNZypye8VK6fi2kXj1VDw0Yf81VN/iMSfra5dGwFvjsVUF9dHZDlhzJDWmFUo/Sil8NqedTt0arIfWCwKvR4HqWbBZy3uXerCCknzdphTTwQp9SRrl+/ZUOY812XZfSwKW1T+FFjQYeDYMg+JJwhxmgXuZV+TSkvkfZQpRHA/+SVNIL/ICGXuAGl+k+vMD1w5pPPZfWXOr5NPBd76rml82v5/1mDG9XWgIaBjS8oH5IaVBzaRD6lLo09AK/zhHBmshWMBifNVvAvGaZqw0Mgf+5fKaCaanQoEpphfou9UMahPUJODuDTet8xQFrdOCHNbYNrs42zugWAje8QT/NJgqXRvB9Sv3QCwLvolpxaVhljK9hfWNYEFA3DDxKK9Rzw3rtQz+48N0apbWAhl69wn5APUp9Siuez+xWq2OM71LPpV4dtgK/fhC/TixJfUpr1POu3fa5qix5+HVzeXUnCwNapfSChu61bwNah5Cg/ghM2bpF1fdqzPsDLwy8ekp3Rl9//f4gZH3H+tenn1X7oedRnxnf9102wDMr0YCxrlOXhj4NKn7Vo0GNBud1T6xPlb66goC6PuvNsO7wIWX4G1LPo34tdP0wCP2A0qBWvQipx2Zhl67lM2uHLGKvdbJ/+dz/ObVZWI85Gvo08H3qurTmBe710GP/srQufngZOIyiKWBnqS5T5lzZmv2c0lroetSvBrWQBiH1fBpU3XM2xXRr54xvmW01rGfSv+onSv8s7/ymXMGET29kMKKU1sP41m9+LOENYUtyPtt6dUN+qeJfqqg/tdws5/dUXP9FeO2piFmDQVtwTUI/uBw66mHv0R9bjSlgJV+v/xcGY/a/jiKXcXgTlL+jpf73l8PD1fW7vfD1D+v/XsFoGDBrfEuY+uvy/fsZsH113Wa3H7Ul9OtXcGnI+lWvg3f5uMoq+cv2uTaSsIuVf91QYRiGfsAevH7b/pRNfoOrfvyiqK+899J6v6Ii/NJpvtR723W9CT/ln1+WebsRfsY+f0D/x3I166yH2fWJ9hfi3/CkWzrgO8F2/fPP6r5b2k/I9Se+6/79Pe2/qOJm4d8D/avCvzDpd+12o/Bvg/4lJF110i14eVszv9Z4DY6+6P1/bKKrv+mXKuoav9ULvwj63zDgD267rdL/ZdC/rN4XTnLZuuuVv/rq18q/BsShf72Em6H6NS7/jlxNE75o3e2If60Jvwz639T/E8b5A/o/kK8i/+ej6Cfl+3q/Mbr8nj/eUtTPfP67woDh69BiUfeVRvpte96o27cC8hoU3daE73TA11381aTtq/H+F610c83hOrjfcsO/Zv9/S65g/ha5evC91VF/UsGVY3wF+tfNQm/rwZ8r/QvQD6+m+v8d+TyEf7uSv2GiWxXd6qU/89s/oP8D+QrxP8fqv9Fz39f7Hdz/RyX/hDv+k/IvJbgJxGFYX8f4alZLbwvp6zX5uYoFlAafJ57fHTWvK/gG6H/9DuarJ4aftMK3QP9b9/x7Enzj+jW5bPjt9f+Ol/6alhviUd+jfkD9WwfF33DR8HJcYR74qz//cfmXQyDzwO/X858H2h/Q/y/KlU0/99O/HZ23yvUJ5hf1+Ue+Elxfdbn59T/3xR8CzXXQZxqvL8V8R25U7Bb8CsP6aoN3A/S/Wew3QP9GW7zL69fk1ieGm8H5XwL9a93t/y7o/2DQ+req/ZXvXYF+QP2bQ/iv1p9hsRsGblifFnx51+0TlN9XRL9TQnCta/6A/v9t+Uk/uB5mN6+bgPitr24uKP1SNW6TL5R+p5k/+eHlV9/UcivK3AL6PyeXkXjThte/Db+a6f+42G/N9L9Yb72O+78mtyI+28Vyo8f94PYtAt+X22f0P++B3x8Mvg3639D7E082P9cqN7gO+r+Lj/61y6NhjW00/krV7Xb7fdC/Mah8reW3H7y+Uvd7dv4D+r8t31jl/C7o/yjwbgf96/73r4D+94L8H4H+dXy8XdFX85FfBP1bbXj1bRiGIcOI4Nffw301v7utXb8D+t8q/zrE/NRgfOtHIf2OC/2i4/2q/HdBP6ReSL1rNf9HcnNc/2FDfsMm17V8+c2/aPZva/9SvnPnH9D/odx06+ubGD7L5QvG70Xgz8D9V8FzWfjP9ujPNeTXwOunNV4Hx9vd+mb9f3ZK/k3Q/wr3f2eaRn8A+vRbzfl9CX12+usr0P9W/95ipR+A/heNuu3B5f8E6AfseMSN69p6WkBp8Pujx/XqhT797Dy3NsT7ZzZhxX0f9P8FFTcl/IbcevMf0P+BfNvZvlow/fWSv9E3lwcCLncYfI6mz0p/e/D4YX2+2Cz9E055o/wvQef6dQ2Ufw90boLy9cWZS43utbj6qkrfUvf5w/Aa2NSPaIXXCr8lin7aUJeVDy/L/P7jyHfi9vtR/fOfh+HX62DfR40v7H+Jbtfvue1XP2Wf24aH+ih4/Ybb1qy/uO2m3svKBNfuvMU/WeVv29Xzk/37xbBNb2nOD9v7Q/levFxZ/XNEfPtl2f8Cb7FlW63qp/cAAAAASUVORK5CYII=" />Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-16168975477568164332010-10-27T14:53:00.001+10:302010-10-27T14:54:50.792+10:30JavaDoc CVS Tag Replacements ($Id:, $Revision:, $Date:, $Author:)<h3>Usage of CVS Keywords in JavaDocs</h3>In my Java code I use the following tag in all my class level JavaDocs:<br />
<br />
<pre><code>
/**
* Some text describing what this class is for...bla bla bla...
* @author: mkopka - Marty Kopka - 20101010 - 17:45:23pm
* @version $Id: $
*/
public class Fubar { ... snip .. class definition follows in here
</code></pre><br />
...and then when I commit the code into CVS the <code>$Id: $</code> tag gets converted into:<br />
<br />
<pre><code>
...
* @version $Id: Fubar.java,v 1.1 2010/10/10 17:50:44 mkopka Exp $
...
</code></pre><br />
<div style="text-align: justify;">Which is all well and good and Ive encouraged all my teams to follow this style as it gets you some bonus information for free basically. You dont need to do anything except put in the initial "Id" tag and then dont touch it from that point on. I'll get updated every commit from that point on and you get the name of the user committing the file, the time and date that they did so and the version in CVS of the current file commit. All good information to have, especially given that you dont have to update it yourself.</div><br />
<div style="text-align: justify;">So what am I going to complain about...well nothing actually. I was just going to point out that the string that's substituted into the "Id" tag is actually made of of a number of small parts comprising the larger string. Should you not want all that information (although why you wouldn't I dont know)...but if you dont you can just pick and choose the bits that are good for you. As an example the code below shows the equivalence of the "Id" tag but made up of sub-component like tags.</div><br />
<pre><code>
...
* @version $Revision: $ $Date: $ $Author: $ $State: $
...
Which will then give: </code></pre><pre><code> </code></pre><pre><code> ...
* @version $Revision: 1.1.1.1 $ $Date: 2010/10/10 17:50:44 $ $Author: mkopka $ $State: Exp $
...
</code></pre><br />
<div style="text-align: justify;">There's also no reason why ...in theory... you couldn't use these various substitutions inside your code itself (although it would take until a CVS commit before you got any info in it first time around. But I can see a case where a version number for example may be usefully stored in a String and later displayed in the application. Or, seeing as how there is also the possibility to use other tags to substitute in a branch name (amongst other info) you could use that along with version info to provide info to the client. I.e.: something like this I can see as a a possibility: </div><br />
<pre><code>
...
String versionAndBranch = "Branch: $: $ Version: $Revision: $";
...
... snip ... and then at some later date we can use the String above for logging, debugging, display to the client etc.
...
System.out.println("We are using source code from: " + versionAndBranch);
...
</code></pre><br />
<div style="text-align: justify;">Now as mentioned, the example above would be empty until you committed the file, but that's not a great problem as normally you would commit the code prior to a production deploy (so the issue would only be in your local development environment). For further info on this I found the following link: <a href="http://www.idevelopment.info/data/Programming/change_management/unix_cvs/PROGRAMMING_Using_CVS_Keywords_in_File_Headers.shtml">http://www.idevelopment.info/data/Programming/change_management/unix_cvs/PROGRAMMING_Using_CVS_Keywords_in_File_Headers.shtml</a></div><br />
<h3>Listing of CVS Keywords </h3><div style="text-align: justify;">Besides the substitution tags that I listed above there are a number of others that are also available (11 in fact ... or perhaps 12 if you include CVSHeaders from the latest version ... but not all versions have CVSHeaders so be aware of this prior to using it as your version of CVS may not support it). The following listing gives a list of all of the different substitutions available (which I pilfered from an number of different sites and cobbled the info below together. See the end for a listing of http://'s that I used to compile this).</div><br />
<table border="1" cellpadding="5"><tbody>
<tr><th>Keyword </th><th>Explanation</th></tr>
<tr><td><code>$Author: $</code></td><td>The user responsible for a change. <code>$Author: markd $</code></td></tr>
<tr><td><code>$Date: $</code></td><td>Date and time of the change, in GMT. <code>$Date: 1999/12/23 21:59:22 $</code></td></tr>
<tr><td><code>$Header: $</code></td><td>A collection of information: full path to the RCS file, revision number, date/time of last change (GMT), author, state, and locker. (lockers are a rare occurance in CVS)<br />
<br />
<code>$Header: /cvsweb/cvs-guide/keyword.html,v 1.3 1999/12/23 21:59:22 markd Exp $</code></td></tr>
<tr><td><code>$Id: $</code></td><td>Like $Header: $, but without the path to the RCS file. <code>$Id: keyword.html,v 1.3 1999/12/23 21:59:22 markd Exp $</code></td></tr>
<tr><td><code>$Log: $</code></td><td><div style="text-align: justify;">Inserts the cvs log message. This behaves differently than other tags in that it just inserts new information after the keyword. It doesn't replace the keyword or modify existing text. </div><br />
<code>$Log: keyword.html,v $ <br />
Revision 1.3 1999/12/23 21:59:22 markd <br />
dummy change to bump up revision.</code><br />
<code>Revision 1.2 1999/12/23 21:59:15 markd <br />
dummy change to bump up revision.</code><br />
<code>Revision 1.1 1999/12/23 21:58:35 markd <br />
initial revision</code><br />
<code><br />
</code> <br />
<div style="text-align: justify;"><b>Note: </b> See the following link for an explanation of possible issues with the use of the $Log: $ tag. <a href="http://www.network-theory.co.uk/docs/cvsmanual/Logkeyword.html">http://www.network-theory.co.uk/docs/cvsmanual/Logkeyword.html</a></div></td></tr>
<tr><td><code>$Locker: $</code></td><td>The user who has a lock on this revision (usually nobody) <code>$Locker: markd $</code></td></tr>
<tr><td><code>$Name: $</code></td><td>If a sticky tag is in effect, this is the name of that tag. Otherwise blank. <code>$Name: guide_release_1 $</code></td></tr>
<tr><td><code>$RCSfile: $</code></td><td>Name of the RCS file in the repository <code>$RCSfile: keyword.html,v $</code></td></tr>
<tr><td><code>$Revision: $</code></td><td>Revision number <code>$Revision: 1.3 $</code></td></tr>
<tr><td><code>$Source: $</code></td><td>Full path to the RCS "<code>,v</code>" file in the repository <code>$Source: /cvsweb/cvs-guide/keyword.html,v $</code></td></tr>
<tr><td><code>$State: $</code></td><td>State of this revision. <code>$State: Exp $</code></td></tr>
<tr><td><code>$CVSHeader: $</code></td><td><div style="text-align: justify;">A standard header (similar to $Header: $, but with the CVS root stripped off). It contains the relative pathname of the <small>RCS</small> file to the CVS root, the revision number, the date (UTC), the author, the state, and the locker (if locked). Files will normally never be locked when you use <small>CVS</small>.</div><br />
<div style="text-align: justify;"><b>Note</b>: This keyword has only been recently introduced to <small>CVS</small> and may cause problems with existing installations if $CVSHeader: $ is already in the files for a different purpose. This keyword may be excluded using the <code>KeywordExpand=eCVSHeader</code> in the <tt>`CVSROOT/config'</tt> file. See <a href="http://cvsman.com/cvs-1.12.12/cvs_104.php#SEC104">Configuring Keyword Expansion</a> for more details.</div></td></tr>
</tbody></table><br />
<h3>Bibliography / List of Further Info Links </h3><ul><li><a href="http://www.network-theory.co.uk/docs/cvsmanual/Keywordlist.html">http://www.network-theory.co.uk/docs/cvsmanual/Keywordlist.html</a></li>
<li><a href="http://www.badgertronics.com/writings/cvs/keywords.html">http://www.badgertronics.com/writings/cvs/keywords.html</a></li>
<li><a href="http://cvsman.com/cvs-1.12.12/cvs_100.php">http://cvsman.com/cvs-1.12.12/cvs_100.php</a></li>
</ul>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com190tag:blogger.com,1999:blog-3282000253968411774.post-6610839809950829542010-10-04T20:09:00.002+10:302010-10-04T20:17:00.154+10:30New Software Release - Firefox-4.0Beta4/5 & 6 + Glassfish 3+ Timeline<div style="text-align: justify;">Just a quick update to discuss Firefox Beta Releases 4 to 6 (current as at 20101004) and an update of the Glassfish Server Time line for Releases.</div><br />
<br />
<h2>Firefox 4 Beta 4, 5, & 6</h2><div style="text-align: justify;">I had a previous post linked <a href="http://martykopka.blogspot.com/2010/08/new-software-releases-ubuntu-firefox.html">here</a> that discusses previous Firefox Betea's. Since that time Beta 4, 5 and 6 have been released. The links below provide info on Time Lines, Features and Bug Lists for the Beta's.</div><br />
<a href="http://blog.mozilla.com/blog/2010/08/11/newest-update-to-firefox-4-beta/" target="_blank">http://blog.mozilla.com/blog/<wbr></wbr>2010/08/11/newest-update-to-<wbr></wbr>firefox-4-beta/</a><br />
<a href="http://blog.mozilla.com/rob-sayre/2010/08/02/mozillas-new-javascript-value-representation/" target="_blank">http://blog.mozilla.com/rob-<wbr></wbr>sayre/2010/08/02/mozillas-new-<wbr></wbr>javascript-value-<wbr></wbr>representation/</a><br />
<a href="http://www.mozilla.com/en-US/firefox/4.0b3/releasenotes/" target="_blank">http://www.mozilla.com/en-US/<wbr></wbr>firefox/4.0b3/releasenotes/</a><br />
<br />
<br />
<h2>Glassfish Time Lines</h2><div style="text-align: justify;"> The following <a href="http://wiki.glassfish.java.net/Wiki.jsp?page=PlanForGlassFishV3">link</a> provided me with the information about the next set of Glassfish 3 up to v4 releases. The v3.2 and v4.0 releases have Java EE 7 functionality in them and that is primarily what Ill be looking forward to. The v3.0.1 release has come out at this stage (i.e.: 20101004) already and Im using it and this provided some of the initial bug fixes that come from a new major release version (i.e. when they went from v2.x to v3.0 that x.0 release always has a bunch of bugs and the first 100 day patch release is where the stability IMHO comes in...although GFv3.0 was not really that bad and only had a few minor issues).</div><br />
<b>Glassfish 3.0.1 - 2010</b> - Glassfish 100 Day Releases (i.e.: v3.0.x implies v3.0.1)<br />
<ul><li>Branding, Patches</li>
<li>Multi-Lingual release</li>
<li>Adds Value-Added Features To Oracle GlassFish Server</li>
<li>Base Interop w/ Oracle Middle ware Products</li>
</ul><br />
<b>Glassfish 3.1 - 2010</b><br />
<ul><li>Centralized Administration / Clusters</li>
<li>High Availability / State Replication</li>
<li>Value Added Features, Like Coherence Support</li>
</ul><br />
<b>Glassfish 3.2 - 2011</b><br />
<ul><li>Improved Cluster/HA Administration</li>
<li>Better Integration w/ Oracle Identity Management</li>
<li>Virtualisation Support</li>
<li>Some Java EE 6 Specification Updates, Some Java EE 7 EA</li>
</ul><br />
<b>Glassfish 4 - 2012</b><br />
<ul><li>Common Server Platform - Shared Best Of Breed With Weblogic</li>
<li>Java EE 7</li>
</ul>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-79383923590758160362010-10-01T20:19:00.000+09:302010-10-01T20:19:00.503+09:30javac -Xlint And Its Many Friends<h2>-Xlint and its variations - so many to choose from! 1st -Xlint:unchecked</h2><div style="text-align: justify;">Or should I just use them all? Pick and choose? Just the one I'm interested in? What to do? What to do? Like many I came across Xlint<span style="font-size: xx-small;"><sup>(*1)</sup></span> when hitting the following message in one of my Ant builds a while back:</div><div style="text-align: justify;"><br />
</div><pre class="jive-pre"><code class="jive-code jive-java">[javac] Note: Some input files use unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked <span style="color: navy;"><b>for</b></span> details. </code></pre><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Huh....I thought to myself....there shouldnt be any errors with my last change. Well looking closer this is just a warning not Ant reporting on a compilation failure.OK. But why does it appear. There doesn't seem to be any location information reporting to me what causes it like a good 'ole stack trace does. So like countless others I looked up how to use this -Xlint:unchecked thingy and stuck it into my Ant build and re-ran my ant script build.xml......and was promptly swamped by 100's of lines of warning messages (all pretty much saying the same thing) complaining about my absolute poor lack of etiquette in the use (or lack thereof) of generics throughout my (what I thought up until then was) pristine code. Turns out it wasn't and I was seriously thinking of taking the pesky compile option out since its 'only a warning anyways' and hence thereby effectively getting rid of all that nasty mess and clutter in my build output. </div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Now, okay....I didn't go down that path of just sweeping things back under the rug when they happen to fall out ... and furthermore these days things aren't quite that bad and when I write new code generics are used properly and by default as required throughout the code so this really is more of an issue when converting legacy code or upgrading from Java 1.4 to 5/6+ etc. When I do come across these issues I promptly modify the code to resolve them, thereby not only removing a pesky warning from my pristine build output, clearing up my Netbeans GUI of warnings and .... well .... also as a tiny little almost insignificant side note ..... making the code more robust and providing a higher-level of compile time type safety checking (which is really what generics are all about aren't they!!).</div><h2>-Xlint, naked without its ':unchecked' param!</h2><div style="text-align: justify;">So now you know all about -Xlint:unchecked for type-checking issues related to generics. It is however possible to simply use just:<br />
<br />
-Xlint<br />
<br />
....without the :unchecked option. A little naked the poor tool feels now. This effectively says to the compiler use the lint tool (via the -X property) and just call it without any parameters. This has the effect of calling lint and using all of its checks rather than, like in our case above for :unchecked, using just the generic checks/warnings (by passing through the 'unchecked' parameter to the lint tool.<br />
<br />
<h2>-Xlint and all of :unchecked's many, many friends!</h2>So then, what checks are possible? When calling -Xlint what is it that we are actually doing (besides popping up a huuuuuge amount of warnings in most cases). Well, calling -Xlint is effectively the same as passing in several parameters to the lint tool. What are these parameters....well Ive listed them below as to what it is that you can add to the -Xlint call as arguments to determine what checks the javac compiler should make when compiling the code and what warnings it should then report back on. <br />
<br />
-Xlint:{all,cast,deprecation,divzero,empty,unchecked,fallthrough,path,serial,finally,overrides}<br />
<br />
<br />
Thats a lot of options. Here is some info about them from the javac compiler options page:<br />
<br />
<dl><dt><b>-Xlint</b></dt>
<dd>Enable all recommended warnings. In this release, all available warnings are recommended.</dd>
<dt><b>-Xlint:none</b></dt>
<dd>Disable all warnings not mandated by the Java Language Specification.</dd>
<dt><b>-Xlint:-</b><i>name</i></dt>
<dd>Disable warning <i>name</i>, where <i>name</i> is one of the warning names supported for <b>-Xlint:</b><i>name</i>, below.</dd>
<dt><b>-Xlint:unchecked</b></dt>
<dd>Give more detail for unchecked conversion warnings that are mandated by the Java Language Specification.</dd>
<dt><b>-Xlint:path</b></dt>
<dd>Warn about nonexistent path (classpath, sourcepath, etc) directories.</dd>
<dt><b>-Xlint:serial</b></dt>
<dd>Warn about missing <code>serialVersionUID</code> definitions on serializable classes.</dd>
<dt><b>-Xlint:finally</b></dt>
<dd>Warn about <code>finally</code> clauses that cannot complete normally.</dd>
<dt><b>-Xlint:fallthrough</b></dt>
<dd> Check <tt>switch</tt> blocks for fall-through cases and provide a warning message for any that are found. Fall-through cases are cases in a <tt>switch</tt> block, other than the last case in the block, whose code does not include a <tt>break</tt> statement, allowing code execution to "fall through" from that case to the next case. For example, the code following the <tt>case 1</tt> label in this <tt>switch</tt> block does not end with a <tt>break</tt> statement: <blockquote> <pre>switch (x) {
case 1:
System.out.println("1");
// No break; statement here.
case 2:
System.out.println("2");
}
</pre></blockquote>If the <tt>-Xlint:fallthrough</tt> flag were used when compiling this code, the compiler would emit a warning about "possible fall-through into case," along with the line number of the case in question. </dd></dl><br />
-Xlint:{all,cast,deprecation,divzero,empty,unchecked,fallthrough,path,serial,finally,overrides}-cast,-deprecation,-divzero,-empty,-unchecked,-fallthrough,-path,-serial,-finally,-overrides,none}Enable or disable specific warnings</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Links <br />
http://download.oracle.com/javase/6/docs/technotes/tools/windows/javac.html#nonstandard<br />
http://mark.koli.ch/2009/04/configuring-ant-to-use-javacs--xlintunchecked-option.html </div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">*1 - Well not quite....you see thinking back....Ill admit that lint I remember vaguely from my C Programming days back at university (in the dawn of the age in the mists of time back somewhere during the time period range in 1995 - 1999/2000).</div>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com2tag:blogger.com,1999:blog-3282000253968411774.post-66465928344954823592010-10-01T19:14:00.000+09:302010-10-01T19:14:30.569+09:30Ubuntu / Kubuntu 10.04 (LTS ) Arrived in the Mail...snail mail that is!<h2 style="text-align: left;">Yeehaa I Got Mail...Its Not Spam....its....its...real...woooo...SNAIL MAIL!</h2><br />
<div style="text-align: justify;">Walked out to the letter box on the way to catching the bus to work this morning and found a padded envelope inside. My heart skipped a beat and surged with excitement..... Whatever could this be....had to be some cool free stuff...either more free cat food for my new kitten (I dont have a new kitten but taking advantage of the cat food tho for Bullets my 4 year old kitty) or perhaps another tube of free toothpaste (<a href="http://freestuff.net.au/">freestuff.net.au</a> does actually pull through and provide some actual 'free' things as their name suggests they should do...even tho 3/4 of their offers are actually competitions, surveys or other non-free stuff).</div><br />
<div style="text-align: justify;">No....turns out this padded envelope from the mysterious corners of the world (I forget right now where it was from but it was far ....other hemisphere far even....) was actually my long awaited version of 3 DVD's with Lucid Lynx, 10.04 (LTS) Ubuntu/Kubuntu/Ubuntu - server/64bit - version. Its finally arrived!!! W00t!!!</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Just in time for me to go to the Ubuntu website and read all about the 10.10 beta release that's about to come out (or just has :-) ) . Well I suppose that's what I get for not just downloading it and wanting it snail mail delivered in today's times....but you gotta admit....there's something just so exciting at getting 'real' mail in a padded envelope no less. Whats that....no you say....not excited you say....pah..."bah Humbug" I say to you!!!! I enjoyed it!!! So there!!!</div><br />
<div style="text-align: justify;">Well now all I have to do is get around to actually installing it (or at the very least running of the CD/DVD and trying it out). Dual boot would be nice, VMWare images with each of Ubuntu 8.xx, 9.yy, 10.zz versions installed inside my Windows 7 would be great and vice-versa with Windows 7 installed inside a VMWare image in my dual boot setup of Ubuntu 10.04. (It is LTS - Long Term Support-ed after all ... that was sarcasm by the way ... hard to tell on these blog things :-) ) </div><h2>Links to Ubuntu Downloads/Releases/Feature Info/Reviews.</h2><ul><li><a href="http://www.ubuntu.com/%20">http://www.ubuntu.com/ </a></li>
<li><a href="http://releases.ubuntu.com/lucid/">http://releases.ubuntu.com/lucid/ </a></li>
<li><a href="http://www.tomshardware.com/reviews/ubuntu-10.04-lucid-lynx,2634.html">http://www.tomshardware.com/reviews/ubuntu-10.04-lucid-lynx,2634.html</a></li>
</ul><br />
<ul></ul>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-82606009663827768682010-09-23T13:43:00.001+09:302010-10-01T19:16:37.589+09:30Oracle RBMS+PreparedStatment+CHAR(n) Column=Problem Retrieving Data<div style="text-align: justify;">Noticed the following inconsistency with making a WHERE clause call while using a PreparedStatement against and OracleRDBMS CHAR(n) data-type column. A call to a <code>WHERE col1 = ?</code> was failing to make a match and return any data against a column in the DB when I was using <code>prepStmt.setString(col1, "INPUT DATA STRING"); </code>when I knew that string existed in the DB. The following is some quick notes I wrote up while resolving why:</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Given an Oracle DB table with the following definition of columns:</div><div style="text-align: justify;"> COLUMN1 CHAR(4),</div><div style="text-align: justify;"> COLUMN2 VARCHAR(4)</div><div style="text-align: justify;"><br />
</div><ol><li>prepStmt.setString(parameterIndex, "420");</li>
<li>((oracle.jdbc.OraclePreparedStatement) prepStmt).setFixedCHAR(parameterIndex, "420");</li>
</ol><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">The first statement will fail to return results matching for a value of 420 stored in the CHAR column as its padded out to the length specified (4 characters in this case). Using "420 " padded to the correct number of spaces will work but this means that you have to pad the value yourself (in much the same way as you would do for a plain Statement rather than a PreparedStatement, ie: WHERE COLUMN1 = '420 ' where the 420 3 character string has been padded out with blanks to the required 4 character length).</div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">The second statement, the oracle specific method - setFixedCHAR(), can also be used and in this case when we pass in the string 420 not padded Oracle will do a comparison in much the same way as if the column had been of the type VARCHAR(4) not worrying about the padding requirements of the first case and in this case comparing and matching whether you pass in "420" or "420 " etc. </div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Furthermore using something like the following which I found suggested on various websites: setObject(obj,java.sql.Types.CHAR) still does NOT do what setFixedCHAR does. </div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Under the covers I haven't looked at how setFixedCHAR works (as its closed code) but the JavaDocs can be found in my link below and also provide some further examples of cases when matches do and dont work for various cases using the PreparedStatement. </div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Javadoc For OraclePreparedStatement - <a href="http://download.oracle.com/docs/cd/E11882_01/appdev.112/e13995/oracle/jdbc/OraclePreparedStatement.html#setFixedCHAR_int__java_lang_String_">http://download.oracle.com/docs/cd/E11882_01/appdev.112/e13995/oracle/jdbc/OraclePreparedStatement.html#setFixedCHAR_int__java_lang_String_</a></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Whether the driver gets the column length using MetaData and pads it itself internally or whether it uses some form of ltrim(rtrim()) SQL call Im unsure of but essentially you can treat the setFixedCHAR() in the same way as a setString() against a VARCHAR column datatype. (Anyone know the answer and can provide a cool link with this info yell out). For performance reasons it may be more useful to pad out the data yourself, or even if there are no performance differences in the SQL generated by the driver for a setFixedCHAR(not-padded-input) and setString(padded-input) you may still prefer to use the more standard setString() method and pad out the data yourself rather than use the setFixedCHAR which is limited only to OraclePreparedStatement class. I'm not going to even try to get involved in which method is the best way to go here...primarily cos I really dont have a leaning myself strongly in any one direction. I can see cases where any one of the several ways that this can be resolved correctly are useful. I think the main point here is to understand the issue that CHAR(n) data type, combined with Oracle and PreparedStatement can bring about in terms of matching data and retrieving results and based on that knowledge making an appropriate choice of one of the several possible ways around this:</div><div style="text-align: justify;"><br />
</div><ol><li>- use Statement and manually pad the data yourself. ie: WHERE column1 = '420 ' </li>
<li>- use PreparedStatement and setString() and manually pad the data yourself, ie: prepStmt.setString(x, "420 ");</li>
<li>- use PreparedStatement and OraclePreparedStatement.setFixedCHAR(x, "420"); </li>
</ol><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Note: the JDBC spec in section 8.3.1 (<a href="http://download.oracle.com/javase/1.3/docs/guide/jdbc/getstart/mapping.html#1055140">http://download.oracle.com/javase/1.3/docs/guide/jdbc/getstart/mapping.html#1055140</a>) does actually talk about how it is the driver/databases responsibilities to actually pad out the data correctly for CHAR columns when doing comparisons or INSERT/UPDATE-ing the data. However the link below gives some further Oracle specific information: </div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;"><a href="http://download.oracle.com/docs/cd/B14117_01/java.101/b10979/datacc.htm#sthref910">http://download.oracle.com/docs/cd/B14117_01/java.101/b10979/datacc.htm#sthref910</a></div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">The main thing to keep in mind is that this is only an issue for the case where we have the combination of Oracle RBDMS and PreparedStatement and CHAR(n) column.</div>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-80317806781136315282010-08-11T02:07:00.059+09:302010-09-23T12:38:44.525+09:30Improving Windows 7 Startup Times<h2>Intro - Improving Windows 7 Start-Up Time </h2><div style="font-family: inherit; text-align: justify;">Whoa ... Windows 7 I hear you say . Well yeah, I admit it, I do use Windows products, despite my admitted love for *nix products and the Ubuntu series of Linux OS's. At work (at the moment) its a case of Windows XP and I have to make do with a Cygwin install as well as putty to various *nix boxes. Anyways, a Windows 7 laptop I'm using after a few months seemed to be slowing down on start-up. I'd installed a few bits and pieces and now it seemed that when I started up there were a million things that would initialize on start-up, popup an icon and then go into the background. this cant be good having this many things starting, especially given that a large amount of them I didn't use. For example, one of the things that would start-up was the HP Dock Adviser, one of a number of Hewlett Packard (HP) tools that had been installed on purchase of the laptop (as it was a HP laptop). This kind of thing really shits me. Yeah its a HP laptop, but give me the option if whether I want your 20 different applications for adjusting things. whats really cruddy is that they adjust things that come with default windows adjustments, like for example the HP Sound tone App, which is just a slightly prettier version of the little windows speaker icon for adjusting volume. Now why the hell would I want to use the HP one when I already have an ample way of adjusting sound with the windows one. To top it off, if I add in speakers and the drivers for them they will probably come with their own volume tool anyways which will be much better and more suitable for the speakers than the HP one so that make shite HP app totally pointless....yet there it is every single start-up time loading and sitting in the background. Now Id taken to killing these off each time they started ... but there had to be a better way. So here is what I found, noted down for the future in case I need to refer to this again. </div><br />
<h3>Steps to Better Performance of Windows 7 Start-Up Times</h3><div style="text-align: justify;">So what to do? Well, as I see it I need to do the following:</div><ol><li style="text-align: justify;"> Check the current start-up time duration (total and individual apps, including apps taking excessive times)</li>
<li style="text-align: justify;"> See whats currently being started (which apps/services etc)</li>
<li style="text-align: justify;"> Identify which applications take too much time or are pointless and remove them. The tools to do this need to be in Windows 7 by default & I don't want to have to download other applications. So what does Windows 7 provide me in this case: <b>Event Viewer</b> - for viewing start-up time logs, <b>msconfig</b> - for configuring start-up apps and services</li>
</ol><h3>Event Viewer and Performance Logs</h3><h4>Event Viewer and Performance Logs - Introduction And Log Location</h4><div style="text-align: justify;">The Event Viewer (which is found under Control Panel\All Control Panel Items\Administrative Tools) provides access to a bewildering number of logs. First off the option to show analytic and debug logs should be switched off as they are mainly for developers and only add further logs to an already large number. Unfortunately there doesn't really seem to be a good set of documentation on all of these many, many logs. After some searching on the web I found that in my case the particular log that I wanted was found under the following location in the Event Viewer log directory setup:<br />
<br />
Applications and Services Log-->Microsoft-->Windows-->Diagnostics-->Performance-->Operational<br />
</div><h4>Event Viewer and Performance Logs - Event ID 100 (Start-Up Event/Time)</h4><div style="text-align: justify;">Now furthermore there are a number of different Event ID logs. The logs 100-199 I think are the main one referring to start-up/boot performance. In particular Event ID 100 is the one that refers to actual start up time.</div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHWLjH69dRXqqmpD-xkhx0Nw4r_nzJ3Zi-F1l3Oi5OVk2UpP-m2ht2DMRv-v52PpVd68u4ZuPrvB2_-A_NMaoWEB6buxyWtzgxSRWYjovPDbjWvfKHJVj3eIteqaorm7aRTWD-zZHy137A/s1600/windows-7-boot-time.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="340" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHWLjH69dRXqqmpD-xkhx0Nw4r_nzJ3Zi-F1l3Oi5OVk2UpP-m2ht2DMRv-v52PpVd68u4ZuPrvB2_-A_NMaoWEB6buxyWtzgxSRWYjovPDbjWvfKHJVj3eIteqaorm7aRTWD-zZHy137A/s640/windows-7-boot-time.JPG" width="640" /></a></div><br />
<div style="text-align: justify;">So to see your last start-up time duration simply click in the Event Viewer on the last log with a Event ID 100. You'll see an event log similar to something like the image above. The highlighted Boot Duration time is the key figure we are interested in as it show time taken for the boot/start-up to occur. In my case the following times and values (below text) was the actual values I got in the General Details section when I had a look at my last start-up time (and other times where roughly the same...in the same range):</div><br />
<div style="font-family: "Courier New",Courier,monospace; text-align: justify;"><span style="font-size: x-small;">Windows has started up: <br />
Boot Duration : 157538ms<br />
IsDegradation : false<br />
Incident Time (UTC) : ?2010?-?08?-?10T00:42:39.749600500Z</span></div><br />
<div style="text-align: justify;">This shows that in my case the start-up took 157 seconds. Thats about 2 and a half or more minutes. In my opinion that's fairly slow. However, next I looked back through the log history towards the start of the log (I've only had the laptop for a few months so this wasn't far back). In the beginning I could see start-up times of under a minute. Furthermore, I could see, by looking at the list of installed programs in the Control Panel under 'Programs and Features' (i.e.: Control Panel\All Control Panel Items\Programs and Features) that on the date when a large number of installs where performed all in one day the start-up time visibly reduced from under a minute to over 2 minutes on the one day for all subsequent start-up times.</div><h4>Event Viewer and Performance Logs - Event ID 100 (Detailed Event Breakdown - Key Times)</h4><div style="text-align: justify;">Another important feature to have a look at is the Start-Up time breakdown. The start-up time consists of starting a large number of various devices, services, processes, etc. There are ways that I've seen where you can actually generate and view a log file containing a list of and timing details for each one of these services starting up. The log I saw was comprised of roughly 3/4 of a million objects (i.e. each object being a process, service and in most cases each object referred to the call of a method or the creation of an object in the device drivers that were executed etc. This makes sense as there are obviously not 750,000 services that start but it is possible that this many member variables and objects etc, are initialized by the code running the device drivers etc.). This detailed logging I may at some point go through in more detail (primarily for my own interest, since the actual info is at too low a level to be of use to anyone but device driver or service implementers/developers etc). If I end up doing this (when the curiosity gets the better of me or if there is enough requests / interest in this) then there'll be a link to the article from HERE. <br />
<br />
<br />
<br />
In the mean-time the only breakdown I intend to look at is a much higher level. By looking at the "details" tab in the Event Viewer Event, which can be seen in the image above you get a choice of either the friendly view or the XML view. Either way there are a number of different bits of information presented. Out of all of these there are 3 key bits of high-level information (well actually 2, because the other 3rd one is simply the total of the 2 added and is the total start-up time that we've already seen/know from the first tab). Anyways, these 2 or 3 high-level pieces of timing info are found under:</div><br />
<div style="font-family: "Courier New",Courier,monospace;"><b>Boot Time:</b> 157538<br />
<b>MainPathBootTime:</b> 75397<br />
<b>BootPostBootTime:</b> 82141</div><br />
<div style="text-align: justify;">These times are a breakdown of the total Boot Time (as can be seen from adding them up to get the total time) and the two parts that the total boot time is divided into are: <br />
<ul><li><b>MainPathBootTime</b> measures the time it takes for the system to load all drivers and services that are critical to user interaction and get to the Windows desktop where the user can begin doing things.</li>
<li><b>BootPostBootTime </b>includes all the other drivers and processes that aren’t critical to user interaction and can be loaded with low-priority I/O that always gives preference to user-initiated actions that execute using Normal I/O priority.</li>
</ul></div><h4>Event Viewer and Performance Logs - Event ID 100 (Detailed Event Breakdown - Other Times)</h4><div style="text-align: justify;">There are two other times Ill briefly mention here while discussing the Event Breakdown of times. Although not key to performance improvements (they used to be but no longer are valid) they are worth mentioning for that historic reason and they are:</div><br />
<div style="font-family: "Courier New",Courier,monospace;"><b>BootDriverInitTime: </b> 3314<br />
... snip ...<br />
<b>BootPrefetchInitTime: </b>53087</div><br />
<div style="text-align: justify;"><b>BootDriverInitTime </b>- The first one, 'BootDriverInitTime' will be high if Windows 7 is loading a lot of drivers on start-up. This can occur, especially gradually over time, as applications and hardware are installed over time and with them come their various driver files. You should remove unwanted drivers as part of the general speed up of the start-up. This will also remove redundant drivers from being loaded for no reason and causing general clutter. I always like to keep everything neat and tidy and as simple as possible for my requirements.</div><br />
<div style="text-align: justify;"><b>BootPrefetchInitTime </b>- The latter one 'BootPrefetchInitTime' can have high values if Windows 7 stores a lot of pre-fetch data. This is the historic property I mention above. In the past there were various pros and cons to adjusting the Prefetch values. However, with Windows 7 manipulation of the amount of Prefetch that is occurring is unnecessary and the default setup is the way things should be. Interestingly I found an article describing how this can be adjusted and what used to be done for Windows XP in particular under the following link and this is called 'show the pros and cons of disabling prefetch to speed up the boot time' found <a href="http://windows7themes.net/speed-up-windows-7-boot-time.html">here</a>. The key thing to remember is that Ive included this info for your vieweing pleasure, and it should NOT b e acted upon any further than simply reading the article and seeing what is inside your OS (the article has some interesting points on the registry, setting the Prefetch values, what they are, etc)</div><br />
<h3>Improving Start-Up Times Via Removal Of Apps/Services</h3><div style="text-align: justify;">So....(to be continued on another day)</div><br />
-- logs showing causes of slowness for critical/error events<br />
-- msconfig use for startup apps<br />
-- remove startup apps<br />
-- current improved timesMarty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com1tag:blogger.com,1999:blog-3282000253968411774.post-41317173628660939512010-08-03T05:57:00.013+09:302010-10-04T19:46:34.080+10:30New Software Releases (Ubuntu-10.04, Firefox-4.0Beta2/3 & Netbeans6.9.1)!!!Just a short/quick post to note that it seems to be a good time for software releases at the moment:<br />
<ul><li>The latest version of Ubuntu, 10.04 (Lucid Lynx), is an LTS(Long Term Support) version, and was released on April 29, 2010. Woot!!! Woot!!! Woot!!! </li>
<li>Firefox released the new Version 4 Beta a few weeks ago and now they've also released an update (i.e: Firefox 4.0 Beta 2....update....and Beta 3 came out on the 11th Aug), here's a link to the release notes and some interesting info: <a href="http://www.mozilla.com/en-US/firefox/4.0b2/releasenotes/">http://www.mozilla.com/en-US/firefox/4.0b2/releasenotes/</a></li>
<li>Netbeans has released the new 0.0.1 version release of Netbeans 6.9.1. The release notes are at: <a href="http://netbeans.org/community/news/show/1488.html">http://netbeans.org/community/news/show/1488.html</a>.</li>
</ul>Personally when it comes to large releases from companies I trust (FF, etc) I'm happy to use Beta versions on my PC's and Laptop. So I have a tendency to upgrade to the next version of <i>'most'</i> bits of software (FF, Linux, JSE/JDK, JEE, etc). Regardless of new versions or even the use of Beta's but I tend to find that I'm OK and don't hit bad bugs from upgrading to early. That's good. So here's my opinions based on actual use of these tools and the new Betas/versions (well FF anyways....bit lazier so far on Ubuntu upgrades.... :-) ) <br />
<br />
<h2>Netbeans 6.9.1 Release</h2>- Release Notes Overview: <a href="http://netbeans.org/community/news/show/1488.html">http://netbeans.org/community/news/show/1488.html</a> <br />
<br />
- Further Release Notes 6.9 Overview: <a href="http://netbeans.org/community/releases/69/">http://netbeans.org/community/releases/69/</a> <br />
<br />
- List of Bug Fixes For The 6.9.1 Version: <a href="http://wiki.netbeans.org/NetBeans6.9PatchesInfo">http://wiki.netbeans.org/NetBeans6.9PatchesInfo</a>. This contains a list of the bugs fixed in the point release.<br />
<br />
- And some EVEN better release notes for 6.9.1 August 4th 2010 Release: <a href="http://netbeans.org/community/releases/69/relnotes.html">http://netbeans.org/community/releases/69/relnotes.html</a>. These release notes kick ass in their detail. I reference these below for the list of some of the changes.<br />
<br />
<br />
<h3>What's New in 6.9.1 - A more detailed list from above.</h3><ul><li>Availability of the latest IDE bundled with JavaFX SDK 1.3.1</li>
<li>Improvements to the JavaFX debugger</li>
<li>Important usability issues fixed in the JavaFX Composer and Editor</li>
<li>Critical <a href="http://wiki.netbeans.org/NetBeans6.9PatchesInfo" target="_blank"> bug fixes</a> made to other modules since the 6.9 final release</li>
</ul><br />
The following updates to the 6.8 release included in version 6.9 also apply to 6.9.1:<br />
<ul><li>JavaFX Composer to simplify and visualize JavaFX development</li>
<li>Support for Equinox and Felix OSGi frameworks in NetBeans Platform</li>
<li>Spring Framework 3.0 library support</li>
<li>Java Card<small><sup>TM</sup></small> 3 Connected</li>
<li>Rails 3.0 Beta support</li>
<li>PHP Zend Framework support</li>
<li>Support for JSR-299, Contexts and Dependency Injection (CDI)</li>
<li>Additional Enhancements are listed on the <a href="http://wiki.netbeans.org/NewAndNoteworthy69" target="_blank">NetBeans IDE 6.9 New and Noteworthy</a> page.</li>
</ul><b>Note</b>: The Java <small><sup>TM</sup></small> SE Development Kit (JDK) 5.0 is not supported on any platform for this release. You must have JDK 6.0 on your system to install and run NetBeans IDE 6.9.1.<br />
<br />
<h2>Ubuntu Downloads and Free Install CD's</h2><ul><li><a href="https://shipit.ubuntu.com/">https://shipit.ubuntu.com/</a> <-- for a free copy of Ubuntu 10.04 CD sent to your house....GREAT!!!</li>
<li><a href="http://www.ubuntu.com/server/get-ubuntu/download">http://www.ubuntu.com/server/get-ubuntu/download</a> <-- to download the ISO</li>
</ul><br />
<h2>Firefox4.0-Beta2-Updates/New Functionality</h2>- The following link shows the updates and the changes to the functionality from Beta 1 to 2. <a href="http://www.mozilla.com/en-US/firefox/beta/features/#feature-switch">http://www.mozilla.com/en-US/firefox/beta/features/#feature-switch</a> <br />
<br />
- Furthermore I'm always interested in performance improvements. FF4Beta2 works on improving JavaScript, which given the state of the Web in our 'Web 2.0' fancy-shmancy world we live in is now an important feature to improve the speed of: <a href="http://blog.mozilla.com/dmandelin/2010/07/19/jagermonkey-update-getting-faster/">http://blog.mozilla.com/dmandelin/2010/07/19/jagermonkey-update-getting-faster/</a>. And so how does it get this extra performance. Well in a bunch of ways, bug fixes, perf., improvements, etc., etc., etc., but it also points out in dmandelin's blog that they used Ropes for improving the performance of Strings in JavaScript. The primary improvements going to occur when you do a lot of adds, removes from inside the middle of a string, and where in the normal case since a String is immutable you's need to make a new copy of inserts etc. Which gives you at least O(n) performance but Ropes convert a String to a tree structure so an insert in the middle of a string simply points a node to a new location of the new bit of the string we are adding. performance at O(1)!!! Beat that!!! Before you get to excited keep in mind you need to understand <b>WHEN</b> these are to be used or else you'll cost yourself performance but in the right case Speed improvements here we come. Something to keep in mind for the future if I ever need to perf., tune some code manipulating Strings heavily. <br />
<br />
<br />
<br />
Check out <a href="http://en.wikipedia.org/wiki/Rope_%28computer_science%29">http://en.wikipedia.org/wiki/Rope_%28computer_science%29</a> for an overview discussion of Strings vs. Ropes.Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-56237782123139833682010-07-14T04:50:00.000+09:302010-07-14T04:50:46.977+09:30Netbeans 6.9 - Adding Basic Code Coverage<h2>Netbeans 6.9 - Adding Basic Code Coverage</h2><h3>Description</h3><p style="text-align: justify;">Netbeans provides (and has done so for quite some time) good JUnit test functions allowing you to with the click of a button generate unit tests. Due to the ease of using and generating unit tests it has encouraged me to use them and so Ive been adding them into my recent code. However, not long after adopting Unit tests on a broad scale I find myself wanting to know how well I'm doing with the use of tests. I need to have some sort of code coverage information. There are at least two main contenders in this area (in the Open Source market of-course) and these are:</p><ul><li>EMMA - <a href="http://emma.sourceforge.net/">http://emma.sourceforge.net</a></li>
<li>Cobertura - <a href="http://cobertura.sourceforge.net/">http://cobertura.sourceforge.net</a></li>
</ul><p style="text-align: justify;">These are both aimed at slightly different areas but both provide code coverage info. However, before going ahead and implementing these within Netbeans (and especially Im interested in Cobertura) I decided to use Netbeans 6.9 inbuilt plugin for code coverage (which is based on EMMA anyway).</p><br />
<h3>Implementation of Code Coverage</h3>It was very simple and what follows are the steps to get it to work:<br />
<ol><li style="text-align: justify;">Go to the plugin manager in Netbeans and download and install the Code Coverage tool.</li>
<li style="text-align: justify;">Run your tests across the whole project.</li>
<li style="text-align: justify;">Right click on the project, go to the new 'Coverage' link and 'Activate Coverage Collection' which will allow your code to be instrumented.</li>
<li style="text-align: justify;">Re-run your tests.</li>
<li style="text-align: justify;">Then go to the 'Coverage' and 'Show Project Coverage Statistics'. These will only work after the code has been instrumented and the tests re-run with the instrumentation in place.</li>
</ol><p style="text-align: justify;">This will then give you a report which will show the code coverage across your project for each class and also for the lines within the class and how many are covered by tests (i.e.: it'll look at the branch points like any coverage tool and check you have tests for each case). Furthermore it'll also highlight in your code, when you activate the coverage collection, highlighting which will paint covered code in light green and non-covered in light red so that at a glance you can see what is and isn't covered by tests in your code. Personally I switch this on, run the project stats, view them, see what classes are poorly covered, and then use the colour highlighting to see where I need more tests. However I don't leave it on all the time as I don't like my code painted red/green all the time.</p><h3>Example Screenshot</h3><p style="text-align: justify;">The following is a screenshot of the code coverage project stats page along with how to activate it. The numbers indicate:</p><ol><li style="text-align: justify;">The new 'coverage' link which appears as part of the plugin install.</li>
<li style="text-align: justify;">Shows where to start gathering stats (by getting the code to be instrumented) and where to trigger the project stats page to be displayed.</li>
<li style="text-align: justify;">The project stats page itself and some of the stats it displays showing class coverage, individual line level coverage etc.</li>
</ol><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDmI04RYJ_vVTpDCcsXoCdz-XAS1jhdtFC1lugqse8wz-JFAWwPmr6PI0myNK2jq7bMMP2pG_IfGX1jblQJpJSp-0Vg0ujyq-xyRCWoirRNTW-KnEhOJPxTWEeXQFbzpaEnA9VVU7K835D/s1600/screenshot-NB-CodeCoverage-clipped-20100713.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="356" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDmI04RYJ_vVTpDCcsXoCdz-XAS1jhdtFC1lugqse8wz-JFAWwPmr6PI0myNK2jq7bMMP2pG_IfGX1jblQJpJSp-0Vg0ujyq-xyRCWoirRNTW-KnEhOJPxTWEeXQFbzpaEnA9VVU7K835D/s640/screenshot-NB-CodeCoverage-clipped-20100713.png" width="640" /></a></div><br />
<h3>Final Overview</h3><p style="text-align: justify;">In a future post Id like to look into implementing / using Cobertura in Netbeans and viewing the reports that Cobertura generates through Netbeans in some simple way, although this tool/plugin for viewing code coverage will be quite ample for the time being as it provides me with the ability to see code coverage across the project, the class level and even down to the line level through the coloured highlighting it provides. This is enough to show me were I need to test more at this stage, with the future updates I think being more a fancy-shmancy kinda thing.</p>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com6tag:blogger.com,1999:blog-3282000253968411774.post-27854600939695022292010-07-13T23:33:00.000+09:302010-07-13T23:33:32.121+09:30All About The Java Integer Cache<!--
- File Location: C:\Users\mkopka\Pictures\marty\temp
- Author - mkopka - Marty Kopka - 20100713 19:39pm
- Version - 0.4
--><br />
<h2>Java Integer Cache - Introduction</h2><p>I recently came across the following System property in Java: java.lang.Integer.IntegerCache.high, and looking into this further brought me to some areas of java I had not yet visited. Having gone in like an intrepid traveller and explored these new, as yet (for me anyway) unknown areas and mapped them for myself I figured the only thing to do know was to share that knowledge with others for future explorers to find their way around.</p><br />
<p>So what is this property about? </p><br />
<h3>Java Integer Cache - Description</h3><p>The Java Integer Cache was something that I only discovered recently while at work, even though it has been in the language since Java 1.5. So what is it? Well, as the name suggests its the caching of java integer objects. But, why? Well its required by the JLS (Java Language Specification) for starters which is a pretty compelling reason :-) but its also a performance improvement. The JLS section Im refering to is <a href="http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7">5.1.7 Boxing Conversions</a> where in particular it says:</p><br />
<code>If the value p being boxed is true, false, a byte, a char in the range \u0000 to \u007f, or an int or short number between -128 and 127, then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.</code><br />
<br />
<p>So for integers (or also bytes, chars, shorts) in the range of -128 to 127 the spec requires that the Object Wrappers that represent these values (i.e.: Integer, Short, Byte, Char) are cached. Also, interestingly longs are not mentioned in that part of the spec. They are mentioned a little later in a discussion section where it talks about longs but not in section 5.1.7. Despite this, when I looked at the source, the same type of caching code used for int, short, char, byte is also used for longs as well, so they are cached (and rightly so I think) in the same way as the others.</p><br />
<p>As I mentioned, this Integer caching was brought in as part of Java 1.5 as a performance improvement. Java 1.5 also introduced Autoboxing of the primitives to their Object Wrapper classes. I think most people who are Java Developers know what Autobxing entails but if you dont then Ill wait here while you have a look at the following link, have a read and then come back...ok...: <br /><br />
<ul><li><a href="http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/guide/language/autoboxing.html">Autoboxing - Guide</a></li>
<li><a href="http://java.sun.com/developer/technicalArticles/releases/j2se15/#Autoboxing%20and%20Auto-Unboxing%20of%20Primitive%20Types">Autoboxing - Technical Article</a></li>
</ul>....good...so your back hey. Alright, well now that you know all about Autoboxing, lets continue on. The cache as a performance improvement is used for all of the autoboxing (well when I say all I mean for any integer primitves, etc., that are within its cache range). Since for using autoboxing requires the use of Object Wrapper classes, even if autoboxing is just an intermediate step...i.e.: take the example of adding and then removing and using an integer in a <code>java.util.List</code>. There is the use of autoboxing when adding the int primitive to the <code>java.util.List</code>, then un-boxing when taking it from the <code>java.util.List</code> back out prior to using it. In this case the client uses only an int primitive from their point of view, but in the background under the covers the VM will use two Integer Wrapper objects. These, like normal objects need to be garbage-collected, take up memory space, etc. Therefor using caching here is definately a performance imrpovement.</p><br />
<h3>Java Integer Cache - Having a look in the java.lang.Integer java class</h3><p>Well, next up lets have a look inside the source code. This is one of the things I love about java and its JDK. The fact that there are no mysterious black box API's is cool. If you want to you can simply, using your favourite IDE and inbuilt short cut, i.e.: <cntrl>+click, jump to the source code and see what it does internally. Note: if it happens to be a native piece of code well thats another matter and you cant simply jump to view the c code...although Id love an IDE plugin for Netebeans that would allow that too. Im sure its achievable....oooh oooh I smell an an open source project brewing. Ha ha ha. Anyways, looking into the source code what do you see? Well in part tht depends is the answer. As I mentioned, this Integer caching was brought in as part of Java 1.5, and the code I show below is the inital code. However since that time it has been upgraded in order to allow the passing of a property that allows you to choose the size of the cache yourself, rather than being limited to the default -128 to 127 from the JDK. So, for interests sake Ill present both versionas, the first being around in Java 1.5 up to when the second version was brought in allowing setting of the casche size in Java 1.6.0_14 (i.e.: the 14th update for Java1.6). Ok, so first version Java1.5.0-->Java1.6.0_13:</p><br />
<h4>Java 1.5.0_20 - IntegerCache implementation</h4><code><pre>private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
</pre></code>
<h4>Java 1.6.0_14+ - IntegerCache implementation</h4><p>The new refactored implementation is below, and some things to note are as follows. For starters the new implementation has some actual comments added in unlike the initial version. Secondly, Ive also added in the static method used to get the system property for setting the cache size <code>static void getAndRemoveCacheProperties()</code>. I figured it would be interesting to show here, plus its used in the IntegerCache as a property so itll be good to see where that property comes from. The only liberty I have taken is to put the IntegerCacahe class first followed byt the other method/property unlike the reverse in the actual code. Thee reasoning being so that its easy to compare the two IntegerCache versions above and below, so keep this in mind: </p>
<code><pre>private static class IntegerCache {
static final int high;
static final Integer cache[];
static {
final int low = -128;
// high value may be configured by property
int h = 127;
if (integerCacheHighPropValue != null) {
//Use Long.decode here to avoid invoking methods that require Integer's autoboxing cache to be initialized
int i = Long.decode(integerCacheHighPropValue).intValue();
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - -low);
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
}
private IntegerCache() {}
}
/**
* Cache to support the object identity semantics of autoboxing for values between -128 and 127 (inclusive) as required by JLS.
* The cache is initialized on first usage. During VM initialization the getAndRemoveCacheProperties method may be used to get and remove any
* system properites that configure cache size. At this time, size of cache may be controlled by the vm option -XX:AutoBoxCacheMax=<size>.
*/
// value of java.lang.Integer.IntegerCache.high property (obtained during VM init)
private static String integerCacheHighPropValue;
static void getAndRemoveCacheProperties() {
if (!sun.misc.VM.isBooted()) {
Properties props = System.getProperties();
integerCacheHighPropValue = (String)props.remove("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null)
System.setProperties(props); // remove from system props
}
}
</pre></code>
<h4>Java 1.5.0_20 - Java 1.6.0_14+ - IntegerCache implementation comparisons/diffs.</h4><p>Ok, so lets look at the diffs here. For starters lets look at the IntegerCache class itself. In both cases its a <code>private static</code>. Furthermore the general layout is similar. An Integer[] array for holding the cached values of the Integer objects. However the introduction of the property for setting the cache size now changes teh way this cache array is defined. Lets take a look at the two definitions, Java1.5 first followed by the refactored version:</p><code>
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static final Integer cache[];
</code>
<p>So as you can see, the Java1.5 initial version was simpler and it defined the array size in the definition of the array because it knew the size striaght up. The new version doesnt know the size until it checks the appropriate system property so it cant define the array size until later. Its also interesting that the array size in th first version is defined as: -(-128) + 127 + 1, rather than 256. I can see the reason I suppose as by define it this way it makes it clearer why this size was chosen with the references to the cache range in the definition (i.e.:-128 to 127) and it only adds 3 extra operations so performance loss is minimal (especially since the operations are just additions and in all likelihood they are optimised away by the compiler into a single value anyway.</p><p>Ok so what else?. Well the Java1.5 version fills the cache like so:</p><code><pre> for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
</pre></code>
<p>A simple for loop over the value which is the <code>cache.length</code> ranging from the negative to postive range by the use of the: (i - 128) which uses the cache size and subtracts 128 from each value to create the ppropriate range. The new version first decodes the sytem property. It gets the property using <code>static void getAndRemoveCacheProperties()</code>with the property name being: <code>java.lang.Integer.IntegerCache.high</code>. Then prior to setting up the cache it determines teh high and low values for the range from this property. The next few lines do the following:</p><ol><li><code>int i = Long.decode(integerCacheHighPropValue).intValue();</code> - Decode the property String into an integer primitive and assign to a temp variable 'i'. Furthermore as the comment above the line specifies we use the Long classes decode method and then convert to an int primitive rather than using Integer to do so which would be quicker/simpler, but since we are initialising the cache for Integer we have to stay away from the class and its methods and hecne the use of the Long.decode() and Long.intValue() method uses.</li>
<li><code>i = Math.max(i, 127);</code> - Determine the maximum from the property and 127. The purpose of this being to make sure that the value that you pass in is AT LEAST the size of the default cache size as required by the JLS Spec. If you enter a smaller value then 127 this line hence ensures that 127 is used as the cache size/range.</li>
<li><code>h = Math.min(i, Integer.MAX_VALUE - -low);</code> - This sets up the maximum size of the array. Seems counter intuative to do this since we already did the Math.max() call above, but this call is to be safe and make sure that we dont have a array overload exception. If the value passed in through the property is large enough without this line it could cause the array to overflow. Hence the min() in conjunction with Integer.MAX_VALUE - -low, call here to makesure we dont overflow.</li>
<li>Finally, the Integer[] cache is setup in much the same way as in the first version now that we know the low and high values with a loop creating new Integer() instances over the low to high range.</li>
</ol>
<p>Now, one very interesting thing that I found out while examining this code was unexpected. Given the following example where I pass in the property -XX:AutoBoxCacheMax=<size> using size=1000, I would've thought, prior to this that the cache would've been from -1000 to 999 or perhaps -1001 to 1000. In actual fact the range of the cache is from -128 to 1000 in this case. Its an interesting side affect of this code that it is not possible to add more negative values to the cache besides the default 0 to -128 even though it is possible to add higher positive values. I think that in the future a <code>java.lang.Integer.IntegerCache.low</code> property should be added with the vm option -XX:AutoBoxCacheLow=<size>. In fact I intend to suggest this to the JDK7 project as a minor API/VM change (along with a patch for the code) as I can see no reason why adding a similar property for a max low in the cache wouldnt be acceptable given the max high is already in. Watch this space for further info on how I go :-) .</p>
<h3>Integer.valueOf(int i)</h3><h4>public static final Integer valueOf(int i) Description and Purpose</h4>The provision of the IntegerCache has lead to new rule/pattern for the creation of Integer instances. The <code>public static Integer valueOf(int i)</code> method has been provided in the Integer class API as of Java1.5 and it returns an <tt>Integer</tt> instance representing the specified <tt>int</tt> value. If a new <tt>Integer</tt> instance is not specifically required, which in most cases there should be no reason for requiring an Integer for the same primitive int but with a different hashcode, this method should generally be used in preference to the constructor version (<code>new Integer(int)</code>), as this method is likely to yield significantly better space and time performance by caching frequently requested values. </p>
<h4>Java 1.5.0_20 - Java 1.6.0_14+ - Integer.valueOf() implementation comparisons/diffs.</h4><p>As a final side note for this blog entry I just want to take a quick look at the comparison of the valueOf() method and its implementation and specifically the differences between the two versions. They are shown below:<p>This is Java1.5 Integer.valueOf(int i):
<code><pre> public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
</code></pre>This is Java1.6 Integer.valueOf(int i):
<code><pre> public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
</code></pre><p>While the two implementations are almost identical, its intersting to see the minor differences in their implemnetation. Given that the actual implementation is the same in intent its intersting to see that the developer decide to make these minor changes if they have no functionality difference. In particular, the older version defines a <code>final int offset = 128</code> whereas the newer version removes this initialisation and just uses the number (magic number) in the code. Why would they do this ? Its better coding practice to not use magic numbers. The newer version also uses a 'else' clause for returning the default new Integer(i) value if not returning from the cache. In the older verison there was no else. Like I said, in terms of intent ther is no difference but why these two changes. Also, one change which does have a purpose is the use of IntegerCache.high rather than 127 for the if statement comparison. This is required since by defining the cache high watermark we can no longer use the magic number 127.</p>
<h3>Sources / Bibliography </h3>The following links where either a direct help/reference in writing up this article or are simply good for elaborating on various concepts described above (especially for concepts around the edges and not directly part of the Java Integer Cache concept Im describing, such as autoboxing, generics, the new features introduced in Java 5 etc.
<ul> <li>IntegerCache in JDK1.5 - <a href="http://technologiquepanorama.wordpress.com/2010/02/03/integercache-in-jdk1-5/">http://technologiquepanorama.wordpress.com/2010/02/03/integercache-in-jdk1-5/</a></li>
<li>Convert String to Integer - <a href="http://stackoverflow.com/questions/1030479/most-efficient-way-of-converting-string-to-integer-in-java">http://stackoverflow.com/questions/1030479/most-efficient-way-of-converting-string-to-integer-in-java</a></li>
<li>Why use Integer.valueOf(int i) - <a href="http://tech.puredanger.com/2007/02/01/valueof/">http://tech.puredanger.com/2007/02/01/valueof/</a></li>
</ul>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com27tag:blogger.com,1999:blog-3282000253968411774.post-87423380554205140302010-07-12T05:06:00.001+09:302010-07-12T05:08:05.413+09:30Adding JUnit / Hamcrest Functionality & Sources To Netbeans<h2>Adding JUnit / Hamcrest Functionality & Sources To Netbeans</h2><div style="text-align: justify;">Im using JUnit4.5 in Netbeans for my unit testing (which in itself I wont go into detail in this blog post but JUnit and Unit Testing are things that are highly important and that I am all for the use of). Now while the latest JUnit version is up to 4.8.1/4.8.2 currently (20100712) Netbeans is not yet by default implemented to use this so for now Im using the version Netbeans comes with, 4.5, and It may be a future blogpost to upgrade Netbeans to the latest JUnit version (not tonight tho cos its 2:44am, Im still writing about Hamcrest and I got work tommorrow). Furthermore JUnit as of version 4.4 uses a library called Hamcrest internally. This is for performing a number of cool things whereby the assert* set of methods in JUnit are extended by the method assertThat():</div><br />
<code><a href="http://www.junit.org/apidocs/org/junit/Assert.html#assertThat%28T,%20org.hamcrest.Matcher%29">http://www.junit.org/apidocs/org/junit/Assert.html#assertThat%28T,%20org.hamcrest.Matcher%29</a> </code><br />
<br />
<div style="text-align: justify;">using a parameter called a Matcher. Using the Hamcrest tutorial as a starting point Im going to go through and describe the Hamcrest library and its functionality. The tutorial I mention along with a number of other links I found interesting are at the end of this post....though you first have to read it before you get to them of course :-). </div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Now Matchers as provided by Hamcrest allow us to test in a more fluent, spoken word declarative sort of a way and the Hamcrest library comes with a number of useful matchers. Here are some of the most important ones (and its important to note that a lot of these only come with the latest version of hamcrest)</div><br />
<div style="font-family: Arial,Helvetica,sans-serif;">Core</div><ul><li>anything - always matches, useful if you don't care what the object under test is</li>
<li>describedAs - decorator to adding custom failure description</li>
<li>evaluate - matches if a specified Boolean condition evaluates to true.</li>
<li>given - conditionally matches a value or Matcher</li>
<li> isA - matches a specific type</li>
<li>throws - matches if a function throws the given exception</li>
</ul><br />
Logical<br />
<ul><li>allOf - matches if all matchers match, short circuits (like &&)</li>
<li>anyOf - matches if any matchers match, short circuits (like ||)</li>
<li>not - matches if the wrapped matcher doesn't match and vice versa</li>
</ul><br />
Object<br />
<ul><li>equalTo - compares objects using ==</li>
<li>sameInstance, strictlyEqualTo - compare objects using ===</li>
<li>hasProperty - checks that a property exists and, optionally, that it matches the provided matcher</li>
<li>hasProperties - similar to hasProperty, but accepts a dictionary of properties and their associated matchers</li>
<li>hasPropertyChain - checks that a chain of properties exist and optionally that the value matches a provided value</li>
<li>instanceOf - test type</li>
<li>notNullValue, nullValue - test for null</li>
</ul><br />
Collections<br />
<ul><li>array - test an array's elements against an array of matchers</li>
<li>arrayWithSize - match an array's size against a number</li>
<li>hasItem, hasItems - test a collection contains elements</li>
<li>everyItem - test that a matcher matches every item in an array</li>
<li>sortedBy - test an array's elements are sorted a single field</li>
<li>sortedByFields - test an array's elements are sorted by multiple fields</li>
</ul><br />
Number<br />
<ul><li>closeTo - test that values are close to a given value</li>
<li>greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo - test ordering</li>
<li>between - test that a value is between two given values</li>
</ul><br />
Text<br />
<ul><li>containsString, endsWith, startsWith - test string matching</li>
<li>re - text matches a regular expression</li>
</ul><br />
Date<br />
<ul><li>dateAfter, dateAfterOrEqual, dateBefore, dateBeforeOrEqual - date comparisons</li>
<li>dateBetween - test that a date is within a given range</li>
<li>dateEqual - tests dates for equality</li>
</ul><br />
<br />
This allows for JUnit tests which are a lot more clearer in their intent. Ill give some examples of this below:<br />
<code><br />
assertThat("chocolate chips", theBiscuit.getChocolateChipCount(), equalTo(10));<br />
assertThat(someObject, notNullValue());</code><br />
<code><br />
</code><br />
<div style="text-align: justify;">As you can see these are much clearer than the usual case of simply comparing to get a boolean result. In these cases it is much clearer as to the intent of the test even though it For example, the 'is()' matcher is a wrapper that doesn't add any extra behavior to the underlying matcher. The following assertions are all equivalent:</div><code><br />
assertThat(theBiscuit, equalTo(myBiscuit));<br />
assertThat(theBiscuit, is(equalTo(myBiscuit)));<br />
assertThat(theBiscuit, is(myBiscuit));</code><br />
<code><br />
</code><br />
<div style="text-align: justify;">The last form is allowed since is(T value) is overloaded to return is(equalTo(value)). These allow the test statements to 'read' like proper english. </div><div style="text-align: justify;"><br />
</div><div style="text-align: justify;">Now Hamcrest has other features, including extensions to Matchers through your own customer matchers, and a bunch of other features (see links below). However, when I went to look at a JUnit test and I added some code to it to use these cool features, using the Netbeans functionality to go to source didnt work as there is no source attached to the code. What gives? Well I did the following. </div><br />
<ol><li style="text-align: justify;"> Download hamcrest-all.jar and junit4.8.2.jar</li>
<li style="text-align: justify;"> Then first of all i customised my junit4.5 lirary. I went to sources and added from junit4.8.2 the directory temp.hamcrest.source to the sources for junit4.5 </li>
<li style="text-align: justify;"> Now while this is fine for the Unit Matches and using Hamcrest in JUnit I was curious about ALL the Hamcrest code and so I also then went and created a new Library called Hamcrest1.1 and added the download jar as the path, source and javadoc as this contains all 3 (the .class files are ther alongside the .java) and then added this to my project which now allows me to play around with Hamcrest.</li>
</ol><div style="text-align: justify;">So with these changes I can now not only use Hamcrest with JUnit, but I can now go and browse to the source as well which I always want to be able to do as I love to be able to go digging around in the implementation and see others code and how tools I love work.</div><br />
<h2>Links</h2>Project -<a href="http://code.google.com/p/hamcrest/wiki/Tutorial">http://code.google.com/p/hamcrest/wiki/Tutorial</a><br />
JUnit Release Notes - <a href="http://old.nabble.com/JUnit-4.4-released-td11677562.html">http://old.nabble.com/JUnit-4.4-released-td11677562.html</a><br />
Tutorial on Hamcrest - <a href="http://github.com/drewbourne/hamcrest-as3">http://github.com/drewbourne/hamcrest-as3</a>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com8tag:blogger.com,1999:blog-3282000253968411774.post-59117802559790100162009-06-18T13:41:00.003+09:302009-06-18T13:54:59.558+09:30Using 'find', 'exec' and 'mv' - A More Complex Example<span style="font-family: arial;">This example follows on from my previous example of using find in conjunction with the nifty -exec command. It builds on my previous example as it adds a bit of complexity through the use of the 'mv' command and parameters AFTER the '{}'. The commands are listed in bold below along with the results. </span><br /><br /><span style="font-family: arial;">First up I run the 'find' command to get a listing of all the '*.tar' files within the current directory structure.</span><br /><br /><span style="font-family: arial;">The second bold command shows how I use the results of the listing from the first command to feed into the 'mv; command. What I'm doing here is basically saying;</span><br /><span style="font-family: arial;"> - Find all the files in the current directory tree that end in *.tar.</span><br /><span style="font-family: arial;"> - For each file name thats found we get the path to it.</span><br /><span style="font-family: arial;"> - then we call 'exec' and pass in the file path to the 'mv' command.</span><br /><br /><span style="font-family: arial;">So the end result is to find all of the *.tar files and then to move them to the directory of my choice (temp_burn in this case).</span><br /><br /><span style="font-size:85%;"><span style="font-family: courier new;">mkopka@random:~/Sandbox$ <span style="font-weight: bold;">find . -name '*.tar' </span></span><br /><span style="font-family: courier new;">./lisasoft/DefaultProject.tar</span><br /><span style="font-family: courier new;">./terrapages/TerraLoad.tar</span><br /><span style="font-family: courier new;">./terrapages/TPLoc-Demo.tar</span><br /><span style="font-family: courier new;">./terrapages/TPAPI.tar</span><br /><span style="font-family: courier new;">./terrapages/OpenGIS-API.tar</span><br /><span style="font-family: courier new;">./terrapages/TerraDirectory.tar</span><br /><span style="font-family: courier new;">./terrapages/TerraAddressHelper.tar</span><br /><span style="font-family: courier new;">./terrapages/FreeMaps.tar</span><br /><span style="font-family: courier new;">./sa.deh.tar</span><br /><span style="font-family: courier new;">./telstra/WebFOOT/lib/ldapSchemaUpdate.tar</span><br /><span style="font-family: courier new;">./telstra-WEBFOOT.tar</span><br /><span style="font-family: courier new;">./sa.epa/eelf.tar<br /><br /></span><span style="font-family: courier new;">mkopka@random:~/Sandbox$ <span style="font-weight: bold;">find . -name '*.tar' -exec mv {} ~/temp_burn/ \;</span></span><br /></span><br /><span style="font-family: arial;">As you can see above, the location to 'mv' the files to is given after the '{}'. So, in this situation you can think of the '{}' as simply a placeholder for the path from the command above it. This means that you could have the '{}' used as a parameter anywhere within whatever command you are using.</span>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-53534620515519876802009-06-15T09:53:00.001+09:302009-06-15T10:15:53.675+09:30Using 'find' and 'exec'<span style="font-family:arial;">I needed to go through all of the files in my project workspace just recently and in particular I was looking for certain string. Now in Windoze world I would've done a GUI search for text in file. How do I do the same in Linux world. Well this is one way</span>:<br /><br /> <span style="font-family:courier new;"> </span><span style="font-weight: bold;font-family:courier new;" >find . -exec grep "BLABLABLA" '{}' \; -print</span><br /><br /><span style="font-family:arial;">What this does is as follows:<br /></span><ol style="font-family: arial;"><li>First find all files starting at '.', ie: at my current location</li><li>For every file that I find execute the command grep "BLABLABLA" '{}', where '{}' contains the results of the find command (in this case a listing of every file path.</li><li>'print' out any resulting files that have this text in it.</li></ol><span style="font-family:arial;">Sweet. All done and the results I get are something along the lines of:</span><br /><br /><span style="font-size:85%;"><span style="font-family:courier new;">mkopka@random:~/$ find . -exec grep "year.development" '{}' \; -print </span><br /><span style="font-family:courier new;"><center>Copyright © @year.development@ TerraPages International</center><br />./src/html/common/footer.jsp.in<br /> <filter token="year.development" value="2006, 2007" /><br />./build.xml<br /></span></span><br /><br /><span style="font-family:arial;">Which shows me that there are two files 'footer.jsp.in' and build.xml which have the text that I am looking for, and it also gives me the path to each file and the context of the text Im searching for is printed out.<br /><br />Some links to more info:<br /></span><span style="font-family:arial;">- http://en.wikipedia.org/wiki/Find</span><br /><span style="font-family:arial;">- http://www.ibm.com/developerworks/aix/library/au-unix-find.html<br /></span>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-51435094120984464872009-04-20T15:56:00.000+09:302009-04-20T16:55:23.535+09:30Installing Tomcat5.5 On Ubuntu 8.10 (Intrepid Ibex)<div style="text-align: justify;"><span style="font-size:85%;"><span style="font-family:verdana;">So whats next in my intrepid (he he he ... get it ..intrepid...Intrepid Ibex, ubuntu 8.10....ahhh never mind :-) ) adventures in trying to get a *nix development environment going. Well. I got Java happening in my last post. A web server would be good now. So tomcat here we come.<br /><br />I want to install Tomcat 5.5 as our SOE at work is still Java 5 and Tomcat 5.5 so I went to the following URL at the tomcat website and downloaded three packages as tar.gz files:<br /><br /> <a href="http://tomcat.apache.org/download-55.cgi">http://tomcat.apache.org/download-55.cgi</a><br /><br />which where called:<br /><code><pre><br /><span style="font-family:courier new;">mkopka@random:~$ ls -l martys_stuff/</span><br /><span style="font-family:courier new;">total 9892</span><br /><span style="font-family:courier new;">-rw-r--r-- 1 mkopka mkopka 2401560 2009-04-20 15:33 apache-tomcat-5.5.27-admin.tar.gz</span><br /><span style="font-family:courier new;">-rw-r--r-- 1 mkopka mkopka 855053 2009-04-20 15:32 apache-tomcat-5.5.27-deployer.tar.gz</span><br /><span style="font-family:courier new;">-rw-r--r-- 1 mkopka mkopka 6478912 2009-04-20 15:32 apache-tomcat-5.5.27.tar.gz</span><br /></pre></code><br />Next i setup some directories where I wanted my setup to go. Im used to the following so this is what I used but your not limited to this:<br /><code><pre><br /> <span style="font-family:courier new;"> /home/mkopka/tools/apache/tomcat-5.5.27</span><br /></pre></code><br />Then i unzip and extracted the contents of each of the tar.gz files into the aforementioned directory. Now I thought, hooray Im done. I went to the bin directory and tried to run:<br /><code><pre><br /> <span style="font-family:courier new;">./catalina.sh -version</span><br /></pre></code><br /><span style="font-size:100%;"><span style="font-family:verdana;">...and rather than a happy version number proving all is good, I was rewarded with the following:</span></span><br /><code><pre><br /> <span style="font-family:courier new;">mkopka@random:~/tools/apache/tomcat-5.5.27/bin$ ./catalina.sh version </span><br /> <span style="font-family:courier new;"> Neither the JAVA_HOME nor the JRE_HOME environment variable is defined</span><br /> <span style="font-family:courier new;"> At least one of these environment variable is needed to run this program</span><br /></pre></code><br />Well, heres me thinking Java was all happy after my last post, but obviously somethings not quite right so I did the following:<br /><code><pre><br /><span style="font-family:courier new;">mkopka@random:~/tools/apache/tomcat-5.5.27/bin$ echo $JAVA_HOME</span><br /><br /><span style="font-family:courier new;">mkopka@random:~/tools/apache/tomcat-5.5.27/bin$ java -version </span><br /><span style="font-family:courier new;">java version "1.5.0_16"</span><br /><span style="font-family:courier new;">Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b02)</span><br /><span style="font-family:courier new;">Java HotSpot(TM) Server VM (build 1.5.0_16-b02, mixed mode)</span><br /><span style="font-family:courier new;">mkopka@random:~/tools/apache/tomcat-5.5.27/bin$ which java</span><br /><span style="font-family:courier new;">/usr/bin/java</span><br /><span style="font-family:courier new;">mkopka@random:~/tools/apache/tomcat-5.5.27/bin$ ls -l /usr/bin/java</span><br /><span style="font-family:courier new;">lrwxrwxrwx 1 root root 22 2009-04-02 13:42 /usr/bin/java -> /etc/alternatives/java</span><br /><span style="font-family:courier new;">mkopka@random:~/tools/apache/tomcat-5.5.27/bin$ ls -l /usr/bin/java</span><br /><span style="font-family:courier new;">lrwxrwxrwx 1 root root 22 2009-04-02 13:42 /usr/bin/java -> /etc/alternatives/java</span><br /><span style="font-family:courier new;">mkopka@random:~/tools/apache/tomcat-5.5.27/bin$ ls -la /etc/alternatives/java</span><br /><span style="font-family:courier new;">lrwxrwxrwx 1 root root 40 2009-04-14 18:23 /etc/alternatives/java -> /usr/lib/jvm/java-1.5.0-sun/jre/bin/java</span><br /><span style="font-family:courier new;">mkopka@random:~/tools/apache/tomcat-5.5.27/bin$ ls -la /usr/lib/jvm/java-1.5.0-sun/jre/bin/java</span><br /><span style="font-family:courier new;">-rwxr-xr-x 1 root root 65116 2008-05-28 18:30 /usr/lib/jvm/java-1.5.0-sun/jre/bin/java</span><br /></pre></code> <br />So as you can see above, yep, no JAVA_HOME setup. And by doing some ls,-eing I was able to find where my java was installed. So time to set a JAVA_HOME and JRE_HOME:<br /><code><pre><br /><span style=";font-family:courier new;font-size:78%;" > /usr/lib/jvm/java-1.5.0-sun/ <--- thats the location of my Java 5</span><span style=";font-family:courier new;font-size:78%;" ><br /><br /></span><span style=";font-family:courier new;font-size:78%;" > export JAVA_HOME=</span><span style=";font-family:courier new;font-size:78%;" >/usr/lib/jvm/java-1.5.0-sun/<br /> export JRE_HOME=</span><span style=";font-family:courier new;font-size:78%;" >/usr/lib/jvm/java-1.5.0-sun/jre</span><br /><span style="font-size:85%;"><span style="font-family:verdana;"></span></span></pre></code><br />I added these to my ~/.bashrc so that I would have these everytime i started a shell. Now running the same ./catalina.sh version command i get:<br /><code><pre><br /><div style="text-align: justify;"><span style="font-size:85%;"><span style="font-family:verdana;"><span style="font-family:courier new;">mkopka@random:~/tools/apache/tomcat-5.5.27/bin$ ./catalina.sh version</span></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;"><span style="font-family:courier new;">Using CATALINA_BASE: /home/mkopka/tools/apache/tomcat-5.5.27</span></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;"><span style="font-family:courier new;">Using CATALINA_HOME: /home/mkopka/tools/apache/tomcat-5.5.27</span></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;"><span style="font-family:courier new;">Using CATALINA_TMPDIR: /home/mkopka/tools/apache/tomcat-5.5.27/temp</span></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;"><span style="font-family:courier new;">Using JRE_HOME: /usr/lib/jvm/java-1.5.0-sun/jre</span></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;"><span style="font-family:courier new;">Server version: Apache Tomcat/5.5.27</span></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;"><span style="font-family:courier new;">Server built: Aug 28 2008 10:08:26</span></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;"><span style="font-family:courier new;">Server number: 5.5.27.0</span></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;"><span style="font-family:courier new;">OS Name: Linux</span></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;"><span style="font-family:courier new;">OS Version: 2.6.27-11-generic</span></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;"><span style="font-family:courier new;">Architecture: i386</span></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;"><span style="font-family:courier new;">JVM Version: 1.5.0_16-b02</span></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;"><span style="font-family:courier new;">JVM Vendor: Sun Microsystems Inc.</span></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;"></span></span></div><span style="font-size:85%;"><span style="font-family:verdana;"></span></span></pre></code><br />Woohoo!!!! It works I have the version number which is always a good start. So next, its time to cross fingers and try to start up the sever.<br /><code><pre><br /> <span style="font-family:courier new;">./catalina.sh run</span><br /></pre></code><br />and I was happy to see a line saying:<br /></span></span><span style="font-size:85%;"><span style="font-family:verdana;"><code><pre><br /><span style="font-size:85%;"><span style="font-family:verdana;"> <span style="font-family:courier new;"> INFO: Server startup in 1651ms</span><br /></span></span><span style="font-size:85%;"><span style="font-family:verdana;"></span></span></pre></code></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;">...and most importantly going to : http://localhost:8080/ shows me the tomcat startup page! We have lift off!!!</span><br /><br /><span style="font-family:verdana;">Okay, okay, okay, lets not get too excited yet. time to kill the server and setup some security stuff.<br /><br /><span style="font-weight: bold;">Setup Security</span><br />In order to use the tomcat manager and admin components you need to setup a username and password. There is a tomcat-users.xml file that can be used for this purpose:<br /></span></span><span style="font-size:85%;"><span style="font-family:verdana;"><code></code><pre><br /><span style="font-size:85%;"><span style="font-family:verdana;"> <span style="font-family:courier new;"> $</span></span></span><span style=";font-family:courier new;font-size:85%;" >CATALINA_HOME/</span><span style="font-size:85%;"><span style="font-family:verdana;"><span style="font-family:courier new;">conf/tomcat-users.xml</span><br /></span></span><span style="font-size:85%;"><span style="font-family:verdana;"></span></span></pre></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;">is where the file is located in my install. Within it you'll find a number of users. You need to create a new admin user entry:<br /></span></span><span style="font-size:85%;"><span style="font-family:verdana;"><code></code><pre><br /><span style="font-size:85%;"><span style="font-family:verdana;"> <span style="font-family:courier new;"><user username="admin" password="admin" roles="admin,manager"><br /></user></span></span></span><span style="font-size:85%;"><span style="font-family:verdana;"></span></span></pre></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;">this is the user name and password to use for the admin and manager console and along with this you need the roles created as well so that the tomcat-users.xml file now looks like:<br /><code><pre><br /><span style="font-family:courier new;"></span><br /><span style="font-family:courier new;"><tomcat-users></span><br /><span style="font-family:courier new;"> <role rolename="tomcat"/></span><br /><span style="font-family:courier new;"> <role rolename="role1"/></span><br /><span style="font-family:courier new;"> <role rolename="admin"/></span><br /><span style="font-family:courier new;"> <role rolename="manager"/></span><br /><span style="font-family:courier new;"> <user username="tomcat" password="tomcat" roles="tomcat"/></span><br /><span style="font-family:courier new;"> <user username="both" password="tomcat" roles="tomcat,role1"/></span><br /><span style="font-family:courier new;"> <user username="role1" password="tomcat" roles="role1"/></span><br /><span style="font-family:courier new;"> <user username="admin" password="admin" roles="admin,manager"/></span><br /><span style="font-family:courier new;"></tomcat-users/></span><br /><span style="font-family:courier new;"></span><br /></pre></code><br /><br /><span style="font-weight: bold;">Library Driver Setup</span><br />Tomcat needs to have the DB drivers added to it for Oracle and PostgreSQL. If you don't add them you will get the error messages as shown here:<br /><br /><span style="font-weight: bold;">Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'</span><br />Put the Oracle JDBC jar into Tomcats lib directory: $CATALINA_HOME/lib (not into the applications libs directory!).<br />Note: if you use Tomcat 5.5.x: use $CATALINA_HOME/common/lib (and not $CATALINA_HOME/server/lib)!<br /><br /><span style="font-weight: bold;">Cannot load JDBC driver class 'org.postgis.DriverWrapper'</span><br />The full message is:<br /><code><br /> <span style="font-family:courier new;">org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'org.postgis.DriverWrapper'</span><br /></code><br /><br />Same as above, requires the Postgis class added to the tomcat libs directory.<br /><br />So you need to add the driver libraries. The libraries are added to:<br /><code><pre><br /> <span style="font-family:courier new;">$CATALINA_HOME/common/endorsed (or common/lib directory - not sure which one, try one then other if fails still)</span><br /><span style="font-size:85%;"><span style="font-family:verdana;"></span></span></pre></code></span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;">and the libraries that need to be added are:<br /><code><pre><br /> <span style="font-family:courier new;">ojdbc14.jar</span><br /><span style="font-family:courier new;"> postgis_1.1.0.jar</span><br /><span style="font-family:courier new;"> postgresql-8.1-407.jdbc.jar</span><br /></pre></code><br /><br /><span style="font-weight: bold;">Testing of Port Setup</span><br />At this stage you should have a Tomcat install of the web server, the admin and the manager consoles. First check:<br /><code><pre><br /> <span style="font-family:courier new;">$CATALINA_HOME/conf/server.xml</span><br /></pre></code><br />and confirm that the port number you are using is 8080. This is done by checking that the following block is available within the server.xml:<br /><code><pre><br /> <service name="Catalina"><br /> <connector port="8080" redirectport="8443" minsparethreads="25" connectiontimeout="20000" maxsparethreads="75" maxthreads="150"><br /> <connector port="8009" redirectport="8443" protocol="AJP/1.3"><br /> <engine defaulthost="localhost" name="Catalina"><br /> <realm classname="org.apache.catalina.realm.UserDatabaseRealm"><br /> <host appbase="webapps" name="localhost"></host><br /> </realm><br /> </engine><br /> </connector><br /> </connector><br /> </service><br /></pre></code><br /><br /><span style="font-weight: bold;">Startup Of Server</span><br />Then you should be able to start the server by going to the bin/ directory and running<br /><code><pre><br /> <span style="font-family:courier new;">./catalina.sh run | tee ../logs/standard_out.log </span><br /></pre></code> <br />which runs Tomcat in the same window and also feeds the logs to the log file listed.<br /><br /><span style="font-weight: bold;">Testing of Server</span><br />You should now be able to go to :<br /><code><pre><br /> <span style="font-family:courier new;">http://localhost:8080/</span><br /></pre></code><br /><span style="font-size:85%;"><span style="font-family:verdana;">which should bring up the tomcat start page. On the left side should be the options to go to the Tomcat manager and Administration. Test that you can go to both of these. The user name and password that were used in tomcat-users.xml is what is required to log in to both.<br /><br /><span style="font-weight: bold;">Deployment of Web Applications</span><br />Using the Tomcat Manager you can deploy a war file by selecting it with the browse button and then deploying it through the Tomcat Manager Deploy Tool. This should cause it to eventually appear in the Tomcat Manager list of applications. Then you should be able to either click on the application or type in:<br /><code></code><pre><br /> <span style="font-family:courier new;">http://localhost:8080/<webapp_path></webapp_path></span><br /><span style="font-size:85%;"><span style="font-family:verdana;"></span></span></pre> </span></span><br /><span style="font-size:85%;"><span style="font-family:verdana;">(ie: /directory, /opengis-xls, etc etc, depending on the web app you deployed.)<br /></span></span><span style="font-size:85%;"><span style="font-family:verdana;"><br /><br /></span></span></div>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0tag:blogger.com,1999:blog-3282000253968411774.post-85214359676072210732009-04-14T18:51:00.000+09:302009-04-15T14:07:08.649+09:30Changing / Selecting Java Versions in Ubuntu / XUbuntu<div style="text-align: justify;">Okay, so I had Java6 installed by default when I installed XUbuntu. Now at work we primarily still use Java5 due to the backwards comparability etc etc, and so I needed to run that as my default JVM. Not a problem I thought.<br /><br />(BTW: If I dont make it to the end of this article/post its the hiccups man!!!!I've got a mo*&&*ther f&*^king case of hiccups that just wont freaking go away. they been holding on to me for the last freaking hour and Im stuck as a fuck tryign to get rid of them. My chest is starting to hurt and I juast cant make them stop. Every freakin 10 seconds I hiccup!!! SHIIIIIIT!!!!....anyways bacak to Java Versions ey...although if this post stops half way through then you've been warne and all i could manage to do was to despreately push the publich button).<br /><br />So I used Synaptic Package Manager and I happily installed Java 5. Then I went ahead and I type:<br /><code></code><br /><code> mkopka@random:~/Sandbox$ java -version </code><br /><code> java version "1.6.0_10"</code><br /><code> Java(TM) SE Runtime Environment (build 1.6.0_10-b33)</code><br /><code> Java HotSpot(TM) Server VM (build 11.0-b15, mixed mode)</code><br /><code></code><br /><br />Ok, well thats no good. I want my Java 5 that I just installed. So what to do. A bit of research led me to a couple of things. First of all:<br /><code></code><pre><br /><code> mkopka@random:~/Sandbox$ which java </code><br /><code> /usr/bin/java</code><br /><code> mkopka@random:~/Sandbox$ ls -l /usr/bin/java</code><br /><code> lrwxrwxrwx 1 root root 22 2009-04-02 13:42 /usr/bin/java -> /etc/alternatives/java</code><br /><code> mkopka@random:~/Sandbox$ ls -la /etc/alternatives/java</code><br /><code> lrwxrwxrwx 1 root root 36 2009-04-11 18:04 /etc/alternatives/java -> /usr/lib/jvm/java-6-sun/jre/bin/java<br /> mkopka@random:~/Sandbox$ ls -la /usr/lib/jvm/java-6-sun/bin/java<br /> lrwxrwxrwx 1 root root 15 2009-04-02 13:39 /usr/lib/jvm/java-6-sun/bin/java -> ../jre/bin/java<br /></code><code></code><br /></pre><br />Okay, so that led me through a bunch of soft links from /usr/bin to /etc/alternatives to /usr/lib/jvm/java-6 and then back up a directory to the jre/bin. Interesting. Whats more insteresting was this:<br /><code></code><pre><br /><span style="font-size:85%;"><span style="font-family:courier new;"> mkopka@random:~/Sandbox$ ls -l /usr/lib/jvm/</span><br /><span style="font-family:courier new;"> total 8</span><br /><span style="font-family:courier new;"> lrwxrwxrwx 1 root root 23 2009-04-11 18:03 java-1.5.0-sun -> java-1.5.0-sun-1.5.0.16</span><br /><span style="font-family:courier new;"> drwxr-xr-x 10 root root 4096 2009-04-11 18:04 java-1.5.0-sun-1.5.0.16</span><br /><span style="font-family:courier new;"> lrwxrwxrwx 1 root root 19 2009-04-02 13:39 java-6-sun -> java-6-sun-1.6.0.10</span><br /><span style="font-family:courier new;"> drwxr-xr-x 8 root root 4096 2009-04-11 18:04 java-6-sun-1.6.0.10</span></span><br /></pre><br /><br />So it seems like we got sim links galore occurring. Which made me think, this is gonna be a total shit trying to re-simlink all of that mess.Surely theres got to be another way.......and guess what? There is!!! Thank god almighty for XUbuntu!!!<br /><br />Okay so this is what I did:<br /><code></code><pre><br /><span style="font-size:85%;">mkopka@random:~/Sandbox$<span style="font-weight: bold;"> sudo update-alternatives --config java</span><br />[sudo] password for mkopka:<br /><br />There are 2 alternatives which provide `java'.<br /><br />Selection Alternative<br />-----------------------------------------------<br />*+ 1 /usr/lib/jvm/java-6-sun/jre/bin/java<br /> 2 /usr/lib/jvm/java-1.5.0-sun/jre/bin/java<br /><br />Press enter to keep the default[*], or type selection number: 2<br />Using '/usr/lib/jvm/java-1.5.0-sun/jre/bin/java' to provide 'java'.<br />mkopka@random:~/Sandbox$ java -version<br />java version "1.5.0_16"<br />Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b02)<br />Java HotSpot(TM) Server VM (build 1.5.0_16-b02, mixed mode)</span><br /></pre><br /><br />The line above in bold is all i needed to be provideed with a nice menu for configuring my default java versioon. And then a quick java -version and looky looky we now are running java 5 as the default. Damn it I luuurve linux/XUbunutu more and more the more I use it!.<br /><br />So then to switch the javva version and the javac version that is being used these are used:<br /><code><pre><br /> sudo update-alternatives --config java ---> is used to choose the java version<br /> sudo update-alternatives --config javac --> is used to change the javac version<br /></pre></code><br /></div>Marty Kopkahttp://www.blogger.com/profile/17649602859419230307noreply@blogger.com0