From 96a6b185e74dbd4159e62104e68df5e79dedd6de Mon Sep 17 00:00:00 2001 From: Georg Raiser Date: Tue, 10 Dec 2024 13:53:43 +0000 Subject: [PATCH] brought back notebooks --- .gitignore | 1 - src/examples/load_photometry_data.ipynb | 485 +++++++++++++ src/examples/process_photometry_data.ipynb | 798 +++++++++++++++++++++ 3 files changed, 1283 insertions(+), 1 deletion(-) create mode 100644 src/examples/load_photometry_data.ipynb create mode 100644 src/examples/process_photometry_data.ipynb diff --git a/.gitignore b/.gitignore index e80d1dc..5036cbe 100644 --- a/.gitignore +++ b/.gitignore @@ -167,4 +167,3 @@ cython_debug/ # local scripts src/local src/analysis -src/examples diff --git a/src/examples/load_photometry_data.ipynb b/src/examples/load_photometry_data.ipynb new file mode 100644 index 0000000..80539c3 --- /dev/null +++ b/src/examples/load_photometry_data.ipynb @@ -0,0 +1,485 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# just here\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import iblphotometry.io as ffio\n", + "import iblphotometry.plots as plots" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# ONE instantiation\n", + "from one.api import ONE\n", + "one = ONE(base_url='https://alyx.internationalbrainlab.org', mode='remote')\n", + "\n", + "lab = 'cortexlab' # for carolinas dataset or 'wittenlab' for alejandros dataset\n", + "eids = one.search(dataset='photometry.signal.pqt', lab=lab)\n", + "eid = eids[2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### loading the raw neurophotometrics output from disk\n", + "as it is stored on disk. This directly loads into the final data format, which is a python `dict`, the keys are the individual acquisition channel names, and their corresponding values are `pd.DataFrames` that have the timestamps for the frames as index, and as columns the names of the ROIs as selected in the user interface" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'GCaMP': G0 G1 G2 G3 G4\n", + " times \n", + " 227.248224 0.009192 0.009263 0.004893 0.005485 0.014840\n", + " 227.281536 0.009219 0.009292 0.004903 0.005487 0.014874\n", + " 227.314880 0.009220 0.009299 0.004895 0.005498 0.014895\n", + " 227.348224 0.009204 0.009299 0.004899 0.005490 0.014878\n", + " 227.381536 0.009216 0.009290 0.004895 0.005486 0.014858\n", + " ... ... ... ... ... ...\n", + " 260.613664 0.004811 0.004186 0.003971 0.004169 0.004815\n", + " 260.647008 0.004809 0.004181 0.003974 0.004171 0.004814\n", + " 260.680352 0.004811 0.004188 0.003974 0.004170 0.004816\n", + " 260.713664 0.004813 0.004184 0.003972 0.004172 0.004824\n", + " 260.747008 0.004817 0.004183 0.003972 0.004172 0.004817\n", + " \n", + " [1006 rows x 5 columns],\n", + " 'Isosbestic': G0 G1 G2 G3 G4\n", + " times \n", + " 227.264896 0.012630 0.012728 0.005468 0.006574 0.020279\n", + " 227.298208 0.012637 0.012719 0.005465 0.006566 0.020292\n", + " 227.331552 0.012632 0.012718 0.005470 0.006586 0.020278\n", + " 227.364896 0.012633 0.012736 0.005463 0.006582 0.020276\n", + " 227.398208 0.012631 0.012726 0.005465 0.006573 0.020281\n", + " ... ... ... ... ... ...\n", + " 260.630336 0.005922 0.004558 0.004082 0.004502 0.005653\n", + " 260.663680 0.005932 0.004554 0.004086 0.004501 0.005657\n", + " 260.697024 0.005921 0.004559 0.004083 0.004502 0.005652\n", + " 260.730336 0.005930 0.004556 0.004085 0.004499 0.005646\n", + " 260.763680 0.005926 0.004564 0.004088 0.004506 0.005656\n", + " \n", + " [1006 rows x 5 columns]}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# raw_neurophotometris = one.load_dataset(eid, '_neurophotometrics_fpData.raw')\n", + "raw_photometry = ffio.from_raw_neurophotometrics_file('raw_photometry.csv')\n", + "raw_photometry" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### loading raw neurophotometrics data via one from alyx\n", + "the data is stored in alyx in an intermediate format in the form of `photometry.signal.pqt`. This format is, like the raw neurophotometrics files shown above, still time multiplexed with different acquisition channels recorded in series, but the time vector is now aligned to the task events.|" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "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", + " \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", + "
G0G4timesvalidwavelengthnamecolor
00.0091520.016492-370.181357FalseNaN
10.0116450.019462-370.164717False470.0GCaMPBlue
20.0117730.019487-370.148046False415.0IsosbesticViolet
30.0116570.019477-370.131374False470.0GCaMPBlue
40.0100410.017752-370.114734False415.0IsosbesticViolet
........................
1879840.0125750.0206622762.724377False415.0IsosbesticViolet
1879850.0058550.0098102762.741048False470.0GCaMPBlue
1879860.0125900.0206512762.757720False415.0IsosbesticViolet
1879870.0058370.0098002762.774392False470.0GCaMPBlue
1879880.0125880.0206452762.791032False415.0IsosbesticViolet
\n", + "

187989 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " G0 G4 times valid wavelength name color\n", + "0 0.009152 0.016492 -370.181357 False NaN \n", + "1 0.011645 0.019462 -370.164717 False 470.0 GCaMP Blue\n", + "2 0.011773 0.019487 -370.148046 False 415.0 Isosbestic Violet\n", + "3 0.011657 0.019477 -370.131374 False 470.0 GCaMP Blue\n", + "4 0.010041 0.017752 -370.114734 False 415.0 Isosbestic Violet\n", + "... ... ... ... ... ... ... ...\n", + "187984 0.012575 0.020662 2762.724377 False 415.0 Isosbestic Violet\n", + "187985 0.005855 0.009810 2762.741048 False 470.0 GCaMP Blue\n", + "187986 0.012590 0.020651 2762.757720 False 415.0 Isosbestic Violet\n", + "187987 0.005837 0.009800 2762.774392 False 470.0 GCaMP Blue\n", + "187988 0.012588 0.020645 2762.791032 False 415.0 Isosbestic Violet\n", + "\n", + "[187989 rows x 7 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "raw_signal = one.load_dataset(eid, dataset='photometry.signal')\n", + "raw_signal" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For analysis purposes, this data representation can be split into the individual acquisition channels into the same format as shown above for reading the raw data, a `dict` of `pd.dataframes`" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'GCaMP': G0 G4\n", + " times \n", + " -370.164717 0.011645 0.019462\n", + " -370.131374 0.011657 0.019477\n", + " -370.098063 0.011656 0.019509\n", + " -370.064719 0.011674 0.019500\n", + " -370.031408 0.011659 0.019485\n", + " ... ... ...\n", + " 2762.641050 0.005847 0.009813\n", + " 2762.674394 0.005803 0.009814\n", + " 2762.707705 0.005834 0.009803\n", + " 2762.741048 0.005855 0.009810\n", + " 2762.774392 0.005837 0.009800\n", + " \n", + " [93994 rows x 2 columns],\n", + " 'Isosbestic': G0 G4\n", + " times \n", + " -370.148046 0.011773 0.019487\n", + " -370.114734 0.010041 0.017752\n", + " -370.081391 0.011781 0.019512\n", + " -370.048048 0.011775 0.019507\n", + " -370.014736 0.011785 0.019465\n", + " ... ... ...\n", + " 2762.657722 0.012615 0.020670\n", + " 2762.691033 0.012602 0.020660\n", + " 2762.724377 0.012575 0.020662\n", + " 2762.757720 0.012590 0.020651\n", + " 2762.791032 0.012588 0.020645\n", + " \n", + " [93994 rows x 2 columns]}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ffio.from_ibl_dataframe(raw_signal)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "so far, the column names of the data are not mapped to the brain regions where the fibers are implanted. When retrieving data from alyx, the locations have been registered" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'GCaMP': SI PPT\n", + " times \n", + " -370.164717 0.011645 0.019462\n", + " -370.131374 0.011657 0.019477\n", + " -370.098063 0.011656 0.019509\n", + " -370.064719 0.011674 0.019500\n", + " -370.031408 0.011659 0.019485\n", + " ... ... ...\n", + " 2762.641050 0.005847 0.009813\n", + " 2762.674394 0.005803 0.009814\n", + " 2762.707705 0.005834 0.009803\n", + " 2762.741048 0.005855 0.009810\n", + " 2762.774392 0.005837 0.009800\n", + " \n", + " [93994 rows x 2 columns],\n", + " 'Isosbestic': SI PPT\n", + " times \n", + " -370.148046 0.011773 0.019487\n", + " -370.114734 0.010041 0.017752\n", + " -370.081391 0.011781 0.019512\n", + " -370.048048 0.011775 0.019507\n", + " -370.014736 0.011785 0.019465\n", + " ... ... ...\n", + " 2762.657722 0.012615 0.020670\n", + " 2762.691033 0.012602 0.020660\n", + " 2762.724377 0.012575 0.020662\n", + " 2762.757720 0.012590 0.020651\n", + " 2762.791032 0.012588 0.020645\n", + " \n", + " [93994 rows x 2 columns]}" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "raw_photometry_df = one.load_dataset(eid, dataset='photometry.signal')\n", + "locations_df = one.load_dataset(eid, dataset='photometryROI.locations')\n", + "\n", + "ffio.from_ibl_dataframes(raw_photometry_df, locations_df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "equivalently, the same can be achieved from stored files from disk:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'GCaMP': SI PPT\n", + " times \n", + " -370.164717 0.011645 0.019462\n", + " -370.131374 0.011657 0.019477\n", + " -370.098063 0.011656 0.019509\n", + " -370.064719 0.011674 0.019500\n", + " -370.031408 0.011659 0.019485\n", + " ... ... ...\n", + " 2762.641050 0.005847 0.009813\n", + " 2762.674394 0.005803 0.009814\n", + " 2762.707705 0.005834 0.009803\n", + " 2762.741048 0.005855 0.009810\n", + " 2762.774392 0.005837 0.009800\n", + " \n", + " [93994 rows x 2 columns],\n", + " 'Isosbestic': SI PPT\n", + " times \n", + " -370.148046 0.011773 0.019487\n", + " -370.114734 0.010041 0.017752\n", + " -370.081391 0.011781 0.019512\n", + " -370.048048 0.011775 0.019507\n", + " -370.014736 0.011785 0.019465\n", + " ... ... ...\n", + " 2762.657722 0.012615 0.020670\n", + " 2762.691033 0.012602 0.020660\n", + " 2762.724377 0.012575 0.020662\n", + " 2762.757720 0.012590 0.020651\n", + " 2762.791032 0.012588 0.020645\n", + " \n", + " [93994 rows x 2 columns]}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "raw_photometry_df = one.load_dataset(eid, dataset='photometry.signal', download_only=True)\n", + "signal_pqt_path = one.eid2path(eid) / 'alf/photometry/photometry.signal.pqt'\n", + "locations_df = one.load_dataset(eid, dataset='photometryROI.locations', download_only=True)\n", + "locations_pqt_path = one.eid2path(eid) / 'alf/photometry/photometryROI.locations.pqt'\n", + "\n", + "ffio.from_ibl_pqt(signal_pqt_path, locations_pqt_path)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ibl", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/examples/process_photometry_data.ipynb b/src/examples/process_photometry_data.ipynb new file mode 100644 index 0000000..ce2793b --- /dev/null +++ b/src/examples/process_photometry_data.ipynb @@ -0,0 +1,798 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# just here\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# imports\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import iblphotometry.io as ffio" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "# ONE instantiation\n", + "from one.api import ONE\n", + "\n", + "one = ONE(base_url='https://alyx.internationalbrainlab.org', mode='remote')\n", + "\n", + "# an example eid from alejandros dataset\n", + "eids = one.search(dataset='photometry.signal.pqt', lab='cortexlab')\n", + "eid = eids[26]\n", + "\n", + "#" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# loading data\n", + "raw_photometry_df = one.load_dataset(eid, dataset='photometry.signal')\n", + "locations_df = one.load_dataset(eid, dataset='photometryROI.locations')\n", + "trials = one.load_dataset(eid, '*trials.table')\n", + "raw_dfs = ffio.from_dataframes(raw_photometry_df, locations_df)\n", + "raw_dfs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# %%\n", + "# KCENIA / isosbestic specific\n", + "from one.api import ONE\n", + "\n", + "one = ONE(cache_dir='/mnt/h0/kb/data/one')\n", + "data_loader = loaders.KceniaLoader(one, verbose=True)\n", + "df = pd.read_csv('/home/georg/code/ibl-photometry/src/local/website.csv')\n", + "eids = list(df['eid'])\n", + "\n", + "raw_dfs = data_loader.load_photometry_data(eids[0])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "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", + " \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", + " \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", + "
intervals_0intervals_1goCue_timesresponse_timeschoicestimOn_timescontrastLeftcontrastRightfeedback_timesfeedbackTyperewardVolumeprobabilityLeftfirstMovement_times
0336.2580344.912302342.1655342.3122-1NaN1.0NaN342.3126-10.00.5342.142571
1344.9815351.972502345.6175349.4200-1345.61711.0NaN349.4204-10.00.5349.254571
2352.0047361.072802352.4799358.5122-1352.47951.0NaN358.5126-10.00.5358.145571
3361.1070375.322402362.6443372.7733-1362.64391.0NaN372.7737-10.00.5368.030571
4375.3645384.112002375.8813381.5560-1375.88091.0NaN381.5564-10.00.5380.960571
..........................................
1752739.13652759.5940022739.80282757.025012739.8024NaN0.52757.0254-10.00.52756.606571
1762759.65632813.8421022760.18542812.293512760.18500.5NaN2812.293613.00.52796.438571
1772813.91422836.6310022816.55192835.065912816.55151.0NaN2835.066013.00.52824.281571
1782836.67742843.8836022837.41792841.3183-12837.41750.5NaN2841.3187-10.00.52840.504571
1792843.92012909.0080022846.45802906.50800NaN0.5NaN2906.5083-10.00.5NaN
\n", + "

180 rows × 13 columns

\n", + "
" + ], + "text/plain": [ + " intervals_0 intervals_1 goCue_times response_times choice \\\n", + "0 336.2580 344.912302 342.1655 342.3122 -1 \n", + "1 344.9815 351.972502 345.6175 349.4200 -1 \n", + "2 352.0047 361.072802 352.4799 358.5122 -1 \n", + "3 361.1070 375.322402 362.6443 372.7733 -1 \n", + "4 375.3645 384.112002 375.8813 381.5560 -1 \n", + ".. ... ... ... ... ... \n", + "175 2739.1365 2759.594002 2739.8028 2757.0250 1 \n", + "176 2759.6563 2813.842102 2760.1854 2812.2935 1 \n", + "177 2813.9142 2836.631002 2816.5519 2835.0659 1 \n", + "178 2836.6774 2843.883602 2837.4179 2841.3183 -1 \n", + "179 2843.9201 2909.008002 2846.4580 2906.5080 0 \n", + "\n", + " stimOn_times contrastLeft contrastRight feedback_times feedbackType \\\n", + "0 NaN 1.0 NaN 342.3126 -1 \n", + "1 345.6171 1.0 NaN 349.4204 -1 \n", + "2 352.4795 1.0 NaN 358.5126 -1 \n", + "3 362.6439 1.0 NaN 372.7737 -1 \n", + "4 375.8809 1.0 NaN 381.5564 -1 \n", + ".. ... ... ... ... ... \n", + "175 2739.8024 NaN 0.5 2757.0254 -1 \n", + "176 2760.1850 0.5 NaN 2812.2936 1 \n", + "177 2816.5515 1.0 NaN 2835.0660 1 \n", + "178 2837.4175 0.5 NaN 2841.3187 -1 \n", + "179 NaN 0.5 NaN 2906.5083 -1 \n", + "\n", + " rewardVolume probabilityLeft firstMovement_times \n", + "0 0.0 0.5 342.142571 \n", + "1 0.0 0.5 349.254571 \n", + "2 0.0 0.5 358.145571 \n", + "3 0.0 0.5 368.030571 \n", + "4 0.0 0.5 380.960571 \n", + ".. ... ... ... \n", + "175 0.0 0.5 2756.606571 \n", + "176 3.0 0.5 2796.438571 \n", + "177 3.0 0.5 2824.281571 \n", + "178 0.0 0.5 2840.504571 \n", + "179 0.0 0.5 NaN \n", + "\n", + "[180 rows x 13 columns]" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trials" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "from this data representation, running an processing pipeline is simple " + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "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", + "
SIPPT
326.2806520.3453711.718132
326.3139950.6881561.748219
326.3473070.8163321.120588
326.3806500.4547251.762858
326.4139941.0190881.167394
.........
2918.846743-0.811561-0.689368
2918.8800870.517880-0.331999
2918.913430-0.1283760.336124
2918.946741-3.0642260.786719
2918.9800850.0747330.149671
\n", + "

77786 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " SI PPT\n", + "326.280652 0.345371 1.718132\n", + "326.313995 0.688156 1.748219\n", + "326.347307 0.816332 1.120588\n", + "326.380650 0.454725 1.762858\n", + "326.413994 1.019088 1.167394\n", + "... ... ...\n", + "2918.846743 -0.811561 -0.689368\n", + "2918.880087 0.517880 -0.331999\n", + "2918.913430 -0.128376 0.336124\n", + "2918.946741 -3.064226 0.786719\n", + "2918.980085 0.074733 0.149671\n", + "\n", + "[77786 rows x 2 columns]" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from iblphotometry import pipelines\n", + "\n", + "# a single band pipelines\n", + "pipeline = pipelines.sliding_mad_pipeline\n", + "\n", + "# getting the data for the GCaMP channel\n", + "raw_df = raw_dfs['GCaMP']\n", + "\n", + "# restricting the photometry data to the time of the task +- 10 seconds\n", + "t_start = trials['intervals_0'].iloc[0] - 10\n", + "t_stop = trials['intervals_1'].iloc[-1] + 10\n", + "raw_df = raw_df.loc[t_start:t_stop]\n", + "\n", + "df_processed = pipelines.run_pipeline(pipeline, raw_df)\n", + "df_processed" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pipelines are lists of tuples, where each tuple defines a `callable` pipeline function and a `dict` of its arguments. Each function is executed one after another, and the output of a function is fed into the next. This makes pipelines very modular they can be constructed with a lot of flexibility:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "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", + "
SIPPT
326.2806520.4230912.972447
326.3139950.8420513.023712
326.3473070.9986161.933368
326.3806500.5565903.047135
326.4139941.2461522.013288
.........
2918.846743-0.854700-0.583010
2918.8800870.545802-0.280588
2918.913430-0.1349980.284811
2918.946741-3.2277730.666126
2918.9800850.0789680.127025
\n", + "

77786 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " SI PPT\n", + "326.280652 0.423091 2.972447\n", + "326.313995 0.842051 3.023712\n", + "326.347307 0.998616 1.933368\n", + "326.380650 0.556590 3.047135\n", + "326.413994 1.246152 2.013288\n", + "... ... ...\n", + "2918.846743 -0.854700 -0.583010\n", + "2918.880087 0.545802 -0.280588\n", + "2918.913430 -0.134998 0.284811\n", + "2918.946741 -3.227773 0.666126\n", + "2918.980085 0.078968 0.127025\n", + "\n", + "[77786 rows x 2 columns]" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from iblphotometry import processing as fpp\n", + "\n", + "pipeline = (\n", + " (fpp.remove_spikes, dict(sd=5)),\n", + " (\n", + " fpp.lowpass_bleachcorrect,\n", + " dict(),\n", + " ), # if an empty dict is passed, the default values will be used\n", + " # (fpp.sliding_dFF, dict(w_len=10)),\n", + " (fpp.zscore, dict(mode='median')),\n", + ")\n", + "\n", + "df_processed = pipelines.run_pipeline(pipeline, raw_df)\n", + "df_processed" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi8AAAGdCAYAAADaPpOnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACA7klEQVR4nO3dd3hUVfoH8O9MyiQhlfSEhA6hd2MQVBQpsgjqgiIiRVAUEURRWetaFtfdH+oiAjZUEFAUQSwgIqKR0HsLPQkhCSWk98z9/TG5N1Pu9B6+n+fJAzNzZ+bMnTv3vuec95yjEARBABEREZGXULq7AERERETWYPBCREREXoXBCxEREXkVBi9ERETkVRi8EBERkVdh8EJERERehcELEREReRUGL0RERORVfN1dAEdTq9W4ePEiQkJCoFAo3F0cIiIisoAgCCgtLUVCQgKUStNtK00ueLl48SKSkpLcXQwiIiKyQU5ODlq0aGFymyYXvISEhADQfPjQ0FA3l4aIiIgsUVJSgqSkJOk6bkqTC17ErqLQ0FAGL0RERF7GkpQPJuwSERGRV2HwQkRERF6FwQsRERF5FQYvRETkFtlXK1BUUePuYpAXYvBCRERuMWPlPsxctd/dxSAvxOCFiIjcpqii1t1FIC/E4IWIiIi8ilODl1atWkGhUBj8zZgxQ3b7zz77zGDbgIAAZxaRiIiIvIxTJ6nbvXs36uvrpdtHjhzBHXfcgTFjxhh9TmhoKDIzM6XbXJ+IiIiItDk1eImOjta5/dZbb6Ft27a45ZZbjD5HoVAgLi7OmcUiIiIiL+aynJeamhqsWLECU6ZMMdmaUlZWhpYtWyIpKQmjRo3C0aNHTb5udXU1SkpKdP6IiIio6XJZ8LJu3ToUFRVh0qRJRrfp2LEjPv30U6xfvx4rVqyAWq1G//79ceHCBaPPmT9/PsLCwqQ/rihNRETUtCkEQRBc8UZDhw6Fv78/NmzYYPFzamtr0alTJ4wbNw6vv/667DbV1dWorq6WbourUhYXF3NhRiIiD/HX6Sv4cmcWPhjfR7pv5MJ0AMCGmQPcVSzyICUlJQgLC7Po+u2SVaWzsrLw66+/Yu3atVY9z8/PD7169cLp06eNbqNSqaBSqewtIhEROdEn6edwubTa/IZEFnBJt9GyZcsQExODESNGWPW8+vp6HD58GPHx8U4qGRERuYKLGvnpOuH04EWtVmPZsmWYOHEifH11G3oeeughzJs3T7r92muv4ZdffsHZs2exb98+PPjgg8jKysLUqVOdXUwiIiLyEk7vNvr111+RnZ2NKVOmGDyWnZ0NpbIxfrp27RqmTZuG/Px8REREoE+fPti+fTs6d+7s7GISEZETXSnTLMB4/ko5WkU1c3NpyNs5PXgZMmSI0ebC33//Xef2O++8g3feecfZRSIiIjc5x+CFHIBrGxERkcvUqZn7QvZj8EJERC5Tr1a7uwjUBDB4ISIil6ln7EIOwOCFiIhcpp5DpskBGLwQEZHLlFfXubsI1AQweCEiIpdZuTPb3UWgJoDBCxEREXkVBi9ERETkVRi8EBERkVdh8EJERERehcELEREReRUGL0RERORVGLwQERGRV2HwQkRERF6FwQsRERF5FQYvRERE5FUYvBAREZFXYfBCREREXoXBCxERuZwgCO4uAnkxBi9ERORyjF3IHgxeiIjIZcIC/VBQUgXGLmQPpwYvr776KhQKhc5fSkqKyeesWbMGKSkpCAgIQLdu3fDTTz85s4hERORC0SEqTP18D77dd8HdRSEv5vSWly5duiAvL0/6S09PN7rt9u3bMW7cODz88MPYv38/Ro8ejdGjR+PIkSPOLiYREbnA1fIaAMCZS2VuLgl5M6cHL76+voiLi5P+oqKijG773nvvYdiwYZg7dy46deqE119/Hb1798b777/v7GISEZELXGsIXoora91cEvJmTg9eTp06hYSEBLRp0wbjx49Hdna20W0zMjIwePBgnfuGDh2KjIwMo8+prq5GSUmJzh8REXm2OjWzXsh2Tg1eUlNT8dlnn2Hjxo1YvHgxzp07h4EDB6K0tFR2+/z8fMTGxurcFxsbi/z8fKPvMX/+fISFhUl/SUlJDv0MRETkXBw2TdZyavAyfPhwjBkzBt27d8fQoUPx008/oaioCF9//bXD3mPevHkoLi6W/nJychz22kREROR5fF35ZuHh4ejQoQNOnz4t+3hcXBwKCgp07isoKEBcXJzR11SpVFCpVA4tJxERuY4gAAqFu0tB3sSl87yUlZXhzJkziI+Pl308LS0NW7Zs0blv8+bNSEtLc0XxiIiIyAs4NXh55plnsG3bNpw/fx7bt2/H3XffDR8fH4wbNw4A8NBDD2HevHnS9rNmzcLGjRvxf//3fzhx4gReffVV7NmzB0888YQzi0lERERexKndRhcuXMC4ceNw9epVREdHY8CAAdixYweio6MBANnZ2VAqG+On/v37Y+XKlXjxxRfxj3/8A+3bt8e6devQtWtXZxaTiIhcLDO/ceAG03XJWgqhiaV5l5SUICwsDMXFxQgNDXV3cYiICMDIhcYnKF034yb4KJn0cr2z5vrNtY2IiMitmlgdmlyAwQsREbkVQxeyFoMXIiJyuoTwAHcXgZoQBi9EROR0Kl8fo4+x14isxeCFiIicjvEJORKDFyIicjom5ZIjMXghIiKnMxW6CGyXISsxeCEiIudjfEIOxOCFiIjcij1KZC0GL0RE5HTsGiJHYvBCREROx9YVciQGL0RE5HSmghdHBTbnr5Rj0rJdqKqtd8wLksdi8EJERE7nim6jHw/n4WpZDXKLKp3+XuReDF6IiMjp6urZb0SOw+CFyIyRC9Ox4eBFdxfDK5VX16GgpMrdxSAPoDbRN8RkXrIWgxciC2w5XuDuIsiqrKnHPR/8hVMFpe4uiqxn1hzE1M/3uLsYdsm+WoFv9l5wdzGISAuDFyIv8/WeHGw+pgmmLhZXorZewC/HPDO4unDN+3MPXlp/BJ9vP+/uYng9kzPssuGFrOTr7gIQkXWWZ2QBAO7oHOvmkhA5BmMXshZbXq5DZdV12HH2qruL4VV4ciWyD1tXyJEYvDjRJ+nn8NqGY+4uhoF3N5/Emz8ed3cxyAVyiypx9nKZu4vh1RQKd5eg6fPEFaeLKmqQV+z53Z5XyqrdXQS3cGrwMn/+fPTr1w8hISGIiYnB6NGjkZmZafI5n332GRQKhc5fQECAM4tplxP5JahXy//w1u3Pxe7zhS4ukXlFlbXuLgIqa+qRX8xRKPYyd86fvnwvZq0+4JKyNFUeeF3VUV5dh9OXPD9A9fDdqOPclXJM+GQXHvlir7uLYtK2k5cxedluh8xr8+w3B7FyZ7YDSuUaTg1etm3bhhkzZmDHjh3YvHkzamtrMWTIEJSXl5t8XmhoKPLy8qS/rKwsZxbTZlfKqjF3zSF8tTvH3UWxSma++0emvLjuCKZ94d2jUDyRWi2gvLrO3cXwCsWVtTYP486+WoHqOvfP4lpXr8b9H+7AU18dsPu1jueVoLZebX+hjPDE1hVj0k9fcXcRLCK2qhaW1dj9WsfzSrFqF4MXAMDGjRsxadIkdOnSBT169MBnn32G7Oxs7N1rOppVKBSIi4uT/mJjPTMxsbJGc/LS/sL/vfEEXv3+qF2ve6WsGqVV9rWObM28hKyrpoNES08md72fjo/+OGtXefSd9NChvZ6orl6Nqtp63PV+Oo5eLNZ5TL9L4+P0s7j/wx0Gr1FUYfrkVlpViwM5RfYW1SUO5hThzR/lu2Nr69X4ek+O0dZQbY8u34Opn+/B3R/8hfk/GXajrtufi3lrD8l2G81YuQ/v/XrK6rI7Wq2DJn4rrarFs98ckpLBXc17whr7CYKAHw/lWR0ojl2SgS8yzuvcJx6a4jw5e84XYruXBF72cmnOS3Gx5sTbvHlzk9uVlZWhZcuWSEpKwqhRo3D0qPFgoLq6GiUlJTp/7lJaVYv0U1ewN+uaXa8zedluu1slFvxyEk+s3G9ym7X7ci2qPQoC8L2LJ2nbda4Ql0rZrfTrsQLc/cF2nMgvhSAAm46aHhK961zjsafdXz/hk13IOGM8SftfPx3HS+uO2F3eqy7of1/42ynsOCvfHbvleAGWZ2RZVHMur9Yc+3X1ArbL7JtP0s/hSG7j+eTYxRIcu9h4+9wV05UDb1JTp7mQckJB5zt4oRhLtp3Bj4fyrHpeZW091uwxPd/QPzccw/yfT9hTPK/hsuBFrVZj9uzZuOmmm9C1a1ej23Xs2BGffvop1q9fjxUrVkCtVqN///64cEH+S5s/fz7CwsKkv6SkJGd9BLMcWXsQT6zO9Nn281i/3zNnjn39h2N49ptD7i6GRGykKq6sxciF6S5rpdibrQlGpMBCq7Xs98xLePrrg7LP25p5yaC/3tTF9nKp/UHHjrNXMWnZbpx38kVdYSKDtq6hxUVtQcuLtZ779hCe+9Z9x+THf57FxiONF7yiihqcyHdfZc2RvKhHyW5ii4sYMJqTfbUCX3tZaoIruCx4mTFjBo4cOYLVq1eb3C4tLQ0PPfQQevbsiVtuuQVr165FdHQ0li5dKrv9vHnzUFxcLP3l5LjuS16zR/e9TA1K2Hn2qtW10pEL03GlrBqCIFjcxbNqV7ZO7cncD8Tdfbtf78nBoq2nZR+7VlGLVbuyMWu16RYkV7rUsG93nXP/UPMPfj9jtHtkwS8nHfY+dRY2b4vB0WUnt74om+jon7ziSizZdsbob339gYtYtPWMFJjNW3sYL6+3r4valUyewhwUvIjnu189dNJGW7z2w1Es3yHfnVfd8Hmvp+BP5JLg5YknnsAPP/yArVu3okWLFlY918/PD7169cLp0/IXOJVKhdDQUJ0/V9maeVnn9raTjbd/OqzbJPjGj8dtOtFkXS3HfR/usGjEiCAIWLkzG//d1Dii6+9Ltpt8jrHa+OhFf2HhFuf36S/PyMLGI/lGH1+5MxtnL7uveV7MMamosb8l7NlvDmLe2kPYeuISRi5Mt+k1TmglW2tfxJ01nPdIbjHu/mA7cgorsC/7GgrLjefOiCdQZ8UWW44X4GBOEXyVmtOWra0r205ext4s+0cBOnqfL/5d05VQVWs6WPy8Ie/BkSsnu+LaZ2r9IkclP1fVal5Hbh4rQRDwy9F8i1s8HEmtFqTPaG2gYWr7H6zsejLmk/RzBveduVyGkQvTPXaFbqcGL4Ig4IknnsB3332H3377Da1bt7b6Nerr63H48GHEx8c7oYSOdSKv8cKy+PczBo9fM5M0KUcQNInBlvSviwd5ndZJXfvAP55XYjSC11ev9oAp5838ytVqAesP5Fqd+FZXr8bGI3kWtWb93hCgXm7Ivympsn0kz/G8UhzJLbFqnRz962Oe1vByhdaj1p4Qc4sqUVOnRvbVChSbGDovBku5RZV4Zf1RvLjusHVv5EDv/noKL647IgUNphb6M+W/mzLx6vfG51+qq1dLyfi2OH+l3KkjkdbuywXQtGrbDzto/StxlyhlIsvMglIs/O00vttvwe/Pwp1r6cCKd349ib8vzrBoW0tcKavWOe/Zeyis259rcN+RXE3F7YyHDsN3avAyY8YMrFixAitXrkRISAjy8/ORn5+PysrGSO6hhx7CvHnzpNuvvfYafvnlF5w9exb79u3Dgw8+iKysLEydOtWZRW1SjM358Py3h9zSd3rhWgWW/WUY2Ztj7ge5+3whPv7zHDYdNd5yc6mkCvcu3q4zkdMvxwqwaOsZ7LEgsbrxQqn519aRZHLdO1uOF2DmKsMuscqaeoxcaDiyyJwSMyfSenXjyW768r14f+tpzFi5D7NX74cYJukHdGLrxtYTlwAAVxwwJNNe4oWpzgl5LQAw/+cTGLvUtgvNxaJKzFy1H4t+k28pNsWaYOSih9SGP/rjrMVzzJj7fI5IgBaPX7lWsbqGkVmWtKKeLDD/mbKvVuCBj3bKzuWVU1iB5Q0tZAdyiqRKkCmlVbVSwKCtTGbqg8nLduODrYYV5OuJU4OXxYsXo7i4GLfeeivi4+Olv6+++kraJjs7G3l5jU1f165dw7Rp09CpUyfceeedKCkpwfbt29G5c2dnFtUhzDUjCwKwelc2DuQUoaq23qLMfkeeno2d60cuTMceB06md6WsWuezLfjlpFRbdCTx4rV021mj+US7zheipk6NwxcaTwpirdqS5mO5GhwAnNI7ub224Zh0spKzU6YZe+m2szh/pRyf/XVOZ1VoMXn2t+OXTJZN+6S2P/saxn+00+Qx9fWeC9h+5oqUw6IdkBSWa97zx4buzrp6TauM2FInNxrHGGu6U4oqavDer6fM5tVo7x9bZxStqq0329q28Ugedp2z7bdQU6fGo8s1SdJZhRU2vYalxPdxOL3vrqKmDp+knzOaW/X9wYv490bLRreYC16elAnkbWXqvfQ/SkFJldTdVK/W5BdakpBf0NAaq98yUVuvxj++O4yv91zAgl8ydUbxac92Xa9XyDd+OI55aw1bNo0FW7/asdL9mctlRr/Tz7efxxcZ5z2+Zc/p3UZyf5MmTZK2+f333/HZZ59Jt9955x1kZWWhuroa+fn5+PHHH9GrVy9nFtNiZy6XGW0mfGndEaPRtXbz3pc7s/HSuiN488fjmOqgplKRPcfa6z8cMxtMydUA5ExettvmzyYIgpSPYM2PZ9Ky3QavY2wkhjUXV2ObnsgvRWF5jXQx3H2+EF8bGcZYUFKFWhOtBN/uy8VrPzR2Y5jKDTCmoMSyC/qR3GIcuWi4X8T5QrKuai66X2RkYcbKfQbb2dqdUlVbL9uV8s3eC/j1eAFOmai9n75Uijlao6pKG7ru5I4P8b4FmxsTlkcuTMeiracxZkkGfjUTEFoSpInzu+QUVuoEzdrdWOYOsdp6NUYuTMcWOy5A5qzddwFz18iPRgM036V+AK/QK/nafblYtz8Xh3OLcfZymWyekdz3MHZpBn4x0SLqDvq/+6yr5dh4JA9TP9+Dhb9pvtPRi/7Ce1bm+ul//P/+komiCs11Qj8vctbqAziQo2nx1Z8QLl/v/LtmT47F00XIdfsYU1pVi9mrD2DlTvkUgm/2XsCaPRdk82A8Cdc2ssLs1QfwwndHcDCnyCCIMRWpy0XT1nYJmHKqoNTkKAVLqAXN5zPlOa2hy0UVNXjgox149fujeHvjCSzPOG+QhGpLUuq2k5dl8xHkfsTGcl1yCivw5o/HMXfNIRy6YHw/W5KIZqzlBQAmfrpLaqkwpq5ejamf7zHZKqNP/Bo3Hy/An6ccOxpM/+JkzHkzExxaa8ySDDz8memAVszD0ffUV8YvwKao1QL+1TD5nJgUfvhCkU2vpU27xjtp2W5ca0hitma5C/Fzaif5O9qyv87rJHhru3CtAmOXZuDZb0zvW/GMUlRRg1mrD+CrPZZ1O1fW1GO1G7qoLTkFiufJWasPYFFD14v2fD5bzAS4ImO/pL3nTXdHX2qoaAgCpJGUZdV1OsnwarWALzKyLB41aM3cYuIIpQvXNOe/4grLJ0TNulpucSXW2Ri8WCmrsAIvrjsinRQtITcdv9xcFdlXK6TmS5ElCzvO+fogfjyUZ/ZCao54UGpn6ms312drNYUfyS1BaVUd9mZdw5+nrkitDnI1c0tDqt8zLxnNqZC78P2fkR/2018fxM6Gpv9rWieE9QdyMf/n41JzqbHZRMuq6/DnKc1FRftrmvDJToNtzS21IDYNm2sZ0T7piic0ZzTbmmt12tZQUzT33pdKqzDx0114Zs1B/GeTpttA7HoS6S8IaSoxGNDk4bz7q+VDvOVaqLSDn1GL/jI5MZ/sa8p87qtm8nzE3412/pL273vDwYvYYGSSR+33Ez/PjrNXsXbfBaw/4PiuVtHbGzUjEs80jOQz9n2Ln0IcAXXhWgX+OHlZrwVG98nXjIxIs6VF0VaXSqsNEnP1A3dLZmE2xdizrWnZFUdSaneZ1dSppQDD1qR0c/lv2uaaCWC1PbFyP152wGSWjsDgxUb2Dt+Vq2HOWLnP4v5jOcZqWeXVdQZBkSnrDzSeaL/Zp3sCKKmqxTd7L6CoUv4E9cHv1icqAprWkv/75SS+NNKUaYnv9l/QjBTR+qzaJ5KP/zyH7aev6lxYxCBF2/u/ncbbGzMN5vEpkqmh/J552fahhFplEye/q66rN5qb5AqVFh4nGWeuorC8Bpn5pfjjpKZ1qHH2X80H25ddZPA8MaApKKnCkm1nDE7O1rQ0iU/9Zu8F/G/LKeQWVeKz7edNPkc/z8AR5F5S+/r14R9n8aHe8hriISjmv2lbsPkklv11Hh//ec4pk+3JyblWoVMuQ2JgVYj/bMrEn6ev6JTtkS/2YHPD6MT/26wJjPS/W3t3/cmCUrz54zGs3XdBeu8rZdXYl93Y6rBTK1/p0/TzADStEiMXpkvBitzv2BrHLpaYXKndXOtmocyoU+1JIsd/vAPjPzZc4kNkydp02tNlmJNn5QK5prp4XYnBi41smffDkprHHjNNjqbkXpO/iN7/4Q7Z9W6MMZU8+dTqA/h8+3ks3Sa/1pF+y8m2k5eldXVMJVqKJ/A6O9Zq+TT9vEEfs3jC/Di9sbzapxaxBqpN7BL8IiNLJ5AzZoeVtXuRXM3PFTMrW8LeWnJRRQ0+lwkkZq0+gON5Jfjwj7P48VAeSiptb4IWS/j59vPYfKwA0y1IYhUDLWOcNV+OKWOWZBjtdra2POevlEuTW4os6c56xcgcVPrvL1a6KmvqpG6hmnoBecVV+LQhR0JspXHErvxqd7Y0MeT7v53GjrOFWPbXeSk36blvDkllN7belTjnVkWN5ljbdvKy9H9bPPftIcxafcCqCqE2/WT/7Ku6yd1VtWqTa1Y9YyKPSbQ/uwjFlbVSS7ggCPgi47xB3pklE6fuy76GJ1ftd/rM2dZi8GIle2pC9l6Ylv11DiMXpktD89RqQecCaGqooa1NpPq1iEtWTiP/302ZUkDz8Z/GE8DmGJnmXt+uc4UmP4v2cGCgsTVK+yJprvZt7arM+rX93zMvIaewwmjGvthSI9f65oqVd9//zXxC4sEc47lC5r4DhUKzlpIxz35zSKppuiNYMCb7aoXdXQkSmc8lfrdFFTUGCeaZDprmXxwptVNr7afnvj0EtVrAlbJqPLp8D/7vF92AXbur96RWrf7s5TKs3qUJUOTqM2Lenn43kfZSGkdyi7Gg4f2s3bNqtYAVO7Lxn02Gz69t+J1faXhvtVowut6VSLvCqV/RM9XNIgiCbJenWPGx9yd7LM/4d388z/YFbB/8eCce+1IT0C/fkYU1ey5gztcHdQZmvGXBOki/nbiEc1fKZad1cCdfdxeALCcON/7Pxkx8PT0Nz317yGhXka0mfLLTrmbVahO1kb/sXIog62o5Xv/hGMbdkIy/95GfqXmRBXMf6M9KOWPlPrwztif8fTWx/FUTs8iac+hCkU4uTvcW4QbbOOwCaQOFQmHxyCRjXv/hGCKD/e16Df1A29g6VqYmIBQEQSeJ3F5yo6tsJQb92oHBXe//hdhQFe7vl2zVqC1bKkxLtjX+DgrLa7B42xkpaflikW5LzH+1ghntyskXWjlh6ad1WzR/Opxvdl6W2npBGqwwZ0hHm4dDir8XQTdBqOFfzX9GLfpL9rl/nb4iBXTaI9D0K0t19YLRWZfXHcjFp+nn8fWjaQj09zFbXku7Xhs55nwg91sR87XE4dzZVyvw/LeNA0gsuX7Ij+oTTK4x5goMXtzs/JVy1KkFtIsJtvg54o/D0YELYNgffDi3yKrnm+sPHbkwHUEWnADkiCMCVu3KNhhWaA39kWLZVytw7+Lt2DBzAADTC/+Z88J3uslsrmhJsYY1QypNMZfEailzc7aYmojrgY8ME6jd4ctdWeiSEKZz38mCUrzw3WGD0W4FJdVWJWEKgubCLAbWtjK1BMfJAt3zSFVtvUFXU7VeK6E7VtTWTRG2bB9aOnIIgNFZl8Xgp7ymzmzwYi4pXc5uO1IFtBmbt8rWpUhMqa5TI8DPtvO4ozB4cTOxKW79jJvcXBJ59uQkGGPrOkHatcn92bb/4I1VZNftz8XoXomocONQQGcEpK6g3TpgLH9CjvYQVTnesGry9tNXsf20Yd6TsWH6cgG+sXhGHEptyYSK18prcMjKygZgWGEZs0Qzu3CflhFaBTT/Oo4eQmvwllp3SL3DCoXT10kQj9GDOUW4vVOswePrDuRKc7a8elcXq1/f1kkR7eXOFmBHYPDiIQ7JTAttii0RflNiT9eWsWb4T9LPYXSvRINapitZMrOnJ7JnlJyc4spa5BV7xhT4jmZNTpV2V4c501fsdcgCos5ibRK4fqul9vOFxo3sLJXlVu3KkW0B0+4C1J94zpWsbTD21oqSiMGLh/i3BYlT2mydIp1M+8d37lt4EPCMBFZbRhVYs3yAJR78WNMl1CIi0KGv66m+3JltVdexHEcHLtZMfGYJe+MM7ecfu1iCOzobtoI4U0FJlezoRG2mhlB7GlvnkPEUHG3kIaxtcjU3Gy7Z5rCJGXltYe3pwdgEX67kSaMKLhgZ/u/NjH0mSxc4dAdrFsE01sJiySsczCnCuA93oKKmDi/qTYamfbG1dF0fuUUTncmbwgFxmQ1beEIliy0vRE5kTf4HALPDPa8H3lR7tYU7kl3tZU2Z9ecxscZ3+3NRVl2Hp78+aFHg6mlpG/bMU2UvS5f+cARPaLRhywsReZSnvjrg7iKQjYzN/lpTp7Zo5J24jSWByxEr8wSbukeWO3ahX0/Hlhci8iieVpsmyxmb/fXexdster41X73cgrfXM3uXPfA2bHkhIiKXGtY1TvZ+ucaZU5fK8Mp6z1gMkDTYbURERNedzvGhAICeSeEWbb8vu8hgZmByH2eueG4pBi9EROQWIQG6mQveOs/R9cYTks4ZvBAREZHFLhS5fwoDBi9EROQWSk+YMISsln21wt1FYPBCRESu1SEuBADQrUWYmS3JU+UUujeAYfBCREQulRgeiA0zB6BlZJC7i0I22u/m/CSXBC+LFi1Cq1atEBAQgNTUVOzatcvk9mvWrEFKSgoCAgLQrVs3/PTTT64oJhERuZArZ4Ulx6py8yKgTg9evvrqK8yZMwevvPIK9u3bhx49emDo0KG4dOmS7Pbbt2/HuHHj8PDDD2P//v0YPXo0Ro8ejSNHOM6fiIjIE/xyzLL1pZzF6cHLggULMG3aNEyePBmdO3fGkiVLEBQUhE8//VR2+/feew/Dhg3D3Llz0alTJ7z++uvo3bs33n//fWcXlYiIXIj5ut6rTq126/s7NXipqanB3r17MXjw4MY3VCoxePBgZGRkyD4nIyNDZ3sAGDp0qNHtq6urUVJSovNHRESej7GL93L3LLtODV6uXLmC+vp6xMbG6twfGxuL/Px82efk5+dbtf38+fMRFhYm/SUlJTmm8ERERCTL3SsEeP1oo3nz5qG4uFj6y8nJcXeRiIjIAuw2Ils5dVXpqKgo+Pj4oKBAN7GnoKAAcXHyC3PFxcVZtb1KpYJKpXJMgYmIyIUYvXgrwc39Rk5tefH390efPn2wZcsW6T61Wo0tW7YgLS1N9jlpaWk62wPA5s2bjW5PRERE1xentrwAwJw5czBx4kT07dsXN9xwA959912Ul5dj8uTJAICHHnoIiYmJmD9/PgBg1qxZuOWWW/B///d/GDFiBFavXo09e/bgww8/dHZRiYjIhdht5L3cnbDr9ODlvvvuw+XLl/Hyyy8jPz8fPXv2xMaNG6Wk3OzsbCiVjQ1A/fv3x8qVK/Hiiy/iH//4B9q3b49169aha9euzi4qERE5UXLzIDw7rKN0m7EL2crpwQsAPPHEE3jiiSdkH/v9998N7hszZgzGjBnj5FIREZErhQb6omVkM3cXg5oArx9tRERE3knBfiOvpW7KCbtERESNFCZukTdxd84LgxciInKLylr3Lu5H3ovBCxERucW1ihp3F4G8FIMXIiJyCaVeP1GXhDD3FITsJrh5gQAGL0RE5BK+etFLWKCfm0pC9lIz54WIyLM9PKC1u4vQJPgoeckhx+CRdJ3q0zLC3UUgouuMr493jS+KCfHsdfPaxQS7783Z8kLu0CUh1Onv8egtbZz+Hq74HEStouQnVuuVHC79v3/bSBeVxnvdnhLj7iJYJcDPx91FMOmpwR3c9t7MeWkCJvVv5e4iWK1NtGfNcqnyVSLAz/rD8V93d3NCadxvVM8EdxdBop9k2ZQkRwaZ3WZs3xbomRQu+9gLIzpJ/7+7d6L0/4hm/jaX6YbWzW1+rqdLam5+f5Nxzw1L0bntyF640b0SzW+khfO8eKG37nXNBfP10c5bz6lPy+ZY/vANRh8f1DHaae8tJ7VNcyhsmLJKacGVtUVEoNWv20zl3hrXkM5xiAzWvQBGu6kJe830/m55X2t1b6EZueLno8CX01Jlt9EODO7pnWiQQKpvw8wBmJDWyujjKt/G40Q8md/VIwGCHWf21kZaeZoCd02o29KCINUbDGgfpXM7Mdz6c5sxD6W1dNhruQKDFxt0SQjD/HsaAxhvyh/RPvjDg+RrhwoF0NkB3TFWByMNm9/T23QN4Kk72lv8ks2b+WN8quGPctUjN5opinubGxQK4JYOjQHk/Hu6uW06bj8vyVPokhCGTyf1w7LJNyDITHP/c8NS8OCN9p2sTeVvDOkca/Pr3tjGsS0vM29r59DX82TvP9BL9n4fG5sPPT3osXZ5hUAjv4sWEYFeN9sxgxcbdU1snJ+gVVQz3OrilgpbzR3SEd8+Zrom3b9tlEOaBDvFh1i1/T/u7IQ7Osdi8k2mR3YE+Vu+nmjv5Ajc1M4wF6GZv+mLm7U1RO2ciO8et76lQr91SHv/p8SF6BxvrmbpCTJY5ZJ1Xg2ITem+PgpEh6gQFugHXx/5U5u4X7smhsLPR6mznz96qK9V73uHiQDFVGuNOSEBjhs+PKhjNIZ0iUOyh3TXODv+Nrbo49QBtuXfPXZrW3uK4xYpcbrn3biwAOn/gUbOe35Gfi+ezPtK7KFubGM+We/f93Z3QUlMUyoV8Pc1/bXflhJjdyrWTe2i0Cbaukz4nknhePJ2y1tVRGumpxmtWXWIDZa9+Jq7ICutjF60tzZ24bTVRBM5Ve/c10MnP+abx9KwVit4ulerFcvcyISxfVvYXMb7+iWZbc1yln6tI3BzhygM7xpn9XOfHdZR+r/2SV7OvOEpOl2t02+Wv7CJh46tLVaxoQGYMci6i+aiB3rb9F7W8tb8p/Ag6wPCjnEhDg0kjWkfEyzlTf69T+Nv8N37e5p8nti1r//Z9FvNnx/emCeTEG76GLeGm1NeGLw0RU/c1g7RISp0jLO85UOM1mcMaocbWjc36KL45rE0q8pg6bU/tSEHwZpuGv0tA/x8EBJgWOvv3iIMw2QuaJacyLTLL56wTXUFNLchQfPmDo1deHKjGtrHaL4TMfdFP6B67Na2aBcTgpjQxhOSytdHthb1QGqyyQnB4sMCcP8NydZ9AC32dsHYalDHaKh8fTB3aIrBhUbue9Y/LltEWN4i0b9dFEK13sOSfCtbDelseSA2784U8xs5qKjaF1dbuOuC54mLV7dvqEyM7CGfnN/WROUvPiwAc4Z0NLi/T8sI9ErWTWPQHu7tayLD19oKmz15XY7A4MUKA9tHOTRy1R6pIBrcKVZq4rX14BjaJQ6fTuqHyTe1svg5Q7roniy1ExHtGQL6hpmkY7E1YEgX23MEAEg/2KkDG7ucmjfzN2hhefL29nhLpgXMVDLsl9NuxNyhHTHz9vayza53dI7F00N0hyzKjRb6/ombjL7H3XqZ/n6+CgxoH4UVD6ciPkzTpfTaqC46yZx3dos3+noi7c+v0mtx69sqQhpq/v4DvU1e3yyt2c+8rR36tIzAo7e0wd+6my+fNv19YE7LyCA8dYfxoaLvP9AbN7XTTXB0xvk2qbl80mS/VrbnriiVCounAejfVvczju2XhCkDWtn83qakWtDC7G3s7e7s3zbSbFe8KYMcOHy8Q2yIyd9xUMNABLlcHnPBuCUj81yJwYsVnh2WgqUTrOsXBxp/HPonOblDJTkyEP1lcjTMkRsyrH+ilus26NMyQqoBaLtN6wel3exorR5J4dgwcwBeGdlZJ8kZ0Iz8uLN7PDbMHIDuLcItfk0/mW6vzvGhOv8ac0fnWIMM/UEpMZh/TzesfuRGKX9C+6IfrPLFzQ3Js4se6I23/64b/HSINWxejjCSDK1Nu7VJvytPDFjCtFoPWkQEGa2l6euRpMmRiQpuDMoeH2SYuCleYM0lNCZHBuHlkZ0xuJPpIHNIlzi8elcX/K17Ah69xbquj1ZR1p0cA/18THb/hQX6oW3DlACP3tJGp8vHkQnZC8b2xEqZ0U3PDDWsGbvChBtbSt3YAQ3BtiXd2tcD/XwQAAaj+vS3jTLyuHYagL+vEu/c10PncbMXe5lDUL/CKpdg2z4mGNNubszh0Q/QuyWG6XQXa/9G7uyqqVD8rbv1UzH01mvRcTcGL3YSm6a1j7mWkUEYd0MyYkM1F452McHYMHOAwQXO1gx4Od1ahBkMsdR/fbkJjV69qwsW3NcTQQ0nOfFf7ecqFAqra6z6n6xvq+YGSacv/a2zTjO8JdZMT5NeW7uMQ7vE4stpqTpdI9plNjWvzZw7OiA2NADNVL5SzUS/lUIUHaJCJzMBEiDfPK5QKPC4kQRAa4c8msuJeGN0N3z16I3SMSgIhuvIKKDAPb0TpZwhc3lA/Vo1x6zBhjlJn07qZ/Q5poZf6gfplgYU4UF+iA0NwLhUy7u5IpupjI6uk2PN8HpNt6XhcWxLEqT2SDu535xcNygAqdt0XEPXX3xYIB6/tS0m99e0RI63oUvQ2Ht9Msn6Cpwpti690Da6GZY/fIMUZIhdWq+P7io7V84H43vLTj9h7NQmjvZbNll3SonXR3fFe/f3REyobmttuxjdwGikmQDh8VvbGgQellhwX0+dVr1HBrbBPK0KplKpwCStQQ/aI+/EyqSx85s+7bytunq1zmPxDhymbQsGL3ZYMqEP3m9oTk/UOtm9/0BvPJCajPfu1wzbM3ZNMNfFKPejMhXwvHtfT53my5S4EJ3+zohmxgOFtDaRmDOkAwbY8GNyphdHdNJJXAvw80HXxDAM7RKrW5NWKEwGQv+6uxuWTuijc9/iB3vjRb2uu54twjF1YGuzXR7mTrhizpD+KA9jF4Sk5kFYM926vCKRse5Fc6OyBAhQKBRSvo2tobSpLrcxfZMwvJvuZ14zPQ0Lx/XCY3otM8a6X7Q9O6wjFoztiY8n9rWqJijOBipOa6AyMyGiuS6sDrGGNXh7u6Q2zBwgO9JOOzdqhkzrGaCZFO+LKTdg3A1J0n3Du8VL3ZxKpUInL6tPywiM6plgdu6gu2Ra+qKamZ9vyJocOUsqA3IC/X0QHuSP+xs+s9h62TMpHC/9rbPB9knNgyyaMTc0UPO7MXZ+7pkUbnYwwu2dYmSf/4hWi0m7mBC7WrVFSqXC5PEs2x1k4Y+9udZ3rd9yf4+V3byOxuDFDonhgVJtVq7pMdDPB72Tw42OFpEb/ioIujVQa5IC9UcSKRQKKZHy0VvamMycVyoVGNQxxuj7uSvhLbVNpEHimp+PEk/c1l7280SHqKQsfO3pq5upfJGgV1NoERFk0IevVCowqmei0RlVRaN7JZqeP6PhrSf2b4X37u8pDaXXbt3Q36fOnIrcmu9PPHk7S4CfD1pFNUN4kL9OjlK7mBDZxGttPZLC7Zqs785ucfj2sf4m93V4kB+GdInDhpkDDB6z53cQb2Y0kz7x+NXPaTEmQibHS9uySf0wuFMsFj/YG6+M7IypA9uYTNJUKKDTPaF9v7avHtUdZTa4Uyz8rWh1snVUljXBojXzoYjDqq1pqdNn7PgyNwFhVMOxLSZh/3eMpivqwRuTDSaos5ZOa7qRbfTfo1dyOP5vbA9smDnAoCJmbYKvozkleDl//jwefvhhtG7dGoGBgWjbti1eeeUV1NTUmHzerbfeCoVCofM3ffp0ZxTR4eS+RqVSgX+O6mo0a1zl62MQzWr/IAUB6JaoWyuJDXX/QmF+PgpM6t8K7WON1z5uc9MaJgqFAuMbAjZ7asLG5ouw1G2dYtAuJhhdEkLRJjoYT8uMDHAUS07M4r6YOrC1NCTa2P6JDXVcUrqp9wGAUT11a29yNWZHUihMTxWwZnoaPp5ovlvElvO2tTNmOzq5WKlUYNbg9mgREWRwzEQG+xtUXIxdnPSfK9fCp1AosGHmAKfO2irXKuQIt3aMxoqpqTr5YrbQ33vLH77B7HxNzYP88d3j/aWANTkyCBtmDsB9/ZINlgYwRzuXcd7wFJ0J/MRK9xy9gQbPDUsxyN0RWxnbxQRjtla3sSUtpc7klODlxIkTUKvVWLp0KY4ePYp33nkHS5YswT/+8Q+zz502bRry8vKkv7ffftsZRXQb/YaNf9/bHf8d08NoDsPcIboH7Px7uuPNu3VPgsbyKJzF10eJe/u0QIhMln5ksD9evasL+tox0kKkPcOsNRxVHzDXLzywfTRuS4mRLWdUsArv3NcTzRw8cZu1I9D0rz+jeibirp7yzb3Sti4eAfnoLW1kR97Jsfa7FQMxUwnU3VuESRfCAD8fnZF21vD31ZTO0u+8b6vGbi+50Wlj+iYh0N/HJTOffjb5BqyfIT8aTnu0obVl0V/LSO74tXaWWGOvrf8qtlb0FAqF0WkFTE03IPc62ixtyXHUPFGvj+6KD8Zr0hr6t4vSmRagZ1I4Xh/dFbfKnLu0c3e0P4JCocDtWgn7+jk+ruaU4GXYsGFYtmwZhgwZgjZt2uCuu+7CM888g7Vr15p9blBQEOLi4qS/0FDvWDXY0vP98qm6oxL8fZXoGBeik68h5qmEBfoiwF/zFQ3rGoeV01LRvJk/urcIx4ju8VL/vaMnRRN1TZTf92IApj9MdWD7KDw3LMUhyyVsmDlAZ7TGsK5xsqOiZDWUz95rsLnnB/r74Kk7OhidtdIc+y5Kjc8WLwhzrRzdon/NsPUiYu376Ptb9wSLR8NY+50ObB+Fd+7raTKv4s27u8l2j5gi95HaRgdjzh0dcG9vw7lQkpsH6Tznydvb45WRXaTbUwcavv8NrZvj60fToHLTysZiF552jd/Ywopi9wag211ryXBxe4+66GBNgKrfJWPxPFdWHFQrpsqvmaVvbN8kpBmZYqJ/20inrR2n31Vu7PtSKBTomRRu9DcvJgC7e5kUU1w2n3dxcTGaNzd/IH/55ZdYsWIF4uLiMHLkSLz00ksICjI+5Ky6uhrV1dXS7ZKSEoeU11lCA/ygVABqvR+MuAptbGgAbmoXieTIICmyfee+Hkhu3kynuXv6LW2x6Wg+9mZdc1pZ5w5NkX39BxrWCtKvSTxrZbOmNYwlKsrxa5iIyZpakjsM7xaPrZmXrXqOtRdvseVBrovP3avCynF0mRQKhdmZhR35Xsbm7Fg0vjcEQcDUga0RHawyemGT0zs5HH/rHu/SKdznDOmAmxq6LrS7k/RzOSY0dAsZCxQsGVFpLndiUMdobM28DD8fTc1/45F8nceTI4Ow4uFUnWkFAGDmbe3Rv20UNh7JR6xWnlT7mGCculRmtlzmiCMz5daBE5OjxbJrm3enYSujp/0UeyVHwN9XiTs6u6f73xIuCV5Onz6NhQsX4r///a/J7R544AG0bNkSCQkJOHToEJ577jlkZmaabLGZP38+/vnPfzq6yM6lUBicpTvFh+K9+3uidVQzKBQKndEMxprnLDnRd2loPdGfddESzZv5G6zfEhOi0ulrfnFEJ7zx43GrX9uZIpr5Y97wFPS2swXI2i6ad+7ricJy03ldgGY4bIuIIJtHWQCW51y0iAjC6kdu1OnKMPfcVlHNHHJyF4m7cVTPBJOzhgJAC71+dJWvEtV1aiNbu0f7mGCTSzboaxy9ojDI8bGEQqHQmTNHrvLjaIM6mr9oPZCajLF9k8xuJxrQPkqav8hSCgXQJjoYWzMvY84dHTGgfZQUvGjnpOgHLoAm0LqpXZTBcOQ37+6GsUszZN/PmhmEg/x98eW0VNnuc50P4IUC/X3smnjPFawKXp5//nn8+9//NrnN8ePHkZLSWAPPzc3FsGHDMGbMGEybNs3kcx955BHp/926dUN8fDxuv/12nDlzBm3byud1zJs3D3PmzJFul5SUICnJ8h+UozjiELV2LSBLxIQEyI6asJa/jxJj+rbAUL2ZeFPbRMLXR4G6euvOptau3WKt/m4Y8m1pDd/cwpPWMtfdo5+DIdZ0Q2VaphY90BtxYQHYfKwAgPGuQ1sMSokxG7yEBvghNlSFghJNa+pHD/XFQ5/uclgZ7KVQKLDgvp4Wb79meprJ69fLIztbPd/TF1NSUV1fj4c/22PV8xzJ1GzRxoJyYwmniRGBuKldFP46fcXgsa8eScP5q+UADKcdsLW7NtDfB81UPiivrte5/3/jepkdDaTP2nmqnMe+K1C8A2eOdxWrgpenn34akyZNMrlNmzaNfbcXL17EoEGD0L9/f3z44YdWFy41VdO/ePr0aaPBi0qlgkrl/hE41ly6HZ1Qam6hRUdQKBR4yMhKuf+7vxfOXim36vWGdbVu6njSkGsMsraFKFjli3nDU2Rb4/RnBf3nXdaNkHGEheN6SzXjiGb+2DBzAF79/qhTu0idxdzwd1uWENC0Mrj3omkqYNYfUePno0CticqNj1KB54en4P4PMwwCikB/H3SKD8X6GTc5dS0pj+GGj/j237ujlRWjK3slh5udSsIVrApeoqOjER1tWaJRbm4uBg0ahD59+mDZsmVQmlgQypgDBw4AAOLjm9aFLrl5EM5ZebGXc0uHaJTX1GGgmyeWS2oeZDQxTN+SCX3gez2chJzM3j1oacuUKwJjfXI1ajG/gEdOo7lDO+JqebX5Da2w6IHeuFhcaddr6M8W/cnEfqiorTeydSMxOTQlLgS3dozRGYqrHbi8MrIzDl0otquM2gQnZpwM7hSDrScuWbTdoQtF6JVkW1d3l4RQdE0MNWgZt4S13devjXJ9hUaOU3JecnNzceutt6Jly5b473//i8uXGxOW4uLipG1uv/12fPHFF7jhhhtw5swZrFy5EnfeeSciIyNx6NAhPPXUU7j55pvRvbvhQnre7I27u6KguMru11EqFTatUeFO1k6D706uSKLrGBeCzPxSi7ePaOjbd2cy8ssjO+PclXIsz8iyaPvIhuRFS6ckBzTzBP2mddJ/7Na26JUcYXKixevNzTZOJWBKcmSQwxfgi2jmD2suyT5KBUaYmOG6b6vmdk/FIDeKxhmrJHdvEW5RjlJ4kL9dQUGAnw/m39O0rpPmOCV42bx5M06fPo3Tp0+jRQvdBCjxAKmtrUVmZiYqKioAAP7+/vj111/x7rvvory8HElJSbj33nvx4osvOqOIbhUa4OdBfaVkjCtG47w2qguKKmot3v6G1s3xr7u7OTQXxVr9WjXXdHcIwLf7Lpjd/u99WqB9bLDOPBPmzB7cHrNub5wQKyTAzyB5nMgbeNpIoqbCKcHLpEmTzObGtGrVSifSTUpKwrZt25xRHCKbuOKkE+Tva3YNIm0KhQLdWpiepdNREswk8Y3tl4Sx/cwnx/v6KNGnpXU1Zc0M21Y9hZoIV3/v7aKDkVNY6ZDp7l+9q7PHjY5rqlw2z8v1whETtJFniAjyw9Uy80Ofm6I109PcvnYJXV9cebiFBfqhrLoOG2YOQGVNPdpEB6OlA7rL5IJ0T5xPqSlg8OJgPOE3HW//vTuyrla4uxhu4cxFIslzNFNZ9j2/PLKz1QtLWsuVF/k37u6KkwWaXLNAfx+MdvMKyWQ9Bi9ERsSEBCAmxPvmPyCy1Et/64zDueZH7tgypNuTRQWr7F54kdzL9eMgicihxDkXLF7LhahBVLDKotl0yXad4vm7dAa2vDiIf8O6I65aR4VI1DKymUNmUSayV48k1ySTe5N/3tUVxZWWjygkyzB4cZAAPx98MrEvmyKJ6Lq0bHI/BJta58cMMV3QE8+hb4zuCl8f2/IZA/19bF7KgIxj8OJAMaHMjyCi65O9QYe4xtPjt1q+gryr9PCA6fBJF3NeiIjI7WIbKn9spSBLsOWFiIjc7qW/dcZ5B6z5RtcHtrwQEZHbhQX6sXuGLMbghYiIiLwKgxciIiLyKgxeiIiIyKswYZfIgzx5e3v4Krk+FhGRKQxeiDzIHZ1j3V0EIiKPx24jIiIi8ioMXoiIiMirMHghIiIir8LghYiIiLwKgxciIiLyKk1utJEgCACAkpISN5eEiIiILCVet8XruClNLngpLS0FACQlJbm5JERERGSt0tJShIWFmdxGIVgS4ngRtVqNixcvIiQkBAqF+yf7KikpQVJSEnJychAaGuru4lw3uN/dg/vdPbjfXY/73PEEQUBpaSkSEhKgVJrOamlyLS9KpRItWrRwdzEMhIaG8gB3A+539+B+dw/ud9fjPncscy0uIibsEhERkVdh8EJERERehcGLk6lUKrzyyitQqVTuLsp1hfvdPbjf3YP73fW4z92rySXsEhERUdPGlhciIiLyKgxeiIiIyKsweCEiIiKvwuCFiIiIvAqDFxvk5ubiwQcfRGRkJAIDA9GtWzfs2bNHelwQBLz88suIj49HYGAgBg8ejFOnTum8RmFhIcaPH4/Q0FCEh4fj4YcfRllZmas/ildp1aoVFAqFwd+MGTMAAFVVVZgxYwYiIyMRHByMe++9FwUFBTqvkZ2djREjRiAoKAgxMTGYO3cu6urq3PFxvEJ9fT1eeukltG7dGoGBgWjbti1ef/11nbVHeLw7R2lpKWbPno2WLVsiMDAQ/fv3x+7du6XHud/t98cff2DkyJFISEiAQqHAunXrdB531D4+dOgQBg4ciICAACQlJeHtt9929kdr+gSySmFhodCyZUth0qRJws6dO4WzZ88KmzZtEk6fPi1t89ZbbwlhYWHCunXrhIMHDwp33XWX0Lp1a6GyslLaZtiwYUKPHj2EHTt2CH/++afQrl07Ydy4ce74SF7j0qVLQl5envS3efNmAYCwdetWQRAEYfr06UJSUpKwZcsWYc+ePcKNN94o9O/fX3p+XV2d0LVrV2Hw4MHC/v37hZ9++kmIiooS5s2b56ZP5PnefPNNITIyUvjhhx+Ec+fOCWvWrBGCg4OF9957T9qGx7tzjB07VujcubOwbds24dSpU8Irr7wihIaGChcuXBAEgfvdEX766SfhhRdeENauXSsAEL777judxx2xj4uLi4XY2Fhh/PjxwpEjR4RVq1YJgYGBwtKlS131MZskBi9Weu6554QBAwYYfVytVgtxcXHCf/7zH+m+oqIiQaVSCatWrRIEQRCOHTsmABB2794tbfPzzz8LCoVCyM3NdV7hm5hZs2YJbdu2FdRqtVBUVCT4+fkJa9askR4/fvy4AEDIyMgQBEFzolIqlUJ+fr60zeLFi4XQ0FChurra5eX3BiNGjBCmTJmic98999wjjB8/XhAEHu/OUlFRIfj4+Ag//PCDzv29e/cWXnjhBe53J9APXhy1jz/44AMhIiJC5xzz3HPPCR07dnTyJ2ra2G1kpe+//x59+/bFmDFjEBMTg169euGjjz6SHj937hzy8/MxePBg6b6wsDCkpqYiIyMDAJCRkYHw8HD07dtX2mbw4MFQKpXYuXOn6z6MF6upqcGKFSswZcoUKBQK7N27F7W1tTr7PSUlBcnJyTr7vVu3boiNjZW2GTp0KEpKSnD06FGXfwZv0L9/f2zZsgUnT54EABw8eBDp6ekYPnw4AB7vzlJXV4f6+noEBATo3B8YGIj09HTudxdw1D7OyMjAzTffDH9/f2mboUOHIjMzE9euXXPRp2l6GLxY6ezZs1i8eDHat2+PTZs24bHHHsOTTz6Jzz//HACQn58PADoXSPG2+Fh+fj5iYmJ0Hvf19UXz5s2lbci0devWoaioCJMmTQKg2af+/v4IDw/X2U5/v8t9L+JjZOj555/H/fffj5SUFPj5+aFXr16YPXs2xo8fD4DHu7OEhIQgLS0Nr7/+Oi5evIj6+nqsWLECGRkZyMvL4353AUftY553nKPJrSrtbGq1Gn379sW//vUvAECvXr1w5MgRLFmyBBMnTnRz6a4fn3zyCYYPH46EhAR3F6VJ+/rrr/Hll19i5cqV6NKlCw4cOIDZs2cjISGBx7uTLV++HFOmTEFiYiJ8fHzQu3dvjBs3Dnv37nV30Yjcji0vVoqPj0fnzp117uvUqROys7MBAHFxcQBgMMqloKBAeiwuLg6XLl3Sebyurg6FhYXSNmRcVlYWfv31V0ydOlW6Ly4uDjU1NSgqKtLZVn+/y30v4mNkaO7cuVLrS7du3TBhwgQ89dRTmD9/PgAe787Utm1bbNu2DWVlZcjJycGuXbtQW1uLNm3acL+7gKP2Mc87zsHgxUo33XQTMjMzde47efIkWrZsCQBo3bo14uLisGXLFunxkpIS7Ny5E2lpaQCAtLQ0FBUV6dSgfvvtN6jVaqSmprrgU3i3ZcuWISYmBiNGjJDu69OnD/z8/HT2e2ZmJrKzs3X2++HDh3VONps3b0ZoaKhBQEoaFRUVUCp1TxM+Pj5Qq9UAeLy7QrNmzRAfH49r165h06ZNGDVqFPe7CzhqH6elpeGPP/5AbW2ttM3mzZvRsWNHREREuOjTNEHuzhj2Nrt27RJ8fX2FN998Uzh16pTw5ZdfCkFBQcKKFSukbd566y0hPDxcWL9+vXDo0CFh1KhRssPrevXqJezcuVNIT08X2rdvzyGMFqivrxeSk5OF5557zuCx6dOnC8nJycJvv/0m7NmzR0hLSxPS0tKkx8Wh0kOGDBEOHDggbNy4UYiOjuZQaRMmTpwoJCYmSkOl165dK0RFRQnPPvustA2Pd+fYuHGj8PPPPwtnz54VfvnlF6FHjx5CamqqUFNTIwgC97sjlJaWCvv37xf2798vABAWLFgg7N+/X8jKyhIEwTH7uKioSIiNjRUmTJggHDlyRFi9erUQFBTEodJ2YvBigw0bNghdu3YVVCqVkJKSInz44Yc6j6vVauGll14SYmNjBZVKJdx+++1CZmamzjZXr14Vxo0bJwQHBwuhoaHC5MmThdLSUld+DK+0adMmAYDB/hQEQaisrBQef/xxISIiQggKChLuvvtuIS8vT2eb8+fPC8OHDxcCAwOFqKgo4emnnxZqa2tdVXyvU1JSIsyaNUtITk4WAgIChDZt2ggvvPCCzrBPHu/O8dVXXwlt2rQR/P39hbi4OGHGjBlCUVGR9Dj3u/22bt0qADD4mzhxoiAIjtvHBw8eFAYMGCCoVCohMTFReOutt1z1EZsshSBoTZVJRERE5OGY80JERERehcELEREReRUGL0RERORVGLwQERGRV2HwQkRERF6FwQsRERF5FQYvRERE5FUYvBAREZFXYfBCREREXoXBCxEREXkVX3cXwNHUajUuXryIkJAQKBQKdxeHiIiILCAIAkpLS5GQkGCwmr2+Jhe8XLx4EUlJSe4uBhEREdkgJycHLVq0MLlNkwteQkJCAGg+fGhoqJtLQ0RERJYoKSlBUlKSdB03pckFL2JXUWhoKIMXIiIiL2NJygcTdomIiMirMHghIiIir8LghYiIiLwKgxciIiLyKgxeiIjI6Spr6vHiusMoqqhxd1GoCWDwQkRETnfoQhEO5hTjl2MF7i4KNQEMXoiIyOl8lJrhr2q14OaSUFPA4IWIiJxO2RC81AsMXsh+DF6IiMjpfBRseSHHYfBCREROpxSDF8Yu5AAMXoiIyOk+234eAKDW6jY6dKEIJwtK3VQi8mZNbm0jIiLyPGKQop3y8sJ3RwAAG2YOcEeRyIux5YWIiFxGzYRdcgAGL0RERORVGLwQEZHLsOGFHIHBCxERuUxNvdrdRaAmgMELERG5zK5zhe4uAjUBDF6IiMhlCsu5MCPZj8ELEREReRUGL0RE5DIJ4QHuLgI1AQxeiIjIZeLDAt1dBGoCGLwQERGRV2HwQkRERF6FwQsRERF5FQYvRETkMnuzrrm7CNQEMHghIiKXSW4e5O4iUBPA4IWIiFzmxjbN3V0EagIYvBARkdPFhqoAAD5KXnbIfjyKiIjI6VpEsLuIHIfBCxEROZ0gCJp/Ibi5JNQUMHghIiKnE0MWgbELOYBLg5c//vgDI0eOREJCAhQKBdatW6fzuCAIePnllxEfH4/AwEAMHjwYp06dcmURiYjIiRi7kCO4NHgpLy9Hjx49sGjRItnH3377bfzvf//DkiVLsHPnTjRr1gxDhw5FVVWVK4tJREQOJrDphRzI15VvNnz4cAwfPlz2MUEQ8O677+LFF1/EqFGjAABffPEFYmNjsW7dOtx///2uLCoRERF5KI/JeTl37hzy8/MxePBg6b6wsDCkpqYiIyPD6POqq6tRUlKi80dERJ5FTNRluws5gscEL/n5+QCA2NhYnftjY2Olx+TMnz8fYWFh0l9SUpJTy0lERLZjrxE5gscEL7aaN28eiouLpb+cnBx3F4mIiIz4Zu8FjFyY7u5ikJfzmOAlLi4OAFBQUKBzf0FBgfSYHJVKhdDQUJ0/IiLyLGxxIUfymOCldevWiIuLw5YtW6T7SkpKsHPnTqSlpbmxZERERORJXDraqKysDKdPn5Zunzt3DgcOHEDz5s2RnJyM2bNn44033kD79u3RunVrvPTSS0hISMDo0aNdWUwiInIwNryQI7k0eNmzZw8GDRok3Z4zZw4AYOLEifjss8/w7LPPory8HI888giKioowYMAAbNy4EQEBAa4sJhEREXkwlwYvt956q7S+hRyFQoHXXnsNr732mgtLRUREzqZ/6s/ML3VPQahJ8JicFyIiasp0o5fTl8rcVA5qChi8EBGRy3F1abIHgxciIiLyKgxeiIjI5apr1e4uAnkxBi9EROR0+gm71XUMXsh2DF6IiMjp9IOXek65S3Zg8EJERC5natoMInMYvBARkdPpjy6qVzN4IdsxeCEiIpdj7EL2YPBCREROp99LxG4jsgeDFyIicrnLZdXuLgJ5MQYvRETkcttPX3V3EciLMXghIiKn0+8kahkZ5JZyUNPA4IWIiFyOKS9kDwYvRETkdPrBiprRC9mBwQsRETmd/jwvDF7IHgxeiIjI5Ri7kD0YvBARkfOx24gciMELERG5XEEJ53kh2zF4ISIiIq/C4IWIiFxuUEqMu4tAXozBCxEROZ1+hktMiMot5aCmgcELERE5nf5CjFyYkezB4IWIiFyusLzW3UUgL8bghYiInE6/neXX4wVuKQc1DQxeiIiIyKsweCEiIqdjigs5EoMXIiIi8ioeF7y8+uqrUCgUOn8pKSnuLhYRERF5CF93F0BOly5d8Ouvv0q3fX09sphERGQh9hqRI3lkVODr64u4uDh3F4OIiFxAEAQoFAp3F4O8iMd1GwHAqVOnkJCQgDZt2mD8+PHIzs42um11dTVKSkp0/oiIyLOYmpSOybxkLY8LXlJTU/HZZ59h48aNWLx4Mc6dO4eBAweitLRUdvv58+cjLCxM+ktKSnJxiYmIyBzGJ+RICsHD52guKipCy5YtsWDBAjz88MMGj1dXV6O6unFp9ZKSEiQlJaG4uBihoaGuLCoRERkxY+U+ZF+tkH1s/YyboFSy2+h6V1JSgrCwMIuu3x6Z86ItPDwcHTp0wOnTp2UfV6lUUKm4wBcRkUczUU326Bo0eSSP6zbSV1ZWhjNnziA+Pt7dRSEiIiIP4HHByzPPPINt27bh/Pnz2L59O+6++274+Phg3Lhx7i4aEXmgP05eRnl1nbuLQXbw8OwF8kAeF7xcuHAB48aNQ8eOHTF27FhERkZix44diI6OdnfRiMjDVNbU4z+bMrFoq3y3MnkOgZ1D5EAel/OyevVqdxeBiLyEuqHGXsaWF6/GsIas5XEtL0RE1PSY6hlirxFZi8ELEREReRUGL0Tk0QrLazBp2S5cK69xd1HIDmxdIUdi8EJEHm3XuUJcLavBnqxrZrfNKaxAXb3aBaUia5lK2GUyL1mLwQsRAdBc+I3NgOoNaurUePzLffg8I8vdRbluFJbXoLSq1t3FoOsQgxciAgA8/uU+zFi5z93FkKGplZ++VIbSqlrU1atxubRaZ4v92UWoV2u2W7c/1+UlvF5N/HQXHvhop8H9o95Px8iF6RZ/F+7uUtp59ipb7LwMgxeiJuxKWbX5jbzET4fz8NRXB3D3B9sx5bPd7i4OmdAQR+KT9HPuLYgFzl0pxxs/HsfafQx6vQmDF6ImKjO/FJOX7ca+bPO5Ip6tccG+ghLjwRjzJjybu1tXjKmqrQcAlLD7y6sweCFqovKKKwEAudcq3VwSe1l21dO/OL68/giO5BY7oTykr6Ckyq7nOyKwUas9NDoip2DwQh4v+2qFR5+YyqvrsOV4gbuLYZRCYX4bb7Tj7FWd29pHyOXSauzPLsKHf5x1baGuU1M/32N2G2f+gq+WVWPUor+wU++Y8CZXyqoZbFuBwQt5tNKqWsxYuQ+rdmdb9bx1+3Mx8dNdTiqVrqV/nMW7v55CcYXxZudLJVUun8Lec8M9a8lHX2/+eFzntvbifmJOjKnATa0WcDCnyO7SXS8O5BRh/YHGvJCjF+UvtKcKSmXvd0a30Z+nLmN/9jX8dDgPAHDogqZMG4/koajCsnmB9JO/3eWZNQcxb+1hdxfDazB4cYOaOjVe/f6o2380m48VYM2eHJe81w+HLuKdzSetfl51nWYEQJaVQ3iX/XUOhS6a1Exc0dhUzsXDn+/B7NX7XVIeSUNxFEYu/t7Dsqve6UtlFm13rbwGIxemY+Fvp/HiuiM4kV9iT+GuGy+tO4KP/2xMwH3+W/kL7ZyvD1r92rbkK10sqsTbGzPx8vqj+HrPBel1aurUWLT1DKav2IuRC9ORX2y8S6u8ug7/2ZRp9Xs72uXSalwt05yvSqtq8ffF27H99BXZbStq6rD+QK5LV+I+d6UcIxeme9REkQxe3ODM5TLszbqmU4uxxLkr5dJwUEf435ZT+EJmToyRC9Ox7C/7RwmcyC/B+SvlOHu5DEu3ncVvJy5Z/RriZdfYD7W2Xo3XfziGS3p97uJuunDNOfOWzPhyH2Z8ad2wYlPJppaqqq23OiirU3v3ENDcIuMXH/GEDwD//cWyi9DZK5og59eGrr7yJrqoY1FFjUsvcOY5pixqtYCy6jrU1Mkf1//6SdMiV16tScSd9oXxLi0xWdfd9mYVSv9/88fjqK5TY/7PJ1ArM3x7xY4sfPznOVxwYS6b2EUr/nY8AYMXK10urcbhC7rNpev25+LjP53bt15aVYsnV+3Hyp2aYOOHQxftavJOPyUf1Ys2HLwIQRCw/kAuKmpsO7nPXXMIM1ftx1d2tO4oGtr9d5wtlD1Znb9Sjl3nCvGtkWGOj61wzrwl2YUVyC503oRul0ur8eXOLIOLz5Or9lvdHaZdW7ZWTZ3a6EXCVUwFFz8dyZP+X1Jp/jjdfvoKXv3+mMH9mfmlOH1JvrvDFq9+fxQrdtg2WV5pVa3Rrhc5RRU1BkF6VW09JnyyyynDfx1RgeqZFK5z25oY66M/z2LchztkHxMEYK8FMzGL9Lf96I+zmP/TcZ05X34+nIc/T112aqCj1OrfzNeqiC35/YzBtrX1mp1Vp/c9HL5QjLOXnRNceFQM3IDBi5Vmf7Uf//hOt7n0k/RzWH/golPfV+w+EaPtpdvO4sV1RyzqehIEATvPXpX+La2qxb83njD7vJzCSnz85znZ1hlA0xKU48QLuL6/ZJpRxSbqnw7n4YCJYO5AThFGLkx3+Lwn/954ArvOFercd6WsGpdLq1FTp5Y94dXVq832xy/87RRW78pBpdbzS6pqkWeiCdyUp21oygc0uSNjlmZIt0uram0OZp3hx0N5Jh8/e7kclTWN+/CQbEKkAs+sOYinvrJtH8nZm3UNX+3OsemC99K6I1Z1vTzyxV6DIL26VnO+OJbn+C4xcRSbPV69q4vObWuujbvPXzP6nItF8mUbuTAd1XWG38XC305L/19/4CK+P3gR289cxd0fbEdtvRp19Wp88PsZvL0xE89+c8iKUgIf/3kWjy43n8gM6AYvJZWNuXMn8o0HsdoVm8qaevzju8OYtfqAVWW0lNit9+r3x/DHyctOeQ9rMXixkqna3RcZ5502VbaxyFd/sq5jF0sMyrAv+xre+PE4/jh1BW/8eBz/taCPV6FQQN3wpsZq3k+u2o/HLeg6MZVzkX21An+dvmK0hq/9THP94i+tOyJ7/5JtZ5BxRtPsqd//XVZdh5EL040mH5qj34L11+krmLxsN6Z8thuzVu/HmCUZBs95f+tpTPjEdOuJ+H1rf+9yQ56PXSzBmCXbZfed9v46aaQmn19cZTIALa6slUZ6zfn6AB74aCfGf9w4o+pnf53TGfWjVgsO/w3YW+sbuzQDWVfL8eepy7LBzqvfH5V9Xm5RpWxO2IGcIp3J14oqaoy2gn6gV3NesPkk5nx1wGR5tVv0DuQUmW3pEAPckQvTpSHL2t/9j4fyMHJhusnXsMbxPNtaqLS/Rx+l7XlY4meUO273ZRcZfd7fF2t+i3uzCi1K5r3ng+24+4Pt0u1zV8qtKuf6Axdx0USXp7Z0rYqZ2LJizMYj+QB0g7exSw3PM45UpDUYwRNyhAAGL3a7VNp4cK7ZcwGrdhkfFaN/gdnf0Bqg/RrGCI3ZlyY99+0hvPGD7iiMsoa+XzGiv2ZiVIyczccKLCqjLWas3Ie3fj6BCZ/sxPiPdZuCr5RV44dD1rVoyU3x/eOhPGw+lq+zzfKM8zhzuQzHLmpqpn+cvAK1WsDSbWcsHqWg78K1Srz18wmd23JMtRCJxIpYaVVjsKxf8yupqsVz3x5CVa3aou9H/wKmVguY9sUeiwJQADhVoGmSrtM6uX67L1dn1M83+y7ggY92yvbVu9MTK/fj7Y3mT7riPhIEAdOX75VtdXxp3RGdae8nfLILLxoJnPVzsbaeuIRTFiYW5xRW4KV1R7D499NS69GTq/Zj4ZZTRp8jF4Rrd605wo9W/iaNCQnwlf5vSW5OVW09crVaVs7Y2EXy6vfH8PJ6+YDVXUx1de3NKpQ+t5jPA1i2zxxRrrd+PiEFTJ6EwYsd6tUCHv5Mt1lQPJ5q6tT4+M+zUlPlgZwi3Lt4O0YuTJdq0OIieMay4Y/nlWD76SvIulouhdnbTxvOY3CppEqnafxiQ7NuUUUN1GpBinfURg72c1fKMX35Xp3X0Pf59vNGH1OrBfyeeQlzvj4g/7gFP7KKmnpU1epe8N7eeEIaRWCpVbtzZPOPtGszu84V4us9FzB79QG8/oMm/0GhAM5fLccPh/LM5ioYqzkvd8KCgE+vOYDsqxUGgcfZy2WYr3UiU2g3O1fVoqq2HsbydI9eLEZxRS0+zzhvcTksnWfn0IUiAI7JixAddvHcF3+cvIyLNnbPAdDpnjh60fZum4qG3+OmowV48yfNcXruSjl+OWZ8TiFn5WZrnxsUVk4cJE4hoH9EWDv/0PyfjmP68r3Sbf3cQ2u4aiSivbILK/Dq98cwffleVNXWSy3IAIx2Ie85X2hwX2VNPUYuTNepXInW7c/F9OV7oVYLBhXsV78/Kttd7wl8zW9Cxpg6Qc9YuQ/5xVUI8vfFA6nJOjX/dL2D4WBOEVpEBOH81XJ0TQiDv68S566UW9zH+vDnexAe5IdF43sD0AQLNXVqTPhkFybc2BIJ4YEAjDe/P7lKM4R3w8GLuK1TjOw2f5y8grlDNf8vKKnCL0cbP8+oRX9J/19/IBejeibqXOC1f3A1dWr4+xqPmUcuTMdLf+uMDrHBBs3TllQ0vt5tf3LwpqMFeOK29rLbVNbUG605W5pfII6QqalTY8m2M4gKVuGB1GSdbcSTa0llnexiibNWH0B0iEr29cd/tBOJ4YHoGBdi8JgYBLWKaobzRprBiytr4aNUIFjVeHrQ/o41n6EakcGN77/5WAFuT5E/duxl7+yt1vrPpkz8vU8L6faVsmoEq3wR4Odj0fPn/2R4gfhu/wWd43fB5pPoEBuMv3VP0NmuoKRKCrRXa81tdDJf95j76/QV+PkoEahXJgGa7+aZNZqcGYV4p50uauW5KGBdrf+Tv85hzh0dDO6vrbOuYPr5H5a2YGkTz9m2BteXSjXfT2LDOdVW+cVVCPT3QVign8XP0e+CfntjJga2jzbY7p8bjmHDzAE6951qSEb/6/QVLNl2Bj8eysNb93ZDl4QwqQv0/zZn4o+TVwyeK2friUsY5KTfu6UYvNho++kryDSSR1BeXSe1pqzalY3hXePwx8nGgEW/ifDrPRew4VAeKmvq0Ts5HJkFpToXDn1yY+2LKmqx4BfNPCollXVSs/3h3GKEB2l+IOJ9xvpul+/IwvKGVoeaOjVmrpKfl8TUbJof/3kOt3SINnpi+fV4Ae7sFm/0+YBmJJU4zFFbdqFmpl21IMDXx45GQ5ka36WSap3kyq/35KB/20j4KpXILapAn5bNsXTbGfxgJkFUzge/NyYFandJPbJ8jxTIhAf54cdDeXjv/p7w9VFaNK+N9sf4/sBFPHZrW+l2blGlThO7PmOBCwA82JDT0iMpzOg2k5btxicT+0q3/7flFHyVClTIfG+inw/n4YPfz2D9jJugtCPnwRW+2dvY4jd52W50TQzD/Hu6WfTcgw2tT6KX1x/Bfr1cjK0nLmHriUv4W/cEqNUC6tQC/H2VOr+tPeeNdyXI1aABIP3UZRRX1uJKw3F1raJWJ4dm5MJ0jO3bAhPSWln0WUTascqFa5UGSeqWvYZuwBCk8pHydSwJJRzRSzL1c02OYFl1HZZb0fIoevrrgyiqqLXoAi86e7kMvkolkiODpPumfbEHwSpfrHrkRqvLoG3lzmyLBm1odz+LeV/fH7iILgmNv3Hta5Q5CzafZPDireYbOXkoFIYJTQ9ZMLRVbJYVE87kLt6iv87IH2TaQZFYWy2qrJUy6o2NGnK01zYYDkUVLf79DA7kFOEfd3Yyuo3+iV60dl8u8oqrkHHmKj4Y39umPJx5aw9jUv9WBvfvPl+I3VrNrcszsrA8IwuBfpoT7IaZA2wKXADg58ONrVTaibrac5QsbkjsvFRajbjQAKvf46fDeTrBi7WOy7QaHcwx3Syvnzu1QG8Swq0nLuGXYwW4oXUE7u7VwqZ5fjyFOG273IgV0d0f/IVV0wwvRsaOZ0DTpTJ9xV6UVddhyoBW9hYT+7KL0L1FuHRbO1FbnL31u/25mJDWClfKqtE8yN/CQFJrZEttPd7Qm93YFGmuJgD39k7Eff00rYz/vrc7Vu7Mxm8nLrlsKO4Vrd+ctV3SgG7iqj5BELDhUB5uT4lBM63KpzgCSD/gccSM28ZyLDPzSxHk74Ok5pqAyVWTkboSc14crLy63qp5BmyxdJv5OWXEH4ypGra1Ri5Mt2jOD3PNudrdSNYSn/v4l/tk5+uwxGcm8nf0iTVDe8psjUeX7zXoojHmkl6N63heic3DWK0dBgoAS7cZzkEhulhUiQWbT+JIbjE+TT+v85gHThlhkZEL0zFHazh1cUWtTvdDXb2AJdvO6CQ0m/PgJzuli5j+ftJWWVtvdpSSKN9IN5sYgNXWC9h8rACTl+22etkNW+zRmoDNz1eJQH9NV1dsaABubBNp8etUesiEcgB08s1EBSXV+OiPs1adXwDnLCj5zJqDOon4NVYk0DtiglJXYMuLg3lz7dISrlovyNP8S+Zk5WlsCUDsYSpI1Z9vQrubQdN9oFvbv1RaheyrFejbqrkji+hw2l0wD36y0+DxLced9/u3NMdj01HzI0P+1zBiSRxtV1VbD5Wv0mgyrj0tI2VVFrQweFlEu/3MVSzaehr39E5EaVUdsq5WSHkl1VYGWfoLjDrSL0fzcUfnWNnvb3tDhUypaJyRHNC0cLeICMIdnWOdVi5HYPBiBWfNXuhNHLW4oFot4CMnz0pMnmPJtjOIbOYPwPA6VVheI43asyaXgORZE2ioBQGVNfUYuzQDj93aVicfTVzeY1hX0zlqogW/ZGKwzAVP+8KoP+eTpSOOsq1c28wVNh7Jlx1CXFpdJ9ulXVxRi7Ag3QTdK2XVTq3wLvztNFbszDa6JpEmh9Dw/v9tOcXgpSlx1uyF16NDucU255CQd9O/uBqbFZWcr6iiFuUNMyYfyCnSCV7mrtG05FkavGzNvIytmcZnXzUVVJmbgFJuxJ2n2nP+msEUGoCmpa5dTLDOKMBX1h916jIjgPwAD5H+yFdriCNL3YU5L+QWxmbDpabvi4zz0siTb/decNrimWTehWuV0rB8U8OHf3bAJGVyr+7ZY84c7/SlMp1Znp0duJhjaqkPc/mN9qyZ5ghseSEip7tcWi0N6Vx/QDMUXlzVWdvOs1eRakUSJ9lvbkOulKnhz5tNTIxnDWsnpiPnMjXh4L2Ltxt9zBN4bMvLokWL0KpVKwQEBCA1NRW7dl2fiaJETZFc4AJAZwhuRU0drjp4IU0ypD3aRW7IvKOYmtjOE1ctvh6cvey40aiu5pHBy1dffYU5c+bglVdewb59+9CjRw8MHToUly417ZE8RKRRXVeP+5buwKRlu81vTA7z7DeHUFpV69BZjbUn3NSv54s1f8Yu7pF1lcGLQy1YsADTpk3D5MmT0blzZyxZsgRBQUH49NNP3V00InIBU2tp9WkZ4bqCXIce/3KfyVm0rdU2ppnRx8ReC1csMkiG7Fl7y92/Q48LXmpqarB3714MHjxYuk+pVGLw4MHIyHDust9E5Bm0Z+/VnwG2W6LxZQvIfqZmkbWF9kzN+ikWTIHxXioTa9S5gscFL1euXEF9fT1iY3XHmMfGxiI/3zDjvbq6GiUlJTp/ROTdtC9qvlaug7RyWqpjC3OdO5hT5LDX0p/nRcR2F+9T54SZga3hccGLtebPn4+wsDDpLykpyd1FIiI77D5fqDPrqCVLUmgLCbB8pV4y70UbpzXQX9hTrmeIo4+8l4+bF1f1uOAlKioKPj4+KCjQHY1QUFCAuLg4g+3nzZuH4uJi6S8np+ktQEV0PXltwzHUmlgfSKEAxqdqFvcTT6BfPWrf6rzkXkx5IWt5XPDi7++PPn36YMuWLdJ9arUaW7ZsQVpamsH2KpUKoaGhOn9E1HT1a9VcWtxvzh0dsGHmAAT5c8oqT/P3Po2t4IIgGJlFl00vZBuPC14AYM6cOfjoo4/w+eef4/jx43jsscdQXl6OyZMnu7toRORGG2YOQFLzIHcXgxrEhqqMPtYzKVz6/96sa5BZj1NibnkAU967vyeevL09AOCe3u6brv564+4RYh5ZXbnvvvtw+fJlvPzyy8jPz0fPnj2xceNGgyReIiI5gzpGm1xnhxzj44n9cDCnyGxeTFWtJm/JcJ6Xhv9oXQeLKmoQGuBnMMrMmDbRwWgTHSwtJLh2X65FzyPrTOrfCp9pTWHg7q4+j2x5AYAnnngCWVlZqK6uxs6dO5GayhEERKQh5roYG4mk3WVBztW9hfmh60WVNSitqjMYhq0fu9SrBUz4ZBdW7sp2bCGbkEA/H3cXwSN4bPBCRKTt3ft7Sv8f2iUOE/u3wo1G1kESa/Rto41PkEbWSwwPNLjP1Po4oj3nrwEAdp67qnO//nPFxSGPXiyGrZp619GQLu7pgQjy1w2a3J1jzeCFiLxCSEBjL7efjxJ/79PCaNdCi4hAjO2XhH+O6or1M27Cnd3iXVXMJu2htJY2PW9v1rWG/5kOdBpzX2xP5J18U2tsmDkAN7WLsup5oYHGsyjEnBpPMLF/K7e8b9uYYJ3b7DYispM48sTeeQdeHtkZ793fE+NuSHbpyWpge+tOstZYMqGPxdvOuaOD08rhCDEhARZvq1AoMOHGlggL1OROPHZrW0SHqNAuJlhnrR2yjiWtLACM7mNjTxcvhNoXxL1ZhbJJobMHt8f8e7qZLcPzw1MwupflrTA+Ss3l8LPJ/bDogd4WP8+VvnksDX4+SmyYOcDl791eL3jx9eE8L02Sq+fvSYkLce0bAlj9iGfMrfH1o5oh9L2T7VtrQwFN8t8Dqcm4PSXG5LZP3t4ew7oazjtki2YmLqZyLQsLx/Wy6HVbRzVDYnggWkdZ1nXSW2+tEpWvEr2Sw5HcREb3fDqpH965rydWTE1F10TnTqlgSR6IN7J0UrmJ/eVbaAwSdhv+1R9tdCS3GK9+fww7zhYavMbtnSzvNhFf31RgPv2Wtvi/sT3Qp+H8ERmsQnKkZx3zd3SOxXeP94fKt7HrZvJNrVxaBv3A9eb20S59f30MXpxkxdRUTB3YWvYxW6PmGYPaGn0sOED+AthS70cYG2p57RUAIpr5G33M0WtbJIQH4MY2zXXu8/NRYMHYHjr3DZIJLJZN7ofnh6dIt80tGtY53vDipf3bNDfS4Y7OsWjXUBPRD2J6J4cbfd7coR2l/yc3D8LM29phyk3yx0n/dpFYP+Mm6fawrnFYOS0VCTJ5B6b8b1wvi465sEDdmWk/eLA3XhvVFff1szz59YbWzc1v5GY+SgX+cWcnxIdZ91uwhrvzAZxF+1dhqltGbMUweL7+2kZ6t/UbWtbtd8zIoegQlTSx4YQbW2LJhD5SUN8yMggdYkPwxG3t8KXW0hIvj+ws/T8y2Ph50FEm3KgJ+DrEGlZEwwL94Ouju0/v6d0CANxWuWDLSxOwZrrh5Hl+PkqM6pmIf93d2LzZLiZY+rE+O6yjwXPMGdY1HhtmDsA/R3UxeExuzZCPHupr0Nev8tN85f3bySc6ju3bQue2qbH85pqQb+kQbdHFbFTPBABAr+QIBKt0L6C+SiXax4agS0JjsDG6ZwIeu1UTyIk/3KhgFfx9lXjs1ra4/4YkvNJw4lEqgEdvaWPwngM7RGFIZ90anHatxhJ3dIrFnDs6YIJWHsDCcb3wz1FdpRORvps7NNZWFApgSJc4qdtLn7/eyWrGoHYICfCDv69us3E3I7X8pObGg5z+beW/fzmhgZZNt7/4wd546W+dzW/oJH5WnExDAvzw4UN9MbybJvBcMbXxotVM5djRHCN7eEa+jf5v2xbttS6sraMcd9E0dpo5lmd6rTr9rgyT79Hwb+toTYtkL71Kho9SgVCtpSX6tWo8dzUPcn7wMrjhfBQR5GdQubrNSEvwV4/eKAVlAJBm5ndtzW9Ezpt3d5X+f0Mr91ZUGLw4QIDM0DW/hguP9oVlwdgeUk16YPto2drwjEFt8frorjr36SdodU0wvFjpZ4IDQJxWzbJVVDMMaB8l/YLnDumIvq0isFQvJ8KaPmI57bROJoNSovHS3zrr1GbkPHhjS3wx5QZMG9jGoPlYzGPRDgKBxhqgfnnv7BaP8aktdQIrMbCbdnMb9G8biRdHdMLfuifgkVva6JzQtQMkSyiVCgxKiZHK0qdlBFo11OY6WtmN1yIiUKdVbOrA1njkZsOgS9vUga1NtsbNvE03b2fe8BSpRaq5XouaXAAk7jftycaMGdUzAS0iDC9mci1czrLwgd54cUQnq57z+K3tGmbobfz9DDbTLfGfMd1l79e+MFh7sVv+8A06t62tTeuXWe75aW3tz62KCGq8uMud90TGLpH6lSzxtvirL6yosao8XW1YYVzqqrKweUw/f8eeFgdTlVaxsVcA8O+/d5dahkxNzBjk7yt9oP5tI9HXTItz82bGJxXUPyfI6d4ivLG8XNvI+2gvOCaOuRdbGMIC/fD5lBtkk0cVCoVBa4XYRPjoLW2wdEIfDOsajx4twvDssI5YP+MmbJg5APf2TtTpPpBr8Ohh5AIj/kBH90zAc8NSoG64w9dHiVdGdjHogrB0Ubsvptwge792V5LYdBwa4IcNMwdg3p0pss8J8PNBRDN/+CgVUsuE2N0lnij0fyiW9L0P6xqHl0d2lr6vG1o1x7w7OyG1YXitytcHoxqCn6kDWxt8N/Yk0orfh6kZSLXPnYsf7IOPJ/aVbo/qmWj2uxjVMxHDuhqv1etfXPq3i9Kppd2i1QqkfVECgCGdYxEpczLTTmTWrvUaC9Zm3+G6xOfE8EDpu7WWn49S6p7slRyOV+/qgs+NHOMpcaEGFY8hnWNxV48E6faMQe3w3zE99J9q9JgKD/LHY7e2lS5g/ze2Byb2b4VXRnZGdIjxY0jM3dHvbl00vrf023l6SAd8PuUG1NZbt8ClOSNMjOCydBbkytp6AMC1ck3Q8vy3h+wvmBH6wYrYTWoqCFs5LRWfTuqn81u9r6/tcwjdJBNAdkkIxQfje0tLXIiT7U0Z0BrtYy1oWWooXMe4ELPdlWLLjPb1RPSe1lQEptzTOxGT3DTiSRvT7m3w+qiuuOv9vwAAnRtq63ENtean7mhvUQQrevvv3aEWBKmlBtAEOQPbR+vc1r6u+vko8cKITmgT1QwPf75H5/UMZkFsOJzF58vVNl4c0Qlv/Hgc/g2BR5voZjh7uVx6/O5eicgurNAa7qjJhamTORlqJ5/20KvNp7WJRNvoZjij9dr6eidHYMPMAVixIwtZVytwf79k2e3CAjX7ONRIrg+guYCIjOV8hAb4YdnkfrIX6tmDOyAkwA8/Hc4z+h6WmDGoLRZtPSPdnn9PN3z4x1k8PUQ+iVCuz9tSH4zvDbUgSDOamjLnjg64r18SHv9yn8FxMdOC0VZhQX6YOrA1Pv7znNFt4sOsy89xp/axITbnoykUugG2sa5A7YD0jdFd8eK6I0gI15w77uwWr9PN+/c+mlbBLgmX8XvDbMH/HdMDl0qr8PbGTDwztCNu6RCN2nq1zvlD1CUhFAdzipHaOhKB/j64WlZt02fT/Zyaz9gxLsQgB0ObsWBWv9JxMKcIADBv7WFsmDnAYBI7QL7rWmxV1l+52tT7iRMaiveN7pWIFhGBOq3F+sTvSyzDsK5x6NDw2d5/oBeeWLlf9nnv3d8TO84WYpUFk+21iW4mBXvax1/PpHD0TOpp9vkihcJ8a9Lk/q0wPjXZoDL49z4tEB6kqUCKc+0AQHiQn8F3MtlIjp6rMXixQv+2kaiuU0OhUOCZoR3xy9F8nSRRAAY5G4DmhGOsH91HqYCPDXMaiJNzzR3aEVHBKuQWVQIw3l8vNs8OSonGih26P6jUNpH4eGJfBDTkfLx3fy88uWo/zl3RBBlTBrRGaVUtHvhoJ4DGHBX9loqPJ/bFh3+cbXxPhX5riQIjuifgf1tOSfcZSyAe2iUOe84X4taOjUHcDa2bY9e5QrSMbIbWUc3w+uiuBgGSLaKC5Wu2Yg5NapvmyCmswPkrFfj1eIHstqYM6xqP8up6XLim+Y66Jobhf0ZGDC2Z0AfReuV59JY2aGZi4UHxhDX/nm4W13gFaC62+knXSyf0ka2hzxjUDou2npZ9X/3/N2XG8kbu7t0Cf52+AgDSSBXx+uCrlbzaNTFUCoZ7JIXj60fTzA7xn3lbeyl46RgXgg6xwVAPBQY2JMyKgYufj0JnNW7xGiT+DNvFBGPOkA5Y8MtJSz+u03VJDMX3By8CAEYuTJfdpqKm3uC+qGCV1YHmXT0TUKcW0CtJ07Xio1RY3FIn7uMgfx/0To7AmulpBjlpgKYl/q17u0lLFqS2aY7Zqw9Ij4vfRfuYYJy6VAYA6G9nd572Ty86pLESdnevRPx1+goulTYGrUqlAgFKw2uEmKO3bFI/VNTW40JhBfx8leidHIGRC9N1zsOegsGLFebd2diffkuHaJ1md7E7Ru48ZG3+gzXEbhYxeFEoFJh2cxuoG85c+heV+/ol4z6Z1gz9IGL6LW3x3LeHMHWgJu8iJEDTHTbx011SDoSPUoH593TDlbJq+PsqERsagKSIQOwyXhHH7SkxqK6rx51d41FYUWN0quvoEBXevV/3Aq+fDGpJLoYj9E6OkIZh2xK8AMC9fSxLlpSbwfRv3RNktmw07oYk/G9LtUX5JS0ighDo7yMlK0c080dcWADubug+MzaSSWwdiA8L0Fk3aHCnWJy5XC6bmP2UC7uMnKVrYiiqa9XShSZaZq4ZpVKhMyR9WsNvpl1MMCb1b4U7u8Xju4ZRMwPbR+PtjZnSc4210GgTW0TFJGuFQqFz7hGtffwmjFyYjpiGbiZBOicppOcN6hgjBS+zbm+P97QqEtYY1NH0VALG6Le8WHLMPvDRDpveS1+Anw8eSJVvyTUnqXkQZt3eHgM7REmvJdci1DkhFG2iG1tywvWS3bUrdF0TQ3Ek13RCsiXEYiigQJ+WzRHo54PK2nqM6dsC6Q0BtTliS0xEM39EQPc8tG7GTR659jeDFwcJauguMdWU6ky3dIjGxaJKDOoYI53sgMacHHGUkaU6Jxj26zdv5m9wn37C3IM3tsS3JhZGUyoV0sXYWItHU2LpSB17dG8RrpMvY0qgv480Lw6gqVF+9JD554rvERsagOTIICl4aabyNTqHxm0p3r+Q6vx7uuPbvRek4EUu10q8q1+r5vjfuF5SEKNQKCwOWs35+tE0nd+1KeJ24kVNv0L1jzs7ITE8EMmRQTYFL/ZMkKZ/vbdkYkm1h7TqDdYbnWjJhH2RwSqpW15b82b+SIwIdEzwopca8P74Xvj9xGWL8xfNsXfyT2dh8OIg9/VNQnxoAFq5aXIjf1+l7LTRt6XEQABwY2vbEhmt5eujbEhw85AzjoM9fmtbqZVLJDYp6+eqzBuegk4uHG3jbGLrnHgqkxvh1hTd2jFayiOTy43SZmxCwM7xodKwX3Oj7+RY0kIDaPKrejW0Eqr1Wl5E5obTausUH4LjeaUWb2+O2HUqksvVMcXY3FnuJua/6O9rAAZdU6/e1QUpcSHIulqBtfty0SLCvrwwcYoHsaIaExKAsXpzM3VNDNUZ+g1o8nc2Hsm3673dicGLg/j7Kg0ic0+gVCqk7HVXMTU6wtsNlxlhEeDng2WT+xkMj+1v5doq3iIkwA+zbm+P1DaGXUX2SAgPwMWiKoe+piNENuRXZOaXynYBv6E3tYGc+fd0k8L5UAfViOVojz6bfktbfLc/1+JZceW8/fce+HbvBZ1BAI5kbfDizC54e4gjlyzZ1+J0BXKt27bo1yoCs25vb3QuGEDTgqjP2xct5VBpIgeICla5fd4DVxrcOdZhzdIiMalcf/IwT6F/4byxTXP4+SgsmmtEqVS4vPm9TXQwnh7S0aLujQ/G9zZYB0tMPBZH9IgT+pljzfdn7T5xxWRx9jD1aczN+m3zeyoUGNw51urzz03totArORwrbWgJ9ARseSEih5pwY0v8cky3OTq5eRAeu7Utgvx9MEtr9IW26BDNqLmuiWEoqazF8G7xeP+307LbeoIXRrhvNmFHkxulNk4vsV9uFm85jl42RFuMlcubuEpYoB/G3ZBsdL2zZZP7mRwx6CyzB7fHj4fkp3oICfDDa6PMtxp6KgYvRORQY/sl6fS5v3t/T0SHqIx2l4zp2wJ3dovHyp2aIfw3to7E2L5JKKqowfsuKTHJESvyraOCMbhTrNk1roJVviirrnNByTyPQqEwOZLJXYMTurcI15kVtylhtxEROVXb6GCjgcu3j/XHhBtbIipYhZCGCQd9GmaGDVb5SkO0yX18lArMGmx68s1X7+qMdxtmaNVeqkB/+RFXs3YpAPIeDF6IyKW0p7L391VKORkPpCZjzh0dpDkmfH2UWDpBM4xbnAafHE8772TJhD54qGGhUWtyKPq0bI7Y0ABsmDlAZ3SNtSugm2JsSL47Bat8EWHFjOrkOOw2IiKXSokLxY6zhQb3q3x9MEhmxMQnk/o6dYTO9eyte7vpdGkkhgdKM9HqD621lf6SJbayJZdGDIydNXWD/oKa5DpseSEilxIXrbR0huSYkACTi+eR7bokhBnMrq3y9cG4G5IdNjpKe6K+aWZWSvc2vj5Kt01Mer1jywsRuVS7mGAseqC3tLgeXT8S7clhun5mIiALMHghIpdLdtNM1ORelsw5Y0yeDRMYim/HhN2mh+1dRETkEvYEEZfLqs1v5MD3I8/G4IWIiDxehR1zyNizRAJ5JgYvRETkNilOXK+I3UZNF4MXIiJyqidvbw8ACA0wTLO0tFXkelo7jMxjwi4RETnV4E4xaBERiPaxhq0s/k5cC0nEhpemx+NaXlq1agWFQqHz99Zbb7m7WEREZCOFQoFO8fKzJI9PbWnRa9jS9cO2mqbLI1teXnvtNUybNk26HRLivD5RIiJyH3estkzezyOPmpCQEMTFyS8tTkRE1x92/ZA2j+s2AoC33noLkZGR6NWrF/7zn/+grs74ELnq6mqUlJTo/BERkXdQ+TVehnonhxtfloBDhkiLx7W8PPnkk+jduzeaN2+O7du3Y968ecjLy8OCBQtkt58/fz7++c9/uriURETkCLGhAZg6sDUy80sxd2hHfH/wIj7+85zBdjGhXE6CGrkkeHn++efx73//2+Q2x48fR0pKCubMmSPd1717d/j7++PRRx/F/PnzoVKpDJ43b948neeUlJQgKSnJcYUnIiKnGtUzUfp/18Qw2W2UnGmOtLgkeHn66acxadIkk9u0aSO/2mhqairq6upw/vx5dOzY0eBxlUolG9QQEZH3UavZPUTmuSR4iY6ORnR0tE3PPXDgAJRKJWJiYhxcKiIi8jTaq40nRwYh+2oFAECwI2VXYL5Mk+NROS8ZGRnYuXMnBg0ahJCQEGRkZOCpp57Cgw8+iIiICHcXj4iInCwkwA8AEBXsj0UP9MaBnCK8tO4IbGqQYVdTk+VRwYtKpcLq1avx6quvorq6Gq1bt8ZTTz2lk9NCRERN24ju8bgtRa+13YbWk+hgfwBAsMqjLnXkAB71jfbu3Rs7duxwdzGIiMiNpt/SVvp/WKCmJcaW0UZDOsehRUSQ7LIE5N08KnghIiLS1jqqGRaM7YF2McFWP1epVBgdvUTejcELERF5NLackD6PnGGXiIiIyBgGL0RERORVGLwQERGRV2HwQkRERF6lySXsijMpcnVpIiIi7yFety2ZEbnJBS+lpaUAwMUZiYiIvFBpaSnCwkwPcVcITWzRB7VajYsXLyIkJAQKD5gaWlzlOicnB6Ghoe4uznWD+909uN/dg/vd9bjPHU8QBJSWliIhIQFKpemslibX8qJUKtGiRQt3F8NAaGgoD3A34H53D+539+B+dz3uc8cy1+IiYsIuEREReRUGL0RERORVGLw4mUqlwiuvvAKVSuXuolxXuN/dg/vdPbjfXY/73L2aXMIuERERNW1seSEiIiKvwuCFiIiIvAqDFyIiIvIqDF6IiIjIqzB4sUFubi4efPBBREZGIjAwEN26dcOePXukxwVBwMsvv4z4+HgEBgZi8ODBOHXqlM5rFBYWYvz48QgNDUV4eDgefvhhlJWVufqjeJVWrVpBoVAY/M2YMQMAUFVVhRkzZiAyMhLBwcG49957UVBQoPMa2dnZGDFiBIKCghATE4O5c+eirq7OHR/HK9TX1+Oll15C69atERgYiLZt2+L111/XWXuEx7tzlJaWYvbs2WjZsiUCAwPRv39/7N69W3qc+91+f/zxB0aOHImEhAQoFAqsW7dO53FH7eNDhw5h4MCBCAgIQFJSEt5++21nf7SmTyCrFBYWCi1bthQmTZok7Ny5Uzh79qywadMm4fTp09I2b731lhAWFiasW7dOOHjwoHDXXXcJrVu3FiorK6Vthg0bJvTo0UPYsWOH8Oeffwrt2rUTxo0b546P5DUuXbok5OXlSX+bN28WAAhbt24VBEEQpk+fLiQlJQlbtmwR9uzZI9x4441C//79pefX1dUJXbt2FQYPHizs379f+Omnn4SoqChh3rx5bvpEnu/NN98UIiMjhR9++EE4d+6csGbNGiE4OFh47733pG14vDvH2LFjhc6dOwvbtm0TTp06JbzyyitCaGiocOHCBUEQuN8d4aeffhJeeOEFYe3atQIA4bvvvtN53BH7uLi4WIiNjRXGjx8vHDlyRFi1apUQGBgoLF261FUfs0li8GKl5557ThgwYIDRx9VqtRAXFyf85z//ke4rKioSVCqVsGrVKkEQBOHYsWMCAGH37t3SNj///LOgUCiE3Nxc5xW+iZk1a5bQtm1bQa1WC0VFRYKfn5+wZs0a6fHjx48LAISMjAxBEDQnKqVSKeTn50vbLF68WAgNDRWqq6tdXn5vMGLECGHKlCk6991zzz3C+PHjBUHg8e4sFRUVgo+Pj/DDDz/o3N+7d2/hhRde4H53Av3gxVH7+IMPPhAiIiJ0zjHPPfec0LFjRyd/oqaN3UZW+v7779G3b1+MGTMGMTEx6NWrFz766CPp8XPnziE/Px+DBw+W7gsLC0NqaioyMjIAABkZGQgPD0ffvn2lbQYPHgylUomdO3e67sN4sZqaGqxYsQJTpkyBQqHA3r17UVtbq7PfU1JSkJycrLPfu3XrhtjYWGmboUOHoqSkBEePHnX5Z/AG/fv3x5YtW3Dy5EkAwMGDB5Geno7hw4cD4PHuLHV1daivr0dAQIDO/YGBgUhPT+d+dwFH7eOMjAzcfPPN8Pf3l7YZOnQoMjMzce3aNRd9mqaHwYuVzp49i8WLF6N9+/bYtGkTHnvsMTz55JP4/PPPAQD5+fkAoHOBFG+Lj+Xn5yMmJkbncV9fXzRv3lzahkxbt24dioqKMGnSJACaferv74/w8HCd7fT3u9z3Ij5Ghp5//nncf//9SElJgZ+fH3r16oXZs2dj/PjxAHi8O0tISAjS0tLw+uuv4+LFi6ivr8eKFSuQkZGBvLw87ncXcNQ+5nnHOZrcqtLOplar0bdvX/zrX/8CAPTq1QtHjhzBkiVLMHHiRDeX7vrxySefYPjw4UhISHB3UZq0r7/+Gl9++SVWrlyJLl264MCBA5g9ezYSEhJ4vDvZ8uXLMWXKFCQmJsLHxwe9e/fGuHHjsHfvXncXjcjt2PJipfj4eHTu3Fnnvk6dOiE7OxsAEBcXBwAGo1wKCgqkx+Li4nDp0iWdx+vq6lBYWChtQ8ZlZWXh119/xdSpU6X74uLiUFNTg6KiIp1t9fe73PciPkaG5s6dK7W+dOvWDRMmTMBTTz2F+fPnA+Dx7kxt27bFtm3bUFZWhpycHOzatQu1tbVo06YN97sLOGof87zjHAxerHTTTTchMzNT576TJ0+iZcuWAIDWrVsjLi4OW7ZskR4vKSnBzp07kZaWBgBIS0tDUVGRTg3qt99+g1qtRmpqqgs+hXdbtmwZYmJiMGLECOm+Pn36wM/PT2e/Z2ZmIjs7W2e/Hz58WOdks3nzZoSGhhoEpKRRUVEBpVL3NOHj4wO1Wg2Ax7srNGvWDPHx8bh27Ro2bdqEUaNGcb+7gKP2cVpaGv744w/U1tZK22zevBkdO3ZERESEiz5NE+TujGFvs2vXLsHX11d48803hVOnTglffvmlEBQUJKxYsULa5q233hLCw8OF9evXC4cOHRJGjRolO7yuV69ews6dO4X09HShffv2HMJogfr6eiE5OVl47rnnDB6bPn26kJycLPz222/Cnj17hLS0NCEtLU16XBwqPWTIEOHAgQPCxo0bhejoaA6VNmHixIlCYmKiNFR67dq1QlRUlPDss89K2/B4d46NGzcKP//8s3D27Fnhl19+EXr06CGkpqYKNTU1giBwvztCaWmpsH//fmH//v0CAGHBggXC/v37haysLEEQHLOPi4qKhNjYWGHChAnCkSNHhNWrVwtBQUEcKm0nBi822LBhg9C1a1dBpVIJKSkpwocffqjzuFqtFl566SUhNjZWUKlUwu233y5kZmbqbHP16lVh3LhxQnBwsBAaGipMnjxZKC0tdeXH8EqbNm0SABjsT0EQhMrKSuHxxx8XIiIihKCgIOHuu+8W8vLydLY5f/68MHz4cCEwMFCIiooSnn76aaG2ttZVxfc6JSUlwqxZs4Tk5GQhICBAaNOmjfDCCy/oDPvk8e4cX331ldCmTRvB399fiIuLE2bMmCEUFRVJj3O/22/r1q0CAIO/iRMnCoLguH188OBBYcCAAYJKpRISExOFt956y1UfsclSCILWVJlEREREHo45L0RERORVGLwQERGRV2HwQkRERF6FwQsRERF5FQYvRERE5FUYvBAREZFXYfBCREREXoXBCxEREXkVBi9ERETkVRi8EBERkVdh8EJERERehcELEREReZX/B/sRssTTz/tsAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "t_start = trials['intervals_0'].iloc[0] + 250\n", + "t_stop = t_start + 480\n", + "cols = df_processed.columns\n", + "fig, axes = plt.subplots(nrows=len(cols))\n", + "for i, col in enumerate(cols):\n", + " axes[i].plot(df_processed[col].loc[t_start:t_stop], label=col, alpha=0.8, lw=1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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", + "
SIPPT
326.2806520.4230912.972447
326.3139950.8420513.023712
326.3473070.9986161.933368
326.3806500.5565903.047135
326.4139941.2461522.013288
.........
2918.846743-0.854700-0.583010
2918.8800870.545802-0.280588
2918.913430-0.1349980.284811
2918.946741-3.2277730.666126
2918.9800850.0789680.127025
\n", + "

77786 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " SI PPT\n", + "326.280652 0.423091 2.972447\n", + "326.313995 0.842051 3.023712\n", + "326.347307 0.998616 1.933368\n", + "326.380650 0.556590 3.047135\n", + "326.413994 1.246152 2.013288\n", + "... ... ...\n", + "2918.846743 -0.854700 -0.583010\n", + "2918.880087 0.545802 -0.280588\n", + "2918.913430 -0.134998 0.284811\n", + "2918.946741 -3.227773 0.666126\n", + "2918.980085 0.078968 0.127025\n", + "\n", + "[77786 rows x 2 columns]" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t_start, t_stop\n", + "df_processed.loc[t_start:]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "ibl", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}