Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save peterk87/b2986815e397f69091ae927eb379588b to your computer and use it in GitHub Desktop.
Save peterk87/b2986815e397f69091ae927eb379588b to your computer and use it in GitHub Desktop.
This Jupyter Notebook is for generating line plots of genome coverage for reads subsampled from input BAM files for different samples, i.e. what is the genome coverage at a particular depth if you were to randomly subsample 1 to X reads for a particular sample.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"# Plot genome coverage for subsampled reads\n",
"\n",
"> - author: Peter Kruczkiewicz\n",
"> - date: 2021-08-30\n",
"\n",
"This Jupyter Notebook is for generating line plots of genome coverage for reads subsampled from input BAM files for different samples, i.e. what is the genome coverage at a particular depth if you were to randomly subsample 1 to X reads for a particular sample.\n",
"\n",
"## Dependencies\n",
"\n",
"Install dependencies with:\n",
"\n",
"```bash\n",
"pip install numpy=1.21.2 pandas pysam tqdm seaborn matplotlib plotnine\n",
"```\n",
"\n",
"## Parameters\n",
"\n",
"- `inputdir`: directory with BAM files with reads mapped to a common reference. *Make sure the unmapped reads are **NOT** filtered out (i.e. no `samtools view -F4 ...`)\n",
"- `depth`: min depth threshold for calculating genome coverage (default 10X coverage; change as required)\n",
"- `n_subsampled_reads`: number of reads to subsample from BAM files for plotting."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:16.740988Z",
"start_time": "2021-08-30T15:28:16.735537Z"
}
},
"outputs": [],
"source": [
"# input params for notebook\n",
"# adjust as needed\n",
"n_subsampled_reads = 30000\n",
"depth = 10\n",
"inputdir = './'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Imports for getting BAM files from `inputdir` and parsing BAM files"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:16.998108Z",
"start_time": "2021-08-30T15:28:16.742201Z"
}
},
"outputs": [],
"source": [
"from typing import Tuple, Dict, List, Iterable\n",
"from collections import defaultdict\n",
"from pathlib import Path\n",
"\n",
"import logging\n",
"\n",
"import numpy as np\n",
"import numpy.typing as npt\n",
"import pandas as pd\n",
"from tqdm.notebook import tqdm\n",
"import pysam"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Should be using a recent version of numpy like version 1.21.2"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:17.005192Z",
"start_time": "2021-08-30T15:28:16.999368Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'1.21.2'"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.__version__"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:17.019727Z",
"start_time": "2021-08-30T15:28:17.006913Z"
}
},
"outputs": [],
"source": [
"def get_read_mapping_coords(bam: pysam.libcalignmentfile.AlignmentFile) -> Dict[str, List[Tuple[int, int]]]:\n",
" \"\"\"Get coordinates for all reads.\n",
" \n",
" Unmapped reads will be present in output dict and have empty list of mapping coordinates.\n",
" \"\"\"\n",
" out = defaultdict(list)\n",
" for x in tqdm(bam.fetch(until_eof=True)):\n",
" if x.is_unmapped:\n",
" out[x.qname] = []\n",
" else:\n",
" out[x.qname].append((x.reference_start, x.reference_end))\n",
" return out\n",
"\n",
"\n",
"def genomecov(reads: Iterable[str], \n",
" mapped: Dict[str, List[Tuple[int, int]]], \n",
" ref_len: int, \n",
" depth: int = 10) -> npt.NDArray[np.uint32]:\n",
" \"\"\"Get array of number of reference genome positions covered with at least `depth` X coverage adding one read at a time from `reads`.\"\"\"\n",
" out = np.zeros(len(reads))\n",
" arr = np.zeros(ref_len, dtype=np.uint32)\n",
" for idx, read in tqdm(enumerate(reads)):\n",
" mapping_coords = mapped[read]\n",
" if len(mapping_coords) == 2:\n",
" (r1s, r1e), (r2s, r2e) = mapping_coords\n",
" arr[r1s:r1e] = arr[r1s:r1e] + 1\n",
" arr[r2s:r2e] = arr[r2s:r2e] + 1\n",
" elif len(mapping_coords) == 1:\n",
" r1s, r1e = mapping_coords[0]\n",
" arr[r1s:r1e] = arr[r1s:r1e] + 1\n",
" elif len(mapping_coords) == 0:\n",
" continue\n",
" else:\n",
" print(idx, read, mapping_coords)\n",
" continue\n",
" out[idx] = (arr >= depth).sum()\n",
" return out\n",
"\n",
"\n",
"def sample_read_ids(read_ids: Iterable[str], n: int = 50000) -> npt.NDArray[np.unicode_]:\n",
" \"\"\"Random sampling of read IDs\"\"\"\n",
" return np.random.choice(read_ids, size=n, replace=False)\n",
"\n",
"\n",
"def subsampled_genomecov(\n",
" bam_path: Path,\n",
" n_subsampled: int = 50000,\n",
" depth: int = 10\n",
") -> Tuple[str, int, npt.NDArray[np.uint32]]:\n",
" bam = pysam.AlignmentFile(bam_path)\n",
" logging.info(f'Opened BAM file \"{bam_path}\" with pysam: {bam}')\n",
" ref_name = bam.references[0]\n",
" ref_len = bam.get_reference_length(ref_name)\n",
" logging.info(f'Reference \"{ref_name}\" with length {ref_len}')\n",
" logging.info(f'Getting read ids and mapping coordinates from \"{bam_path}\"')\n",
" read_coords = get_read_mapping_coords(bam)\n",
" read_ids = list(read_coords.keys())\n",
" logging.info(f'{len(read_ids)} read IDs parsed')\n",
" subsampled_read_ids = sample_read_ids(read_ids, n_subsampled)\n",
" logging.info(f'Subsampled {len(subsampled_read_ids)} read IDs for genome coverage calculation. Calculating genome coverage at {depth}X from subsampled reads.')\n",
" gcov_positions = genomecov(subsampled_read_ids, read_coords, ref_len, depth=depth)\n",
" gcov_proportion = gcov_positions / ref_len\n",
" return gcov_proportion"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:17.028215Z",
"start_time": "2021-08-30T15:28:17.020794Z"
}
},
"outputs": [],
"source": [
"logging.basicConfig(level=logging.INFO)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Look for bam files in input directory"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:17.037388Z",
"start_time": "2021-08-30T15:28:17.029312Z"
}
},
"outputs": [],
"source": [
"inputdir = Path(inputdir)\n",
"bam_paths = list(inputdir.glob('*.bam'))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:17.046542Z",
"start_time": "2021-08-30T15:28:17.038485Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[PosixPath('Sample1.bam'), PosixPath('Sample2.bam')]"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bam_paths"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get genome coverage for each sample/BAM file"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:25.302599Z",
"start_time": "2021-08-30T15:28:17.048132Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:root:Opened BAM file \"Sample1.bam\" with pysam: <pysam.libcalignmentfile.AlignmentFile object at 0x7f82f839e3a0>\n",
"INFO:root:Reference \"MN908947.3\" with length 29903\n",
"INFO:root:Getting read ids and mapping coordinates from \"Sample1.bam\"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0b467d2456744d9f930a079983c21700",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value=''), FloatProgress(value=1.0, bar_style='info', layout=Layout(width='20px'), max=1.0…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:root:601441 read IDs parsed\n",
"INFO:root:Subsampled 30000 read IDs for genome coverage calculation. Calculating genome coverage at 10X from subsampled reads.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5efa85b08a9a4cd580590eaa8ec05f6a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value=''), FloatProgress(value=1.0, bar_style='info', layout=Layout(width='20px'), max=1.0…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:root:Opened BAM file \"Sample2.bam\" with pysam: <pysam.libcalignmentfile.AlignmentFile object at 0x7f82abfdfa60>\n",
"INFO:root:Reference \"MN908947.3\" with length 29903\n",
"INFO:root:Getting read ids and mapping coordinates from \"Sample2.bam\"\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "5fee0351564342a5b3247623798f049f",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value=''), FloatProgress(value=1.0, bar_style='info', layout=Layout(width='20px'), max=1.0…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:root:601462 read IDs parsed\n",
"INFO:root:Subsampled 30000 read IDs for genome coverage calculation. Calculating genome coverage at 10X from subsampled reads.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "b1eeff82629c4019b95eda97e79f586b",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value=''), FloatProgress(value=1.0, bar_style='info', layout=Layout(width='20px'), max=1.0…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"\n",
"sample_gcov = {}\n",
"for p in bam_paths:\n",
" sample_gcov[p.stem] = subsampled_genomecov(p, n_subsampled=n_subsampled_reads, depth=depth)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Figures start here"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Manual way using matplotlib directly"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:25.651949Z",
"start_time": "2021-08-30T15:28:25.303648Z"
}
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import matplotlib.ticker as mtick\n",
"import matplotlib.scale as mscale\n",
"import seaborn as sns"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:25.655878Z",
"start_time": "2021-08-30T15:28:25.652918Z"
}
},
"outputs": [],
"source": [
"sns.set_theme(context='talk', style='white', )"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:25.666416Z",
"start_time": "2021-08-30T15:28:25.657152Z"
}
},
"outputs": [],
"source": [
"def color_palette_cycle(palette='Set1'):\n",
" set1 = list(sns.color_palette(palette))\n",
" i = 0\n",
" while True:\n",
" if i >= len(set1):\n",
" i = 0\n",
" yield set1[i]\n",
" i += 1"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:25.926411Z",
"start_time": "2021-08-30T15:28:25.667503Z"
}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAArYAAAInCAYAAABtORoKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAACPEElEQVR4nOzdeXxU1f3G8c+dNSshgYQdAWUH2SLIIsiiIMUCCgpUBKUuaFvFpWrFtlYUF1xorWuVKrhQFURQwIKgPxWpGyCKoGyyEwhLtlnv/f0xZCQmhAEmmWR43q9X68y5d06+cxPjkzPnnmNYlmUhIiIiIlLN2WJdgIiIiIhINCjYioiIiEhcULAVERERkbigYCsiIiIicUHBVkRERETigiPWBcS7Nm3aYJomKSkpsS5FREREpFrLz8/HZrPx3XfflXlcI7YVzDRNtKKaiIiIyKmzLAvTNI95XCO2Fax4pPaLL76IcSUiIiIi1Vt2dna5xzViKyIiIiJxQcFWREREROKCgq2IiIiIxAUFWxERERGJCzENtnv37mXatGmMHTuWTp060bJlS1auXFnmuUuXLmX48OG0b9+e888/nyeffJJAIFDqvMOHD3PPPfdw7rnn0rFjR6688krWrVtX4hzLsnjiiSfo1asXvXr14u9//3uplQsKCgro1asXCxYsiN4bFhEREZEKE9Ngu3nzZp5//nn27NlDy5Ytj3nehx9+yI033khaWhr33HMPAwYM4J///CdTp04tcZ5pmlx77bW8++67XHHFFdx+++3s37+fsWPH8tNPP4XPmzdvHi+88AKjRo1i1KhRPPfcc8yfP79EX0899RRnnHEGQ4YMie6bFhEREZEKEdPlvtq2bctnn31Geno6S5Ys4cYbbyzzvIcffpg2bdrwwgsvYLfbAUhOTua5555j7NixNGnSBIBFixbx9ddf889//pMBAwYAcNFFFzFw4ECefPJJHn74YQCWL1/OxRdfzO9+9zsAduzYwfLly/n1r38NwNatW5k1axavv/56Rb59EREREYmimI7YpqSkkJ6eXu45P/74Iz/++COXX355ONQCjBkzBtM0ef/998NtixcvJisri/79+4fbMjIyuOiii1iyZAl+vx8Aj8dDjRo1wuekpaVRVFQUfv7AAw8wdOhQWrdufcrvUUREREQqR5W/eax4y7R27dqVaK9Tpw51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c9tWBuz9jlrOQLgtadTlOBo0qMzyREREpIIo2Eq1V+AJ4AuamKaFaVnsOewJHzuzTgrdzqyN027D+9x/sWyhUOts1Qp3n97YUlJiVbaIiIhEmYKtVGurth7g8037yzyWmuCgX5u6ABQtXBjaRQxIHPIrnC1bVlqNIiIiUjlssS4gUlu2bOHmm2+md+/edOzYkcGDB/Pcc8/hO7I8U7GvvvqK0aNH06FDB3r27MmUKVMoOhJoiu3atYsJEybQuXNnhg4dyhdffFHq6y1evJgePXqQl5dXoe9LTo7XH2Tpt7uPGWoNoHndGlimiXnoEP7v1oWPORo3rqQqRUREpDJVixHbPXv2MHLkSFJTU7niiitIS0vjiy++4NFHH+WHH37gkUceAWDdunWMHz+es846izvvvJPdu3fz4osvsn37dp555plwf3feeSf79+/ntttu46OPPuLGG29kyZIlpKamAuD1ennooYeYNGlSuE2qlk825LBpb374+bln1aZ53VSMQADP669hHTyE7WuTvKO2xQVIufoqjMTEyi5XREREKkG1CLbz5s3j8OHDvPrqqzRv3hyAyy+/HK/Xy3vvvccDDzyA0+nkscceo2bNmsycOZPk5GQAGjZsyOTJk1mxYgXdu3enqKiIlStXMmvWLLKzs7nkkkvo1q0bq1at4rzzzgPg+eefJz09nREjRsTsPUvZAkGTD7/fWyLU9mmVxZl1UrEF/OQ99U8MQiO2v2Rv1Ahbenql1SoiIiKVq1oE24KCAgBq1apVor127do4HA7sdjv5+fl8+umnTJgwIRxqAYYOHcoDDzzAwoUL6d69O16vF8uywiOxCQkJJCQk4PGEbjjauXMnL7zwAi+++CKGUVY8klgp8gWY9cmWEm2XZDeiVqobgML5C0ocSxpxKdjtGDY72G3YateurFJFREQkBqrFHNtzzjkHgLvvvpvvv/+eXbt28c477zB37lyuueYabDYb69evJxAI0K5duxKvdblctG7dmnXrQnMsa9asSaNGjXj++efZvn07//73v8nLy6N169YAPPzww1xwwQV06tSpct+kHNf3Ow+XeH5Rh/rhUOv95FMCW7aEj6XeMBHHGWfgaNgQe/162OvUwbDbK7NcERERqWTVYsS2V69e3HTTTTz77LN88MEH4fY//OEP3HjjjQDk5OQAkJmZWer1mZmZrFq1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WeU+l9PTkrW7AbCCQRrbvRhJiTGuSERERE43moogp8yyLPblewGog4/6Nj+GUxsziIiISOVSsJVTtj335y102+zbFHrgOv42zCIiIiLRpGArp6zA+/OatfWdJgC2mjVjVI2IiIicrhRs5ZTtPRyahlDLZUAwFHIdDRvFsiQRERE5DSnYyilzOUI/Roc2/RRuM9JrxqgaEREROV2Vu/OYnJixY8eWaissLIz73du25OQDUOfALiC0MYMtUasiiIiISOXSiK2cEtO0wnNsDYcdAEeDBrEsSURERE5TGrGNopkzZ5Zqy87OjkEllccXNDGPLGXcvGAv2MCmzRlEREQkBjRiK6fE6w8CYBUUkGyEHttSU2JZkoiIiJymTmjENjU1lZdffpnWrVsDkJaWVuK5nH4OFPgAMA8cwEVo6NbesGEsSxIREZHT1AkFW4fDQdeuXcPPnU5niedy+tlzyANAcMdOHA4Le716GHZ7jKsSERGR05GmIsgp2ZJTAH4/NjOAYYDz7LNjXZKIiIicphRs5aTl5ns57PET3LePNvYiABxNm8S2KBERETltnVSw/cc//kHr1q1Zvnx5lMuR6mRbbiEAwe07aGcPPTbifM1eERERqbpOKtjOnz8fy7KYN29etOuRamT3wSIsr5f0YBFOw8JxZjMMw4h1WSIiInKaOuFgu2rVKn766Sc6duzIsmXLyM/Pr4i6pBrYc8iD5fHgOLIaQkL//jGuSERERE5nJxxs582bR82aNbn//vvxeDwsXry4IuqSasDttGN5PNSyBTBcLmypqbEuSURERE5jJxRsA4EACxcuZNCgQZx55pl06NBB0xFOY0HTwsovIN0IgE33IYqIiEhsnVAa+eijjzh06BAXX3wxAL/61a/44osv2L17d4UUJ1WXaVoUeANYfj8uTIzExFiXJCIiIqe5Ewq277zzDvXq1aNLly5AKNgahsH8+fMrpDipujbuzcPKz8fMzSXBsLDXqRPrkkREROQ0F3Gwzc/PZ9myZQwZMiTcVqtWLc4991zeeeedCilOqq6t+woJbN8BQKbhx6ltlUVERCTGIg62ixcvxufzhachFPvVr37Fjz/+yLp166JenFRdBwt8mLm5NLD7sNfKwNGsaaxLEhERkdNcxMH2nXfeoXnz5jRv3rxE+4UXXojL5dKo7WnGm18AQCpBnO3bx7gaERERkQiD7Z49e/j8889LjdYCpKSk0KdPHxYsWIBlWVEv8Ghr1qzh2muv5ZxzzqFTp078+te/Zs6cOSXOWbp0KcOHD6d9+/acf/75PPnkkwQCgRLnbNiwgVGjRtGpUydGjRrFjz/+WOprvfjiiwwZMqTUayUkb98BADJtflzt28W4GhERERFwRHKS0+nk3//+N23atCnz+N13383WrVvx+/24XK6oFljsww8/5MYbb6Rr167cdNNNOBwOtmzZwq5du0qdc+6553LPPfewYcMG/vnPf3LgwAHuueceAILBIL///e+pVasWf/zjH5k3bx6///3vWbBgAXa7HYB9+/bxz3/+kyeffBKHI6JLdFop8AbA7wcgpWYqhtsd44pEREREIgy2GRkZdO3a9ZjH69SpQ50KvCs+Ly+Pu+66i1GjRjF58uRjnvfwww/Tpk0bXnjhhXBITU5O5rnnnmPs2LE0adKELVu2sGXLFv79739Tr149evfuTb9+/di6dSvNmjUD4NFHH6VHjx507969wt5TdbZtfwHBnH0AZGakxLgaERERkZBqsar+/PnzOXz4MDfddBMQWqHhl9MefvzxR3788Ucuv/zycKgFGDNmDKZp8v777wPg8XgASD2yS1ZaWlqJ9jVr1rBw4ULuuOOOin1T1djmnND8WpsBDsuMcTUiIiIiIccMtps3bz7pTjdt2nTSry3LihUraNasGR9++CF9+vShS5cudO3alWnTphEMBgH47rvvAGjXruR8zzp16lC3bt3w8aZNm5KSksLTTz/Njh07+Oc//0lKSgpNmjTBsiymTJnCVVddRcOGDaP6HuJJ0LSwCgupaQRwtG4V63JEREREgHKmIgwZMoRf//rXXHXVVbRo0SKizr777jtmzJjBe++9x7fffhu1Irdu3cru3bu58847+e1vf0ubNm1YtmwZzz//PF6vl7vvvpucnBwAMjMzS70+MzOTvXv3ApCUlMQ999zDPffcw7/+9S9cLhdTpkwhKSmJuXPnsnfvXq699tqIa8vOzi73eF5eXnh0OF7s2pcHwBk2L7YUTUUQERGRquGYwfapp57i4YcfZujQobRs2ZI+ffrQvn17GjduHP74/uDBg2zdupVVq1bx0UcfsXHjRs466yyeeeaZqBZZWFjIoUOHuPXWW8Oh88ILL6SwsJDXXnuNiRMnhqcSlHXzmtvtpqioKPx82LBh9OnTh61bt3LGGWeQnp5Ofn4+jz76KH/6059wu908+eSTzJ07l6SkJP7whz9wwQUXRPU9VVeHCn1YXi8ASYaJrVatGFckIiIiEnLMYNunTx969erFwoULefXVV3n22WcxDKPUecVzXbt27cqNN97IwIEDsdmiO3U3ISEBoMSuZwAXX3wxixYt4ptvvgmf4/P5Sr3e6/WGjxdLT08nPT09/Pypp56iSZMmDB48mDfeeIPXX3+dRx55hB07djBp0iTeffddzjjjjFJ9f/HFF+XWfrwR3ermy825mIcPA3CGzYORlBTjikRERERCyl0VwW63M2TIEIYMGcK+ffv43//+x8aNG8nNzcUwDDIyMmjevDnnnHMOGRkZFVZkZmYmP/zwA7Vr1y7RXvz80KFD4SkIOTk5ZGVllTgvJyeHTp06HbP/LVu28MorrzB79mwAFixYwOWXXx5eFeHtt9/m3Xff5YYbbojae6quDhT4IBikvs2HwwDjqBv1RERERGIp4kVaa9euzeDBgyuylmNq27Ytn376KXv27KFRo0bh9t27dwOh5ciKlxtbu3Ytbdu2DZ+zZ88edu/eTevWrY/Z/wMPPMCwYcNo1Sp0I9TevXtLhOOsrCz27NkT1fdUXRV4A5gHD1HP5sPesEGsyxEREREJqxbLfQ0aNAiAN998M9xmWRZvvPEGSUlJdOzYkebNm9OsWTNmz54dXikB4LXXXsNms3HhhReW2feHH37IqlWruPnmm8NttWvXLrGyw8aNG8u8Ke10EwiaeAMm2Gxk2AIQCB7/RSIiIiKVpFpsq9WuXTuGDRvGs88+y/79+2nTpg0ffvghH3/8MbfffjspR+7M/+Mf/8jEiROZMGECgwcPZsOGDbzyyitcfvnlNG3atFS/Pp+PBx54gD/84Q8l5tsOHDiQRx55hIyMDHbs2MGGDRuYNm1apb3fqmrv4dBNY+bBg6S6gxqxFRERkSqlWgRbgPvuu4969erx9ttv8/bbb9OwYUPuvfdeRo0aFT6nb9++PPnkkzz55JPcd999ZGRkMHHixGPOjX355ZdxuVyMHj26RPuoUaPYvn07M2bMICkpialTp9K8efMKfX/VwfbcQqzCQgBSDBNbzZqxLUhERETkKIb1yy28JKqKV0U43uoJ1cGrn27h8E87qLF5A0NcB0iZeD02rYogIiIileR4uapazLGV2LMsiwJvAMvjIcUIYs/KUqgVERGRKkXBViJS5AvdKGYVeWhpLwJHtZnFIiIiIqeJkwq2Pp+PPXv2lLkZgsSnTXvzATBsNtKMIAS1IoKIiIhULScUbL/99luuvPJKOnfuzPnnn8+XX34JwP79+xk3bhyffvpphRQpsXewMPRHjBUIkGSY2Bs3Os4rRERERCpXxMF23bp1/OY3v2Hbtm0MHTq0xLFatWrh9XqZO3du1AuUqmHdztA2um0cRQAYv9iiWERERCTWIg6206dPJysriwULFnDrrbfyy8UUzj33XNasWRP1AiX2vP4j0w5ME8fBXACMpOQYViQiIiJSWsTB9ssvv2TkyJEkJydjGEap4/Xr12fv3r1RLU6qhjxPAIDgzp00tXsAsNfJKu8lIiIiIpUu4mDr9XpJTU095vH8/PyoFCRVT16RHwBz925SMAGwa4thERERqWIiDraNGzfm22+/Pebxzz77jLPOOisqRUnVsi/fi1VQgOnzYxjgyu4S65JERERESok42A4ZMoR58+aVWPmgeErCiy++yP/93/+VuqlM4oNlQXDPHhxGaF6165xzYlyRiIiISGkRr7J/9dVX88knnzBhwgSaNWuGYRhMnTqV3Nxc9u3bR48ePRgzZkxF1ioxsmlvHgSC1Lf5sNepox3HREREpEqKeMTW5XIxY8YM7rjjDtxuN263my1btpCens7tt9/Os88+i82mjczizcECH3meAOaBAziwsDeoH+uSRERERMp0QvuiOhwOxo8fz/jx4yuoHKlqvtqSi+XzYQWDnO0uxNBorYiIiFRRJxRspXxjx44t1VZYWEhSNQ6Dufk+rIOHcBoWNYwgznbtYl2SiIiISJkiDrZvv/32cc9JSEigfv36tGnTBodDmTkeHCz0YQUDtLUXAmBL1sYMIiIiUjVFnD7vvPPOEhszFO889ss2wzCoWbMmkyZN4rLLLotiqVXfzJkzS7VlZ2fHoJLoKPIFsAArv4Akw8ReX/NrRUREpOqKONjOmDGDadOmcejQIUaNGkXTpk0B2LRpE7NnzyY9PZ3rrruOn376iVdeeYW//OUvpKWlMXDgwAorXirW9tzQKK1ZUEBDmw+rsDDGFYmIiIgcW8TB9ssvv8Tn8zF//nwSExPD7f3792fMmDGMGjWKDRs2cMMNN3D55ZczdOhQZsyYoWBbjeUf2UrXKiwkMcHEXqdOjCsSERERObaI1+d66623GD58eIlQWyw5OZnhw4fz5ptvhp8PGzaMDRs2RK9SqXS7DhZh+f00sPsAcDTXznIiIiJSdUUcbPfv308wGDzm8UAgwL59+8LPs7Kyyj1fqj630w5+Px4r9GNib9gwxhWJiIiIHFvEwbZJkya8+eab5OfnlzqWl5fHW2+9FZ53C7B9+3Zq1aoVnSolJrbk5GP5/dS1hUZsjYSEGFckIiIicmwRz7G98cYbufnmmxk0aBCXXHIJTZo0AWDz5s3MnTuX/fv388QTTwBgmibvvvsunTp1qoiapRKYpoXNMDD37CUBEyM5CcNuj3VZIiIiIscUcbAdOHAgjz76KFOnTuW5554rcSwzM5NHHnkkfKNYMBjk+eefJyMjI7rVSqXxBUwCpkVw3z4yXQFsqRp9FxERkarthHZRGDx4MAMHDuTbb79l+/btADRo0IB27dphP2o0z+l00qxZs+hWKpVqx4FCsCwwDJKMIM62bWJdkoiIiEi5Tnh7MLvdztlnn83ZZ59dEfVIFXGoyA+mCZZFIlrqS0RERKq+iG8ek9OLP2hi+Xxk2fzYDcCtG8dERESkajuhEdsvv/yS5557jtWrV3P48OHwtrrFDMPgu+++i2qBEhu7D3owDx4kwTABsCWVXr9YREREpCqJeMT2888/Z9y4caxevZoOHTpgmibdunWjffv2WJZF8+bNGTp0aEXWKpXocJEfy+PBbxmAlvoSERGRqi/iYPvMM8+QmZnJe++9x9SpUwG47rrr+M9//sO//vUvtm/fzogRIyqsUKlcHn8Qc38u6bYALi3bJiIiItVAxMF2zZo1jBgxgoyMDGy20MuKpyL06tWLoUOHMn369IqpUipVzmFP6IHDQQObL7Q6goiIiEgVF3Gw9fl81DlyZ7zL5QKgoKAgfLx169Z8++23US5PYmHvYQ/4/VhFRdQx/Njr1Yt1SSIiIiLHFXGwzczMZPfu3QAkJSVRo0YNNmzYED6+e/duHI4TXj1MqqBDRX7MvDyyDB82A2x168a6JBEREZHjijiJtm/fnq+//jr8vGfPnrz00ks0aNAA0zR55ZVXtLZtnMjN90EwSKbNDzYb9oz0WJckIiIiclwRj9iOGDGCmjVr4vGE5l/ecsstuN1u7rzzTv70pz/hdDq5/fbbK6xQqTwF3gCWZZFiBLGlpMS6HBEREZGIRDxi27NnT3r27Bl+3qhRIxYvXsyKFSuw2+106dKF1NTUCilSKo9lWRR6A2CaJGKCppeIiIhINRFRavF4PCxatIimTZvSoUOHcHtSUhL9+/evsOKk8vkCJgHTAtMk2TAx7PZYlyQiIiISkYiCrcvlYvLkydx9990lgq2UNHbs2FJthYWFJCUlxaCak+PxB0MPgsHQrmMasRUREZFqIqI5tjabjXr16pGfn1/R9UiMef2hLXTNAwdxayqCiIiIVCMRp5Zhw4bxzjvvMG7cuPA6tlLSzJkzS7VlZ2fHoJKTVzxi63A5cATA0h8zIiIiUk1EHGw7d+7Mf//7X4YOHcqYMWM444wzSExMLHXeOeecE9UCpXIVB1t3wAeAs3WrWJYjIiIiErGIg+1VV10Vfnz//fdjGEaJ45ZlYRgG69ati151UumKg60z/zC4wNBKFyIiIlJNRBxsp06dWpF1SBXh8Zvg95NAaK6tkZAQ44pEREREIhNxsB0+fHhF1iFVhMcfxAoGcRuhYGuvXTvGFYmIiIhEJuKdx+T04PUHwTRxY4UadKOgiIiIVBMnFGx37drFXXfdRe/evWnXrh0rVqwAIDc3l7vuuos1a9ZUSJFSeTz+4M9r2AKG0xnjikREREQiE3Gw3bZtG5deeinvv/8+zZs3JxgMho9lZGSwdu1a3nzzzQopUiqPxx/EMs3QVATD0Dq2IiIiUm1EnFqeeOIJbDYbCxYswO1206NHjxLH+/Tpw7Jly6JeoFQuj9/EOnQINxaGw1Fq9QsRERGRqiriEdtPP/2U0aNHU69evTLDTv369dm9e3dUi5PKZZpWaMTW6/t5xFZERESkmog42Obn55OVlXXM436/v8T0BKl+dh0sAsAKBEjExNFKmzOIiIhI9RFxsK1Xrx4//PDDMY+vXr2axo0bR6UoiY3DRX4ArEOHSDOC2FKSY1yRiIiISOQiDrYXXHABb731Fhs2bAi3FU9JWLx4MYsWLeKiiy6KfoVSafYe9gBQO8EIzUIwrdgWJCIiInICIr55bOLEiSxfvpzLLruM7OxsDMPg+eef5/HHH2fNmjW0bt2aq6++uiJrlQp2sDA0YpvgLQQn2GrWjG1BIiIiIicg4hHblJQUZs+ezYgRI1i7di2WZfHJJ5+wefNmxowZw8svv4zb7a7IWqWC5RX5wbJIOrKdLi6tYSsiIiLVxwktUpqSksLkyZOZPHkyubm5WJZFRkaGloSKJ8EgNYzQTYC2GjViXIyIiIhI5CIesf3+++9LPM/IyKBWrVoKtXHCsiyK/EEsn4+atgAARkJCjKsSERERiVzEwXbYsGEMHz6cl156idzc3IqsSWKg0BsapQ1s2YoLC2w2jNTUGFclIiIiErmIg+0111zDwYMHmTp1Kr179+b6669n8eLF+Hy+iqxPKonHf2QNYssi+chUBMMW8Y+HiIiISMxFPMf21ltv5ZZbbuGzzz7j7bff5r///S8ffvghNWrUYPDgwQwbNowOHTpUZK1SgbyBI8HW78OFhfvcc2NbkIiIiMgJOqEhOcMw6N69Ow899BCffPIJU6dOpU2bNsyePZtRo0ZpHdtqzOMPrYTg8nuxGWCrVSvGFYmIiIicmBNaFeFoiYmJDBs2jGHDhjF//nzuvfdetmzZEsXSqp+xY8eWaissLCQpKSkG1ZwYjz8IwSCuoB/sYCSnxLokERERkRNy0sF269atvP3227zzzjvs3LkTu93O+eefH8XSpDJ5/UGswkLcR9aw1Xa6IiIiUt2cULA9fPgw7777LvPmzWP16tVYlkWrVq244447+PWvf01GRkZF1VktzJw5s1RbdnZ2DCo5cR5/EDMvnwQjFGwNrWErIiIi1UzEwfYPf/gDy5cvx+fzUbt2bcaPH8/QoUNp1apVRdYnlWR/vo/g9u24sLA3aqT1iUVERKTaiTjYLl++nH79+jF8+HB69eqF3W6vyLqkkuUV+cHhwB0wMRwnPUNFREREJGYiTjCffPIJqVqwPy6ZpkW+NwB+PwmGhbNtm1iXJCIiInLCIg62R4faAwcOsH37dgAaNmxIenp69CuTSpPvDYBlYQWD1HP5MBITY12SiIiIyAk7oc+cv//+e6ZMmcKXX35Zoj07O5u7775b822rqQMFPqxAAIA0I4CRkBDjikREREROXMTBdsOGDYwePRqfz0f//v0566yzAPjxxx9ZtmwZv/nNb3j99ddp3rx5hRUrFcMXCILfD4DDQMFWREREqqWIg+3f//53nE4nr732WqmR2Q0bNnDFFVfw97//nX/84x9RL1IqltdvYgUC1LSFRm2NZK1hKyIiItVPxFvqfv7554wZM6bM6QYtWrRg9OjR/O9//4tqcVI5/EET/H6cWBguF4ZWvBAREZFqKOJgW1RURGZm5jGPZ2VlUVRUFJWipHL5gibm/lwcWBjVYPtfERERkbJEHGwbNWrEsmXLjnl82bJlNGrUKCpFSeXac9CD5fPhMEIjtiIiIiLVUcTBdujQoXz88cfceuut/PDDDwSDQYLBIBs2bODWW2/lk08+Yfjw4RVZq1QQwwxiHj4MgOuc6rEFsIiIiMgvRXzz2IQJE/juu+949913ee+997DZQpnYNE0sy+Kiiy7i6quvrrBCpeLs3LEPgDqGH3vjxjGuRkREROTkRBxs7XY7TzzxBJ988glLliwJb9DQqFEjBgwYQI8ePSqsSKlgR9awtRlg0xxbERERqaZOaIMGgJ49e9KzZ8+KqEVioNAbwPJ4AaidqvVrRUREpPo67hzbjz76iJUrV5Z7zsqVK/n444+jVpRUHl/AxPKGgm1qmkZrRUREpPoqN9iuWLGC6667jr1795bbSU5ODtdccw1ffPFFVIs7lueff56WLVsydOjQUse++uorRo8eTYcOHejZsydTpkwptQzZrl27mDBhAp07d2bo0KFl1r148WJ69OhBXl5ehb2PqiBgWlg+HwCuWhkxrkZERETk5JUbbOfMmUPz5s25+OKLy+1kyJAhtGzZkjfeeCOqxZUlJyeHp59+mqQy5oKuW7eO8ePH4/V6ufPOOxkxYgSzZ89m0qRJJc6788472bNnD7fddhv16tXjxhtvLBFgvV4vDz30EJMmTSI1NbXC31MsBU0TMzcXAEeKdhwTERGR6qvcObZffvklw4YNi6ij/v37M2/evGjUVK5HH32Udu3aYVkWh48sUVXsscceo2bNmsycOZPkI9vCNmzYkMmTJ7NixQq6d+9OUVERK1euZNasWWRnZ3PJJZfQrVs3Vq1axXnnnQeERoTT09MZMWJEhb+fWPMVeoDQjWOOZE1FEBERkeqr3BHbnJwcGjRoEFFH9evXP+6UhVO1Zs0a3nnnHe66665Sx/Lz8/n0008ZNmxYONRCaP3dpKQkFi5cCIRGYy3LCo/EJiQkkJCQgMcTCng7d+7khRdeYPLkyRiGUaHvpyoo2ncAABcmzubNY1yNiIiIyMkrd8TW6XSGA9/xeDweHI4TXmQhYpZlcd999zFs2DBat25d6vj69esJBAK0a9euRLvL5aJ169asW7cOgJo1a9KoUSOef/55br75ZpYsWUJeXl64z4cffpgLLriATp06RVRXdnb5Gxrk5eVV6ekM3pzQGrZOhx1bsqYiiIiISPVV7ohtw4YNWb16dUQdrVmzhoYNG0alqLK8/fbb/Pjjj9x8881lHs/JyQEgMzOz1LHMzMwSo8n33nsvy5cvp3///jz00EPcfPPNNGzYkP/973989NFH3HbbbRXyHqqiYCAIgD0YiHElIiIiIqem3CHWXr16MWvWLCZOnEjTpk2Ped7mzZtZuHAhY8eOjXqBEJpm8Oijj3LttdeSlZVV5jnFI8sul6vUMbfbXWLkuWfPnixfvpyNGzdSr149srKyCAaDTJkyheuvv56srCxeffVVXn75ZSzLYvz48YwePbrMr3u8lSCON6Iba56DhwBwpqfFuBIRERGRU1PuiO24ceNwOp1cffXVfPLJJ2We8+mnnzJhwgRcLhfjxo2rkCKffvppnE4nV1111THPSUgIbS7gO7J01dG8Xm/4eLGUlBQ6dOgQDsqvv/46Ho+H8ePH8+mnn/LII49w2223cfvtt/PQQw/x2WefRfEdVQ2WZbF5S2gkOzVDwVZERESqt3JHbOvUqcOjjz7KzTffzG9/+1vq1atHq1atSElJoaCggHXr1rFr1y7cbjfTp08/5mjqqdi7dy8vvfQSN910E/v27Qu3e71e/H4/27dvJzU1NTwFoXhKwtFycnLKre3gwYP8/e9/58EHH8TlcrFgwQIGDhzIgAEDABg4cCDz58/n3HPPjfK7izGfj0NHZiAkZpWewiEiIiJSnRz3bq/zzz+fN998k+nTp/Phhx/ywQcfhI+5XC4GDBjAH/7wB5pX0B31+/fvx+/3M23aNKZNm1bqeP/+/bnmmmu47rrrcDgcrF27lgsvvDB83OfzsW7dunLX4p0+fTrt27enb9++QChMt2nTJnw8KysrfPNZPAnm5hKwQis/ZNavFeNqRERERE5NRMsYnHXWWfzjH//A5/OxZcsW8vPzSUlJoUmTJmXOaY2mhg0b8s9//rNU+xNPPEFhYSF/+tOfaNKkCampqXTv3p158+Zx3XXXhZf8mjdvHoWFhQwaNKjM/tevX8+cOXOYO3duuK127dps2rQp/Hzjxo1l3pRW3RXt/XkEPCOzZuwKEREREYmCE1qfy+Vy0aJFi4qqpUypqanhKQFHe+mll7Db7SWOTZo0iVGjRjF27FhGjhzJ7t27mTFjBr1796ZHjx5l9j9lyhTGjBlDs2bNwm0DBw7khhtu4LHHHgNg2bJlPPPMM1F+Z7GXu+Y7AGw1a5KWVLF/oIiIiIhUtIpbeDYG2rZty4wZM5g2bRpTp04lJSWFyy67jFtuuaXM8xcuXMimTZt4+umnS7T37duXSZMmMXPmTCzL4pZbbqFPnz6V8RYqVUFR6EY7w+EgyWWPcTUiIiIip8awLMuKdRHxrHi5r+MtC1bZgrkH+Pj5//BNIIlaHdoyekjnWJckIiIiUq7j5apyl/uS+BX4/vvwY09y1d0ZTURERCRSCranKcvvo8iyYTgcnFFHwVZERESqPwXb05RVVEShZcNISiLJFVdTrUVEROQ0pWB7mjIPHaIQG0Zqqm4cExERkbhwQsF2165d3HXXXfTu3Zt27dqxYsUKAHJzc7nrrrtYs2ZNhRQp0WfmFXDYcmC4XdTUUl8iIiISByIOttu2bePSSy/l/fffp3nz5gSDwfCxjIwM1q5dy5tvvlkhRUr0eQNBTAsMm50kt6YiiIiISPUXcaJ54oknsNlsLFiwALfbXWrDgz59+rBs2bKoFygVo8B/ZJU3m0GiU1MRREREpPqLeMT2008/ZfTo0dSrVw/DMEodr1+/Prt3745qcVJxAkEz9MBmw+3UVGsRERGp/iJONPn5+WRlZR3zuN/vLzE9Qao2fyD0vbLZbNhtpf9QEREREaluIg629erV44cffjjm8dWrV9O4ceOoFCUVywoECJihqQgOp73MEXgRERGR6ibiYHvBBRfw1ltvsWHDhnBbcSBavHgxixYt4qKLLop+hRJ1VkEBviPfeldCQoyrEREREYmOiG8emzhxIsuXL+eyyy4jOzsbwzB4/vnnefzxx1mzZg2tW7fm6quvrshaJUqsgkJ2mqElvhKS3DGuRkRERCQ6Ih6xTUlJYfbs2YwYMYK1a9diWRaffPIJmzdvZsyYMbz88su43QpJ1YFZWIgTE8NmIy9gxbocERERkag4oQVMU1JSmDx5MpMnTyY3NxfLssjIyNAczSPGjh1bqq2wsJCkpKQYVHNsVmEBfmzgctEsKzXW5YiIiIhExUmvzJ+RkRHNOqQSWYWFBDAwnE5cDi31JSIiIvHhhIPtli1b2Lp1KwcOHCjz+LBhw061pmpr5syZpdqys7NjUEn5rIJCvJYBTidOu4KtiIiIxIeIg+3evXu58847WbFiBQCWVXpupmEYp3WwrS6swkLyLTuG00GyW7uOiYiISHyIONj++c9/ZuXKlYwbN47s7Gxq1KhRkXVJBfIWeiiybNgdDmokOmNdjoiIiEhURBxsP/vsM6688kruuOOOiqxHKoG3sAgAw+Ek2X3S06xFREREqpSIJ1gmJSVpZ7E44SsOti4nDs2xFRERkTgRcao5//zzw/NrpfqyTJPCIl/oidOJW6siiIiISJyIONXceeedbN++nQceeIBt27aVefOYVH2Wx0OBGfq2G06N2IqIiEj8iHiCZY0aNRg2bBhTp04tc1krCK2K8N1330WtOIk+q6AgtNQXkJJatTaOEBERETkVEQfb559/nscee4xatWpx9tlnk5aWVpF1SQWxCgvxY4BhkJqSEOtyRERERKIm4mA7a9Ysunbtyr/+9S+cTi0RVV1ZBYX4sWE4HbicWsNWRERE4kfEEywPHTrERRddpFBbzVlFRew2neBw4tSNYyIiIhJHIk42rVq1YteuXRVZi1SC4N49WBgYTie6/09ERETiScTB9uabb2b27Nl88803FVmPVLDAxk0ELTASEqiV4o51OSIiIiJRE/Ec23nz5lGnTh0uv/xyOnbsSKNGjbDZSuZiwzB44IEHol6kRJHNhgcbRoKbtCRNKxEREZH4EXGwnTt3bvjxV199xVdffVXqHAXbqs/0+fFbBs7EJNwO3TwmIiIi8SPiYPv9999XZB1SCSzLwhcIhp7Ybdp1TEREROKKks1pxPJ48BHanAHDhkvBVkREROJIxCO2xSzL4rvvvmPbtm0ANGrUiDZt2mAYRtSLkygLBPBZxdvpOhRsRUREJK6cULD96KOPuPfee9m5c2eJ9gYNGvCXv/yF8847L6rFSZQFgxy0Qt9yw6YRWxEREYkvEQfbL7/8khtuuIHExESuvPJKzjrrLAB+/PFH5s6dy8SJE3n55Zfp3LlzhRUrp8YKBgkWPzYMjbKLiIhIXIk42D711FPUrl2b//znP2RlZZU4NmHCBC677DL++c9/8sILL0S9yOpi7NixpdoKCwtJSkqKQTVlCAYJWqEwqzVsRUREJN5E/Fn06tWrueyyy0qFWoCsrCxGjhzJ6tWro1qcRFkgSOGRb7nDqaW+REREJL5EPGLr9/tJTk4+5vGUlBT8fn9UiqquZs6cWaotOzs7BpWUzTKDeI7cPIZNwVZERETiS8QjtmeeeSbvvfcegUCg1LFAIMDChQs588wzo1qcRFkggBMLDANvwIx1NSIiIiJRFXGwHT16NKtXr2b8+PEsX76cbdu2sW3bNpYtW8b48eNZvXo1o0ePrsha5RRZfj9BDAy7ndo1NMdWRERE4kvEUxFGjhzJli1bePHFF/nyyy9LHZ8wYQIjR46ManESXZbXRwDAZsNh01JfIiIiEl9OaB3b22+/nREjRrB06VK2b98OhDZo6NevH02bNq2QAiV6grt2EcQAhx2HTUt9iYiISHw54Z3HmjZtym9/+9uKqEUqmOF2EbAMrMIi7HYFWxEREYkv+jz6dBII4sGGLSODRC33JSIiInHmhEZsv/76a2bNmsXWrVs5ePAglmWVOG4YBkuWLIlqgRI9ViBAoWXDsNlIdCnYioiISHyJONi+/fbb3HXXXTgcDpo0aUK9evUqsi6pAFYggMeyYbcZJLpOeBaKiIiISJUWcbp5+umnadq0KTNmzKBOnToVWZNUkEN79oceGDZcDs1CERERkfgScbrZuXMno0ePVqitxg4artADyyQj2RXbYkRERESiLOJgW7duXXw+X0XWIhWs0Bva8jg10YnDrhFbERERiS8Rp5tRo0Yxf/58gsFgRdYjFajoYB4ASSmJMa5EREREJPoinmPbtm1b3n//fUaOHMmYMWNo2LAhdnvpO+vPOeecqBYo0WEFg/iO/B2T4NY0BBEREYk/EQfb8ePHhx9PnjwZwyi5wL9lWRiGwbp166JWnESPlZeH/8jqbK5a6bEtRkRERKQCRBxsp06dWpF1SAUzDx8ObacLOBMTYlyNiIiISPRFHGyHDx9ekXVIBTNzc/EXB1tNRRAREZE4pFvjTxdBk4B1JNhqDVsRERGJQyeUcHbt2sVdd91F7969adeuHStWrAAgNzeXu+66izVr1lRIkXLqLK+XfZYTW41UnFrqS0REROJQxAln27ZtXHrppbz//vs0b968xLJfGRkZrF27ljfffLNCipRTZ/m8mAB2B3abcbzTRURERKqdiOfYPvHEE9hsNhYsWIDb7aZHjx4ljvfp04dly5ZFvUCJDsvrxQaYdjtuTUUQERGROBRxsP3000+54oorqFevHgcOHCh1vH79+uzevTuqxVU3Y8eOLdVWWFhIUlJSDKopKejx4bcM7A47KQnOWJcjIiIiEnURD93l5+eTlZV1zON+v1+7klVhXo839MBux+3UiK2IiIjEn4hHbOvVq8cPP/xwzOOrV6+mcePGUSmqupo5c2aptuzs7BhUUprH4wfAcDhIcJbeMU5ERESkuot46O6CCy7grbfeYsOGDeG24t3HFi9ezKJFi7jooouiX6FEhc8XCrZojq2IiIjEqYhHbCdOnMjy5cu57LLLyM7OxjAMnn/+eR5//HHWrFlD69atufrqqyuyVjkFPq8PcGNzaFUEERERiU8RD92lpKQwe/ZsRowYwdq1a7Esi08++YTNmzczZswYXn75Zdxud0XWKqfA7wsA4HI5wiPtIiIiIvEk4hFbCIXbyZMnM3nyZHJzc7Esi4yMDAWlKs4KBikMWAAkuLUigoiIiMSnEwq2R8vIyIhmHVKBLJ+PQis0OJ+SrFF1ERERiU/HDbZ79+7FMAwyMzMB8Hq9vPrqq6XOq1u3rm4eq6o8HgqOBNvkJAVbERERiU/lBttNmzZx8cUXc9NNN3HttdcCoQ0HHnroIQzDwLKsnztyOGjdujVNmjSp0ILlxFk+H/lWaImvGqmJMa5GREREpGKUG2znzJlDWloa48ePL3XsjjvuoE2bNgCYpslNN93EW2+9xa233lohhcrJs7xePEdGbJOSEmJcjYiIiEjFKDfYfvbZZ/Tr1w+Xy1XqWMuWLenatWv4+UUXXcSKFSuiX6GcMsvnw4MNw24n0X3S06pFREREqrRyl/vaunUrrVu3jqijZs2a8dNPP0WlKIkuf6EHv2WA3a5dx0RERCRulTt8V1RURFJSUom2tLQ05s+fT8OGDUu0p6SkUFhYGP0K5ZT5PN7QA4eCrYiIiMSvcoNtamoqOTk5JdpsNhvNmzcvde6+fftITU2NbnUSFfme0Ha6hs2O26ntdEVERCQ+lZtyWrRowccffxxRRx9//DEtWrSISlESXQFvKNhqKoKIiIjEs3KD7YUXXsjnn3/O0qVLy+1kyZIlfP755wwcODCqxUl0BPyhYGu3G9olTkREROJWucF25MiRNG3alJtvvpnp06ezY8eOEsd37NjBE088waRJkzjzzDMZMWJEhRYrJycYDK03bLdpGoKIiIjEr3KTjsvl4tlnn6Vhw4Y8/fTTDBgwgHPOOYe+fftyzjnnMGDAAJ555hkaNWrEM888U+ayYNGwZs0a7r33XgYPHkzHjh05//zzmTRpElu3bi117ldffcXo0aPp0KEDPXv2ZMqUKRQVFZU4Z9euXUyYMIHOnTszdOhQvvjii1L9LF68mB49epCXl1ch76ky+QNBAJx2jdaKiIhI/DruEF6jRo14++23ufvuu+nSpQs2m42cnBxsNhvZ2dlMnjyZuXPnllolIZr+9a9/8d///pcePXpw9913c9lll/G///2PYcOGsXHjxvB569atY/z48Xi9Xu68805GjBjB7NmzmTRpUon+7rzzTvbs2cNtt91GvXr1uPHGG0sEWK/Xy0MPPcSkSZPi4oa4YNAEwGZTsBUREZH4FdFq/W63m7FjxzJ27NiKrqdM48ePZ9q0aSVGhAcPHszFF1/M888/z4MPPgjAY489Rs2aNZk5cybJyckANGzYkMmTJ7NixQq6d+9OUVERK1euZNasWWRnZ3PJJZfQrVs3Vq1axXnnnQfA888/T3p6etxMrQiYoakIDk1FEBERkThWLZJO586dS01zaNKkCc2bNw+P2Obn5/Ppp58ybNiwcKgFGDp0KElJSSxcuBAIjcZalhUeiU1ISCAhIQGPxwPAzp07eeGFF5g8eXLc3GgVDIRGbO2aiiAiIiJxrNrur2pZFvv27aNVq1YArF+/nkAgQLt27Uqc53K5aN26NevWrQOgZs2aNGrUiOeff56bb76ZJUuWkJeXF95h7eGHH+aCCy6gU6dOEdWRnZ1d7vG8vLyYT2cImqFgqxFbERERiWfVNti+88477NmzJzx/tngjiczMzFLnZmZmsmrVqvDze++9l5tuuon58+djs9mYNGkSDRs25H//+x8fffQRixYtqpT3UFkCxcFWI7YiIiISx6plsN24cSN/+9vf6NKlC0OHDgUITyUoa2UGt9sdPg7Qs2dPli9fzsaNG6lXrx5ZWVkEg0GmTJnC9ddfT1ZWFq+++iovv/wylmUxfvx4Ro8eXWYtZa2ocLTjjehWBm9OLuDAadeIrYiIiMSvahdsc3JyuO6660hLS2P69OnYjny8npCQAIDP5yv1Gq/XGz5eLCUlhQ4dOoSfv/7663g8HsaPH8+nn37KI488wiOPPALAbbfdRtOmTTn33HMr6m1VKF9SCng8OAOlr42IiIhIvKhWwTYvL49rrrmGvLw8XnvttRLTDoofF09JOFpOTg5ZWVnH7PfgwYP8/e9/58EHH8TlcrFgwQIGDhzIgAEDABg4cCDz58+vtsHW7w+tY5uQnhbjSkREREQqTrX5bNrr9XL99dezZcsWnn32WZo1a1bieIsWLXA4HKxdu7ZEu8/nY926deGbw8oyffp02rdvT9++fQHYu3dviSCclZXFnj17ovhuKpc3EADAneiOcSUiIiIiFadaBNtgMMjNN9/MqlWrmD59Oh07dix1TmpqKt27d2fevHkUFBSE2+fNm0dhYSGDBg0qs+/169czZ84c/vSnP4XbateuzaZNm8LPN27cWOZNadWFNzRgi9tVrQboRURERE5ItUg6Dz74IB988AF9+/bl4MGDzJs3L3wsOTk5PGVg0qRJjBo1irFjxzJy5Eh2797NjBkz6N27Nz169Ciz7ylTpjBmzJgSI8ADBw7khhtu4LHHHgNg2bJlPPPMMxX4DiuWLxjaoMHtrBbfbhEREZGTUi2Szvfffw+EAuayZctKHGvQoEE42LZt25YZM2Ywbdo0pk6dSkpKCpdddhm33HJLmf0uXLiQTZs28fTTT5do79u3L5MmTWLmzJlYlsUtt9xCnz59KuCdVTzLsvBaBmCR4LLHuhwRERGRCmNYlmXFuoh4Vrzc1/GWBasoHp+ffz3yOgAjRvSibsumMalDRERE5FQdL1dVizm2cvK8Hn/4cYLLGcNKRERERCqWgm2cO5T/88YUbremIoiIiEj8UrCNc0Xen0dsnRqxFRERkTimYBvngoHQWl8uw8Jm14itiIiIxC8F2zhnHgm2SYYJCrYiIiISxxRs41zgSLC1YYGjWqzuJiIiInJSFGzjXPFUBDsWhk3fbhEREYlfSjpxLhgwgVCw1VQEERERiWcKtnEuGAgAR77RmoogIiIicUzBNs4FgkemItgMDMOIcTUiIiIiFUfBNs4FjkxFcOo7LSIiInFOcSfOBYNH5tjqxjERERGJc0o7cS541FQEERERkXimu4miaOzYsaXaCgsLSUpKikE1IcGgBYAGbEVERCTeKe7EuR15PgBcSrYiIiIS5zRiG0UzZ84s1ZadnR2DSn6W6jTwAn5DwVZERETim9JOnPP4QzeP1XJaMa5EREREpGIp2Ma5wJFVEVy6eUxERETinIJtnAuaoZFau13BVkREROKbgm0csywL68hyXzZtpysiIiJxTsE2jgVNCysQAMCe4I5xNSIiIiIVS8E2jpkWEDiyQYPbFdtiRERERCqYgm0cC5omVjA0YuvQiK2IiIjEOQXbOOYLmOERW4dLI7YiIiIS3xRs45g3YIIVWhUh0W2PcTUiIiIiFUvBNo4dKvSDaWIzwKFVEURERCTOKe3EMdOysCwTywKbU99qERERiW8asY1j/oAJpkW6LQB2TUUQERGR+KZgG8e8ARPMIC4sDIcz1uWIiIiIVCgF2zjm9Qew/AGchoWRnBTrckREREQqlIJtHPMVecGycGFiJCfHuhwRERGRCqVgG8e8h/MBQlMRkjRiKyIiIvFNwTaO7ThQCBCaipCYGONqRERERCqWgm0cS7WFNmfwOd0YhhHjakREREQqloJtHAv4/QBkJOjbLCIiIvFPq/ZH0dixY0u1FRYWkhSj+a1+bwAAp0tLfYmIiEj801BeHPN7vAA43a4YVyIiIiJS8TRiG0UzZ84s1ZadnR2DSsCyrHCwdbg1YisiIiLxTyO2cSpoWgQPHQbApRFbEREROQ0o2MYpr98EW+jb60jSUl8iIiIS/xRs41ShLwCmCUBKZq0YVyMiIiJS8RRs41QgaGIFgwAk1NB2uiIiIhL/FGzjlOn3gxXaoMHudse4GhEREZGKp2AbpwIFRQDYDQsjQcFWRERE4p+CbZwKeH0A2AFbjDaIEBEREalMWsc2TgU8HgDsBpCQENtiREREosyyLPbt24fH48E8crO0VG82m42EhARq166NYRgn1YeCbZwqnorgcDpO+odDRESkKrIsix07dpCXl4fb7cZut8e6JIkCv99Pfn4+Xq+XBg0anFR+UbCNU16fHwCnQ7NNREQkvuzbt4+8vDzq1KlDRkZGrMuRKMrNzWXPnj3s27ePzMzME369Uk+c8vpCS3257foWi4hIfPF4PLjdboXaOJSRkYHb7cZzZErliVLqiVM+fwAAt1PfYhERiS+maWr6QRyz2+0nPW9aqSdOeTyhqQhup/7FFxERkdODgm2cKp5j63Y7Y1yJiIiISOVQsI1TXm9oKkKCgq2IiIicJhRs45TXFwq2LgVbERGRKmvOnDlccskldOrUiXPOOYdhw4YxderUWJdVyp133skll1xywq975ZVXuPbaa+nWrRstW7Zk5cqVFVDdzxRs45TnyM1jCQmuGFciIiIiZXn22WeZPHkyvXr14sknn+Shhx6if//+fPDBB7EuLWrmzZvHoUOH6NWrV6V8Pa1jG4csy8LnDy33lZCoXcdERESqolmzZnH55Zdzyy23hNv69evH7373uxhWFV2vv/46NpuNDRs2sGDBggr/ehqxjUO+gIkVOLKObaI7xtWIiIhIWfLy8qhdu3ap9l/uuDVt2jQuvvhiOnXqRO/evbn11lvJyckpcU6/fv146KGHeO655+jVqxddunThwQcfxLIsPvzwQ371q1/RqVMnbrjhBg4dOhR+3cqVK2nZsiUff/wx1113HR07duT888/ntddeO279O3fuZNKkSXTt2pUOHTowYcIENm3aVOIcm61yo6ZGbOOQN2BC8EiwTVKwFRGR04MVDGLl58fkaxspKRgnuLZumzZtmDVrFvXr1+f8888nPT29zPP279/PddddR1ZWFrm5ucyYMYNx48axYMGCEsHx3Xff5eyzz+aBBx7g22+/5YknnsA0Tb744gtuuukmPB4P9913H48++ih/+9vfSnyNu+++m6FDh3LFFVfw3//+l7/+9a/UrVuXvn37llnTwYMHGTNmDDVr1uSvf/0riYmJPPfcc1x11VUsXryYhITYfGKsYBtFY8eOLdVWWFhIUlJSpdbh8fmxjgTbBAVbERE5DVjBIAX/fgnz4MGYfH1bzZokjx93QuH2z3/+MzfeeCN33nknhmFw5plncuGFFzJhwgRSUlLC5x19M1kwGAyP3H755Zecc8454WNut5vp06djt9vp3bs3S5cuZdasWSxevJhGjRoB8P333/P222+XCra9e/cOT4k477zz2LZtG08//fQxg+2///1vioqKePvtt6lZsyYAnTt3pl+/frz11lv85je/ifg6RJOmIsQhT35oGzqbAS7NsRUREamSWrVqxcKFC3n66acZM2YMlmXx1FNPcemll1JQUBA+78MPP2TUqFF06dKFNm3a0Lt3bwC2bNlSor+uXbuW2JHtjDPOoEGDBuFQW9yWm5uLz+cr8doBAwaUeH7BBRfw7bffEjwyUPZLK1asoEePHqSkpBAIBAgEAiQnJ9O2bVvWrl17UtcjGjRiG0UzZ84s1ZadnV3pdRzKKwTAhoXNrRFbERGJf4bdTvL4cdVqKgKAy+WiX79+9OvXD4A33niDyZMn8+abbzJu3DjWrFnDDTfcwIABA7jmmmuoVasWhmFw2WWX4fV6S/RVo0aNEs+dTiepqaml2izLwu/343L9vHJSrVq1SpxXq1YtAoEABw4cKHMe8IEDB1i1ahXvvfdeqWPdu3c/sYsQRQq2ccgIhJb6ClgGKNiKiMhpwrDbMdLSYl3GKRk5ciTTpk0L34S1ZMkS0tPTeeKJJ8I3le3YsSPqX3f//v2lnjscjmPO+01LS6Nfv37ccMMNpY4lJydHvb5IKdjGoUBBaMQ23RbAcGkdWxERkapo//79pUZKc3NzS6yW4PF4cDqdJVZKmD9/ftRrWbJkCX369CnxvG3btiWmNhyte/fuLFy4kObNm8fsRrGyKNjGoeCRjybscFIfi4iIiEjFu/jii+nfvz89e/akVq1a7NixgxdffJGEhASGDRsGQM+ePXnppZe4//776devH1999RXvvPNO1Gv56KOPePzxxznnnHN4//33+eSTT3jqqaeOef748eN55513GDduHFdccQV16tRh3759fP7553Tp0oUhQ4YA8M0337Bjxw52794NwOeff86BAwdo0KAB7du3j/r7ULCNQ4GiI8FWu46JiIhUWTfeeCNLly5lypQpHDp0iMzMTDp16sTjjz8evuGrT58+3HbbbcyaNYs33niDjh078uyzzzJw4MCo1jJlyhReeukl/v3vf5OWlsaf//xn+vfvf8zzMzIymD17Nk888QRTp07l8OHDZGVl0blzZ1q2bBk+75VXXmHu3Lnh5//4xz8AGD58OA8++GBU3wOAYVmWFfVeJaz45rEvvvii0r7mJ28u4ev1u2hQK5nh15/4vs4iIiJV2datW4HQHf5yalauXMmVV17J/PnzadGiRazLAcr//h4vV2m5rzjkP7KGn8Oub6+IiIicPpR84pDpcAJgoMF4EREROX1ojm0cOugNLabsql3rOGeKiIjI6axbt26sX78+1mVEjUZs45AtEAq2QZv+bhEREZHTh4JtHDKObH9nd2qpLxERETl9KNjGoZ1HdtirmaTlvkREROT0oWAbh5Ks0Ja6QbumIoiIiMjpQ8E2zliWRSBoAlAzxR3jakREREQqj4JtvAkEKDJD+0knaOcxEREROY3os+o44/d4w48dLmcMKxEREZHjmTNnDrNmzWLz5s04HA4aNGhAt27duOuuu2JdWgl33nknGzZsYM6cORG/Zu/evcyYMYNPPvmEbdu2UaNGDc4991xuueUW6tSpUyF1xt2Irc/n45FHHqFXr16cffbZXHbZZaxYsaLEOa+88gp9+/alW7du3Hvvvfh8vhLHTdNk2LBhPPvss5VZelR4Cz3hxynJmoogIiJSVT377LNMnjyZXr168eSTT/LQQw/Rv39/Pvjgg1iXFhXffvstS5YsYciQITz99NP88Y9/ZPXq1YwePZqCgoIK+ZpxN2J755138v7773PllVdyxhlnMHfuXK655hpmzpxJp06d+Pzzz7nvvvu46qqrqF27Nk899RRZWVlMnDgx3Mfrr79OQUEBV111VQzfycnxen4O6a7EhBhWIiIiIuWZNWsWl19+Obfccku4rV+/fvzud7+LYVXR06VLFxYuXIjD8XPcbNOmDYMGDeL9999n+PDhUf+acTViu2bNGt59911uu+02/vjHP3L55Zfz0ksvUa9ePaZNmwbA8uXL6datG3fccQcTJkzgqquuYvny5eE+Dh06xPTp07nrrrtwuarfHNX1G3aEH7sTNWIrIiJSVeXl5VG7du1S7YZhlHg+bdo0Lr74Yjp16kTv3r259dZbycnJKXFOv379eOihh3juuefo1asXXbp04cEHH8SyLD788EN+9atf0alTJ2644QYOHToUft3KlStp2bIlH3/8Mddddx0dO3bk/PPP57XXXjtu/Tt37mTSpEl07dqVDh06MGHCBDZt2hQ+XqNGjRKhFqBp06YkJiayd+/eiK7RiYqrEdtFixbhdDoZOXJkuM3tdjNixAgef/xx9u7di9frpUaNGuHjaWlpFBUVhZ9Pnz6ddu3a0a9fv0qtPVp+2Bn6Yc2wBbA74+rbKyIiElfatGnDrFmzqF+/Pueffz7p6ellnrd//36uu+46srKyyM3NZcaMGYwbN44FCxZgs/08Rvnuu+9y9tln88ADD/Dtt9/yxBNPYJomX3zxBTfddBMej4f77ruPRx99lL/97W8lvsbdd9/N0KFDueKKK/jvf//LX//6V+rWrUvfvn3LrOngwYOMGTOGmjVr8te//pXExESee+45rrrqKhYvXkxCQtmfGn///fcUFRXRpEmTk7toxxFXyWfdunU0bdqU5OTkEu1nn302lmWxbt062rVrx1tvvcWKFSuoXbs2//nPfzj77LMBWL9+PW+++SZz586N+GtmZ2eXezwvL4/U1NQTfzMnKBgMsnjmIvJ35ALQrHFmqb/4RERE4lnQtCj0BmLytZPcDuy2E/vv7p///GduvPFG7rzzTgzD4Mwzz+TCCy9kwoQJpKSkhM+bOnVq+HEwGAyP3H755Zecc8454WNut5vp06djt9vp3bs3S5cuZdasWSxevJhGjRoBoWD59ttvlwq2vXv3Dk+JOO+889i2bRtPP/30MYPtv//9b4qKinj77bepWbMmAJ07d6Zfv3689dZb/OY3vyn1GtM0uf/++2nSpEmFDSDGVbDNyckp8y67zMxMIHR33iWXXMKiRYsYP348AM2aNQvPZbn//vsZM2YMZ555ZqXVHC2Fh/LYvDM3/LxJ6yaxK0ZERKSSBU2LN//3E4eL/DH5+jUSnYzo2viEwm2rVq1YuHAhH3/8MR9//DGfffYZTz31FO+99x5z5swJD9R9+OGHPP300/zwww/k5+eHX79ly5YSwbZr167Y7fbw8zPOOINDhw6FQ21xW25uLj6fr8SUywEDBpSo7YILLuD+++8nGAyW6LPYihUr6NGjBykpKQQCoT8mkpOTadu2LWvXri3z/T766KOsWrWKWbNm4XRWzMpNcRVsPR5PmRfK7Q7NNfV6vdjtdp555hk2bdpEUVERzZs3x+VysWjRIjZu3MhTTz3Fnj17+Mtf/sLatWtp164d99577zGXpfjiiy/Krel4I7rRkppRk2GXnkfu7v3USEuhbseWlfJ1RURE5OS5XC769esXHsF84403mDx5Mm+++Sbjxo1jzZo13HDDDQwYMIBrrrmGWrVqYRgGl112GV6vt0RfR0+1BHA6naU+NXY6nViWhd/vLxFsa9WqVeK8WrVqEQgEOHDgQJnzgA8cOMCqVat47733Sh3r3r17qbZXXnmFF154gccee4wOHToc56qcvLgKtgkJCfj9pf9SK/7GFwdcCI3UFvN4PDz88MNMmjSJlJQUrr32WjIzM3nmmWd47rnnuO2225g5c2bFv4FT1KBlExq0bBLrMkRERCqd3WYwomvjajUVoSwjR45k2rRp4ZuwlixZQnp6Ok888UR4iuGOHTvK6+Kk7N+/v9Rzh8NxzHm/aWlp9OvXjxtuuKHUsV9OCV28eDFTpkzh9ttvZ/DgwdErugxxFWwzMzPLvMuu+M7BrKysMl/3r3/9i4yMDC699FJ27drFl19+ydKlS2nYsCG33347AwYMYPfu3dStW7dC6xcREZGTZ7cZpCZWn82J9u/fX2qkNDc3t8RqCcWfRh9938z8+fOjXsuSJUvo06dPiedt27YtcxoChEZlFy5cSPPmzY95oxiEVl247bbbuOKKK5gwYULU6/6luAq2rVq1YubMmRQUFJT4a2H16tXh47+0c+dOXnjhBWbMmIFhGOFgXByCi6cg7NmzR8FWREREoubiiy+mf//+9OzZk1q1arFjxw5efPFFEhISGDZsGAA9e/bkpZde4v7776dfv3589dVXvPPOO1Gv5aOPPuLxxx/nnHPO4f333+eTTz7hqaeeOub548eP55133mHcuHFcccUV1KlTh3379vH555/TpUsXhgwZwsaNG7nxxhtp1qwZgwcPZtWqVeHXZ2Rk0Lhx46i/j7gKtoMGDeLFF1/kjTfeCN8c5vP5mDNnDp07dy5znuxDDz3EhRdeSMeOHYGf55hs2rSJVq1asXHjRoAy55eIiIiInKwbb7yRpUuXMmXKFA4dOkRmZiadOnXi8ccfD9/w1adPH2677TZmzZrFG2+8QceOHXn22WcZOHBgVGuZMmUKL730Ev/+979JS0vjz3/+M/379z/m+RkZGcyePZsnnniCqVOncvjwYbKysujcuTMtW4bu81m9ejV5eXl8//33jBo1qsTrhw8fzoMPPhjV9wBgWJZlRb3XGLrppptYunQp48aNo3HjxsydO5e1a9fy0ksv0aVLlxLnrly5kokTJ7Jo0aIS0xQuvfRSTNNkxIgRvPHGG7hcLv7zn/+cVD3FN48d7yYzERERiczWrVuB0B3+cmpWrlzJlVdeyfz582nRokWsywHK//4eL1fF1c5jAA8//DBjx45l3rx5TJkyhUAgwHPPPVcq1AaDQe6//34mTpxYau7t448/TnJyMtOmTSMlJYVHH320Mt+CiIiIiJyEuJqKAKGVD+644w7uuOOOcs+z2+3HnKPSuHFjZs2aVRHliYiIiEgFibtgKyIiIiKR6datG+vXr491GVETd1MRREREROT0pGArIiIiInFBwVZERESqFZvNRjAYjHUZUkGCwSA228lFVAVbERERqVYSEhLwer3k5ubGuhSJstzcXLxeb7m7mZVHN4+JiIhItVK7dm28Xi979uzh4MGDx9z2VaqXYDCI1+slNTX1pDfGUrAVERGRasUwDBo0aMC+ffvweDyYphnrkiQKnE5nONQahnFSfSjYioiISLVjGAaZmZmxLkOqGM2xFREREZG4oGArIiIiInFBwVZERERE4oKCrYiIiIjEBd08VsHy8/OxLIvs7OxYlyIiIiJSreXl5ZW7YoJGbCuYzWY77pIVhYWFFBYWnvLXysvLIy8v75T7iVY98doP6FpXVj9V7TpHs6+q1k9Vu9ZVrZ9o9qVrXTn9gK51ZfVTmdfZMIxydyUzLMuyTrkSOSVjx44FYObMmafUT/Go8BdffFEl6onXfkDXurL6qWrXOZp9VbV+qtq1rmr9RLMvXevK6Qd0rSurn6p0nTViKyIiIiJxQcFWREREROKCgq2IiIiIxAUFWxERERGJC7p5LI5Ea/K2HJ+udeXQda48utaVR9e68uhaV46qdJ01YisiIiIicUHBVkRERETigqYiiIiIiEhc0IitiIiIiMQFBVsRERERiQsKtiIiIiISFxRsRURERCQuKNjGAZ/PxyOPPEKvXr04++yzueyyy1ixYkWsy6pyVq5cScuWLcv838aNG0uc+9VXXzF69Gg6dOhAz549mTJlCkVFRaX6PJFrH2mf1c3evXuZNm0aY8eOpVOnTrRs2ZKVK1eWee7SpUsZPnw47du35/zzz+fJJ58kEAiUOu/w4cPcc889nHvuuXTs2JErr7ySdevWVVqfVVWk17pfv35l/pxPmzat1Lm61qWtWbOGe++9l8GDB9OxY0fOP/98Jk2axNatW0udG8vfFfHwuz/Saz127Ngyf6YnTZpUqk9d69K++eYbbrzxRvr27cvZZ59Nz549mTBhAl999VWpc6v7z7RWRYgDt9xyC++//z5XXnklZ5xxBnPnzmXt2rXMnDmTTp06xbq8KmPlypVceeWVjBs3jrZt25Y41r9/f1JSUgBYt24dl19+OWeddRYjR45k9+7dvPjii/Ts2ZNnnnmmxOsivfYn0md1U3xdzzjjDDIyMvj66695+eWX6datW4nzPvzwQ6677jrOPfdcBg8ezIYNG3jllVcYM2YM99xzT/g80zQZM2YMGzZs4OqrryY9PZ1XX32VPXv2MGfOHBo3blyhfVZlkV7rfv36UbNmTcaNG1eivUWLFrRu3Tr8XNe6bH/4wx/46quvGDRoEC1btiQnJ4dXXnmFwsJC3nzzTc4880wg9r8r4uF3f6TXeuzYsWzfvp2bb765xOsbNGgQ3hygmK51ae+99x7vvPMOZ599NpmZmeTl5TF//nzWr1/P888/T8+ePYE4+Zm2pFpbvXq11aJFC2vGjBnhNo/HYw0YMMAaM2ZM7Aqrgj777DOrRYsW1n//+99yz/vtb39rnXfeeVZ+fn647T//+Y/VokUL69NPPw23nci1j7TP6igvL8/Kzc21LMuy/vvf/1otWrSwPvvss1LnDR482Bo+fLgVCATCbY899pjVqlUra/PmzeG2d999t9T3af/+/VZ2drZ1++23V3ifVVmk17pv377WxIkTj9ufrnXZvvzyS8vr9ZZo27x5s9WuXTvrjjvuCLfF8ndFvPzuj/RaX3HFFdavf/3r4/anax25wsJCq0ePHta1114bbouHn2lNRajmFi1ahNPpZOTIkeE2t9vNiBEj+PLLL9m7d28Mq6u68vPzy/wINT8/n08//ZRhw4aRnJwcbh86dChJSUksXLgw3BbptT+RPqujlJQU0tPTyz3nxx9/5Mcff+Tyyy/HbreH28eMGYNpmrz//vvhtsWLF5OVlUX//v3DbRkZGVx00UUsWbIEv99fYX1WdZFc66P5fL5yp7voWpetc+fOuFyuEm1NmjShefPm4WlLsf5dES+/+yO51kcLBAIUFBQcsz9d68glJiaSkZHB4cOHgfj5mVawrebWrVtH06ZNS/zAAJx99tlYllWt5rVVlttvv50uXbrQoUMHrr76atavXx8+tn79egKBAO3atSvxGpfLRevWrUtcz0iv/Yn0Ga++++47gFLXoE6dOtStWzd8HELXtW3bthiGUeLc9u3bU1BQwE8//VRhfcaTTz75hI4dO9KxY0cGDBjA7NmzS52jax05y7LYt29f+A+LWP+uiOff/b+81sU2btxIx44d6dy5M7169eKZZ57BNM0S5+haly8/P5/c3Fw2bdrEY489xoYNG+jevTsQPz/TjojOkiorJyeHOnXqlGrPzMwEqLZ/SVYEp9PJwIED6d27N+np6axfv54XX3yRMWPG8Oabb9K0aVNycnKAn6/f0TIzM1m1alX4eaTX/kT6jFfHuwZH/5zm5ORw7rnnljovKysLCF3XM888s0L6jBctWrQgOzubJk2acODAAf7zn//w5z//mUOHDnHttdeGz9O1jtw777zDnj17wjcrxfp3RTz/7v/ltQZo1KgR3bp1o2XLluTn57NgwQIef/xxdu7cyd/+9rfwebrW5fvTn/7E4sWLgdB/E0eNGsX1118PxM/PtIJt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\n",
"text/plain": [
"<Figure size 720x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax1 = plt.subplots(figsize=(10,8))\n",
"\n",
"for color, (sample, gcov) in zip(color_palette_cycle(), sample_gcov.items()):\n",
" idx = range(len(gcov))\n",
" ax1.plot(idx, gcov * 100, color=color, label=sample, alpha=0.5)\n",
"ax1.yaxis.set_major_formatter(mtick.PercentFormatter())\n",
"ax1.xaxis.set_minor_locator(mtick.AutoMinorLocator())\n",
"ax1.yaxis.set_minor_locator(mtick.AutoMinorLocator())\n",
"ax1.xaxis.tick_bottom()\n",
"ax1.yaxis.tick_left()\n",
"ax1.set_ylabel(f'Genome Coverage (>={depth}X)')\n",
"ax1.set_xlabel('Number of reads')\n",
"\n",
"ax1.legend(loc=4, fontsize='small')\n",
"\n",
"fig.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plots using plotnine (ggplot2 for Python)\n",
"\n",
"This is a more \"ggplot2\" like approach with similar results as above. The data just needs to be transformed into a Pandas DataFrame prior to using with plotnine.\n",
"\n",
"Install plotnine with:\n",
"\n",
"```bash\n",
"pip install plotnine\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:25.929941Z",
"start_time": "2021-08-30T15:28:25.927442Z"
}
},
"outputs": [],
"source": [
"def gcovs_to_df(sample_gcov: Dict[str, np.ndarray]) -> pd.DataFrame:\n",
" dfs = []\n",
" for sample, gcov in sample_gcov.items():\n",
" df = pd.DataFrame(zip(range(1, len(gcov)+1), gcov))\n",
" df.columns = ['n_reads', 'genome_coverage']\n",
" df['sample'] = sample\n",
" dfs.append(df)\n",
" return pd.concat(dfs)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:25.968837Z",
"start_time": "2021-08-30T15:28:25.930735Z"
}
},
"outputs": [],
"source": [
"df = gcovs_to_df(sample_gcov)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:25.980651Z",
"start_time": "2021-08-30T15:28:25.969728Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>n_reads</th>\n",
" <th>genome_coverage</th>\n",
" <th>sample</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>0.000000</td>\n",
" <td>Sample1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>0.000000</td>\n",
" <td>Sample1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>0.000000</td>\n",
" <td>Sample1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>0.000000</td>\n",
" <td>Sample1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>0.000000</td>\n",
" <td>Sample1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29995</th>\n",
" <td>29996</td>\n",
" <td>0.977862</td>\n",
" <td>Sample2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29996</th>\n",
" <td>29997</td>\n",
" <td>0.977862</td>\n",
" <td>Sample2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29997</th>\n",
" <td>29998</td>\n",
" <td>0.977862</td>\n",
" <td>Sample2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29998</th>\n",
" <td>29999</td>\n",
" <td>0.977862</td>\n",
" <td>Sample2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29999</th>\n",
" <td>30000</td>\n",
" <td>0.977862</td>\n",
" <td>Sample2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>60000 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" n_reads genome_coverage sample\n",
"0 1 0.000000 Sample1\n",
"1 2 0.000000 Sample1\n",
"2 3 0.000000 Sample1\n",
"3 4 0.000000 Sample1\n",
"4 5 0.000000 Sample1\n",
"... ... ... ...\n",
"29995 29996 0.977862 Sample2\n",
"29996 29997 0.977862 Sample2\n",
"29997 29998 0.977862 Sample2\n",
"29998 29999 0.977862 Sample2\n",
"29999 30000 0.977862 Sample2\n",
"\n",
"[60000 rows x 3 columns]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:26.243689Z",
"start_time": "2021-08-30T15:28:25.981427Z"
}
},
"outputs": [],
"source": [
"from plotnine import *"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:26.250485Z",
"start_time": "2021-08-30T15:28:26.244652Z"
}
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"INFO:numexpr.utils:Note: NumExpr detected 16 cores but \"NUMEXPR_MAX_THREADS\" not set, so enforcing safe limit of 8.\n",
"INFO:numexpr.utils:NumExpr defaulting to 8 threads.\n"
]
}
],
"source": [
"df.genome_coverage = df.genome_coverage * 100"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"ExecuteTime": {
"end_time": "2021-08-30T15:28:26.630671Z",
"start_time": "2021-08-30T15:28:26.251492Z"
}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAsAAAAGuCAYAAACeObBYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAA9hAAAPYQGoP6dpAABtU0lEQVR4nO3dd3gU5fo+8Htme3ohIaEkoUhTBAGRIkWaCgKigNQDKkVALHAUwYpgAUVBEQULYAPUI99zLEdp8lMBkXJQLIAoJIEkJKQnmy0z8/7+CKysCbIbdrNL9v5cFxfZafvs5iG5mX3nHUkIIUBEREREFCLkQBdARERERFSbGICJiIiIKKQwABMRERFRSGEAJiIiIqKQwgBMRERERCGFAZiIiIiIQgoDMBERERGFFH2gC7iUFBUVwWq1BroMIiIi8kJYWBhiYmICXQYFEQZgDxUVFeGVV16B0+n0+bFlWcZVV12F//3vf9A0zefHr0siIiJc71VZWVmgywlq7CvPsa88x77yHPvKc/7uK4PBgBkzZjAEk4vEO8F5JisrC6tWrcItt9yCevXqBbqckKXX6xEbG4vCwkIoihLocqiOYF+RP7CvgsPp06fx8ccfY8qUKWjQoEGgy6EgwTPAXqpXr57P/wFpmoacnBwkJSVBljks++8IIaAoChISEiBJUqDLCWrsK8+xrzzHvvIc+8pz7CuqbewyIiIiIgopDMBEREREFFIu2SEQn376KbZt24bjx4+ja9eueOCBB1zr0tPT8fLLL+P48eOoX78+pkyZgnbt2rnW79ixA2vXrkVBQQFatWqFe+65B4mJiYF4GURERERUyy7ZM8BxcXEYOXIkBgwY4LZcURQsWLAAnTt3xrp16zBq1Cg888wzKCoqAgBkZmZi2bJlmDZtGt577z2kpaVh8eLFAXgFRERERBQIl2wA7tatG7p06YKoqCi35QcPHoTdbsfw4cNhMBjQo0cPpKSkYMeOHQCA7du3o0OHDrjqqqtgMpkwZswYHDt2DBkZGYF4GURERERUyy7ZAHw+GRkZSEtLc7uKtGnTpkhPTwdQOTyiSZMmrnVhYWFISkpyrSciIiKiuu2SHQN8PhUVFQgPD3dbFh4ejtzcXACAzWardn1FRUWVY2VnZyM7OxsAkJeXh/LycgDw+STdZ4/HSeUvTAgBTdOgaRqnFboA9pXn2FeeY195jn3lOfYV1bY6F4AtFosrqJ5VXl4Oi8UCADCbzVVuZ2y1Wl3rz7Vy5UrMnz/f9XjUqFEAgJycHF+XDQCukE7kS+wr8gf2FfkD+4pqS50LwCkpKfjXv/4FTdNcwyCOHTuGnj17AgBSU1Pxxx9/uLavqKhATk4OUlNTqxxr6tSpGDJkCIDKM8BbtmwBACQlJfm0Zk3TkJubi8TERE4AfgFnJ5bX6/U8o3IB7CvPsa88x77yHPvKc/7sK3+dtKJL2yUbgFVVhaqqro+XHA4HZFlG27ZtYTQa8fHHH2Po0KHYvXs30tPT0b17dwBA7969MXv2bBw4cABt2rTB+++/j7S0NKSkpFR5juTkZCQnJwOovBXyrl27AMBvP/RlWeYvlAsQQrjeJ/5C8Qz76sLYV95jX10Y+8p77CuqLZdsAN6wYQPWr1/verxjxw706dMH9913Hx555BEsX74c69evR2JiIubOnYuYmBgAQOPGjXHPPffglVdeQWFhIVq2bIkHH3wwQK+CiIiIiGrbJRuAx4wZgzFjxlS7Li0tDc8///x597322mtx7bXX+qs0IiIiIgpi/JyBiIiIiELKJXsGmIiIiPxPEwIOTbgei/Nsd77l565xaAKlqgoBQIjKNQKAqmlQNAHfXmJOdH4MwERERJcgIQScwj12ir/8ffaBEALQVJy7uWtbTYNaXISiExlwllvPrBMQALJ0BpzSG+A884Gx+GvMFVWe7Uyq1QBRfSTWCQGjqIy+EgCp8sUgyWwCGiRf+IUT+QADMBERkZ8IISr/nHls1TQoZ059CgAVmoZ9peV/BsG/7n/2b6cTQlXd1jmFgCLOrndAs9ncdhROB6Bplc/vsEM4nX9frCTBGBUH2WKprOfMzBXJEpAiAxHyn9tVrpHw5+QWkmudaxvdnxHj3NdmkVBlVgxN05BfzQ2piPyFAZiIiAiVYbVUrXonMkUIOM65Q5ldCJQqapXtHEKg7MzyUlWD9cxUnRea1kuSJHSOCneFRM1mg+oWBgWsB/ZDVHOXtDBVhe5MTJYNBuiiY1zrZJ0OuvAIQJYhRZihj4mBZDRVG7T1YeEwGA0wBmgKMk3TIHG+XqpFDMBERFTnaEIg36lAQ+Un8cdt9qof3wMQWuXZUVUI5Ckq1PMMZJUlQD4THQUEImQZZrlqlAyTZZgkCbEAog0SdCqg11fu6Tx5AnpNhQmAdPYUMABZCMhZlUcGANuxyps1nXuWNNZgQNR1/SHpz/9rWzIYON8wkYcYgImI6JIjNA1ahRXligaHOHsp1dmVAjutdthUDXDYodntAIDGkoD+nO3U4mIoJcWuxw2EQLLDBpPmfnZXAmA4z3jWCzn3DLAOgDEpGdDpILmGDJwp+ZwhBKaUNFhata48e0tEfsEATEREQUUIAa28HBDamYu3BDRrOYSquLaxHTkMR0kxvoyrD63aD/WBbiX5iFWckM0W6KKiqt1G37gRTKlNIOl1fnkd594KWdLp//YMLhHVHv5LJCKiWqfZbFDyT6Ns/x5A0wDpz7Gn5wZdALBLMuyyDNligYCEQp0BR00R0LdKgzEqGtdHh8OiOxNgz2RhGRJkSaq8GCtAQwOEEJB1CuQzAZiIggcDMBER1YgQArlOxW1Wg7PjbH8ur4Bdq/xgX7Xb4Mw9VbnPmX3V0lIIISDFJEKflAxJp3cfoWs0AHJlqJXOBNlzphxAmE7GlRFh0EsSok1Gv79WIqpbGICJiC5hms0GoShwRcuzY1XFOXO2CnHOEFnhPj/rma+FELCpKg5mnoAGANrZ7Sqn8YJA5ZRamopyqxVHf/8D5ToZ+bIBBqFBOjMf7NnpvAQEmjgqEKGpEE4Fkl4PQ2J94Mx6xEXDmNwA+sjoymWS+1RZ0jl/6yQJ4Tq58iI0qfIWpudO00VE5C0GYCIiPxCK4vooXzidEA5HZZAEzgTSc+6spSrQKioq93E6qj+eU4FmLa+cIqustDIxaqLKcIGa0AA4JBknTBYcs0QgJTYG0J2JmWeHEbjOwEoQZaWQIiMRJclIloFWuj/XAWdP1J5zxlYC9NGx5x2HS0RU2xiAiYguklCUyjlaNQ1KYQGEpqLs++/+dh/p3I/0JQmS0QTZaIBkMkOSqp+LVbZYoIuKhrlpc0gmU+UyoxFyWPiZ47iO7jZcQDrnec7Kdij4pcIGpyZg0zScjdGNjAb0iD1/UNU0DTk5OUhKSrrg/LZERMGKAZiIQpJSXAStogKAgNAEVEWBptO5Pr7HmflhgTNTbpWVVXsjAkDAnpHutkQ2mSCbzIi4pitkkwmQJMiWsMqVZ8+mBogmBByawK4yKyyyjBSLCZE6HSL1OsTqdRxWQEQhgQGYiEKKWl4GtbgYpbt3Vk5LJcuVw1uFBll3NgCe+dhfr4d0ZnYBSa+HLqK6eVklmNOawJTWFJJODzksLKimulKEQJFTwU/lFdAEUKycuWgNQO/YSITpfD/9FxFRsAuen9JERDUkFAWaw+G6aMs1xlb8eTYXELD+fNA1G4EuIgJRPa6DbDZXma/VHxRNVIZRRYVN01CgKJVlVb4C99fz19f3NyvPfahCoEzR3O54VnLOLXuviAhDY7MR9Qx6mGQZYToOYSCi0MQATERBQyksgFpSfOb6sD9DrPvXZ0LtOReUVfz683mGJ1RluawlLK3a1OpZ2gKngq0Ff95xzCBLCNfpEHPOzReqzoAguT2Wqtvw7KIzywyQEG3SwfKXYBtn0CNKp6ucF5eIiBiAiSiwhBBwZJ0AFAXWX38BhAbJYABwduYBwJX6zn0snbmZrCRBHxcPS8tW0EVGudadO2+s64IzWYZUSxduZdsdrrOvxYoKs05Gz5hIROh00DGIEhEFFAMwEdUKoSiVF55Zy92X2x0oP3gAuogIyAYDwq++Bvqo6Fqry6FpOGFzQFUVyDr1zzOs50ydKwDYNQ3Ws2eZz51GF1UWAQAybfbKmzScOdOcYjK5viYiosDiT2Mi+ltnz9CqJSUQDgfUkmLXGNvK0Qlnx93++bXQBKCqOBsLhapCs1fOqCCbzZBk9wuvDPH1ENmjd43H39pUDTbhPgSiVFFx2qn8GVD/mlDPyHE4YFU1hEuATlYqTyCfO/zgz6lsEaHTwfDXOzb8ZZuzWoSZ0SrcAhOnCiMiCjoMwERULeF0QrPbYM9IR8XhX6ELC4McEQk5PKJyNoRz57A9c4cu180QJFSG3HPCn2wyQQ4Phy68upkUPKMKgd8rbFBF5XReeWduw1vorP5mEGZZRqLR4HrsllvPPEgwGlDfoEcDvc6vF8EREVHwYAAmCkGq1Qpn1kn3i8kAtzuUWX/5ybXY2KAhIjp3rZVwmGmzo8Cpwi40VKjuZ3VLVBU2VUPCmVBrkCQ0NBnR1GJCA5MRur+cmtVLnt0u9+wsEEREFBoYgIlCjGazoXjrlxCKAn1s3J8XigFuF44ZEhIRdnlbyOERkAwGn4Zfu6ahVFFxZvAEBCrH4parGg6WWRFr0CNMJyNGr4dB/vN5E2BApE5GY7PJZ7UQEVHoYQAmquOEEBDnnOW1/XEUQlEQ1fM6GOLrBaSmfaXlOGlzQJL+HG0rA7DoZDQwGdEuMgwRvEEDERH5CQMwUR1Xsm0ztLJSt2WGhESfhl+HpiHH4fR4+yKnivaR4bgszOyzGoiIiDzFAExUx9gzM2D96QcIIeAsLYXRYEBkx86Qz9zGV5Ik6GJivT6uIgTSbXZk292Drk3TXBeheXpbXQlAvIE/foiIKDD4G4goyAhVhT39GISiVE41pmmAEFBLiqEWFwMQZ2YbO2f6sTMXswlROf2YPr4ejKlNYD19GhH168OY3KBGY3gVTeB3mw2aAH4qswIA4g0GJBj//NERCx2aWkyoZzAgSs9hC0REFPwYgImChFpWCsfJE5V/n8j88wK1M38knR7mZpdBMplcd0STILlNR3b2Lmn6mFjAaISs08OYlFSj8CuEwPelZThpcyDBaECC0YArwi2IN3CqMCIiurQxABMFkHA64czLBQDYfv8NztN5MNZPhrlFK4S1vvyijq1p2nnXOTQNNk0gz+lEuaq5btsrS9KZ+1n8edFc8zAzrooMv6haiIiIggkDMFEtEKoKZ+4pCIcD9hMZruVKQT6EokA2VV4MFtG5C0wNG/u9nq+LSlHoVCBJEhIMekTr9WhuMSNSXzmTrmtmBklCDIc1EBFRHcMATORHztxTsP70I5TiIgCAbDQCsgxTWlMAgD4uHoZ6CTAkJPrsOctUFSWKCkXVkKdocJyZbuzsfLuAQLmqoVNUOFLMJug4nIGIiEIMAzCRnwghULZvD4TTiYgOnaCvl3BRtwH2RKmi4ov8IsiSBAOAMqeKqHIrZKnylsRn7ykRppMRbzAw/BIRUUhiACbyA6WoCEpBPjRbBcKv6gRTahOfHVsIAbs4O/sDkGG3QznztVWtHMc7LCEWEAI5ig1J8TGQZdlnz09ERHSpYwAmqgFnXi7sGelwpVABCE2FVlYKze6AZqsAAOhjY2Fq5N2YXkUT0CCQ71TgEJVTnlUOXxAQALLsTuTYHW77xBv0rrO5TSwmyJIE7ZwL2YiIiOhPDMBENVD+v72QdHro4+Jw9pIxSa+DLrkhdOERkHQ6GOonQdJ790/su+IyZNrsrsdhusqL0s4OXZDPPFfzMDMus1ReOKeTJFh0PMNLRETkKQZgIg8JIVD6zXaopSXQHA5EdLoGpsYpHu3r0DRkO5xQtMqzsk4hYNc0aAA0Ufk42+6AIgSaWsxoFmaCWZJhZrAlIiLyOQZgIg8Jmw3O/NMIb3cV9HH1oI+JqXY7VQioQqBM1VDgVFChaThUXjkkIvrMGWFJAiyyDL0kQQagl4A0iwmNTEbU440miIiI/IoB2AsRERHQ6/VuNwnwBSGE67i+PnZdc/b98ff7JISAVlZaeRviMxxn5u81NGoM2WCsUoMQAt+VlOPkOeNzjbKEaJ0OjU1GtIsI8/iMri9eH/vKc7XVV3UB+8pz7CvP+bOv9F4ORaPQwK7wwLp167B69WpcffXViI2NhaIoPn+O2NhYaJr2t3fvoj+pqurX4yuFBSj7ZnuV5YaGjaFJMiocDvxitUERApoASlUNVk2DIgQuDzMjyWiADCBcJ0M+ezZXaFCU2v3+sq+84+++qivYV95hX3nGX30VGxvr0+NR3cAA7IHRo0ejV69eeP/991FYWIiEhASfHl/TNOTn5yM+Pp7TVV2AEAKqqkKn0/llmID9RCaEw4GKw79AZzIh5vpBbusVWYYigEN2O9IdCppaTJABRBklROt1CNfpEG8Ijn9W7CvP+buv6hL2lefYV57zZ1/l5eX59HhUNwTHb+pLRFlZGRRF8fkPMkmSXMflD0nP+OK9EpoGceZsvlpUAMfJE7AdPwZdRCR0ZjNMaU0hGwyu7VUh8PnpQjjPXMiWYjahY5R/b2xxMdhX3uN7dWHsK+/xvbowf/aVPz61pUsfAzCFFNvR31Dx2yFACAiHw22smWQwwNSwMSI6d3HbRxMCB8qsKHKqcGoC18VGIVKvg4lnv4iIiC5JDMAUEoQQKPl/W6EWFcHYoBGMjRoDsgzZYgEkCXaDESWyDgWqhooyK1QhUKpqlVOVCaBYUdA8zIymFhPiOUsDERHRJY0BmOos4XRCKSmGWlIM25FDUK1WRFzdBcakZEh6PU47nDhaYQcEkFliBQCE6WRE6nQwyBLMsoQEgxE6SYJJNiPFbArwKyIiIiJfYACmOsmefgxl+/cCAGSzBbLZjNxmLfFjWBTUknI4NIFyVYVekpBmMaF5mBnNLGZE6XUBrpyIiIj8jQGY6hytogJl+/dCREZB69AZiIxEgVPB8QobImQZyQY9TLIMvQQkG43QyxzOQEREFEoYgKlOcWgavj1diNKoeDguvxJwakBBMWRJQrxBj8vDLYgLkmnKiIiIKDCYBOiSI4RAgVOBQwhoAJSyUtiyTqJMA05CQklxCVo6KhAfHYEkowFmWYYE8MI1IiIiAsAATJcQTQgcr7BjT3EpZFmGXpIgS4Dz2DEIhwOGsDDESgJXRIWhcatmMFjMgS6ZiIiIghADMAU9TQhYNQ3Fiop9peWwlJWiY+YfsJQWQ5y5ZWbYFVfCclnLAFdKRERElwIGYApKNlXDYasN+U4nikpLYSstBQCYysvQ9cQf0IeFIaxDp8oZHiwW6CIiA1wxERERXSoYgCnoWCus+P73P5BlcyJOdaJxwWlEaSri4uKglySYul4LS3IDjuklIiKiGmEApqCS73Di8/0/QihOXBUVgeaRkUB8DIwNGkEXFgYhBO/rTkRERBeFAZgCShMCu0vKYNcE7KqKwsJCGB12DGzTApH1kwNdHhEREdVBDMBUq4QQsGsCJaqKXIcTRXYHMnNOIS0rHeGKgoaaivoWC8MvERER+Q0DMNUKpyagCoH/lZXjhM0BADAXFiAi4w80V1W0adwQxvrJ0EVFQzIaA1wtERER1WUMwORXxYqCfSXlyHdWjtuVJAktVAcaHPoZcnEh9LGxiOjUHXJ4OC9qIyIiolrBAEx+dbzCjgpNw+URYWhoMiBMklDyn48hG4ywtLsKpibNGHyJiIioVjEAk89oQuC7kjLYVAENAgKAVdWQajaiTbgFAFC25zsAQHT/GyCbTAGsloiIiEIVAzD5xGmHE0cqbDhpc6BNuAUGWYIECZLTgfqSgFpeBq28DPYTmTA3a87wS0RERAHDAEwXzaqq+LqoFDpJQvvIcDS3mCBJEip+OwzrTz/CAcBxZlvZZEb4lVcFslwiIiIKcQzAdFEOlVfgYJkVAHBdbBRiDZUtZfv9N1h/+hHG5IYIa9sOkiwDsgxJz5YjIiKiwGIaoRrThMDBMisSjAZ0igxHhF4HAHDm5qD8xwMwJCQisku3AFdJRERE5E4OdAF06TpuswMAOp4TfjWHA6Xffwd9dAwirr4mkOURERERVYtngKlGMm127CspR6LRgHBZglpejvL9e+A8nQcAiLj6Gsgmc4CrJCIiIqqKAZi89pvVhgOl5YjW63FtVDjKdn4DZ14uAMDSqg3MTTnLAxEREQUvBmDyihACB0rLEa7ToU9cFCr+tw/OvFxYWraGuXkLyLyNMREREQU5BmDyygmbHUpBPq62lcKWrsKekQ5zs+YIa3NFoEsjIiIi8ggvgiOv/HQqD4bsLJjtdkiyDMtlLWFpdXmgyyIiIiLyGM8Ak0dKFBU/FRUjL/042sgapzcjIiKiSxYDMF3Q4fIK/C8rB8jJQtuKUlx5bc9Al0RERERUYwzAdF6aEPh/RaXILSxCdPrv6GQxIa5nb+jCwgJdGhEREVGNMQDTeeU6nMirsOHK3w+hodmIqO49Al0SERER0UXjRXB0XnlOBeqpHCQ5KhB2xZWBLoeIiIjIJ3gGmKoQQuBAmRVHrTYkWUthSm0CfWxcoMsiIiIi8gmeAaYqshxOHLXacIXFhMtzs6CLjgl0SUREREQ+U2fPAI8cOdLtscPhQKdOnfDII48AACZNmoSioiLIcuX/ARISEvDKK6/Uep3ByKZpMOtkpGYeQwUAQ/2kQJdERERE5DN1NgB/8MEHrq9VVcWdd96J7t27u20zd+5cdOzYsbZLC3oligqzU0HFkUMwpaTx9sZERERUp4TEEIj9+/fDZrOhWzfevOFCbKqGo1Yb1KOHAADhV/E/CERERFS31NkzwOfaunUrevToAZPJ5LZ86dKlEEIgJSUF48aNQ5s2bQJUYfD4ocwKo6qibX4uIjp2hiSHxP+RiIiIKITU+QBcUlKC77//Hs8884zb8lmzZqFZs2YAKgPy/Pnz8fLLLyMxMdG1TXZ2NrKzswEAeXl5KC8vBwBomubTGs8ez9fH9boOIZBebkXKb7/CpKnQJyUHvKa/EkJA0zRomgZJkgJdTlALlr66FLCvPMe+8hz7ynPsK6ptdT4Ab9++HcnJyWjZsqXb8nPP9g4cOBDffPMN9u3bhxtvvNG1fOXKlZg/f77r8ahRowAAOTk5fqk1NzfXL8f1VIkmUJp7GrGZx2DrdA1OnT4d0HrINwLdV1Q3sa/IH9hXVFvqfADeunUr+vXrd8HtZFmGEMJt2dSpUzFkyBAAlWeAt2zZAgBISvLtrAiapiE3NxeJiYmuWSkCwW6zw5R9CslNmyOiRcsL7xAAQggoigK9Xs8zKhcQLH11KWBfeY595Tn2lef82Vf+OmlFl7aLCsCqqsJmsyE8PNxX9fjU77//joyMDPTu3dtteV5eHnJzc9GiRQsAwLZt2/Dbb7/h7rvvdtsuOTkZycnJAICsrCzs2rULAPz2Q1+W5YD+Qkm3OxFRVgp9QkzQ/mITQrjeJ/5C8Uyg++pSwL7yHvvqwthX3mNfUW3xKgDn5+fj/fffx+bNm7F7926cPvMRudFoRIsWLdCjRw+MGDECvXr18kux3tqyZQs6deqE2NhYt+UVFRVYtWoVsrOzodfr0bhxYzz66KOusBuKrKqGPIcTKbZyGOq3DnQ5RERERH7jUQDOyMjAY489hvXr1yMuLg5dunTB9OnTUa9ePZhMJhQVFeH48ePYu3cvVq5ciSZNmuDxxx/H2LFj/V3/35o6dWq1y1NSUrBs2bJaria4/VhmhS7vFBo6KiBbwgJdDhEREZHfeBSA27RpgxEjRmDz5s249tpr//ajnLy8PHzwwQd48sknkZmZiYceeshnxZL/WEtLkXwiHbFNm0MXERHocoiIiIj8xqMA/PPPPyM1NdWjAyYkJGDGjBmYPn06srKyLqo4qj22gnxEG40Iu+LKQJdCRERE5FcejTT3NPyeS5IkNGzY0Ov9KDActgqYwsJ4oQYRERHVeRc9DdrmzZuxefNmCCHQr18/XH/99b6oi2pR6R9HUVJhQ3gD307vRkRERBSMLmqukcWLF2PEiBE4duwYfv75ZwwZMgRPP/20r2qjWqDZbdj5+zHIJjManbkzHhEREVFd5lEAtlqt1S5fvnw5du/ejQ8//BCff/45VqxYgeXLl/u0QPKvzIM/4pTRjCuaN4OBcy8SERFRCPAo8bRs2RLr16+v/gDnhCZOXn1pceblIjO/AJGNGqN9vbhAl0NERERUKzxKrO+++y6effZZ9OzZEz/++KNr+dSpU9GlSxeMHDkSN910E6ZNm4Zp06b5rVjyLXvGcdglGfFxDL9EREQUOjwKwL169cL+/ftx2223oV+/fpg+fToKCwvx8MMP45133kHjxo3RsmVL/Otf/8Kjjz7q75rJB4QQqDiVg1MNUhBruOhrIYmIiIguGR4nH1mWMWPGDIwaNQqPPPIIWrVqhccffxzTpk3DwIED/Vkj+YFWXoZSRYVsNqFlmDnQ5RARERHVGq8H7cbHx+PVV1/Fpk2bsGHDBrRv3x5ff/21P2ojP9IqKlBqMMIcFQ0jx24TERFRCPEo+VRUVOCxxx5Dly5dcNVVV2Hq1KlISEjA//t//w8PPfQQxo0bh9tuuw0nT570d73kI6UVVhyOikV9kyHQpRARERHVKo8C8JQpU7BmzRrccsstuPPOO/G///0PAwYMgBACo0ePxqFDh9C8eXO0a9cOCxcu9HfN5AO5VhscBhM6RoYHuhQiIiKiWuXRGOBPPvkE77//vmus7/Dhw9GwYUP88ccfaNasGcLCwvDUU0/hzjvvxKxZs/xaMPlGmd2BWJ3M4Q9EREQUcjxKP6mpqfjqq69cj7du3QqDwYCkJPdb5zZt2hT/93//59MCyT/sxYWQDRz+QERERKHHozPAq1atwqhRo/D666/DaDTC6XTi9ddfR3g4Pz6/FDkVBXmKikQLZ38gIiKi0ONRAL7mmmvw22+/4ciRI7Db7WjZsiXCwsL8XRv5yZ7c0yjRGXBNUnKgSyEiIiKqdR7PA6zX69GmTRt/1kK1wKFpyCi34kprKZJ5ARwRERGFII/GAL/66quw2+1eHfjgwYPYtm1bjYoi/8l1KBCqisaSCHQpRERERAHhUQBes2YNUlNTcf/992Pnzp1wOp3VbpeVlYU333wT/fr1Q7du3VBYWOjTYuniHbfZYXTYYYyLC3QpRERERAHh0RCI3bt3Y+PGjVi2bBleeuklGAwGtGjRAgkJCTCZTCgqKsKxY8eQm5uLuLg4TJgwAe+++26VWSIo8KyqhqSSQuhiogJdChEREVFAeDwGeNiwYRg2bBiOHz+OLVu2YO/evcjOzobNZkNqaioGDBiA7t27o3fv3jBweq2gJIRAsdOJ5OIiyA0bBLocIiIiooDwOACflZaWhkmTJmHSpEn+qIf8qERVITQNYaoKfVx8oMshIiIiCgjeBiyE7Coug1FoiFKdkI2mQJdDREREFBAMwCGiTFVRqqjobNRBBiBxmAoRERGFKAbgEHHS5oBJlhFTVAjZYAR0ukCXRERERBQQXo8Bvljl5eU4deoUKioqEB8fz5kiakmJqiJKr4OosEJfrx4kSQp0SUREREQBUSsB+ODBg1izZg02b96MX375BUL8eROG6OhodOvWDSNGjMCIESN4i2U/EQIIlwD7sd9hvqxloMshIiIiCpiLGgKRmZmJnTt3ory8vNr1u3btQu/evdGuXTvs2LED/fr1w5tvvon//Oc/+PLLL7FhwwbMmzcPERERmD17Nho2bIinnnrqvMejmhFC4JTTCaPDDqFpMDdpFuiSiIiIiAKmRmeAV61ahfnz5yMnJwcAsGfPHnTo0AHDhg1D7969ce+99wIAbrrpJtxzzz14++23kZKS8rfHVBQFX375JV544QVomoZHH320JqVRNexCwKZqqK9U3s5aMpsDXBERERFR4HgdgJcuXYo5c+Zg1qxZ6Nu3LwYMGOBa17t3b3z44YeuAJyeno6IiAjPCtHrMWjQIAwaNIhngH3MoVUOOTHkn4ZsMnH8LxEREYU0rwPwyy+/jEcffRSPPPIIVFV1W9eyZUscPnzY9djT8PtX4eHhNdqPqlesKAAAOS8XhoTEAFdDREREFFheB+CTJ0+iW7du1a4zGAwoKys7776qqmL37t04ceIEbDZblfX/+Mc/vC2HPFCkqDA5HdBKimFqd1WgyyEiIiIKKK8DcGpqKr7//nv06dOnyrrdu3ejRYsW1e63f/9+3HLLLcjMzHSbBeIsSZIYgP1AFQKHrTakFBdC0ulgqJcQ6JKIiIiIAsrrADx58mQ88cQTSEhIwC233AIAcDqd+Oyzz/Dcc8/hqaeeqna/adOmITo6GmvXrkWbNm1gNBovrnLySKFTgRACjXJOQh8TG+hyiIiIiALO6wD8z3/+ExkZGZgyZQqmTp0KAOjevTsAYPr06Zg+fXq1+/3888/48MMP0atXr4sol7xVrKgQdjuMJUWw9Lwu0OUQERERBVyNpkF76aWXcN9992Hz5s3Iz89HXFwc+vbti8suu+y8+7Ro0QIlJSU1LjQYREREQK/XVzuE42IIIVzH9fWxy1QVEYoTssEAfVy8z49f287Wf6m/jtrgz76qa9hXnmNfeY595Tl/9pVeX+s3vaVLQI27omnTpq4zwJ548cUXce+996Jdu3Zo1apVTZ82INatW4fVq1fj6quvRmxsLJQzsyr4UmxsLDRNg6ZpPj2uQ1FhKS8FTCa/1B0of52BhKrnr76qq9hXnmFfeYd95Rl/9VVsLIf/UVVeB+Cvv/76vOtkWUZ0dDRatGgBk8mEtm3bus05m52djSuuuAINGjRATEyM276SJOGHH37wtpxaMXr0aPTq1Qvvv/8+CgsLkZDg2wvJNE1Dfn4+4uPjIcsXdXM+N0II5CgqosvLoDOZ68T/goUQUFUVOp2O8xlfgL/6qi5iX3mOfeU59pXn/NlXeXl5Pj0e1Q1eJ6LevXu7/UMWQlT5h22xWDB16lR06NChTv2ALCsrg6IoPv9BJkmS67i+PLZdEygvKUHT07kwtbm8Tv0A9vV7VRf5q6/qMr5XF8a+8h7fqwvzZ1/VpU8/yXe8DsCbN2/GpEmT0K9fPwwdOhSJiYnIzc3Fxo0bsXXrVjz33HP48ccf8dxzz2HOnDmYP3++P+omDxQqCrSyUiQZ9DA3bRbocoiIiIiCgtenZ1etWoXRo0fj9ddfx0033YTOnTvjpptuwptvvokxY8Zg3bp1WLBgAWbPno133nnHtd8dd9yBY8eOVXvM9PR03HHHHTV/FVStMlWDsaQYpvh6gS6FiIiIKGh4HYA///zzam+CAQDXXXcdNm/e7Pr65MmTrnVr1qw57zic06dPY+3atd6WQhdQ6HDCbLfB1KRpoEshIiIiChpeB+CIiAh89dVX1a776quvEBERAQBwOByIjIx0W3++cT2//fYb4uPjvS2FLiCvtAwRmgLZbAl0KURERERBw+sxwNOmTcP8+fORl5eHwYMHIyEhAXl5efj3v/+N1atX44knngAA7Ny5E/Hx8bjyyisBVIbfMWPGwGJxD2M2mw3Hjx/HiBEjLv7VkItTEyi1VaCB4oQcFhbocoiIiIiChtcB+LHHHkNMTAwWLVqEN954A5IkQQiBpKQkLF26FDNnzgQAjBs3DmlpadixYwcA4KeffkLLli2rTCFmNBrRunVr3HnnnT54OXSWQ2hQy8uRHBHOq4+JiIiIzlGjiWHvuece3H333Thx4gSys7ORnJyMRo0auU151qpVK7Rq1QqTJk1yLXvsscfQpEmTi6+aLijb7oRJVRFm4dlfIiIionPV+M4IsiwjJSUFKSkpHm2/evVq19dCCJw+fRr16tXj2Uk/EELgl/IKNCgugKFhcqDLISIiIgoqNQrAmqZh27ZtOHLkCGw2m9s6SZJw//33V7vfpk2bMH/+fOzbtw9OpxMGgwEdO3bEY489huuvv74mpVA17ELArmmILy+FbOYMEERERETn8joA5+TkoHfv3jhy5Ihr/C/gPsNDdQF49erVuPPOO9GzZ08899xzqF+/Pk6dOoWPPvoIAwcOxOuvv865gH3EqmqApiFSVSBbOAMEERER0bm8DsCzZs1CfHw8MjMz0bhxY+zevRv169fHu+++i7fffhufffZZtfs9+eSTuP322/Hmm2+6LZ85cyZuv/12LFiwgAHYR0pVFZrdBoPQoPvLVHREREREoc7reYC//vprzJ49G8nJlWNLhRBISUnBvHnzMH78eNx9993V7pebm4tRo0ZVu2706NHIzc31thQ6j/QKO2JKiqA3GCGZzIEuh4iIiCioeB2Ai4uLkZCQAFmWERUV5RZcu3btim+//bba/bp06YL9+/dXu27//v3o3Lmzt6XQeeQ5FUSVlcLYsBEk2etvMREREVGd5vUQiCZNmiA7OxsAcPnll+Odd97BTTfdBADYuHEj4uLiqt3v6aefxujRo2Gz2XDzzTcjMTERubm52LhxI95++22sW7cOBQUFru3Pdxz6ezZNgyYEEh02yPGxgS6HiIiIgtTEiROxd+9e/PTTT4EupdZ5HYAHDhyITZs2YeTIkXjkkUcwdOhQJCYmwmAwICcnB4sWLap2v65duwIA5s+fjyeffNK1/OxFdN26dXPbXlVVb0sjADl2JwAg0loO6HQBroaIiIgo+HgdgJ999lnX1zfeeCN27tyJjRs3oqKiAv3798eNN95Y7X5vvfUW5/ytBblOJ5JNRhg0DbrwiECXQ0RERBR0vBogarPZ8MILL7idKu/UqROeeuopvPDCC+cNv0DlafYJEyZ4/IdqJsvugNFhh+Z0QDIaA10OERFRSPr5558xcOBAxMfHIywsDC1btsTixYsBALt27cKQIUPQoEEDhIeHo3379njnnXfc9t++fTskScKXX36JkSNHIiIiAikpKXj//fcBAC+99BJSUlIQFxeHSZMmwW63u/Zds2YNJEnCd999hz59+iAsLAxpaWl46623Llj3iRMnMG7cONSrVw8WiwU9e/bEvn37fPjOBAevzgCbzWY88sgj6NixY42fsLCwED/99BMyMzNx4403IjY2FjabDUaj0e1WyuQ9IQScmkB8VgYkgwH6WI6jJiIiCoTBgwejfv36ePPNNxEdHY2jR4/ixIkTAID09HR0794dd911F8xmM3bs2IE777wTmqZVOQk4bdo0TJw4EZMnT8brr7+O8ePH44cffsBPP/2E1157DX/88QdmzZqFpk2bYt68eW77jho1ClOnTsWcOXOwfv163HnnnWjQoAFuuOGGamsuLCzEtddei4iICLz88suIjo7Gyy+/jD59+uC3335DYmKif96sAPB6CET79u3xyy+/oFevXl7tp2kaHnnkEbz00kuwWq2QJAl79uxBbGwsbrnlFlxzzTV4/PHHvS2HzlGuVd4AQ5eZjrDLr+AMEERERAFw+vRpHDt2DMuWLcPgwYMBANddd51r/bnTwgoh0LNnT5w4cQIrV66sEoBHjBiBxx57DADQuXNnfPzxx1i3bh1+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TXcAQIQPb4WcdZ5bIR86dAiffPIJbrvtNjRu3Bh5eXl444030LVrV5SWlsJisSAmJgaFhYVYsGDBRdfx3nvvYfz48WjVqhXmzp2L7t27u539BSq/h1OnTsX999+PFStWIDk5Gbm5udi1axeGDh0KoPIiubPDgxRFgc1mg8FgqNXhEV53WWZmJq688krcc889OHz4MGRZxuHDh3HPPfegXbt2blcETpgwAffeey+6dOmCH374we04mqbhxRdfROvWrbF792589NFHF/9qzvHpp5/izjvvxOjRo/HKK69g3Lhx6Nmzp2v9Aw88gJMnT2Ls2LFYunQppk+ffslNgWbXNJhUBVAVyKbAXUlJREREtS8yMhJ79+5Ft27dEBERgfbt2yMiIgJr167FfffdB4fDgYSEBFxzzTXo37//RT/fxIkTMX36dCQkJODw4cN47733qt3u2WefRbt27dCjRw9ERkaiW7du+P77713rBwwYAIvFgm+++QYzZ86ExWLBO++8c9H1eUMSXp4LHzFiBPbv34/PP/8cLc+59e7hw4dx00034aqrrsIHH3zgWr5v3z5MnToVP/74I2bOnIknn3wSP/74I6ZNm4ZffvkF9957L5544gm3M8fBKCsrC6tWrcKUKVPQoEEDnx5b0zTXcBFv/uf7m9WGYwUF6LhnB+KG3BIS8wDzI0XP1bSvQhH7ynPsK8+xrzznz77y5+/v6uzbtw9A5dhcXzly5Ag6VnMRXG3q3bs3Ro0ahbvuuiugdfiK1122efNmPP30027hFwBatmyJBQsWYNOmTW7LO3bs6Bpe8PrrryMtLQ09evRAVFQU9u/fj+eeey7ow2+wsmkajJqAJMshEX6JiIiIfMHrAKwoSpXZEs6yWCzVjuOVZRlxcXEwmUzIz8+HEAI33HCDa+oNqhm7psGkqZD0Nb6hHxEREVHI8ToAd+/eHQsXLkRxcbHb8uLiYjz11FPo3r272/LffvsNffv2xe23346bbroJGRkZmDt3Lp588km0b98e33zzzcW9ghBm0wSMqgJJbwh0KURERFSHbd++vc4MfwBqEICXLFmCo0ePonHjxrj55psxdepUDBs2DI0bN8bvv/+O559/3rXt448/jiuvvBLZ2dnYtm0bVq9ejUaNGmHhwoU4cOAA6tWrh969e+OOO+5Afn6+T19YKChRVBjsNshn5uojIiIiogvzOgBfccUV+PHHHzFp0iRkZWVh27ZtyMrKwuTJk/HDDz/giiuucG37/PPP49FHH8UPP/yAXr16uR2nVatW2L59O9588018+umnaN269cW/mhDi1ATKVRUWBmAiIiIir9Ro8GijRo3wwgsvXHC7n376CU2aNPnbbSZOnIjBgwdjzpw5NSklZJVrlWOtYyoqIEdHBbgaIiIiOteR88zdS8HBowBst9uxatUqXH311ejSpUu123z33XfYs2cPpk6dCqPRCAAXDL9nxcfHu27jR54pcqqQJQkGWznkpPqBLoeIiIiAgE9XRp7xKACvWLECixYtwqFDh867TevWrXHLLbcAAGbOnOm2LicnB5s2bcKhQ4dQUFAAAIiLi0OrVq0wYMAAn99aOBSUqyrCdTLU4mLI5upn5SAiIiKiqjwKwOvXr8fMmTMRExNz3m2io6Nx991347333nMFYKfTidmzZ+O1116DqqpITk5GbGwsAKCwsBDZ2dnQ6XSYNm0alixZAj2n8/KYVdMQfWZedclkCmwxRERERJcQjxLnzz//jGeeeeaC23Xp0sVtu0ceeQTvvPMOXnnlFYwcORLR0dFu25eUlOCDDz7Agw8+CIvFgmeffdbL8kOXQxPQTp8GAOgiOQaYiIgoGJy9E5yvcWiFb3k0C4Q3d0vWNM319dtvv40XX3wRkydPrhJ+ASAqKgqTJk3CkiVLsHbtWo+fgwCHEIiwlkMfHQ35zJhrIiIiIrowj84AN23aFDt27ECfPn3+drsdO3agadOmrselpaVo1KjRBY/fqFEjlJaWelIKnWHXNBgcNhgSeQEcERFRsGnRooXPjsUZJXzPozPAw4cPx4svvohff/31vNv8+uuvWLp0KUaOHOla1rVrVzz99NNV7hp3rpKSEjz99NPo1q2bF2WTXRMwVFgh8QI4IiIiIq94dAb4n//8Jz766CN07twZ06ZNw/XXX4+UlBRIkoSMjAx8+eWXePXVV5GWloZZs2a59lu+fDn69OmDxo0bo1+/fmjVqpXrQrri4mIcOnQIW7ZsQWRkJLZu3eqXF1gXaULAoarQlRRDbtY80OUQERERXVI8CsDh4eHYvn27a7aGJUuWVNlm+PDhWLFiBcLDw13LWrZsiZ9//hmvvvoqvvjiC7z55psoLCwEAMTGxqJVq1aYO3cu7rrrrr+dYYLc2TUBzW6DUdNgiK8X6HKIiIgoxEmShF9//RWtWrUKdCke8Xjesfj4eHzwwQfIyMjAN998g5MnTwIAGjZsiJ49e6Jx48bV7hcTE4O5c+di7ty5vqmYUKaqUMvKYDaaIJnNgS6HiIiIAmTnzp2YM2cODh48CABo3rw5nnzySQwcODDAlVXvyJEjePDBB7Fr1y7Y7Xa0a9cOS5YsQadOnWq1Dq8n3k1JScHYsWP9UQt5KN+pQK8osMREQ5KkQJdDREREAVBSUoJBgwZh6dKlGDt2LFRVxffffx/U2aCoqAgDBw7EG2+8gdjYWKxYsQI33ngjjh8/7jaKwN88ugjO3/bt24c77rgj0GVcMkoUFVEOG6DTBboUIiIiCpAjR47A6XRiwoQJ0Ov1MJlM6NGjB6699lqUlJRg8ODBSExMRGxsLAYOHIiMjAzXvr1798bDDz+MXr16ITw8HL1790Zubi5mz56NuLg4NG3aFNu3b3fbfu7cuejWrRsiIyPRt29fZGZmVluXw+HAvHnz0KRJE9SrVw9jxoxxDYHt3LkzpkyZgnr16kGn02HmzJkoLy//27sN+0NQBODjx49zHmAv2IWARVV4AwwiIqIQ1qJFC5jNZowZMwaffvop8vLyXOs0TcOECRNw/PhxZGZmIioqCtOnT3fb/7333sPKlSuRl5cHVVXRpUsXXH755cjLy8P06dMxZcoUt+3feustLF++HHl5eWjevDnGjRtXbV1z587F/v37sXv3bmRmZsJoNOLuu++udts9e/ZA0zQ0b167F/X79d7D+/fv92i7P/74w59l1Dl2TUOcww7ZlBDoUoiIiOgcO3QmAMChojKfHTNfZ0J194GLiorCzp07sXjxYsyYMQMnTpxAz5498frrr6N58+YYPny4a9u5c+fi2muvddt/4sSJrovWhg0bhlWrVrk+kR8zZgweeOABlJWVISIiAgAwbtw4dOjQAQCwaNEixMXF4cSJE273fBBC4LXXXsPevXuRmJgIAFiwYAGaNWuGt99+G7pzPr3Oz8/HuHHj8OSTT1Z7wzR/8msA7tSpk0fjUIQQQT1eJdgomoBUVgrJxDvAERERhbIWLVrgjTfeAACkp6djypQpGD9+PLZu3Yr7778fX3zxhWv4QVlZGex2O0ymypCelJTkOk5YWFiVx2f3ORuAU1JSXOtjYmIQFRWFkydPugXgvLw8WK1WdO3a1a1OWZaRk5ODhg0bAqicDvf666/HDTfcgAcffNBn74en/BqAo6Oj0b9/f8yYMeNvt9u+fTuefPJJf5ZSpxSXl6GBENBFRAa6FCIiIgoSqampmDlzJkaPHo0lS5bgl19+wXfffYfk5GT88MMPaN++PYQQNT7+uWOIi4qKUFJS4gq0Z9WrVw8WiwUHDhxAWlpatcc5G36vvvpqLFu2rMb1XIwaBeDTp0/j+eefx549e5CZmYmNGzfi8ssvx7Jly3DNNdegS5cuAICrr74aeXl56NWr1wWPR55xagJauRVhYRboo2MCXQ4RERGdo7tqBwC0iInw2TGP5GZVu/zQoUP45JNPcNttt6Fx48bIy8vDG2+8ga5du6K0tBQWiwUxMTEoLCzEggULLrqO9957D+PHj3fdx6F79+5uZ3+ByjO9U6dOxf33348VK1YgOTkZubm52LVrF4YOHYqSkhLccMMNaNOmDVasWHHRNdWU1xfB7d+/H5dddhnWr1+PRo0a4ffff4fdXvnNPnnyJF588UXXtj169MDRo0cveMyEhAT07NnT21JCklVTodmsiDnz0QQRERGFpsjISOzduxfdunVDREQE2rdvj4iICKxduxb33XcfHA4HEhIScM0116B///4X/XwTJ07E9OnTkZCQgMOHD+O9996rdrtnn30W7dq1Q48ePRAZGYlu3brh+++/BwBs3LgR3333HTZs2IDIyEhEREQgIiIC33zzzUXX5w1JeHku/Ox0Gf/+978hSRKMRiP27t2LDh064F//+hdmzZqF9PR0f9UbMFlZWVi1ahWmTJmCBg0a+PTYmqYhJycHSUlJkOW//z9JeoUd3/z8M4aZDQi/oq1P67gUCCGgKAr0ej3HjV+AN30V6thXnmNfeY595Tl/9pU/f39XZ9++fQAqx+b6ypEjR9CxY3WXwdWe3r17Y9SoUbjrrrsCWoeveD0EYs+ePfj4449hMBigqqrbuoSEBOTm5vqsOKpKEQJGmw26erGBLoWIiIjokuT1f7PCw8NRUlJS7bqMjAzEx8dfdFF0fk5Ng8Vugy6SF8ARERER1YTXAfj666/HwoULkZ+f71omSRIqKiqwbNmyv733tKZp6NOnD3777Te3r8lztpJi6IQG2cIxwERERFQ7tm/fXmeGPwA1CMCLFi1CSUkJLrvsMowcORKSJOGRRx5BmzZtkJ+fj4ULF553XyEEtm/fjtLSUrevyXOO8nIY9HroeBEcERERUY14HYAbNmyIAwcOYObMmcjOzkazZs2Qn5+PsWPHut31g/zDXlYGU3h4oMsgIiIiumTVaB7gmJgYzJ8/H/Pnz/d1PXQBTrsdZiPvAEdERBTMjhw5EugS6G/49U5w5FtC01BmtyMmJibQpRAREVE1Aj1dGXnG6wDsdDqxZMkSfPjhh8jMzITNZnNbL0kSiouLfVYg/UkrL0MRJLThMBMiIiKiGvM6AE+fPh1vv/02hgwZghtuuAFGfhxfa8rz8wFJQizHABMRERHVmNcB+OOPP8aLL76I6dOn+6Me+htFRUWQjSZEGwyBLoWIiIjokuX1LBARERFo2rSpP2qhCygsL4ccFga9zFtqEhEREdWU1wF49uzZeOWVV6rcBtkTkiShV69eiIyMdPuaLkyrqIC1tBT1Y6IDXQoRERHRJc3rIRD33HMPsrKy0KxZM/Ts2bPKjASSJGHZsmXV7ivLMr766ivX43O/vhRERERAr9dDCOHT4wohXMc937HtJzPhkGSERUX5/PkvJWdfeyi/B57ypK+oEvvKc+wrz7GvPOfPvtLrOeEVVeV1V6xbtw7PP/88JEnC1q1bq1wE93cB+FK1bt06rF69GldffTViY2OhKIrPnyM2NhaapkHTtGrXKzYbrOERsAjhl+e/1NTkE4hQdKG+InfsK8+wr7zDvvKMv/oqNjbWp8ejusHrAPzQQw9h+PDhWLVqFaKiomr0pBUVFZBlGSaTqUb717bRo0ejV69eeP/991FYWIiEhASfHl/TNOTn5yM+Ph6yfJ5RKVYrhMkMvU4X0v+bFUJAVVXodDpIEsdC/x2P+ooAsK+8wb7yHPvKc/7sq7y8PJ8ej+oGr5NUQUEBJk+eXOPwK4RAy5YtERcXhwMHDtToGIFSVlYGRVF8/oNMkiTXcc93bEmW4ZRkxBr0/EEK/O17RZU86Styx/fqwthX3uN7dWH+7Ct+akrV8fq/WQMHDsSuXbtq/ISbN29GVlYWDh48iH379tX4OKFGaCocBiNMPONCREREdFG8PgN85513Yvr06bBarejXr1+1t+Xt0KHDefd/6623MGDAABQXF+Ott97iLQM9pKkqnLLMAExERER0kbwOwDfccAMA4Nlnn8Wzzz7r9lGFEAKSJJ13wH9hYSH+85//YO3atSgoKMC8efPw4osv8m5yHrApKiBJMHEOYCIiIqKL4nUAvpipy95//31YLBbcfPPNKC8vx/3334+PP/4Yo0aNqvExQ4W1tARy/cYwSzwDTERERHQxvA7AvXr1qvGTrV69GrfddhsMBgNiYmIwdOhQvPnmmwzAFyAUBcWQIBn0vAscERER0UWq8XxaP//8M7799lsUFBQgLi4O1157LS6//PLzbv/jjz/if//7H1asWOFa9o9//AODBw9GRkYGUlJSalpKnSecTqiQEGa8NKaNIyIiIgpmXgdgu92O8ePH41//+heEEDCZTLDb7ZAkCcOHD8c777xT7Zje1atXo1WrVujcubNr2fXXX4/ExESsXbsWjz766MW9kjpMKE44JQkRxtCd/5eIiIjIV7weUDpv3jx89tlneO2111BUVISKigoUFRXhtddew2effYZ58+ZV2cfpdOK9997DhAkT3J9cljF27FisXr265q8gBGg2G+x6PYx6Q6BLISIiIrrkeX1Kcf369XjmmWcwefJk17KoqChMnjwZVqsVixcvxvPPP++2z6lTpzBjxgxMnDixyvFmzJiBiIgI1x1gqCrNbofdaEK0XhfoUoiIiIgueTW6E1yrVq2qXdeqVSsUFBRUWd6oUSM8/vjj1e6TlpZ23nVUSbNVoNxohkXHGSCIiIiILpbXiapVq1Z45513ql337rvvnjccU80Jmw12oxF63kqTiIiI6KJ5fQb40UcfxYgRI3D8+HHceuutqF+/PnJzc/HRRx9h165d+PDDD13bvvrqq7jjjjtgMnk+e8HBgweRl5eHPn36eFtanaXa7RA6MyJ1HAJBREREdLG8PgN8yy23YOPGjbBarZg9ezbGjh2LWbNmwWq1YuPGjRg2bJhr2zVr1iA1NRX3338/du7cCafTWe0xs7Ky8Oabb6Jfv37o1q0bCgsLa/6K6iC7wwGh18PM2yATERERXbQazas1ZMgQDBkyBOXl5SgqKkJMTAzCw8OrbLd7925s3LgRy5Ytw0svvQSDwYAWLVogISEBJpMJRUVFOHbsGHJzcxEXF4cJEybg3XffRVJS0kW/sLrEXlEBKUYHI2+CQURERHTRLmpi2fDw8GqD77mGDRuGYcOG4fjx49iyZQv27t2L7Oxs2Gw2pKamYsCAAejevTt69+4Ng4HTfFXHZrcBkgQjxwAT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77jsssvw2muvYcqUKa59H3roIaxduxYnT56ELLt/CCaEgKqqWLx4MZYvX46srCwAwBdffIEbb7wRW7duRZ8+fQAAxcXFaNy4MeLi4nD8+HEAwBVXXIHrr78eS5Ys8cl7RURE/sEhEERUq9q3b4/27dvjt99+w6BBg9C+fXsUFBSgS5curnV/F37PWrFiBQwGA8LCwtCzZ09YLBasW7fOtX7Lli0AgFtvvRWKorj+9OvXDzk5Oa4ZI2w2Gx5//HE0b94cJpMJBoMBDz/8MLKzs1FWVgYA2L17N6Kjo13hFwCio6PRr18/t5o6dOiANWvW4Pnnn8dPP/100e8VERH5BwMwEdUaVVWhKArS09Nx4sQJXH311VAUBd99953ra1VVPTrWyJEjsWfPHnzzzTeYO3cujhw5gqlTp7rWnz59GkII1KtXDwaDwfWnf//+AOAKwHPmzMFzzz2HyZMn4/PPP8eePXvwyCOPAKgMxwCQnZ2NhISEKjXUr1/f7fHLL7+M8ePHY8mSJWjbti1SUlLw6quvev9GERGRX3EMMBHVmmbNmrnG6gJAo0aNXF9v3rwZjz32GHr16oXt27df8FgJCQno1KkTAODaa69FWVkZXn75Zdx333245pprEBcXB0mS8O2338JoNFbZv2XLlgCADz/8EFOnTsWcOXNc684OozgrOTkZeXl5VY5x6tQpt8fR0dFYunQpli5dioMHD2LZsmWYPn06rrjiCvTo0eOCr4mIiGoHzwATUa355JNPsGfPHgwdOhS33nor9uzZg7feegsWiwW7d+/Gnj17sHLlyhod+4knnkBUVBSefvppAEDfvn0BAPn5+ejUqVOVP5GRkQCAiooKt4CsqirWr1/vduzOnTujuLgY27Ztcy0rLi52DbOoTtu2bV0zTvz66681ek1EROQfPANMRLWmbdu2ACqnQHvqqafQqVMnbN68GT169EDnzp0v6thxcXGYOXMmnn76afz6669o3bo1ZsyYgfHjx+OBBx7ANddcA6fTiSNHjuCrr77C//3f/wEA+vfvj9dffx1t2rRBvXr1sGLFCtjtdrdj33DDDejQoQPGjh2LRYsWISYmBs888wyioqLctuvevTuGDRuGK664AjqdDm+//TaMRiPP/hIRBRmeASaiWnX06FEcO3bMNRb3yy+/xIABA3xy7FmzZiEyMhKLFi0CALz00ktYuHAh1q9fj0GDBmHcuHHYsGEDevXq5drn5ZdfRq9evTBz5kzceeedaNu2LebNm+d2XEmS8O9//xsdO3bE1KlTcdddd2HIkCEYPny423bdu3fH22+/jREjRmD48OE4duwYPvnkE7Ru3donr4+IiHyD06ARERERUUjhGWAiIiIiCikMwEREREQUUhiAiYiIiCikMAATERERUUhhACYiIiKikMIATEREREQhhQGYiIiIiEIKAzARERERhRQGYCIiIiIKKQzARERERBRSGICJiIiIKKT8fzuH01oqNYjMAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<ggplot: (8762430651353)>"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(ggplot(df, aes(x='n_reads', y='genome_coverage')) \n",
" + theme_bw()\n",
" + geom_line(aes(color='sample'), alpha=0.5)\n",
" + theme(axis_ticks_minor=element_line(color='gray', size=0.5))\n",
" + xlab('# Reads')\n",
" + ylab('Genome Coverage (%)\\n(>=10X depth)')\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"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.9.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment