{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# odm2api demo with Little Bear SQLite sample DB\n", "Largely from https://github.com/ODM2/ODM2PythonAPI/blob/master/Examples/Sample.py \n", "- 4/25/2016. Started testing with the new `odm2` conda channel, based on the new `0.5.0-alpha` odm2api release. See my `odm2api_odm2channel` env. Ran into problems b/c the SQLite database needed to be updated to have a `SamplingFeature.FeatureGeometryWKT` field; so I added and populated it manually with `SQLite Manager`.\n", "- 2/7/2016. Tested successfully with `sfgeometry_em_1` branch, with my overhauls. Using `odm2api_dev` env.\n", "- 2/1 - 1/31. Errors with SamplingFeatures code, with latest odm2api from master (on env `odm2api_jan31test`). *The code also fails the same way with the `odm2api` env, but it does still run fine with the `odm2api_jan21` env! I'm investigating the differences between those two envs.*\n", "- 1/22-20,9/2016.\n", "\n", "Author: Emilio Mayorga" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create a connection to the ODM2 database" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true, "scrolled": true }, "outputs": [], "source": [ "import os\n", "from odm2api.ODMconnection import dbconnection\n", "\n", "\n", "odm2db_fpth = os.path.join('data', 'ODM2.sqlite')\n", "session_factory = dbconnection.createConnection('sqlite', odm2db_fpth, 2.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Read the database" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from odm2api.ODM2.services.readService import ReadODM2\n", "\n", "\n", "read = ReadODM2(session_factory)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Run some basic sample queries" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "USU36: Temperature\n" ] } ], "source": [ "allVars = read.getVariables()\n", "\n", "for x in allVars:\n", " print('{}: {}'.format(x.VariableCode, x.VariableNameCV))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Read some metadata from the database: people and affiliation" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Jeff Horsburgh\n", "Jeff: 1\n" ] } ], "source": [ "allPeople = read.getPeople()\n", "\n", "if allPeople:\n", " for x in allPeople:\n", " print('{} {}'.format(x.PersonFirstName, x.PersonLastName))\n", "\n", "allaff = read.getAffiliations()\n", "\n", "if allaff:\n", " for x in allaff:\n", " print('{}: {}'.format(x.PersonObj.PersonFirstName, x.OrganizationID))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SamplingFeatures tests" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get all of the SamplingFeatures from the database that are Sites" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ ": \n" ] } ], "source": [ "try:\n", " siteFeatures = read.getSamplingFeatures(type='Site')\n", " numSites = len(siteFeatures)\n", " for x in siteFeatures:\n", " print(': '.format(x.SamplingFeatureCode, x.SamplingFeatureName))\n", "except Exception as e:\n", " print('Unable to demo getSamplingFeatures(type=\"Site\")\\n{}'.format(e))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[, 'SamplingFeatureGeotypeCV': u'Point', 'SamplingFeatureName': u'Little Bear River at Mendon Road near Mendon, Utah', 'ElevationDatumCV': u'NGVD29', 'Elevation_m': 1345.0, 'SamplingFeatureUUID': u'938e328c-0e38-11e6-819c-f45c8999816f', 'SamplingFeatureTypeCV': u'Site', 'SamplingFeatureCode': u'USU-LBR-Mendon', 'SamplingFeatureID': 1, 'FeatureGeometryWKT': u'POINT (-111.946402 41.718473)'})>]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "read.getSamplingFeatures()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[, 'SamplingFeatureGeotypeCV': u'Point', 'SamplingFeatureName': u'Little Bear River at Mendon Road near Mendon, Utah', 'ElevationDatumCV': u'NGVD29', 'Elevation_m': 1345.0, 'SamplingFeatureUUID': u'938e328c-0e38-11e6-819c-f45c8999816f', 'SamplingFeatureTypeCV': u'Site', 'SamplingFeatureCode': u'USU-LBR-Mendon', 'SamplingFeatureID': 1, 'FeatureGeometryWKT': u'POINT (-111.946402 41.718473)'})>]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "read.getSamplingFeatures(codes=['USU-LBR-Mendon'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Now get the SamplingFeature object for a SamplingFeature code" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'ElevationDatumCV': u'NGVD29',\n", " 'Elevation_m': 1345.0,\n", " 'FeatureGeometryWKT': u'POINT (-111.946402 41.718473)',\n", " 'SamplingFeatureCode': u'USU-LBR-Mendon',\n", " 'SamplingFeatureDescription': None,\n", " 'SamplingFeatureGeotypeCV': u'Point',\n", " 'SamplingFeatureID': 1,\n", " 'SamplingFeatureName': u'Little Bear River at Mendon Road near Mendon, Utah',\n", " 'SamplingFeatureTypeCV': u'Site',\n", " 'SamplingFeatureUUID': u'938e328c-0e38-11e6-819c-f45c8999816f',\n", " '_sa_instance_state': }" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sf_lst = read.getSamplingFeatures(codes=['USU-LBR-Mendon'])\n", "\n", "vars(sf_lst[0])" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ", 'SamplingFeatureGeotypeCV': u'Point', 'SamplingFeatureName': u'Little Bear River at Mendon Road near Mendon, Utah', 'ElevationDatumCV': u'NGVD29', 'Elevation_m': 1345.0, 'SamplingFeatureUUID': u'938e328c-0e38-11e6-819c-f45c8999816f', 'SamplingFeatureTypeCV': u'Site', 'SamplingFeatureCode': u'USU-LBR-Mendon', 'SamplingFeatureID': 1, 'FeatureGeometryWKT': u'POINT (-111.946402 41.718473)'})>" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sf = sf_lst[0]\n", "\n", "sf" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "(, u'POINT (-111.946402 41.718473)')\n" ] } ], "source": [ "print(type(sf))\n", "\n", "print(type(sf.FeatureGeometryWKT), sf.FeatureGeometryWKT)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "table = \"\"\"\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Code{}
TypeCV{}
Name{}
\n", "\n", "\n", "\"\"\".format" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import folium\n", "\n", "lon, lat = sf.Longitude, sf.Latitude\n", "\n", "m = folium.Map(location=[lat, lon], zoom_start=16)\n", "\n", "icon = folium.Icon(color='orange', icon='info-sign', prefix='glyphicon')\n", "\n", "width, height = 310, 130\n", "html = table(sf.SamplingFeatureCode, sf.SamplingFeatureTypeCV, sf.SamplingFeatureName)\n", "iframe = folium.IFrame(html, width=width, height=height)\n", "popup = folium.Popup(iframe)\n", "\n", "folium.Marker(location=[lat, lon], icon=icon, popup=popup).add_to(m)\n", "\n", "m" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Back to the rest of the demo" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[, 'VariableID': 1, 'ProcessingLevelID': 1, 'StatusCV': u'Unknown', 'ValueCount': 24206, 'ValidDateTime': None, 'UnitsID': 96, 'FeatureActionID': 1, 'ResultDateTimeUTCOffset': -7, 'TaxonomicClassifierID': None, 'ResultTypeCV': u'Time series coverage', 'SampledMediumCV': u'Surface Water', 'ResultDateTime': datetime.datetime(2016, 4, 29, 12, 31, 23, 801947), 'ResultID': 1})>]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "read.getResults()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ", 'MethodID': 1, 'ActionDescription': u'An observation action that generated a time series result.', 'ActionFileLink': None, 'EndDateTime': datetime.datetime(2009, 1, 16, 12, 30), 'BeginDateTimeUTCOffset': -7, 'EndDateTimeUTCOffset': -7, 'ActionTypeCV': u'Observation', 'ActionID': 1, 'BeginDateTime': datetime.datetime(2007, 8, 16, 16, 30)})>" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "firstResult = read.getResults()[0]\n", "firstResult.FeatureActionObj.ActionObj" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Foreign Key Example\n", "\n", "Drill down and get objects linked by foreign keys" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The FeatureAction object for the Result is: , 'ActionID': 1})>\n", "The Action object for the Result is: , 'MethodID': 1, 'ActionDescription': u'An observation action that generated a time series result.', 'ActionFileLink': None, 'EndDateTime': datetime.datetime(2009, 1, 16, 12, 30), 'BeginDateTimeUTCOffset': -7, 'EndDateTimeUTCOffset': -7, 'ActionTypeCV': u'Observation', 'ActionID': 1, 'BeginDateTime': datetime.datetime(2007, 8, 16, 16, 30)})>\n", "\n", "The following are some of the attributes for the Action that created the Result: \n", "ActionTypeCV: Observation\n", "ActionDescription: An observation action that generated a time series result.\n", "BeginDateTime: 2007-08-16 16:30:00\n", "EndDateTime: 2009-01-16 12:30:00\n", "MethodName: Quality Control Level 1 Data Series created from raw QC Level 0 data using ODM Tools.\n", "MethodDescription: Quality Control Level 1 Data Series created from raw QC Level 0 data using ODM Tools.\n" ] } ], "source": [ "try:\n", " # Call getResults, but return only the first result.\n", " firstResult = read.getResults()[0]\n", " action_firstResult = firstResult.FeatureActionObj.ActionObj\n", " print('The FeatureAction object for the Result is: {}'.format(firstResult.FeatureActionObj))\n", " print('The Action object for the Result is: {}'.format(action_firstResult))\n", " print(\n", " '\\nThe following are some of the attributes for the Action that created the Result: \\n' +\n", " 'ActionTypeCV: ' + action_firstResult.ActionTypeCV + '\\n' +\n", " 'ActionDescription: ' + action_firstResult.ActionDescription + '\\n' +\n", " 'BeginDateTime: ' + str(action_firstResult.BeginDateTime) + '\\n' +\n", " 'EndDateTime: ' + str(action_firstResult.EndDateTime) + '\\n' +\n", " 'MethodName: ' + action_firstResult.MethodObj.MethodName + '\\n' +\n", " 'MethodDescription: ' + action_firstResult.MethodObj.MethodDescription\n", " )\n", "except Exception as e:\n", " print('Unable to demo Foreign Key Example: {}'.format(e))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example of Retrieving Attributes of a Time Series Result using a ResultID" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(odm2api.ODM2.models.TimeSeriesResults,\n", " {'FeatureActionID': 1,\n", " 'FeatureActionObj': , 'ActionID': 1})>,\n", " 'ProcessingLevelID': 1,\n", " 'ResultDateTime': datetime.datetime(2016, 4, 29, 12, 31, 23, 801947),\n", " 'ResultDateTimeUTCOffset': -7,\n", " 'ResultID': 1,\n", " 'ResultTypeCV': u'Time series coverage',\n", " 'ResultUUID': u'938fec1c-0e38-11e6-98c2-f45c8999816f',\n", " 'SampledMediumCV': u'Surface Water',\n", " 'StatusCV': u'Unknown',\n", " 'TaxonomicClassifierID': None,\n", " 'UnitsID': 96,\n", " 'ValidDateTime': None,\n", " 'ValidDateTimeUTCOffset': None,\n", " 'ValueCount': 24206,\n", " 'VariableID': 1,\n", " '_sa_instance_state': })" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tsResult = read.getResults(ids=[1])[0]\n", "\n", "type(tsResult), vars(tsResult)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Why are `ProcessingLevelObj`, `VariableObj` and `UnitsObj` objects not shown in the above `vars()` listing!?** They **are** actually available, as demonstrated in much of the code below." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Some of the attributes for the TimeSeriesResult retrieved using getResults(ids=[]): \n", "ResultTypeCV: Time series coverage\n", "ProcessingLevel: Quality controlled data\n", "SampledMedium: Surface Water\n", "Variable: USU36: Temperature\n", "AggregationStatistic: Average\n", "Elevation_m: 1345.0\n", "SamplingFeature: USU-LBR-Mendon - Little Bear River at Mendon Road near Mendon, Utah\n" ] } ], "source": [ "try:\n", " tsResult = read.getResults(ids=[1])[0]\n", " # Get the site information by drilling down.\n", " sf_tsResult = tsResult.FeatureActionObj.SamplingFeatureObj\n", " print('Some of the attributes for the TimeSeriesResult retrieved using getResults(ids=[]): \\n' +\n", " 'ResultTypeCV: ' + tsResult.ResultTypeCV + '\\n' +\n", " # Get the ProcessingLevel from the TimeSeriesResult's ProcessingLevel object.\n", " 'ProcessingLevel: ' + tsResult.ProcessingLevelObj.Definition + '\\n' +\n", " 'SampledMedium: ' + tsResult.SampledMediumCV + '\\n' +\n", " # Get the variable information from the TimeSeriesResult's Variable object.\n", " 'Variable: ' + tsResult.VariableObj.VariableCode + ': ' + tsResult.VariableObj.VariableNameCV + '\\n' +\n", " 'AggregationStatistic: ' + tsResult.AggregationStatisticCV + '\\n' +\n", " # Get the site information by drilling down.\n", " 'Elevation_m: ' + str(sf_tsResult.Elevation_m) + '\\n' +\n", " 'SamplingFeature: ' + sf_tsResult.SamplingFeatureCode + ' - ' +\n", " sf_tsResult.SamplingFeatureName)\n", "except Exception as e:\n", " print('Unable to demo Example of retrieving Attributes of a time Series Result: {}'.format(e))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example of Retrieving Time Series Result Values, then plotting them" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
valueidresultiddatavaluevaluedatetimeutcoffsetcensorcodecvqualitycodecvtimeaggregationintervaltimeaggregationintervalunitsid
valuedatetime
2009-01-04 18:00:00236411-0.268333-7ncUnknown30.0102
2009-01-04 06:00:00236171-0.266667-7ncUnknown30.0102
2008-12-18 01:00:00229221-0.263333-7ncUnknown30.0102
2009-01-04 05:30:00236161-0.263333-7ncUnknown30.0102
2009-01-04 06:30:00236181-0.263333-7ncUnknown30.0102
\n", "
" ], "text/plain": [ " valueid resultid datavalue valuedatetimeutcoffset \\\n", "valuedatetime \n", "2009-01-04 18:00:00 23641 1 -0.268333 -7 \n", "2009-01-04 06:00:00 23617 1 -0.266667 -7 \n", "2008-12-18 01:00:00 22922 1 -0.263333 -7 \n", "2009-01-04 05:30:00 23616 1 -0.263333 -7 \n", "2009-01-04 06:30:00 23618 1 -0.263333 -7 \n", "\n", " censorcodecv qualitycodecv timeaggregationinterval \\\n", "valuedatetime \n", "2009-01-04 18:00:00 nc Unknown 30.0 \n", "2009-01-04 06:00:00 nc Unknown 30.0 \n", "2008-12-18 01:00:00 nc Unknown 30.0 \n", "2009-01-04 05:30:00 nc Unknown 30.0 \n", "2009-01-04 06:30:00 nc Unknown 30.0 \n", "\n", " timeaggregationintervalunitsid \n", "valuedatetime \n", "2009-01-04 18:00:00 102 \n", "2009-01-04 06:00:00 102 \n", "2008-12-18 01:00:00 102 \n", "2009-01-04 05:30:00 102 \n", "2009-01-04 06:30:00 102 " ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tsValues = read.getResultValues(resultids=[1]) # Get the values for a particular TimeSeriesResult.\n", "\n", "tsValues.set_index('valuedatetime', inplace=True)\n", "\n", "tsValues.head() # Return type is a pandas dataframe." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAApkAAACmCAYAAACRHJQDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd4FOXaxu93W3qBdEIJkBBK6KEXEzqigqKi2EGxIHKU\nclDxiKLIsX0WbHhEREUERECaSAm9l0DoJaGkENLLpmx5vz9my8zuzO5ssglLeH/XlYvslHeekOzO\nM0+5H0IpBYPBYDAYDAaD4U4Ut9oABoPBYDAYDEbDgzmZDAaDwWAwGAy3w5xMBoPBYDAYDIbbYU4m\ng8FgMBgMBsPtMCeTwWAwGAwGg+F2mJPJYDAYDAaDwXA7zMlkMBgMBoPBYLgd5mQyGAwGg8FgMNwO\nczIZDAaDwWAwGG5HdasNkENoaCiNiYmp9Trl5eXw8/OrvUFuwJNsMeNpNjF7nOMpNnmKHXw8ySZP\nssWMp9nE7HGOJ9nkSbaY8TSbGrI9R44cyaOUhjk9kFLq8V/du3en7mD79u1uWccdeJItZjzNJmaP\nczzFJk+xg48n2eRJtpjxNJuYPc7xJJs8yRYznmZTQ7YHwGEqw39j6XIGg8FgMBgMhtthTiaDwWAw\nGAwGw+0wJ5PBYDAYHkNmUQWq9UbZx285fQNVekMdWsRgMGoKczIZDAaDccu4XqjFqqPXcfSGHg98\nvQf95m/D1GXHZJ17OqsEzy45jDlrT1m2FZRXY92JrLoyl8FguMBt0V3OYDAYjIbJhMWHcP5GmelV\nFQBgY1oOPtl8DsevFeHnib0kzy2qqAYA/HbwGradzUWLED8cTC8AAHRuGoxmjX2RW1oJfy8VfDUq\nnM0pwYjPdiFlehJiQj2n65fBaKg4dDIJIRoAdwMYAKAJgAoAaQA2UErP1r15DAaDwWhIVOoM+Ney\n4yiv1mNYh0iegynky20Xna5FQCzf3yipwo2SKsvrCh2XQu/5/la0iwrExqkDsOY4F+H8KzULUwbH\n1ebHYDAYMpBMlxNCZgM4ACAZQCqAnwCsBeeY/h8hZBMhJKE+jKzQGZCeV14fl2IwGAxGHXIqqxib\nTuVg14U8vLU6zenxnFqKPYcyCvDo9/slzzMYreedyS5BQXk1/krlnEydQV7N53c7LiFm1np2/2Ew\naoijmsyTlNKulNKplNIllNJNlNLVlNIPKaUjATwDwLc+jLyYW4bkj1Pq41IMBoPBqENUCtdaAap4\nTUC5JZUor9IDAH7ed8XheanXihAza73l9Qs/H8H1wgq7NQ1GKtk49MFGLmGX/HEKzt8odcluBoPh\nOF2+iRASQinN528khIQAKKOUZgPIrlPrGAwGg3Fb88QPB+DvpcLYbk3x9tpT+OLRLi6dX1alh7da\nCQDoOW+r7PNmrTopeH0wo8Dy/Xc7LyMswAtdmzfCC78cwc3SKmycOgDtogIl1zt/oxRtIgIAAHqD\nEeXVBgT5qF35URiMOw5Hj5SfAxgksn0UgE/rxhwGg8FgNBRSrxVh14U8bEzLwbNLDiOzqEJQNymH\nm6VVmLfhDLTVerfa9t76Mxj7zV7cLOXsGfn5LqRlFuNMdglKKnVYlCa0k59in74iFZ3f2WyZanI4\nowCllTq32sdgNAQcRTIHUkpfsN1IKV1CCPl3HdrEYDAYjNscSilGf7XHbvtLvx51aZ3vd17GqmOZ\nWLjzsrtMk+RqgRYv/XoUPWIa4dB1oVO75XQuhneIhK9GhdWmBqLMogoM/XQnKnQGdGkWjNWT+9W5\njQzG7YSjSCap4T6Po1JnwJy1p1BYKV/gl8FgMBg1R28Ub9hxlVXHMt2yzpguTZweY45GHsootNu3\n/mQ2vt+ZLtj23JIjli7249eK3GAlg9GwcORk5hFCuttuJIR0A1AgcrzHUFalF3QW7rucj8V7M7Dq\nAktnMBgMRn3gytSe+iDYV+P0mH//cdLh/h3ncwEAGhV36zyTXVJ7wxiMBoyjdPkMAH8QQv4H4Ihp\nWyKACQDG17VhYlBKQYjzIOrgT1Jwo6QKM4bHY3JyLCqquSdNrd49T9YMBoPBkEZvMOL5n484P7Ae\nySmurPUaSgV3//FSKTzOiWYwPBHJSCaldD+A3gB8ALxg+vIB0JdSuq9+zBNSXCEvEmkuLP/o73MA\nrB8MFwoNKCyvRkW1AUXa6roxksFgMO5AzmSXYN8lTozkcl45dl/Mu8UWCdl0KqfWa5iDHF4q8Vtn\npa7mM9TZ/HVGQ8ShYBmlNIdS+ialdLTp6w2TdJFTCCHNCCHbCSFnCCGnCCFTTdsbE0L+IYRcMP3b\nSK6xXd79x/L9prQc2d18StMHQ0k1MPabvRi3cJ9gLQaDwWDUjpGf77KIo2uUrmlh3i6Y4hXw1Ygn\nAfvN31ajdX/efwXxszfhWoG2pqYxGB6J008CQsgxQshRm6/thJCPCCGNHZyqBzCNUtoOXER0MiGk\nPYBZALZSSuMAbDW9donc0kq88MsRTFoiLx3DF969nFeOE9eLXb0kg8FgMGRw5EqB25p+PI2c4koY\njRTBvuL6mPnlwgzZisPXUKzVIae4Ej/uScfExYdQWG6fRft8y3kAwIAPt2PhzkuyJxIxGJ6Ow9nl\nJv4B102+1PT6EQAGAGUAFgO4T+wkvlg7pbSUEHIGQDSA0QCSTIf9BCAFgGxJpJulVdAZuA+wo1ft\nOwD1Nm9ObbUeP+3LEF1LZzBC3UCfuBkMBqO+MI9rBICx3+zDHy/2vYXW1B0Z+Vp8se0C/CQimQCw\ncOclfLjpHH5/vg9mrDyBGTgh2N917j94qk8LHL9WhNTrxRiX2MwiNg8A8zacRVZRJebc18Gy7fLN\nMgz6ZAfm9fdx/w/FYNQhcjysvpTSGZTSY6avf4PT0JwHoKWcixBCYgB0BTcLPcKccjf9G+6KwT3e\n34Jf93PjxKpECq+rbZzM9v/5GwfTxZvhzePJGAwGg1Fzpvx2TPBaLFrnjPhG1tvRi0mta22TGE0b\n1d5J2342FxTSkdp5G85Cb6QY+81eyWN+2ncFqaaM2u+Hr8F2PPv+y4JBe1hrcuL3Z7N7FuP2glDb\nv27bAwhJBTCBUnrE9LobgMWU0k6EkGOU0q5OzvcHsAPA+5TSVYSQIkppMG9/IaXUri6TEDIJwCQA\n0ETGdo966jPR9ReP8BO8LtdRTN4qr67lX9280CVcTjDX/ZSVlcHf3/+WXFsKT7OJ2eMcT7HJU+zg\n40k2eZItZtxp09ObygWvfVWA1kV/aEF/ikMFXvjpdDW+HOSLmTu1qHCzT9XIi8BAgZLqmqfzWwQq\noFYAF4vqLqXdLECBuf2sDvGfF6qx5pIOI5tRjOvgGX9HDf1v2h00ZHuSk5OPUEoTnR0nx8N6HsDP\nhBA1uLR5NYCJhBA/AB86OtF0zh8AfqWUrjJtvkEIiaKUZhNCogDkip1LKV0IYCEAeEXFSX4iJCUl\nWb43Gimmr0gFIM/J/OxoFdI/GCxLFsndpKSkCGz3BDzNJmaPczzFJk+xg48n2eRJtphxq02b1gte\nuupgJrZoBH//arxzTxLeMW27dxj3b8ys9ZLnuYpSrcaKSb0x5NOdlm1dmgW7JKRO1N5QqZUASt1m\nly1+fn5IShpoeX1Mdx64dAEqjcZj/o4a/N+0G2D2yEiXU0r3U0rbg2ve6U0pbU8p3UcpLaeU/iZ1\nHuE8tx8AnKGU8medrwXwlOn7pwCsqbn5wFOLDlq+zyyqcHk6REUtJCcYDAaDIY8gH/FmmQBvFX58\npkedXXdAXCi+fJRLuFXpjIgND8DIhEgAwNN9Y7DyhT4ujYPMyNfibE7dOZgA7Bp/zDJ8ThKPDIbH\nIae7PIwQ8h2AnyileYSQ9oSQp2Ws3Q/AEwAGEUKOm77uBjAfwFBCyAUAQ02vHcIvirZlx/mblu9r\n8gZkgroMBuN2pFpvxPjv9+OATf2ep2IU6ThXEGDN5H4I8BZ3QN3BZ+O6oFUYV1ZVaqrDn3NfBzzb\nvyXeHNUOKqUCXZpZKrjwUPemdWaLXPi9BcVaHb7YegEAczIZtx9yGn8Wg6upbGZ6fQHANGcnUUp3\nU0oJpbQTpbSL6WsDpTSfUjqYUhpn+tfpiMq4cH98+7jdhEsLP+7h5snaNv3IQax5iMFgMDyd7OIK\n7L2Uj+krU2+pHa+vcjyK0UxCdJDg9bjEZjg7dyRahdVtzZqflwqh/l6CbRGB3ph9T3uBusjUwXEY\n1DYcMaF+tkuI0rlpkPODagg/+DF/01mLJBS7WzFuN+Q4meGU0qUw/X1TSnXgJIzqlT6tQyT3vfPX\naeSVVWHY/+1wed1e87YiI6/c+YEMBoPhQShMteQV1bfO9Ug5l4vfDl51ely7qEAsfLI7Dr45GK8M\njkPnpkH474OdLDPAXaFjtGPn7j/3tMfRt4biwwc7YXyv5vBWKxHi53xu+atD22DR0+Jp+w5NAu22\ntQixOqNz7m3vdH1X4MdL+ENHjCyUybjNkNP4U24SXacAQAjpgbqseJbATyOdMgeAxPe2ONyfEB2I\ntMwS0X0rj1zH9OHxNbaNwWAw6puaZG7cibZaj6d/POTwmBeTWuNagRZz7uuAAG81ArzVeG1oG7w2\ntE2NrvnHi33RvUUjfLfjEj7YeNZu/7z7O2J8r+YAgIcTm+HhRC4Bp1IqMLZbUyTFhzm9RiCvdrRV\nqB/WvzIAPholhny6Axdzyyz7/jqRhW3T7kJOSe1nottiMFp/t/xoK/MxGbcbcpzM6QD+AtCKELID\nnKD6g3VqlQiqWoqmO3pzVuoM6PLuZoxMiMIHD3Ss1XUYDAajPrA2h9waz6Oi2nlC68k+LRAVVDtt\nyr9e7o/0/HKE+mnQvQWndvdEnxaiTqZKIa0U8snDnWVdb3zP5jibXYJfD1xFsK8aPqYAh+2oTG+V\nEq3C/C3p/gXju+Llpcfs1qsJetPAkeWHr+FPXjNrAx2kxGjAyOkuPwwgGcBdAKYCaE8pPV7XhtWW\nrx/rJng9fVg8fFXAE71b2B1bpTeiSKvDbwevmiSQGAwGw7PR6WvvcXy59QJiZq2v0RjDShn17O6Y\nqNaxaRDu69wEfWNDna6rVtVejk6pIHjQ1PzDH4+ptknt643Cn79NRECtr/3m3e0AcA1K01ekYuZK\n4bQg5mMybjckPwEIIfeZvwCMANACQHMAI0zb6p2J/WUNGAJg/yGU3DYcXw/xw8wR9mnxXw9csXy/\n8sj1mhvIYDAY9UBWUQXGLdwHAMgrq0ZmUYXLa+zP1uOTf7iZ2TdLq1w+v0qG/Ftdje2Vili663pm\nySB+9HKmTUlV39ahgtd+XvIGe1yed7el292W5wa2sgRCxO5FLJLJuN1w9I58yPT1IoCfAUwAMBHA\nEtO/9c5b98gvruZ/1vx7RFvL9wHeamybdpfgWDlvXL3BiEqmqclgMDyApQeuQstLV49esNvlNb5N\ntTqWZTUYsStHmcM2xewupAZoGNzkhSU0CcKIGDU+e6SLZVu/2FBLTefYbk3xzePCbJkPT2rvnfs6\nYOPUARjSLkJwTPuoQCgUBCM6cDqdG6cOsOxb+zKn1enloBmKiaEwbjckH70opU8AACFkLbgUeabp\ndTSAL+rHvJrRM6Yx+sdyHwbBvmq7ObitwvwRHuCFXImn99zSSoQHeAu2TfzpMHacv4mM+aPqxmgG\ng8GQicGmyDyvzLVZ4bYPzPwOZrkcznCqPgeVsn6nqZVUumcOpUJB8EhbDZo28hVsN0cr2zcJhK9G\nePts5KvG1MFxuLdzE8SGc3Wa93eNxpYzN9C9RSO8eFdr9GjZGAAwbVg8nuobg0a+XNf7tKFt0Kkp\np9XppZZ2MisN1t97WZUeF3PLBBqfDIanIecxs5XZwTSRBeCWt2KP6hQluW/umARoVAosf74P/v7X\nQNFj9s4aJHl+z/e32m0zi75fyWdyRwwG49ZRWF6NtcezarVGj/eFahyVOtdCZDvO38Rba04Jtt3d\nMRKn3x0u2OaoEacucKZCUlsa+XKd52I/FSEErw5tY3EwAe4+lTF/FP54sS+GtI+wTD1SKggiAr2h\nUSmQMX8UpgyOs5yjUjhwMk0+9IrD15Dw9t8Y89UeFFdYHxC2nb2BpQecS0oxGPWFHCdzJyFkPSHk\ncULIY+DGQu50dlJd8WjP5gjyUWPBo13xCu+NycdcT9OzZWNEBHqLHuOsW11vKoQv1uoERfF3fZSC\n3FL3S1YwGAyGHGavTqtRDSafUpuIn6tySGez7eXgxnSJtovuSaW164IPH+yEMV2i6/Qa/l6ck6it\ndk/EVAwqIYXSPzYUFaZmrxm8hiBzqcOBy/mYsPgw3vjzpOQaDEZ9I6dSeTI4ySJzSHAJgJV1ZpET\nPnigo0VmqGdMY9Fj5D49j+oYhfUns0X3aXUG+ADo/O5mu335ZdV26XQGg8GoD7KKa+dgiqFzsdhP\n7CHdXA+5a2YyBny43S12OWL79CQAQFiAF6p0BoTYTPWpC4JNkcxqQ905cVJlpX5eSlSKKAqsP5GF\nMV2iMW7hfsu264UVaNbY1+5YMfQGIw5fKUTvVtIDTxiMmuLUyaTcI9EK05dH4SORGlHKdDK/eqwb\n1s9aL7qv0xx759IMawBiMBi3grTMYhy7WuTyeZRSFFfoEOwrPvnG1UimWqTWUmfyjuQ6N7WlJW/8\no7/Mzu7aMr5Xc1zKLcOEfjF1dg3belsz/l5qVIgEUOdtOIt5G4SaoUVaHZqJx2AEbD+bi/+sTcO1\nAu7BZdO/BqBtpP10IwajpjiSMNpOCHmRENLEZruKEDKQEPIDIeSZujdRGl8JJ9NbXbd1OVobEeKl\nB66i17wtOHA5v06vy2Aw7lz2XcrHPV+63kUOAD/sTkeXd/9BZlEFjCKhMkc6mfsv56NKb/3MW3M8\nE/+xqccEgABvq6O36OlEzB7Vrka2ejKB3mp89FBnSWfdHUiNjvT3UiK/kgrmmktR7iSdfzqLK3d4\nZvEhi4MJACM+24VrBVoXrGUwHOPo8W8UgGcB/GnqKC8A4APAC8BWAF+ZhNpvGWJP0yoFQai//A8A\npYK4LHth24n5xp8nAQDjFu7H0ud62emnMRgMRm159Pv9zg+SYPu5XADAz/uuiO4XE3anlCLl/E08\n8+MhTE5ujRnDOSm4Bdsu2h075972SGpjHdk4qG0EBrW1O4whA6lySnPnfJvZG52u4Wga087zN/Hk\nooOS98mcksp6i0YzGj6OJIy04KSKviCEeAEIB1BBKc2rL+OcYS7C5nNx3t0urVEzJ1P4lKhRKSxP\nl9cKtEBrsbMYDAbj1qA0dSx/u+OS6H6xdPkv+69YOsgPZxRatitsmnlS3x5m6Zpm1B5vCZ1MqQin\nGOZI5v7L+dh3KR9tIwPQJjIAF26U4YVfjgCQlr3aeiYXPST6HRgMV5FVyEIprQJwrY5tcZnIIG9s\neGUA7v5iV43XUCkIXFOY4zr7RnaMstQB+aiVFifTNpXOYDAY9Y3BSC216TqDUSBzI8bs1WkY2j4C\np7KK0byxH2LD/bH/slUHky+8rrCpeXckHs5wnReSWmPvpXwcvlIo2O7KNKOXlx7DwfQCLJGIXDvi\np70ZmDXSGoY+k12C73ZcQlSwD6YOjoO3Wolvd1zCV1vLEXt6D1a92LdeVQQYtxe3/adD+ya1K1Ie\nbpq84Cq/8bTI+LWhFawpiMFg3ELSMovR+o0N+GF3OoordJi+IhWp15w3C+08fxMTFh/GkE93oKLa\ngBJeWZD5IbpSZ0C5zXQg5mS6F1+NCv8a0kaw7YenEuGq5GhNHEyAu4fxJ0C9vPQoVh/Pwjcpl/Dk\nDwex68JNzN94FqU64NjVIrR8fQNiZq1nGtIMUe74T4cPHuiI+7ty2moPdJWvsVapM2DF4WuImbUe\n2cVW3cxKFslkMBi3ALM24nGTQzl33Wnc++VurJEp3M7XXkyY8zd2XbBWRpnT6WO/2YurNo0hLIrl\nfvgKKU/1aYHB7SIwaWD91WG9v/6M5Xt+I+3BjAI88cNB0XOk6n0Zdzay0uWEkKYA4iil2031mSpK\nqcc8tjzWqzmigrwxxgUn0Yy3Won/ju2EQW3DcU+nKBy6UiDotpNCZzAKPpTNlFUxJ5PBYLiHimoD\nXlt+HP8e4byLpkpvhLdaKZgXbusQysW2Tt0cyTyVZS/CznA/4YGc5ue0oW0s04Biw/3RKkiBy8V1\nP8D8Jm/kstyWBZbFY4jh1MkkhEwA8DKAIHAtLS0AfA1gSN2aJp/37+9Yq/M1KgXu7cwpNW2bloS4\nN5137y0/fF10e3GFDmtTs9AzpjEig5hgO4PBEGf1sUxsSstBYkwjTOzf0hIRrNQZoDdS+HupcCA9\nHxvTcmRp81ZUG+pMvk2ObA7DfbQO80fK9CQ0t+ny9q4jOdAmQd7I4mXkzE1Gvx28ijMi053EYE4m\nQww5f7KvAOgJ4AAAUErPE0LC69SqW4jc4uqcEvHRkn8cvY4/jl5HqzA/bJuW5EbLGAxGQ+Jfvx8H\nAGw6lYOk+DDEhgcAAEZ+vgullXocnm19jpdzA6/UG1CpM2D3RfcLgPB1Mvn89XJ/t1+LwRHDE5s3\no66jWfCEEIT4aZBfzrXBmsdmvr7qpOw1+AoEDIYZOR5VJaXU0oBNCFECYEU4Trh802OqCRgMhodT\npLU22aTnlSOvrEqwX04ksVJnxOK9GVibKq8G04yY3rAtUtfv2DTIpWsxaofE/BEBv0zshT9e7OPS\nugYjxZ5Zg9DJ9Pss0uqwUWLkshQ1Lc1gNGzkOJl7CCEzAXgTQpIB/A5gXd2a5Xk81adFrc4/cb0I\nMbPWY83xTDdZxGAwGgpSmoWVOs65O+pglKS5BrOi2oCD6QWSx9nipwZiQnzx5aPdnB5bpTdaGosY\ntw6NSCQzileW9cNTiegfF4ruLVzTuVQQrj/BPEjES63Ei78eddm+I1cKkFVUgdzSSvx64Aou5pa6\nvAajYSHHyZwJoBTAWQBTwU37ebMujfI0erdqjOnD45H69rAanb/hZDbuW7AHADB/41knRzMYjDuN\nQq29kznrjxOyZop/92R3AFy6XOOCluKMRG+kzEjGiIRI+PBqOUeIyLrpjRSL9mTIXptRN9hGMjVK\nBZZM6IkZw+Ox+JkeGNS2ZpVs88d2AgBMH8ZJJ9VUJWXsN/uQ9FEKvtx6EW/+mYYhn+7E6mMssHIn\n4/ATyZQaX0Qp/YZSej+ldIzp+zuqCvyd+xIQ4K2u0VSLar0Rf5/KsbyWmhF84nqR3bhKM13e3Yzp\nK1JdvjaDwfBMbDMaeaVV6P/fbdjAS1EuO3QNZZWOZ1ADsDiIlToDVDJS32b4Mjk7ZiRZvpdqWJy7\n7rTstRl1g8bmjr17VjLiIgIwOTkWSfHhNZKTSpmehIGmkaAqpQJtIwNw7kbNI5DVBiM2pln/jg9m\nyI+uMxoeDht/KKUGQkgUIURNKXU8MqIBsW5Kfxy7Woi8smoMaReB+MiAGq3z96kcPP/zEcG2KpHa\nJoOR4r4Fe9ClWTBWT+5nt79Iq8PKI9fx8UOda2QHg8GofzKLKuCjVqKxn/2M6KnLjgteX7xZhuuF\nFXaNFo4Erle91BfeKqUl2rnzfJ5LU2FUPH8kPNAbQT5qFFfo4COn8I9xS+DXz97TKQrhAbVTMNkz\naxCig30E21x5UJGCX/4hRxmB0XCR84l0GcAuQsjrhJBXzF91bditJCE6CE/0icGrQ9vYFbb/MrGX\nw3NXvGAtuLZ1MAHxSKa5c/O4jKkcACe6vOLwNfbmZTA8mH7zt2HwJymyjjU3+tjOp/5u52XR41UK\ngm7NG6F9k0AEmnRtvt1xCSon3cc9eTOpbX3JVmFcN/OojlEI9fdyarOtc8Koe8y/s36xIU6DDrNH\ntRPd/mjPZnh3dAcsejpR9HfopXL9ISNj/igkxYeJ7qvS3VGJT4YNcpzMmwD+AeALIIz3dUfSPy7U\nbpuCAN8+3g2/PdcbPWIaY54D3U69wb54XupNSCnF7NX2EhK7LuRhxsoTrL6TwfBwCrU6/HlMXFOX\nz56L+QAAub01/MNCA6wOoa2Iui3LX+hjcT4CNEKH9KMHO+OlpNZoHxWI1ZP7CvZFBtpHzP55baA8\nYxluwyxhFB8R6FQT9dkBrbD/9cFoF8WNXh7WPgJn547ABw90wpN9YjCobYToec4eVKSIkIiqrj+Z\njdNMxP+OxalOJqX0rfow5HZCrSTQ8ZzF759MxOB21jesn5f0m18vchMQS6EDQEmlHr/st85IH/fd\nPvz6bC9sOXMDAHC90PlkIgaD4To7z9/E36dyaj3oAQBe/T0Vi0fYax6KIbeDmx/xDPCyfoz/dcK5\nfNGzA1rh2QGtkJKSItgeG+6PmabJQrYOjJdaGI/w1Sjhq6kjZXCGJG0bc7+H5Lby4jyRQd5YP6U/\nFu1Jx/hezWWJ9Yuly5c+2wuhAV7IK6vCm3+mIT2vHJO7eEHrFwWtacpdaIB9WYiZp388iINvesz8\nFkY9Imfizz8QPjgDACilNWu1bgBwxdXcf8kHD3QUOJiAfEF3M1LNQHqb7QfSC/DltotYYpoReyqr\nGCWVOgR6u96QxGAwxDmVVYwnF3Hzmd+6p71bpujwnUdbDUw+5TK7et+825oKJYTglUGx+GLbRcHD\nLwA8nNjUMp1syqBY2fbyf+Z1U/rj1d+FNaTOIqaMuqFlkBIX3h/p0j1GoSB4dkAr2ccrFfZr943l\nMnhtIgKwfXoSACAlJQVJSR0sx4Q5KLGor7+XzDIjcoor2bQ9D0LOX+psAG+Zvt4HJ2V0R7c6L5vU\nGz1jGiPYV43keHvJCHNtkxTmWsqjVwsRM2s9Bny4XfS4C7lldtv4grfZxZV42nQzZDAY7uH+r/da\nvi8oF9evdIbtTbXKwD00frr5HBLf21Ir+0YmRNo5DYESyhdm3cOXklpj2rB42dfwVllvDQnRQXZO\nzf+N6yJ7LYZ7cTWI4So1TZeHOHIyXdRYzS2plAy+OOLN3RXo/cFWl89j1B1y0uUHbDbtIITsqCN7\nbgu6NW+E5S9IT1RoGxmIsd2a4o+j4rVY52+UIldrxIpd6ZJr7Dx/0xJN4eOlEn7AOBJpZjAYrsOf\nblNcoUPtNNAKAAAgAElEQVSTGjS4/N8/54VrGoCD6QX4YtvFWtsnplLDl1fz1SihNUVERyRE4r/6\njhjVqYlL11CZHBnzuhre586rQ9rg7o5RrprNuE1Q1EAGCQCGtItAqzA/0Wl3Yr0ItlBKUaU3wkgp\nes7bikd6NLPodzJuX5w+EhFCAnlfwYSQwQDYJ4wTEqIDJffdt2APZu6sEB3ntngP53heFIliApzU\niC03THPUq/VGLD1wFUaWymIw3AJ/3KNcKnUGLNgudCarDNS+5gjAg92bomO0vNGMXZoFA4Bo9oTv\nZGqrDRiZwAmqe6uVGNejOfy9XK+f/P7JRGyYOgCAVYszKsgbE/rHuLwW4/bhgW7RgtevDW0j6zwf\njRLLnustuk9vdByVvJqvxaSfj6DtW5uQaeo12ODiWEs+J68X1/hchnuRE3c/BSDN9O8xcNN+nqtL\noxoCcj7UxdIec/7iBI/5NVFzxyRYvleKPGX2mselB77fdRlv/HkSKyUiqFIU1jAlyGA0dLTVQjH0\nj/4+i/b/2eTwHLEpPdUGQCw+ZDRS/PFiX5E99qye3A+pbw/DQ4nN7PbxncwALxXm3d8R66b0l7Wu\nFEPbR1gkbkL8uaaOd0dzgykYDZe7O0ZZpPgmJ7fGK4PjZJ8b5Cv+t+GsJnPYZzvwz2muofVyHhcJ\nta0vdoUNaTV3UBnuRc7jbStbIXZCiJyGoUUA7gGQSylNMG1rDG72eQyADAAPU0oLXbT5tkDOB/GK\nI9LOoDevmzOKF73MMUUtR3dpgjXHhZ2kJRXcr2nH+Zt4WORGZMv1Qi2e+fEQLuSWCfQ9GQwGh20j\nzlfbLwHgbppKidq1ahG1iCojFXU+W4X5CVLRUpydOwIAJKeO8W/uf03pj0Z+GjQSEYGvKf8xNUD1\nbR3itjUZnkuPmMZYMqGny79vL5USCdGBSMsUShaJqaqYmb4iFZU8GT+zvnSFzoBKnaFGjXdZRUx5\nxVOQE8m0rckEADndJosBjLDZNgvAVkppHLgZ6LNkrHNbEuBdc3kPg5EK6q681UrL6+ziCigVRLR7\nzlyvuf6E9FMcpdTS6frq78ctzUWbeaMvGQwGh7bKGslctNtaQy017vFagRbJH6fYba/S20dmHu/d\nHC8myev4dnajbeTLOZS+GiViQuXJJblCeKA3Pn6oM/xqkHZn3J4MbBNmqc11hXVTBthtc9T3s9JB\nsOWhb/fJvi6/TOzCDfFyM0b9I/kXRAgJJ4R0BuBDCOlICOlk+uoPTpjdIZTSnQBsh5aOBvCT6fuf\nAIypod0eT01qoMyk55VjU5rV6SME+M1U65Jy7iYMRmonF6EzGOHFuxGJRVMAoOXrG/D22lMAuCdF\nM9/vSseRG87nJDMYtxvlVXpcL9Q6PxDAp5vPCc/lRTLf5c3uLqkUr9XcmJaNUhEHtMpA7bplB7UN\nt0RDB7W1r7N0hTB/L/Rq2RhfPNK1VuswGHXF1Xx570E+JzPl11byMwWns0sk+xoY9QuREv8lhDwD\nYAKALgD4ImmlAH6klK5wujghMQDW8dLlRZTSYN7+QkppI4lzJwGYBAARERHdly1bJufncUhZWRn8\n/f1rvY4cssuMeH23MGQ/urUa6cVGnMgT18IL1BCUVFM08SPIKrf+Xmb39oa3kmD2Hut6XyT74tUU\nLczBkec7eYECWHiC0+Ab2kKFx9oJHdFLRQbM3c+l2xeP8MMbu7XIKrNeJ9Sb4uOk+vn/kUN9/r7k\n4Gn2AJ5jk6fYwcds05fHKnHkhgH/G+brVJ7l6U3CztgH4tS4r7XGbt+7fb3RPNA+urgpXYdl5+xr\nnJ+Jp9B4eeO7E1aNzBmJ3ugQyq1BKcXuTD1+SBOvj5Yr5u4KnvY7Y/Y4x5NscmTLpSIDNEqCrVd0\nSLlufegS+zu2fc/ZIvdvv1xHMXmrFk39Ca6b7muLhvvWuFveHXjS7wtwrz3JyclHKKWJzo6TDLdR\nSn8E8CMh5GFK6XK3WOUClNKFABYCQGJiIk1KSqr1mpx4bO3XkcPN0iq8vtuqh7drZjKaNfbFe+tO\n48Rucemi55Pb4KO/zwkczBUv9EGPmMbILa3E7D1cg8+ql/qiW/NGGDbIgLZvcU0I352owkcPdgJO\nnAAAXCr3svysJ68X494FuwXXat2pJ7I2CfU5jVDU2/+PHOrz9yUHT7MH8BybPMUOPmabnt60HgDQ\nuUdfhAU4mcltOtZMeJPmSEpqa7cvPqELerUKwdrULKRlFqNtZAAe6NYU6ep04Nxp2HJTp8FdHeMt\n708A6NipEwa2sU5uSQbgu/kcvtx2ESF+GuTzGvLq4v/W035nzB7neJJNjmwxbx2nN2LKb0fx9ymu\nqcf2+ImLDwFw7GQ6+nmziyvwV2oWnu3fCquPZwJIRe/4aEsKPq5zLzRr7DTxWmd40u8LuDX2OC24\noJQuJ4QMJ4S8Rgh5w/xVw+vdIIREAYDp39waruPxBPMK8V8d0sbyhy7VENSteTCGd4i0226WNwn2\n0fCO5YK/3molvnuiu2V7cYU1hVfCS9l9v+uy3bpiAvC1aOZjMDySSl5JyITFh1BaqUOlziBb5su2\nu9y6nVvjld+OYeHOy3htueP5FOsu60Qbf2wx11WP69EMXz/WTZaNDIanolEpkNBEWqJr69nauQDz\nN57FvA1n8b/d1vdgXLg1UpfmQrqdUTfI6RL/GkAwgIEAfgQwFsD+Gl5vLYCnAMw3/bumhut4PGql\nAifnDIOvRiXoQvWXaAhaMrGXXSrvs3FdLAX/Uh2oQ3gjLfnTgKr13M31WoFWtt6Yu/U1q/VGEFL3\nEyoYDCn68KZ/nMwsxurjWXhrdRpmDI/H+J7NBR3Y2cX2HanlprnMExYfEmy/WVqFUV8KswOUUodS\nLTpenXREoBe6tbCvFDK/z6v1RiZ4zmgQ8JuH+N3iNR012fXdzXi0Z3P4eaksCivzNpy17Offb1LO\n3cRI9j66pci5+/enlI4HkE8pfQtALwBNnZ1ECPkNwD4A8YSQ64SQieCcy6GEkAsAhppeN1gCvNV2\nMicBEg1BKgWBt1qJJRN6WraN6Roteiwf/vrmmeYA0C82FHqDEU8tOuhQPgIAYk1Pfu6OZHZ6528M\n/7+d7l2UwXCBQhsx9bdWpwEAPvr7HCb+ZHUcy6v06PPBNrvzzZHMbTYRl+3ncnEmWyjTMn/TWby3\n/oykLfzu8l0zB4k2B5q7xJ2m9RmM2wR+8MRc3gUAx67WTL2wUKvD1ymX8NHf50T3j+/V3PL974ev\nseEktxg5LdCV5n8JIZEA8sHpXDqEUvqoxK7B8kxrmEhFMs1PXwPbhOHHp3sIUt9mHuzeFE1EpIsO\nvjkYPd+3RmwiAr2wMS0H4xbuR25pld3xtmhM15brZGqr9fh8ywW8MjjOoaRJpc6Iy3nl2HsxD31j\nQ+UtzmDUE/yRrGVV4mlxW51MM3xlBjM/7s5weD1znVhSfJhkZmJsN+75/X7TA2bvVo1RoXN9hjOD\n4SkoRJrtzuWU4kEn8kT9Y0NxID1fEP10Ns98dGs1vNVKtI0MwNmcUgDA/vR89G3N7j+3CjmRzA2E\nkGAAH4PrMs8AsLIujWrISEkb8SOSyW3DRaOYHz/UGa8Ni7fbHuonjHqY6zePXCmUvHnyMd/wqgzW\nEZWOWH7oGr7beRkLd9rXeoox/n9iUqsMRs2hlGLV0euo0os7gXJ55seD3MxkG0fumX4x6NMqRKCT\nyadE5CFQ4eTT9NwN7qa36KkekscoFAQPJTazpBiXTeqDNZP7OV6YwfBgbMvAKKWWoSJSnHpnOLo1\nD4bOQC3Rz5ulVYh7c6PD8yL9uPfNpn8NtGyTkvNj1A8OPxYJIQoAGymlRSbJopYAOlJKa9r4c8dj\nK6q8+dWBWPpsr1qtafukGCwx2ksK/gz1fvPtU4a2mNPvi/dmyL4Ge6Mz3MmuC3l4bXkqPtoknjKT\ny/ZzN6GtNqDSxlnVKBXw91ZJPqSJzTSXqjEb06WJ4LVYZIfBaKjwp9cB3KS7pxY5nufi56USZMkq\ndQYs2HbB6bX4CYJpppnrWpFsBKUU28/l4uuUi8gpdh5YYdQch04mpdQI4HPe6wpKqa3AOsMFvHjv\nglUv9UWbiAC3p5IDJUbPSfH2vR0s3zur3wSskc/iCh3KJW7C7d4Szne2rWljMGqDOW128WbtBZdL\nKnV2kUwKrn66tFIPvUiKzjxfWWiT/XsnZXoSBvGa8xiMO43RXaIxIM56j/srNUv0uCf7tMDmVwfi\n80e6ABAqsfR4bwt+4vUcSMH3Zx811WbeFCkZ23z6Bp758RA+3HQO01Ycx/QVqRjxGesfqAvkpMv/\nIYSMrnNL7hCiG/kAAMa31VikiNzBuin98dX4blj/Sn9BZFIOCdFBmDHcmoaf8tsxh8fzo7Ev/XoU\na45nYi3vg4NSalezdrOUPS0y3IdZX7lSpDbSVbTVBtG0e1iAF26WVWFDWs1GrraNDEDTRj6S88YZ\njDsBb7USC8Zb5bh2XcizO2Z8r+Z4d3QC2kQEYHQXrlQs0McaySyVUfYFAGpelqCRrwYKAuSV2TuZ\n/HKXwxmFWHnkuqWGk+Fe5DiZLwP4kxBSQQgpIIQUEkJYNLOGhPp74ezcERjawr0zgBOigzCqUxQ6\nNAlCu8hA2eeteqkvAMBPY3UcpZ40zeh5EZsd529i6rLjeIXnmIrpAdZUroJx5+Ko3vKPo5kA4Jam\nmEu5ZXjx16OCbWolQYC3CtV6o+Bv2xWWv9AHKqWCOZmMO55AiYZXAHigazTeGtXebruUprQtc+61\nnstPlysVBI39vOwimQYjxYyV1qEIVbxSroU7L8m6JkM+cpzMUABqAP4AwkyvwxyewXCIt1oJUoej\nrpQOIpnbpt0leG2OptpKLVVUG7B4TzpeW34cZ3NKoDcYQSmF0WidwdwzprHgHPOI0gqRGhg5DUgM\nhpmf9mYgfvYm/LA7XZCuPna1EJ3m/I31Jzjt10rT39qGk9kY+OF2wcPMnxfERzTaMunnI4IbUXSw\nD56/q7Xsm5wUZtWGYOZkMu5wCCHYO2uQ6L4xXaPho7Ef0erIMeXzdL+WlnR8lU3JSmM/NQq11s+B\n49eK0OP9LZBi3oaztW4mZAhx+luklBoIIY8AaEUpnUcIaQogAsCROreOUSOkZrU2b+yLlqF+yJg/\nCi8vPYrk+HDrOTZO5sebz+EH0/jLVaaokZkeMZxjaqvlV6EzwFejEpV3+XjzeUxOjq1T55rRcPjj\nKCf3M3fdaTRt5IPhHSJx5EoBxn4jlD2p0Bnw4550vPMXN8rx6+0XMWVwHABgzSX75hw5zHugIwK9\n1aJKEPPu74hOTYNwD0+IfVxiM/x++JrdsWYnk0UyGQwgXEL7VarkxZXegrmjEzBvwxnENxKmvIN9\nNIImvTFf7bF8r1IQSw9Cp6ZBOHGdmw5UUqFHWIDV6c0prsT1Qi0SbYIqjrhWoMWprBLYCw7eeTiN\nZBJCFoAbq/uEaZMWwLd1aRSjdgRKRGB2zky2OHkLxnfD2O5WTX2ljfO35cwNyfUPZXAiuiH+GsH2\nl5dyaUVzJHPe/R0F+/mzmBkMR/CndsxenYZirc7OwQS4KVdmBxMAPvnnfK27Rc3OYYBIJEWjsk9/\n/2tonKChz4z5wc3VRjwGoyGiUirgo7aPWEqNW5UaXCJGTKgfFj6ZCC+V8D4W5KsW1ZwGYOlD+HBs\nJ7xxdzvL9tJK6/FpmcXo/cFWp5qetoz5ag9e+OUIdmfq7ngxeDnp8r6U0udhEmU3dZdrHJ/CuJU8\nlNgUI2zmoB+ePcThObbRzyv5WokjrdjehLedzYXOYMTWM1wnua2UktSbncGwhV++cbO0Cp3f3Sz7\n3EJttaV0oyaY1RPEBifoDUb42qT2vFVKfPpwF8n1lAqCETEq9I8NxScPda6xXQzG7c6OGUmC18M7\nRGBwW3H1BUeDPsw82rO5w/2NfNWicmMAMGlgKxx8YzAe7tFMEGUtreRKu9amZgkyFjGz1os2EYlh\nDqj872Q1Dl+p2WSjhoIcJ1Nn0sukAEAICQHARA89GLVSgalD4gTbQv0dj6nr3SrE5ev4auw/BLRV\nBry/gRutV1BejYcTrdFSqTc7484ht7RSVs2TbWTdFfLKqvDBxrPOD5S6tjkCKZIR0Bup3c0vwFvl\nVJv2kbZe+OXZXoLsAYNxpxFicx/66KHOovWYAOCrUYo6kQffGIw/X+qLs3NHYN79CQ6vV6EzIqek\nEpvScuwGjRBCEB7obWdXXlkVLuaWijb89f/vNmQXVzi8pi3m48/llLp8bkNAjpP5FYA/AIQRQt4B\nsBvAf+vUKkat4deTPdMvxunxzUN8Ma+/j+z1H+zeVDT1ceSqVXhgZEIkPnzQGrkprmDp8juZSp0B\nPd/fild/P+70WJWLMlx89lzMlz2NSgxz85BYujy6kY8gNT6sfYRoB/mF90fW+PoMRkPFtsFUo5R2\nQQghePte+65ztVKBrs0byWqgPZtdAgBYdugqJiw+JHkcv8lo4k+HMeRTcc3MSp0R36Q470Dn/5xn\nsktx9Gohhn+2E30+cD7spKHh1MmklC4BMBvcWMkCAA9RSpfVtWGM2mF+OmwZ6icQW3eEzGY+ANyI\nS/M1Braxig3wJ/uYnw7NEhPuiGRmF1dg6rJjKGD1nbcVp7KKLePhNpx0rjtpezMSY9/rg9C9hb3W\nrJj48qtD2uD0u8NlWAq0DvMDYD8CdsbweCTHhwtubAufTAQgLA0J9lULakoZDIY9wb5q0VpmPrYT\n8gDASy3/vTXaNG0rxM8Lp7JKLNt7thQ28bjSkFqpM+Cr7Rex8WS23b7vd17Ggcv5ApWLb3dcwgNf\n75W9fkNDrluhBKADlzJnn563ASF+GswYHo97OkXJPsfbxehRXLg/AKBHi0bYef4mAOtknwn9WlqO\nG9M1GnP+Ou0WJ/OZHw/hbE4plITg03HSdXAMz+LAZaG07r+WHcNnj3S1O+7fK08gr6wKKeduOl0z\nKsgHYSJlIObOdDPz7u+I8b2Eabfn72qFCzfKcDqrRDBHOf2Duy03HNuazKR4aeW2JkE+eKJ3C4xM\niESnZsFObWcw7lQGtw1HZlGFYL64XN65r4NomZYUk5Nj8fHm84LPhBA/Ta1GOVfqjPjob26cbcb8\nUZbtR64UWkrFGFbkdJe/CeA3AE0ANAWwlBDyel0bxqgdhBBMTo5FixA/2ed4iZfGSJIY0xhrX+6H\nycmxlm3LD3NvZv4N2aw3+MHGMzWeYf51ykWsO5GF1mGcY7vqWCYeXbgfp3lPp4z6Iae4Eg9/tw/X\nCpw3h0mx+ngWMou4+iR+k87vh69hqwsjSDVOIiEAoDda/+ZGdeQeuqYPi8eip3tg/xuDBcfyIxpe\nKuEbwlHURaEgmDsmAX1jQ0WljxgMBscPT/eokYP54zM98FTfGJfOIYSgWWNhGVh+eTVUIpmGc++N\nkLWmmETfjZJKjP3mzo1WOkJOVPJxAD0opbMppW8C6Angybo1i3ErUCoI0t6Rl1I006lpsJ3GJiC8\n+ZtTnzoDxZJ9GTWy7cNN5/Dy0mNYz0tR7LucjzlrT9VoPYZrHEwvwOEMLhr564ErOJhegHUnsmEw\nUlmd3EaRY/rN34bkj1PQ8vUNyK3h2FGVjLQ6f6b4fx/shI1TB4ims+eOcdxEYOt0MhiMumfrtLtw\n4I3BAl1nVwjw4oIczh7+5L6//zltL+93/oZQnzPEjwnwmJHzyH3F5jgVgJpX1TM8GndFYaSiPiWV\n7p38I3emLcPKuhNZiAz0dklc+OHvOJ24jPmjLGPYDmcU4L+bzmJIu3A83sLx+VITn9LzygEAC7Zd\nFK2vdAb/AScy0FuQ+jZjngYCcH/f7aLEx64+0dvxDyFHUoXBYLgXc/aqpphrOKcMikVEoDdiw2u3\nHh+dwYhNaTmYYtOJ/kC3aCgUBN/t4Fylnyf2xBM/HHTbdW8n5EQytQBOEUL+Rwj5HsBJAEWEkE8J\nIZ/WrXmMW8Gz/Vs63H/AJsUIAHtsRobJSWPKJS2zWPB6SDurrhpfOJfhHEopXl56zGVxYTNrjmda\nOrfNae0tZxynt68XavHZlgsOj1my7wqmLnPedW4LP5KpNxqxa2ayYP/y5/ugTUSAwzVGd2mCR3s2\nc3otP149yYk5w3BizjAXrWUwGPWNOeDho1FiTNdoJEQHubwG/0GVT9ybG+0czPG9muP1ke3w+sh2\nmNLVC71aNkb/2FCL+LvUhKOGihxPYD2AOQD2AdgP4F0A2wCcMn0xGhiz72mPf14diCUTemLdlP64\nr3MTy765YxIQEWg/LCs6WFj3IhXJ1NtMd6CU4oJNqoGP0UgFgrgBXir876lEy+sSJvDuElqRufLO\n4KfDpaSBpqVoUazVYebKVIHjf61Ai3Hf7XfdUCfMHc0pJvTgRWN1BopmjX0Fx6llNLN9/khXfPBA\nJ4fH7JqZLEinBXqrJSdrMRgMz8HcoS7WqS6HhOhA/PBUDzzVx0m6xsSw9hGWDEv3CBV+f74PCCEW\nmaSSOywwImd2+Q/1YQjDs4iLCECcKQL0xaNd8d79CQjwUsmWepDqAKyyafxZdugaXl91Ekuf64W+\nre2fFrU2T33m9PjdHSOx4WQOyqr0MBqpaF2oGHqDEToDhbdacUfOUV+bmuXyOfyxb1IR6vxKikV7\n0rH88HVEBflgzfFM9I8LxS/7r9bYVikIAZ7oEwOAS0sF+qjx3JLDdg8wjuyVy7P9WyIjX2vnvDIY\njNsDc8DDkSanFN1bNMJ3T3SHRqXAnPs64Ex2KQ5mFEgef/StoWgsUY9pHi9bUqGDWqHA3HWn0SE6\nCI/0aGYpxbmSX45py1Ox/Pk+su9pno6c7vIRhJBDhJBcQkgBIaSQECL9v8xokAR6q11yymzFqc0s\nP3wN+bzRXKeyuFT4+ZxSFFfooLNxFMolavneG9MRXioFjBSYvjJVtl2xb25Eu/9swrTl8s9pKJzK\nKsbrq066fF4FL/rpaBKP+Ql9wfaLyMjX1trBXD25n+h2fg8RIQSdm0qnv1SK2jmZs+9pL4icMxiM\n2wtzw1AjGc04W16zdr1PH9YGy5/vY5mWRwhxqNF5Ys4wSQcTsDqZf6Vm440/T2LVsUzMXXcab/Oa\nV6evSMXhK4XYcd65hFt9su9SPj7cVLMpanI+gRcAeB5ANIAwAKGmfxkMAVFBXBr9uye62zVJ/PZc\nbwDcXNh+/91mGfGlUXIpjGqDEZ3f2YzJvx61nHO91Ihe87YC4GrvHugWjSUTegIAGvtpLCPHVh3N\nlGVfVpF1pNeqY/LOaUjYRpFtHXopynlO5hUHskUbTSLrfCHimtIvNgRdmgUjItDxOFQACPbVQKNS\n4M1RnOj/m3e3s+xzhy0MBuP25ZGezbFt2l0YECteV8knNjwAL9zVGgDw7IBWdkMhzFFRsc8lsQl4\nfMyBl8+3XsDGNOtAiqv5WqRlFuPXA1dwKIObc/6Mg+lEt4JHv9+Pr1MuSTZwOkJOu+R1AMcppWxe\nOcMhm18diGq90W4+LQD0aR2CVmF+uHyzHJU6znlcNqm35cmw0CTUvvn0DUxddgwzR7TF23utTuG3\nj3fHkPYRgjUVvKja6AW7sebl/g7te5HnwNpSpTc0WIma1GtFWJuaZScBUlyhczrTHgAqqq0fLGLT\ndMyIdXbzWTelP05lFcNXo8KiPen494i2SGzRCLFvbrQ71iw7tHpyP1zN1+JyXrklChtpUxOsUSlw\n/j3rGMfnBrZCVLA3Xl56DM1DWJqbwbjTaeVCh/rM4fGYMihWtIazVZg/cCYX04fFY8bKE4J9zqZ8\nSdVwXy/UCvoOPBE/jRLl1QYcuVKIu9q4FmOU42TOBPAXISQFgOUOQyn9wqUrMRo8AU4aIYJtUuiP\nLLQ2hPDnwa45noU1x4W1g2LyMRTWKFXq9WIYjNThOMLUa0Wi2/dczMNj/zuAVS/1RbfmrsvoeDrv\nrz+DgxkFWHlEOAmnSFstcDLLq/TwVivt/g/Lq9zTDZkQHWTp7LyX10w2uksTu9+3ub4yKsgHUUE+\nlt//gLhQfPBAR6fXuqdTE/gXnGfC6AwGwyUUCiIpV/ba0DboGB2Eu+LD7JxMZ0iVkGUViz+cX7hR\naumLcCdpmcWYs/YUfn++j+j9skhbjc+2XMCrQ9ogyDQut0WIH05nl6CgXDrIIIWcdPk7AAwAgsGl\nyc1fDIZL1LS7D7Cm4vnY6ntfyS+XPP9irrWD/dGezQWpjd0X8wBwdScNEfNknWJTJ/68+zknjT+6\nUWcwIvnjFLy9Ns3ufNu62MQWjdDCjRHCz3njJT9/hBsVapvmTogOwrG3huLnib3QtBGLTjIYjPrH\nW63EvZ2bwN+msVVK4ohPoI9rD7y/HnBf0+TB9AKLdNKzPx3G4SuF2HVBvO7zr9QsLN6bgV8OXAHA\nZa9OZ3OT9fLLql2+tpyfOpxS2t3llRkMG5ylExwRE2o/HtPPZg5mkYicUbXeCIORYqtJy/GpPi0Q\n6u+FCp0B1XojNCoF1JaJRO6vCEnLLMahjAIcuVKIjx/qXCtHu6bY/j/1bMnJ/hxIL0BYgBdGd4lG\nkVaH3NIq/LL/Kt4bY40UUkox/n8HAHDp7pRzuRjeIRJGChy7WojEmEYY8ulOt9lqjqyKVVLKKdxn\nMBiMukahIPjx6R6W2smfJzqfhe5qOVaV3j0ZpKyiCjz83T6M7tIE90da7weFWnGHMb+c215aqcel\nm2UY/MkOu32uIOeuv5UQMsj5YQyGY+RoFoqx+VXxObfmGkPzBJdiESdz9Fd70O4/mywFyy8mxSLA\npFdm1nM0z7Gti0jmPV/uxjt/nca6E9kY9HEKtNV1N6Ho65SLiJm13k7s19a5jwryRmM/Df45fQNT\nlx3HtQKtaBd/RbUBPd7fanndIsQXLw+KQ1xEAOIjA/BIz+aIDQ9A+gd34/3+Pnbnu8KipxMxsE0Y\nuuvNnhAAABscSURBVLdohAFxoXh3tOMRjwwGg3ErSW4bjk8e6oxvH5cfg/tsXBfB60d62A+BaGLK\n2v128JrduMqaYL7nHEznRIFKTVP3irT290tttd4yOMNgNGLuutOC/d+kXHJ5AIocJ/M5AFsIIWVM\nwohRX0wa2MryvVRqNjGmMVLfHoYF47l06ynTZCBKKeZvPIsz2SU4Ywrzf7ntIgAgwFtliYiZ33Tm\nspQD6e79s/5hd7rgdVZxJXacqztpih92cdezfdq0dSB91EqE8WoxtdUGlIs4v7NXpyHPJDc1Y3i8\nZM0tIQTBXsIHiLHdmrpk+6C2EVgyoSe81Ur8PLEXujQLdul8BoPBqG/Gdm+KEQmRso8f3cVai/5w\nYlP4aOyjm0peMGbsN3trZyCAMlNNfbXeiCoDRYHp/lBo42QuPXAV7f/zt+V1ebUBGaaxv+YSKwD4\n9x+u1aLKcTJDAagBBIFJGDFqwcwRbUW3L5vUG3Pu5eRnhrQLx4E3BuONu9thZg9vPNG7hcM0Q5CP\ndfLKx5vPA+AE27/dcQnjvrMfneijVqKJaTrRi78ehd5gxIaTVjkJd6UoANg9BQJApRvXt8Usr5HL\n6/KmlArqaCYNbAWFgiAswOpkllXpBc09MbPWAwC6NLPqTzqbK+5rU3ijUQmdzge6Rsv8KRgMBqNh\nwtea/vDBzvAVcTLjec0+5qhjbSgzrVGtNyItzwC9qd69yCZd/safVg3l8AAv5JdVobzagHGJzTC+\nV3PLvg0nc3DpZpns6zt1MimlBgAPAfi36fsoAF0cn8Vg2NMmIsDS2MGnd6sQPN67BRaM74pvHu9u\nGVvZPkSJuWOcp03N6W+Aaxi5mMu9AUpE3qAKBUE4z8E6mVlsKWoGgNd+r71IO7XtSOJRWC6eopi7\n7rTlCbOm+Jo6Im/wnMyckkrLlKQ+rULwhklDku9kjv1mr90Hznc7LuHEdevMeGdSR7ZC/f1juefQ\n1ZP74ezcEfjooc6u/jgMBoPR4Jic3BqvDW0DQKia8vrItkiZnoRPx7nPvTIaKR7/gauprzIYsfoi\nd/+JDPS2i2Saa/UBIDbcHzdKqpBfVmXRBOXfA/h1ms5w2vhDCFkALpI5EMA8AFoA3wLoIfsqDIaJ\nDk0CRberlArc06mJ6D5n8Jtp9lzMw5OLDooe99Y9XLSUP3t9y5kbgmP+PpUjeK0zGDF9RapFoNeW\nFYev4a74MIQHcGuezSnBiM924cOxnaAgQIcmQejTOgRZRRVYdyIbuSI6k9vP3sQPu9NhMFLMua+D\n6HX0BiOmrUjFxP4t0ampNZW84XI1VmQdRVKbMIuzfaOkCmVVeqxLzbI8Cf/xYh90b2H9EOE72oD9\nuMkPNgqnO4T6O2+6OfPuCJzOLoG2Wo8BcWHo01p6xBqDwWDcicwYbs3oDe8QiQ83ncOfL/VFV558\n3l1twixTf37efwWHMwoEKhxSjP5qDx7s3hRP9ObmrB/ij8CkVv3hyCBvu8CCylQ31ibCH6H+XpZ7\nQpjpfrlsUq8aNXnKSZf3pZQ+D6ASACilBQDYnYNRI2LDA3Dm3REuC7rKZf9l6eadif1bAuCc0m8e\n6wYA+Go7p89pflqzjUFevlmONcezMFNEE61Yq8OMlSfQk9ccc/QKp8U5848TMFKuBueNu9thwfhu\nCAvwQnGFfbRSb+S62k9nldjtM5ORz9lx34I9SM8rx6Qlh1Fepcfy8zqsP5GNGStPWCYavb/hDBLe\n/huzVp3E+xvOoJGvGl2aCdPdYTZO5rkcxwXmUkLCfHw0SlPjDve7ZQ4mg8FgSNM6zB8Z80cJHEzA\neq8CgLdWp2HN8SxccNIEVKkzIPVaEd5abZWhMzuKwb5qqJQEKgUwvEMEjl8rwq4LeSjmRTPLqvTo\nFxuC9a8MgIpXF9rdZFtseIClJMsV5JyhI4QoYLr/EkJCALDpP4wa46NR4ifTeEh3c/RqoazjOjQR\nzrs2Rwf5+ozaaj2Gf8Y9uYnValbo7LdpbN6E/KhpsI/aLl1+vVCLeRvOAAAOZhRICsZnFllT4P9Z\nk4bNp29gwfaLgmNulHBR0mqb8ZHNGvvaie7aOpkXcqVrbJ7o3QIKByL3DAaDwXAfA9uE4W1Tn4KZ\nof+3U3Ss48nrxYiZtR5t39ok2F6tN2JjWg7u6RSFSQNbQVttwPUyKmjgPM/Tjy6r0iPYRwO1UmG5\nDz7dNwbtednH+2tQWy/pZBJCzKn0rwD8ASCMEPIOgN0A/uvylRgMG759vBt+n9TbTWtxMhL7Lws7\nxG2dKTO20xdCeFG3Tzafw4ebzuKf09ZUutgIbFsnc/nha5i+QljTye+Mb+SnQYaNYPysP05anEMA\nmLZCvCb0Gm9muLnkkz8lyRFiUcjYcPlj1uTUxTIYDAbDfTQTGTphqxSy+0Ie7l0gHEkZbWps3XAy\nGwXl1Xiwe1PB/S3AW4X/G8fVyGcWWkc3l1fpLRPSWjTmrt3PZt77nPs6oGtz15Q/HEUyDwIApXQJ\ngNkAPgZQCOAhSukyl65iAyFkBCHkHCHkIiFkVm3WYty+jEiIQq9WIW5ZK7mtMP3+88Se+Pqxbtg5\nIxmdmwahX6zwOvxmIQCCN86X2y7i65RLAr3Ji7ll2JQujELyNS/3XcoXTam35s3MLdbqcDanFBtO\nZlu22dY65peJj+0yO5kKIj79yBFikybiwu3Hlf3vyUSX1mUwGAxG3RDsax8csI1k/n74mt0xjfzU\noJRi0Z50tA7zw8C4MKgUVlcv1N8LIxOiAHCZNIBrVi3U6izXfCk5Fp8+3BlD2oUL1vZWKzEoXrjN\nGY4afyz5MUrpKQCnXFpZalFClOCio0MBXAdwiBCyllJqr/fCYMiEL3O0ZnI/dObpLP7ybC87QXJ+\n+nf9K/3RLjIQ/5y+gS2myUAAsCmNawJSKwl0Bopl56rRYV8GvNVK+GpU+DrFmq5+9HvrHHYzvz3X\nW9A9aNaiXH8yG3d3jML6E9lYfTwLaiXB/tcHo/t7WyyzvW05Z6rHMVJghc0M8m8e64biCh0iAr0t\nEygATq6pQmcQjWRqVAqsmdwPo7/aY9nWu3UIfngqERN/OmzZJmdOOIPBYDDcS3MRfegSm4EjRhsl\nk3ZRgUjLLMHs1Wk4cb0Yc8ckQKEggsxd00Y+8FYrEeyrtmTRCsqrUa03WgIY3molHpDQOp50Vyv4\ne6swQWY+21EkM4wQ8prUl7zlRekJ4CKl9DKltBrAMgCja7EegyGgs42Qd4C3WnKcY4ifBh2aBEGh\nIBjWQSiqu90knN63tTVl8NaaU5ix8gQmLz2KUxKNOg92b4rmjX3RIVrYSW8WKD9wOR83SioxeelR\nAECQjwYh/l4YEBeK/ZfzseX0Daw5nmmZLXutQCuYM25L8xBfPNKzOZLbhgsKxs0fGIE+4k07nZsF\nY+u0uyyv/TRKdGwqdHIf7dnc9jQGg8Fg1DHhAd448+4IgUbl/V/vRWZRBfLKqrDj/E2sP5EtiHia\nM2O/HriKQG8VxnbjaigHtQ3Hq0PaoHeUEsNN97mIAG+knM8FpRRZppr/yCDnk9u8VEo806+l0+PM\nEClNP0JINoBvwIto8qGUviP7KsJ1HwQwglL6rOn1EwB6UUpftjluEoBJABAREdF92bJaZegBAGVl\nZfD3l1+LVpd4ki1mPM0mV+15ehNX77h4hP2cczHyK4zQKAkCNNyf+LFcPT4/KkxXv9jZCxvSdbhS\nIt7r1jJIgbwKI0pNTePPJGhwV1Nxp85IKSb8rbXbPqmTF/o2UeHjQ5VIyxfWeXopAbNO+n2t1Vh7\niXuSfTBOjZUXuO+/GeILH5P4uZFS/HtnBQoqKVoHK3C+0IgH4tS4r7V0p/dbeypQVk3xf8nck3Nh\npRGvplRgaAsVHmvnWB/TjKf97QCeZZMn2WLG02xi9jjHk2zyJFvMeJpN7rLHfG8T47mOGpTpgN/O\nVuOeVmqsu8zdF0a2VGNcvPBzn2/PS1vKodUDkX4EJVUUWj3w0UAfhPnK6yBPTk4+Qil1WmPlKF2e\nTSl9V9bVXEPMabXzdCmlCwEsBIDExESalJRU6wunpKTAHeu4A0+yxYyn2eSqPW8oLiG/rBpJSe1q\ndL3+BiOMwReQer0Yh9ILMGN4PCb0b4nOaTl44Zcjdsc/0DUa8016mB/+fQ4jEyLtpChsmetzxSIx\noVEpsH5Kf8SZJjwUB2di6rLjguObh/ije4tGGN0lGvGRAVg79x9MG9oGUwbHYUp+OXbtPYCRQ5IF\n5+zop0d+WTXSMovx/a7LeO7ujpb57mJs6W+AwUjhq7F+HPTsXYEQP41kBNgWT/vbATzLJk+yxYyn\n2cTscY4n2eRJtpjxNJvcZc+pPnp0emezQP0EAKYMisW0YfEAgHf0RhRVVGOdSVLvjYf6o1ljYcqd\nb8/9hSfx64GryCnn1ny0Z3M8dLf7y6Nk1WS6mesA+FPhmwLIkjiWwZDNpIHigulyUSkVljcsnxEJ\nkciYP8rhB4Z5ko4znujdwiKUa8voLtEY3cWxRET6B3dbpuu0CPFDeoD9U6evRgXfxio0a+yLkR2j\nnNokNrbT3KHIYDAYjFuLn5cKx/7z/+3dfbQdVX3G8e+TGySGkGgtYCgvwS4ClRiBLAJR5EWgFUor\nQd4iqyHSYpUCFUjtKoovaKlLBCGGFIEGlbYhyIsCRRIWTUojFSG8BFNRBGJTFAmLCgRCXn/9Y+9D\nTm7uuffcZObO5Nzns9ZduefMOWeeuzNz9p69Z2YfA8BbuoawZv2Gzc61f8vQIey84zCeufQ4Vq5Z\n1+e9jS8+/t2c8b4x7DJyGDtuP7S029T11sg8qpQ1wkPA3pL2Ap4DTgM+WtK6zDpK9+kbzcys8zU3\nGnsbYRoyRG1NnjFsuy7G7rL5XUaK1rKRmWf2KVxErJN0DjAP6AJm56vXzczMzKxD9Dl3eRki4m7g\n7irWbWZmZmbla3l1eZ1IWgH8soCPGgW8XMDnFKFOWRrqlqluefYA/qfqEN3UpYzqkqNZnTLVKUtD\n3TI5T9/qlKlOWRrqlqlueYqsw/aMiJ36etE20cgsiqRrI+LjVeeAemVpqFumGuZZ0c5ONZDqUkZ1\nydGsTpnqlKWhbpmcp291ylSnLA11y1TDPANeh7V3Q6TOcWfVAZrUKUtD3TLVLc9vqw7Qg7qUUV1y\nNKtTpjplaahbJufpW50y1SlLQ90y1S3PgNdhg6on02xrSHq4nZvPmpmZ1U0Vddhg68k02xrXVh3A\nzMxsCw14HeaeTDMzMzMrXEf1ZEr6jKSlkpZIekzSwRXn2U3S9yU9JelpSVdJajmJtKRPSRreavlW\nZglJlzc9ni7pC2Wsq8086/P/0VJJj0u6QFIttkdJK6vO0NBUTo2fMb289ghJd5WUIyTd2PR4qKQV\nZa2vH7km52z7VpihlmXTUKftuaGvTJIWSip9WK8O208z12G9ZnEd1qY67fO1KJAiSJoEHA8cGBHj\ngaOB5RXmEXAb8L2I2BsYC4wA/r6Xt30KKGUHBVYDJ0r63ZI+v79WRcT+EbEfcAxwHPD5ijPVUaOc\nGj/LKsrxGjBOUmO+yWNIM3a1TVIZ9+WdAiwizRzWnyztTcrenq0uG6vMFm0/ZXAd1ifXYdugjmlk\nAqOBFyNiNUBEvBgRv5I0QdJ/SFosaZ6k0fDmkfKVkh6Q9BNJEwvO80HgjYi4IedZD5wPnClpB0lf\nk/REPmI9V9J5wK7AAkkLCs4CsI50Psb53RdI2lPSfTnLfZL2kDRK0rLGkZmk4ZKWS+p7vqp+iogX\ngI8D5yjpknSZpIdypr9syvrpXG6PS/pK0Vma1jMil8UjeX0fzs+PkfRTSdflI9j5TY2LAdFb+QAj\nJd0u6b8lXVPwkfUPgD/Ov08B5jRlmpj3pUfzv/vk56dJ+q6kO4H5BWZB0gjg/cCfkxsJSr259/dU\nBpJWSrpE0oPApCKzsGVl85+S9m963Q8ljS84V+OzN+nlljRT0rT8+zJJX2za1gekV6+3TAO0/lbb\nT6tyOk7Sk5IWSZqh4nuqXYf1znVYP9SlDuukRuZ8YHdJP5c0S9LheWP6BnBSREwAZrPpUdgOEfE+\n4Oy8rEj7AYubn4iIV0g3Qv0LYC/ggHzE+i8RMQP4FXBkRBxZcJaGq4HTJY3q9vxM4DuNLMCMiHgZ\neBw4PL/mT4B5EbG2jGAR8Qxpe9yZ9KX/ckQcBBwEnCVpL0nHAicAB0fEe4GvlpElewOYHBEHAkcC\nl0tvThy+N3B1PoL9LfCREnO8VRuHym/Pz/VYPnnZROBC4D3A7wMnFpjlJuA0ScOA8cCDTcueBA6L\niAOAzwGXNi2bBJwRER8sMAukbeGeiPg58JKkA/PzrcpgB+AnEXFwRCwqOMuWlM31wDQASWOB7SNi\nScG52vVi3tb/EZheUYaB1mr72Uz+f/0mcGxEHAqUca9B12F9cx3WvlrUYZVMK1mGiFgpaQLwAVKB\nzgW+DIwD7s1l2wX8uultc/J775c0UtLbIqKo+0gJ6OmqKgGHAddExLq8/lLmie8uIl6R9B3gPGBV\n06JJbKyIb2Tjhj8XOBVYQDrSn1VyxMYO8IfAeEkn5cejSDvF0cANEfE6lF5uAi6VdBiwAfg9YJe8\n7NmIeCz/vhgYU2KOVRGxf7fnWpXPGuDH+csOSXOAQ4FbiggSEUuUzgmdwubTwo4Cvi1pb9J239xb\ncG9J/1dTgCvz7zflx/9G6zJYD9xaQo4tLZvvAhdL+hvgTOBbZWRr023538UUe2BSZ622n57sCzwT\nEc/mx3NIPVeFcR3WN9dh/c5SeR3WMY1MeLM7fyGwUNITwF8BSyOi1dBY9x2oyEvtl9Lt6EDSSGB3\n4JmC19UfVwKPADf08ppGtjuAf5D0O8AE4N/LCiXpXaRGwAuknePciJjX7TUfYuDK7XRSb8WEiFgr\naRkwLC9b3fS69cCADpfTunyOoNxtGtI28TXgCOAdTc9/CVgQEZNzY2th07LXCs6ApHeQhvPGSQpS\n5RukBl6rMngjf0eUpV9lExGvS7oX+DBwClDmhS7r2HTkali35Y1tej0DVy/0lak0vWw/d7TIJAaA\n67C2uA5rTy3qsI4ZLpe0T+4paNgf+Cmwk9IJ1UjaTtJ+Ta85NT9/KKlru8g5Ru8DhkuamtfRBVxO\n6q2YD3xC+UKIvAMAvArsWGCGzeQjp5tJ3fkND7DxxPfTSSfCExErgR8DVwF3lVVBS9oJuAaYGeme\nWvOATzbOnZE0VtIOpHI7U/nqxaZyK8Mo4IW8cx4J7FniuvqrVfkATMzDMkNI23fRw8KzgUsi4olu\nz49i48Uu0wpeZ09OIg2P7RkRYyJid+BZUq9l2WXQypaUzfXADOChkns1fgm8W9L2eajxqBLX1a4q\nM7XafmiR6UngXdp4d4dTiw7kOqw9rsPaVos6rJN6MkcA35D0NtIR8i9IwxnXAjPyF8ZQ0lHQ0vye\n/5P0ADCSNFxVmIgISZOBWZIuJjXo7wYuIh05jAWWSFoLXEc6p+Ra4AeSfl3iOS2QvijOaXp8HjA7\nD9utAD7WtGwuaVjviIIzvFXSY6Shw3WkIY4r8rLrSd33j+RzSFYAJ0TEPUoXSjwsaQ0by7Mw+Utz\nNem8njslPQw8Rqpk6qLH8snL/gv4Cul8xPuB23v6gC0VEf9L+sLu7qukIeELKLG3oMkU0t/Z7Fbg\nk5RcBq1sSdlExGJJr9B7r8wWa2zPEbFc0s3AEuAp4NEy1rcNZWq1/XyU1IDZJFNErJJ0NnCPpBdJ\nDZeiuQ5rn+uwFupWhw3am7FLWghMj4iHq85i9SHpvcB1EVH0lZo2APIpA9Mj4viqs7RD0q6k4dF9\nI2JDCZ9fu+25jpnaIWlEPm9SpAtQnoqIr1eYZyGuw6ybuu1fHTNcbra1JH2CdCL9Z6vOYp0vD0M+\nCHympAZm7bbnOmbqh7Nyz9VS0lDkNyvOY7aJOu5fg7Yn08zMzMzK455MMzMzMyucG5lmTVTCbBBm\nZmYDKZ87XDk3Ms0ASYdIugm4TNK4qvOYmZm1S9IkpelOp0G6O0DFkQA3Ms2QdDJpOr27SDervSA/\nX4sjQTMzs1aUZhaaCTwEHC3py3XpLHEj0yxN93VnRPwz8HVIw+Z1ORI0MzPrxX7AbRFxIzAdOBg4\nOd9ztVJuZNqgI+kUSRc0ZtEAfgacKOnTpBt57wpcLemgykKamZn1oIc67CVge0mjIuJ54DfAHsAh\nlYXM3Mi0QUNSl6TPAX+bn7pO0p8CtwF/DRwGTI2ID5FmaPiIpHdWk9bMzGyjFnXYH5FmoNoFuD7P\notUFrATemd9X2alfbmTaoJHnrd0HuDAirgA+D5wPjI2I+4A3SL2aAN8HxgOvVZHVzMysWQ912BeA\nC0lzxv8dcAtwT0RMIU30cGx+X2WnfrmRaR1N0lRJhzedm/Ib4O2ShkbEraTZO07LPZZPAyfl1x1A\nanSamZlVoo867BbgKeDUiHgpIuZGxOz8un2A71WRuZkbmdZxlIyWtAA4AziddI7lCOBF4D3AiPzy\nmcBkYD0wHzhI0o+Ak4GLIuLVAf8DzMxs0OpnHTYDOEHS6PzeoyQtJXWULBr49JtyI9M6iqSuPDSw\nI/BcRBwFnA28DFwFzALeD4yXNDwiniQdCZ6ch8ynAmdFxNF5mZmZ2YDYgjrsZ8CTwCn5I5YBn42I\n4yNi+YD/Ad0MrTqAWREkDQUuAbok3Q2MJPVOEhHrJJ0DPA9cAfwrcBowGpgLrAEW59euBJ4Y8D/A\nzMwGra2sw9YBP8qvfZp06lctuCfTtnmSDic1Et8O/AL4ErAWOFLSRICI2AB8EbgsIr5NGhqfKulR\n0sGWG5ZmZjbgOrkOk+83bds6SR8AxuQb0SJpFmmHWwWcGxETJA0Bdiadg3l+RCzPF/sMj4hnqspu\nZmaDWyfXYe7JtE6wGLhZUld+/ENgj4j4Fmno4dx8FLgbsLZxnkpEPF/nndPMzAaFjq3D3Mi0bV5E\nvB4Rq/M9xACOId1MHeBjwB9IuguYAzxSRUYzM7OedHId5gt/rGPko8AgzXxwR376VeAiYBzwbEQ8\nV1E8MzOzljqxDnNPpnWSDcB2pPuIjc9HfhcDGyJi0ba2c5qZ2aDScXWYL/yxjiLpEOCB/HNDRPxT\nxZHMzMza0ml1mBuZ1lEk7Qb8GXBFRKyuOo+ZmVm7Oq0OcyPTzMzMzArnczLNzMzMrHBuZJqZmZlZ\n4dzINDMzM7PCuZFpZmZmZoVzI9PMzMzMCudGppmZmZkVzo1MMzMzMyucG5lmZmZmVrj/B1+c3Wmr\n6acyAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "from matplotlib import dates\n", "\n", "fig, ax = plt.subplots(figsize=(11, 2.25))\n", "tsValues['datavalue'].plot(ax=ax)\n", "\n", "ax.set_ylabel('{} ({})'.format(\n", " tsResult.VariableObj.VariableNameCV,\n", " tsResult.UnitsObj.UnitsAbbreviation))\n", "ax.set_xlabel('')\n", "ax.xaxis.set_minor_locator(dates.MonthLocator())\n", "ax.xaxis.set_minor_formatter(dates.DateFormatter('%b'))\n", "ax.xaxis.set_major_locator(dates.YearLocator())\n", "ax.xaxis.set_major_formatter(dates.DateFormatter('\\n%Y'))\n", "ax.grid(which='major', axis='y')\n", "ax.grid(which='minor', axis='x')" ] } ], "metadata": { "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 1 }