diff --git a/ipynb/Dice Baseball.ipynb b/ipynb/Dice Baseball.ipynb index 9f0a0a7..a4fdc9b 100644 --- a/ipynb/Dice Baseball.ipynb +++ b/ipynb/Dice Baseball.ipynb @@ -8,17 +8,18 @@ "\n", "# Dice Baseball\n", "\n", - "The [March 22, 2019 Riddler](https://fivethirtyeight.com/features/can-you-turn-americas-pastime-into-a-game-of-yahtzee/) asks us to simulate baseball using probabilities from a 19th century dice game. There were some choices to make that were left unspecified in the rules; these are my choices (your choices may differ):\n", + "The [March 22, 2019 Riddler](https://fivethirtyeight.com/features/can-you-turn-americas-pastime-into-a-game-of-yahtzee/) asks us to simulate baseball using probabilities from a 19th century dice game. There were some choices to make that were left unspecified in the rules; the following are my current choices (in an early version I made different choices that resulted in slightly more runs):\n", "\n", "* On a `b`-base hit, runners advance `b` bases, except that a runner on second scores on a 1-base hit.\n", "* On an \"out at first\", all runners advance one base.\n", - "* On a double play, the runner on first is out if there is one, otherwise a runner on second, otherwise a runner on third, otherwise it is only a single out.\n", + "* A double play only applies if there is a runner on first; in that case other runners advance.\n", "* On a fly out, a runner on third scores; other runners do not advance.\n", - "* On an error all runners advance one base. (*Note: in an earlier version, I treated an error as a single, meaning that a runner would score from second on an error, which seems wrong. Under that interpretation, teams score about 0.05 runs more per game.*)\n", + "* On an error all runners advance one base. \n", + "* On a base on balls, only forced runners advance.\n", "\n", "I also made some choices about the implementation:\n", "- I wanted to have one event per batter, so I don't allow \"strike\" as an event. Rather I compute the probability of a strikeout event (i.e. getting three \"strike\" dice rolls in a row before getting another event) as `(7/36)**3`, and check for that.\n", - "- Note that a die roll such as (1, 1) is a 1/36 event, whereas (1, 2) is a 2/36 event, because it is also (2, 1).\n", + "- Note that a die roll such as (1, 1) is a 1/36 event, whereas (1, 2) is a 2/36 event, because it also represents (2, 1).\n", "- I'll represent events with the following one letter codes:\n", " - `K`, `O`, `o`, `f`, `D`: strikeout, foul out, out at first, fly out, double play\n", " - `1`, `2`, `3`, `4`: single, double, triple, home run\n", @@ -56,29 +57,29 @@ " while True:\n", " x = 'K' if random.random() <= PK else random.choice(events)\n", " if verbose: print(f'outs: {outs}, runs: {runs}, runners: {runners}, event: {x}')\n", - " if x in 'KOofD': # batter is out: strikeout, foul out, out at first, fly out, double play\n", - " outs += 1\n", - " if x == 'D' and runners: # double play\n", - " runners.remove(min(runners))\n", + " if x in 'KODof': # strikeout, foul out, double play, out at first, fly out, \n", + " outs += 1 # Batter is out\n", + " if x == 'D' and 1 in runners: # double play\n", " outs += 1\n", + " runners = [r + 1 for r in runners if r != 1]\n", " elif x == 'o': # out at first (other runners advance)\n", - " runners = [r+1 for r in runners]\n", - " elif x == 'f' and 3 in runners: # fly out; runner on 3rd scores\n", + " runners = [r + 1 for r in runners]\n", + " elif x == 'f' and 3 in runners and outs < 3: # fly out; runner on 3rd scores\n", " runners.remove(3)\n", " runs += 1\n", - " else: # batter reaches base safely\n", - " runners.append(0)\n", - " if x in '1234': # single, double, triple, homer\n", + " else: \n", + " runners.append(0) # Batter becomes a runner\n", + " if x in '1234': # single, double, triple, homer\n", " runners = [r + int(x) + (r == 2) for r in runners]\n", - " elif x == 'E': # error\n", + " elif x == 'E': # error\n", " runners = [r + 1 for r in runners]\n", - " elif x == 'B': # base on balls\n", + " elif x == 'B': # base on balls\n", " runners = [r + all(b in runners for b in range(r)) for r in runners]\n", + " # See if inning is over, and if not, whether anyone scored\n", " if outs >= 3:\n", " return runs\n", - " else: # See if anybody scored\n", - " runs += sum(r >= 4 for r in runners)\n", - " runners = [r for r in runners if r < 4]" + " runs += sum(r >= 4 for r in runners)\n", + " runners = [r for r in runners if r < 4]" ] }, { @@ -97,20 +98,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "outs: 0, runs: 0, runners: [], event: 4\n", - "outs: 0, runs: 1, runners: [], event: E\n", - "outs: 0, runs: 1, runners: [1], event: 1\n", - "outs: 0, runs: 1, runners: [2, 1], event: 4\n", - "outs: 0, runs: 4, runners: [], event: 3\n", - "outs: 0, runs: 4, runners: [3], event: o\n", - "outs: 1, runs: 5, runners: [], event: o\n", - "outs: 2, runs: 5, runners: [], event: f\n" + "outs: 0, runs: 0, runners: [], event: O\n", + "outs: 1, runs: 0, runners: [], event: 1\n", + "outs: 1, runs: 0, runners: [1], event: o\n", + "outs: 2, runs: 0, runners: [2], event: B\n", + "outs: 2, runs: 0, runners: [2, 1], event: 3\n", + "outs: 2, runs: 2, runners: [3], event: E\n", + "outs: 2, runs: 3, runners: [1], event: f\n" ] }, { "data": { "text/plain": [ - "5" + "3" ] }, "execution_count": 3, @@ -131,12 +131,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "outs: 0, runs: 0, runners: [], event: o\n", - "outs: 1, runs: 0, runners: [], event: D\n", - "outs: 2, runs: 0, runners: [], event: 1\n", - "outs: 2, runs: 0, runners: [1], event: E\n", - "outs: 2, runs: 0, runners: [2, 1], event: 3\n", - "outs: 2, runs: 2, runners: [3], event: o\n" + "outs: 0, runs: 0, runners: [], event: 3\n", + "outs: 0, runs: 0, runners: [3], event: 1\n", + "outs: 0, runs: 1, runners: [1], event: 2\n", + "outs: 0, runs: 1, runners: [3, 2], event: D\n", + "outs: 1, runs: 1, runners: [3, 2], event: f\n", + "outs: 2, runs: 2, runners: [2], event: o\n" ] }, { @@ -163,20 +163,25 @@ "name": "stdout", "output_type": "stream", "text": [ - "outs: 0, runs: 0, runners: [], event: f\n", - "outs: 1, runs: 0, runners: [], event: 1\n", - "outs: 1, runs: 0, runners: [1], event: B\n", - "outs: 1, runs: 0, runners: [2, 1], event: B\n", - "outs: 1, runs: 0, runners: [3, 2, 1], event: 1\n", - "outs: 1, runs: 2, runners: [2, 1], event: 3\n", - "outs: 1, runs: 4, runners: [3], event: o\n", - "outs: 2, runs: 5, runners: [], event: K\n" + "outs: 0, runs: 0, runners: [], event: 4\n", + "outs: 0, runs: 1, runners: [], event: 1\n", + "outs: 0, runs: 1, runners: [1], event: B\n", + "outs: 0, runs: 1, runners: [2, 1], event: 1\n", + "outs: 0, runs: 2, runners: [2, 1], event: f\n", + "outs: 1, runs: 2, runners: [2, 1], event: 2\n", + "outs: 1, runs: 3, runners: [3, 2], event: 3\n", + "outs: 1, runs: 5, runners: [3], event: B\n", + "outs: 1, runs: 5, runners: [3, 1], event: B\n", + "outs: 1, runs: 5, runners: [3, 2, 1], event: 1\n", + "outs: 1, runs: 7, runners: [2, 1], event: 1\n", + "outs: 1, runs: 8, runners: [2, 1], event: o\n", + "outs: 2, runs: 8, runners: [3, 2], event: o\n" ] }, { "data": { "text/plain": [ - "5" + "8" ] }, "execution_count": 5, @@ -223,7 +228,7 @@ { "data": { "text/plain": [ - "14.959092" + "14.457532" ] }, "execution_count": 7, @@ -232,7 +237,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAD8CAYAAACcjGjIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAFlJJREFUeJzt3X+MXWd95/H3p4ZARAtOwPVaHrvJCguUoiUko8QItKKJcJwU4VSiUVC3sVAWr0SoQO2qhP5jNWxWIK1KyYoiWcQbZ0UJ3rRsLGRwLQNq94+EOJAmJAF5SMnalh27OD9aIWCTfveP+0y58bn23Jmx586deb+kq3vO9zzn3ucoN/7Mc36mqpAkqd+vjLoDkqTFx3CQJHUYDpKkDsNBktRhOEiSOgwHSVKH4SBJ6pgxHJK8Jcmjfa8Xk3w8ycVJ9ic51N4vau2T5K4kU0keS3JF32dtbe0PJdnaV78yyeNtnbuS5PxsriRpGDOGQ1X9sKour6rLgSuBnwJfBW4HDlTVBuBAmwe4HtjQXtuALwAkuRjYDlwNXAVsnw6U1ubDfettPidbJ0mak1fNsv21wI+q6pkkW4D3tPou4NvAJ4AtwL3Vu/T6wSQrk6xpbfdX1SmAJPuBzUm+Dby+qh5s9XuBG4Gvn60jb3rTm+qSSy6ZZfclafl65JFH/rGqVg3TdrbhcDPw5Ta9uqqOtenjwOo2vRY43LfOkVY7W/3IgHpHkm30RiOsX7+egwcPzrL7krR8JXlm2LZDH5BOcgHwfuB/nb6sjRLO+02aqmpHVU1W1eSqVUOFnyRpDmZzttL1wHer6tk2/2zbXUR7P9HqR4F1fetNtNrZ6hMD6pKkEZlNOHyQX+5SAtgDTJ9xtBV4oK9+SztraSPwQtv9tA/YlOSidiB6E7CvLXsxycZ2ltItfZ8lSRqBoY45JHkd8F7gP/WVPw3sTnIr8AxwU6vvBW4Apuid2fQhgKo6leRTwMOt3R3TB6eBjwD3ABfSOxB91oPRkqTzK+P6PIfJycnygLQkDS/JI1U1OUxbr5CWJHUYDpKkDsNBktRhOEiSOgwHsWZiPUle8XrVay7s1JKwZmL9qLsraQHM9vYZWoKOHz3Mb3zia6+oPfOZ93Vq03VJS58jB0lSh+EgSeowHJaZQccXJOl0HnNYZs50fEGS+jlykCR1GA6SpA7DQbOz4tVe+yAtAx5z0Oy8/P88ZiEtA44cJEkdhoMkqcNwkCR1GA6SpA7DQZLUYThIkjoMhyXM+yhJmiuvc1jCvI+SpLkaauSQZGWS+5P8IMlTSd6Z5OIk+5Mcau8XtbZJcleSqSSPJbmi73O2tvaHkmztq1+Z5PG2zl3xT1xJGqlhdyt9DvhGVb0VeDvwFHA7cKCqNgAH2jzA9cCG9toGfAEgycXAduBq4Cpg+3SgtDYf7ltv8/w2S5I0HzOGQ5I3AP8euBugqn5RVc8DW4Bdrdku4MY2vQW4t3oeBFYmWQNcB+yvqlNV9RywH9jclr2+qh6sqgLu7fssSdIIDDNyuBQ4CfyPJN9L8sUkrwNWV9Wx1uY4sLpNrwUO961/pNXOVj8yoN6RZFuSg0kOnjx5coiua0F4Mz5pyRnmgPSrgCuAP6iqh5J8jl/uQgKgqipJnY8OnvY9O4AdAJOTk+f9+zQkb8YnLTnDjByOAEeq6qE2fz+9sHi27RKivZ9oy48C6/rWn2i1s9UnBtQlSSMyYzhU1XHgcJK3tNK1wJPAHmD6jKOtwANteg9wSztraSPwQtv9tA/YlOSidiB6E7CvLXsxycZ2ltItfZ8lSRqBYa9z+APgS0kuAJ4GPkQvWHYnuRV4Briptd0L3ABMAT9tbamqU0k+BTzc2t1RVafa9EeAe4ALga+3lyRpRIYKh6p6FJgcsOjaAW0LuO0Mn7MT2DmgfhB42zB9kSSdf94+Q5LUYThIkjoMB0lSh+EgSeowHJaAQbfm9t6FkubDW3YvAYNuzQ1epSxp7hw56PzwfkvSWHPkoPPD+y1JY82RgySpw3CQJHUYDpKkDsNBktRhOEiSOgwHSVKH4SBJ6jAcJEkdhoMkqcNwkCR1GA6SpA7DQZLUYThIkjqGCockP07yeJJHkxxstYuT7E9yqL1f1OpJcleSqSSPJbmi73O2tvaHkmztq1/ZPn+qreuTaiRphGYzcvitqrq8qibb/O3AgaraABxo8wDXAxvaaxvwBeiFCbAduBq4Ctg+HSitzYf71ts85y2SJM3bfHYrbQF2teldwI199Xur50FgZZI1wHXA/qo6VVXPAfuBzW3Z66vqwaoq4N6+z5IkjcCw4VDA3yR5JMm2VltdVcfa9HFgdZteCxzuW/dIq52tfmRAXQMMel702PDpcNLYGPZJcO+uqqNJfh3Yn+QH/QurqpLUue/eK7Vg2gawfv3y/Edl0POix+YJaz4dThobQ40cqupoez8BfJXeMYNn2y4h2vuJ1vwosK5v9YlWO1t9YkB9UD92VNVkVU2uWrVqmK5LkuZgxnBI8rokvzY9DWwCvg/sAabPONoKPNCm9wC3tLOWNgIvtN1P+4BNSS5qB6I3AfvasheTbGxnKd3S91mSpBEYZrfSauCrbd/2q4C/rKpvJHkY2J3kVuAZ4KbWfi9wAzAF/BT4EEBVnUryKeDh1u6OqjrVpj8C3ANcCHy9vSRJIzJjOFTV08DbB9R/Alw7oF7AbWf4rJ3AzgH1g8DbhuivJGkBeIW0JKnDcJAkdRgOkqQOw0GS1GE4SJI6DAdJUofhIEnqMBwkSR2GgySpw3CQJHUYDhqtAc948DkP0ugN+zwH6fwY8IwH8DkP0qg5cpAkdRgOkqQOw0GS1GE4SJI6DAdJUofhIEnqMBwkSR2GgySpw3BYxNZMrO9cOSxJC8ErpBex40cPd64e9sphSQth6JFDkhVJvpfka23+0iQPJZlK8pUkF7T6a9r8VFt+Sd9nfLLVf5jkur765labSnL7uds8SdJczGa30seAp/rmPwN8tqreDDwH3NrqtwLPtfpnWzuSXAbcDPwmsBn4ixY4K4DPA9cDlwEfbG0lSSMyVDgkmQB+G/himw9wDXB/a7ILuLFNb2nztOXXtvZbgPuq6udV9Q/AFHBVe01V1dNV9QvgvtZWkjQiw44c/hz4Y+Bf2vwbgeer6qU2fwRY26bXAocB2vIXWvt/rZ+2zpnqkqQRmTEckrwPOFFVjyxAf2bqy7YkB5McPHny5Ki7I0lL1jAjh3cB70/yY3q7fK4BPgesTDJ9ttMEcLRNHwXWAbTlbwB+0l8/bZ0z1TuqakdVTVbV5KpVq4bouiRpLmYMh6r6ZFVNVNUl9A4of7Oqfg/4FvCB1mwr8ECb3tPmacu/WVXV6je3s5kuBTYA3wEeBja0s58uaN+x55xsnSRpTuZzEdwngD9MMkXvmMLdrX438MZW/0PgdoCqegLYDTwJfAO4rapebsclPgrso3c21O7WVsvZgMeH+uhQaeHM6iK4qvo28O02/TS9M41Ob/Mz4HfPsP6dwJ0D6nuBvbPpi5a4AY8P9QJAaeF4+wxJUofhIEnqMBwkSR2GgySpw3CQJHUYDpKkDsNBktRhOEiSOgwHSVKH4SBJ6jAcJEkdhoMkqcNwkCR1GA6SpA7DQZLUYTgsEmsm1ncebqPT+AAgacHM6mE/On+OHz3sw21m4gOApAXjyEGS1GE4SJI6DAdJUofhIEnqMBwkSR0zhkOS1yb5TpK/T/JEkj9t9UuTPJRkKslXklzQ6q9p81Nt+SV9n/XJVv9hkuv66ptbbSrJ7ed+MyVJszHMyOHnwDVV9XbgcmBzko3AZ4DPVtWbgeeAW1v7W4HnWv2zrR1JLgNuBn4T2Az8RZIVSVYAnweuBy4DPtjaSpJGZMZwqJ5/brOvbq8CrgHub/VdwI1tekubpy2/Nr0rurYA91XVz6vqH4Ap4Kr2mqqqp6vqF8B9ra0kaUSGOubQ/sJ/FDgB7Ad+BDxfVS+1JkeAtW16LXAYoC1/AXhjf/20dc5UlySNyFDhUFUvV9XlwAS9v/Tfel57dQZJtiU5mOTgyZMnR9EFSVoWZnW2UlU9D3wLeCewMsn07TcmgKNt+iiwDqAtfwPwk/76aeucqT7o+3dU1WRVTa5atWo2XZckzcIwZyutSrKyTV8IvBd4il5IfKA12wo80Kb3tHna8m9WVbX6ze1spkuBDcB3gIeBDe3spwvoHbTecy42TpI0N8PceG8NsKudVfQrwO6q+lqSJ4H7kvwX4HvA3a393cD/TDIFnKL3jz1V9USS3cCTwEvAbVX1MkCSjwL7gBXAzqp64pxtoSRp1mYMh6p6DHjHgPrT9I4/nF7/GfC7Z/isO4E7B9T3AnuH6K8kaQF4hbTGm894kM4Ln+eg8eYzHqTzwpGDJKnDcJAkdRgOkqQOw0GS1GE4SJI6DAdJUofhIEnqMBwW2JqJ9Z2LtnqPu5CkxcOL4BbY8aOHOxdtgRduSVpcHDlIkjoMB0lSh+EgSeowHCRJHYaDlp4Bt/H2Vt7S7Hi2kpaeAbfxBs8Ik2bDkYMkqcNwkCR1GA6SpA7DQZLUYThIkjpmDIck65J8K8mTSZ5I8rFWvzjJ/iSH2vtFrZ4kdyWZSvJYkiv6Pmtra38oyda++pVJHm/r3BXvRCdJIzXMyOEl4I+q6jJgI3BbksuA24EDVbUBONDmAa4HNrTXNuAL0AsTYDtwNXAVsH06UFqbD/ett3n+myZJmqsZw6GqjlXVd9v0PwFPAWuBLcCu1mwXcGOb3gLcWz0PAiuTrAGuA/ZX1amqeg7YD2xuy15fVQ9WVQH39n2WJGkEZnXMIcklwDuAh4DVVXWsLToOrG7Ta4HDfasdabWz1Y8MqEuSRmTocEjyq8BfAR+vqhf7l7W/+Osc921QH7YlOZjk4MmTJ8/310nSsjVUOCR5Nb1g+FJV/XUrP9t2CdHeT7T6UWBd3+oTrXa2+sSAekdV7aiqyaqaXLVq1TBdl35pwD2XvN+SNNiM91ZqZw7dDTxVVX/Wt2gPsBX4dHt/oK/+0ST30Tv4/EJVHUuyD/ivfQehNwGfrKpTSV5MspHe7qpbgP9+DrZNeqUB91zyfkvSYMPceO9dwO8Djyd5tNX+hF4o7E5yK/AMcFNbthe4AZgCfgp8CKCFwKeAh1u7O6rqVJv+CHAPcCHw9faSJI3IjOFQVf8HONN1B9cOaF/AbWf4rJ3AzgH1g8DbZuqLJGlheIW0JKnDcJAkdRgOkqQOw+E8WjOxvnPqpCSNAx8Teh4dP3rYUycljSVHDpKkDsNBktRhOEiSOgwHLW/eb0kayAPSWt6835I0kCMHSVKH4SBJ6jAcJEkdhoMkqcNwkCR1GA6SpA7DQZLUYThIp/PCOMmL4KQOL4yTHDlIkroMB0lSh+EgSeqYMRyS7ExyIsn3+2oXJ9mf5FB7v6jVk+SuJFNJHktyRd86W1v7Q0m29tWvTPJ4W+eujOmzNH0kqKSlZJiRwz3A5tNqtwMHqmoDcKDNA1wPbGivbcAXoBcmwHbgauAqYPt0oLQ2H+5b7/TvGgvTjwTtf0nSuJoxHKrqb4FTp5W3ALva9C7gxr76vdXzILAyyRrgOmB/VZ2qqueA/cDmtuz1VfVgVRVwb99nSZJGZK7HHFZX1bE2fRxY3abXAof72h1ptbPVjwyoS5JGaN4HpNtf/HUO+jKjJNuSHExy8OTJkwvxlVLPgAvjvDhOS9lcL4J7NsmaqjrWdg2daPWjwLq+dhOtdhR4z2n1b7f6xID2A1XVDmAHwOTk5IIEkgQMvDAOvDhOS9dcRw57gOkzjrYCD/TVb2lnLW0EXmi7n/YBm5Jc1A5EbwL2tWUvJtnYzlK6pe+zJEkjMuPIIcmX6f3V/6YkR+iddfRpYHeSW4FngJta873ADcAU8FPgQwBVdSrJp4CHW7s7qmr6IPdH6J0RdSHw9faSJI3QjOFQVR88w6JrB7Qt4LYzfM5OYOeA+kHgbTP1Q5K0cLxCWpLUYThIkjoMB2k+fPaDliif5yDNh89+0BLlyEGS1GE4SJI6DIc58PbckpY6jznMwfTtufu5n1n/qh2k7vdv1q7j2JH/O6IOSbNnOEjnmgeptQS4W0mS1GE4SJI6DAdpIXixnMaMxxykheBxCI0ZRw6SpA7DQZLUYThIo+JzqbWIecxBGhWfS61FzJHDWQy6TYa3ytB555lNWgQcOZzFoNtkgH/Z6TzzzCYtAo4cpHHgaEILzJGDNA4cTWiBOXKQxpWjCZ1Hi2bkkGQz8DlgBfDFqvr0Qn7/mon1HD96eCG/UpqfQaOJ//Y7A0+a8Jbhmq1FEQ5JVgCfB94LHAEeTrKnqp5cqD74jAYtCWc6PXZAaBgYOptFEQ7AVcBUVT0NkOQ+YAuwYOEgLWlDjjJWXPBaXv7Fz15RM0SWp8USDmuB/n06R4Crz9eXuQtJ4owHuYfdVTUoSIatGTiLX6pq1H0gyQeAzVX1H9v87wNXV9VHT2u3DdjWZt8C/HCOX/km4B/nuO5itRS3CZbmdrlN42OpbddvVNWqYRoulpHDUWBd3/xEq71CVe0Adsz3y5IcrKrJ+X7OYrIUtwmW5na5TeNjqW7XMBbLqawPAxuSXJrkAuBmYM+I+yRJy9aiGDlU1UtJPgrso3cq686qemLE3ZKkZWtRhANAVe0F9i7Q181719QitBS3CZbmdrlN42OpbteMFsUBaUnS4rJYjjlIkhaRZRUOSTYn+WGSqSS3j7o/c5VkZ5ITSb7fV7s4yf4kh9r7RaPs42wlWZfkW0meTPJEko+1+thuV5LXJvlOkr9v2/SnrX5pkofa7/Ar7SSMsZNkRZLvJflamx/r7Ury4ySPJ3k0ycFWG9vf33wtm3Dou0XH9cBlwAeTXDbaXs3ZPcDm02q3AweqagNwoM2Pk5eAP6qqy4CNwG3tv884b9fPgWuq6u3A5cDmJBuBzwCfrao3A88Bt46wj/PxMeCpvvmlsF2/VVWX952+Os6/v3lZNuFA3y06quoXwPQtOsZOVf0tcOq08hZgV5veBdy4oJ2ap6o6VlXfbdP/RO8fnbWM8XZVzz+32Ve3VwHXAPe3+lht07QkE8BvA19s82EJbNcAY/v7m6/lFA6DbtGxdkR9OR9WV9WxNn0cWD3KzsxHkkuAdwAPMebb1Xa9PAqcAPYDPwKer6qXWpNx/R3+OfDHwL+0+Tcy/ttVwN8keaTdjQHG/Pc3H4vmVFadO1VVScbyNLQkvwr8FfDxqnqx/54+47hdVfUycHmSlcBXgbeOuEvzluR9wImqeiTJe0bdn3Po3VV1NMmvA/uT/KB/4Tj+/uZjOY0chrpFxxh7NskagPZ+YsT9mbUkr6YXDF+qqr9u5bHfLoCqeh74FvBOYGWS6T/MxvF3+C7g/Ul+TG/37DX0nsUy1ttVVUfb+wl6QX4VS+T3NxfLKRyW+i069gBb2/RW4IER9mXW2j7ru4GnqurP+haN7XYlWdVGDCS5kN7zSp6iFxIfaM3GapsAquqTVTVRVZfQ+//om1X1e4zxdiV5XZJfm54GNgHfZ4x/f/O1rC6CS3IDvX2l07fouHPEXZqTJF8G3kPvjpHPAtuB/w3sBtYDzwA3VdXpB60XrSTvBv4OeJxf7sf+E3rHHcZyu5L8O3oHMVfQ+0Nsd1XdkeTf0vuL+2Lge8B/qKqfj66nc9d2K/3nqnrfOG9X6/tX2+yrgL+sqjuTvJEx/f3N17IKB0nScJbTbiVJ0pAMB0lSh+EgSeowHCRJHYaDJKnDcJAkdRgOkqQOw0GS1PH/AQakTgOf1h2TAAAAAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ "
" ]