diff --git a/02_activities/assignments/a1_sampling_and_reproducibility-frm.ipynb b/02_activities/assignments/a1_sampling_and_reproducibility-frm.ipynb new file mode 100644 index 00000000..28e2f028 --- /dev/null +++ b/02_activities/assignments/a1_sampling_and_reproducibility-frm.ipynb @@ -0,0 +1,329 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "ed39f379", + "metadata": {}, + "source": [ + "# Assignment 1: Sampling and Reproducibility\n", + "\n", + "The code at the end of this file explores contact tracing data about an outbreak of the flu, and demonstrates the dangers of incomplete and non-random samples. This assignment is modified from [Contact tracing can give a biased sample of COVID-19 cases](https://andrewwhitby.com/2020/11/24/contact-tracing-biased/) by Andrew Whitby.\n", + "\n", + "Examine the code below. Identify all stages at which sampling is occurring in the model. Describe in words the sampling procedure, referencing the functions used, sample size, sampling frame, any underlying distributions involved. \n" + ] + }, + { + "cell_type": "markdown", + "id": "4ea73db3", + "metadata": {}, + "source": [ + "First, we are looking at a sample of all individuals attending weddings and brunches according to the guestlist. This sample is limited to all weddings and brunches registered at a venue, private at home weddings and brunches may be left out of this sample. It is also unknown if providers, staff, are counted in this sample.\n", + "It appears that wedding is considered to have 200 guests and brunch had 800. \n", + "Now we have a sampling frame. Out of this the model is considering 10% of individuals in each even to be infected (ATTACK_RATE). The ATTACK_RATE is a limitation here, assuming 10% for all events. The model is successful tracing 20% of true positive cases based on event contact. If 2 or more individuals are infected the model is going to trace them all. \n", + "The model then uses a random function to infect a random 10% of the population.\n", + "Then randomly picks a number of infected to be traced, which is going to be a maximum of 20% of the sick population.\n", + "According to the plot, weddings are greater infection hub than them being traced to. But weddings have fewer attendees, so it is more likely when they go over SECONDARY_TRACING_THRESHOLD they are over-represented.\n" + ] + }, + { + "cell_type": "markdown", + "id": "7e29bfa1", + "metadata": {}, + "source": [ + "## Q1 Improved: Four Sampling Stages in the Simulation\n", + "\n", + "Step 1\n", + "Function Used: `pd.DataFrame()` with list concatenation\n", + " ```python\n", + " events = ['wedding'] * 200 + ['brunch'] * 800\n", + " ppl = pd.DataFrame({'event': events, 'infected': False, 'traced': np.nan})\n", + " ```\n", + "Sampling Frame: The theoretical population of all possible event attendees\n", + "Sample Size: 1,000 individuals (200 assigned to weddings, 800 to brunches)\n", + "Underlying Distribution: Deterministic allocation (not random - always exactly 200 and 800)\n", + "Procedure: Creates the initial population DataFrame that subsequent sampling stages will draw from\n", + "\n", + "This step establishes the population structure but is not technically sampling - it's population creation.\n", + "\n", + "\n", + "Step 2: Infecting Random Subset \n", + "Function Used: `np.random.choice(...)`\n", + " ```python\n", + " infected_indices = np.random.choice(ppl.index, size=int(len(ppl) * ATTACK_RATE), replace=False)\n", + " ppl.loc[infected_indices, 'infected'] = True\n", + " ```\n", + "Sampling Frame: All 1,000 individuals in the DataFrame (entire population from Step 1)\n", + "Sample Size: `ATTACK_RATE × 1000 = 0.10 × 1000 = 100` individuals\n", + "Underlying Distribution: Uniform (each person has equal probability of infection)\n", + "Procedure: Simple random sampling wo replacement - randomly selects 100 people to infect\n", + "\n", + "This simulates disease transmission where each person has a 10% chance of becoming infected.\n", + "\n", + "\n", + "Step 3: Primary Contact Tracing\n", + "Function Used: `np.random.rand(...)`\n", + " ```python\n", + " ppl.loc[ppl['infected'], 'traced'] = np.random.rand(sum(ppl['infected'])) < TRACE_SUCCESS\n", + " ```\n", + "Sampling Frame: Only the infected individuals (the ~100 people infected in Step 2)\n", + "Expected Sample Size: `TRACE_SUCCESS × infected = 0.20 × 100 ≈ 20` individuals (on average, but varies)\n", + "Underlying Distribution: Bernoulli (each infected person independently has 20% probability of being traced)\n", + "Procedure: For each infected person, generates a random number 0-1; if < 0.20, marks them as traced\n", + "\n", + "This models imperfect contact tracing - we only successfully trace about 20% of infected individuals.\n", + "\n", + "Step 4: Secondary Contact Tracing\n", + "Function Used: `value_counts()` followed by conditional threshold\n", + " ```python\n", + " event_trace_counts = ppl[ppl['traced'] == True]['event'].value_counts()\n", + " events_traced = event_trace_counts[event_trace_counts >= SECONDARY_TRACE_THRESHOLD].index\n", + " ppl.loc[ppl['event'].isin(events_traced) & ppl['infected'], 'traced'] = True\n", + " ```\n", + "Sampling Frame: Infected individuals at events that have ≥2 already-traced cases\n", + "Sample Size: Variable - all infected people at qualifying events (not a fixed number)\n", + "If an event has ≥2 traced cases, THEN trace ALL infected at that event\n", + "\n", + "This is not random sampling. This step introduces systematic bias because smaller events (weddings) are more likely to meet the threshold, leading to overrepresentation of weddings in traced cases.\n", + "\n", + "\n", + "### Summary: How These Stages Create Bias\n", + "\n", + "1. Relatively unbiased - random infection of population\n", + "2. Introduces some randomness - only 20% of cases traced \n", + "3. Introduces systematic bias- smaller events (weddings) more likely to trigger secondary tracing because:\n", + " - Weddings have 200 people, brunches have 800\n", + " - If 2 cases traced at wedding = 1% of attendees\n", + " - If 2 cases traced at brunch = 0.25% of attendees\n", + " - Weddings cross threshold more easily → overrepresented in final traced sample\n", + "\n", + "This explains why the histogram shows weddings are overrepresented in traced cases compared to actual infections." + ] + }, + { + "cell_type": "markdown", + "id": "3d9b2ccc", + "metadata": {}, + "source": [ + "Modify the number of repetitions in the simulation to 10 and 100 (from the original 1000). Run the script multiple times and observe the outputted graphs. Comment on the reproducibility of the results." + ] + }, + { + "cell_type": "markdown", + "id": "4cf5d993", + "metadata": {}, + "source": [ + "With less repititions (=10) I see drastic and irregular changes of the histogram. The outcome varies significantly each time and is inconsistent. Looks unreliable. When ran =100, it is more reproducable and the shape is more consistent. Still changes are obsereved in =100 and =1000 with each run. but the more we simulate it the more reliable the results become, despite changes." + ] + }, + { + "cell_type": "markdown", + "id": "32603ce7", + "metadata": {}, + "source": [ + "Alter the code so that it is reproducible. Describe the changes you made to the code and how they affected the reproducibility of the script. The script needs to produce the same output when run multiple times." + ] + }, + { + "cell_type": "markdown", + "id": "77613cc3", + "metadata": {}, + "source": [ + "setting a random seed.\n", + "np.random.seed(123)" + ] + }, + { + "cell_type": "markdown", + "id": "b5609d49", + "metadata": {}, + "source": [ + "## Q3: Changes Observed When Adding Random Seed\n", + "\n", + "Before adding random seed 123\n", + "Each time the script runs, `np.random` functions produce different random numbers. The simulation results vary every run. The histogram shape, position, and exact proportions change. If I run it 3 times, I get 3 different plots. If you and I run the same code, we get different results\n", + "\n", + "After:\n", + "Every run produces identical random numbers, the simulation results are exactly the same every time The histogram is *reproducible, same shape, same bars, same values. \n" + ] + }, + { + "cell_type": "markdown", + "id": "30b4a74f", + "metadata": {}, + "source": [ + "## Code" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "ab8587a0", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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6vDDD88/NOKH2n333Zdvxw/GYcOG5eVi0LMZEeWKkBx9raP2tVzGCDfPPPNMrn2LH6Y33XRTuvvuu/NjUcbKmttK8WMwmpDHNlt88cWn+/oRrOOHf/wwjh99q6++enr44YdzcI4wV7dJ6L///e901113pYMOOij/kLv00kvzj644ORInNmJ/vPvuu+nWW2/Nz41wWNn8NcofP7LjNaOJdfR5jHXFD8E42VAW++TXv/51XjZqRWMfvvrqqzng77777nn/xw+7CCzlMsZ2mVVxsiVqtyNQRUCK/7/zzjv5RMPPf/7z/Pn64osv0h//+MccAuKxclPp+LzG5yO2f/zwjM9ENOmPz0O0LIjwOi3R1zPWf8455+Tm2NFFIH6cn3feebV+TN9+++25y0D0433qqadyUJ0REdgjoESIiOMiXuuOO+7I64yTPFHeShFqovzxuY5jJY7B2L/RL3tmaoXLJx7icxLiGOnfv3/q27dvfo/x2Y3Px4Ybbpj3deVJlKg5jOXisTgZECdEQnxm47MS3xO/+c1v8nL/+te/cmuPOLkUzjrrrPT73/8+b99Y5quvvkqXXXZZPkbideqrhY33F90P4rMe+zo+B2XxWYjPRuzjEJ/d+DzHsbH//vunPn365JOC8bmMYyGWL4vXjzATn+Gf/vSn+btmRvdfWWynCHWVIgw2R039tD6zcczHPo7tH106YpkQ2yfE5yr2XYTYOJEUJ2Muv/zyvE/K331FfBdE8+74vET/6vj+jeMiPg8RkOM91D15NyPHZV3xeITV+H479NBDc2htrONyRhV9zEyYMCGvP46FeI/x9zD+ZsTfwyh3fCaBApQAZtL1118fVaqll156qea+/v375/vOPvvsmvu+/fbb0hxzzFHq0KFD6bbbbqu5/z//+U9e9pRTTvnROtdaa63ShAkTau4fOHBgvv8f//hHzX1jx479UZkOOOCAUlVVVWncuHH59qRJk0pLLbVUaYkllsjlqDRlypSa/x988MF5/TPiyy+/LM0+++ylrbfeujR58uSa+y+//PK8juuuu67mvnhvcd9XX301zXW+/vrrebnDDz98hspwzz335OXPPPPMWvfvuuuueTu///77NffFclHeyvvKr3fZZZfV3Hf++efn+z766KMfvV5927pv376lpZdeuub2d999V+revXtp3XXXLf3www9T3dbbb7993h8NFduw7ufliSeeyPdFOeqWMT4DlfsnxHvr0qVL6fTTT6+5L/ZXrOOiiy760WtWlrvua5f37a9//etaz9l5551L8803X83twYMH5+WOOOKIWsvts88+P1pnfS655JK83M0331xzXxwb66+/fmnOOecsjRw5sua9xXLx2t98803NsnHMxP3//Oc/p/k65W0Z2yO29bBhw0r3339/ackll8yfqTjOR40aVerRo0dpv/32q/Xc4cOHl+aee+5a95e/C44//vhayz7++OP5/sMOO2yq2/vjjz8uderUqXTWWWfVevzNN98sde7cudb98TqVn6eHH3643ve73Xbb1fq8/uUvfyl17Nix9K9//avWcldffXV+/jPPPJNvv/baa/n2QQcdVGu53XfffYb2X3m/1HeJbT6191HeH5XLVK4vviunpfz8O+64o8Gf2bDJJpuUVlpppVr3xbaK599yyy217n/ooYdq3T+r3wX1vcfVV1+9tOCCC5a+/vrrWt9jsQ/33nvvmXqP9Tn55JPz87t161badttt82ctjuGZPS4bsh+b4ph59dVXf/S5AIqneTlQiDjLXhZn16Ppc9R0xxn4srgvHqtvZOSoeaqsAYra5Khhjb7OZVEjURY1e1GLFE0Po0YpRg0PcXY/amKiT3TdmrEZaUI+tRqXqC2IdVb2G95vv/1yE8poMtlQUTsf6mtWXp/YDp06dco1TZWiuXnkw2jWWSlq5CtrbKPGPco6o6NSV27rqJ2KbR01xvH8cpPEqBmO/XD88cf/qD/mzG7rGRU1r5VlDNFcuLx/ojb766+/zjVp8bmLmq+yv//977lmP2p96pqRckc//ErxGYzXKu/TcjP+aBlQqb7Xm9q+jtqoGIirLI6N2PdRExm15pV222233I2isjxhRvd11E5GbWe0BIja3OjGEE1mozYt9nHUhkVZ4jNQvsRncd11180tL+qKY7dSbO/YruWuF/Vt76ipjpro+L6ofJ3YDjG4YH2vU9kcPvbn3/72t5r7oulzlD22TVnUSkbtbUznV/ka5eb05dcof+fUPdamNxBgfd9pUYbKSzRHbg7T+8xOTWyzqAmNPs+V2yyaM8exVd5mjf1dEANIxqwOUYtcWfsc32NRlsq/C7P6HqMFU7QWWWONNXLroaiRj/cXffIrm7I39LhsiCKPmXJNdry36TW3BxqP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T+1Ro0alhRdeOM9IMjVCd0o5cBs9FgAAgIb69NNP06KLLjrVx4XulHINd3ljzTXXXM1dHAAAAFq4kSNH5srbcp6cGqE7hnD/vyblEbiFbgAAAGbU9LooG0gNAAAACiJ0AwAAQEGEbgAAACiIPt0AANCCTZ48OU2cOLG5iwHtzmyzzZY6deo0y+sRugEAoIXOATx8+PD03XffNXdRoN3q0aNH6tWr13QHS5sWoRsAAFqgcuBecMEFU1VV1Sz96AcaftJr7Nix6csvv8y3F1pooTSzhG4AAGiBTcrLgXu++eZr7uJAuzTHHHPk6wjecSzObFNzA6kBAEALU+7DHTXcQPMpH4OzMq6C0A0AAC2UJuXQ+o9BoRsAAAAKok83AAC0IkOHDk0jRoxostebf/750+KLL174oHF77bVXevbZZ/M0TUWN2H7DDTekI444ollHhI8Bug444IB05513pm+//Ta9+uqrafXVV0/twQ0zsP1PPfXUdM8996TXXnst395nn33y8nFfayV0AwBAKwrcvXv3SePGjW2y1+zatSoNGVI9w8F7ZkLSxRdfnD7//PMctOaee+7UGJZccskc8OJStttuu6XtttsuNaeHHnooh88nn3wyLb300vmkRnM6/vjj8776z3/+U3Nf/L9Pnz6pf//+uaxl8f84YRD7tzzIWNH+8Ic/5BMVrZnQDQAArUTUcEfg7tPn5lRV1afw1xs7tjpVV++ZX7fI2u4PPvggrbXWWmm55ZZLRYqg2FRhcVrvNaaf+ulPfzrVZSZMmJBmn332JinPZpttls4777zc2iDmow5PPPFEWmyxxfKJgUpx/3rrrdek23DuRjoJ05z06QYAgFYmAnf37msWfmmMYL/pppumww47LB133HFp3nnnzcEumhBX1kj//e9/TzfddFMetCpqykPUpv7mN79JCyywQJprrrnS5ptvnl5//fVa6/7nP/+ZfvKTn6SuXbvmGuOdd9655jU/+eSTdOSRR+Z1lgfDipraHj161FrHVVddlZZZZpkccnv37p3+8pe/1Ho8nvvnP/85rztGso4TA/fee2/N49FEfI899sjljDAaj19//fX1bot4b4ceemhusRDrjfdeLu8hhxySa+XjffTt2zff/9RTT6V11lkndenSJQf1qJWeNGlSrW0b64vnzTPPPKlnz57pmmuuSWPGjEn77rtv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WuRTTjkln5iIkxpR9thfZVHTHH3Aoy98DJ7Wr1+/3Ec+AvrMiubuMeBeTDcXJwkiwJ9//vlphx12yAPBhWgtEIE8RlqP5WO52NZFnMwIHUr1fframZEjR+aRBL///vt8sAIALSNw9+7dJ40bV/80N7R9XbtWpSFDqttl8I4AEn1OIwSWg0JzHRfteT/QNjzzzDN5cLj3338/n4RpjGOxITlSTTcA0CJFDXcEiz59bk5VVbPeVJPWJWpYq6v3zJ8DYe//F9siAnBTtgDR4oDW5u67784DusW0YBG0oxVDNF9vaOBuLEI3ANCiReDu3v3/718I7V0EYCEYpi76cUff/mgZEieNoml79D1vLkI3AAAAbcbee++dLy2FKcMAAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQUwZBgAArUjMPTxixIgme72Y57gtzgu+6aabptVXXz1dcsklqa3YZ5990nfffZfuueeeGX7fSy65ZDriiCPyhWII3QAA0IoCd5/evdPYceOa7DWrunZN1UOGzFDw7tChwzQfP+WUU9Kpp56aWoMoZ4TX1157bZbWs9566+WQe/XVV9fcF/8/8MAD0/XXX5+Dcln8/4MPPkj/+te/UlN56aWXUrdu3Zrs9dojoRsAAFqJqOGOwH1znz6pT1VV4a9XPXZs2rO6Or/ujITuzz//vOb/f/vb39LJJ5+chgwZUnPfnHPOWfP/UqmUJk+enDp3btuRZLPNNkt33313rfueeOKJtNhii6Unn3yyVuiO2/3792/S8i2wwAJN+nrtkT7dAADQykTgXrN798IvDQ32vXr1qrnMPffcuea7fPs///lP6t69e3rwwQfTWmutlbp06ZL+/e9/55rdHXfcMfXs2TOH8p/85Cfp0UcfrbXe8ePHp9/97nc5qMbzll122XTttdfWPP7WW2+lbbfdNj8/1rPXXnvVaoI/ZsyYtPfee+fHF1pooXThhRdO833ccMMN6bTTTkuvv/56fg9xifvKrQ2ivLGuueaaK/3iF79IX3zxxTRDd5x4GD58eM19Tz31VDr++ONzyC776KOP0ieffJKXD59++mled48ePdK8886bX/Pjjz+uWT5OWBx11FH58fnmmy8dd9xx+URGpRl539G8vLKJfbzXP//5z2nnnXdOVVVVabnllkv33ntvrefE7bi/a9euubw33nhjfl40bQ/xPnbYYYc0zzzz5Fr0lVZaKT3wwAOpvRK6AQCAJhNh89xzz03V1dVp1VVXTaNHj07bbbddeuyxx9Krr76attlmmxzYItyWRXC89dZb06WXXpqf98c//rGm1jyC3uabb57WWGON9PLLL6eHHnooh+AIrGXHHntsDrr/+Mc/0iOPPJLD7iuvvDLVMu62227p6KOPzmExau/jEvdNmTIlh99vvvkmr2/QoEHpww8/zI9NzQYbbJBmm222XLsd3nnnnfTDDz+kAQMGpK+//jqH7RCPR4hdf/3108SJE1Pfvn3zSYpoav7MM8/k9xvbZsKECXn5CNBxIuC6667LJy+iTHVr1Bv6vsvihENsvzfeeCPvmz322COvP0R5d91117TTTjvlkxIHHHBAOvHEE2s9/+CDD84nSp5++un05ptvpvPOO69WK4f2pm235QAAAFqU008/PW211VY1t6MWd7XVVqu5fcYZZ+TwGLWphxxySHr33XfT7bffngPulltumZdZeumla5a//PLLc+A+++yza+6LIBq14vHchRdeONeK33zzzWmLLbbIj0fN7KKLLjrVMs4xxxw5JEbT96ilL4syRIiM4BnrDzfddFMO59E3Omrp64qa3nXWWScH3l/96lf5esMNN8w19j/96U/z7aWWWipfR+CO+6OsEfCjxrncTz76f0etdiy39dZb59rpE044Ie2yyy41/cQffvjhmteNkxkNfd9l0eQ9yhpiu8bJjhdffDGH/jjh0bt373T++efnx+P/0dLgrLPOqnl+nDDp169fWmWVVX60v9ojNd0AAECTWXvttWvdjnB4zDHHpD59+uRQGWE3arPLNd0xkFmnTp3SJptsUu/6orY1aonjeeXLCiuskB+Lputxidrhddddt1bQj7DYUFGuCNvlwB1WXHHFXO54bFojhpebksd13A7xnirvLzctj/f0/vvv55ru8nuKMo8bNy6/n++//z7Xvle+pzhBULltZ+V9RwuEypMG0Yz+yy+/zLejqXzdkwtxUqHSYYcdls4888xcy3/KKafkGvP2TOgGAACaTN2RsiNwR8121KhGU+oI2VFDWm5GHbXO0xKhPZqjx/MqL++9917aeOONU0sQYTpq3f/73//mcF0+gVAO3RGQow93NJMvv6fo9173PcU6dt9998LLG83hK0Vte9S8z6jf/OY3udl99K1/880388mAyy67LLVXQjcAANBsor9yNGeOgbsibEdz7soBw+K+CHzRN7k+a665Znr77bfzgGAxwFrlJQL+Msssk0PkCy+8UPOcb7/9NgfYaZl99tnzYGWVojY+wnFcyqKPdvQrjxrvqYlm5LG+K6+8MtdWR6AOUWP81Vdf5ebw5Wbo5fcUJw0WXHDBH72nGKAuLjEwWuV7mjRpUho8eHDN7Zl939MTNeXRd75SNK2vK1oD/Pa3v0133XVX7h9/zTXXpPZK6AYAAJpNjIIdwSxqcqNZddTkVtaqRpiOabR+/etf53mzoz911A5HP+/yoF0xyFf0QY7wF7XG0bd53333zaE5mmbHoGUxqNjjjz+e+x9HyO/YcdpRKF43XivKFSOhx8Bg0ac8TgLEwGIxIFn0c45B3qLGum6z+UpRWx/zdUdtbzS5jubyIYJ45f3lGuZY//zzz58HbYva//J7jmbbn332WV7m8MMPzwPSxTaJkeEPOuigmtHDw8y+7+mJgdPi9WI0+XJ/+/LI7uX+50cccUTeB1HuV155JTf/jxMW7VXH5p5wvjwEf/lS7n8R4ixQHEQxBH58aKIzft3h+KOvx/bbb5+Hs48zQfGhirM8AADQVsX82a+MGlX4JV6naBdddFGeWipqg6OZeIzaHTW9la666qo8YnYEy8gL++23X54OK8RAaVFbHgE7BhiLUByhL/pZlwNmDPq10UYb5fVHcI6BzMq1zVMT2SMGDoum4TGXdYyeHnklRgKP8kbT9VhXDBIWc5JPT6xn1KhRNf25yyKwx/3l/twhsk2M/B1zo8dAaRFYI0BHPor+1SFqj6P5dpyQiAHYov93tBaoNDPve3pi0Lc777wznyiJvt+xb8qjl8cgcCH2ReS4KPc222yTll9++VzL3151KNWdzK2JQ3fssMp5+GIAgDirEw488MB0//335zMn0YQiRi+MAycOqvLOXH311XMTlPhAxWACcaYpDsLK0QunZ+TIkXn9MSBB+UMMADSvqB2JH4drrTU4de9e+wc4bd+oUa+kwYPXys1l6waw9iDCVdQSRsCJaaQqK5z69O6dxo4b12RlqeraNVUPGZIDINQnRi6P0dMrm9239WOxITmy2acMqzsMf1kUPIa4/+tf/1ozoEAMkx9nS55//vncDCPmmos+FBHae/bsmQN4TDEQTR0i0EdzDQAAaCsi+EYAjubOTSUqxARuKkWtdfRHjxbJUSEaFaBRQUoLDd0xQEA0CSlPBH/OOefkgzrOasak8OW5+EI0JYnHnnvuuRy64zqaj0TgLovmKFFDHoMpxHx99Yn+GHGpPEMBAACtQfweFoJp7gwXU4JFX/r4LEZT95gznBYYumPOuGg6HiPgRdPw0047Lfc5iE7+w4cPzzXV0RejUgTseCzEdWXgLj9efmxqItjHawEAANAwF198cb7QCkL3tttuW/P/6IQfIXyJJZbII+BNbz6+WRFnYY466qhaNd2VE9wDAABAm5syLGq1Y2S7999/P/fznjBhQq1h70OMXl7uAx7XdUczL9+ur594WYyqFx3dKy8AAADQpkP36NGj87x6MdF7jFYa89Q99thjNY8PGTIkj9gYfb9DXL/55pvpyy+/rFlm0KBBOURPa3J6AABoDSrnqwZa5zHYrM3LjznmmDxnXDQpHzZsWDrllFPyRPExsX0MvR5z0UUz8HnnnTcH6UMPPTQH7RhELcQ8fBGuY366gQMH5n7cJ510Up4TrjxHHAAAtDYxtlFMlRu/kWOO6Lgdc0QDTSNm1o6W11999VU+FmdlZqxmDd2fffZZDthff/11/jKJydpjOrD4f4jO+fEGY2L6GG08RiavnFQ9Avp9992XRyuPMN6tW7c8Ofzpp5/ejO8KAABmTfwGjnmBY7DhCN5A86iqqsojtMcx2SpD92233TbNx2MasSuuuCJfpiZqyR944IECSgcAAM0natbix/6kSZPS5MmTm7s40O506tQpde7ceZZbmTT7PN0AAED94sd+jHMUF6B1alEDqQEAAEBbInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIII3QAAAFCQzkWtGACgtRk3bmiaOHFEcxeDlNLYsdX5urr6f69n1fzzz58WX3zxRlkXQEMI3QAA/xe4X36xd5o0ZVxzF4UKe+65Z6Osp6pr11Q9ZIjgDTQ5oRsAIKVcwx2B+8yqPmmpjlXNXZx2b8rksWnMD9VpxT59UreqWdsf1WPHpj2rq9OIESOEbqDJCd0AABUicPfp3L25i9HuTU4pjUoprV5Vlbp3tz+A1stAagAAAFAQoRsAAAAKInQDAABAWw/d5557burQoUM64ogjau4bN25cOvjgg9N8882X5pxzztSvX7/0xRdf1Hre0KFD0/bbb5+qqqrSggsumI499tg0adKkZngHAAAA0AJD90svvZT++Mc/plVXXbXW/UceeWT65z//me6444701FNPpWHDhqVddtml5vHJkyfnwD1hwoT07LPPphtvvDHdcMMN6eSTT26GdwEAAAAtLHSPHj067bHHHumaa65J88wzT83933//fbr22mvTRRddlDbffPO01lprpeuvvz6H6+effz4v88gjj6R33nkn3XzzzWn11VdP2267bTrjjDPSFVdckYM4AAAAtOvQHc3Ho7Z6yy23rHX/4MGD08SJE2vdv8IKK+S5FZ977rl8O65XWWWV1LNnz5pl+vbtm0aOHJnefvvtqb7m+PHj8zKVFwAAAGhT83Tfdttt6ZVXXsnNy+saPnx4mn322VOPHj1q3R8BOx4rL1MZuMuPlx+bmnPOOSeddtppjfQuAAAAoIXVdH/66afp8MMPT7fcckvq2rVrk772CSeckJuvly9RFgAAAGgzoTuaj3/55ZdpzTXXTJ07d86XGCzt0ksvzf+PGuvol/3dd9/Vel6MXt6rV6/8/7iuO5p5+XZ5mfp06dIlzTXXXLUuAAAA0GZC9xZbbJHefPPN9Nprr9Vc1l577TyoWvn/s802W3rsscdqnjNkyJA8Rdj666+fb8d1rCPCe9mgQYNyiF5xxRWb5X0BAABAs/fp7t69e1p55ZVr3detW7c8J3f5/gEDBqSjjjoqzTvvvDlIH3rooTlor7feevnxrbfeOofrvfbaKw0cODD34z7ppJPy4GxRmw0AAADtdiC16bn44otTx44dU79+/fKI4zEy+ZVXXlnzeKdOndJ9992XDjzwwBzGI7T3798/nX766c1abgAAAGhxofvJJ5+sdTsGWIs5t+MyNUsssUR64IEHmqB0AAAA0Mrm6QYAAIC2SugGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABelc1IoBoK0aOnRoGjFiRHMXo82rrq7O12PH/u910ZrqdQBoX4RuAGhg4O7Tu3caO25ccxel3aiu3rNJX69UmtCkrwdA2yZ0A0ADRA13BO6b+/RJfaqqmrs4bdqYsWPTO9XVqdscfVLHTsVv62cmfZ2uHPdxKk2ZVPhrAdB+CN0AMBMicK/ZvXtzF6NNG5VSivjbvVNV6tS5+G390eSxhb8GAO2PgdQAAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBOs/Mkz788MO09NJLN35pAKDC0KFD04gRI1JLUl1dna/HjB2bRjV3Ydq42MYA0C5D97LLLps22WSTNGDAgLTrrrumrl27Nn7JAEjtPXD37t0njRvXMoPXO9XVaVJzF6KdmFIqpU7NXQgAaMrQ/corr6Trr78+HXXUUemQQw5Ju+22Ww7g66yzzsyWAwBqiRruCNx9+tycqqr6pJZi7NjqVF29Z+o2R5/UvVNVcxenTZs46Zs0btxHqVQqNXdRAKBpQ/fqq6+e/vCHP6QLL7ww3XvvvemGG25IG264YVp++eXTr3/967TXXnulBRZYYOZLBQD/JwJ39+5rppamY6eq1Klz9+YuRps2eUrLbOUAAE02kFrnzp3TLrvsku6444503nnnpffffz8dc8wxabHFFkt77713+vzzz2dl9QAAANB+Q/fLL7+cDjrooLTQQguliy66KAfuDz74IA0aNCgNGzYs7bjjjo1XUgAAAGgPzcsjYEef7iFDhqTtttsu3XTTTfm6Y8f/zfBLLbVUbnK+5JJLNnZ5AQAAoG3XdF911VVp9913T5988km655570s9+9rOawF224IILpmuvvXa661l11VXTXHPNlS/rr79+evDBB2seHzduXDr44IPTfPPNl+acc87Ur1+/9MUXX/xodNvtt98+VVVV5dc89thj06RJxpMFAACgldZ0v/fee9NdZvbZZ0/9+/ef5jKLLrpoOvfcc9Nyyy2XRya98cYbc5P0V199Na200krpyCOPTPfff3/uMz733HPnkdKjD/kzzzyTnz958uQcuHv16pWeffbZ3Ic8+pLPNtts6eyzz56ZtwYAAADNW9MdTcsjCNcV90VwnlE77LBDbpYeoTtGPj/rrLNyjfbzzz+fvv/++1xTHk3ZN99887TWWmvl141wHY+HRx55JL3zzjvp5ptvziOqb7vttumMM85IV1xxRZowYcLMvDUAAABo3tB9zjnnpPnnn/9H90fz7pmtYY5a69tuuy2NGTMmNzMfPHhwmjhxYtpyyy1rlllhhRXS4osvnp577rl8O65XWWWV1LNnz5pl+vbtm0aOHJnefvvtmSoHAAAANGvz8uhHHYOl1bXEEkvkxxrizTffzCE7+m9HLffdd9+dVlxxxfTaa6/lJuo9evSotXwE7OHDh+f/x3Vl4C4/Xn5sasaPH58vZRHSAQAAoEXUdEeN9htvvPGj+19//fU86FlD9O7dOwfsF154IR144IG5H3g0GS9S1NRHH/HyJeYVBwAAgBYRun/1q1+lww47LD3xxBO5WXhcHn/88XT44YenX/7ylw1aV9RmL7vssrnPdoTh1VZbLf3hD3/Ig6NFv+zvvvuu1vIxenk8FuK67mjm5dvlZepzwgkn5D7j5cunn37aoDIDAABAYaE7Bitbd9110xZbbJHmmGOOfNl6663zgGezOmr4lClTctPvCOExCvljjz1W81jMCx7N16M5eojraJ7+5Zdf1iwzaNCgPP1YNFGfmi5dutRMU1a+AAAAQIvo0x2103/7299y+I4m5RG6Y0Cz6NPdEFHjHCOOx+Boo0aNSn/961/Tk08+mR5++OHc7HvAgAHpqKOOSvPOO28OxoceemgO2uutt15+fgT9CNd77bVXGjhwYO7HfdJJJ+W5vSNYAwAAQKsL3WUxzVdcZlbUUMe82jG/doTsVVddNQfurbbaKj9+8cUXp44dO6Z+/frl2u8YmfzKK6+seX6nTp3Sfffdl/uCRxjv1q1b7hN++umnz8rbAgAAgOYL3dGH+4YbbshNvyM4R5PwStG/e0bEPNzT0rVr1zzndlymJmrXH3jggRksOQAAALTw0B0DpkXo3n777dPKK6+cOnTo0PglAwAAgPYYum+77bZ0++23p+22267xSwQAAADtefTy8jRfAAAAQCOH7qOPPjrPpV0qlWbm6QAAANAuzFTz8n//+9/piSeeSA8++GBaaaWV8nzale66667GKh8AAAC0r9Ddo0ePtPPOOzd+aQAAAKC9h+7rr7++8UsCAAAAbcxM9ekOkyZNSo8++mj64x//mEaNGpXvGzZsWBo9enRjlg8AAADaV033J598krbZZps0dOjQNH78+LTVVlul7t27p/POOy/fvvrqqxu/pAAAANAearoPP/zwtPbaa6dvv/02zTHHHDX3Rz/vxx57rDHLBwAAAO2rpvtf//pXevbZZ/N83ZWWXHLJ9N///rexygYAAADtr6Z7ypQpafLkyT+6/7PPPsvNzAEAAICZDN1bb711uuSSS2pud+jQIQ+gdsopp6TtttuuMcsHAAAA7at5+YUXXpj69u2bVlxxxTRu3Li0++67p/feey/NP//86dZbb238UgIAAEB7Cd2LLrpoev3119Ntt92W3njjjVzLPWDAgLTHHnvUGlgNAAAA2rPOM/3Ezp3Tnnvu2bilAQAAgPYeum+66aZpPr733nvPbHkAAACgfYfumKe70sSJE9PYsWPzFGJVVVVCNwAAAMzs6OXffvttrUv06R4yZEjacMMNDaQGAAAAsxK667Pccsulc88990e14AAAANBeNVroLg+uNmzYsMZcJQAAALSvPt333ntvrdulUil9/vnn6fLLL08bbLBBY5UNAAAA2l/o3mmnnWrd7tChQ1pggQXS5ptvni688MLGKhsAAAC0v9A9ZcqUxi8JAAAAtDGN2qcbAAAAmMWa7qOOOmqGl73oootm5iUAAACgfYbuV199NV8mTpyYevfune979913U6dOndKaa65Zq683AAAAtFczFbp32GGH1L1793TjjTemeeaZJ9/37bffpn333TdttNFG6eijj27scgIAAED76NMdI5Sfc845NYE7xP/PPPNMo5cDAADArITukSNHpq+++upH98d9o0aNmplVAgAAQJszU6F75513zk3J77rrrvTZZ5/ly9///vc0YMCAtMsuuzR+KQEAAKC99Om++uqr0zHHHJN23333PJhaXlHnzjl0n3/++Y1dRgAAAGg/obuqqipdeeWVOWB/8MEH+b5lllkmdevWrbHLBwAAAO2reXnZ559/ni/LLbdcDtylUqnxSgYAAADtMXR//fXXaYsttkjLL7982m677XLwDtG83HRhAAAAMAuh+8gjj0yzzTZbGjp0aG5qXrbbbrulhx56aGZWCQAAAG3OTPXpfuSRR9LDDz+cFl100Vr3RzPzTz75pLHKBgAAAO2vpnvMmDG1arjLvvnmm9SlS5fGKBcAAAC0z9C90UYbpZtuuqnmdocOHdKUKVPSwIED02abbdaY5QMAAID21bw8wnUMpPbyyy+nCRMmpOOOOy69/fbbuab7mWeeafxSAgAAQHup6V555ZXTu+++mzbccMO044475ubmu+yyS3r11VfzfN0AAADATNR0T5w4MW2zzTbp6quvTieeeGIxpQIAAID2WNMdU4W98cYbxZQGAAAA2nvz8j333DNde+21jV8aAAAAaO8DqU2aNCldd9116dFHH01rrbVW6tatW63HL7roosYqHwAAALSP0P3hhx+mJZdcMr311ltpzTXXzPfFgGqVYvowAAAAoIGhe7nllkuff/55euKJJ/Lt3XbbLV166aWpZ8+eRZUPAAAA2kef7lKpVOv2gw8+mKcLAwAAABppILWphXAAAABgJkN39Neu22dbH24AAABohD7dUbO9zz77pC5duuTb48aNS7/97W9/NHr5XXfd1ZDVAgAAQJvUoNDdv3//H83XDQAAADRC6L7++usbsjgAAAC0a7M0kBoAAAAwdUI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIII3QAAANAWQ/c555yTfvKTn6Tu3bunBRdcMO20005pyJAhtZYZN25cOvjgg9N8882X5pxzztSvX7/0xRdf1Fpm6NChafvtt09VVVV5Pccee2yaNGlSE78bAAAAaEGh+6mnnsqB+vnnn0+DBg1KEydOTFtvvXUaM2ZMzTJHHnlk+uc//5nuuOOOvPywYcPSLrvsUvP45MmTc+CeMGFCevbZZ9ONN96YbrjhhnTyySc307sCAACA/9U5NaOHHnqo1u0Iy1FTPXjw4LTxxhun77//Pl177bXpr3/9a9p8883zMtdff33q06dPDurrrbdeeuSRR9I777yTHn300dSzZ8+0+uqrpzPOOCP97ne/S6eeemqaffbZm+ndAQAA0N61qD7dEbLDvPPOm68jfEft95ZbblmzzAorrJAWX3zx9Nxzz+Xbcb3KKqvkwF3Wt2/fNHLkyPT222/X+zrjx4/Pj1deAAAAoM2G7ilTpqQjjjgibbDBBmnllVfO9w0fPjzXVPfo0aPWshGw47HyMpWBu/x4+bGp9SWfe+65ay6LLbZYQe8KAACA9qzFhO7o2/3WW2+l2267rfDXOuGEE3Ktevny6aefFv6aAAAAtD/N2qe77JBDDkn33Xdfevrpp9Oiiy5ac3+vXr3yAGnfffddrdruGL08Hisv8+KLL9ZaX3l08/IydXXp0iVfAAAAoM3WdJdKpRy477777vT444+npZZaqtbja621VpptttnSY489VnNfTCkWU4Stv/76+XZcv/nmm+nLL7+sWSZGQp9rrrnSiiuu2ITvBgAAAFpQTXc0KY+Ryf/xj3/kubrLfbCjn/Ucc8yRrwcMGJCOOuqoPLhaBOlDDz00B+0YuTzEFGMRrvfaa680cODAvI6TTjopr1ttNgAAAO02dF911VX5etNNN611f0wLts8+++T/X3zxxaljx46pX79+edTxGJn8yiuvrFm2U6dOuWn6gQcemMN4t27dUv/+/dPpp5/exO8GAAAAWlDojubl09O1a9d0xRVX5MvULLHEEumBBx5o5NIBAABAGxm9HAAAANoaoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABSkc1ErBgCAWTVm7NhGW0d1dXUjlIimMv/886fFF1+8uYsBs0zoBgCgxZlSmtBoQfnd/7vec889Z3ldNJ2uXavSkCHVgjetntANAECLUypNytddu/ZOs3Wec5bW1W3y2JR+qE59+tycqqr6NFIJKdLYsdWpunrPNGLECKGbVk/oBgCgxerYsSp16tx91tbRaKWhqc1ISwfN0GnphG4AANq0EVMm5OAdNae0LjPSJaCqa9dUPWSI4E2LJXQDANCmjSpNSlNSSqd3WTItM9t8zV0cZsCUyWPTmB+q04p9+qRuVVVTXa567Ni0Z3W1Zui0aEI3AADtwlId50h9ZrGpOk1jcpwsSSmtXlWVune3z2jddHEBAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAADQFkP3008/nXbYYYe08MILpw4dOqR77rmn1uOlUimdfPLJaaGFFkpzzDFH2nLLLdN7771Xa5lvvvkm7bHHHmmuueZKPXr0SAMGDEijR49u4ncCAAAALSx0jxkzJq222mrpiiuuqPfxgQMHpksvvTRdffXV6YUXXkjdunVLffv2TePGjatZJgL322+/nQYNGpTuu+++HOT333//JnwXAAAAUL/OqRltu+22+VKfqOW+5JJL0kknnZR23HHHfN9NN92UevbsmWvEf/nLX6bq6ur00EMPpZdeeimtvfbaeZnLLrssbbfddumCCy7INegAAADQXFpsn+6PPvooDR8+PDcpL5t77rnTuuuum5577rl8O66jSXk5cIdYvmPHjrlmfGrGjx+fRo4cWesCAAAA7SZ0R+AOUbNdKW6XH4vrBRdcsNbjnTt3TvPOO2/NMvU555xzcoAvXxZbbLFC3gMAAADtW4sN3UU64YQT0vfff19z+fTTT5u7SAAAALRBLTZ09+rVK19/8cUXte6P2+XH4vrLL7+s9fikSZPyiOblZerTpUuXPNp55QUAAADaTeheaqmlcnB+7LHHau6LvtfRV3v99dfPt+P6u+++S4MHD65Z5vHHH09TpkzJfb8BAACg3Y5eHvNpv//++7UGT3vttddyn+zFF188HXHEEenMM89Myy23XA7hv//97/OI5DvttFNevk+fPmmbbbZJ++23X55WbOLEiemQQw7JI5sbuRwAAIB2HbpffvnltNlmm9XcPuqoo/J1//790w033JCOO+64PJd3zLsdNdobbrhhniKsa9euNc+55ZZbctDeYost8qjl/fr1y3N7AwAAQLsO3Ztuummej3tqOnTokE4//fR8mZqoFf/rX/9aUAkBAACgDfbpBgAAgNZO6AYAAICCCN0AAADQFvt00zBDhw5NI0aMaO5iUID5558/j9gPAAC0LUJ3KwrcfXr3TmPHjWvuolCAqq5dU/WQIYI3AAC0MUJ3KxE13BG4b+7TJ/Wpqmru4tCIqseOTXtWV+d9LHQDAEDbInS3MhG41+zevbmLAQAAwAwwkBoAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACtK5qBUDkNLQoUPTiBEjmrsYrVJ1dXW+Hjv2f69bipZWHgCgZRO6AQoM3H16905jx41r7qK0atXVe6aWqFSa0NxFAABaAaEboCBRwx2B++Y+fVKfqqrmLk6rM2bs2PROdXXqNkef1LFTy9l+z0z6Ol057uNUmjKpuYsCALQCQjdAwSJwr9m9e3MXo9UZlVKKWNu9U1Xq1LnlbL+PJo9t7iIAAK2IgdQAAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKYvRyoMXPdR1Tb7VG1dXVNVNfxUjcNExsNwCA1k7oBlp04O7du08aN651h6+Ya9qMzjNvSqmUOjV3IQAAZpLQDbRYUcMdgbtPn5tTVVWf1NqMHVudqqv3TN3m6JPnmqZhJk76Jo0b91EqlUrNXRQAgJkmdAMtXgTu7t3XTK1Vx05VqVPn7s1djFZn8pTW3cIBACAYSA0AAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIJ0LmrFAAAAs2LM2LEz9PgDDzyQqqurm6hUNIWll146rb/++qktaDOh+4orrkjnn39+Gj58eFpttdXSZZddltZZZ53mLhYAANBAU0oT8vX0gvTz/9d09/e//30TlYym0jGl9O9nn20TwbtNhO6//e1v6aijjkpXX311WnfdddMll1yS+vbtm4YMGZIWXHDB5i4eAADQAKXSpHzdtWvvNFvnOae63OSJX6cp4z9Op86+cFqm09xNWEKK9MHk79OpE4alDz/8UOhuKS666KK03377pX333TffjvB9//33p+uuuy4df/zxzV08AABgJnTsWJU6de4+1cc7TP7f5uURuFfq0rMJS0ahxsc/w1Jb0epD94QJE9LgwYPTCSecUHNfx44d05Zbbpmee+65Zi0bNIR+SFPfJmPHts5t01rLDQBA42n1oXvEiBFp8uTJqWfP2me24vZ//vOfep8zfvz4fCn7/vvv8/XIkSNTSzV69Oh8PXjUqDR68uTmLg6N6LmRI1OHlNKee+7Z3EVpsaqrW/e2eWvC52nMpFHNXYxWZ9LkkflEd5eJI1LnKWNSS/HhpP/9m/H2pG/TDyXfx23pM2Dftt39b9+23f1v37ZNH07+31w2duzYFp3RymUrlUrTXK5DaXpLtHDDhg1LiyyySHq2Tif74447Lj311FPphRde+NFzTj311HTaaac1cUkBAABoaz799NO06KKLtt2a7vnnnz916tQpffHFF7Xuj9u9evWq9znRFD0GXiubMmVK+uabb9J8882XOnSIOseWeRZlscUWyzt0rrnmau7i0Ijs27bLvm2b7Ne2y75tu+zbtsu+bZtGtpL9GvXXo0aNSgsvvPA0l2v1oXv22WdPa621VnrsscfSTjvtVBOi4/YhhxxS73O6dOmSL5V69OiRWoP40LXkDx4zz75tu+zbtsl+bbvs27bLvm277Nu2aa5WsF/nnnv6o+a3+tAdota6f//+ae21185zc8eUYWPGjKkZzRwAAACaQ5sI3bvttlv66quv0sknn5yGDx+eVl999fTQQw/9aHA1AAAAaEptInSHaEo+tebkbUE0hz/llFN+1Cye1s++bbvs27bJfm277Nu2y75tu+zbtqlLG9uvrX70cgAAAGipOjZ3AQAAAKCtEroBAACgIEI3AAAAFETobkZXXHFFWnLJJVPXrl3Tuuuum1588cVpLn/HHXekFVZYIS+/yiqrpAceeKDW49E9P0ZwX2ihhdIcc8yRttxyy/Tee+8V/C5oin27zz77pA4dOtS6bLPNNgW/C2Zlv7799tupX79+efnYXzGV4ayuk9azb0899dQfHbNxjNOy9+0111yTNtpoozTPPPPkS/wdrbu8v7Vtd9/6W9v69utdd92Vpwzu0aNH6tatW57B6C9/+UutZRyzbXff7tOajtkYSI2md9ttt5Vmn3320nXXXVd6++23S/vtt1+pR48epS+++KLe5Z955plSp06dSgMHDiy98847pZNOOqk022yzld58882aZc4999zS3HPPXbrnnntKr7/+eul//ud/SksttVTphx9+aMJ3RhH7tn///qVtttmm9Pnnn9dcvvnmmyZ8VzR0v7744oulY445pnTrrbeWevXqVbr44otneZ20nn17yimnlFZaaaVax+xXX33VBO+GWdm3u+++e+mKK64ovfrqq6Xq6urSPvvsk/+ufvbZZzXL+Fvbdvetv7Wtb78+8cQTpbvuuiv/fnr//fdLl1xySf5N9dBDD9Us45htu/u2fys6ZoXuZrLOOuuUDj744JrbkydPLi288MKlc845p97lf/GLX5S23377Wvetu+66pQMOOCD/f8qUKfnH3/nnn1/z+HfffVfq0qVL/mFI69235S+VHXfcscBS09j7tdISSyxRbzCblXXSsvdthO7VVlut0ctKw8zqMTZp0qRS9+7dSzfeeGO+7W9t2923wd/a5tcYfxfXWGONXIERHLNtd9+2tmNW8/JmMGHChDR48ODcvKWsY8eO+fZzzz1X73Pi/srlQ9++fWuW/+ijj9Lw4cNrLTP33HPnphtTWyetY9+WPfnkk2nBBRdMvXv3TgceeGD6+uuvC3oXNMZ+bY510rL2QzRfXHjhhdPSSy+d9thjjzR06NBGKDFNuW/Hjh2bJk6cmOadd95829/atrtvy/ytbb37NSoTH3vssTRkyJC08cYb5/scs21337a2Y1bobgYjRoxIkydPTj179qx1f9yOL4b6xP3TWr583ZB10jr2bYj+KTfddFP+wjnvvPPSU089lbbddtv8WrTM/doc66Tl7If4QXfDDTekhx56KF111VX5h1/0Jx01alQjlJqm2re/+93v8omT8g9Ff2vb7r4N/ta2zv36/fffpznnnDPNPvvsafvtt0+XXXZZ2mqrrfJjjtm2u29b2zHbubkLAEzfL3/5y5r/x0Brq666alpmmWXy2b0tttiiWcsG/Fj80S+L4zVC+BJLLJFuv/32NGDAgGYtGzPm3HPPTbfddlv+no1Bf2j7+9bf2tape/fu6bXXXkujR4/O4euoo47KLYw23XTT5i4aBe/bX7aiY1ZNdzOYf/75U6dOndIXX3xR6/643atXr3qfE/dPa/nydUPWSevYt/WJL5x4rffff7+RSk5j79fmWCctdz/E6KvLL7+8Y7aV7NsLLrggB7NHHnkk/4gr87e27e7b+vhb2zr2azRTXnbZZfPo1kcffXTadddd0znnnJMfc8y23X3b2o5ZobsZRBOJtdZaK5+xKZsyZUq+vf7669f7nLi/cvkwaNCgmuWXWmqp/KGtXGbkyJHphRdemOo6aR37tj6fffZZ7rMS01/QMvdrc6yTlrsf4iz9Bx984JhtBft24MCB6YwzzshdA2K6mkr+1rbdfVsff2tb5/dxPGf8+PH5/47ZtrtvW90x29wjubXnYfNj5MQbbrghD4W///7752Hzhw8fnh/fa6+9Sscff3ytaaU6d+5cuuCCC/JUFzEybn1ThsU6/vGPf5TeeOONPJqfKRFa/74dNWpUnp7oueeeK3300UelRx99tLTmmmuWlltuudK4ceOa7X22Nw3dr+PHj89T08RloYUWyvsw/v/ee+/N8Dppvfv26KOPLj355JP5mI1jfMsttyzNP//8pS+//LJZ3mN71dB9G39HY0qbO++8s9YUNPE9XLmMv7Vtb9/6W9s69+vZZ59deuSRR0offPBBXj5+S8VvqmuuuaZmGcds29y3o1rZMSt0N6PLLrustPjii+c/AjGM/vPPP1/z2CabbJKHwa90++23l5Zffvm8fMz/ev/999d6PKZF+P3vf1/q2bNn/lBvscUWpSFDhjTZ+6GYfTt27NjS1ltvXVpggQVyGI8pimJuQ8GsZe/X+AMQ5zXrXmK5GV0nrXff7rbbbjmQx/oWWWSRfDvmGaVl79v4fq1v38bJ0DJ/a9vmvvW3tnXu1xNPPLG07LLLlrp27VqaZ555Suuvv34Od5Ucs21z345tZcdsh/inuWvbAQAAoC3SpxsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwDagQ4dOqR77rmnuYuRhg8fnrbaaqvUrVu31KNHj+YuDgAUTugGgKnYZ599cliNy+yzz56WXXbZdPrpp6dJkyallurUU09Nq6+++o/u//zzz9O2226bmtvFF1+cy/Laa6+ld999t7mLAwCF61z8SwBA67XNNtuk66+/Po0fPz498MAD6eCDD06zzTZbOuGEE3607IQJE3I4bw6lUilNnjx5qo/36tUrtQQffPBBWmuttdJyyy3X3EUBgCahphsApqFLly45sC6xxBLpwAMPTFtuuWW69957a2rCd9ppp3TWWWelhRdeOPXu3Tvf/+abb6bNN988zTHHHGm++eZL+++/fxo9enTNOsvPO+2009ICCyyQ5pprrvTb3/42h/ayCPmHHXZYWnDBBVPXrl3ThhtumF566aWax5988slcA//ggw/mEBvlvPnmm/M6X3/99Zoa+htuuKHe5uUzWsYLLrggLbTQQnmZOOEwceLEaW6vq666Ki2zzDL55ENsj7/85S81jy255JLp73//e7rppptyeeI1pua6665LK620Un5f8fqHHHJIzWMXXXRRWmWVVXIT9cUWWywddNBBtcr+ySefpB122CHNM888eZlYT5wwKXvrrbdyrf+cc86Zevbsmfbaa680YsSImsfvvPPOvP7ytol9PmbMmGm+bwCYGqEbABogglhlOH7sscfSkCFD0qBBg9J9992Xw1nfvn1z4IuQfMcdd6RHH320VmgsP6+6ujqH51tvvTXdddddOTCXHXfccTmg3njjjemVV17JTdtjvd98802t9Rx//PHp3HPPzeuKvtJHH310DpnRhDsuu+2224/ew4yW8Yknnsg103Ed5YgAXw7x9bn77rvT4YcfnssQwfaAAw5I++67b35+iNeKlgO/+MUvctn+8Ic/TDW4R8CPEwFxciBOcsT7L+vYsWO69NJL09tvv53L9fjjj+ftVRbPjZMWTz/9dH7+eeedlwN2+O677/LJhjXWWCO9/PLL6aGHHkpffPFFLlOIcv3qV79Kv/71r2v2zy677JJbEgDATCkBAPXq379/accdd8z/nzJlSmnQoEGlLl26lI455piax3v27FkaP358zXP+9Kc/leaZZ57S6NGja+67//77Sx07diwNHz685nnzzjtvacyYMTXLXHXVVaU555yzNHny5Pzc2WabrXTLLbfUPD5hwoTSwgsvXBo4cGC+/cQTT0QKLN1zzz21ynzKKaeUVltttR+9l1j27rvvblAZl1hiidKkSZNqlvn5z39e2m233aa6vX7605+W9ttvv1r3xXO22267mtuxPWPd0xLv88QTTyzNqDvuuKM033zz1dxeZZVVSqeeemq9y55xxhmlrbfeutZ9n376ad4+Q4YMKQ0ePDj//+OPP57h1weAaVHTDQDTELXXUUsaTbyjSXLUHMdgZWXRDLmyH3fUjq622mq5WXPZBhtskKZMmZJrxMtimaqqqprb66+/fm4i/emnn+ba5WjGHc8ri37k66yzTl5/pbXXXrvB72lGyxg15p06daq5Hc28v/zyy2mut7LM5fXWLfO0xPqHDRuWtthii6kuE7Xy8fgiiyySunfvnpuHf/3112ns2LH58WiWf+aZZ+bXPuWUU9Ibb7xR89xoeh8177FPy5cVVlghPxbbPbZLrDv2689//vN0zTXXpG+//XaGyw8AdQndADANm222WR5p+7333ks//PBDbs5cGVYr/98cinz9CPqVoh92BPOim+9Py8cff5x+9rOfpVVXXTU3vx88eHC64oor8mPlZv+/+c1v0ocffpjDeDQvjxMTl112WX4sTmxEf+/Yp5WX2L8bb7xxPskQXQWir/yKK66Ynxd90z/66KNC3zcAbZfQDQDTCbXRn3jxxRdPnTtPf9KPPn365NrUyoG3nnnmmdwPuTzQWohlIsSXPf/887nWNQYGKw9EFs8ri5rv6BMdQXBa4nnTGsW8IWVsqFhvZZnL651emStFzXUMuBZ93usTITuC/4UXXpjWW2+9tPzyy+ea8bpiO8bgdNFXPvqYR411WHPNNXNf8HiN2K+Vl/IJjDi5ELXk0cf+1Vdfzds0+qsDwMwQugGgEe2xxx65KXr//v3zYGLRlPnQQw/Nta4xUnZZ1MoOGDAgvfPOO3lk7WgGHQOZRfCN8BcjpR977LF5oK9YZr/99svNp+M50xJhMmplo/Y2RuSOAcVmtowNFeWNgdZiILSoOY5RxiP0HnPMMQ1aTzTfj1Adg6XFemIguXJNdYTjOAERt6M2O0ZHv/rqq2s9/4gjjkgPP/xw3g7x3Hh/cUKgPMhaDEYXg6XFSYxoUh7LxoBvcbLihRdeSGeffXYeZG3o0KG5/F999VXN8wGgoYRuAGhE0U87QlwEu5/85Cdp1113zX2EL7/88lrLxX0xV3U0aY5+4v/zP/9Tq694jEjer1+/HISjdvb999/P640Rx6clnhMjhEez+JiOLEZGn9kyNlRMMRYjksc0Y9Ef/I9//GOe43zTTTdt0HriZMAll1ySrrzyyryeaE4e4TtEn+sI8zEi+corr5xuueWWdM4559R6foTnCNcRlGNbRG14rCvE1G5R+x7LbL311rnvdoT0Hj165BMeMX1bjHq+3Xbb5eeddNJJ+QRA9OcHgJnRIUZTm6lnAgAzJeanjqmrKufNBgDaJjXdAAAAUBChGwAAAAqieTkAAAAURE03AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAACkYvx/QF04kreZyE4AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Import necessary libraries\n", + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "# Note: Suppressing FutureWarnings to maintain a clean output. This is specifically to ignore warnings about\n", + "# deprecated features in the libraries we're using (e.g., 'use_inf_as_na' option in Pandas, used by Seaborn),\n", + "# which we currently have no direct control over. This action is taken to ensure that our output remains\n", + "# focused on relevant information, acknowledging that we rely on external library updates to fully resolve\n", + "# these deprecations. Always consider reviewing and removing this suppression after significant library updates.\n", + "import warnings\n", + "warnings.simplefilter(action='ignore', category=FutureWarning)\n", + "\n", + "#setting a random seed.\n", + "np.random.seed(123)\n", + "\n", + "# Constants representing the parameters of the model\n", + "ATTACK_RATE = 0.10\n", + "TRACE_SUCCESS = 0.20\n", + "SECONDARY_TRACE_THRESHOLD = 2\n", + "\n", + "def simulate_event(m):\n", + " \"\"\"\n", + " Simulates the infection and tracing process for a series of events.\n", + " \n", + " This function creates a DataFrame representing individuals attending weddings and brunches,\n", + " infects a subset of them based on the ATTACK_RATE, performs primary and secondary contact tracing,\n", + " and calculates the proportions of infections and traced cases that are attributed to weddings.\n", + " \n", + " Parameters:\n", + " - m: Dummy parameter for iteration purposes.\n", + " \n", + " Returns:\n", + " - A tuple containing the proportion of infections and the proportion of traced cases\n", + " that are attributed to weddings.\n", + " \"\"\"\n", + " # Create DataFrame for people at events with initial infection and traced status\n", + " events = ['wedding'] * 200 + ['brunch'] * 800\n", + " ppl = pd.DataFrame({\n", + " 'event': events,\n", + " 'infected': False,\n", + " 'traced': np.nan # Initially setting traced status as NaN\n", + " })\n", + "\n", + " # Explicitly set 'traced' column to nullable boolean type\n", + " ppl['traced'] = ppl['traced'].astype(pd.BooleanDtype())\n", + "\n", + " # Infect a random subset of people\n", + " infected_indices = np.random.choice(ppl.index, size=int(len(ppl) * ATTACK_RATE), replace=False)\n", + " ppl.loc[infected_indices, 'infected'] = True\n", + "\n", + " # Primary contact tracing: randomly decide which infected people get traced\n", + " ppl.loc[ppl['infected'], 'traced'] = np.random.rand(sum(ppl['infected'])) < TRACE_SUCCESS\n", + "\n", + " # Secondary contact tracing based on event attendance\n", + " event_trace_counts = ppl[ppl['traced'] == True]['event'].value_counts()\n", + " events_traced = event_trace_counts[event_trace_counts >= SECONDARY_TRACE_THRESHOLD].index\n", + " ppl.loc[ppl['event'].isin(events_traced) & ppl['infected'], 'traced'] = True\n", + "\n", + " # Calculate proportions of infections and traces attributed to each event type\n", + " ppl['event_type'] = ppl['event'].str[0] # 'w' for wedding, 'b' for brunch\n", + " wedding_infections = sum(ppl['infected'] & (ppl['event_type'] == 'w'))\n", + " brunch_infections = sum(ppl['infected'] & (ppl['event_type'] == 'b'))\n", + " p_wedding_infections = wedding_infections / (wedding_infections + brunch_infections)\n", + "\n", + " wedding_traces = sum(ppl['infected'] & ppl['traced'] & (ppl['event_type'] == 'w'))\n", + " brunch_traces = sum(ppl['infected'] & ppl['traced'] & (ppl['event_type'] == 'b'))\n", + " p_wedding_traces = wedding_traces / (wedding_traces + brunch_traces)\n", + "\n", + " return p_wedding_infections, p_wedding_traces\n", + "\n", + "# Run the simulation 1000 times\n", + "results = [simulate_event(m) for m in range(1000)]\n", + "props_df = pd.DataFrame(results, columns=[\"Infections\", \"Traces\"])\n", + "\n", + "# Plotting the results\n", + "plt.figure(figsize=(10, 6))\n", + "sns.histplot(props_df['Infections'], color=\"blue\", alpha=0.75, binwidth=0.05, kde=False, label='Infections from Weddings')\n", + "sns.histplot(props_df['Traces'], color=\"red\", alpha=0.75, binwidth=0.05, kde=False, label='Traced to Weddings')\n", + "plt.xlabel(\"Proportion of cases\")\n", + "plt.ylabel(\"Frequency\")\n", + "plt.title(\"Impact of Contact Tracing on Perceived Flu Infection Sources\")\n", + "plt.legend()\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "f418c720", + "metadata": {}, + "source": [ + "## Criteria" + ] + }, + { + "cell_type": "markdown", + "id": "c0b3f93f", + "metadata": {}, + "source": [ + "|Criteria|Complete|Incomplete|\n", + "|--------|----|----|\n", + "|Alteration of the code|The code changes made, made it reproducible.|The code is still not reproducible.|\n", + "|Description of changes|The author answered questions and explained the reasonings for the changes made well.|The author did not answer questions or explain the reasonings for the changes made well.|" + ] + }, + { + "cell_type": "markdown", + "id": "83cec589", + "metadata": {}, + "source": [ + "## Submission Information\n", + "🚨 **Please review our [Assignment Submission Guide](https://github.com/UofT-DSI/onboarding/blob/main/onboarding_documents/submissions.md)** 🚨 for detailed instructions on how to format, branch, and submit your work. Following these guidelines is crucial for your submissions to be evaluated correctly.\n", + "\n", + "### Submission Parameters:\n", + "* Submission Due Date: `23:59 - 06 January 2026`\n", + "* The branch name for your repo should be: `assignment-1`\n", + "* What to submit for this assignment:\n", + " * This markdown file (`a1_sampling_and_reproducibility.ipynb`) should be populated with the code changed.\n", + "* What the pull request link should look like for this assignment: `https://github.com//sampling/pull/`\n", + " * Open a private window in your browser. Copy and paste the link to your pull request into the address bar. Make sure you can see your pull request properly. This helps the technical facilitator and learning support staff review your submission easily.\n", + "\n", + "#### Checklist:\n", + "- [ ] Create a branch called `assignment-1`.\n", + "- [ ] Ensure that the repository is public.\n", + "- [ ] Review [the PR description guidelines](https://github.com/UofT-DSI/onboarding/blob/main/onboarding_documents/submissions.md#guidelines-for-pull-request-descriptions) and adhere to them.\n", + "- [ ] Verify that the link is accessible in a private browser window.\n", + "\n", + "If you encounter any difficulties or have questions, please don't hesitate to reach out to our team via the help channel in Slack. Our Technical Facilitators and Learning Support staff are here to help you navigate any challenges.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "sampling-env", + "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.11.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/02_activities/assignments/a1_sampling_and_reproducibility.ipynb b/02_activities/assignments/a1_sampling_and_reproducibility.ipynb index 11852458..53beb558 100644 --- a/02_activities/assignments/a1_sampling_and_reproducibility.ipynb +++ b/02_activities/assignments/a1_sampling_and_reproducibility.ipynb @@ -16,7 +16,14 @@ "cell_type": "markdown", "id": "4ea73db3", "metadata": {}, - "source": [] + "source": [ + "First, we are looking at a sample of all individuals attending weddings and brunches according to the guestlist. This sample is limited to all weddings and brunches registered at a venue, private at home weddings and brunches may be left out of this sample. It is also unknown if providers, staff, are counted in this sample.\n", + "It appears that wedding is considered to have 200 guests and brunch had 800. \n", + "Now we have a sampling frame. Out of this the model is considering 10% of individuals in each even to be infected (ATTACK_RATE). The ATTACK_RATE is a limitation here, assuming 10% for all events. The model is successful tracing 20% of true positive cases based on event contact. If 2 or more individuals are infected the model is going to trace them all. \n", + "The model then uses a random function to infect a random 10% of the population.\n", + "Then randomly picks a number of infected to be traced, which is going to be a maximum of 20% of the sick population.\n", + "According to the plot, weddings are greater infection hub than them being traced to. But weddings have fewer attendees, so it is more likely when they go over SECONDARY_TRACING_THRESHOLD they are over-represented." + ] }, { "cell_type": "markdown", @@ -30,7 +37,9 @@ "cell_type": "markdown", "id": "4cf5d993", "metadata": {}, - "source": [] + "source": [ + "With less repititions (=10) I see drastic and irregular changes of the histogram. The outcome varies significantly each time and is inconsistent. Looks unreliable. When ran =100, it is more reproducable and the shape is more consistent. Still changes are obsereved in =100 and =1000 with each run. but the more we simulate it the more reliable the results become, despite changes." + ] }, { "cell_type": "markdown", @@ -44,7 +53,10 @@ "cell_type": "markdown", "id": "77613cc3", "metadata": {}, - "source": [] + "source": [ + "setting a random seed.\n", + "np.random.seed(123)" + ] }, { "cell_type": "markdown", @@ -56,10 +68,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "ab8587a0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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6vDDD88/NOKH2n333Zdvxw/GYcOG5eVi0LMZEeWKkBx9raP2tVzGCDfPPPNMrn2LH6Y33XRTuvvuu/NjUcbKmttK8WMwmpDHNlt88cWn+/oRrOOHf/wwjh99q6++enr44YdzcI4wV7dJ6L///e901113pYMOOij/kLv00kvzj644ORInNmJ/vPvuu+nWW2/Nz41wWNn8NcofP7LjNaOJdfR5jHXFD8E42VAW++TXv/51XjZqRWMfvvrqqzng77777nn/xw+7CCzlMsZ2mVVxsiVqtyNQRUCK/7/zzjv5RMPPf/7z/Pn64osv0h//+MccAuKxclPp+LzG5yO2f/zwjM9ENOmPz0O0LIjwOi3R1zPWf8455+Tm2NFFIH6cn3feebV+TN9+++25y0D0433qqadyUJ0REdgjoESIiOMiXuuOO+7I64yTPFHeShFqovzxuY5jJY7B2L/RL3tmaoXLJx7icxLiGOnfv3/q27dvfo/x2Y3Px4Ybbpj3deVJlKg5jOXisTgZECdEQnxm47MS3xO/+c1v8nL/+te/cmuPOLkUzjrrrPT73/8+b99Y5quvvkqXXXZZPkbideqrhY33F90P4rMe+zo+B2XxWYjPRuzjEJ/d+DzHsbH//vunPn365JOC8bmMYyGWL4vXjzATn+Gf/vSn+btmRvdfWWynCHWVIgw2R039tD6zcczHPo7tH106YpkQ2yfE5yr2XYTYOJEUJ2Muv/zyvE/K331FfBdE8+74vET/6vj+jeMiPg8RkOM91D15NyPHZV3xeITV+H479NBDc2htrONyRhV9zEyYMCGvP46FeI/x9zD+ZsTfwyh3fCaBApQAZtL1118fVaqll156qea+/v375/vOPvvsmvu+/fbb0hxzzFHq0KFD6bbbbqu5/z//+U9e9pRTTvnROtdaa63ShAkTau4fOHBgvv8f//hHzX1jx479UZkOOOCAUlVVVWncuHH59qRJk0pLLbVUaYkllsjlqDRlypSa/x988MF5/TPiyy+/LM0+++ylrbfeujR58uSa+y+//PK8juuuu67mvnhvcd9XX301zXW+/vrrebnDDz98hspwzz335OXPPPPMWvfvuuuueTu///77NffFclHeyvvKr3fZZZfV3Hf++efn+z766KMfvV5927pv376lpZdeuub2d999V+revXtp3XXXLf3www9T3dbbb7993h8NFduw7ufliSeeyPdFOeqWMT4DlfsnxHvr0qVL6fTTT6+5L/ZXrOOiiy760WtWlrvua5f37a9//etaz9l5551L8803X83twYMH5+WOOOKIWsvts88+P1pnfS655JK83M0331xzXxwb66+/fmnOOecsjRw5sua9xXLx2t98803NsnHMxP3//Oc/p/k65W0Z2yO29bBhw0r3339/ackll8yfqTjOR40aVerRo0dpv/32q/Xc4cOHl+aee+5a95e/C44//vhayz7++OP5/sMOO2yq2/vjjz8uderUqXTWWWfVevzNN98sde7cudb98TqVn6eHH3643ve73Xbb1fq8/uUvfyl17Nix9K9//avWcldffXV+/jPPPJNvv/baa/n2QQcdVGu53XfffYb2X3m/1HeJbT6191HeH5XLVK4vviunpfz8O+64o8Gf2bDJJpuUVlpppVr3xbaK599yyy217n/ooYdq3T+r3wX1vcfVV1+9tOCCC5a+/vrrWt9jsQ/33nvvmXqP9Tn55JPz87t161badttt82ctjuGZPS4bsh+b4ph59dVXf/S5AIqneTlQiDjLXhZn16Ppc9R0xxn4srgvHqtvZOSoeaqsAYra5Khhjb7OZVEjURY1e1GLFE0Po0YpRg0PcXY/amKiT3TdmrEZaUI+tRqXqC2IdVb2G95vv/1yE8poMtlQUTsf6mtWXp/YDp06dco1TZWiuXnkw2jWWSlq5CtrbKPGPco6o6NSV27rqJ2KbR01xvH8cpPEqBmO/XD88cf/qD/mzG7rGRU1r5VlDNFcuLx/ojb766+/zjVp8bmLmq+yv//977lmP2p96pqRckc//ErxGYzXKu/TcjP+aBlQqb7Xm9q+jtqoGIirLI6N2PdRExm15pV222233I2isjxhRvd11E5GbWe0BIja3OjGEE1mozYt9nHUhkVZ4jNQvsRncd11180tL+qKY7dSbO/YruWuF/Vt76ipjpro+L6ofJ3YDjG4YH2vU9kcPvbn3/72t5r7oulzlD22TVnUSkbtbUznV/ka5eb05dcof+fUPdamNxBgfd9pUYbKSzRHbg7T+8xOTWyzqAmNPs+V2yyaM8exVd5mjf1dEANIxqwOUYtcWfsc32NRlsq/C7P6HqMFU7QWWWONNXLroaiRj/cXffIrm7I39LhsiCKPmXJNdry36TW3BxqP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T+1Ro0alhRdeOM9IMjVCd0o5cBs9FgAAgIb69NNP06KLLjrVx4XulHINd3ljzTXXXM1dHAAAAFq4kSNH5srbcp6cGqE7hnD/vyblEbiFbgAAAGbU9LooG0gNAAAACiJ0AwAAQEGEbgAAACiIPt0AANCCTZ48OU2cOLG5iwHtzmyzzZY6deo0y+sRugEAoIXOATx8+PD03XffNXdRoN3q0aNH6tWr13QHS5sWoRsAAFqgcuBecMEFU1VV1Sz96AcaftJr7Nix6csvv8y3F1pooTSzhG4AAGiBTcrLgXu++eZr7uJAuzTHHHPk6wjecSzObFNzA6kBAEALU+7DHTXcQPMpH4OzMq6C0A0AAC2UJuXQ+o9BoRsAAAAKok83AAC0IkOHDk0jRoxostebf/750+KLL174oHF77bVXevbZZ/M0TUWN2H7DDTekI444ollHhI8Bug444IB05513pm+//Ta9+uqrafXVV0/twQ0zsP1PPfXUdM8996TXXnst395nn33y8nFfayV0AwBAKwrcvXv3SePGjW2y1+zatSoNGVI9w8F7ZkLSxRdfnD7//PMctOaee+7UGJZccskc8OJStttuu6XtttsuNaeHHnooh88nn3wyLb300vmkRnM6/vjj8776z3/+U3Nf/L9Pnz6pf//+uaxl8f84YRD7tzzIWNH+8Ic/5BMVrZnQDQAArUTUcEfg7tPn5lRV1afw1xs7tjpVV++ZX7fI2u4PPvggrbXWWmm55ZZLRYqg2FRhcVrvNaaf+ulPfzrVZSZMmJBmn332JinPZpttls4777zc2iDmow5PPPFEWmyxxfKJgUpx/3rrrdek23DuRjoJ05z06QYAgFYmAnf37msWfmmMYL/pppumww47LB133HFp3nnnzcEumhBX1kj//e9/TzfddFMetCpqykPUpv7mN79JCyywQJprrrnS5ptvnl5//fVa6/7nP/+ZfvKTn6SuXbvmGuOdd9655jU/+eSTdOSRR+Z1lgfDipraHj161FrHVVddlZZZZpkccnv37p3+8pe/1Ho8nvvnP/85rztGso4TA/fee2/N49FEfI899sjljDAaj19//fX1bot4b4ceemhusRDrjfdeLu8hhxySa+XjffTt2zff/9RTT6V11lkndenSJQf1qJWeNGlSrW0b64vnzTPPPKlnz57pmmuuSWPGjEn77rtv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WuRTTjkln5iIkxpR9thfZVHTHH3Aoy98DJ7Wr1+/3Ec+AvrMiubuMeBeTDcXJwkiwJ9//vlphx12yAPBhWgtEIE8RlqP5WO52NZFnMwIHUr1fframZEjR+aRBL///vt8sAIALSNw9+7dJ40bV/80N7R9XbtWpSFDqttl8I4AEn1OIwSWg0JzHRfteT/QNjzzzDN5cLj3338/n4RpjGOxITlSTTcA0CJFDXcEiz59bk5VVbPeVJPWJWpYq6v3zJ8DYe//F9siAnBTtgDR4oDW5u67784DusW0YBG0oxVDNF9vaOBuLEI3ANCiReDu3v3/718I7V0EYCEYpi76cUff/mgZEieNoml79D1vLkI3AAAAbcbee++dLy2FKcMAAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQUwZBgAArUjMPTxixIgme72Y57gtzgu+6aabptVXXz1dcsklqa3YZ5990nfffZfuueeeGX7fSy65ZDriiCPyhWII3QAA0IoCd5/evdPYceOa7DWrunZN1UOGzFDw7tChwzQfP+WUU9Kpp56aWoMoZ4TX1157bZbWs9566+WQe/XVV9fcF/8/8MAD0/XXX5+Dcln8/4MPPkj/+te/UlN56aWXUrdu3Zrs9dojoRsAAFqJqOGOwH1znz6pT1VV4a9XPXZs2rO6Or/ujITuzz//vOb/f/vb39LJJ5+chgwZUnPfnHPOWfP/UqmUJk+enDp3btuRZLPNNkt33313rfueeOKJtNhii6Unn3yyVuiO2/3792/S8i2wwAJN+nrtkT7dAADQykTgXrN798IvDQ32vXr1qrnMPffcuea7fPs///lP6t69e3rwwQfTWmutlbp06ZL+/e9/55rdHXfcMfXs2TOH8p/85Cfp0UcfrbXe8ePHp9/97nc5qMbzll122XTttdfWPP7WW2+lbbfdNj8/1rPXXnvVaoI/ZsyYtPfee+fHF1pooXThhRdO833ccMMN6bTTTkuvv/56fg9xifvKrQ2ivLGuueaaK/3iF79IX3zxxTRDd5x4GD58eM19Tz31VDr++ONzyC776KOP0ieffJKXD59++mled48ePdK8886bX/Pjjz+uWT5OWBx11FH58fnmmy8dd9xx+URGpRl539G8vLKJfbzXP//5z2nnnXdOVVVVabnllkv33ntvrefE7bi/a9euubw33nhjfl40bQ/xPnbYYYc0zzzz5Fr0lVZaKT3wwAOpvRK6AQCAJhNh89xzz03V1dVp1VVXTaNHj07bbbddeuyxx9Krr76attlmmxzYItyWRXC89dZb06WXXpqf98c//rGm1jyC3uabb57WWGON9PLLL6eHHnooh+AIrGXHHntsDrr/+Mc/0iOPPJLD7iuvvDLVMu62227p6KOPzmExau/jEvdNmTIlh99vvvkmr2/QoEHpww8/zI9NzQYbbJBmm222XLsd3nnnnfTDDz+kAQMGpK+//jqH7RCPR4hdf/3108SJE1Pfvn3zSYpoav7MM8/k9xvbZsKECXn5CNBxIuC6667LJy+iTHVr1Bv6vsvihENsvzfeeCPvmz322COvP0R5d91117TTTjvlkxIHHHBAOvHEE2s9/+CDD84nSp5++un05ptvpvPOO69WK4f2pm235QAAAFqU008/PW211VY1t6MWd7XVVqu5fcYZZ+TwGLWphxxySHr33XfT7bffngPulltumZdZeumla5a//PLLc+A+++yza+6LIBq14vHchRdeONeK33zzzWmLLbbIj0fN7KKLLjrVMs4xxxw5JEbT96ilL4syRIiM4BnrDzfddFMO59E3Omrp64qa3nXWWScH3l/96lf5esMNN8w19j/96U/z7aWWWipfR+CO+6OsEfCjxrncTz76f0etdiy39dZb59rpE044Ie2yyy41/cQffvjhmteNkxkNfd9l0eQ9yhpiu8bJjhdffDGH/jjh0bt373T++efnx+P/0dLgrLPOqnl+nDDp169fWmWVVX60v9ojNd0AAECTWXvttWvdjnB4zDHHpD59+uRQGWE3arPLNd0xkFmnTp3SJptsUu/6orY1aonjeeXLCiuskB+Lputxidrhddddt1bQj7DYUFGuCNvlwB1WXHHFXO54bFojhpebksd13A7xnirvLzctj/f0/vvv55ru8nuKMo8bNy6/n++//z7Xvle+pzhBULltZ+V9RwuEypMG0Yz+yy+/zLejqXzdkwtxUqHSYYcdls4888xcy3/KKafkGvP2TOgGAACaTN2RsiNwR8121KhGU+oI2VFDWm5GHbXO0xKhPZqjx/MqL++9917aeOONU0sQYTpq3f/73//mcF0+gVAO3RGQow93NJMvv6fo9173PcU6dt9998LLG83hK0Vte9S8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NGDAgLTrrrumrl27Nn7JAEjtPXD37t0njRvXMoPXO9XVaVJzF6KdmFIqpU7NXQgAaMrQ/corr6Trr78+HXXUUemQQw5Ju+22Ww7g66yzzsyWAwBqiRruCNx9+tycqqr6pJZi7NjqVF29Z+o2R5/UvVNVcxenTZs46Zs0btxHqVQqNXdRAKBpQ/fqq6+e/vCHP6QLL7ww3XvvvemGG25IG264YVp++eXTr3/967TXXnulBRZYYOZLBQD/JwJ39+5rppamY6eq1Klz9+YuRps2eUrLbOUAAE02kFrnzp3TLrvsku6444503nnnpffffz8dc8wxabHFFkt77713+vzzz2dl9QAAANB+Q/fLL7+cDjrooLTQQguliy66KAfuDz74IA0aNCgNGzYs7bjjjo1XUgAAAGgPzcsjYEef7iFDhqTtttsu3XTTTfm6Y8f/zfBLLbVUbnK+5JJLNnZ5AQAAoG3XdF911VVp9913T5988km655570s9+9rOawF224IILpmuvvXa661l11VXTXHPNlS/rr79+evDBB2seHzduXDr44IPTfPPNl+acc87Ur1+/9MUXX/xodNvtt98+VVVV5dc89thj06RJxpMFAACgldZ0v/fee9NdZvbZZ0/9+/ef5jKLLrpoOvfcc9Nyyy2XRya98cYbc5P0V199Na200krpyCOPTPfff3/uMz733HPnkdKjD/kzzzyTnz958uQcuHv16pWeffbZ3Ic8+pLPNtts6eyzz56ZtwYAAADNW9MdTcsjCNcV90VwnlE77LBDbpYeoTtGPj/rrLNyjfbzzz+fvv/++1xTHk3ZN99887TWWmvl141wHY+HRx55JL3zzjvp5ptvziOqb7vttumMM85IV1xxRZowYcLMvDUAAABo3tB9zjnnpPnnn/9H90fz7pmtYY5a69tuuy2NGTMmNzMfPHhwmjhxYtpyyy1rlllhhRXS4osvnp577rl8O65XWWWV1LNnz5pl+vbtm0aOHJnefvvtmSoHAAAANGvz8uhHHYOl1bXEEkvkxxrizTffzCE7+m9HLffdd9+dVlxxxfTaa6/lJuo9evSotXwE7OHDh+f/x3Vl4C4/Xn5sasaPH58vZRHSAQAAoEXUdEeN9htvvPGj+19//fU86FlD9O7dOwfsF154IR144IG5H3g0GS9S1NRHH/HyJeYVBwAAgBYRun/1q1+lww47LD3xxBO5WXhcHn/88XT44YenX/7ylw1aV9RmL7vssrnPdoTh1VZbLf3hD3/Ig6NFv+zvvvuu1vIxenk8FuK67mjm5dvlZepzwgkn5D7j5cunn37aoDIDAABAYaE7Bitbd9110xZbbJHmmGOOfNl6663zgGezOmr4lClTctPvCOExCvljjz1W81jMCx7N16M5eojraJ7+5Zdf1iwzaNCgPP1YNFGfmi5dutRMU1a+AAAAQIvo0x2103/7299y+I4m5RG6Y0Cz6NPdEFHjHCOOx+Boo0aNSn/961/Tk08+mR5++OHc7HvAgAHpqKOOSvPOO28OxoceemgO2uutt15+fgT9CNd77bVXGjhwYO7HfdJJJ+W5vSNYAwAAQKsL3WUxzVdcZlbUUMe82jG/doTsVVddNQfurbbaKj9+8cUXp44dO6Z+/frl2u8YmfzKK6+seX6nTp3Sfffdl/uCRxjv1q1b7hN++umnz8rbAgAAgOYL3dGH+4YbbshNvyM4R5PwStG/e0bEPNzT0rVr1zzndlymJmrXH3jggRksOQAAALTw0B0DpkXo3n777dPKK6+cOnTo0PglAwAAgPYYum+77bZ0++23p+22267xSwQAAADtefTy8jRfAAAAQCOH7qOPPjrPpV0qlWbm6QAAANAuzFTz8n//+9/piSeeSA8++GBaaaWV8nzale66667GKh8AAAC0r9Ddo0ePtPPOOzd+aQAAAKC9h+7rr7++8UsCAAAAbcxM9ekOkyZNSo8++mj64x//mEaNGpXvGzZsWBo9enRjlg8AAADaV033J598krbZZps0dOjQNH78+LTVVlul7t27p/POOy/fvvrqqxu/pAAAANAearoPP/zwtPbaa6dvv/02zTHHHDX3Rz/vxx57rDHLBwAAAO2rpvtf//pXevbZZ/N83ZWWXHLJ9N///rexygYAAADtr6Z7ypQpafLkyT+6/7PPPsvNzAEAAICZDN1bb711uuSSS2pud+jQIQ+gdsopp6TtttuuMcsHAAAA7at5+YUXXpj69u2bVlxxxTRu3Li0++67p/feey/NP//86dZbb238UgIAAEB7Cd2LLrpoev3119Ntt92W3njjjVzLPWDAgLTHHnvUGlgNAAAA2rPOM/3Ezp3Tnnvu2bilAQAAgPYeum+66aZpPr733nvPbHkAAACgfYfumKe70sSJE9PYsWPzFGJVVVVCNwAAAMzs6OXffvttrUv06R4yZEjacMMNDaQGAAAAsxK667Pccsulc88990e14AAAANBeNVroLg+uNmzYsMZcJQAAALSvPt333ntvrdulUil9/vnn6fLLL08bbLBBY5UNAAAA2l/o3mmnnWrd7tChQ1pggQXS5ptvni688MLGKhsAAAC0v9A9ZcqUxi8JAAAAtDGN2qcbAAAAmMWa7qOOOmqGl73oootm5iUAAACgfYbuV199NV8mTpyYevfune979913U6dOndKaa65Zq683AAAAtFczFbp32GGH1L1793TjjTemeeaZJ9/37bffpn333TdttNFG6eijj27scgIAAED76NMdI5Sfc845NYE7xP/PPPNMo5cDAADArITukSNHpq+++upH98d9o0aNmplVAgAAQJszU6F75513zk3J77rrrvTZZ5/ly9///vc0YMCAtMsuuzR+KQEAAKC99Om++uqr0zHHHJN23333PJhaXlHnzjl0n3/++Y1dRgAAAGg/obuqqipdeeWVOWB/8MEH+b5lllkmdevWrbHLBwAAAO2reXnZ559/ni/LLbdcDtylUqnxSgYAAADtMXR//fXXaYsttkjLL7982m677XLwDtG83HRhAAAAMAuh+8gjj0yzzTZbGjp0aG5qXrbbbrulhx56aGZWCQAAAG3OTPXpfuSRR9LDDz+cFl100Vr3RzPzTz75pLHKBgAAAO2vpnvMmDG1arjLvvnmm9SlS5fGKBcAAAC0z9C90UYbpZtuuqnmdocOHdKUKVPSwIED02abbdaY5QMAAID21bw8wnUMpPbyyy+nCRMmpOOOOy69/fbbuab7mWeeafxSAgAAQHup6V555ZXTu+++mzbccMO044475ubmu+yyS3r11VfzfN0AAADATNR0T5w4MW2zzTbp6quvTieeeGIxpQIAAID2WNMdU4W98cYbxZQGAAAA2nvz8j333DNde+21jV8aAAAAaO8DqU2aNCldd9116dFHH01rrbVW6tatW63HL7roosYqHwAAALSP0P3hhx+mJZdcMr311ltpzTXXzPfFgGqVYvowAAAAoIGhe7nllkuff/55euKJJ/Lt3XbbLV166aWpZ8+eRZUPAAAA2kef7lKpVOv2gw8+mKcLAwAAABppILWphXAAAABgJkN39Neu22dbH24AAABohD7dUbO9zz77pC5duuTb48aNS7/97W9/NHr5XXfd1ZDVAgAAQJvUoNDdv3//H83XDQAAADRC6L7++usbsjgAAAC0a7M0kBoAAAAwdUI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIII3QAAANAWQ/c555yTfvKTn6Tu3bunBRdcMO20005pyJAhtZYZN25cOvjgg9N8882X5pxzztSvX7/0xRdf1Fpm6NChafvtt09VVVV5Pccee2yaNGlSE78bAAAAaEGh+6mnnsqB+vnnn0+DBg1KEydOTFtvvXUaM2ZMzTJHHnlk+uc//5nuuOOOvPywYcPSLrvsUvP45MmTc+CeMGFCevbZZ9ONN96YbrjhhnTyySc307sCAACA/9U5NaOHHnqo1u0Iy1FTPXjw4LTxxhun77//Pl177bXpr3/9a9p8883zMtdff33q06dPDurrrbdeeuSRR9I777yTHn300dSzZ8+0+uqrpzPOOCP97ne/S6eeemqaffbZm+ndAQAA0N61qD7dEbLDvPPOm68jfEft95ZbblmzzAorrJAWX3zx9Nxzz+Xbcb3KKqvkwF3Wt2/fNHLkyPT222/X+zrjx4/Pj1deAAAAoM2G7ilTpqQjjjgibbDBBmnllVfO9w0fPjzXVPfo0aPWshGw47HyMpWBu/x4+bGp9SWfe+65ay6LLbZYQe8KAACA9qzFhO7o2/3WW2+l2267rfDXOuGEE3Ktevny6aefFv6aAAAAtD/N2qe77JBDDkn33Xdfevrpp9Oiiy5ac3+vXr3yAGnfffddrdruGL08Hisv8+KLL9ZaX3l08/IydXXp0iVfAAAAoM3WdJdKpRy477777vT444+npZZaqtbja621VpptttnSY489VnNfTCkWU4Stv/76+XZcv/nmm+nLL7+sWSZGQp9rrrnSiiuu2ITvBgAAAFpQTXc0KY+Ryf/xj3/kubrLfbCjn/Ucc8yRrwcMGJCOOuqoPLhaBOlDDz00B+0YuTzEFGMRrvfaa680cODAvI6TTjopr1ttNgAAAO02dF911VX5etNNN611f0wLts8+++T/X3zxxaljx46pX79+edTxGJn8yiuvrFm2U6dOuWn6gQcemMN4t27dUv/+/dPpp5/exO8GAAAAWlDojubl09O1a9d0xRVX5MvULLHEEumBBx5o5NIBAABAGxm9HAAAANoaoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABSkc1ErBgCAWTVm7NhGW0d1dXUjlIimMv/886fFF1+8uYsBs0zoBgCgxZlSmtBoQfnd/7vec889Z3ldNJ2uXavSkCHVgjetntANAECLUypNytddu/ZOs3Wec5bW1W3y2JR+qE59+tycqqr6NFIJKdLYsdWpunrPNGLECKGbVk/oBgCgxerYsSp16tx91tbRaKWhqc1ISwfN0GnphG4AANq0EVMm5OAdNae0LjPSJaCqa9dUPWSI4E2LJXQDANCmjSpNSlNSSqd3WTItM9t8zV0cZsCUyWPTmB+q04p9+qRuVVVTXa567Ni0Z3W1Zui0aEI3AADtwlId50h9ZrGpOk1jcpwsSSmtXlWVune3z2jddHEBAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAADQFkP3008/nXbYYYe08MILpw4dOqR77rmn1uOlUimdfPLJaaGFFkpzzDFH2nLLLdN7771Xa5lvvvkm7bHHHmmuueZKPXr0SAMGDEijR49u4ncCAAAALSx0jxkzJq222mrpiiuuqPfxgQMHpksvvTRdffXV6YUXXkjdunVLffv2TePGjatZJgL322+/nQYNGpTuu+++HOT333//JnwXAAAAUL/OqRltu+22+VKfqOW+5JJL0kknnZR23HHHfN9NN92UevbsmWvEf/nLX6bq6ur00EMPpZdeeimtvfbaeZnLLrssbbfddumCCy7INegAAADQXFpsn+6PPvooDR8+PDcpL5t77rnTuuuum5577rl8O66jSXk5cIdYvmPHjrlmfGrGjx+fRo4cWesCAAAA7SZ0R+AOUbNdKW6XH4vrBRdcsNbjnTt3TvPOO2/NMvU555xzcoAvXxZbbLFC3gMAAADtW4sN3UU64YQT0vfff19z+fTTT5u7SAAAALRBLTZ09+rVK19/8cUXte6P2+XH4vrLL7+s9fikSZPyiOblZerTpUuXPNp55QUAAADaTeheaqmlcnB+7LHHau6LvtfRV3v99dfPt+P6u+++S4MHD65Z5vHHH09TpkzJfb8BAACg3Y5eHvNpv//++7UGT3vttddyn+zFF188HXHEEenMM89Myy23XA7hv//97/OI5DvttFNevk+fPmmbbbZJ++23X55WbOLEiemQQw7JI5sbuRwAAIB2HbpffvnltNlmm9XcPuqoo/J1//790w033JCOO+64PJd3zLsdNdobbrhhniKsa9euNc+55ZZbctDeYost8qjl/fr1y3N7AwAAQLsO3Ztuummej3tqOnTokE4//fR8mZqoFf/rX/9aUAkBAACgDfbpBgAAgNZO6AYAAICCCN0AAADQFvt00zBDhw5NI0aMaO5iUID5558/j9gPAAC0LUJ3KwrcfXr3TmPHjWvuolCAqq5dU/WQIYI3AAC0MUJ3KxE13BG4b+7TJ/Wpqmru4tCIqseOTXtWV+d9LHQDAEDbInS3MhG41+zevbmLAQAAwAwwkBoAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACtK5qBUDkNLQoUPTiBEjmrsYrVJ1dXW+Hjv2f69bipZWHgCgZRO6AQoM3H16905jx41r7qK0atXVe6aWqFSa0NxFAABaAaEboCBRwx2B++Y+fVKfqqrmLk6rM2bs2PROdXXqNkef1LFTy9l+z0z6Ol057uNUmjKpuYsCALQCQjdAwSJwr9m9e3MXo9UZlVKKWNu9U1Xq1LnlbL+PJo9t7iIAAK2IgdQAAACgIEI3AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKYvRyoMXPdR1Tb7VG1dXVNVNfxUjcNExsNwCA1k7oBlp04O7du08aN651h6+Ya9qMzjNvSqmUOjV3IQAAZpLQDbRYUcMdgbtPn5tTVVWf1NqMHVudqqv3TN3m6JPnmqZhJk76Jo0b91EqlUrNXRQAgJkmdAMtXgTu7t3XTK1Vx05VqVPn7s1djFZn8pTW3cIBACAYSA0AAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwAAAAoidAMAAEBBhG4AAAAoiNANAAAABRG6AQAAoCBCNwAAABRE6AYAAICCCN0AAABQEKEbAAAACiJ0AwAAQEGEbgAAACiI0A0AAAAFEboBAACgIEI3AAAAFEToBgAAgIJ0LmrFAAAAs2LM2LEz9PgDDzyQqqurm6hUNIWll146rb/++qktaDOh+4orrkjnn39+Gj58eFpttdXSZZddltZZZ53mLhYAANBAU0oT8vX0gvTz/9d09/e//30TlYym0jGl9O9nn20TwbtNhO6//e1v6aijjkpXX311WnfdddMll1yS+vbtm4YMGZIWXHDB5i4eAADQAKXSpHzdtWvvNFvnOae63OSJX6cp4z9Op86+cFqm09xNWEKK9MHk79OpE4alDz/8UOhuKS666KK03377pX333TffjvB9//33p+uuuy4df/zxzV08AABgJnTsWJU6de4+1cc7TP7f5uURuFfq0rMJS0ahxsc/w1Jb0epD94QJE9LgwYPTCSecUHNfx44d05Zbbpmee+65Zi0bNIR+SFPfJmPHts5t01rLDQBA42n1oXvEiBFp8uTJqWfP2me24vZ//vOfep8zfvz4fCn7/vvv8/XIkSNTSzV69Oh8PXjUqDR68uTmLg6N6LmRI1OHlNKee+7Z3EVpsaqrW/e2eWvC52nMpFHNXYxWZ9LkkflEd5eJI1LnKWNSS/HhpP/9m/H2pG/TDyXfx23pM2Dftt39b9+23f1v37ZNH07+31w2duzYFp3RymUrlUrTXK5DaXpLtHDDhg1LiyyySHq2Tif74447Lj311FPphRde+NFzTj311HTaaac1cUkBAABoaz799NO06KKLtt2a7vnnnz916tQpffHFF7Xuj9u9evWq9znRFD0GXiubMmVK+uabb9J8882XOnSIOseWeRZlscUWyzt0rrnmau7i0Ijs27bLvm2b7Ne2y75tu+zbtsu+bZtGtpL9GvXXo0aNSgsvvPA0l2v1oXv22WdPa621VnrsscfSTjvtVBOi4/YhhxxS73O6dOmSL5V69OiRWoP40LXkDx4zz75tu+zbtsl+bbvs27bLvm277Nu2aa5WsF/nnnv6o+a3+tAdota6f//+ae21185zc8eUYWPGjKkZzRwAAACaQ5sI3bvttlv66quv0sknn5yGDx+eVl999fTQQw/9aHA1AAAAaEptInSHaEo+tebkbUE0hz/llFN+1Cye1s++bbvs27bJfm277Nu2y75tu+zbtqlLG9uvrX70cgAAAGipOjZ3AQAAAKCtEroBAACgIEI3AAAAFETobkZXXHFFWnLJJVPXrl3Tuuuum1588cVpLn/HHXekFVZYIS+/yiqrpAceeKDW49E9P0ZwX2ihhdIcc8yRttxyy/Tee+8V/C5oin27zz77pA4dOtS6bLPNNgW/C2Zlv7799tupX79+efnYXzGV4ayuk9azb0899dQfHbNxjNOy9+0111yTNtpoozTPPPPkS/wdrbu8v7Vtd9/6W9v69utdd92Vpwzu0aNH6tatW57B6C9/+UutZRyzbXff7tOajtkYSI2md9ttt5Vmn3320nXXXVd6++23S/vtt1+pR48epS+++KLe5Z955plSp06dSgMHDiy98847pZNOOqk022yzld58882aZc4999zS3HPPXbrnnntKr7/+eul//ud/SksttVTphx9+aMJ3RhH7tn///qVtttmm9Pnnn9dcvvnmmyZ8VzR0v7744oulY445pnTrrbeWevXqVbr44otneZ20nn17yimnlFZaaaVax+xXX33VBO+GWdm3u+++e+mKK64ovfrqq6Xq6urSPvvsk/+ufvbZZzXL+Fvbdvetv7Wtb78+8cQTpbvuuiv/fnr//fdLl1xySf5N9dBDD9Us45htu/u2fys6ZoXuZrLOOuuUDj744JrbkydPLi288MKlc845p97lf/GLX5S23377Wvetu+66pQMOOCD/f8qUKfnH3/nnn1/z+HfffVfq0qVL/mFI69235S+VHXfcscBS09j7tdISSyxRbzCblXXSsvdthO7VVlut0ctKw8zqMTZp0qRS9+7dSzfeeGO+7W9t2923wd/a5tcYfxfXWGONXIERHLNtd9+2tmNW8/JmMGHChDR48ODcvKWsY8eO+fZzzz1X73Pi/srlQ9++fWuW/+ijj9Lw4cNrLTP33HPnphtTWyetY9+WPfnkk2nBBRdMvXv3TgceeGD6+uuvC3oXNMZ+bY510rL2QzRfXHjhhdPSSy+d9thjjzR06NBGKDFNuW/Hjh2bJk6cmOadd95829/atrtvy/ytbb37NSoTH3vssTRkyJC08cYb5/scs21337a2Y1bobgYjRoxIkydPTj179qx1f9yOL4b6xP3TWr583ZB10jr2bYj+KTfddFP+wjnvvPPSU089lbbddtv8WrTM/doc66Tl7If4QXfDDTekhx56KF111VX5h1/0Jx01alQjlJqm2re/+93v8omT8g9Ff2vb7r4N/ta2zv36/fffpznnnDPNPvvsafvtt0+XXXZZ2mqrrfJjjtm2u29b2zHbubkLAEzfL3/5y5r/x0Brq666alpmmWXy2b0tttiiWcsG/Fj80S+L4zVC+BJLLJFuv/32NGDAgGYtGzPm3HPPTbfddlv+no1Bf2j7+9bf2tape/fu6bXXXkujR4/O4euoo47KLYw23XTT5i4aBe/bX7aiY1ZNdzOYf/75U6dOndIXX3xR6/643atXr3qfE/dPa/nydUPWSevYt/WJL5x4rffff7+RSk5j79fmWCctdz/E6KvLL7+8Y7aV7NsLLrggB7NHHnkk/4gr87e27e7b+vhb2zr2azRTXnbZZfPo1kcffXTadddd0znnnJMfc8y23X3b2o5ZobsZRBOJtdZaK5+xKZsyZUq+vf7669f7nLi/cvkwaNCgmuWXWmqp/KGtXGbkyJHphRdemOo6aR37tj6fffZZ7rMS01/QMvdrc6yTlrsf4iz9Bx984JhtBft24MCB6YwzzshdA2K6mkr+1rbdfVsff2tb5/dxPGf8+PH5/47ZtrtvW90x29wjubXnYfNj5MQbbrghD4W///7752Hzhw8fnh/fa6+9Sscff3ytaaU6d+5cuuCCC/JUFzEybn1ThsU6/vGPf5TeeOONPJqfKRFa/74dNWpUnp7oueeeK3300UelRx99tLTmmmuWlltuudK4ceOa7X22Nw3dr+PHj89T08RloYUWyvsw/v/ee+/N8Dppvfv26KOPLj355JP5mI1jfMsttyzNP//8pS+//LJZ3mN71dB9G39HY0qbO++8s9YUNPE9XLmMv7Vtb9/6W9s69+vZZ59deuSRR0offPBBXj5+S8VvqmuuuaZmGcds29y3o1rZMSt0N6PLLrustPjii+c/AjGM/vPPP1/z2CabbJKHwa90++23l5Zffvm8fMz/ev/999d6PKZF+P3vf1/q2bNn/lBvscUWpSFDhjTZ+6GYfTt27NjS1ltvXVpggQVyGI8pimJuQ8GsZe/X+AMQ5zXrXmK5GV0nrXff7rbbbjmQx/oWWWSRfDvmGaVl79v4fq1v38bJ0DJ/a9vmvvW3tnXu1xNPPLG07LLLlrp27VqaZ555Suuvv34Od5Ucs21z345tZcdsh/inuWvbAQAAoC3SpxsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAAAUROgGAACAggjdAAAAUBChGwDagQ4dOqR77rmnuYuRhg8fnrbaaqvUrVu31KNHj+YuDgAUTugGgKnYZ599cliNy+yzz56WXXbZdPrpp6dJkyallurUU09Nq6+++o/u//zzz9O2226bmtvFF1+cy/Laa6+ld999t7mLAwCF61z8SwBA67XNNtuk66+/Po0fPz498MAD6eCDD06zzTZbOuGEE3607IQJE3I4bw6lUilNnjx5qo/36tUrtQQffPBBWmuttdJyyy3X3EUBgCahphsApqFLly45sC6xxBLpwAMPTFtuuWW69957a2rCd9ppp3TWWWelhRdeOPXu3Tvf/+abb6bNN988zTHHHGm++eZL+++/fxo9enTNOsvPO+2009ICCyyQ5pprrvTb3/42h/ayCPmHHXZYWnDBBVPXrl3ThhtumF566aWax5988slcA//ggw/mEBvlvPnmm/M6X3/99Zoa+htuuKHe5uUzWsYLLrggLbTQQnmZOOEwceLEaW6vq666Ki2zzDL55ENsj7/85S81jy255JLp73//e7rppptyeeI1pua6665LK620Un5f8fqHHHJIzWMXXXRRWmWVVXIT9cUWWywddNBBtcr+ySefpB122CHNM888eZlYT5wwKXvrrbdyrf+cc86Zevbsmfbaa680YsSImsfvvPPOvP7ytol9PmbMmGm+bwCYGqEbABogglhlOH7sscfSkCFD0qBBg9J9992Xw1nfvn1z4IuQfMcdd6RHH320VmgsP6+6ujqH51tvvTXdddddOTCXHXfccTmg3njjjemVV17JTdtjvd98802t9Rx//PHp3HPPzeuKvtJHH310DpnRhDsuu+2224/ew4yW8Yknnsg103Ed5YgAXw7x9bn77rvT4YcfnssQwfaAAw5I++67b35+iNeKlgO/+MUvctn+8Ic/TDW4R8CPEwFxciBOcsT7L+vYsWO69NJL09tvv53L9fjjj+ftVRbPjZMWTz/9dH7+eeedlwN2+O677/LJhjXWWCO9/PLL6aGHHkpffPFFLlOIcv3qV79Kv/71r2v2zy677JJbEgDATCkBAPXq379/accdd8z/nzJlSmnQoEGlLl26lI455piax3v27FkaP358zXP+9Kc/leaZZ57S6NGja+67//77Sx07diwNHz685nnzzjtvacyYMTXLXHXVVaU555yzNHny5Pzc2WabrXTLLbfUPD5hwoTSwgsvXBo4cGC+/cQTT0QKLN1zzz21ynzKKaeUVltttR+9l1j27rvvblAZl1hiidKkSZNqlvn5z39e2m233aa6vX7605+W9ttvv1r3xXO22267mtuxPWPd0xLv88QTTyzNqDvuuKM033zz1dxeZZVVSqeeemq9y55xxhmlrbfeutZ9n376ad4+Q4YMKQ0ePDj//+OPP57h1weAaVHTDQDTELXXUUsaTbyjSXLUHMdgZWXRDLmyH3fUjq622mq5WXPZBhtskKZMmZJrxMtimaqqqprb66+/fm4i/emnn+ba5WjGHc8ri37k66yzTl5/pbXXXrvB72lGyxg15p06daq5Hc28v/zyy2mut7LM5fXWLfO0xPqHDRuWtthii6kuE7Xy8fgiiyySunfvnpuHf/3112ns2LH58WiWf+aZZ+bXPuWUU9Ibb7xR89xoeh8177FPy5cVVlghPxbbPbZLrDv2689//vN0zTXXpG+//XaGyw8AdQndADANm222WR5p+7333ks//PBDbs5cGVYr/98cinz9CPqVoh92BPOim+9Py8cff5x+9rOfpVVXXTU3vx88eHC64oor8mPlZv+/+c1v0ocffpjDeDQvjxMTl112WX4sTmxEf+/Yp5WX2L8bb7xxPskQXQWir/yKK66Ynxd90z/66KNC3zcAbZfQDQDTCbXRn3jxxRdPnTtPf9KPPn365NrUyoG3nnnmmdwPuTzQWohlIsSXPf/887nWNQYGKw9EFs8ri5rv6BMdQXBa4nnTGsW8IWVsqFhvZZnL651emStFzXUMuBZ93usTITuC/4UXXpjWW2+9tPzyy+ea8bpiO8bgdNFXPvqYR411WHPNNXNf8HiN2K+Vl/IJjDi5ELXk0cf+1Vdfzds0+qsDwMwQugGgEe2xxx65KXr//v3zYGLRlPnQQw/Nta4xUnZZ1MoOGDAgvfPOO3lk7WgGHQOZRfCN8BcjpR977LF5oK9YZr/99svNp+M50xJhMmplo/Y2RuSOAcVmtowNFeWNgdZiILSoOY5RxiP0HnPMMQ1aTzTfj1Adg6XFemIguXJNdYTjOAERt6M2O0ZHv/rqq2s9/4gjjkgPP/xw3g7x3Hh/cUKgPMhaDEYXg6XFSYxoUh7LxoBvcbLihRdeSGeffXYeZG3o0KG5/F999VXN8wGgoYRuAGhE0U87QlwEu5/85Cdp1113zX2EL7/88lrLxX0xV3U0aY5+4v/zP/9Tq694jEjer1+/HISjdvb999/P640Rx6clnhMjhEez+JiOLEZGn9kyNlRMMRYjksc0Y9Ef/I9//GOe43zTTTdt0HriZMAll1ySrrzyyryeaE4e4TtEn+sI8zEi+corr5xuueWWdM4559R6foTnCNcRlGNbRG14rCvE1G5R+x7LbL311rnvdoT0Hj165BMeMX1bjHq+3Xbb5eeddNJJ+QRA9OcHgJnRIUZTm6lnAgAzJeanjqmrKufNBgDaJjXdAAAAUBChGwAAAAqieTkAAAAURE03AAAAFEToBgAAgIII3QAAAFAQoRsAAAAKInQDAABAQYRuAAAAKIjQDQAAAAURugEAAKAgQjcAAACkYvx/QF04kreZyE4AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Import necessary libraries\n", "import pandas as pd\n", @@ -75,6 +98,9 @@ "import warnings\n", "warnings.simplefilter(action='ignore', category=FutureWarning)\n", "\n", + "#setting a random seed.\n", + "np.random.seed(123)\n", + "\n", "# Constants representing the parameters of the model\n", "ATTACK_RATE = 0.10\n", "TRACE_SUCCESS = 0.20\n", @@ -193,7 +219,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "sampling-env", "language": "python", "name": "python3" }, @@ -207,7 +233,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.0" + "version": "3.11.13" } }, "nbformat": 4,