Skip to content

Instantly share code, notes, and snippets.

@blahster
Last active July 30, 2016 08:33
Show Gist options
  • Save blahster/a67c0d8f9bad9e85a663cadca5bbd9d7 to your computer and use it in GitHub Desktop.
Save blahster/a67c0d8f9bad9e85a663cadca5bbd9d7 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Hello word count in Spark (RDD version)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"from pyspark import SparkContext\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import numpy as np\n",
"sns.set(rc={\"figure.figsize\": (16, 10)})"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"sc = SparkContext('local[*]', \"Movies\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1::Toy Story (1995)::Animation|Children's|Comedy\r\n",
"2::Jumanji (1995)::Adventure|Children's|Fantasy\r\n",
"3::Grumpier Old Men (1995)::Comedy|Romance\r\n",
"4::Waiting to Exhale (1995)::Comedy|Drama\r\n",
"5::Father of the Bride Part II (1995)::Comedy\r\n",
"6::Heat (1995)::Action|Crime|Thriller\r\n",
"7::Sabrina (1995)::Comedy|Romance\r\n",
"8::Tom and Huck (1995)::Adventure|Children's\r\n",
"9::Sudden Death (1995)::Action\r\n",
"10::GoldenEye (1995)::Action|Adventure|Thriller\r\n"
]
}
],
"source": [
"!head data/movies.dat"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"['toy story',\n",
" 'jumanji',\n",
" 'grumpier old men',\n",
" 'waiting to exhale',\n",
" 'father of the bride part ii',\n",
" 'heat',\n",
" 'sabrina',\n",
" 'tom and huck',\n",
" 'sudden death',\n",
" 'goldeneye']"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"movies = sc.textFile(\"data/movies.dat\")\n",
"# Split on '::', take the second element, split on '(' and take the first to get just the name of the movie\n",
"names = movies.map(lambda line: line.split(\"::\")[1].split('(')[0].strip().lower())\n",
"names.take(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ignore the next cell. \n",
"That was an unnecessary step"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# rrr = names.map(lambda line: line.split(' '))\n",
"# ttt = rrr.flatMap(lambda line: [(x, 1) for x in line])\n",
"# qqq = ttt.reduceByKey(lambda a, b: a + b)\n",
"# qqq.sortBy(lambda r: r[1], ascending=False).take(10)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [],
"source": [
"word_hist = (names.flatMap(lambda line: line.split(\" \")) # Convert to a list of words (i.e. separated by space) \\\n",
".map(lambda w: (w, 1))# For each word, emit (word, 1)\n",
".reduceByKey(lambda x, y: x + y) # Add up the 1s to get the number of occurrences\n",
".sortBy(lambda r: r[1], ascending=False).take(100)) # Sort on occurrences descending"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[('the', 1241),\n",
" ('of', 361),\n",
" ('a', 164),\n",
" ('and', 147),\n",
" ('in', 145),\n",
" ('to', 84),\n",
" ('on', 63),\n",
" ('man', 53),\n",
" ('love', 49),\n",
" ('my', 47),\n",
" ('for', 41),\n",
" ('i', 40),\n",
" ('from', 37),\n",
" ('&', 37),\n",
" ('night', 32),\n",
" ('with', 31),\n",
" ('life', 29),\n",
" ('big', 28),\n",
" ('last', 27),\n",
" ('ii', 27),\n",
" ('2', 27),\n",
" ('it', 26),\n",
" ('dead', 25),\n",
" ('little', 25),\n",
" ('time', 23),\n",
" ('house', 22),\n",
" ('american', 22),\n",
" ('part', 22),\n",
" ('is', 21),\n",
" ('city', 21),\n",
" ('day', 21),\n",
" ('an', 20),\n",
" ('two', 20),\n",
" ('you', 20),\n",
" ('new', 19),\n",
" ('story', 19),\n",
" ('blue', 19),\n",
" ('about', 19),\n",
" ('men', 19),\n",
" ('all', 19),\n",
" ('king', 18),\n",
" ('up', 18),\n",
" ('black', 18),\n",
" ('me', 18),\n",
" ('man,', 18),\n",
" ('star', 18),\n",
" ('death', 17),\n",
" ('one', 17),\n",
" ('ii:', 16),\n",
" ('blood', 16),\n",
" ('lost', 15),\n",
" ('three', 15),\n",
" ('red', 15),\n",
" ('days', 14),\n",
" ('at', 14),\n",
" ('iii', 14),\n",
" ('best', 14),\n",
" ('that', 14),\n",
" ('white', 14),\n",
" ('return', 14),\n",
" ('back', 14),\n",
" ('mr.', 13),\n",
" ('woman', 13),\n",
" ('great', 13),\n",
" ('2:', 12),\n",
" ('world', 12),\n",
" ('movie', 12),\n",
" ('adventures', 12),\n",
" ('heart', 12),\n",
" ('high', 12),\n",
" ('friday', 12),\n",
" ('down', 12),\n",
" ('home', 12),\n",
" ('first', 12),\n",
" ('party', 12),\n",
" ('or', 12),\n",
" ('who', 12),\n",
" ('secret', 11),\n",
" ('murder', 11),\n",
" ('young', 11),\n",
" ('out', 11),\n",
" ('boys', 11),\n",
" ('story,', 11),\n",
" ('by', 11),\n",
" ('girl', 11),\n",
" ('be', 11),\n",
" ('wild', 10),\n",
" ('fire', 10),\n",
" ('beach', 10),\n",
" ('sea', 10),\n",
" ('girls', 10),\n",
" ('way', 10),\n",
" ('die', 10),\n",
" ('mrs.', 10),\n",
" ('street', 10),\n",
" ('3', 10),\n",
" ('children', 10),\n",
" ('dog', 10),\n",
" ('seven', 9),\n",
" ('summer', 9)]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"word_hist"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\ncP7f//t/lX/rq6+vz29/+9skyeuvv54VK1ZUjX/55Zc3+P4NDQ0ZM2bMO2rj23HyySfnrLPOyh13\n3JHTTz+9atyll17arL6lYe3lC1/4Qk3DNmbRokX53e9+l9dee61q+Ny5c6tet7QsX3PNNVm2bNlG\n/20ujY2NmTJlSq666qokyeLFizNv3rxNeo9nnnmm1WEPPfRQVq5cmSSZMmVKLr744tTX11fVfP3r\nX8+9996bNWvWbPCzGhoaNqltG7JgwYJcf/31uf7667NgwYK3/T5PP/10qzW1fK8mq1atanH4v/3b\nv9U0LKltm9JWVqxY0Wx71KSl5balZeX111/PE0888bbbsGbNmtxxxx1v++9Ladq/tTZsQ8vE27Fm\nzZoW51etbWnNQw891Oqw1atXN6tpaVgtGhoasmTJkixevLjyb10tLW+bun2rxaasn+1tQ/O81ja3\nNo3/6Z/+KX/+85/fcTtr2RdtaP+5KTp16tRmD+Nsbb2p5firpf39m2++WVXTlutMazZlf9Ue3un+\noS2157Rp7bhq3rx5lfXj8ccfzy9/+cvMmTNns7drQ9pyvUoKXil98cUXc/nll+f555/PL37xizz+\n+ON55JFHMmrUqPzhD3/IkiVL8utf/zrHHntss5+j2WWXXSr/v/baa3PrrbfmhBNOyHXXXZdFixbl\niiuuSJLsu+++6dSp0wbb8PDDDzd7XV9fX3UAfOyxxyZJ7rjjjlx66aU54IAD0tjYmPHjx+f888/P\nsGHDqt5j9erVmTlzZurr6/PWW29Vhn/961+v/P/SSy/Nv/3bv2XAgAHp3LlzZfi6V3dvvvnmTJ48\nOcuXL8+sWbPy3HPP5bvf/W7VhvjEE0/MwIEDM3LkyBx88MFV37Vz585ZvHhxVq9enR122KHF73/S\nSSflpptuajadGhsb06lTp8r0eeWVV3L77bc3mzbjxo3LqlWr0qVLl2y//dpFaerUqbnxxhszZsyY\nXH755VWf1xSw1zV37txmG/iNzYckefLJJ/O9730vL730UqZPn54FCxZk9uzZOeussyo13//+95t9\nVteuXbP33nvn05/+dFatWpWXX345y5cvryxfK1asyJIlS5Ik55xzTq688soMHz68xWk3bdq0XHvt\ntbnhhhsyYMCALFiwIGPHjs3hhx+eJLniiity8MEHV+pvv/32ZoH3N7/5Ta655pp06tQpjY2N+etf\n/5qdd945ydppvttuu2X27NlVf9Pad69l2iTJ9773vWy33Xb5z//8z3z961/PTjvtlLPPPju//vWv\nkyR33XVNEd4IAAAgAElEQVRXfvzjH+ell15KY2Njs2UiSb7xjW/kN7/5TdX7nnPOObntttuqPmfq\n1KlZsGBBfvnLX2bUqFH59re/neuvv75Sc/LJJ+fXv/51vv/972fYsGGpq6vLHnvsUfW+Rx55ZI48\n8siMHDkyH/rQh1qcJ0uXLs3NN9/cbN27+OKLk6w9iLnllltyxBFHJFl7EHHCCSfk1FNPrZpPLVl3\n+UuSsWPH5rnnnss+++yTQYMGZdCgQfnIRz5SVVPL93r44Yczbty4rFy5Mvfee28WLFiQf/3Xf833\nvve9JMnEiRPzmc98pupvWhq2oW3KV77ylRa3gS3Nz1/+8pfN6prWmY9+9KNJ1u4QL7zwwrz22mtp\nbGxMt27d8sMf/jB777135W/OPPPM/OIXv6j0mHj88cfzzW9+M9OnT6/UzJ49O5dccknefPPNzJ49\nO3/6059y5ZVXZsKECc3a0GT+/Pnp1atXevfunSTZbrvt8otf/CJHHXXUBv8mqW1ZrnW9OeOMM3L1\n1Vc3ez1+/PiN7mvGjRtX+f/jjz9eNa6hoSF/+MMfKq9bWybOPPPMjX7fpmk4ZsyYXHTRRdluu+1y\n/PHHZ8WKFTnttNPypS99aYNteeutt6ra8oMf/CAXXnjhBj+z6bO+//3vN9sWrD/sxBNPbFaz/rCN\nHRc0ue6663LVVVelZ8+e2W67/z6vPm3atMr/v/GNb2TChAmVZeWBBx7I+PHjq2pasv78bW1fVOv6\nmSSTJ0/OiSeeWPV64cKFNS83SevLaS3zvJY21zKNBwwYkO985ztpaGhIXV1djjnmmHTr1q3qfWtZ\n91rbFyUb3n+uO6yuri4jR47MMccck+7du7c4Pf/mb/4m8+bNy8c+9rEWxz/33HMZP358HnrooXTq\n1CmDBg3KhRdemD59+lTVtbYO13L8VVdX12yf37Nnz/Ts2TPjx4/P3nvvXdM6k6zdt40cOTI77bRT\nLrzwwvzpT3/KmDFj8qlPfarFz15/W5psfH911113tfg+TY488sjK/ze2Dtf6PrXuH2o53n7jjTdy\n66235s9//nNVb8qm44Ik+dGPfpSzzjor73rXu/KlL30pjz32WC644IJ89rOfbXXa1PK9W/PCCy9k\n1113TbLx46qrrroqc+fOzVtvvZWDDjoojz76aD7xiU9k4sSJ+eMf/5ivfvWrlb958sknM2nSpCxe\nvLhq2lx77bWV/7d0fNutW7fsvffe+epXv5oePXrkoYceylVXXVV5n6Z1+O677678TWvr1aYoFkr/\n/u//PnV1dZWFbPfdd8+5556bUaNG5XOf+1z+7u/+Ls8880zq6uoqf9PSxNhhhx3yrne9K8naBXTA\ngAF58sknkySPPPJIkuQnP/lJdt1118oCNnXq1LzwwgtV7TnvvPPyzDPPZODAgZWDuk6dOlV2QBMm\nTMitt96a973vfUnWHgD/3d/9XbNQ+tWvfjXdunXLXnvttcGN0axZs3LnnXducHyS3HDDDbnlllty\nwgknVKbP0qVLq2pmzpyZ3/72t5WV5TOf+UyOO+64/I//8T+SJP369ctJJ52UQw89NDvuuGPl7774\nxS8mSW666aaq6bQhX/nKV/Lxj388H/7wh6t2UMnaK4v//M//XFmh/v3f/z033XRTJk2alF/96lf5\nzGc+kxtvvDE33XRTnnnmmaqV4LXXXst+++1X9X6tzYck+c53vpPzzz8///AP/5AkGThwYP73//7f\nVQeQb7zxRp544onK/LnrrrvygQ98IAsWLMivfvWrLF68OM8//3zq6uoqobRr1675/Oc/nyS58MIL\nk2SjB8m33HJLbrvttuy000559tln841vfCP19fX5whe+UHnP6dOnZ/r06Xn22WerDuxee+21dO/e\nvRKCxo0blyOOOCKDBw9OksyZM6dqOa/1u9cybZK14eI3v/lNZbp279696iztpZdemgkTJmTAgAHN\n2rBo0aI8/vjjefXVV6t2MitWrKja6CfJ9ttvn06dOmXWrFk55ZRTMmrUqNx6661VNQceeGAOPPDA\nvPrqq5k+fXq++MUvZrfddsuoUaMyYsSIdOnSJVOmTMkdd9yRcePGZc2aNRk5cmSOPvroSvBJkrPO\nOiv/63/9r/zt3/5tVTBrcuutt+bmm2+urAtf/vKXc+KJJ1aF0vnz51f+/8Ybb+R3v/td9tprr2ah\n9Prrr8/q1aszf/78PPDAAznjjDOycuXKPPDAA5v0vS6++OJMmjSpsjMZOHBgHnzwwcyZMydz587N\nkiVLqk6wrFixosXvVss2pTW///3v8/vf/z6HHHJIkuSee+7JRz7ykfzrv/5rhg0bli9/+cu58MIL\n893vfjeDBg1Kkjz44IO54IILqg5WzzzzzJx55pm5+uqr8+STT+bb3/52fvzjH1d91lVXXZVbb721\nMu0/+tGPNruCvr7rr78+jz32WHbffff85Cc/SbJ2Gk+aNClHHXVU3vOe91Rq1z1xubFluUmt6834\n8eNbfN0Uyh9++OE8/vjjlaB85513Vj736quvzoQJE/LGG29UtnuNjY3ZYYcdKtv5JBtcJpqMHj06\nydpt2osvvpgRI0YkSWbMmFHZPyVrD5y7du2aqVOn5uCDD86YMWNSV1eXL33pSy22JUm6dOlS1Zam\nfWbTZ67vkUceySOPPJKlS5dWndRYsWJFJci98MILWbJkSV5//fX88Y9/rDoJuP7V4I0dFzS59tpr\nc+edd6ZHjx4ttilJLrroopx11lmZMGFC/vjHP+ayyy7LxIkTN1jfZN35u7F90aaun0nz33pvbGys\nablZV2vL6cbm+aa0uZZpPGrUqIwaNSpPPPFEbrvttowYMSL77bdfRo0alU9+8pNJalv3NrYvam3/\nua4rrrgit912W44//vjsvffeqaury6c+9amq0P/oo49m6tSp6du3b9X2omn7dcEFF+SYY47JlVde\nmWTtseIFF1xQWbbXX2+a5un663DS+vHXgQcemKFDh+bTn/50kuS+++7LXXfdlbq6uowbNy7f//73\na1pnkuTXv/51vvCFL+T//t//m1deeSU/+tGPcv75528wlG5oW7qh/dUDDzzQ7NhvXeuG0o2tw/fc\nc0+S5KWXXsojjzxSWU7uv//+7LvvvpX3qXX/UMvx9nnnnZc99tgj9913X772ta9l2rRpzQLlf/zH\nf+T888/Pv//7v6dv37656qqrcsopp1S2f7Xsy2vZdm3IhRdemG9/+9utHlfNnDkzt99+e1avXp2D\nDjooc+fOTdeuXXP66adn1KhRVaH0nHPOyec+97mccMIJG5x3n/70p9O5c+ccc8wxSdZefFu1alV6\n9uyZCy64IBMmTMiFF16YCy64IHvvvfcG3+fRRx/NtGnT8v73v7/F9WpTFAulL7/8co466qjKjmL7\n7bevfOHTTjstp512Wr773e/mpJNOqnRD23///TNw4MCq9+nTp09eeeWVHH744fniF7+YnXfeOe9/\n//urambPnp2pU6dWXp988skZMWJEzjnnnMqw3//+97njjjs2eNaysbGxaoe/yy67NNvJJGu70E2a\nNGmj371fv3558803N3oAucMOO1SNX/dMR5NOnTrloIMOykEHHZT//M//zHnnnZcbb7wxAwcOzJgx\nY/LBD34wH/zgB9PY2Nise+mmeOONN3LBBRe0OO7111+vBNLJkyfn5ptvzjXXXJP3vve9lQPR4cOH\n5+CDD87ll19e1aVlp512qjp4TFqfD8nabm3rn5FZf6f62GOP5aabbqoMP+mkk3LKKafkxhtvzPDh\nwzN79uxcd911VYFkXb169UqS9O3bd4PtWLNmTXbaaackyQc+8IFcd911+cY3vpHFixdXlo199903\nu+66a15++eWqA7uddtqp6srao48+WnWgMHjw4GYH8rV891qmTbJ2fWtoaKhM56VLl1ZtcN73vvdt\n8EDiySefzL333ptXX321spNp+k7rH7TvtNNOufrqqzNt2rRcf/31WbNmTYvL8ssvv5ypU6dmypQp\n+ehHP5oRI0bkoYceyu23357rrrsuXbt2zQknnJATTjghDzzwQMaMGZOLL744Q4cOzVlnnZX+/ftn\n1apVrXY9XHdatDRdvvOd71S9fuWVV3Luuec2q3vwwQfz0EMP5cEHH8yrr76aIUOGVILapnyvJM3u\nxdhuu+3Su3fv7L333pk9e3b22muvqunZ0rq4oW1Ka13A113/nnvuucpJliQ5++yzc8YZZ+SGG25I\nXV1dvvzlL6dz585V33PQoEGVXhJNhgwZkrfeeiunn356XnvttVx11VWVE2VNtt9++2ZXVVpzySWX\nJElVl8Sm7rs33HBDZdj6Jy43tiw3qXW9adourP/6uOOOS7L2RN+NN95YmSaf+9zncsoppyRZexXu\njDPOyGWXXdZq176WlokmBxxwQJK13SfX7ZVw6KGHVp3Efeutt/Lmm29m1qxZ+fznP58uXbpU1vd1\n2/KlL30pTz31VOXAZ91tb1NoavrM9T3wwANZuXJlGhoaqvYxXbt2zU9/+tMkaw+2b7vttjz33HNV\nVyd22mmnfOtb36p6v40dFzTp06dPq8vOxz72sYwbNy6jR4/Ou971rvzqV7/Ke9/73sr4hoaGnH/+\n+bnsssuq/m7d+buxfdGmrJ+LFi3K888/3+yqxPvf//5Kb5qNLTfram053dg835Q21zKNk7XT8Ykn\nnsgTTzyRHj165CMf+Uh+9atfZfLkybniiitqWvc2ti+qdf+ZJP3798+5556bc845J/fcc0/Gjh2b\nzp07p66uLqeddlp22WWXTJo0Ka+88krlJM/+++9f9T2XLl2akSNHVl7X1dVV9U7blHW4teOv9ff5\nn/rUp3LJJZfkH//xH7Ns2bJccsklNa0zyX+f8JgzZ04++9nPZs8992zx+LRJS9vSZO36N2XKlEyd\nOrVqf7V48eJcc801ufPOO1vtmbKxdbjpu4wePTozZsyorG/PP/981TJY6/6hluPtp59+Oj/96U9z\n991357jjjssxxxzTbN1qOoF27733ZtiwYS1+dmv78lq2XRsyceLEzJo1q9Xjqs6dO6dz5855z3ve\nkw9+8IOVk/Lvfve7m33W9ttvn5NPPnmjn/u73/2u6qrsRz7ykRx33HH5zW9+U9ledevWrXKxZENa\nmwebolgo3XHHHfPyyy9XNkT/9V//1WxB2GOPPXLeeefliCOOSGNjY4vd7f75n/85ydoDqE984hN5\n9dVXK2ee1v2sqVOn5uijj06nTp0yffr0qjNXSbLnnnvmhRdeaHbQ0eTTn/50Tj/99Bx99NFJ1h4M\nrds9s8m+++6bxx57rNkGc13vec97cuyxx+Zv//Zvqw4i1+2qs//++2fChAl5/fXX8x//8R+58cYb\nc+ihh1a9z7orSc+ePfOd73wnhx56aP70pz/lnHPOqXT9bNogNh1sbqrPfvazufnmmzNkyJCq9u6y\nyy7ZZZddctVVV+Wvf/1rZs2albvuuivdu3fP888/Xznb2a1bt3Tr1i2XX355Ghoa8uKLL6ahoSEr\nV67MypUrq04itDYfkqRHjx55+umnK8vOnXfeWQnGTZYvX56VK1dWlqlVq1Zl2bJl6dy5c+U79OzZ\ns/Jgpp/97GeV7g977bVXTV2b3/e+9+VPf/pTpWtjUwAbO3ZsFi5cmGRtqO3bt28mT5680Wncq1ev\n/OxnP6tc9Zg2bVqL06C1717LtEmSU089NV/72tfy0ksv5Yorrsidd96Zb37zm5Xxe++9d775zW/m\n8MMPr5rnRx55ZA4//PAccsgh+fnPf95qV8Irrrgi06dPzw9+8IPsuuuuWbx4cbN7jb/2ta/lySef\nzGc/+9lMmDCh8r2POuqoykF2Q0ND7r333tx2222pr6/P6NGjM3z48Dz44IP5yle+kpkzZ2bIkCGZ\nM2fOBjegdXV1GTVqVKX77qxZs6oOQFrynve8J88++2yz4aeddlr22muvnHHGGTn44INbPMFUy/fa\nbbfd8vDDD6dTp0558803c+2112bAgAEZOHBgBg4cmOHDhzcLfRtqZ0vblNmzZ1e6hzdper1+eHvp\npZeq/rZLly558cUX8+53v7syfP/9988//MM/VLald9xxRw444ID84Q9/yM9//vP07Nmz8vevvvpq\n+vXrVwmM627fPvShD2XatGlpaGjIU089leuuuy777rtvs++1ZMmSZt0n173NYf3u7etqOtu8sWW5\nycbWm1q68jdZvnx5VqxYUQn7K1euzPLly6vqhwwZkpUrV2bHHXfMlClT8sc//jGnnXZa5QTYhpaJ\n9a1atSrPPPNM+vXrl2TtfUfrXkU58cQTc+ihh2bgwIHZf//9U19fX9WzIFl7MuPzn/98nnvuuQwc\nODCPPvpo/uf//J+VLl61fPcDDjggxx13XKX9a9asycqVKyufddxxx+W4447LzJkzM3To0Bbfp0kt\nxwX9+vXLqaee2mx/9MUvfrHZ9uj1119Pt27dMnbs2CT/3fOllu6VG9sXNa2fxxxzTLp06bLB71Pr\nLR61LDdJ69v3jc3zgQMHZs8998x9991XOYmyvqYrghubxk1++MMf5t57780nP/nJnHnmmVVhuWk+\n17LubWxf1LT//OUvf1k58H7yySfzxBNP5MMf/nCz9i9YsCC33XZb5syZk6FDh2b48OF56KGH8oUv\nfCFTpkzJrFmzcuutt27wmHKXXXbJlClTKleOpk+f3uzEeZKce+65mTJlSp599tl87Wtfy1//+te8\n8MILVdOgqQvpqlWrqq4eNdl1110zceLEqmPKnj17pqGhIT169Mh1111X0zrTNJ1Hjx6dZ599NmPG\njMmKFSuqQsrXv/71HH/88Tn44IOrhq+7PVh3f3X11VdXlqum/VWtt0vUsg7/9a9/rVqvevbsWXXP\ncq37h1qOt5v2nzvvvHMWLlyYnj17NnsmzJAhQzJs2LC8+93vzve+970sXbq00gNz/WmzoX15Ld87\nWRuS+/Tpkx122CH3339/HnvssRx77LE5/PDDc/jhh+eRRx5p8bsma/fJTcvTuickX3311Wah9JBD\nDskNN9yQI444otlxe5OGhoaqbrfz5s2r7GubTnZ94hOfyCWXXJIjjzyy6n3WPbHVt2/fPPjgg/nL\nX/6SkSNHZunSpW/7Qlinxo2dTtmM/vCHP2T8+PH585//nD333DMvv/xyrrzyyqorocOHD8/kyZMr\nAXLlypU58cQTN/mS8LPPPpsf/OAHlR39fvvtl7Fjx+YDH/hApebUU0/NggUL8rGPfaxqJ9O0E7v0\n0kvz8Y9/vPLwhkGDBuW//uu/ml2ZOeqoo/KXv/wlH/jAB6pm4LptXr+/eJN1dxRr1qzJrbfemvvu\nuy/J2rNoo0aNqgpIQ4cOzYgRI/L/2zvzuKiq949/WIQUxJ+aK5G5pKZoIghqiWamgpHIovgtc0Fc\nErdCXHDfcC3NPQ0FNxIVWUolcytfguKKZAuIQoogLiCyycz8/pjXPd079869Z2AEyfP+Jx0nOHPn\n3HOf9fP4+PgIegMAbeSlT58+CA4OJg+3+vXrY+XKlXj77bcprtq/7N27F9988w3pfQD+zUY8fvwY\n+/fvR61atfDmm2/iu+++Q9u2bZGUlITp06cLjJk9e/Zgw4YNkn0qnDHx7Nkz2e8B0Bpf8+bNw5Ur\nV2BjY4M33ngDa9asEWQ1o6KisGXLFri4uECj0eDixYuYMGECBg0ahA0bNmDmzJnw8PBAXFwckpOT\nsX79evj7+2PTpk2Iioqiui7379+HmZmZpNN36dIlODo6UvftPnnyBBs3biQRXCcnJwQGBooeiFKf\nffXq1WQvK/07n/T0dCQmJkKj0aBHjx4Cw1dfZpwftfXx8RGV4lYEKUdS11j88MMP4eLiAh8fH1HJ\n99KlSzF37lw4ODiguLgYFhYWMDc3l+xfSk1NFdzDHTp0EPwsvlGrVquRnp4ONzc3BAUFCd5XUFBA\nRIVSUlJgamqKLl26EGNKrVZj69atovJPXR49eoRly5bh/Pnz0Gg0eO+99xASEkLK5vr27SuZqdEt\n7aY5U548eSJSKednwDZt2oQTJ07gww8/BKB1+Pr27YsxY8Zg3rx5WLt2LTHeuDVx11ij0SAvL09W\n8IC/luLiYmzdulVwvk2aNEnwnevrk9Utqf/rr7+QlpYmEADx9PTUu4c5+HtZ7r7Jzc1F48aN9ZYX\n88+dQ4cOYePGjYJzZ/LkyYLP7uHhgdjYWPz555+YNWsWfH19cfToUdJnrbQnOM6ePYv58+fDzs4O\nGo0G9+7dw6JFi0hQVqVSCa6bRqOBSqUSBDk8PDyIJkNMTAzRZOBEZ2g/O00vI6DNROj2dvH7v2js\nAm5tugQGBgrK56Xg7/fg4GCkp6frLa9UsgkA4Pbt2/j666+RlpYm+Ezc/enh4YHIyEhBi8fgwYMx\ncuRIeHp6kvYNmn0DGHa+c5SXlwu+8//973/YtWuXpDOu79py8L+rQ4cOwc3NTRTgB7RGct26dame\nI4D8swjQBhT37t2LgoICDB8+HPb29qhVq5Yg0+3l5YW6devCx8cHAwYMEHy+wMBAbNy4UdGmvHv3\nLpYsWYKrV6/CxMQEDg4OmDt3rqj6bsGCBaQP9ujRo8jPz8eYMWMEfbBXrlxBSEiI3t7wR48eYdOm\nTeR51LVrVwQGBsLa2hrZ2dlo0aKF7F7no1arcfPmTdjZ2cHGxgaPHz9GTk4OuW+4Nq9r167p7Yk8\nc+YM0tLScPnyZZiamhL7he+crVmzBvXr15dtl+Du4bS0NLRp00byHl68eDHu3LkjcMhbtGhBKpWk\nng9czyfwby+kSqVStLejoqLQv39/0idaVFSEKVOmYPjw4YLP/+TJE9StWxdmZmYoLi5GYWEhse0S\nExNJqbE+aM4uQJvkOXToEO7evYtx48ahb9++SEtLw/bt2wHI943rC6I9evQIDx48EDjnukksQFxF\nxNeIALSJlWXLlqFNmzY4ffo03N3dJasJTUxMBL2pGzduxI0bN5CRkYHjx48jJycHU6dORWRkpOw1\nk6LanFJAe1hmZGRAo9GgZcuWoogj98DkNmJpaSl8fHwqVKeshL6HGfcQ41LauuvTXcvdu3cly0Pk\nykClSEhIEEUpdbl+/Tq2bdsmamTm1uTn54dp06YJ6va/+eYbgzfKhx9+iKioKEH5kz44BdB27dqJ\nDr2PPvoIBw4ckOxToTEmwsPDMXLkSOLwFRUVQa1Wi6L/HLm5uUSlrFOnTiLHnTMK1q5di7Zt28LD\nw0NgKLzMKH12pX/XF63jBx6UWL58OcrLy0UPKNpMM4fUvaX72rNnz6gy/XKO17p169CtWzc4ODhI\nGlKAcB+amZnB1tZWJHLBkZ6ejgsXLiA5ORlXrlxB8+bNBQJOxthLfIXtsrIyYgDxWw84SkpKcO/e\nPdF9B2gfzBEREYKMmIODg0jB8vr166THvGvXrujUqZPg32mMpKKiIlhaWhKHSKVSoaysTLBHUlJS\nsHXrVlEWlH+eDhgwAHFxcbJn4MaNG5GUlIT09HT07t0bZ8+ehaOjIykdBf4NEPGReo1bu9x9Q8OD\nBw9w7do1mJiYoHPnzqKgFbe3N27ciCZNmsDX11fyHqChrKyMKFS2atVKFMgZMGAAvL299ZZQent7\n49ChQxg8eDCioqJgYWGBQYMG4ccffzRoHYMHDyZlf7///jvpZeR/n/Pnz0dJSQmSkpLg6+uL48eP\no1OnTli+fLng83DZMM4u4PpuAe1eWrNmDWbOnCm7nqysLDRu3JjYDiUlJcjLyxM4b0p7WckmALRt\nIVOmTMHy5cuxdetWHD58GGq1mtyfutfy2bNnmDJlCtq0aYPExETExMSQf+P2DQC8++67ksFODn37\nlEZsRckZNwSlcXylpaUCp0bu52RnZwvOAn4mhrs/du/ejZKSEgQEBJA9x8GvGtD3mrFsSm49/DP+\nk08+EbSJ+fr64ttvv8XEiRPJez7++GOB4JsSYWFh5M+lpaU4ffo0WrVqJXLqJ0+eTAQv5UpGuZ7I\nrVu3inoip06dCmtra+LwxcfHo6CgQHCW0jg6paWl2LNnD3777TdYWVmhS5cuGDFihGgfJCQkCOxk\nroKJ5h5X0h+gtbcNEXDSF/zko+TTAP/unR07dsDS0hIjRowQ7KPPPvuM9I1XdN8YytOnTwHA4JYa\njsGDB+PIkSMYMmQIWbOUf0RDtc4pvX79OjFKfv/9dwDCL7ki5XZSKKlyAvp7ZgwR6eHWKFceAihH\nVwGtyEhoaCicnJzg7u6OXr16icr4ZsyYgZkzZ+Ltt9+WPIiKiooE0R0XFxcynsMQWrRoIVl+IkWT\nJk0klQcB+T4V7vqvXr1alH3mVI8PHz6MkSNHElVHKcciPT0drVu3Jkp4XG9WXl4e8vLyBA+6Jk2a\nYP78+Th37hwCAgJQVlZWbXLojx49wvbt20V7gotGSSmj8uEMCjmlZD6cuuGdO3cwf/589O3bF199\n9RWJ1tEo1t28eRMAiCgE8G8EjUZEyxABFHNzc+zdu1d2PfocL25v2dnZIT4+HkuXLoWVlRVRzeXK\n6QDtPszLyyOCR2+99Zbk2j/88EO0atWKRJNDQ0NFzlOPHj1w/Phx9O/fX2+PtFImQTeAM2rUKHh5\neYmcUiW1QjmVcj4dO3ZEkyZNyN65d++eIEvAv+f4RpLuGnfu3EmCCCUlJfD39xcEw4KCgmTPLoCu\n9/748eOIiYmBp6cnQkNDkZeXJzo/aJRh5VQcDQmwANrnGpf9MDExERlyXJl/bGws9u7dK+qzplUC\nLi4uxs6dO3Hv3j0sXboUt2/fRkZGBhGq4sTBQkJC9IqDKWky0H52uV5GjitXriAuLg4eHh4IDAzE\n6NGjERAQIHgPpyzKr+bhO+xmZmai6y2FbpTe1NQUU6dOFWSyXF1dsW3bNtFZyTml+mwCPqWlpejR\no1wfUQYAACAASURBVAcArSE8efJkwf2p1OLBV2wF/n1e5ebmIjc3lzyvYmJiMHjwYL3PAe78pxFb\nodGakGrL4FQ5/fz8YGlpKXne8ku/Aa0x3bBhQ3LWOjo6imyAdevWITo6Gm+++SZ5TTcTo9FoyP5Z\ntmwZAIie1TRq8Eo2JY2tCChrMnDI9YZnZGQgLCxM9Lv4n1tXYMzf31/U/gJo71MldVilnsi///5b\nMGKre/fuolJduXYJjuDgYFhbW2P8+PEAtM7tjBkzBM4t8K+ivi5mZmaSI6b4cE7n1atX0aZNG3Km\nFRYWIj09XeCUygVq+L2bUvCFl6SCn56enjh//jx69OghcnBv374t+Bkc5ubmiI+Px5EjR7BlyxYA\nQs0YWn0DJbjnQ3Z2NpYsWSJ6PgBaZ3Tjxo1Et8fZ2RmTJk0S3KM0gS7uvOfuh4r4GRzV5pTSqKyO\nHj0azs7OZIOGhoaKyu1okFPlVHronjlzhlqkB9AqfPLLQ6QUPmfPnk2iqxERESS6yic0NBTPnz/H\n2bNnER8fj8WLF6Nnz57kQAaABg0aSEauOOzs7LBp0yaB6rBuJJEGrl/NxcVFbw+sHIb0qciNjWnd\nujX69+8vKRoBaLMsu3btwpIlS7BixQrJ75N/4K9btw6//vorxowZAxsbG+Tm5iI4OJjqMxmboKAg\nuLm54fTp01i0aBGio6MFmWna+nw5pWQ+pqamMDc3R0JCAj777DMSreOgUazjhHoqiiECKDTrUXK8\nvL294e3tjQcPHuDo0aMICwvDDz/8IHCcaUc//fzzz4oiBpGRkdi5cyfMzMxgaWkp6cT06dOH/Lm0\ntBQnTpwQ9NrwjVa1Wo0bN25ICkVJqRXye2HlVMo5aMZA0BhJpaWlgqy2lZWVKMigdHYBdL33lpaW\nZC8XFhaiYcOGyM7OBkCnDMshp+JIq1IOaMvbUlJSyPm0e/duXL16VbCfuT7r5cuXS/ZZ0yoBz549\nGx07dsTVq1cBaINsU6dOJUYHjTiYkiYD7Wen6V997bXXAGi/15ycHNSvX5+o4BsSoGrfvj0mTJiA\ngQMHCoIkfONPpVIJvkcLCwvRDEiloO7Vq1exZMkS3Lp1C8+fP4dKpULt2rUF96+FhQXUajVatGiB\nPXv2oEmTJoKzetWqVSKbw9zcHKtWrcKwYcOwYsUKvdeU/7ziroHSc4BGbEW39FOKN954A48fPxaU\nV1pZWeH27duYO3cuVq9eTRXo+vnnn3Hv3j0kJyfj9OnTWLx4MerWrSvIcB49ehQ///yzbPApJCQE\n27ZtQ79+/fD2228jKysLLi4uAAxTg1eyKZUU3DmUNBkA5d5wTh3V19eXWhCnuLgY9+/fF72upA47\nbdo0xZ7IDh064OrVq+jSpQsArRATJ3Smz/Hi4N97cs6tvjGNus/Gd955R/EeB7TjhPiBiDp16ohe\nkwvUhIaGQq1WKwo4yQU/k5OT0aNHD70Oru6aQ0NDERkZiQkTJsDOzg5ZWVlESwSg1wVRgns+cGe3\n7vMB0I62e/vtt0liISYmBrNnzxZUkdAEutzc3DB//nwUFBTgwIEDOHTokEiNmpZqc0ppVFYBbeSe\nn92qCHKqnDQPXU6khxYlhU+l6CpHrVq1yPxRzmDlO6VTpkxBSEiIyGj7+eefsXr1ajg5OeHu3buY\nPHkyAG0PHb9UihauAbuicA/S5s2bo3nz5nj+/LnIQKDJSH/99dd48OAB/P39SYRJF06lbPv27di3\nb59g3phuD0Ht2rXRv39/PHz4kDTZS5U+VgVPnjyBr68vIiIi4OzsDGdnZ0EElzMk9JUicsgpJfPh\nonUxMTGS0ToaxTpAuUdMDkMEUGjWo+R4hYSEID09nUTuv/32W1GQi3b00507dxSzWTROjO7n/vjj\njwWKeXyj1dzcHLa2tkTCn4+UWiH/bKVRKacZA6GLlJFUu3ZtpKamknP7xo0bxCHh0Hd28R/gffv2\nVXRc7e3tUVBQAF9fX3h5eaFOnTpEJOL58+eKyrAcNCqONJw5cwYxMTHEyBwyZAg8PT0FTmmjRo3g\n4eGBlJQUnDp1Cp07dxYEhGgj5ZmZmVi3bh0pD61du7ZA0IpGHIwPTWZQH5xiPoetra0gAAhoAzAF\nBQXw9/eHl5cXTExM4OPjA8CwAFVZWRnq16+PpKQkwev8vdOgQQP88ssvpD/6xIkTon2tFBhZvHgx\nvvnmG5JhPXLkCMl+cMyZMwfFxcWYO3cu1q9fj6SkJKJsCkBv6T8AODo6Yvfu3VCr1bhy5YpkOTmH\nn58fAG0/qFwbDY3YilJVDqA9u/hZ5b59+5JSb85RpQl03b9/H5cvX0ZycjL+/PNPtGnTRvQ527Zt\ni6dPnwqmG/BRqVQ4efKkoJfXzs6OBKcMUYMH5G1KGgV3QFuq27FjR9IHu3nzZlGJ/MKFC7Fs2TLk\n5OTA1dUV7733Hgk0AXTqqHxbSKPR4OHDh3p1CvRlQqOjo9GzZ08SgNLl+fPn8PDwQHl5Ofz8/Mhz\ngd8KcvHiRWrHS865pXkmAnT3OPCvM8thamoqCtoqBWpoBJwsLCz0Bj+trKywc+dOvP322wJRQSnf\nRqVSYcuWLYJeaDs7O4EWw4IFCzBv3jzcunULvXr1In3jhqL0fODes2HDBvL3wMBAksTioAl0+fv7\n49y5c7CyskJGRgamTJmC9957z+A1A9XolNKorBoLJVVOY0JTcqwUXQW0xs3Ro0dx4cIFODs7w9fX\nV2SMHjp0CLdu3UJ5eblgk6SmpiInJwfR0dGIiIgQ3LgVaSEeMmQIysrKyANZX628PmicFNqxMY0a\nNRL0behj5syZsLa2Jpmj+Ph4BAcHC0pNf/nlF6xcuRK5ublo0KABsrOz0apVK4P7qYwBV5rduHFj\nnD59Go0bN5ZUX1QqRZRTSuajFK2jUazT1yNGC1eSdvfuXcmyNH4GnWY9So7XkydPoFKpYGNjg3r1\n6qF+/fqiknja0U+02axffvmF9M04OzsLopRS3L59W/C5aLPRSmqFNCrlNGMg+EaSWq3Go0ePMGnS\nJMF75syZg6lTp6Jx48ZEAEk3g6Lv7OIbHfoUQvlwoiHDhw9Hr169UFhYSIQluOAOXxlWHzQqjrQU\nFBSQ+43r1eGjlI2njZRbWFigpKSEvC8zM1Pk4Lu4uMDf31/QajJw4EDB3FNjQFPixe2TAQMG4IMP\nPkBpaSnZb4YEqHRLKaVYtGgRgoKCsGTJEmg0GjRr1kzgLAJ0gZEWLVoQwShvb294enoKnk9c8MDU\n1JRqXVKYmppiyZIlVP3nw4cPh62tLdzc3NC/f3/RrM5Zs2Zh4sSJyMzMhJ+fHxFb4aNUlQNoy+/4\npfv37t0jJXncs58m0NWnTx906tQJ48ePx+LFiyU/07hx4+Dp6Ym2bdtKCkoplXMaogavBI2tqFKp\nMGjQIL2zZDkaNGggGjnEh0YddevWrUSjpKCgAL179yYOHh8lddiEhAS9zqzcLHaOKVOmAICk42Vt\nbY2bN2+SKjM555abdqBvVBn32WnvJTs7O0RERJCEw759+0TVgDSBGqV51506ddIb/OTui4yMDKSk\npODDDz+ERqPBqVOnRPYQjeq3nZ0ddu3aVWl9A6XnA6CtXklOTiZj3i5duiQKINOqCr/33nt49913\nSVDgyZMnktWkSlS50JEhKqvGgkaV05goKXxev34drVu3xtOnT7F+/XoUFhZi7NixePfdd8l7vvzy\nS7i7u+sdNwFoH+660W4ApKcvKytLIO4jNQaChqSkJMyaNQu2trbQaDTIzs7GypUrBYIGNMj1qXC9\nJ3KHlSGjGdzd3QUlJFKvffLJJwgPD8fo0aNx5MgRJCYmIjY2tkLZ5Mpy6tQpODk5kfr/Z8+eYdKk\nSSTSz5UihoeHY9SoUeT/KywsxM8//0wcdTmlZEPgFOv++usvzJo1S1Kxjmtk5/777NkzBAQEYN++\nfVS/IzIyEn5+flTiOVLr4cqfpLhw4QJxvHTvn/T0dPz6668IDw+HSqXC2bNnyb+tWrUKf/75p6Bs\nrV27dqLoOZc14AsU6Apv6JZy/vjjj7C3txcYtVw5E3dvNmrUCF9++SUxzGl6PgA6NVsl5syZg4yM\nDNnyer7AhLm5ORo2bCg5sub58+ckayIVxNJ3dvGh6b0fOXKkSKxJ9zWazBCNajoN8fHxWLt2rUBF\nNSgoSBCF/+STT7Bz505RNp67h2nUxTUaDWJiYnDw4EGkpaXhvffew5UrVxAaGkrKGmnFwYzB2LFj\nSYlXbGwsysvLMWTIENH1u3z5sqiH09PTkwSowsLCJDMM/D1Iq+gKyI9DCwoKwq1bt0Tlu9zP+fTT\nT7Fz507MnTsXr7/+Oho3bozDhw8LgqJKCqu0rFy5El26dJHtP+e4fv06fvzxR5w4cQJt2rSBu7s7\nBg8eDLVajatXr6Jz586yYiteXl44fPiwQIiEO884zpw5gwULFhAD/59//sGCBQvg7OyMAwcOCJ5B\ngP7z9o8//sClS5dw8eJFoijbrVs3QbBi0KBBGDZsmKjlhJ+5X7BgAXJycmTLOSujBs8vKy0qKoKF\nhYWgrUzXVpw4cSLmzZsncsIBbbWW3HfIZXhpRIMiIiIQFRVFNEpOnDgh0igBlNVhDdlfcnz11Ve4\nceMG+vbtSxyvdu3a4e7du+jRo4eoGo2Pra0txo8fj23bthFVed1RZX5+fggICNB7DXVbxh4+fIil\nS5ciMTERJiYm6NGjB+bMmSMILNOo4ip9F0FBQXB2doajoyMsLS0FwU+OTz/9FNu2bRP0t3Jzvvko\nCY3RBPhoOHfuHLZs2aL3+QBo78/g4GAyr9bGxgYrVqwQfLYbN25g6dKlstcvMjISGzZsgKWlpd6R\nc7RUeaZ0zJgx0Gg0WLNmjaCcgHvtRXDlyhVJVc4XhVLJsYmJCYKDgwWquXPnzhU8wL/++mvk5eXh\n3LlzALQRWd3ylq5duxLZbT5cKdWCBQuwaNGiSn+elStX4vvvvyfRroyMDHz11VcCAQEa5PpUhgwZ\ngrNnz5KyLt3D6pdffkFISAgAusCFXAkJh7m5OerXrw+1Wg21Wo3u3btXi0MKgGTQ6tatK5kdoy1F\nDAsLQ0JCgqJSstKoEe4A7Natm96DRa5HjAbOoczKykJISAhxpPPz80nZKj+Dyu03rmxXt9eMj1Qp\n4qlTp5CcnEyizt27dxeVkjVt2hQODg4kkzRs2DBS9cCHJpulr5ST75QqlTPR9HwAQFpaGtLS0qBS\nqUi528mTJw1yquTK6zloVQ0zMjKIUqGUiJ2+s4uPXO99aWkpiouL8fjxY+Tn5wt6EHNycgQ/hyYz\ntH37dknVdEP5+OOP4ezsTISygoKCRPtCLhuvVquRkpKiGCk3MTHB999/j4iICFy7dg0ajQYhISGC\nz0UjDmYsaEq85HQkuHuZRiBDqQ+bQ6m1ICUlRTYwsmrVKqjVasyfPx+7du1Cdna2oNQN0CqQf//9\n95g4cSIAbcVERbLQNP3nHJ07d0bnzp0xfvx4rFixArNmzcLgwYNhamqKxYsX48iRI7Jj32iqcnr3\n7o2EhASi7NyyZUtSquvp6SkKHnMzQzmHjqN9+/aws7ODnZ0dLl26hNjYWFy8eFFgYL/22muC0m8p\naMo5u3btisWLF0uqwSvBncNBQUHo1q0bnJycZLOgBQUFGDRoEDp37iz4XVu3biV2xuXLl5GWlkYC\nUrqZVRrRoKioKEWNEkBbCh4RESE4v/z8/EhAwpD9Jcf9+/dx+PBhEuSZPHkycby8vLxEo9N02bZt\nGwDtd8U5efxr4uLigoCAANjZ2YmqAKRo2LChpGAfn8zMTOzYsQPZ2dk4fvy4YBYnh9J34ePjg+Tk\nZCxduhSZmZno0KEDnJycMHLkSPKevLw8UR97Xl6e6GcpCY3R9HAqodFo0KpVK2zYsEHy+cC3qzw9\nPcm5W6dOHZw/f17gcNrb22PPnj2yga6wsDDExcVRTehQosqdUs5YLC8vFxmOJSUlL+R3KqlyVjVB\nQUEIDg6WFaM5evQoVq1aJSu4cvXqVXh6esLW1lYyum8MhxTQOkT8XsuWLVvqNVrlkOtT4eT39R1W\nAIjhIWcYc1kpuRISDhsbGzx79gzdunVDUFAQGjRooHdUyItGSXGTK0W0tLQUKVYePXqUqMTSKiXz\nvwf+qBGOr7/+GmPHjhU4imFhYZg+fTp5D9cjNnbsWFKizvWIGcKff/4pyOzWq1ePKPtyhzZXGsNF\nNKVKY5RISEhAr1698Pnnn5MKAt1ejYcPH2L37t3o0KEDvL29RSWuHFJ9H1JBNX2lnLqqm7pwhhRN\nzwdAp2arBG0vsBJySoUcSmcXIN97HxkZifDwcOTm5sLLy4sYWVZWViKDTalfG6BTTaclJSWFGIdS\n6rvvv/8+/P39BcE5V1dXAML+JqWzqEOHDsjKyhI4aXxoxMGMBU2Jl5yOBBegotmDSn3YAF1rgVJg\nhP+ckVuXnMIqLbS9dlxlzI8//oisrCz069dPMFebRvF74sSJePr0KWbOnEmqcrjssz5Bm8zMTABa\nJ5AfOM7OziZnd0FBAZo1ayYw8L28vPD8+XM4ODjA0dERe/bsET2/nZycsHbtWvTt21dwFvCdSZpA\nipwaPC26zkfHjh3h6OgocD4ASI7k4uDaDvbv3499+/aRIICfn59AB0FfubbumBEljRJA28ZQXl5O\nMpWxsbGkpxWg319KPHz4UPAd1apVC3l5eXjttdcMqsrRd50bNmyInJwcHD58GLt371ZsN6OZErB5\n82a4ubkhPz8fSUlJ8Pf3x8KFCxEVFUUt4NS9e3d069YNKSkpSEpKQmRkJP7++2/BvvD09ISPj4+g\ndY8TkeKjpPpNE+BTwsTEBOPGjUNcXJzk80HXruJKjuPi4kTnpIeHBwYNGgR3d3eBQjYfOzs76gkd\nSlS5U2roiBVjQDsOoapo0KABKcvUx5YtWxQFV3bs2PFC18lhb2+PkJAQ0nMYFxcn2degBE2fitxD\ngUa5zZDy782bN8PS0hKzZ89GXFwcnj59KuqPqypoexR/+uknkVP63XffkTE8tErJSqNGzp49KxAY\nqVevHs6ePStwSv39/bF//34kJyejS5cukmJSNKjVauTn55PIKNf7Cfx7UH/66ac4fPgwyRoFBgYS\nyXla/vjjD5Fxwyk7c0yfPh3Tpk0jwitLliyBm5sbfHx8BAdykyZN4OXlBRcXF+Tn58Pa2hrR0dEC\n43X8+PEYMmSIoJSTy5LyBYzkVKJpej4AOjVbfSxbtgwhISF6+7EMbamgGdNCc3bJ9d6PHDkSI0eO\nxMaNGzFq1ChYW1tj06ZN+P3330l1BAdNZohGNZ0GGvXdmTNn4vjx4yRLoZuNV+pv4rh27Rri4uLQ\nvHlzwfs4x55WrMwYcL2MWVlZensZaXQkaEdy8NHtwwboxs8oBUZOnTqF9evXk4omqeySksKqIdD0\nn3/yySfo168fJk2aJOgZ5+AyYubm5rCwsJBcs1xVDo2gDed0zp07Fx999BHpvzxz5oyoqmbHjh2K\n2ROukoJTkQb+dSa3b99OXc5ZWTV4QNr5+Ouvv0ROabNmzSTn4PLJz89HYWEhuW+LiooE5w5XTQFo\nnavz58+jY8eOFRqLmJKSIigr79Gjh0AjAjBc30AKDw8PDB06lNivJ0+exMcff4yioiKD9r2+6/zp\np59i1KhRyMrKEjh0+spBaQJvnCN/5swZDB06FH369CH6LLQCTiNHjkRxcTGxc/i2OcfEiRPh6upK\nrrG+aSFKqt+0PZxKdOjQAdevXxeJ5gGG2VVbt27FTz/9hGnTpsHExATu7u5wc3MTlK5/9dVX8PPz\nw7vvvluhCR18qtwppRW0MSY0KnFVCY3AAo3gCm0pXWVZtGgR9u7dSw59JycnRdU4KWbNmoX//e9/\noj6VoqIichDLPRRoon2GXBN+JoJGVOVFoqS4eebMGZw9exY5OTlYunQpeb2wsFDwPlqlZKVRIyqV\nStCMX1JSIhgaDWiNa35mSkpMioYxY8Zg2LBhJOBy7NgxkYNEWxojhaGBMK638/XXX4eZmRny8/Mx\nZcoU9OzZk4g5TJw4ETY2NujQoYNeI1uulJO7l0pKSmRVohcuXIiZM2eisLAQGo0G9erVkxwjQXOm\n6IPLvHbr1k0UJaUdRcRHbkwLB819KqVsumrVKsF7jh8/jsDAQCQnJyMxMVEQBeeQywzxoclIKEGj\nvgtos336BH24vnd+L5KUQaakFkwjDmYs2rRpg48++gi1a9eGlZUV+vXrh5YtWwIQ6khwJY/6dCRo\nRnLoBicbNWokKhukaS1QCowsX74cGzZsQLt27fRmHZUUVmnRDWZERETg8uXLAhsJ0DoWJiYmePbs\nmWTPMM0zUq4qhxO0WbhwIZnbq1vqyHHt2jXBs6h3796iapFatWohNDRUtidezpncsWOHQeWclVGD\nB+icD4BuDu64ceNEQUluEgKgDUTzKSgoEAR9AfqxiGZmZsjMzCSB06ysLMH9Q7u/lJg0aRJcXV1J\nkGPRokXkmSEn6qSL3HUeMWIEdesZTeBNbh49jYDTO++8g3bt2iE1NRV///036tati7p168LBwUEU\nIKaZFqIUQKYRK6NBKWgJ0NlVtra2CAgIQEBAAG7fvo3NmzdjzZo1pDIB0FamdO/eXXEUIQ1V7pRy\nX6ghI1YqC41KXFVCozwpV+JVlahUKsyePRtr164ViE1UBLk+FU44gfahUBloZ2VVJUo9ik2aNIG9\nvT1OnjwpOPSsrKwEBjatc600asTDwwMjR44k0crDhw+Lyopohm3T4OnpCXt7eyQmJgLQln/qltTR\nlsZIYUggLDw8HDExMahfvz58fHwQHByMWrVqQa1Wo3///sQppRkhwgnu8KsidEV4lFSi33nnHcTG\nxhIhAn1KfDRnij64qof4+Hj06tWL9IfFx8cjPDzc4Ii63JgWQ6DpvZeLgnMo9WsD9BkJGvSVbNOe\nOzS9ZoCyYz9s2DDk5+dj2rRpmDhxIhEHexEEBwfD2tqaRNnj4+MxY8YMfPvttwbpSNCM5KBxvGha\nC5SuX9OmTdG2bVu9DqlKpUJsbKxBxrg+aPrPAe2ZGxwcTPqoGzRogBUrVpB7lnP+dOGLEtJU5Xzx\nxRck6MY9o3WvQ+PGjbF582ZBBZVugI6mJ15OzM2Qcs7KqsEDoHY+lObgajQa9OzZE66urrh27RoA\n6f5yPrVr1xbMluagcXSCg4Px+eefk4D/3bt3BfoYtPuLhk6dOhl8XXVRus60rWc0gTeaefSpqamS\nAk6RkZEYOHAg5syZA0CbBIiOjsacOXPw4MED3Lhxw+DPLhdAVqvVKC0tVezhpIFmxBmtXXX37l38\n9NNPOHr0KExNTUVndHl5OdUoQhqqbSRMVUIzDqEqURJYAJRLvKoKGglrJWj6VDhoHwqVwVj9FcZE\nqUexffv2aN++PTw8PCTVTuWUiU1MTERjdJRKncaNG4d27doRR/GLL74Q3TM0YlK0tGnTRlb0hrY0\nRgpDAmH5+fnYsGGDyGA1NTUlIg2A/AgRQ0R4lBz7x48fY9OmTSST2rVrV0yaNElUfk1zpijx7bff\nYsqUKVizZg0uXbqEI0eOICwszOCfIzemxRBoeu/louAcSv3aAH1GQgmpkm0ui2fIuaNPpZaGioqD\nVQa5fWyIjgTNSA4axWVjtBbMmDEDAQEBcHZ2llSjNjMzQ1xcnEiJtqIojRICtI7XrFmziNJqUlIS\n5s+fT7J2fEO0tLQU169fR8eOHQV9lTRzcGmCbmvXrsXGjRtJJpLrDeVD0xMv57gOHz6cupyTpmRb\nCVrnQ2kOLr+nT1/lEr8aSK1WIz09nbThGErXrl0xbNgwnD9/HjY2Nnj//fdFgUCa/VVVGMvJ4wJv\nU6dOJYE3LvvJwc2j52jcuLEoeKIk4FS7dm0kJycjNTUVtra28Pb2lp0rLIdcAJlWrEwOToSMRnmd\nxq7y9fVFeXk5Bg4ciPXr14tG7gDaPtkffvgBH3zwgewoQhpeCaeUT3WJG/GhUZ4E5Eu8qhI7OzsM\nHz5cr4S1EoYMXjZmRKomwDcge/fuDRcXF6jVatSpUwcJCQnkGnNOp75MKGdAtGrVShAF1Gg0koOX\naUaN9O7dW9Y4TE1NFYlJtWzZkjjGho7TUIImYlxZdB9ofPg9M9xQcql+NENEeJQc+y+//BJOTk5E\nYTkuLg7Tp0/Hrl27BD+H9kyRw87ODl9//TUmTZqEZs2aISwszKBgkJx4U2pqqsHfHU3vPU0UnLZf\n2xj7i0Z9Vwk5lVoajCkORovcPqYpn+dnkbdt2yY5ksOQYI8xWgvWrVuHOnXqoLS0VK+wn6OjY4UV\nX/lMmDABXl5eRNiQH8zgU1RUJBj94eLiIlAs1u3/zs7OFinK0yiH08zt/b//+z/FnjGanng5x3XE\niBHU5ZyVVYMHgD179lA5H9wc3MWLF8PExARNmzYVzcGV6+kDtG0rHGZmZrC1tUXTpk0NWi8HV6nA\nnWn8SgVAXt+gOqC9zkpwirTOzs4VGj/CoSTgVFpaitGjR6Njx46SSQFDUAog04iVyWGIEBmg/Nxb\nuXKlokBefHw8AAgC9zVmJAxDXmDhZSotnTFjBlavXo2TJ09i1KhReiWslTCkT8VYh1VNQZ8KWmxs\nrMCAVBqHw0X+MjMzRVk+rlyaj77o9MOHD7F//37RPpTaf1UltPUysn37dr3/RiPCQ6sS/eDBA4H4\n1hdffIGjR4+KfieNmq0+dLPr+fn5UKlU5IFPG1ygFW+ihaZPliYKTpMZqiy6DjlnXObm5iI3N9cg\nJ0VOpZYGY4qDKUGzj2nK52lGcvCDPfzgnLW1NT777DPBe43RWpCbm0uMLX1wfVWc8V/RvX7q1Cl4\neXmhXr16sLW11RvMsLOzw6ZNm4jTFhsbK5m54GjatCnS09MFr8lV5XDfp0qlwuHDhyXn9hoiz7Yb\nwgAAEdlJREFUjLZo0SLJOYh8aBxXmnJOY6jB0zofb775Jg4cOCA7B1epp8/Z2Rl5eXkkgMUp6FcE\npf1ujGCZMTGWk2esmZ5KAk7+/v4VXqMuSgFkGrEyOQwRIqPBxsYGc+bMkb3GtC0nNJholDSXGUaH\nP4CeT1UJF9Hi7u6OnTt3YuzYsZLlnoam5v39/UmfCj8Kzs+4fv/993BycjJKRKomQTt4WR/8bATf\nSOGyEbq9W4MHD0ZMTIzia4yKww2nT05Oxvr16+Hv749NmzYhKipK7xnAwZ0FoaGh6Ny5MynrOnbs\nGFJSUjBz5kzB+ytzptCuhRZ94k1cbxotQUFBuHXrlkil0NA5m2PHjsX8+fMxdepUREdH49ixYzh4\n8KBRgyr8DHhlHfIpU6Zg7ty5siq1NAwYMABxcXHEqSgrK4OHh0ely7z5GHvvJCYmIjk5GZcuXdI7\nkmP37t2KqshBQUH47LPPBJnbvXv3ioSy5Fi1ahV69uyJ999/X+97wsLCJAVS7O3t8c4771D/Lt3P\nLTUHEfi3vYAzUB0dHTF58mSSDeGr1KrVaty8eRO2traC87+srAzHjh3D3bt3iXI4oA1a0HyfN27c\ngL29PRnjpouzs7OgAkij0QjmIOo+82/evEnE3IB/HVdDS/5LSkpIyXZlzh0aaJwhpTP5p59+wurV\nq0l2PDk5WTT2jxal/U5T8l4TGTt2LJnpGRsbi/LycgwZMqRCVVopKSnkvuratesLqypxc3NDVlZW\nhQLIhsDZH0qvKUFzjVUqFU6fPi1KOFVEh+bVsfpfIl4251Mffn5+GDVqFP755x+B6Ic+eW4laPpU\njBmRqkkoqaApZdDPnDljkKq1XHRapVJh0KBBOHbsmNE+36uInAiP0hnAfd8ajQbh4eGkJFWlUqFO\nnToip7QyZ4qxzyMl8SZajNEnC9DPlK0MtGrKchiiUktDZcTBaDH23qEZyeHt7Y3NmzcjOzsbS5Ys\nwe3bt5GRkYEPPvjAoDnVSuzfvx9hYWGoVasWCZDqZiyUBFJoexpp5iAC2kqY7OxsqNVqqFQqJCYm\nIjExkRiI/NJ/MzMzDBo0SFRpJKccTvN92tvbQ6VS4YcfftAr8mTIHMTWrVtj7NixyMzMxNOnT1G3\nbl2cOHHCYKfUWGrwNMyaNYsY6oA2yzl9+nSBU6pU6bB161bFsX9KKO13Q0reayLGmOnJYQwBJxqU\ngqHGCiDQCJHRQHONJ0yYAEtLy5qpvsuoOXz++ef4/PPPqeW5laDpU3lVUTIgaURSDFG15o8aAYRl\nVWZmZmjZsqVgpizDcGhEePTB/76fPHmCO3fuCMYcvMwYS5W5sn2ytP3axqQyDrkhKrU0VEYcrLqg\nUV+fM2cOOnbsSO6RJk2aYOrUqfjggw8MdtzloDlzlQRSaJ1SWtX5oKAg2RmHBQUFIkc2PDxc8BpN\ncFgJJQFEQ0rI+U4yX7PCUIx17tBAY6jzP2dpaSn++ecftGzZEj/++CMAurF/Sijtd0P0DWoixprp\nWZXoC/wYO4BAI0RGA801vn//vtEyvcwpZShiDIcUkBeHedWpagNSKTpdUFBAsjX8fhhjGn3/dWhE\neJSIiopCREQE7t+/j/bt2+PatWtwcHB4KQTb9GEsVebK9MkC9P3axqQyhrEhKrW0VIU4mDGhUV/P\nzMzEunXriHFfu3ZtYsAZO3P7yy+/kDPZ2dlZNB5JSSCFFlrVeaUZh0eOHBE5pdHR0YLXjBUcphFA\npJmDaAwnGTCuGrwSNIa67jmVmpqKffv2kb/36tWr0mP/lPY7jb5BTYab6ZmVlVWpmZ4vA8YOINAI\nkdFAMzfV1dUVv/32m2yrAy3MKWVUGXLiMIyqNSCVotMvap7hqwSNCI8SEREROHjwIIYOHYrdu3cj\nPT0d33zzjbGXahSMWToJVF5IqyoFfzgqYxjTqNT+16FRX7ewsEBJSQlxCDIzMys8rkyONWvWICUl\nhXwXERERuHz5sqA9QkkghRZa1Xl94l9lZWWIj4/HP//8IxAgevbsGerVq0fWCsiLGNFgiAAiTQm5\nsZzkqlSDpzHUdenYsSOuX79O/t60aVM4ODiQoMeLHPt3/PhxBAYGIjk5GYmJifD398fChQsRFRX1\nQn5fVdGmTRt89NFHqF27NqysrNCvXz+0bNmyupdVIYwVQNAnQMZhaGIhMzMTO3bsQHZ2No4fP47r\n16+LhEq7dOmCwMBAqNVqmJubV0qYlTmljCqjpvTSvgooRaednZ1x9+5d3LlzBz179kRxcbFexWTG\ni8PCwoIIdZSVlaF169bIyMio5lVJY+wsurHOC5psTWUxhkNOo1L7X0dJfV2j0cDPzw9jx45FdnY2\nvvrqK1y5csVg8Ssazpw5g5iYGFKWOWTIEHh6egq+m0mTJsHV1ZUYX4sWLSJZeENK5WhV5/XNOAwM\nDESjRo3w+PFjwagRKysr4uwZ6/5MTU1FTk4OmjVrJlI91kWuAshYTjJHVarB0xjq/PYBtVqN1NRU\nQVDy4cOH2L17Nzp06ABvb2/RHHBjIqdvUJPhRuFwQUbdUTg1kcoGEPj3vzHYvHkz3NzckJ+fj6Sk\nJMn1hIaGIjIyEu3atauwajwHc0oZjFcQpej0gQMH8MMPPyA/Px8nTpxATk4OFixYUOPV+moaTZs2\nRUFBAfr164fRo0fDxsbmpe3zfVmDTlUh+GMMg58r26TtC/8vojQqwsTEBN9//z0iIiJw7do1aDQa\nhISEoEGDBi9kPQUFBSQg8PTpU8n3GEMghXZEhpz4l62tLX744Qe9/6+x7k9DBRD1VQC9rEEsGmgM\ndX722NzcHB988IFg7vz06dMxbdo0/Pbbbzh8+DCWLFkCNzc3+Pj44M033zTqeiujb/AyU5V9xFVF\nZQMIxm7toVlPs2bN0LZt20o7pABzShmMVwra6PTevXsRFRWFoUOHAtCqCz569KjqF/yKwwneTJ48\nGS4uLnj69OkLjaj/F6mKfu2X1SGvadCor3fo0AFZWVno06fPC13LhAkT4OXlRUZ2XLx4EUFBQS/k\nd9GqziuJfyUkJGDNmjV4+PAhNBrNC5lvbiwBxJp8z9AY6q6urti2bZtgTMZ3330nyACbmJigUaNG\neP3112FmZob8/HxMmTIFPXv2NFh/QA5j6Bu8jFRlH3FVUdkAwtSpU7F+/XrR/HEOQysQaNZjZ2eH\nESNGwNXVVWBPVkRMkM0pZTBeIWjnCvr6+iIqKgqenp44cuRIpeZ/MRgMhrEYOHAgMjMz0bx5c4EI\nm7HPpqCgILz11luoV68ebG1t0alTJzRq1Miov8NQlGYcfvTRR9i6datB/awMwxk/fjyaNGmCc+fO\nITo6Gq+99hp8fHwQGxtL3jNgwABJpWTuGRseHo6YmBjUr18fPj4+6NevH2rVqgW1Wo3+/fvjxIkT\nVf65agr8domMjAxRuwQ/e1rTKC4uxq+//oq2bdvirbfeQm5uLv766y9qEaHc3Fw0bty4UrPLDV3P\nxo0bJf9fTtfBEJhTymAwRKxatQo2NjY4cuQI5s2bh3379qFNmzaYPn16dS+NwWC8whjL2FIiMTER\nycnJuHTpEjIzM9GhQwc4OTmJ1G2rEqXP7ufnh8jIyKpc0isJjaE+fPhw7N+/X+/P+Pbbb+Ht7S25\nb9PT01lgQQba4Dqj5sGcUgaDIUKtVuPgwYP47bffAADvv/8+fH19jdIzwGAwGDUBlUqFlJQUJCUl\nITIyEpaWljh27Fh1L0svS5cuRV5eHvr16yfIpPJVwBlVw/nz5xEfHy9SSmbfBaMqqIpSfo4RI0ZI\n2oYREREG/yzmlDIYDAaDwWDwGDlyJIqLi9GlSxc4OTnB0dERDRs2rO5lyTJ79mzJ11+EOjFDnqCg\nINy6dUtUvsu+C0ZVUJWl/PzRVaWlpUhISICZmVmF+paZ0BGDwRBx6tQprF+/Hvfu3UN5efkLjbIx\nGAzGy0a7du2QmpqKv//+mygjOzg44LXXXqvupemFOTwvD3JKyQzGi6Zhw4ZVVgKuKy7l6OgIHx+f\nCv0s5pQyGAwRy5cvx4YNG4wyd4rBYDBqGnPmzAEAFBYWIjo6GnPmzMGDBw8EWYGXjYyMDCxcuBAP\nHz5EfHw8/vjjD5w8eRJffPFFdS/tlUNJKZnBeBEkJCQA0DqK06ZNq5JS/idPnpA/q9Vq3LhxQ+8I\nLSWYU8pgMEQ0bdrUaHOnGAwGo6axZ88eJCcnIzU1Fba2tvD29oajo2N1L0uWefPmITg4GPPnzwcA\ntG/fHkFBQcwprQauXr0KT09PvUrJDMaL4NSpU+TPtWvXxrlz5wT//iKcUi8vL5iYmECj0aBWrVqw\ntbXFsmXLKvSzmFPKYDBEzJgxAwEBAXB2dq703CkGg8GoaZSWlmL06NHo2LEjzM1rhqlUXFyMzp07\nC17jZmoyqpYdO3ZU9xIYryBcCf/MmTMREhICGxsbAEB+fj5WrFjxQn5nUFAQXF1dYW1tjU2bNuH3\n338XjOsyhJpx0jIYjCpl3bp1qFOnDkpLS/H8+fPqXg6DwWBUKf7+/tW9BIOpX78+MjMzSYXLsWPH\nqn226qsKG0vCqE7+/PNP4pACQL169XDz5s0X8ru2bNkCd3d3JCcnIzExEf7+/li4cCGioqIM/lnM\nKWUwGCJyc3MRHx9f3ctgMBgMBiULFizAvHnzcOvWLfTq1QtvvPEG1qxZU93LYjAYVYxarUZ+fj7q\n1asHQNv3qVKpXsjv4qoxzpw5g6FDh6JPnz5Yt25dhX4Wc0oZDIYIV1dX/Pbbb4Jh4AwGg8F4eWne\nvDl27dqFoqIiqNVqWFtbV/eSGAxGNTBmzBgMGzYMAwcOBKCtmpgwYcIL+V1NmjTB/Pnzce7cOQQE\nBKCsrAxqtbpCP4vNKWUwGCIcHBxQXFwMCwsLmJubs5EwDAaD8ZLTp08f9OrVC+7u7ujevTsTqmMw\nXmHS0tKQmJgIAOjevfsLU4IuLi7Gr7/+irZt2+Ktt95Cbm4u/vrrrwolNZhTymAwJHny5Anu3LmD\n0tJS8pqzs3M1rojBYDAY+iguLsapU6fw008/4ffff0efPn3g7u4OJyen6l4ag8FgKMKcUgaDISIq\nKgoRERG4f/8+2rdvj2vXrsHBwQHh4eHVvTQGg8FgKJCfn49ly5YhLi7uhQmcMBgMhjExre4FMBiM\nl4+IiAgcPHgQzZs3x+7duxEdHY26detW97IYDAaDIcOFCxewcOFCeHl5obS0tMKCIwwGg1HVMKEj\nBoMhwsLCApaWlgCAsrIytG7dGhkZGdW8KgaDwWDoo2/fvnjnnXfg5uaG4OBg1KlTp7qXxGAwGNQw\np5TBYIho2rQpCgoK0K9fP4wePRo2NjZo3rx5dS+LwWAwGHqIjY1lirsMBqPGwnpKGQyGLBcuXMDT\np0/Rq1cvWFhYVPdyGAwGg8FjyZIlskq7c+fOrcLVMBgMRsVgmVIGgyELU9xlMBiMlxd7e3sAwOXL\nl5GWlgZ3d3cA2tmErVu3rs6lMRgMBjUsU8pgMBgMBoNRwxk6dCj27dsHc3NtvuH58+f49NNPceDA\ngWpeGYPBYCjD1HcZDAaDwWAwajj5+fkoLCwkfy8qKkJ+fn41rojBYDDoYeW7DAaDwWAwGDWccePG\nYciQIXBxcYFGo8HFixcxefLk6l4Wg8FgUMHKdxkMBoPBYDD+A+Tk5CAmJgatW7dGSUkJGjdujG7d\nulX3shgMBkMRlillMBgMBoPBqOFERUUhIiIC9+/fR/v27XHt2jV06dIFERER1b00BoPBUIT1lDIY\nDAaDwWDUcCIiInDw4EE0b94cu3fvRnR0NGxsbKp7WQwGg0EFc0oZDAaDwWAwajgWFhawtLQEAJSV\nlaF169bIyMio5lUxGAwGHax8l8FgMBgMBqOG07RpUxQUFKBfv34YPXo0bGxs0Lx58+peFoPBYFDB\nhI4YDAaDwWAw/kNcuHABT58+Ra9evWBhYVHdy2EwGAxFmFPKYDAYDAaDwWAwGIxqg/WUMhgMBoPB\nYDAYDAaj2mBOKYPBYDAYDAaDwWAwqg3mlDIYDAaDwWAwGAwGo9pgTimDwWAwGAwGg8FgMKoN5pQy\nGAwGg8FgMBgMBqPa+H8/Dh/fTOaUtgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7efde638b588>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.bar(range(len(word_hist)), [x[1] for x in word_hist])\n",
"plt.xticks(range(len(word_hist)), [x[0] for x in word_hist])\n",
"plt.xticks(rotation='vertical')\n",
"plt.yscale('log')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.5.1"
},
"widgets": {
"state": {},
"version": "1.1.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment