Skip to content

Instantly share code, notes, and snippets.

@slarson
Last active September 7, 2017 03:53
Show Gist options
  • Save slarson/5486105 to your computer and use it in GitHub Desktop.
Save slarson/5486105 to your computer and use it in GitHub Desktop.
Working with the C. Elegans connectome data and the NetworkX library in iPython Notebook
{
"metadata": {
"name": "NetworkX C. Elegans Connectome"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": "Working with the C. Elegans connectome data and the NetworkX library"
},
{
"cell_type": "code",
"collapsed": false,
"input": "%load https://raw.github.com/openworm/data-viz/master/HivePlots/worm2hive.py",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": "!sudo pip install networkx",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "Requirement already satisfied (use --upgrade to upgrade): networkx in /usr/local/lib/python2.7/dist-packages\r\nCleaning up...\r\n"
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": "\"\"\" \nworm2nx.py\nSimple script for turning connectome tables into NetworkX graphs.\n\nNote that the tables were extracted manually from the connectivity spreadsheet\nof the c. elegans and should accompany this script.\n\nAuthor: Pedro Tabacof (tabacof at gmail dot com)\n Stephen Larson (stephen@openworm.org)\nLicense: Public Domain\n\"\"\"\n\n# -*- coding: utf-8 -*- \n\nimport csv\n\nimport urllib2\n\nimport networkx as nx\n\nworm = nx.DiGraph()\n\n# Neuron table\ncsvfile = urllib2.urlopen('https://raw.github.com/openworm/data-viz/master/HivePlots/neurons.csv')\n\nreader = csv.reader(csvfile, delimiter=';', quotechar='|')\nfor row in reader:\n neurontype = \"\"\n # Detects neuron function\n if \"sensory\" in row[1].lower():\n neurontype += \"sensory\"\n if \"motor\" in row[1].lower():\n neurontype += \"motor\" \n if \"interneuron\" in row[1].lower():\n neurontype += \"interneuron\"\n if len(neurontype) == 0:\n neurontype = \"unknown\"\n \n if len(row[0]) > 0: # Only saves valid neuron names\n worm.add_node(row[0], ntype = neurontype)\n\n# Connectome table\ncsvfile = urllib2.urlopen('https://raw.github.com/openworm/data-viz/master/HivePlots/connectome.csv')\n\nreader = csv.reader(csvfile, delimiter=';', quotechar='|')\nfor row in reader:\n worm.add_edge(row[0], row[1], weight = row[3])\n worm[row[0]][row[1]]['synapse'] = row[2]\n worm[row[0]][row[1]]['neurotransmitter'] = row[4]\n\n#get the degree of a given node for gap junction edges only\ndef GJ_degree(node):\n count = 0\n for item in worm.in_edges_iter(node,data=True):\n if 'GapJunction' in item[2]['synapse']:\n #count = count + int(item[2]['weight'])\n count = count + 1\n for item in worm.out_edges_iter(node,data=True):\n if 'GapJunction' in item[2]['synapse']:\n #count = count + int(item[2]['weight'])\n count = count + 1\n return count\n\n#get the degree of a given node for chemical synapse edges only\ndef Syn_degree(node):\n count = 0\n for item in worm.in_edges_iter(node,data=True):\n if 'Send' in item[2]['synapse']:\n #count = count + int(item[2]['weight'])\n count = count + 1\n for item in worm.out_edges_iter(node,data=True):\n if 'Send' in item[2]['synapse']:\n #count = count + int(item[2]['weight'])\n count = count + 1\n return count\n\n#for a given set of neuron nodes, count the total degree, \n# the degree of gap junctions only, and the degree of the \n# chemical synapse edges and store them in 3 dicts, \n# ids, ids_GJ and ids_Syn\nids = {}\nids_GJ = {}\nids_Syn = {}\nfor item in worm.nodes_iter(data=True):\n if item[0] in ['AVAL', 'AVAR', 'AVBL', 'AVBR', 'PVCR', 'PVCL', 'AVDR', 'AVER']:\n if 'interneuron' in item[1]['ntype']:\n ids[item[0]] = worm.degree(item[0])\n ids_GJ[item[0]] = GJ_degree(item[0])\n ids_Syn[item[0]] = Syn_degree(item[0])\n \ndegrees = []\nfor item in worm.nodes_iter(data=True):\n degrees.append(int(worm.degree(item[0])))\n \nprint \"AVAL in edges: \" + str(len(worm.in_edges('AVAL')))\n\nimport numpy as np\nprint \"**********************\"\nprint \"Average Degree: \" + str(np.mean(degrees))\nprint \"Std. Dev Degree: \" + str(np.std(degrees))\n\nprint \"******DEGREES OF TOP FOUR INTERNEURONS*******\"\nfor x in ['AVAL', 'AVAR', 'AVBL', 'AVBR']:\n print \"Degree of \" + x + \": \" + str(worm.degree(x)) + \" Z-score: \" + str((worm.degree(x) - np.mean(degrees)) / np.std(degrees))\n\nprint \"******DEGREES OF NEXT FOUR INTERNEURONS*******\"\nfor x in ['PVCR', 'PVCL', 'AVDR', 'AVER']:\n print \"Degree of \" + x + \": \" + str(worm.degree(x)) + \" Z-score: \" + str((worm.degree(x) - np.mean(degrees)) / np.std(degrees))\n\nprint \"******DEGREE OF TOP SENSORY NEURON*******\"\nprint \"Degree of ADEL: \" + str(worm.degree('ADEL')) + \" Z-score: \" + str((worm.degree('ADEL') - np.mean(degrees)) / np.std(degrees))\nprint \"******DEGREE OF TOP MOTOR NEURON*******\"\nprint \"Degree of RIMR: \" + str(worm.degree('RIMR')) + \" Z-score: \" + str((worm.degree('RIMR') - np.mean(degrees)) / np.std(degrees))\n\nimport operator\n\nids = sorted(ids.iteritems(), key=operator.itemgetter(1))\n\nids_GJ_sorted = []\nids_Syn_sorted = []\nfor item in ids:\n ids_GJ_sorted.append((item[0], ids_GJ[item[0]]))\n ids_Syn_sorted.append((item[0], ids_Syn[item[0]] + ids_GJ[item[0]])) #add syn to GJ so total bar height is total degree\n\nids_GJ = ids_GJ_sorted\nids_Syn = ids_Syn_sorted\n\n#print ids\n#print ids_GJ\n#print ids_Syn\n\nfrom pylab import *\n\npos = arange(len(ids))+1 # the bar centers on the y axis\n\nfig = figure(figsize=(10,10))\nax = fig.add_subplot(111)\n\n#p1 = bar(pos,[x[1] for x in ids], align='center', color='r')\n\np2 = bar(pos,[x[1] for x in ids_Syn], align='center')\n\np3 = bar(pos,[x[1] for x in ids_GJ], align='center', color='y')\n\nxlabel('Interneurons')\nylabel('Degree')\nxticks( pos, [x[0] for x in ids])\ntitle('Interneurons by node degree')\n#legend( (p1[0], p2[0], p3[0]), ('All edges', 'Synapses only', 'Gap junctions only'), loc=2)\nlegend( (p2[0], p3[0]), ('Synapses', 'Gap junctions'), loc=2)\nsetp(ax.get_xticklabels(), fontsize=12, rotation='vertical')\n\nshow()",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": "AVAL in edges: 83\n**********************\nAverage Degree: 20.6556291391\nStd. Dev Degree: 16.5080940844\n******DEGREES OF TOP FOUR INTERNEURONS*******\nDegree of AVAL: 134 Z-score: 6.86598769558\nDegree of AVAR: 137 Z-score: 7.04771673011\nDegree of AVBL: 102 Z-score: 4.92754466052\nDegree of AVBR: 104 Z-score: 5.04869735021\n******DEGREES OF NEXT FOUR INTERNEURONS*******\nDegree of PVCR: 69 Z-score: 2.92852528061\nDegree of PVCL: 64 Z-score: 2.62564355639\nDegree of AVDR: 63 Z-score: 2.56506721154\nDegree of AVER: 63 Z-score: 2.56506721154\n******DEGREE OF TOP SENSORY NEURON*******\nDegree of ADEL: 35 Z-score: 0.868929555864\n******DEGREE OF TOP MOTOR NEURON*******\nDegree of RIMR: 43 Z-score: 1.35354031463\n[('AVDR', 63), ('AVER', 63), ('PVCL', 64), ('PVCR', 69), ('AVBL', 102), ('AVBR', 104), ('AVAL', 134), ('AVAR', 137)]\n[('AVDR', 6), ('AVER', 12), ('PVCL', 9), ('PVCR', 16), ('AVBL', 45), ('AVBR', 56), ('AVAL', 60), ('AVAR', 51)]\n[('AVDR', 63), ('AVER', 63), ('PVCL', 64), ('PVCR', 69), ('AVBL', 102), ('AVBR', 104), ('AVAL', 134), ('AVAR', 137)]\n"
},
{
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAmAAAAJ9CAYAAACSI86VAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xt4THfix/HP5IaQO5lIIlKNeymllKWiRJWyflVBdwnt\ndp9edLG2rf21RaxFu1XVbfW2VkLqrostq0ob27plu21VUVGEEOKWiLhFkvP7w69TQSTKfCfJvF/P\nk+fJzLnM5zuT58wn55w5Y7MsyxIAAACM8XB1AAAAAHdDAQMAADCMAgYAAGAYBQwAAMAwChgAAIBh\nFDAAAADDKGAA3EZSUpI6d+7s6hhXGTZsmF566aVbsq7Y2FjNmjXrlqwLgPNQwIBKJDo6WuvWrSvX\nvLwRVx42m002m63CrQuA81DAgErkRt5cb/ZNuLi4+KaWvxGFhYXGHquiqujXxC4qKnJ1BKBKoYAB\nlVRSUpI6deqkZ599VsHBwWrQoIFWr14tSXrhhRf0+eefa8SIEfLz89Pvfvc7SdL333+vuLg4hYSE\nqEmTJlq8eLFjfcOGDdOTTz6pXr16qVatWvrss88UHR2tadOm6c4771RgYKAGDRqkCxcuOJb56KOP\n1KpVKwUFBekXv/iFtm3b5pjm4eGhvXv3llj/j4fZUlNTFRkZqVdeeUV169bVY489poKCAo0aNUoR\nERGKiIjQ6NGjVVBQUGL+1157TXa7XeHh4UpKSnKse9WqVWrevLn8/f0VGRmpadOmlfq8WZalZ555\nRoGBgWratKk+/fRTSdLixYvVtm3bEvO+9tpr6tev3zXXExsbq3HjxqlTp07y9/fX/fffrxMnTjim\nr1ixQs2bN1dQUJC6du2q77//3jHt66+/1l133SV/f38NGjRI58+fL7Hu6z2vV/rkk0/UpEkTBQYG\n6plnnpFlWSXK3N///nc1a9ZMwcHB6tmzpw4cOOCYtmbNGjVu3FiBgYF6+umn1aVLF8de06SkJP3i\nF7/Q73//e9WuXVuJiYkqKCjQH/7wB9WvX19hYWF68sknS2S/kdyA27MAVBrR0dHWunXrLMuyrNmz\nZ1ve3t7W3/72N6u4uNh6++23rfDwcMe8sbGx1qxZsxy38/PzrcjISCspKckqKiqyvv76a6t27drW\njh07LMuyrISEBCsgIMDauHGjZVmWdf78eSs6Otpq3769dfjwYevkyZNW06ZNrXfeeceyLMv66quv\nrNDQUCstLc0qLi62kpOTrejoaKugoMCyLMuy2WzWnj17HI8/bNgw66WXXrIsy7I+++wzy8vLyxo7\ndqxVUFBgnTt3znrppZesDh06WMeOHbOOHTtmdezY8ar5x48fbxUWFlqrVq2yfH19rdzcXMuyLCss\nLMz64osvLMuyrNzcXOurr7665vM3e/Zsy8vLy3r99detwsJCa+HChVZAQICVk5NjnT9/3goODrZ2\n7tzpmL9Vq1bWhx9+eM11denSxYqJibF2795tnTt3zoqNjbXGjh1rWZZl7dq1y6pZs6a1du1aq7Cw\n0HrllVesmJgY6+LFi9aFCxesqKgoR4YlS5ZY3t7ejrGW9rxeuHDhqgzHjh2z/Pz8rKVLl1qFhYXW\n9OnTLS8vL8frvmzZMismJsb6/vvvraKiImvSpElWx44dHcv6+/tb//jHP6yioiJrxowZlre3t2PZ\nH5+rN9980yoqKrLOnTtnjRo1yvrlL39p5eTkWKdPn7b69Olj/fGPf7zh3AAu/acEoJK4soDFxMQ4\npp05c8ay2WxWdna2ZVmXCtjf/vY3x/QFCxZYnTt3LrG+3/72t1ZiYqJlWZcKWEJCwlWP98EHHzhu\nP/fcc9YTTzxhWZZlPfHEE47S8KPGjRtb//73vy3LunYBe/HFFy3LulSofHx8Srw533777da//vUv\nx+2PP/7Yio6Odsxfo0YNq6ioyDE9NDTU2rJli2VZlhUVFWW9++671qlTp0p55i6ZPXt2iZJqWZbV\nrl07a+7cuY4xvfDCC5ZlWdZ3331nBQUFOQrllWJjY60///nPjtszZ860evbsaVmWZU2cONEaOHCg\nY1pxcbEVERFhpaamWuvXr78qw+Vls7Tndf369VdlSE5Otjp06FDivsjISEeJ6tmzZ4kSXlRUZPn6\n+lr79++3kpOTHWXsR/Xq1StRwKKiokqMoWbNmiVe040bN1q33XbbDecGYFkcggQqsbCwMMfvvr6+\nkqT8/HzHfZefB7Z//35t2bJFQUFBjp958+YpOzvbMW+9evWu+xg1atRwrH///v2aNm1aifUdPHhQ\nWVlZ5cpep04d+fj4OG5nZWWpfv36jttRUVEl1hUSEiIPj582Wb6+vo4sS5cu1apVqxQdHa3Y2Fht\n3ry51MeNiIgocbt+/fo6fPiwJCkhIUHz5s2TJM2dO1cDBw6Ut7d3qesq7bnJyspSVFSUY9qPz+2h\nQ4d0+PDha2b4UWnP648ZL5eVlaXIyMgS913+Gu7fv18jR450rCckJESSHDmuXPZ66zp27JjOnj2r\nNm3aONb3wAMP6Pjx4zecGwDngAFV1pUn4UdFRalLly7Kyclx/Jw+fVpvvfXWz1pvVFSUXnjhhRLr\ny8/P18CBAyVdKkhnz551LHf48OESma7MFx4eroyMDMftAwcOKDw8vFyZ2rZtq2XLlunYsWPq16+f\n4uPjS5330KFDJW7v37/f8Tj33HOPfHx89O9//1vz58/XkCFDyvX4V4qIiND+/fsdty3LUmZmpiIj\nI1W3bt1rZvhRWc/r5cLDw5WZmXnV41y+rvfee6/Eus6cOaMOHTqobt26OnjwYIllL78tlXyNateu\nrRo1amjHjh2OdeXm5iovL++GcwOggAFVlt1u1549exy3H3zwQaWnpyslJUUXL17UxYsX9Z///Mdx\ncrhVzk/h/Tjf448/rnfeeUdpaWmyLEtnzpzRypUrHXuBWrVqpQ8++EBFRUVavXq1/v3vf193vYMH\nD9akSZN0/PhxHT9+XBMnTixXAbp48aI++OADnTp1Sp6envLz85Onp2ep8x89elRvvPGGLl68qMWL\nF2vXrl3q1auXY/qQIUM0YsQI+fj4qGPHjuV6Lq40YMAArVy5Up9++qkuXryoadOmqXr16urYsaPu\nueceeXl5OTJ8+OGH+s9//uNYtqzn9XK9e/fW9u3b9Y9//EOFhYV64403dOTIEcf0J554QpMnT9aO\nHTskSadOnXJ88KJXr17atm2bli9frsLCQr311lsllr2Sh4eHHn/8cY0aNUrHjh2TdKnMrlmz5oZz\nA6CAAZXWtS5JcfntkSNHasmSJQoODtaoUaNUq1YtrVmzRgsWLFBERITq1q2rP/7xj45PGpbnEheX\nz9OmTRu9//77GjFihIKDg9WwYUPNmTPHMe+MGTP0z3/+03Go83/+539KzSpJL774otq2bauWLVuq\nZcuWatu2rV588cVS579cSkqKbrvtNgUEBOi9997TBx98UGr+e+65R7t371adOnX00ksvacmSJQoK\nCnLMM2TIEG3fvl2//vWvr/tcXJnp8uemcePGSklJ0TPPPKM6depo5cqV+uc//ykvLy/5+Pjoww8/\nVFJSkkJCQrRo0SL179/fsZ6yntfLhYSEaPHixRo7dqxq166tH374QZ06dXJM79evn55//nkNGjRI\nAQEBatGihT7++GNJl/ZoLV68WM8995xq166tnTt3qm3btqpWrdpV4/nRyy+/rJiYGN1zzz0KCAhQ\nXFyc0tPTbzg3AMlmlfffXgBwA+fOnZPdbtfXX3+t22+/3dVxjCkuLla9evU0b948denSxdVxgCrP\naXvAHn30UdntdrVo0eKqadOmTZOHh4dOnjzpuG/KlClq2LChmjRp4tilDQCmvf3222rXrp1blK81\na9YoNzdXFy5c0OTJkyVdOg8OgPN5OWvFw4cP1zPPPKOhQ4eWuD8zM1OffPJJiU/97NixQwsXLtSO\nHTt06NAhde/eXenp6SU+8QQAzhYdHS2bzaZly5a5OooRmzZt0iOPPKKCggI1b95cy5YtcxyCBOBc\nTms4nTt3LnFexY9+//vf65VXXilx3/LlyzV48GB5e3srOjpaMTExSktLc1Y0ALimjIwM7du3T3fe\neaeroxgxfvx4HT9+XHl5edq0aZPuvvtuV0cC3IbT9oBdy/LlyxUZGamWLVuWuD8rK6vEbu/IyMir\nPqbNl8sCAIDK5Hqn2Rs7xnf27FlNnjxZiYmJjvuuF+xahcv6/+84c6ef8ePHuzwD42bcjJtxM27G\nzbhv7KcsxvaA7dmzRxkZGY5d+wcPHlSbNm20ZcsWRURElLh44MGDB6+6UjQAAEBVYWwPWIsWLZSd\nna19+/Zp3759ioyM1FdffSW73a6+fftqwYIFKigo0L59+7R79261a9fOVDQAAACjnFbABg8erI4d\nOyo9PV316tXT7NmzS0y//BBjs2bNFB8fr2bNmumBBx7QzJkzOefr/8XGxro6gkswbvfCuN0L43Yv\n7jruslSaC7HabLZyHVMFAABwtbJ6i9FPQTpDcHCwcnJyXB0DhgUFBZW4kC8AAJVJpd8Dxp4x98Tr\nDgCoyMp6n+JS8wAAAIZRwAAAAAyjgAEAABhGAQMAADCs0n8K8lr8/YN1+rTzPhnp5xekvDw+gQcA\nqPyc/Z5pQmV8X66Se8Au/SFZTvu5kT/UL774Qh07dlRgYKBCQkLUqVMnffnll7dimAAA3DRnv2ea\n+KmMBbJK7gGrKPLy8vTggw/q3XffVXx8vC5cuKDPP/9c1apVc3U0AADgQlVyD1hFkZ6eLpvNpoED\nB8pms6l69eqKi4tT48aNFRISou+++84x79GjR1WzZk2dOHFCqampioyM1GuvvSa73a7w8HAlJSU5\n5l25cqVat26tgIAARUVFKTEx0TEtIyNDHh4eev/99xUREaHw8HBNmzbNMT0tLU1t27ZVQECAwsLC\nNGbMGMe0zZs3q2PHjgoKClKrVq20fv16x7SkpCTdfvvt8vf3V4MGDTRv3jwnPWsAAFR9FDAnaty4\nsTw9PTVs2DCtXr3accV+Hx8fDRo0SCkpKY5558+fr+7duyskJESSlJ2drby8PGVlZWnWrFl6+umn\nderUKUlSrVq1lJKSolOnTmnlypV6++23tXz58hKPnZqaqh9++EFr1qzRyy+/rHXr1kmSRo4cqdGj\nR+vUqVPau3ev4uPjJUmHDh3Sgw8+qHHjxiknJ0evvvqq+vfvrxMnTujMmTMaOXKkVq9erby8PG3a\ntEmtWrVy+vMHAEBVRQFzIj8/P33xxRey2Wx6/PHHFRoaql/+8pc6evSohg4dqvnz5zvmnTt3roYM\nGeK47e3trXHjxsnT01MPPPCAatWqpV27dkmSunTpoubNm0uSWrRooUGDBpXYWyVJ48ePV40aNXTH\nHXdo+PDhjsfy8fHR7t27dfz4cfn6+qp9+/aSpJSUFPXq1Us9e/aUJHXv3l1t27bVypUrZbPZ5OHh\noW3btuncuXOy2+1q1qyZ8544AACqOAqYkzVp0kSzZ89WZmamvvvuO2VlZWnUqFFq3769atSoodTU\nVH3//ffas2eP+vbt61guJCREHh4/vTy+vr7Kz8+XJG3ZskVdu3ZVaGioAgMD9e677+rEiRMlHrde\nvXqO36OiopSVlSVJmjVrltLT09W0aVO1a9dOK1eulCTt379fixcvVlBQkONnw4YNOnLkiHx9fbVw\n4UK98847Cg8P14MPPugogwAA4MZRwAxq3LixEhISHOd+JSQkKCUlRXPnztWAAQPk4+NTrvU88sgj\n6tevnw4ePKjc3Fw98cQTKi4uLjHPgQMHSvweEREhSYqJidG8efN07NgxPf/883r44Yd19uxZRUVF\naciQIcrJyXH8nD59Ws8995wkqUePHlqzZo2OHDmiJk2a6PHHH78VTwkAAG6JAuZEu3bt0muvvaZD\nhw5JkjIzMzV//nx16NBBkvTrX/9aH374oT744AMNHTq03OvNz89XUFCQfHx8lJaWpnnz5slms5WY\nZ9KkSTp37py2b9+upKQkDRw4UNKlQ43Hjh2TJAUEBMhms8nT01O//vWv9c9//lNr1qxRUVGRzp8/\nr9TUVB06dEhHjx7V8uXLdebMGXl7e6tmzZry9PS8FU8RAABuqUoWMD+/IEk2p/1cWn95cvhpy5Yt\nat++vWrVqqUOHTqoZcuWjk8l1qtXT3fddZc8PDzUqVOnEsteWaguN3PmTI0bN07+/v7605/+5ChX\nl+vSpYtiYmLUvXt3Pfvss+revbsk6eOPP9Ydd9whPz8/jR49WgsWLFC1atUUGRmp5cuXa/LkyQoN\nDVVUVJSmTZsmy7JUXFys6dOnKyIiQiEhIfr888/19ttvl+s5AAAAV7NZlmW5OkR52Gw2XStqafdX\nFo899pgiIiI0ceLEW7K+jIwMNWjQQIWFhSXOIatqKvvrDgAVxaV/+Cv79rTivSeU9T7FhVhdKCMj\nQx9++KG++eYbV0cBAAAGVd1dJBXcSy+9pBYtWui5555T/fr1b+m6r3f4EgBwbf7+wbLZbJX6x98/\n2NVPI8qJQ5ColHjdAdxq7noozl3H7WxlvU+xBwwAAMAwChgAAIBhFDAAAADDKGAAAACGUcAAAAAM\nq5IFLCjI36kf8w0K8nf1EEv15JNPatKkScYft1evXpo7d67xxwUAoDKqkpehsNls+uwz52Xp2lU3\n9HHXBQsWaPr06dq+fbtq1qyp2267TQkJCXryySedF9KJJkyYoD179ri0cHEZCgC3mrtejsFdx+1s\nXIbCxaZNm6ZRo0bp+eefV3Z2trKzs/XOO+9ow4YNKigocHU8AADgAhQwJzp16pTGjx+vt99+Ww89\n9JBq1qwpSWrVqpVSUlLk4+MjSVq5cqVat26tgIAARUVFKTEx0bGOjIwMeXh46P3331dERITCw8Md\nX+Z9LcOGDdNLL70kSUpKSlLnzp1LTPfw8NDevXsd8z799NN68MEH5e/vr3vuuccxTZK2b9+uuLg4\nhYSEKCwsTFOmTNHHH3+sKVOmaOHChfLz81Pr1q0lSbGxsZo1a5akS3sHJ02apOjoaNntdiUkJCgv\nL6/EeObMmaP69eurTp06mjx5suMx09LS1LZtWwUEBCgsLExjxoz5eU8+AAAVGAXMiTZt2qQLFy7o\nl7/85XXnq1WrllJSUnTq1CmtXLlSb7/9tpYvX15intTUVP3www9as2aNXn75Za1bt+6a6/rxPLXy\nWrhwoSZMmKCcnBzFxMTohRdekCSdPn1a3bt3V69evXT48GH98MMP6tatm+6//3797//+rwYNGqTT\np0/r66+/vupxZ8+ereTkZKWmpmrv3r3Kz8/XiBEjSjzuhg0blJ6ernXr1mnixInatWuXJGnkyJEa\nPXq0Tp06pb179yo+Pr7cYwEAoLKggDnR8ePHVbt2bXl4/PQ0d+zYUUFBQfL19dXnn38uSerSpYua\nN28uSWrRooUGDRqk9evXl1jX+PHjVaNGDd1xxx0aPny45s+ff9P5bDabHnroIbVt21aenp761a9+\n5fhi8I8++kjh4eEaPXq0fHx8VKtWLbVr107SpT1c1zuu/cEHH2jMmDGKjo5WzZo1NWXKFC1YsEDF\nxcUlxlOtWjW1bNlSd955p7Zu3SpJ8vHx0e7du3X8+HH5+vqqffv2Nz1OAAAqGgqYE4WEhOj48eMl\nisfGjRuVk5OjkJAQR4nZsmWLunbtqtDQUAUGBurdd9/ViRMnSqyrXr16jt+joqKUlZV1SzLa7XbH\n7zVq1FB+fr4kKTMzUw0aNPhZ6zx8+HCJLxiPiopSYWGhsrOzHfeFhYU5fvf19XU87qxZs5Senq6m\nTZuqXbt2Wrly5c/KAABARUYBc6IOHTqoWrVqWrZs2XXne+SRR9SvXz8dPHhQubm5euKJJ0qUNkk6\ncOBAid8jIiLKfPyaNWvq7NmzjttHjhwpd/aoqKgS54Nd7vI9etcSHh6ujIwMx+0DBw7Iy8urRNkr\nTUxMjObNm6djx47p+eef18MPP6xz586VOzcAAJUBBcyJAgMDNX78eD311FNaunSpTp8+reLiYn3z\nzTc6c+aMY778/HwFBQXJx8dHaWlpmjdv3lXncU2aNEnnzp3T9u3blZSUpIEDB5b6uD/uWbvzzju1\nfft2bd26VefPn9eECROuOd+19O7dW4cPH9aMGTN04cIFnT59WmlpaZIu7TXLyMgodfnBgwdr+vTp\nysjIUH5+vuOcsbKKmySlpKTo2LFjkqSAgADZbLZyLQcAQGXi5eoAzhAY6KeuXU87df3l9eyzzyoi\nIkKvvPKKhg4dqpo1a6pBgwZ65ZVX1KFDB0nSzJkzNWbMGI0YMUJdunTRwIEDlZubW2I9Xbp0UUxM\njIqLi/Xss8+qe/fuZT52o0aNNG7cOHXv3l2+vr6aPHmy3n//fcf0a52w/+NtPz8/ffLJJxo5cqQS\nExNVrVo1jR49Wu3atdOAAQOUkpKikJAQNWjQQF9++WWJdTz66KPKysrSvffeq/Pnz6tnz57661//\netVjXMvHH3+sMWPG6OzZs4qOjtaCBQtUrVq1MscKAEBlUiUvxFqVZGRkqEGDBiosLCzXnqCEhAQ1\nbNhQL774ooF0rlPVX3cA5rnrBUndddzOxoVY3UhhYaF27dql2267zdVRAADAdVDAKoHyXtcrLCxM\nQUFB6t+/v5MTAQCAm8EhSFRKvO4AbjV3PRTnruN2Ng5BAgAAVDAUMAAAAMMoYAAAAIZV+uuABQUF\n3dCXT6NqCAoKcnUEAAB+tkp/Ej4AALeCu56M7q7jdjZOwgcAAKhgKGAAAACGUcAAAAAMo4ABAAAY\nRgEDAAAwjAIGAABgGAUMAADAMAoYAACAYRQwAAAAwyhgAAAAhlHAAAAADKOAAQAAGEYBAwAAMIwC\nBgAAYBgFDAAAwDAKGAAAgGEUMAAAAMMoYAAAAIZRwAAAAAyjgAEAABhGAQMAADCMAgYAAGAYBQwA\nAMAwChgAAIBhFDAAAADDKGAAAACGOa2APfroo7Lb7WrRooXjvmeffVZNmzbVnXfeqYceekinTp1y\nTJsyZYoaNmyoJk2aaM2aNc6KBQAA4HJOK2DDhw/X6tWrS9zXo0cPbd++XVu3blWjRo00ZcoUSdKO\nHTu0cOFC7dixQ6tXr9ZTTz2l4uJiZ0UDAABwKacVsM6dOysoKKjEfXFxcfLwuPSQ7du318GDByVJ\ny5cv1+DBg+Xt7a3o6GjFxMQoLS3NWdEAAABcymXngP39739Xr169JElZWVmKjIx0TIuMjNShQ4dc\nFQ0AAMCpvFzxoH/+85/l4+OjRx55pNR5bDbbVfdNmDDB8XtsbKxiY2OdkA4AAODGpKamKjU1tdzz\nGy9gSUlJWrVqldatW+e4LyIiQpmZmY7bBw8eVERExFXLXl7AAAAAKoordwwlJiZed36jhyBXr16t\nv/zlL1q+fLmqV6/uuL9v375asGCBCgoKtG/fPu3evVvt2rUzGQ0AAMAYp+0BGzx4sNavX6/jx4+r\nXr16SkxM1JQpU1RQUKC4uDhJUocOHTRz5kw1a9ZM8fHxatasmby8vDRz5sxrHoIEAACoCmyWZVmu\nDlEeNptNlSQqAKASuvSPf2V/n7nx90p3HbezldVbuBI+AACAYRQwAAAAwyhgAAAAhlHAAAAADKOA\nAQAAGEYBAwAAMIwCBgAAYBgFDAAAwDAKGAAAgGEUMAAAAMMoYAAAAIZRwAAAAAyjgAEAABhGAQMA\nADCMAgYAAGAYBQwAAMAwChgAAIBhFDAAAADDKGAAAACGUcAAAAAMo4ABAAAYRgEDAAAwjAIGAABg\nGAUMAADAMAoYAACAYRQwAAAAwyhgAAAAhlHAAAAADKOAAQAAGEYBAwAAMIwCBgAAYBgFDAAAwDAK\nGAAAgGEUMAAAAMMoYAAAAIZRwAAAAAyjgAEAABhGAQMAADCMAgYAAGAYBQwAAMAwChgAAIBhFDAA\nAADDKGAAAACGUcAAAAAMo4ABAAAYRgEDAAAwjAIGAABgGAUMAADAMAoYAACAYRQwAAAAwyhgAAAA\nhlHAAAAADKOAAQAAGEYBAwAAMIwCBgAAYBgFDAAAwDAKGAAAgGEUMAAAAMO8XB0AAFCx+PsH6/Tp\nHFfHuCl+fkHKyzvp6hhAqWyWZVmuDlEeNptNlSQqAFRqNptNUmXf3t74ewbjrswqXkcoq7dwCBIA\nAMAwChgAAIBhFDAAAADDKGAAAACGUcAAAAAMo4ABAAAYxnXAAKAUXA8LgLNwHTAAKIW7Xh+JcVdm\njLui4DpgAAAAFQwFDAAAwDAKGAAAgGFOK2CPPvqo7Ha7WrRo4bjv5MmTiouLU6NGjdSjRw/l5uY6\npk2ZMkUNGzZUkyZNtGbNGmfFAgAAcDmnFbDhw4dr9erVJe6bOnWq4uLilJ6erm7dumnq1KmSpB07\ndmjhwoXasWOHVq9eraeeekrFxcXOigYAAOBSTitgnTt3VlBQUIn7VqxYoYSEBElSQkKCli1bJkla\nvny5Bg8eLG9vb0VHRysmJkZpaWnOigYAAOBSRq8Dlp2dLbvdLkmy2+3Kzs6WJGVlZemee+5xzBcZ\nGalDhw5dtfyECRMcv8fGxio2NtapeQEAAMojNTVVqamp5Z7fZRditdls/3/tkdKnX+nyAgYAAFBR\nXLljKDEx8brzG/0UpN1u15EjRyRJhw8fVmhoqCQpIiJCmZmZjvkOHjyoiIgIk9EAAACMMVrA+vbt\nq+TkZElScnKy+vXr57h/wYIFKigo0L59+7R79261a9fOZDQAAABjnHYIcvDgwVq/fr2OHz+uevXq\naeLEiRo7dqzi4+M1a9YsRUdHa9GiRZKkZs2aKT4+Xs2aNZOXl5dmzpx53cOTAAAAlRnfBQkApXDX\n78hj3JUZ464o+C5IAACACoYCBgAAYBgFDAAAwDAKGAAAgGEUMAAAAMMoYAAAAIZRwAAAAAyjgAEA\nABhGAQMAADCMAgYAAGAYBQwAAMAwChgAAIBhFDAAAADDKGAAAACGUcAAAAAMo4ABAAAYRgEDAAAw\njAIGAABG1S7KAAAgAElEQVRgGAUMAADAMAoYAACAYRQwAAAAwyhgAAAAhlHAAAAADKOAAQAAGEYB\nAwAAMIwCBgAAYBgFDAAAwDAKGAAAgGEUMAAAAMMoYAAAAIZRwAAAAAyjgAEAABhGAQMAADCMAgYA\nAGAYBQwAAMAwChgAAIBhFDAAAADDKGAAAACGUcAAAAAMo4ABAAAYRgEDAAAwjAIGAABgGAUMAADA\nMAoYAACAYRQwAAAAwyhgAAAAhlHAAAAADKOAAQAAGEYBAwAAMIwCBgAAYBgFDAAAwDAKGAAAgGEU\nMAAAAMMoYAAAAIZRwAAAAAyjgAEAABhGAQMAADCMAgYAAGAYBQwAAMAwChgAAIBhFDAAAADDKGAA\nAACGUcAAAAAMo4ABAAAYRgEDAAAwjAIGAABgGAUMAADAMAoYAACAYRQwAAAAwyhgAAAAhlHAAAAA\nDHNJAZsyZYqaN2+uFi1a6JFHHtGFCxd08uRJxcXFqVGjRurRo4dyc3NdEQ0AAMDpjBewjIwMvf/+\n+/rqq6+0bds2FRUVacGCBZo6dari4uKUnp6ubt26aerUqaajAQAAGGG8gPn7+8vb21tnz55VYWGh\nzp49q/DwcK1YsUIJCQmSpISEBC1btsx0NAAAACO8TD9gcHCwxowZo6ioKNWoUUP333+/4uLilJ2d\nLbvdLkmy2+3Kzs6+atkJEyY4fo+NjVVsbKyh1AAAAKVLTU1Vampquee3WZZlOS/O1fbs2aM+ffro\n888/V0BAgAYMGKD+/fvrmWeeUU5OjmO+4OBgnTx58qegNpsMRwXg5mw2m6TKvt258W0n467MGHdF\nUVZvMX4I8ssvv1THjh0VEhIiLy8vPfTQQ9q0aZPCwsJ05MgRSdLhw4cVGhpqOhoAAIARxgtYkyZN\ntHnzZp07d06WZWnt2rVq1qyZ+vTpo+TkZElScnKy+vXrZzoaAACAEcYPQUrSK6+8ouTkZHl4eOiu\nu+7S3/72N50+fVrx8fE6cOCAoqOjtWjRIgUGBv4UlEOQAAxz10MzjLsyY9wVRVm9xSUF7OeggAEw\nzV3fmBh3Zca4K4oKdw4YAACAu6OAAQAAGEYBAwAAMIwCBgAAYBgFDAAAwDAKGAAAgGEUMAAAAMMo\nYAAAAIZRwAAAAAyjgAEAABhGAQMAADCMAgYAAGAYBQwAAMAwChgAAIBhFDAAAADDKGAAAACGUcAA\nAAAMo4ABAAAYVmYBO3LkiB577DH17NlTkrRjxw7NmjXL6cEAAACqqjIL2LBhw9SjRw9lZWVJkho2\nbKjp06c7PRgAAEBVVWYBO378uAYOHChPT09Jkre3t7y8vJweDAAAoKoqs4DVqlVLJ06ccNzevHmz\nAgICnBoKAACgKitzV9a0adPUp08f7d27Vx07dtSxY8e0ZMkSE9kAAACqJJtlWVZZMxUWFmrXrl0q\nLi5WkyZN5O3tbSJbCTabTeWICgC3jM1mk1TZtzs3vu1k3JUZ464oyuotZR6CPHPmjKZMmaLXX39d\nLVq0UEZGhj766KNbGhIAAMCdlFnAhg8fLh8fH23cuFGSFB4erhdeeMHpwQAAAKqqMgvYnj179Pzz\nz8vHx0eSVLNmTaeHAgAAqMrKLGDVqlXTuXPnHLf37NmjatWqOTUUAABAVVbmpyAnTJignj176uDB\ng3rkkUe0YcMGJSUlGYgGAABQNV23gBUXFysnJ0dLly7V5s2bJUkzZsxQnTp1jIQDAACoisq8DEWb\nNm303//+11SeUnEZCgCmuevH8xl3Zca4K4qbvgxFXFycXn31VWVmZurkyZOOHwAAAPw8Ze4Bi46O\n/v92XNK+ffucFupa2AMGwDR33TPAuCszxl1RlNVbynUl/IqAAgbANHd9Y2LclRnjrijK6i1lfgpy\n6dKlV+0BCwgIUIsWLRQaGnrzCQEAANxMmXvAevfurU2bNqlr166yLEvr16/XXXfdpX379mncuHEa\nOnSomaDsAQNgmLvuGWDclRnjrihueg/YxYsXtXPnTtntdklSdna2hgwZoi1btujee+81VsAAAACq\nijI/BZmZmekoX5IUGhqqzMxMhYSEOL6eCAAAAOVX5h6wrl27qnfv3oqPj5dlWVq6dKliY2N15swZ\nBQYGmsgIwMX8/YN1+nSOq2PcFD+/IOXlcQkdABVDmeeAFRcX68MPP9SGDRskSb/4xS/Uv3//a16a\nwpk4BwxwHXc9R4RxV2aMu9xLuOm4ne2mzwHz8PBQ27ZtFRAQoLi4OJ09e1b5+fny8/O7pUEBAADc\nRZnngL333nsaMGCAnnjiCUnSwYMH1a9fP6cHAwAAqKrKLGBvvfWWvvjiC/n7+0uSGjVqpKNHjzo9\nGAAAQFVVZgGrVq2aqlWr5rhdWFho/PwvAACAqqTMAtalSxf9+c9/1tmzZ/XJJ59owIAB6tOnj4ls\nAAAAVVKZn4IsKirSrFmztGbNGknS/fffr9/85jd8ChJwI+76KSnGXZkx7nIv4abjdrZb8mXcP57z\n5crvfqSAAa7jrhtoxl2ZMe5yL+Gm43a2snpLqYcgLcvShAkTVLt2bTVu3FiNGzdW7dq1lZiYWOEG\nCQAAUJmUWsCmT5+uDRs26D//+Y9ycnKUk5OjtLQ0bdiwQdOnTzeZEQAAoEop9RBkq1at9Mknn6hO\nnTol7j927Jji4uL0zTffGAn4Iw5BAq7jrocoGHdlxrjLvYSbjtvZfvYhyMLCwqvKlyTVqVNHhYWF\ntyYdAACAGyq1gHl7e5e60PWmAQAA4PpKPQTp6ekpX1/fay507tw543vBOAQJuI67HqJg3JUZ4y73\nEm46bmf72V/GXVRU5JRAAAAA7q7MK+EDAADg1qKAAQAAGEYBAwAAMIwCBgAAYFipJ+EDuJq/f7BO\nn85xdYyb4ucXpLy8k66OAQBurVxfxl0RcBkKVATu+nFtxl2ZMe5yL8G4K7GK1xF+9pXwAQAA4BwU\nMAAAAMM4B+wmues5Qe46bgAAbgXOAbtJ7nrsnHFXZoy73Esw7kqMcZd7CTcdt7NxDhgAAEAFQwED\nAAAwjAIGAABgGAUMAADAMAoYAACAYRQwAAAAwyhgAAAAhrmkgOXm5urhhx9W06ZN1axZM23ZskUn\nT55UXFycGjVqpB49eig3N9cV0QAAAJzOJQVs5MiR6tWrl3bu3Klvv/1WTZo00dSpUxUXF6f09HR1\n69ZNU6dOdUU0AAAApzN+JfxTp06pdevW2rt3b4n7mzRpovXr18tut+vIkSOKjY3V999//1NQroTv\nRFw5udxLMO5KjHGXewnGXYkx7oqirN5i/Lsg9+3bpzp16mj48OHaunWr2rRpo9dff13Z2dmy2+2S\nJLvdruzs7KuWnTBhguP32NhYxcbGGkoNAKjqPD2loiKbq2PcFE9PVydwX6mpqUpNTS33/Mb3gH35\n5Zfq0KGDNm7cqLvvvlujRo2Sn5+f3nzzTeXk/PTlzsHBwTp58qcvSmYPmDPxH1O5l2DclRjjLvcS\nbjzuzz5zUhxDunYVr3cFUeG+CzIyMlKRkZG6++67JUkPP/ywvvrqK4WFhenIkSOSpMOHDys0NNR0\nNAAAACOMF7CwsDDVq1dP6enpkqS1a9eqefPm6tOnj5KTkyVJycnJ6tevn+loAAAARhg/B0yS/vrX\nv+pXv/qVCgoKdPvtt2v27NkqKipSfHy8Zs2apejoaC1atMgV0QAAAJzO+DlgPxfngDkT54iUewnG\nXYkx7nIv4cbj5hywyqridYQKdw4YAACAu6OAAQAAGEYBAwAAMIwCBgAAYBgFDAAAwDAKGAAAgGEU\nMAAAAMMoYAAAAIZRwAAAAAyjgAEAABjmku+CBABUXJ6eUlGRzdUxboqnp6sTANdHAQMAlFBUpCrx\nnYhARcYhSAAAAMMoYAAAAIZRwAAAAAyjgAEAABhGAQMAADCMAgYAAGAYBQwAAMAwChgAAIBhFDAA\nAADDKGAAAACGUcAAAAAMo4ABAAAYRgEDAAAwjAIGAABgGAUMAADAMAoYAACAYRQwAAAAwyhgAAAA\nhnm5OgAAAHAdT0+pqMjm6hg3xdPT1QluHAUMAAA3VlQkffaZq1PcnK5dXZ3gxnEIEgAAwDAKGAAA\ngGEUMAAAAMMoYAAAAIZRwAAAAAyjgAEAABhGAQMAADCMAgYAAGAYBQwAAMAwChgAAIBhFDAAAADD\nKGAAAACGUcAAAAAMo4ABAAAYRgEDAAAwjAIGAABgGAUMAADAMAoYAACAYRQwAAAAwyhgAAAAhlHA\nAAAADKOAAQAAGObl6gAAUFF5ekpFRTZXx7gpnp6uTgDgWihgAFCKoiLps89cneLmdO3q6gQAroVD\nkAAAAIZRwAAAAAyjgAEAABhGAQMAADCMAgYAAGAYBQwAAMAwChgAAIBhFDAAAADDKGAAAACGUcAA\nAAAMo4ABAAAYRgEDAAAwjAIGAABgGAUMAADAMJcUsKKiIrVu3Vp9+vSRJJ08eVJxcXFq1KiRevTo\nodzcXFfEAgAAMMIlBWzGjBlq1qyZbDabJGnq1KmKi4tTenq6unXrpqlTp7oiFgAAgBHGC9jBgwe1\natUq/eY3v5FlWZKkFStWKCEhQZKUkJCgZcuWmY4FAABgjPECNnr0aP3lL3+Rh8dPD52dnS273S5J\nstvtys7ONh0LAADAGC+TD/bRRx8pNDRUrVu3Vmpq6jXnsdlsjkOTV5owYYLj99jYWMXGxt76kAAA\nADcoNTW11G5zLUYL2MaNG7VixQqtWrVK58+fV15enoYMGSK73a4jR44oLCxMhw8fVmho6DWXv7yA\nAQAAVBRX7hhKTEy87vxGD0FOnjxZmZmZ2rdvnxYsWKD77rtPc+fOVd++fZWcnCxJSk5OVr9+/UzG\nAgAAMMql1wH78VDj2LFj9cknn6hRo0b69NNPNXbsWFfGAgAAcCqjhyAv16VLF3Xp0kWSFBwcrLVr\n17oqCgAAgFFcCR8AAMAwChgAAIBhFDAAAADDKGAAAACGUcAAAAAMo4ABAAAYRgEDAAAwjAIGAABg\nGAUMAADAMAoYAACAYRQwAAAAwyhgAAAAhlHAAAAADKOAAQAAGEYBAwAAMIwCBgAAYBgFDAAAwDAK\nGAAAgGEUMAAAAMMoYAAAAIZRwAAAAAyjgAEAABhGAQMAADCMAgYAAGAYBQwAAMAwChgAAIBhFDAA\nAADDKGAAAACGUcAAAAAMo4ABAAAYRgEDAAAwjAIGAABgGAUMAADAMAoYAACAYRQwAAAAwyhgAAAA\nhlHAAAAADKOAAQAAGEYBAwAAMIwCBgAAYBgFDAAAwDAKGAAAgGEUMAAAAMMoYAAAAIZRwAAAAAyj\ngAEAABhGAQMAADCMAgYAAGAYBQwAAMAwChgAAIBhFDAAAADDKGAAAACGUcAAAAAMo4ABAAAYRgED\nAAAwjAIGAABgGAUMAADAMAoYAACAYRQwAAAAwyhgAAAAhlHAAAAADKOAAQAAGEYBAwAAMIwCBgAA\nYBgFDAAAwDAKGAAAgGEUMAAAAMMoYAAAAIZRwAAAAAyjgAEAABhGAQMAADDMeAHLzMxU165d1bx5\nc91xxx164403JEknT55UXFycGjVqpB49eig3N9d0NAAAACOMFzBvb29Nnz5d27dv1+bNm/XWW29p\n586dmjp1quLi4pSenq5u3bpp6tSppqMBAAAYYbyAhYWFqVWrVpKkWrVqqWnTpjp06JBWrFihhIQE\nSVJCQoKWLVtmOhoAAIARXq588IyMDH399ddq3769srOzZbfbJUl2u13Z2dlXzT9hwgTH77GxsYqN\njTWUFAAAoHSpqalKTU0t9/wuK2D5+fnq37+/ZsyYIT8/vxLTbDabbDbbVctcXsAAAAAqiit3DCUm\nJl53fpd8CvLixYvq37+/hgwZon79+km6tNfryJEjkqTDhw8rNDTUFdEAAACczngBsyxLjz32mJo1\na6ZRo0Y57u/bt6+Sk5MlScnJyY5iBgAAUNUYPwS5YcMGpaSkqGXLlmrdurUkacqUKRo7dqzi4+M1\na9YsRUdHa9GiRaajAQAAGGG8gHXq1EnFxcXXnLZ27VrDaQAAAMzjSvgAAACGUcAAAAAMo4ABAAAY\nRgEDAAAwjAIGAABgGAUMAADAMAoYAACAYRQwAAAAwyhgAAAAhlHAAAAADDP+VUQAKh9PT6moyObq\nGDfF09PVCQDgJxQwAGUqKpI++8zVKW5O166uTgAAP+EQJAAAgGEUMAAAAMMoYAAAAIZRwAAAAAyj\ngAEAABhGAQMAADCMAgYAAGAYBQwAAMAwChgAAIBhFDAAAADDKGAAAACGUcAAAAAMo4ABAAAYRgED\nAAAwzMvVAVA5eXpKRUU2V8e4KZ6erk4AAHBXFDD8LEVF0mefuTrFzena1dUJAADuikOQAAAAhlHA\nAAAADKOAAQAAGEYBAwAAMIwCBgAAYBgFDAAAwDAKGAAAgGEUMAAAAMMoYAAAAIZRwAAAAAzjq4iA\nG8B3YAIAbgUKGHAD+A5MAMCtwCFIAAAAwyhgAAAAhlHAAAAADKOAAQAAGEYBAwAAMIwCBgAAYBgF\nDAAAwDAKGAAAgGEUMAAAAMMoYAAAAIbxVUQ3ie8GBAAAN4oCdpP4bkAAAHCjOAQJAABgGAUMAADA\nMAoYAACAYRQwAAAAwyhgAAAAhlHAAAAADKOAAQAAGEYBAwAAMIwCBgAAYBgFDAAAwDAKGAAAgGEU\nMAAAAMMoYAAAAIZRwAAAAAyjgAEAABhGAQMAADCMAgYAAGAYBQwAAMAwClgF9803rk7gGozbvTBu\n98K43Yu7jrssFaqArV69Wk2aNFHDhg318ssvuzpOheCuf7iM270wbvfCuN2Lu467LBWmgBUVFWnE\niBFavXq1duzYofnz52vnzp2ujgUAAHDLVZgClpaWppiYGEVHR8vb21uDBg3S8uXLXR0LAADglrNZ\nlmW5OoQkLVmyRB9//LHef/99SVJKSoq2bNmiv/71r5Ikm83myngAAAA35HoVy8tgjusqq2BVkJ4I\nAABw0yrMIciIiAhlZmY6bmdmZioyMtKFiQAAAJyjwhSwtm3bavfu3crIyFBBQYEWLlyovn37ujoW\nAADALVdhDkF6eXnpzTff1P3336+ioiI99thjatq0qatjAQAA3HIV5iR8AAAAd1FhDkECpbl48aKr\nIxhnWZY+/fRTV8cw7uzZs3rjjTdcHcO4oqIijRs3ztUxYEhBQYHuvfdeV8dwCXfcnpeGAlZJbNmy\nRQ899JCrYxiVl5enl19+WdHR0a6OYtyFCxfUvXt3V8dwmlWrVunVV1/V+vXrJV16rRMTExUVFaX3\n3nvPxenMu3jxoiZNmuTqGMa543ZNkoqLi/XFF1+4OoZR7rw9Lw0FrALJy8vTc889p969e2vixIkq\nLi5WWlqaunbtqvvuu09hYWGujugU27dvV7t27VSzZk3dd999On78uF577TXVr19fS5Ys0fTp010d\nEbfQn/70J8XHx2vx4sXq3bu3pk2bpubNm2vt2rVKTk7Wd9995+qIuIXcdbvmrtielx/ngFUgQ4YM\n0bZt29SjRw+tXr1at99+uz799FM988wzGjVqlGrXru3qiE7RrVs3RUVFacCAAZo/f742btyoatWq\n6Y033qjSe4Gu5/z58/L19VVxcbGro9xy0dHRWrp0qdq0aaPNmzerY8eOmjZtmkaPHu3qaC5TlV9v\nd92uXU9Vfr3ZnpcfBawCCQsL09atW2W323Xw4EFFRUUpNTW1yp8rEBwcrKysLFWvXl1nzpyRv7+/\nMjIyVK9ePVdHc6rrbXzPnz+vWrVqVckNtJ+fn06fPu247evrq/z8fHl4VO0d8uvWrSv1gtMFBQXq\n1atXlXy93XW79tJLL8lms111EXGbzabCwkJNnTq1Sr7e7ro9/zkoYBXIlW9M/v7+ysvLc2EiM64c\nd1BQkHJyclyYyIzyFI6quIH28/PTqVOnJF36sEHt2rV14sSJEvNUxTIWHR1d5jd+7Nu3z1Aac9x1\nuzZs2LBSX2/LsmSz2TR79mzDqZzPXbfnP0eFuQ4YLn0S6sdPvlmWdc1Pwt13332uiOZUBQUFjk+A\nWZal8+fPa9y4cY7/HG02myZOnOjKiE6xd+9eV0dwiTNnzsjLq+Sm5/LbNptNRUVFpmM5XUZGhqsj\nuIS7bteSkpKuO70q/o1L7rs9/znYA1aBXPkf8o//JV2uKv6HfOV/ipePuyr/p1hcXKz8/Hz5+/tf\nNS0vL0+1atWqknuCylNE3OmTUidPnlRwcLCrYziNu27XSvPtt99qzpw5mjdvnrKyslwd55Zz1+35\nz0EBA1xk+vTp+u9//6uUlJSrpg0ZMkR33323fve737kgmXO5a/EsLCzUW2+9pR07dqhDhw7q37+/\n7r//fm3evFl169bVihUr1KZNG1fHhBMcPXpU8+bNU3JysrZu3arOnTtrxIgRGjBggKujGVdUVCRP\n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\nHmmkXgAAAABJRU5ErkJggg==\n"
}
],
"prompt_number": 29
},
{
"cell_type": "code",
"collapsed": false,
"input": "",
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment