Skip to content

Instantly share code, notes, and snippets.

@nmpowell
Last active April 11, 2023 23:59
Show Gist options
  • Save nmpowell/6b836be7a3c0dc2cd1cff8131b4a6c5c to your computer and use it in GitHub Desktop.
Save nmpowell/6b836be7a3c0dc2cd1cff8131b4a6c5c to your computer and use it in GitHub Desktop.
Generating a qualitative matplotlib colourmap from a CSS HSL gradient. This is for https://github.com/nmpowell/carbon-intensity-forecast-tracking
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "a8b8063b",
"metadata": {},
"source": [
"# Generating a matplotlib colourmap from a CSS HSL gradient\n",
"\n",
"I copied a nice gradient, green to red via yellow, from [Josh Comeau](https://www.joshwcomeau.com/gradient-generator?colors=00ea00|ffea00|ff0000&angle=0&colorMode=hcl&precision=20&easingCurve=0.25|0.75|0.75|0.25), which is designed to avoid the perceptual muddy middle of some colour gradients."
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "cfb1a7f4",
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.colors as mcolors\n",
"from matplotlib.colors import BoundaryNorm, ListedColormap\n",
"import colorsys\n",
"\n",
"plt.rcParams[\"figure.figsize\"] = [12, 1]\n",
"plt.rcParams[\"figure.dpi\"] = 250\n",
"\n",
"# The middle boundaries of the qualitative ranges; not the limits.\n",
"# The actual minimum in the data could be e.g. 0 or -np.inf; the actual maximum could be 300 or np.inf.\n",
"values_from = [40, 120, 200, 291]"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "7ae97fe1",
"metadata": {},
"outputs": [],
"source": [
"def hsl_to_rgb(h, s, l):\n",
" return colorsys.hls_to_rgb(h / 360, l / 100, s / 100)\n",
"\n",
"# Use the CSS values from the gradient generator\n",
"css_hsl = [\n",
" (120, 100, 46),\n",
" (101, 100, 46),\n",
" (94, 100, 46),\n",
" (88, 100, 46),\n",
" (82, 100, 46),\n",
" (78, 100, 46),\n",
" (73, 100, 46),\n",
" (69, 100, 46),\n",
" (65, 100, 46),\n",
" (62, 100, 46),\n",
" (58, 100, 47),\n",
" (55, 100, 50),\n",
" (52, 100, 50),\n",
" (48, 100, 50),\n",
" (44, 100, 50),\n",
" (41, 100, 50),\n",
" (37, 100, 50),\n",
" (33, 100, 50),\n",
" (29, 100, 50),\n",
" (24, 100, 50),\n",
" (19, 100, 50),\n",
" (13, 100, 50),\n",
" (0, 100, 50),\n",
"]\n",
"\n",
"colours = [hsl_to_rgb(*hsl) for hsl in css_hsl]\n",
"\n",
"colour_positions = np.linspace(0, 1, len(colours))\n",
"\n",
"cmap = mcolors.LinearSegmentedColormap.from_list(\"green_yellow_red_cmap\", list(zip(colour_positions, colours)))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "87be1327",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAACUcAAADyCAYAAABk+uZcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAACZzAAAmcwHzbHUKAAAN7UlEQVR4nO3cwWocWRJA0VBV2yPwXr3p//+f+QjToL1B2FOqXniY3aAEZ6Yzb52zfrwXUZJNI9/W0/1+vw8AAAAAAAAAAEDM5XcPAAAAAAAAAAAAsAVxFAAAAAAAAAAAkCSOAgAAAAAAAAAAksRRAAAAAAAAAABAkjgKAAAAAAAAAABIEkcBAAAAAAAAAABJ4igAAAAAAAAAACBJHAUAAAAAAAAAACSJowAAAAAAAAAAgCRxFAAAAAAAAAAAkCSOAgAAAAAAAAAAksRRAAAAAAAAAABAkjgKAAAAAAAAAABIEkcBAAAAAAAAAABJ4igAAAAAAAAAACBJHAUAAAAAAAAAACSJowAAAAAAAAAAgCRxFAAAAAAAAAAAkCSOAgAAAAAAAAAAksRRAAAAAAAAAABAkjgKAAAAAAAAAABIEkcBAAAAAAAAAABJ4igAAAAAAAAAACDpj60f+PLly7y9vc31ep2Xl5etnwMAAAAAAAAAAA7u9fV1brfbPD8/z7dv3zZ75+l+v983u31mrtfrvL+/b/kEAAAAAAAAAABwQpfLZW6322b3b/6bo/4XR11m5s9fu+tppTNHe2vv9/bebQ1Hm2dm35mOuP9HzjjzzPHmPto8Sxxx5iPOtIbqXms642d0xplnzjv3Gh5595nH3v+Rd1/KZ7QOn+PHHvkzeuTdF9v0fwt8EOXPsLzbEtX9q3st9ej7f6T8+ZR3+0h59+pu1b1murudda8zzn3GmWfOOffRZj7aPDPHnOkja818tHvWvGvJPTt97f+emff52RZtafM46uXlZb5+/fozjPr3/z/3ecFdS87862D37P3eWvd8WnDmstKZJd/ie96z93tHe+uMZ/Z+z5lfP7P3e2udWfIPT2vdc7S39n5vz6/H0b4/9nxr7/eO9n19xrf2fq/6VvnvT2d+/cze7z0t+CHDrn+Gdpxnrc9n6V2L9l9w0dH+nqnuNTPr/aBuyS80X+ut6pmlvxR+z69H9Z4931rzLvfsc2bpuaPNfcYz/pw97j17v+eefe5Z864z7r/knrXOrPnflnvOfcbP+mh7LT13xt3WOrPkF+LsOc/Sc0ebe8mZ/yw482OlM3u+tfTcnjOtMM9fM/N1frZFW1r672YAAAAAAAAAAACnIo4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEh6ut/v9y0f+Pz58/z48eNnhvXnr931tNKZo72193t777aGo80zs+9MR9z/I2eceeZ4cx9tniWOOPMRZ1pDda81nfEzOuPMM+edew2PvPvMY+//yLsv5TNah8/xY4/8GT3y7ott+pOvB1H+DMu7LVHdv7rXUo++/0fKn095t4+Ud6/uVt1rprvbWfc649xnnHnmnHMfbeajzTNzzJk+stbMR7tnzbuW3LPT1/7vmXmfmU+fPs337983e2fzOOp6vc77+/uWTwAAAAAAAAAAACd0uVzmdrttdv8fm938X8/Pz/P29jbX63VeXl62fg4AAAAAAAAAADi419fXud1u8/z8vOk7m//mKAAAAAAAAAAAgN/h8rsHAAAAAAAAAAAA2II4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAICkfwBVnP0p02MT6QAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 3000x250 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def preview_colourmap(cmap):\n",
" gradient = np.linspace(0, 1, 256)\n",
" gradient = np.vstack((gradient, gradient))\n",
"\n",
" fig, ax = plt.subplots()\n",
" ax.imshow(gradient, aspect=\"auto\", cmap=cmap)\n",
" plt.xticks([])\n",
" plt.yticks([])\n",
" plt.show()\n",
"\n",
"preview_colourmap(cmap)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "4aaa01b8",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAACUcAAADyCAYAAABk+uZcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAACZzAAAmcwHzbHUKAAAMKElEQVR4nO3cwW0bSRRF0RLbEmho5wW9maQmkMloInA2DkIwwJU3ggkJzfZCg8mg0O6LcwKo/wK4qIdt27YBAAAAAAAAAAAQc9p7AAAAAAAAAAAAwAziKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAECSOAoAAAAAAAAAAEgSRwEAAAAAAAAAAEniKAAAAAAAAAAAIEkcBQAAAAAAAAAAJImjAAAAAAAAAACAJHEUAAAAAAAAAACQJI4CAAAAAAAAAACSxFEAAAAAAAAAAEDSp9kHnp+fx+12G8uyjMvlMvscAAAAAAAAAADwh7ter2Nd13E+n8fr6+u0Ow/btm3TXh9jLMsy7vf7zBMAAAAAAAAAAMABnU6nsa7rtPen/xz1fxx1GmN8nX0NABq+7D0AAA7m894DAOCIfu09AAAO5ufeAwCg5ccY4z4+2qKZpsdRl8tlvLy8fIRR32dfA4CGf/ceAAAH8/fUP5EBIOrb3gMA4GD+2XsAALT8NcZ4GR9t0Uynqa8DAAAAAAAAAADsRBwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJAkjgIAAAAAAAAAAJLEUQAAAAAAAAAAQJI4CgAAAAAAAAAASBJHAQAAAAAAAAAASeIoAAAAAAAAAAAgSRwFAAAAAAAAAAAkiaMAAAAAAAAAAIAkcRQAAAAAAAAAAJD0sG3bNvPA09PTeH9//8iwvs68BAAdX/YeAAAH83nvAQBwRL/2HgAAB/Nz7wEA0PJjjHEfYzw+Po63t7dpd6bHUcuyjPv9PvMEAAAAAAAAAABwQKfTaazrOu39T9Ne/s/5fB63220syzIul8vscwAAAAAAAAAAwB/uer2OdV3H+Xyeemf6z1EAAAAAAAAAAAB7OO09AAAAAAAAAAAAYAZxFAAAAAAAAAAAkCSOAgAAAAAAAAAAksRRAAAAAAAAAABAkjgKAAAAAAAAAABIEkcBAAAAAAAAAABJ4igAAAAAAAAAACBJHAUAAAAAAAAAACSJowAAAAAAAAAAgCRxFAAAAAAAAAAAkCSOAgAAAAAAAAAAksRRAAAAAAAAAABAkjgKAAAAAAAAAABIEkcBAAAAAAAAAABJ4igAAAAAAAAAACBJHAUAAAAAAAAAACSJowAAAAAAAAAAgCRxFAAAAAAAAAAAkCSOAgAAAAAAAAAAksRRAAAAAAAAAABAkjgKAAAAAAAAAABIEkcBAAAAAAAAAABJvwH8ulAX/2KYOAAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 3000x250 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Select 5 colours from the original colormap\n",
"selected_colours = [cmap(i) for i in np.linspace(0, 1, 5)]\n",
"\n",
"# Create a qualitative colormap with 5 distinct colours\n",
"qualitative_cmap = mcolors.ListedColormap(selected_colours)\n",
"\n",
"# Preview the qualitative colormap\n",
"preview_colourmap(qualitative_cmap)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "06d49306",
"metadata": {},
"outputs": [],
"source": [
"# Define the new boundaries\n",
"boundaries = [0, *values_from, max(values_from)+1]\n",
"\n",
"# Create a new BoundaryNorm with the new boundaries\n",
"norm = BoundaryNorm(boundaries, qualitative_cmap.N)\n",
"\n",
"# Create a ListedColormap with the desired colors\n",
"listed_cmap = ListedColormap(qualitative_cmap.colors)"
]
},
{
"cell_type": "markdown",
"id": "f3146c32",
"metadata": {},
"source": [
"## Testing"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "74d63713",
"metadata": {},
"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>A</th>\n",
" <th>B</th>\n",
" <th>C</th>\n",
" <th>D</th>\n",
" <th>E</th>\n",
" <th>F</th>\n",
" <th>G</th>\n",
" <th>H</th>\n",
" <th>I</th>\n",
" <th>J</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>One</th>\n",
" <td>23</td>\n",
" <td>181</td>\n",
" <td>129</td>\n",
" <td>385</td>\n",
" <td>410</td>\n",
" <td>123</td>\n",
" <td>144</td>\n",
" <td>28</td>\n",
" <td>386</td>\n",
" <td>14</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Two</th>\n",
" <td>282</td>\n",
" <td>74</td>\n",
" <td>109</td>\n",
" <td>413</td>\n",
" <td>318</td>\n",
" <td>29</td>\n",
" <td>169</td>\n",
" <td>12</td>\n",
" <td>51</td>\n",
" <td>328</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Three</th>\n",
" <td>52</td>\n",
" <td>389</td>\n",
" <td>223</td>\n",
" <td>149</td>\n",
" <td>191</td>\n",
" <td>134</td>\n",
" <td>170</td>\n",
" <td>105</td>\n",
" <td>250</td>\n",
" <td>288</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Four</th>\n",
" <td>296</td>\n",
" <td>399</td>\n",
" <td>147</td>\n",
" <td>237</td>\n",
" <td>78</td>\n",
" <td>358</td>\n",
" <td>43</td>\n",
" <td>272</td>\n",
" <td>235</td>\n",
" <td>409</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Five</th>\n",
" <td>80</td>\n",
" <td>214</td>\n",
" <td>321</td>\n",
" <td>388</td>\n",
" <td>146</td>\n",
" <td>224</td>\n",
" <td>324</td>\n",
" <td>53</td>\n",
" <td>276</td>\n",
" <td>144</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Six</th>\n",
" <td>119</td>\n",
" <td>180</td>\n",
" <td>330</td>\n",
" <td>418</td>\n",
" <td>341</td>\n",
" <td>147</td>\n",
" <td>332</td>\n",
" <td>48</td>\n",
" <td>87</td>\n",
" <td>108</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Seven</th>\n",
" <td>280</td>\n",
" <td>75</td>\n",
" <td>387</td>\n",
" <td>251</td>\n",
" <td>203</td>\n",
" <td>324</td>\n",
" <td>273</td>\n",
" <td>246</td>\n",
" <td>159</td>\n",
" <td>240</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Eight</th>\n",
" <td>341</td>\n",
" <td>109</td>\n",
" <td>204</td>\n",
" <td>14</td>\n",
" <td>344</td>\n",
" <td>139</td>\n",
" <td>18</td>\n",
" <td>292</td>\n",
" <td>321</td>\n",
" <td>327</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Nine</th>\n",
" <td>167</td>\n",
" <td>280</td>\n",
" <td>351</td>\n",
" <td>410</td>\n",
" <td>392</td>\n",
" <td>18</td>\n",
" <td>374</td>\n",
" <td>58</td>\n",
" <td>45</td>\n",
" <td>320</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Ten</th>\n",
" <td>120</td>\n",
" <td>107</td>\n",
" <td>16</td>\n",
" <td>113</td>\n",
" <td>433</td>\n",
" <td>35</td>\n",
" <td>128</td>\n",
" <td>50</td>\n",
" <td>39</td>\n",
" <td>160</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" A B C D E F G H I J\n",
"One 23 181 129 385 410 123 144 28 386 14\n",
"Two 282 74 109 413 318 29 169 12 51 328\n",
"Three 52 389 223 149 191 134 170 105 250 288\n",
"Four 296 399 147 237 78 358 43 272 235 409\n",
"Five 80 214 321 388 146 224 324 53 276 144\n",
"Six 119 180 330 418 341 147 332 48 87 108\n",
"Seven 280 75 387 251 203 324 273 246 159 240\n",
"Eight 341 109 204 14 344 139 18 292 321 327\n",
"Nine 167 280 351 410 392 18 374 58 45 320\n",
"Ten 120 107 16 113 433 35 128 50 39 160"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Create some example data with a sensible range based upon the expected values\n",
"data = np.random.randint(0, values_from[-1] * 1.5, (10, 10))\n",
"columns = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']\n",
"index = ['One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten']\n",
"\n",
"# Create a DataFrame\n",
"df_ex = pd.DataFrame(data, columns=columns, index=index)\n",
"df_ex"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "0fc536ca",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABkEAAAT8CAYAAAA0WSe+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAACZzAAAmcwHzbHUKAACx7UlEQVR4nOz9ebxWdbk//r82owwyqkgQoCbS0cDCMVNQRCVFTXMKOTlElvXLRG04mmVZ6bH0qGUOYZiiOWPOIyDmnKGSoqmAgiAyyCiDsH9/+PX+sGUDG9ibGxbP5+NxP856r/ta17pu9TTwaq13RWVlZWUAAAAAAAAKpl65BwAAAAAAAKgLQhAAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAoJCEIAAAAAABQSEIQAAAAAACgkIQgAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKCQhCAAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIDco9AAAAAAAAbMo++OCDjBgxIiNGjMiYMWPy+uuvZ9asWWnYsGHatGmTHj16pE+fPvnmN7+Z1q1br1HvefPm5dprr80DDzyQl19+Oe+//36aNm2aDh06pHfv3hk4cGB22223GvdbtmxZnn322Tz66KN59tlnM3bs2EybNi2LFi1K69ats8022+TLX/5y/vu//zs777zzGv6VqH0VlZWVleUeAgAAAAAANjXjxo3LWWedlYceeiiLFy9ebX3Tpk3z61//OqeddloqKipWW3/rrbfmu9/9bmbMmLHKukGDBuWSSy5Js2bNVlk3ePDg3HTTTZk6depq750khx12WK666qq0a9euRvV1QQgCAAAAAABlcNttt+Woo46qcq5+/fr53Oc+l3bt2mXp0qV59dVXM3PmzCo1J598cq655ppVBiGXXXZZTjvttCrntt5663Tt2jVLlizJ2LFjM3fu3NJ3ffr0yf3335+GDRuutGfz5s0zf/78FXp26tQpzZo1y+TJk/P6669X+b5z584ZPXp0PvvZz660b12yJwgAAAAAAJRRgwYNcvjhh2f48OGZOXNmxo0bl1GjRuWJJ57I9OnTM3z48HTo0KFUP2TIkFx55ZUr7Td69OgMHjy4tO7YsWPuu+++vPvuuxk1alSefPLJTJ8+PX/4wx/SuHHjJMmjjz6aM888s0bz7rjjjrnkkkvyn//8J1OmTMkzzzyTxx57LK+99lr+85//5LDDDivVTpw4MUcddVTK9TyGJ0EAAAAAAKAM7rrrrtxzzz352c9+lk6dOq2y9p133sluu+1WehXVFltskXfffbfaJzf23HPPPP3000mSli1b5l//+le22Wabavv+/e9/L4UWDRo0yL///e907dq12tp99903P/rRj9KvX7/V/raBAwfmhhtuKK3vuOOOfO1rX1vtdbVNCAIAAAAAABuBq6++Oqecckpp/cgjj6RPnz5Vav79739np512Kq0vuOCC/PjHP15l38MOOyx///vfkyQnnXRShgwZss6zzpo1K5/97GdLr886/vjjc/31169z3zXldVgAAAAAALAR6N+/f5X1uHHjVqgZMWJElfWxxx672r7HHXdc6Xj48OH56KOP1nLC/6d169bZa6+9SuvqZl0fhCAAAAAAALARaNOmTZX1nDlzVqiZMGFC6bhFixbp3Lnzavt27969dDxz5syMHj167YdczvLzVjfr+iAEAQAAAACAjcDEiROrrLfaaqsVambPnl063nzzzWvUt0WLFlXWY8aMWfPhqrH8vNXNuj4IQQAAAAAAYCNwxx13VFnvscceK9QsH3zMnTu3Rn0//ZTGK6+8shbTVTV58uQ888wzpXV1s64PQhAAAAAAANjAzZ49O5deemlp3b179+y4444r1HXs2LF0PGfOnLz99tur7f3yyy9XWY8fP34dJv3Y+eefn2XLlpXWy+87sj41KMtd2WQ1a9YsCxcuTP369cv2+BMAAAAA68e0adOydOnSbLbZZpk/f365x2Ed7bLLLpk6dWq5x1gv5s2blwULFtT4zzAHDx6cwYMH1+lMZ5xxRpW//ueff361dV/5yleqrG+++eacddZZq+z9t7/9rcq6pk+QrMzjjz+eq6++urQ+4ogj8qUvfWmdeq4tIQjr1cKFC7Ns2bIsW7YskydPLvc4AAAAAKwHCxcuLPcI1IKpU6ducn+mV9PfW9ebfl977bUZMmRIaX3MMcekf//+1dbusssu6dq1a15//fUkyW9/+9scffTRK90g/b777stdd91V5dy6hCDvvvtujjnmmNJTIG3bts1ll1221v3WlRCE9ap+/fof/8NfL0m7ck9DbehQ7gGA6k0p9wBAtdqXewCgOpvWH+UUXwf/OagwJvv3zWJ4L8myj/9MiOKol2L/R9spSZYlqVevXtq3r9kv/fTG4rVp9OjROfXUU0vrbbbZJlddddVK6+vVq5fzzjuv9PqpWbNmZe+9984111yTAw88sFS3ZMmSDBkyJKeffnoqKyur9FiyZMlazTp//vwcfvjhpSdWKioqMmTIkHToUL4/RRSCsF5ttdVWH6en7ZK8WO5pqA2TKldfA5SBoBk2TGPKPQBQnYqKck9AbZrkzcuFUeHPDYqhR5Ip8Vr0gmmfZFK5h6hDHfPx/0iiffv2mTSpvL/0xRdfTP/+/bNo0aIkH///0gMPPJCWLVuu8rpjjz02o0aNypVXXpkkeeedd3LQQQelffv26dq1a5YsWZKxY8eWnmDp1q1bOnfunAcffDBJVtu/OosXL84RRxyR5557rnTukksuyWGHHbbGvWqTjdEBAAAAAGAD89prr+WAAw7I7NmzkyStW7fOQw89lK5du9bo+iuuuCK//OUv06hRo9K5KVOmZNSoUXnyySdLAciee+6ZBx98MA0a/L9nJlq1arVGsy5dujTHHXdcHnroodK58847L6eddtoa9akLQhAAAAAAANiAjB8/Pvvvv3+mTZuWJGnevHnuv//+9OjRo8Y9Kioq8rOf/Sz/+c9/cvbZZ2f33XfPFltskYYNG+Yzn/lMDjzwwFx//fUZPXp0OnXqlOnTp5eu7dSpU43vs2zZspx44om54447SufOOuusnHvuuTXuUZe8DgsAAAAAADYQkyZNSp8+fUqv4mrSpEnuueee7L777mvVr1OnTjn//PNz/vnnr7Lu1VdfLR3vuuuuNe7/3e9+N9dff31pfeqpp+Z///d/13zQOuJJEAAAAAAA2AC899572X///TN+/PgkSePGjTN8+PD06tWrTu/72muvlV6PlaTGgcsPf/jDXH311aX1iSeemD/84Q+1Pt+6EIIAAAAAAECZzZw5M3379s1rr72WJGnYsGFuueWWHHDAAXV+79tuu6103K1bt3zpS19a7TVnn312Lr300tL6uOOOy5///OdUVFTUyYxrSwgCAAAAAABlNGfOnBx44IF5+eWXkyT169fPsGHDcuihh9b5vefPn58rrriitP7Wt7612mt+85vf5De/+U1pfcQRR+Svf/1r6tXb8CKHDW8iAAAAAADYRCxYsCAHH3xwnn/++SRJvXr18pe//CVHHXXUern/mWeemXfffTdJ0rlz53znO99ZZf2ll16as88+u7Q++OCDc9NNN6VBgw1zC3IhCAAAAAAAlMGiRYty2GGH5YknnkiSVFRU5Oqrr87AgQPXuff111+fRYsWrfT7+fPn53vf+16uvPLK0rk//elPadas2UqvGTJkSE4//fTS+oADDsjtt9+eRo0arfO8dWXDjGYAAAAAAKDgLr300jzyyCOldatWrXLrrbfm1ltvrdH1ffv2zRlnnFHtd4MGDcoPfvCDHHzwwdlrr72y3XbbZbPNNsv777+fp556KjfddFPpCZAk+f3vf59+/fqt9F5TpkzJt7/97VRWVpbOLVy4MIcddliNZk2SBx54oMa1tUUIAgAAAAAAZbBgwYIq61mzZuXBBx+s8fVbb731Kr//4IMPMmzYsAwbNmylNU2aNMlFF12U733ve6vstWjRoixbtqzKuccff7zGs5aL12EBAAAAAEDB9O/ff5WvtmratGmOPfbYjB07drUByMasonL5Z1egjnXs2DGTJ09O2id5sdzTUBv8KwhsoNqVewCgWu+VewCgOhUV5Z6A2lS5VbknoLZUTCv3BNSKHkmmJB06dMikSZPKPQ3r6JM/2+uQpMh/NzsmmZxi/HO7ZMmSvPTSS3nrrbfy3nvvZe7cudlyyy3z2c9+NnvvvXeaNm1a7hHrnNdhAQAAAABAATVs2DA9e/ZMz549yz1K2XgdFgAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIQhAAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAoJCEIAAAAAABQSEIQAAAAAACgkIQgAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKCQhCAAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAAqpQbkH2FAtXbo0I0eOzD333JN//OMfmTp1aqZNm5amTZumXbt22W677fLVr341hx56aDp27FjucQEAAAAAgE8RglTj/vvvz5lnnplXXnllhe8WLVqUWbNmZdy4cbn33ntz2mmn5dRTT83Pf/7ztGnTpgzTAgAAAAAA1fE6rOVUVlbmtNNOy1e/+tUqAUiDBg3StWvX9OrVKz179syWW25Z+u6jjz7KZZddlp122ikvv/xyOcYGAAAAAACqIQT5/1RWVmbgwIG57LLLSufatm2byy+/PFOmTMlrr72WkSNH5vnnn897772XJ598MkcccUSpdsqUKdlnn33y3HPPlWN8AAAAAADgU4Qg/59LL700w4YNK6132223vPrqq/n+97+fLbbYokptRUVF9txzz9x+++3561//mvr16ydJPvjggxx99NGZM2fOep0dAAAAAABYkRAkybhx4/KTn/yktO7WrVsefPDBKq+9WpmBAwfmT3/6U2k9YcKEnHbaaXUyJwAAAAAAUHNCkCQXXXRRFi1alOTjpzyuueaatGrVqsbXDxo0KAcccEBpff3112fixInV1g4dOjQVFRWpqKhI7969S+f//e9/5/vf/34+//nPp3nz5mnRokW6d++eH/3oR5k6deoa/6aJEyfmN7/5TfbZZ5907NgxjRs3Ttu2bbPzzjuvdNN3AAAAAAAokk0+BHn//fervAarX79++cpXvrLGfX7zm9+UjpcuXVplb5HVufDCC7Pzzjvnj3/8Y8aNG5f58+dn7ty5efnll3PRRRela9eueeyxx2rU66OPPsr//M//ZIcddsjZZ5+d0aNHZ/LkyVm8eHFmzpyZF198Mb///e/TvXv3DB48OEuXLl3j3woAAAAAABuDTT4EefDBB0tPgSTJSSedtFZ9evbsmS984Qul9d///vcaXferX/0qP/nJT/LRRx9l8803z+67755evXqlXbt2pZq5c+fm0EMPXenTJZ9YuHBhDj/88Pz2t78t/aZ69eplp512yr777ptdd901jRs3TvJxUHPJJZfk2GOPTWVl5Zr+XAAAAAAA2OBt8iHIE088UTquqKhI375917rX8te+8cYbmTZt2irrX3755fz85z9Pq1at8pe//CUzZszI008/nZEjR2bKlCkZOnRoGjVqlCSZP39+zjnnnFX2++EPf5h77703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33775Xe/+11mzJixVr8PAAAAAAA2JkKQWtSyZcvsvPPOSZLKysqMGjVqpbUjR45c5Xp548aNy9SpU5MkzZs3zy677FJt3YcffpgTTzwxu+yySy655JK89NJLmTFjRhYvXpzJkydnxIgROeuss7L99ttn6NCha/LTAAAAAABgoyMEqWW9e/cuHa8q2Pj0d2PGjMns2bNXW7vXXnulQYMV97NfsGBBDjzwwAwdOjSVlZVJkvr166dHjx7p3bt3unTpUqqdNWtWTjzxxPzud79b7e8BAAAAAICNlRCkltUkBJkwYUImTpyYJGnSpEmSZOnSpRk9enS19cv3Wb7/8s4666wq1w8cODCTJ0/OmDFjMmLEiIwfPz5PPPFEunXrVqr50Y9+lMcff7wGvwoAAAAAADY+QpBats8++6RevY//sr7yyivV7guyfKjxne98p9rzy1v+tVrVhSAvvvhi/vSnP5XWp5xySv7617+mXbt2Ver22muvPP7449lmm22SfPzKruXvv7YuvvjidOzYsUafKVOmrPP9AAAAAACgJoQgtawm+4Isf+4HP/hBWrdunaT6EOS1114r7QfSrFmzavcDueKKK0qvwOrQoUMuvvjilc635ZZb5o9//GNp/eqrr+bRRx9d/Q9bhTlz5mTy5Mk1+ixbtmyd7gUAAAAAADUlBKkDvXr1Kh1XF2x8cm6bbbZJly5dss8++ySpfl+QmuwHMnz48NLxoEGD0rRp01XO169fv+ywww7VXr82WrRokQ4dOtTo88lTMgAAAAAAUNf8iXQdWNW+IBMnTsyECROq1H3yf6vbF2R1+4FMmDAh06ZNK6379etXoxkPOeSQ0vEzzzxTo2tWZvDgwZk0aVKNPu3bt1+newEAAAAAQE0JQerAqvYFqS7UWFVosrr9QN54440q6y984Qs1mnH5uk/3AAAAAACAIhCC1IFWrVqlR48eSVbcF2T5kGPfffdNknTv3r3afUFee+210kbizZo1y6677rrCvT744IPScZMmTdKkSZMazbjFFluUjmfPnl3aUwQAAAAAAIpCCFJHVvZ0xyeByLbbbpvPfvazSZJ69epVuy/I8uHJl7/85Wr3A1m0aFHpuFGjRjWeb/naZcuWZcmSJTW+FgAAAAAANgZCkDpS3ebob7/9dsaPH59kxVdbVbcvyOr2A0mSli1blo7nzZtX4/nmzp1bOm7SpMkaBSgAAAAAALAxEILUker2BVlVqFHdkyOr2w8kSbbccsvS8dKlS/P222/XaL4333yz2h4AAAAAAFAUQpA60rp163Tv3j3J/9sXZFUhyKf3BXn99dfz7rvvJln5fiCfXLf8a7KeffbZGs33zDPPlI6/9KUv1egaAAAAAADYmAhB6tCnn+74JATZbrvtSvuBfOLT+4Lcddddpe++/OUvp2HDhtXeo0mTJunZs2dpfdNNN612rlmzZuXee+8trffee+/VXgMAAAAAABsbIUgdWj4Eue2221a6H8in65cuXZrf//73pfPL7y9SnZNOOql0fOedd672aZBzzz03CxcuTPLxBunHH3/8KusBAAAAAGBjJASpQ3vvvXcqKiqSJO+9917p/OpCkJrWf+L4449P586dk3z86q0jjzwyr7/+erW1V1xxRf7whz+U1t/+9rez1VZbrbI/AAAAAABsjBqsvoS11aZNm3Tv3j0vvvhilfMrCzU+2Rdk1qxZpXNNmzbNbrvttsr7NG3aNNdee20OOOCALF26NJMmTcrOO++cb33rW+nTp09atWqViRMn5oYbbsjDDz9cum777bfPBRdcsPY/EAAAAAAANmCeBKljnw48tttuu3Ts2LHa2uX3BfnEqvYDWd5+++2Xm2++OY0aNUqSfPjhh7n88stz+OGHp3fv3vnmN79ZJQDp1q1bHnvssTRr1mwNfxEAAAAAAGwchCB17NMhyOpebbWm9cs78sgjM2bMmBxyyCGpX79+tTUtW7bM2Wefneeff36lYQwAAAAAABSB12GtoS5duqSysrLG9Ycffvga1f/whz/MD3/4w7WY7GOf//znc/fdd2fGjBkZOXJkJk+enPnz56dt27bp2rVr9tprrxo9WQIAAAAAABs7IUhBtW3bNkceeWS5xwAAAAAAgLLxOiwAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAoJCEIAAAAAABQSEIQAAAAAACgkIQgAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKCQhCAAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIQhAAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUUoNyDwAAAAAAAJuyDz74ICNGjMiIESMyZsyYvP7665k1a1YaNmyYNm3apEePHunTp0+++c1vpnXr1mvUe968ebn22mvzwAMP5OWXX87777+fpk2bpkOHDundu3cGDhyY3XbbbY16Llq0KC+99FKee+65PP/883nuuefy6quvZunSpUmSXr16ZeTIkWvUs64IQQAAAAAAoAzGjRuXs846Kw899FAWL168wveLFy/O/Pnz88477+See+7J2WefnV//+tc57bTTUlFRsdr+t956a7773e9mxowZVc4vWrQos2bNytixY/OHP/whgwYNyiWXXJJmzZqttudJJ52UG264IUuWLKn5Dy0jIQgAAAAAAJTB2LFjc88991Q5V79+/Xzuc59Lu3btsnTp0rz66quZOXNmkmTBggU5/fTTM3bs2FxzzTWrDEIuu+yynHbaaVXObb311unatWuWLFmSsWPHZu7cuUmSa665Jm+99Vbuv//+NGzYcJUzv/XWWxtNAJLYEwQAAAAAAMqqQYMGOfzwwzN8+PDMnDkz48aNy6hRo/LEE09k+vTpGT58eDp06FCqHzJkSK688sqV9hs9enQGDx5cWnfs2DH33Xdf3n333YwaNSpPPvlkpk+fnj/84Q9p3LhxkuTRRx/NmWeeWeOZGzdunF122SXf/e53M2TIkBx00EFr8cvrnhAEAAAAAADKoGHDhvnWt76VN998M3feeWcOO+ywtGjRokpNRUVFDjvssDz11FPZeuutS+fPPffclT6R8aMf/ai0P0fLli3z+OOPp1+/flWeHGnUqFG+973v5ZZbbimdu+KKK/L666+vcuaf/OQnef755zN37tw899xzueKKK3LSSSelXbt2a/z71wchCAAAAAAAlMFhhx2Wa665Jp06dVpt7Wc/+9mcd955pfX06dPz+OOPr1D373//O08//XRp/dOf/jTbbLPNSvseeuihOfTQQ5MkH330US688MJVznHQQQelZ8+eq31t1oZCCAIAAAAAABuB/v37V1mPGzduhZoRI0ZUWR977LGr7XvccceVjocPH56PPvpoLSfc8AhBAAAAAABgI9CmTZsq6zlz5qxQM2HChNJxixYt0rlz59X27d69e+l45syZGT169NoPuYERggAAAAAAwEZg4sSJVdZbbbXVCjWzZ88uHW+++eY16vvpfUjGjBmz5sNtoIQgAAAAAACwEbjjjjuqrPfYY48VapYPPubOnVujvp9+ouSVV15Zi+k2TA3KPQAAAAAAAGxopkyZko4dO9aodvDgwRk8eHCdzjN79uxceumlpXX37t2z4447rlC3/Mxz5szJ22+/vdqN119++eUq6/Hjx6/jtBsOIQhl8WGT5M5jyj0FteFrKz5xx8bq8nIPQK16r9wDANWprCz3BEB17lh9CRuRr91c7gmoNf47SjH8LMkH5R6CWtcqyfnlHqIOnZPkg2TZsmWZPHlyjS6pbm+O2nbGGWdk6tSppfX551f/N+ErX/lKlfXNN9+cs846a5W9//a3v1VZ1/QJko2BEAQAAAAAAD6lXr16ad++fY1qP72nRm279tprM2TIkNL6mGOOSf/+/aut3WWXXdK1a9e8/vrrSZLf/va3Ofroo1e6Qfp9992Xu+66q8o5IQgAAAAAABRY+/btM2nSpHKPkdGjR+fUU08trbfZZptcddVVK62vV69ezjvvvBx33HFJklmzZmXvvffONddckwMPPLBUt2TJkgwZMiSnn356Kj/12PqSJUtq+VeUjxAEAAAAAAA2QC+++GL69++fRYsWJUm22mqrPPDAA2nZsuUqrzv22GMzatSoXHnllUmSd955JwcddFDat2+frl27ZsmSJRk7dmzpNV7dunVL586d8+CDDybJavtvTOqVewAAAAAAAKCq1157LQcccEBmz56dJGndunUeeuihdO3atUbXX3HFFfnlL3+ZRo0alc5NmTIlo0aNypNPPlkKQPbcc888+OCDadDg/z0z0apVq9r7IWUmBAEAAAAAgA3I+PHjs//++2fatGlJkubNm+f+++9Pjx49atyjoqIiP/vZz/Kf//wnZ599dnbfffdsscUWadiwYT7zmc/kwAMPzPXXX5/Ro0enU6dOmT59eunaTp061fpvKhevwwIAAAAAgA3EpEmT0qdPn9J+JE2aNMk999yT3Xfffa36derUKeeff37OP//8Vda9+uqrpeNdd911re61IfIkCAAAAAAAbADee++97L///hk/fnySpHHjxhk+fHh69epVp/d97bXXSq/HSrLWgcuGSAgCAAAAAABlNnPmzPTt2zevvfZakqRhw4a55ZZbcsABB9T5vW+77bbScbdu3fKlL32pzu+5vghBAAAAAACgjObMmZMDDzwwL7/8cpKkfv36GTZsWA499NA6v/f8+fNzxRVXlNbf+ta36vye65MQBAAAAAAAymTBggU5+OCD8/zzzydJ6tWrl7/85S856qij1sv9zzzzzLz77rtJks6dO+c73/nOernv+iIEAQAAAACAMli0aFEOO+ywPPHEE0mSioqKXH311Rk4cOA6977++uuzaNGilX4/f/78fO9738uVV15ZOvenP/0pzZo1W+d7b0galHsAAAAAAADYFF166aV55JFHSutWrVrl1ltvza233lqj6/v27Zszzjij2u8GDRqUH/zgBzn44IOz1157Zbvttstmm22W999/P0899VRuuumm0hMgSfL73/8+/fr1W+09H3/88Wr3KVmyZEmVms0222yFmmuuuaZWAp41IQQBAAAAAIAyWLBgQZX1rFmz8uCDD9b4+q233nqV33/wwQcZNmxYhg0bttKaJk2a5KKLLsr3vve9Gt1z2bJlq3zCJEkqKyurrVm6dGmN7lGbvA4LAAAAAAAKpn///qt8tVXTpk1z7LHHZuzYsTUOQDZGngQBAAAAAIAy+MUvfpFf/OIXddL71ltvzZIlS/LSSy/lrbfeynvvvZe5c+dmyy23zGc/+9nsvffeadq06Rr37d27dyorK+tg4rohBAEAAAAAgAJq2LBhevbsmZ49e5Z7lLLxOiwAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAoJCEIAAAAAABQSEIQAAAAAACgkIQgAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKCQhCAAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIQhAAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFtEmEIL17905FRUUqKioydOjQco8DAAAAAACsBxtECDJhwoRSSFGbn5EjR5b7pwEAAAAAAGWyQYQgAAAAAAAAta1BuQdIkiZNmuTAAw9cZc2HH36Yxx9/vLTeaaed0qFDh1Ve06ZNm1qZDwAAAAAA2PhsECFIu3bt8sADD6yyZsKECdlmm21K6zPOOCMnnHBCHU8GAAAAAABsrLwOCwAAAAAAKCQhCAAAAAAAUEibbAiybNmy3HbbbTn44IPTqVOnNG7cOO3atUvfvn1z7bXXZunSpavt0bt371RUVKSioiJDhw5NkixevDjDhg3LIYcckm233TZNmjSp8v2nzZs3L1dddVUOPfTQbLvttmnWrFk233zzbL/99jnxxBPz0EMPrdXve+SRR3LqqafmC1/4QrbYYos0btw4HTp0SN++fXPZZZdl/vz5a9UXAAAAAAA2FhvEniDr27Rp03LcccflscceW+H8I488kkceeSTXXntt7r333rRs2bLGff/zn//kmGOOyb/+9a8a1d94440544wzMnXq1BW+e+ONN/LGG29k6NChOeCAAzJs2LBsscUWq+355ptvZtCgQRkxYsQK37377rt5991388gjj+SCCy7IX/7yl9VuSA8AAAAAABurTe5JkPnz56dv376lAKRLly7p1atXdttttzRq1KhU949//CMDBgyocd8ZM2akT58+pQCkU6dO6dWrV3bZZZc0b958hfpf/epXGTBgQJUApEuXLtlnn32y1157pU2bNqXzDz30UPbee+9Mnz59lTO88MIL+fKXv1wlAGnRokV233337Lvvvtl+++1L56dMmZL+/fvnzjvvrPFvBAAAAACAjckmF4L8/Oc/z0svvZS99torL7zwQsaPH5+RI0fmmWeeydSpU3P00UeXau+99948+uijNep73nnn5Z133knPnj3z9NNPZ+LEiRk5cmSee+65vPfeeznooINKtTfffHPOPffc0nrAgAF5/fXXM378+IwaNSpPPPFE3n///dxyyy2lpz/GjRuXQYMGrfT+M2bMyKGHHppp06YlSXbYYYf8/e9/z8yZM/P000/nsccey+uvv55XX301+++/f5JkyZIlOfHEEzNx4sSa/wUEAAAAAICNxCYXgsyYMSO9evXKo48+mi9+8YtVvmvdunVuvPHG7LzzzqVz1113XY36zp07N1/84hczcuTI7L777lW+a9q0abbeeuskyaxZs3LKKaeUvrvgggtyww03VHlKI0nq1auXo446KqNHj87mm2+eJBk+fHhGjx5d7f0HDx6cyZMnJ0l23XXXPPfcc+nfv3/q169fpa5bt265//77069fvyTJ7Nmz88tf/rJGv3FlLr744nTs2LFGnylTpqzTvQAAAAAAoKY2uRCkfv36+ctf/pLGjRuv9Psf/OAHpfU//vGPGve++uqrq3311adrZs+enSTZb7/98uMf/3iV9d26dcs555xTWl9xxRUr1EyaNCk33nhjkqRRo0a56aabSsFJdRo0aJCrr746DRs2TPLx3iSfzLQ25syZk8mTJ9fos2zZsrW+DwAAAAAArIlNLgTp27dvttlmm1XWfOUrXykdjx8/PosXL15t3y9+8YvZZZddVlt3/fXXl45/+MMfrrY+SZW9Sarb8Pxvf/tbPvrooyTJIYccku222261PTt27JhevXolSRYuXJgnn3yyRrNUp0WLFunQoUONPvXqbXL/yAEAAAAAUCab3J9I77nnnqut6dChQ+m4srKyRk9JLB+crMzMmTPzyiuvlNb77rvvaq/5ZJ5WrVolSd57773Sa68+sfwrsvbbb78a9UySnXbaqXT8wgsv1Pi6Txs8eHAmTZpUo0/79u3X+j4AAAAAALAmGpR7gPXtk705VqVp06ZV1gsWLFjtNTV5+uLf//53Kisrk3z8Sqqvf/3rq73mEwsXLiwdT58+vUpQM3bs2NLxkCFDcvfdd9eo5xtvvFGlJwAAAAAAFMkmF4I0atRoja/5JLhYlVXtwfGJGTNmlI4/+uijPPjgg2s8S5IVnkxZvu+//vWvWukJAAAAAAAbu03udVh1pSZ7XcyfP79W7vXpzcVro68NywEAAAAAKJpN7kmQcmrZsmXpuFmzZpk3b16t9f3kaZBbb711jV6zBQAAAAAAReVJkPWoXbt2peP58+fX2pMhy/edNm1arfQEAAAAAICNnRBkPerRo0eaNGlSWj/zzDO10nePPfYoHT/99NO10hMAAAAAADZ2QpD1qFGjRundu3dpfd1119VK3wMPPLB0fNddd9nkHAAAAAAAIgRZ704//fTS8bBhwzJy5Mh17nnEEUekc+fOSZI5c+bkjDPOWOeeAAAAAACwsROCrGd9+/ZNv379kiRLly7N4YcfnjvuuGO1140fPz5nnnlmfv3rX6/wXYMGDXLhhReW1kOGDMl3vvOdLFiwYJU958+fn6FDh6ZPnz5r+CsAAAAAAGDD16DcA2yKbrjhhuy222558803M3v27Bx55JHZdddd87WvfS3du3dPy5Yts2DBgkybNi1jxozJqFGj8vzzzydJfvzjH1fb85hjjskzzzyTSy65JEly1VVX5fbbb883vvGNfPnLXy5tnj5r1qyMGzcuzzzzTB5++OEsWLCgysbqAAAAAABQFEKQMmjTpk2efPLJHHnkkXniiSeSJM8991yee+65dep78cUXp23btvnZz36WysrKTJ8+PZdddlkuu+yy2hgbAAAAAAA2Kl6HVSZbbbVVRo4cmb/+9a/ZaaedVlnbuHHj9OnTJ9dcc03OPvvsVdaeffbZGTNmTL7+9a+ncePGq6zt1q1bfvzjH9fKviQAAAAAALCh2WieBOnSpUsqKyvX6tq1+UP+mtxrXcOD+vXrZ+DAgRk4cGAmTZqUp556KlOnTs3s2bPTpEmTbLnllunatWt69OiRJk2a1Lhv9+7dc+utt+bDDz/MP/7xj4wfPz4zZsxIkrRs2TLbbrttvvCFL+Qzn/nMOs0PAAAAAAAbso0mBCm6jh075qijjqrVnk2aNMn+++9fqz0BAAAAAGBj4XVYAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKCQhCAAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIQhAAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAoJCEIAAAAAABQSEIQAAAAAACgkIQgAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKCQhCAAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIQhAAAAAAAKCQhCAAAAAAAEAhNSj3AGyamkxJvrZVuacAqji63ANQq24p9wDUljuPKfcE1Cb/+adY7pxW7gmoLV+7udwTANX6/5V7AACKwJMgAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKCQhCAAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIQhAAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAoJCEIAAAAAABQSEIQAAAAAACgkIQgAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKCQhCAAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIQhAAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAopE0qBDnhhBNSUVGxxp9WrVqVe3QAAAAAAGANbVIhCAAAAAAAsOloUO4ByqV169bZbbfdalTbvHnzOp4GAAAAAACobZtsCNK9e/c88MAD5R4DAAAAAACoI16HBQAAAAAAFJIQBAAAAAAAKCQhyDp64YUXMnjw4PTo0SNbbLFFGjdunI4dO2a//fbL7373u8yYMaNGfSoqKkqfCRMmrLZ+5MiRpfouXbqstK5Lly6lupEjRyZJ5s6dm6uuuir7779/OnfunMaNG1f5HgAAAAAAimCT3RNkXX344Yc59dRTc91116WysrLKd5MnT87kyZMzYsSI/OY3v8nFF1+cE044oTyDfspzzz2XY445JuPHjy/3KAAAAAAAUKeEIGthwYIFOeiggzJ69OjSufr162ennXZK69atM2HChNLTHLNmzcqJJ56Y6dOn58wzzyzTxB974403csYZZ2TOnDlJks997nPp2LFjPvjgg4wbN66sswEAAAAAQG3zOqy1cNZZZ1UJQAYOHJjJkydnzJgxGTFiRMaPH58nnngi3bp1K9X86Ec/yuOPP16OcUsGDx6cOXPmpG/fvnn11Vfzn//8JyNGjMi//vWvvPvuu+nRo0dZ5wMAAAAAgNrkSZA19OKLL+ZPf/pTaX3KKafkyiuvXKFur732yuOPP57dd98948ePT2VlZb7zne/klVdeWZ/jVjF37tz069cvf//739OgQdW/9a1bt17rvhdffHEuvvjiGtVOmTJlre8DAAAAAABrYpMNQUaNGpWKiorV1nXu3LnKRuVXXHFFaQ+QDh06rPIP/7fccsv88Y9/zFe/+tUkyauvvppHH300ffr0Wbfh11KjRo1yzTXXrBCArKs5c+Zk8uTJtdoTAAAAAADW1SYbgqyt4cOHl44HDRqUpk2brrK+X79+2WGHHfLaa6+Vri9XCHLwwQenQ4cOtd63RYsWNe47ZcqULFu2rNZnAAAAAACAT9tkQ5DWrVtnt912W21du3btSscTJkzItGnTSut+/frV6F6HHHJIKQR55pln1nDS2vOVr3ylTvoOHjw4gwcPrlFtx44dPTUCAAAAAMB6scmGIN27d88DDzywRte88cYbVdZf+MIXanTd8nWf7rE+bbfddmW7NwAAAAAArG/1yj3AxuSDDz4oHTdp0iRNmjSp0XVbbLFF6Xj27NmlPUXWt80337ws9wUAAAAAgHIQgqyBRYsWlY4bNWpU4+uWr122bFmWLFlSq3PVVL16/nYDAAAAALDp8Kfia6Bly5al43nz5tX4urlz55aOmzRpskYBysosXbp0nXsAAAAAAECRCUHWwJZbblk6Xrp0ad5+++0aXffmm29W22N5DRs2LB3X5EmR5V/NBQAAAAAArEgIsga6d++eBg3+317yzz77bI2ue+aZZ0rHX/rSl6qtWX6/jlmzZq2259ixY2t0bwAAAAAA2FQJQdZAkyZN0rNnz9L6pptuWu01s2bNyr333lta77333tXWderUqXT80ksvrbbvXXfdtdoaAAAAAADYlAlB1tBJJ51UOr7zzjtX+zTIueeem4ULFyb5eIP0448/vtq6L37xi6XjW2+9dZU9b7/99vzrX/+q6cgAAAAAALBJEoKsoeOPPz6dO3dOklRWVubII4/M66+/Xm3tFVdckT/84Q+l9be//e1stdVW1dZ+7WtfKx0/9NBDueWWW6qtGz16dE4++eS1HR8AAAAAADYZDVZfwvKaNm2aa6+9NgcccECWLl2aSZMmZeedd863vvWt9OnTJ61atcrEiRNzww035OGHHy5dt/322+eCCy5Yad9+/frlv/7rv/LKK68kSb7xjW/k4YcfzqGHHpqWLVtm8uTJufvuu3PzzTdn2bJlOf7443PDDTfU+e8FAAAAAICNlRBkLey33365+eab841vfCOLFy/Ohx9+mMsvvzyXX355tfXdunXLww8/nGbNmq20Z4MGDTJ06NDst99+mTdvXpYuXZo///nP+fOf/7xC7ZlnnpmDDz5YCAIAAAAAAKvgdVhr6cgjj8yYMWNyyCGHpH79+tXWtGzZMmeffXaef/75dOzYcbU9d91114wcOTJf+tKXqv2+Y8eO+etf/5qLLrponWYHAAAAAIBNwSb1JMjQoUMzdOjQWuv3+c9/PnfffXdmzJiRkSNHZvLkyZk/f37atm2brl27Zq+99krDhg3XqGfPnj3zz3/+M2PGjMmzzz6bGTNmpE2bNunatWv22WefUuDSu3fvVFZWrrbfhAkT1uanAQAAAADARm+TCkHqStu2bXPkkUfWas+dd945O++8c632BAAAAACATYnXYQEAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIQhAAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAoJCEIAAAAAABQSEIQAAAAAACgkIQgAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKCQhCAAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIQhAAAAAAACijDz74IHfeeWd+8IMfZJ999snWW2+dxo0bp3nz5unUqVP69++f//u//8usWbPWqv/LL7+cwYMHp3v37mnTpk2aN2+eHXbYIQMGDMgDDzyw1nPXVd/a1KDcAwAAAAAAwKZo3LhxOeuss/LQQw9l8eLFK3y/ePHizJ8/P++8807uueeenH322fn1r3+d0047LRUVFavt/9FHH+Xcc8/NhRdemGXLllX57vXXX8/rr7+eG2+8MYccckiuvfbabLnlljWau6761gVPggAAAAAAQBmMHTs299xzT5UApH79+tlhhx2yzz77ZK+99kqbNm1K3y1YsCCnn356Bg0alMrKytX2P+WUU/Lb3/62FFQ0bNgwPXr0yF577ZW2bduW6u6555707ds38+fPr9HcddW3LghBAAAAAACgjBo0aJDDDz88w4cPz8yZMzNu3LiMGjUqTzzxRKZPn57hw4enQ4cOpfohQ4bkyiuvXGXPq6++Otdee21pfeihh2b8+PEZM2ZMnnjiiUyZMiWXX355GjT4+IVRL774Yr797W+vdta66ltXhCAAAAAAAFAGDRs2zLe+9a28+eabufPOO3PYYYelRYsWVWoqKipy2GGH5amnnsrWW29dOn/uuedmyZIl1fZdsGBBfv7zn5fWvXv3zh133FElSGnYsGG+//3vVwlTbrrpprzwwgsrnbeu+tYlIQgAAAAAAJTBYYcdlmuuuSadOnVabe1nP/vZnHfeeaX19OnT8/jjj1dbe91112Xq1KlJPg5R/vSnP6V+/frV1p588snZfffdkySVlZW58MILVzpDXfWtS0IQAAAAAADYCPTv37/Kety4cdXW3X777aXjXr16pVu3bqvse8opp5SO77vvvixatGi99q1LQhAAAAAAANgILL9JepLMmTNnhZp58+ZVeULkoIMOWm3ffv36Vbl+1KhR661vXROCAAAAAADARmDixIlV1ltttdUKNa+88kqVvUL23HPP1fbdeuut06VLl9L6xRdfXG9965oQBAAAAAAANgJ33HFHlfUee+yxQs2rr75aZb3ddtvVqPfydZ/uUZd965oQBAAAAAAANnCzZ8/OpZdeWlp37949O+644wp1yz8t0qBBg7Rv375G/ZffnH3ChAnrrW9da7De7wgAAAAAABu4KVOmpGPHjjWqHTx4cAYPHlyn85xxxhmZOnVqaX3++edXW7f8PiGbb7556tWr2bMQLVq0KB3PnTt3vfWta0IQyuLD9smd6//1b9SBr91c7gmoNe3KPQBQna8dXe4JqFWXl3sAatPXVnz9MhupO6eVewJqk/+OUiDvlXsAasXOSaaUewhqXZMkR5V7iDr06yQfJMuWLcvkyZNrdEl1G5TXpmuvvTZDhgwprY855pj079+/2tr58+eXjjfbbLMa36NJkybV9qjrvnVNCAIAAAAAAJ9Sr169Gr/yafmnHWrb6NGjc+qpp5bW22yzTa666qqV1i+/eXmDBjWPAJavXbx48XrrW9eEIAAAAAAA8Cnt27fPpEmTyjrDiy++mP79+2fRokVJkq222ioPPPBAWrZsudJrmjZtWjpeuHBhje+1fG2zZs3WW9+6ZmN0AAAAAADYwLz22ms54IADMnv27CRJ69at89BDD6Vr166rvK558+al4w8//LDG91uwYEG1Peq6b10TggAAAAAAwAZk/Pjx2X///TNt2seblzVv3jz3339/evTosdprt9hii9LxvHnzMm/evBrdc/lN19u2bbve+tY1IQgAAAAAAGwgJk2alD59+pRexdWkSZPcc8892X333Wt0/Q477FBl/fbbb9founfeead03K1bt/XWt64JQQAAAAAAYAPw3nvvZf/998/48eOTJI0bN87w4cPTq1evGvf4/Oc/X2U9ZsyY1V6zZMmSjB07dqU96rJvXROCAAAAAABAmc2cOTN9+/bNa6+9liRp2LBhbrnllhxwwAFr1GfbbbdNx44dS+snnnhitdf885//rLLPxz777LPe+tY1IQgAAAAAAJTRnDlzcuCBB+bll19OktSvXz/Dhg3LoYceulb9lr/u1ltvzeLFi1dZP2zYsNLxjjvumO2222699q1LQhAAAAAAACiTBQsW5OCDD87zzz+fJKlXr17+8pe/5KijjlrrnieccELpePr06bnqqqtWWjtp0qRcd9111V67vvrWJSEIAAAAAACUwaJFi3LYYYeVXi1VUVGRq6++OgMHDlynvrvuumuVpzb+53/+J//4xz9WqJszZ06+8Y1vZO7cuUmS9u3b53vf+95671uXGpTlrgAAAAAAsIm79NJL88gjj5TWrVq1yq233ppbb721Rtf37ds3Z5xxxkp7P/XUU3n//fczb9689OnTJyeffHIOOOCANG/ePC+99FIuv/zy0ibs9erVy1VXXZUmTZqsdua66FtXhCAAAAAAAFAGCxYsqLKeNWtWHnzwwRpfv/XWW6/0uy5dumT48OHp379/Zs6cmUWLFuWKK67IFVdcsUJt/fr1c+mll6Z///6rvWdd9a0rXocFAAAAAAAF9OUvfzkvvfRSjjzyyDRoUP0zEbvttltGjx69Rq+rqqu+dcGTIAAAAAAAUAa/+MUv8otf/KJO79GhQ4fcdtttef/99/P4449n0qRJWbx4cT7zmc9k1113TdeuXTeovrVNCAIAAAAAAAW35ZZb5sgjj9xo+tYWr8MCAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAoJCEIAAAAAABQSEIQAAAAAACgkIQgAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKCQhCAAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIQhAAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAoJCEIAAAAAABQSEIQAAAAAACgkIQgtWjkyJGpqKhIRUVFunTpUu5xAAAAAABgkyYEWc4JJ5xQCjHW5NOqVatyjw4AAAAAAHyKEAQAAAAAACikBuUeYEPVunXr7LbbbjWqbd68eR1PAwAAAAAArCkhyEp07949DzzwwBpd07t371RWVtbRRAAAAAAAwJrwOiwAAAAAAKCQhCAAAAAAAEAhCUFq0ciRI1NRUZGKiop06dJlhe+PPvro0vcDBgxYo9477rhj6drf/OY3q6ydN29errrqqhx66KHZdttt06xZs2y++ebZfvvtc+KJJ+ahhx5ao3sDAAAAAMDGSAiyHi0ffNx1112ZP39+ja4bM2ZMXnnllSRZbYBy4403Zvvtt893vvOd3H333Rk/fnwWLFiQefPm5Y033sjQoUNz4IEH5sADD8z06dPX7QcBAAAAAMAGTAiyHvXr1y+tW7dOksyfPz933XVXja4bNmxY6XivvfZK586dq6371a9+lQEDBmTq1Kmlc126dMk+++yTvfbaK23atCmdf+ihh7L33nsLQgAAAAAAKCwhyHrUqFGjHHXUUaX1jTfeuNprKisr87e//a20XtlTIDfffHPOPffcKnWvv/56xo8fn1GjRuWJJ57I+++/n1tuuSVbbLFFkmTcuHEZNGjQ2v4cAAAAAADYoAlB1rPlQ4yHHnooM2bMWGX9qFGjMmnSpCRJw4YNq4Qon5g1a1ZOOeWU0vqCCy7IDTfckO23375KXb169XLUUUdl9OjR2XzzzZMkw4cPz+jRo9f69yTJxRdfnI4dO9boM2XKlHW6FwAAAAAA1JQQZCVGjRpV2oh8VZ/qNkBflb333judOnVKkixZsiS33HLLKuuXf1rkoIMOStu2bVeoufrqqzN79uwkyX777Zcf//jHq+zZrVu3nHPOOaX1FVdcUeP5qzNnzpxMnjy5Rp9ly5at070AAAAAAKCmhCDrWUVFRb7xjW+U1svv9/Fpixcvzm233VZaH3/88dXWXX/99aXjH/7whzWaY/knUkaMGFGja1amRYsW6dChQ40+9er5Rw4AAAAAgPWjQbkH2FC1bt06u+2222rr2rVrt8a9BwwYkAsuuCBJ8uSTT2bChAnVPlFy3333ZdasWUmSzTffPP3791+hZubMmXnllVdK63333bdGM3To0CGtWrXKBx98kPfeey+TJ09Ohw4d1vi3JMngwYMzePDgGtV27NgxkydPXqv7AAAAAADAmhCCrET37t3zwAMP1EnvnXbaKd27d89LL72UysrK3HTTTfnpT3+6Qt3yr8I64ogj0qRJkxVq/v3vf6eysjJJ0qBBg3z961+v8RwLFy4sHU+fPn2tQxAAAAAAANgQCUHKZMCAAXnppZeSfBx2fDoEmTt3bu6+++4q9dVZfmP1jz76KA8++OBazfPJniIAAAAAAFAUNmgok2984xupqKhIkowdO7YUiHzijjvuKD2p0b59++y3337V9pk/f36tzGPDcgAAAAAAikYIUiYdO3ZMr169SutPb5C+/PrYY49N/fr1q+3TsmXL0nGzZs1SWVm5Vp/evXvX7g8EAAAAAIAyE4KU0fKvuPrb3/5W2tvjvffey2OPPVZt3actvzH7/Pnza+3JEAAAAAAA2NgJQcro61//eho3bpwkefvttzN69OgkHwciS5cuTZLssMMO6dmz50p79OjRo8qG6c8880wdTgwAAAAAABsPIUgZtWrVKl/96ldL609egbX8q7BW9RRIkjRq1KjKq6yuu+662h0SAAAAAAA2UkKQMjv++ONLx7fddlteeeWVPPfcc6VzqwtBkuT0008vHQ8bNiwjR46s1RkBAAAAAGBjJAQps4MPPri0ufnMmTNz0kknlb7bc889s+222662R9++fdOvX78kydKlS3P44YfnjjvuWO1148ePz5lnnplf//rXazk9AAAAAABsuBqUe4BNXePGjfP1r389Q4YMSVJ1T4+aPAXyiRtuuCG77bZb3nzzzcyePTtHHnlkdt1113zta19L9+7d07JlyyxYsCDTpk3LmDFjMmrUqDz//PNJkh//+Me1+6MAAAAAAGADIATZAAwYMKAUgnyiQYMGOfroo2vco02bNnnyySdz5JFH5oknnkiSPPfcc1VerQUAAAAAAJsSr8PaAPTq1SsdO3ascu6AAw7IlltuuUZ9ttpqq4wcOTJ//etfs9NOO62ytnHjxunTp0+uueaanH322Ws8MwAAAAAAbOg8CbKcoUOHZujQoWt9fe/evVNZWbnG19WrVy/vvPPOWt93efXr18/AgQMzcODATJo0KU899VSmTp2a2bNnp0mTJtlyyy3TtWvX9OjRI02aNKmVewIAAAAAwIZICFJgHTt2zFFHHVXuMQAAAAAAoCy8DgsAAAAAACgkIQgAAAAAAFBIQhAAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAoJCEIAAAAAABQSEIQAAAAAACgkIQgAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKCQhCAAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIQhAAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAoJCEIAAAAAABQSEIQAAAAAACgkIQgAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKKQG5R4A2MgdXe4BqDX/v3IPAFSrXbkHoFa9V+4BqFX+vRM2SHceU+4JgOV9WO4BgE2eJ0EAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAoJCEIAAAAAABQSEIQAAAAAACgkIQgAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKCQhCAAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIQhAAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAoJCEIAAAAAABQSEIQAAAAAACgkIQgAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKCQhCAAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIcgGrnfv3qmoqEhFRUWGDh1a7nEAAAAAAGCj0aDcAxTVm2++meuvvz7/+Mc/8uqrr2bWrFlZvHhxmjVrlvbt22e77bZLjx49sttuu6V3795p2bJluUcGAAAAAIBCEYLUsg8++CCDBw/O0KFDU1lZucL3s2fPzuzZszNu3Ljce++9SZIGDRrkV7/6VX7yk5+s73EBAAAAAKCwhCC1aPr06dl3330zduzYKufbtm2b7bffPs2aNcvcuXPzzjvvZMqUKaXvP/roo0yaNGl9jwsAAAAAAIUmBKlFJ510UpUA5JBDDsnPf/7z7LLLLivUvvvuu3nggQdy66235qGHHlppz5EjR9bFqAAAAAAAUHhCkFryzDPP5O677y6tTznllFx55ZUrrf/MZz6Tk046KSeddFLeeuutvPnmm+tjTAAAAAAA2GQIQWrJ8OHDS8dNmjTJRRddVONrt91222y77bZ1MBUAAAAAAGy66pV7gKJ4/fXXS8c77rhjNt9881rp27t371RUVKSioiJDhw5d4ftrrrmm9H1FRUXuu+++1fa85ZZbqlxz00031cqsAAAAAACwIRGC1JK5c+eWjufNm7fe7jto0KAcfvjhpfVJJ52U999/f6X177zzTk455ZTSesCAATnuuOPqckQAAAAAACgLIUgtadu2ben4jTfeyKRJk9bbvf/85z+nffv2SZL33nsvJ598crV1y5Yty3//93/ngw8+SJJ07tw5f/zjH9fXmAAAAAAAsF4JQWrJ7rvvXjr+6KOPMmDAgMyYMWO93Ltt27a57rrrUlFRkSS5++67q92U/aKLLsrIkSOTJPXq1cv111+fli1brpcZAQAAAABgfROC1JIBAwakadOmpfXjjz+eLl265OSTT87tt99e50+G9O3bN6eddlppfcYZZ+S1114rrV944YX87Gc/K61/8pOfZO+9966Ve1988cXp2LFjjT5TpkyplXsCAAAAAMDqNCj3AEWx5ZZb5g9/+ENOOumk0rl58+bl2muvzbXXXpskad++fXbffffsvffe2X///dO9e/daneGCCy7IY489lpdeeikLFizIgAED8tRTT5WeTFmyZEmSpGfPnvnFL35Ra/edM2dOJk+eXGv9AAAAAACgNghBatGJJ56Y5s2b59RTT8306dNX+H7KlCkZPnx4hg8fniT5whe+kJ/+9Kc59thjS6+yWheNGzfOjTfemF122SULFy7MP//5z/z85z/PrFmzMm7cuCRJ06ZNM2zYsDRs2HCd7/eJFi1apEOHDjWqnTJlSpYtW1Zr9wYAAAAAgJXxOqxadtRRR+Wtt97KxRdfnC9+8YurrH355ZfzjW98I4ccckjmzJlTK/ffcccd87//+7+l9YUXXlhlf5CLL744O+ywQ63c6xODBw/OpEmTavT5ZAN3AAAAAACoa0KQOrD55pvn9NNPzwsvvJBp06bl9ttvz49//OP06dMnzZs3X6H+vvvuy9e//vVae0Li+9//fg466KAkqdKzf//+OeWUU2rlHgAAAAAAsKETgtSxLbfcMkcccUQuuOCCPPLII5k1a1buv//+7LvvvlXqHn744QwbNqxW7llRUZGLL764yrmmTZtmyJAhtdIfAAAAAAA2BkKQ9axBgwY56KCD8thjj+V//ud/qnx39dVX19p9zj333CrrBQsW5IEHHqi1/gAAAAAAsKETgpTRr371q3Tt2rW0fuaZZ/LRRx+tc9+hQ4fmtttuW+H897///UycOHGd+wMAAAAAwMZACFJG9erVS9++fUvrJUuWZMaMGevU86233soPfvCD0vqEE07I5z73uSTJnDlzMnDgwFrbewQAAAAAADZkQpAy23zzzausGzZsuNa9li5dmoEDB2bu3LlJkh122CF//OMfc/3116dBgwZJktGjR+fCCy9c+4EBAAAAAGAjIQQps9dff710vNlmm6V169Zr3evXv/51nnzyySQfhynDhg1L06ZNs8cee+Scc84p1f385z/PCy+8sPZDAwAAAADARkAIUkvuv//+TJ8+fY2uGT9+fO6///7Sunfv3qmoqFir+z/zzDP51a9+VVr/4he/SM+ePUvrc845J3vssUeSj1+7NWDAgHz44YdrdS8AAAAAANgYCEFqybBhw7LNNtvkrLPOyquvvrra+ldffTX9+vWrEkR8+9vfXqt7z58/P8cff3xpU/WvfOUr+clPflKlpn79+rnhhhvSvHnzJMm4ceNy5plnrtX9AAAAAABgY9Cg3AMUybx58/K73/0uv/vd77Lzzjtn7733Ts+ePdOuXbtsvvnmmTdvXv7zn//k0UcfzT333FMKLZLkiCOOyNe+9rW1uu9pp52WN954I0nSokWLXH/99alXb8V8a7vttsv//d//5Vvf+laS5IorrsghhxySfv36rdV9AQAAAABgQyYEqSX169evsh4zZkzGjBlTo2sHDBiQa6+9dq3ue+edd2bIkCGl9eWXX54uXbqstP7kk0/OvffemzvvvDNJctJJJ+Xll1/OFltssVb3BwAAAACADZXXYdWSa665Jvfee28GDRqUz33uc6utb9iwYfr375+HH344N9xwQxo1arTG95wyZUoGDRpUWh911FH57//+79Ved/XVV6d9+/ZJkqlTp5aeDAEAAAAAgCLxJEgtadSoUb761a/mq1/9apJk2rRpeeWVV/Lmm29m1qxZWbhwYZo2bZpWrVqlW7du6dGjR5o1a7baviNHjlzpd+3bt1/jzdiTZIsttsi77767xtcBAAAAAMDGRAhSR7baaqtstdVW6d27d7lHAQAAAACATZLXYQEAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIQhAAAAAAAKCQhCAAAAAAAEAhCUEAAAAAAIBCEoIAAAAAAACFJAQBAAAAAAAKSQgCAAAAAAAUkhAEAAAAAAAoJCEIAAAAAABQSEIQAAAAAACgkIQgAAAAAABAIQlBAAAAAACAQhKCAAAAAAAAhSQEAQAAAAAACkkIAgAAAAAAFJIQBAAAAAAAKCQhCAAAAAAAUEhCEAAAAAAAoJCEIAAAAAAAQCEJQQAAAAAAgEISggAAAAAAAIUkBAEAAAAAAApJCAIAAAAAABSSEAQAAAAAACgkIQgAAAAAAFBIQhAAAAAAAKCQhCAAAAAAALABeP/993P//ffnl7/8ZQ499NC0b98+FRUVpc/QoUPXqN/ixYszcuTI/OxnP0u/fv3SuXPnNGvWLJtttlnat2+fXr165eyzz84bb7yx1jNPnTo1F154Yfbcc8+0b98+m222Wbp06ZKDDjoo1113XT788MO17l0bGpT17gAAAAAAsImbOnVq9thjj0ycOLFW+i1cuDCnnnpq7rzzznzwwQcrvefUqVPz+OOP57e//W1OPvnkXHzxxdl8881rfJ+//e1v+c53vpPZs2dXOT9x4sRMnDgxDz74YC644ILceOON+eIXv7guP2mteRIEAAAAAADKaOHChbUWgCTJvHnz8pe//GWFAKRTp07ZY4890rt373Tp0qV0vrKyMn/+85/Tu3fvFQKNlbn++utz3HHHVanv2rVrevXqlc6dO5fOjRs3Lr17984rr7yyTr9pbQlBAAAAAABgA7HlllvmoIMOyjnnnJO77rprnfvtvvvuufrqqzNp0qRMnDgxTz31VEaMGJHx48fnhRdeyF577VWqfeGFF/Ltb397tT1ffvnlDBo0qLTeYYcd8vzzz+e1117LyJEjM2HChDz00ENp165dkmTOnDnp379/Fi5cuM6/Z00JQQAAAAAAoIzatGmTW2+9NRMmTMi0adNy//3351e/+lUOPfTQtepXUVGRPn365Mknn8zTTz+dQYMGpUOHDivUffGLX8yIESOy7777ls7dcsst+de//rXK/meffXYWLVqUJNliiy0yatSo9OzZs0pN37598+ijj6Zx48ZJkrfeeit/+tOf1ur3rAshCAAAAAAAlFGLFi3y9a9/vcprpNZF27Zt88gjj2TPPfdcbW3Dhg1z5ZVXVjl3xx13rLT+lVdeyf+/vXuP83LM/wf+nmmazielpCg5RTYsclq07BLrsGGdslstig1LWGvXspbHIufDOmtLYrHCEi2LdJASG1klpFRGNZ3Pp5nfH33dvxlNNTPNzGe6ez4fj8/DdX0+13Xd74+7+UzNa+77evnll5P+TTfdlFzx8X0dOnSIyy67LOn369cvCgoKNltTRRKCAAAAAADANmyPPfaIPfbYI+lPnjx5o2OLBiT169ePbt26bXLtorfX+vbbb2PMmDFbUGnZCUEAAAAAAGAbt9122yXtxYsXb3Tc0KFDk/aPfvSjqF+//ibXbdeuXey5554lzq8KQhAAAAAAANjGTZ8+PWk3b968xDGFhYUxceLEpF+a2219f9xHH31UzgrLRwgCAAAAAADbsPfeey/y8vKS/iGHHFLiuK+//jqWLVuW9HfddddSrV903KRJk8pZZfnkVOnRAAAAAABgK5CXlxetW7cu1di+fftG3759K7miynPDDTck7dq1a8epp55a4riiV4tEROy8886lWr/ouOnTp0dhYWFkZWWVo9KyE4KQEXVWRHR9JtNVUBFeODPTFVBRuma6ACrWfZkuAChRi0wXQIXyWZsa/m2SMmdkugAqzLOZLoCKcMmKTFdAZVgRES+k+B5D3/2xLSgoiFmzZpVqzqb20KjunnzyyRg2bFjS/81vfhMtW7Yscez332ejRo1KdYyGDRsm7YKCgli+fHnUq1evHNWWnRAEAAAAAAC+Jzs7e6NhwPcV/SH/1mTixIlx4YUXJv3ddtut2FUh31f0VlgR668aKY06depssI4QBAAAAAAAMqRly5Yxc+bMTJdRaWbPnh0///nPk2CjVq1a8dRTT0X9+vU3OmfNmjXF+jk5pYsYvj9u9erVZay2/FJ80RIAAAAAAPB9ixYtii5dusTUqVMjIqJGjRoxePDgOOiggzY5r27dusX6K1euLNXxvj+uqq4CiRCCAAAAAADANmPZsmVxwgknxIQJEyIiIisrKx5//PE47bTTNjv3+1eJrFhRuo1/li9fvsl1KpMQBAAAAAAAtgErV66MU045Jd59993kufvvvz+6d+9eqvnNmjUr1s/LyyvVvG+//TZpN2jQIGrWrFmqeRVBCAIAAAAAACm3Zs2aOP300+PNN99MnuvXr1/85je/KfUae+yxR7H+119/Xap5M2bMSNrt27cv9fEqghAEAAAAAABSbN26dXH22WfH0KFDk+f+/Oc/x1VXXVWmderXrx877bRT0v/ullqb89///jdp77XXXmU65pYSggAAAAAAQEoVFBREjx494vnnn0+e+93vfhfXX399udY78sgjk/aoUaM2O37NmjUxduzYEudXBSEIAAAAAACk1EUXXRRPPvlk0r/00kvj1ltvLfd6p5xyStKeNGlSsas8SvKvf/0rlixZEhER2dnZcdJJJ5X72OUhBAEAAAAAgBTq27dvPPLII0m/V69ecffdd2/RmieccEJsv/32Sf+mm27a6Nh169bFLbfckvSPP/74aN68+RYdv6yEIAAAAAAAkDLXXXdd3HXXXUm/R48e8dBDD0VWVtYWrVuvXr245pprkv6QIUNKDFYKCwvjyiuvjPHjx0dERFZWVtx4441bdOzyyKnyIwIAAAAAAMVccMEFMWjQoM2OufDCCzd4fuXKlcX648aNKxY4ZGdnx6xZs+L4448vVS0tWrSIgQMHbvT1Pn36xPPPPx+jR4+OiIjLL7883nzzzejWrVvssMMOMW3atHj88ceL7RlyxRVXxP7771+q41ckIQgAAAAAAGTYmjVrYtWqVZscs3bt2li7du1m11q+fHmxfkFBQbzxxhulrqVNmzabfD03NzdeeOGFOOaYY2LixIkREfHKK6/EK6+8UuL4c845Z4v2IdkSbocFAAAAAACUyfbbbx/jxo2Lq666Kho1alTimLZt28bjjz8egwcPjuzszMQRrgQBAAAAAIAMGzBgQAwYMKBC1urcuXMUFhZWyFqbUrt27ejXr1/85S9/ieHDh8e0adNiwYIF0aJFi9hrr73ikEMO2eI9SLaUEAQAAAAAACi32rVrR5cuXTJdRoncDgsAAAAAAEglIQgAAAAAAJBKQhAAAAAAACCVhCAAAAAAAEAqCUEAAAAAAIBUEoIAAAAAAACpJAQBAAAAAABSSQgCAAAAAACkkhAEAAAAAABIJSEIAAAAAACQSkIQAAAAAAAglYQgAAAAAABAKglBAAAAAACAVBKCAAAAAAAAqSQEAQAAAAAAUkkIAgAAAAAApJIQBAAAAAAASCUhCAAAAAAAkEpCEAAAAAAAIJWEIAAAAAAAQCoJQQAAAAAAgFQSggAAAAAAAKkkBAEAAAAAAFJJCAIAAAAAAKSSEAQAAAAAAEglIQgAAAAAAJBKQhAAAAAAACCVhCAAAAAAAEAqCUEAAAAAAIBUysnkwb/88ssYNGhQjB49OiZNmhQLFiyI1atXR7169aJly5ax6667xr777hudOnWKzp07R6NGjTJZLgAAAAAAsBXJSAiycOHC6Nu3bwwYMCAKCws3eH3RokWxaNGimDx5cgwdOjQiInJycuLGG2+M3//+91VdLgAAAAAAsBWq8hAkPz8/fvzjH8cnn3xS7PmmTZvG7rvvHvXq1YslS5bEjBkzIi8vL3l97dq1MXPmzKouFwAAAAAA2EpVeQjy61//ulgAcuKJJ8b1118fBx544AZjv/nmmxg2bFg899xz8frrr1dlmQAAAAAAwFauSkOQsWPHxssvv5z0e/fuHQ899NBGx++4447x61//On7961/H1KlT48svv6yKMgEAAAAAgBSo0hDkxRdfTNp16tSJ2267rdRz27VrF+3atauEqgAAAAAAgDTKrsqDTZkyJWl36NAhGjRoUOHHKCwsjBdffDF69uwZ7du3jyZNmkSdOnVi5513jpNPPjn69+8fa9as2ej8Bx54ILKysiIrKyt22mmnEjdu35g+ffokc4899thKrfM7f/7zn5Nj9ujRI3n+vffeix49esQee+wRdevWjSZNmsRBBx0Uf/nLX2LRokWlfk8AAAAAALC1qtIQZMmSJUl76dKlFb7+Bx98EAcccEB07do1BgwYEJ999lksXLgwVq5cGTNmzIiXX345zjvvvOjQoUN88MEHJa5xxhlnRE7O+gtkZs6cGSNGjCjVsdeuXRvPPvts0j/33HMrtc6NWbNmTVx++eVx6KGHxsCBA+Pzzz+PFStWxMKFC2P8+PFx/fXXR/v27WPixIllWhcAAAAAALY2VRqCNG3aNGl/8cUXMXPmzApbe9iwYXHUUUfFf//73+S5Zs2axaGHHhqdO3eONm3aJM9//vnn8eMf/zjGjBmzwTrNmjWL4447LukPHjy4VMf/97//Hfn5+RGx/lZfXbt2rdQ6N+aiiy6Ku+++OyLW//8+7LDD4ogjjogmTZokY7799tvo0qVLLF68uNTrAgAAAADA1qZKQ5CDDz44aa9duza6desW8+bN2+J1v/jii/jFL34Ry5Yti4iITp06xfDhw2POnDnx7rvvxttvvx3Tpk2LsWPHxv777x8R669KOfvss0u8NVS3bt2S9j//+c9YvXr1Zmt46qmnkvbJJ59c4q2+KrrO73vllVfi8ccfj9atW8eLL74Yc+bMidGjR8eIESNizpw5ccstt0RWVlZERHzzzTdl2pMFAAAAAAC2NlUagnTr1i3q1q2b9EeMGBFt27aN8847L55//vlyXxly3nnnJbfXOumkk2LUqFFx1FFHJT/w/06nTp1i5MiRsd9++0VExPTp0+Pee+/dYL1TTjkl6tevHxERCxYsiNdee22Tx1+2bFm89NJLxd5nVdT5ffPmzYvmzZvH6NGj45RTTons7P9/enNycuLqq6+Oiy++OHlu4MCBm12zNO68885o3bp1qR55eXkVckwAAAAAANicKg1Btt9++7j//vuLPbd06dLo379/nH766bHTTjvFjjvuGF27do0777wzPv74482uOXbs2GTfjqZNm8YTTzwRNWvW3Oj4evXqxUMPPZT0H3rooQ02P69bt26x21kVvcqjJC+99FJydUfTpk2jS5cuVVJnSW6//fbYeeedN/r6ZZddlrRnzJgRM2bM2Oyam7N48eKYNWtWqR4FBQVbfDwAAAAAACiNKg1BIiJ69uwZzz77bDRr1qzE1/Py8uLFF1+MK664Ivbdd9/o2LFjPP300xsNAAYNGpS0u3fvHo0bN95sDQcffHDstttuEbH+tlCTJ0/eYEzRqzlefvnlYpu6f1/RfUPOOOOMEsONyqqzqIYNG8ZZZ521yTHt2rWLHXfcMelvbs3SaNiwYbRq1apUj6JXpwAAAAAAQGXKyE+kf/GLX8TUqVPjzjvvTPa+2JiJEyfGOeecEyeeeGKJG3mPHDkyaR999NGlrmGfffZJ2h9++OEGr//kJz+JFi1aRETEihUrYsiQISWuk5+fH6+//nrS39itsCqrzqIOOOCATV5d8p1WrVol7YULF5a6lo3p27dvzJw5s1SPli1bbvHxAAAAAACgNHIydeAGDRrE5ZdfHpdffnnMnTs3Ro4cGePGjYvx48fH2LFjk70zvvPqq6/G6aefHsOGDUuuJigsLIz//e9/yZi//vWvcd9995Xq+BMnTkza+fn5G7xeo0aNOPPMM5O9OJ566qno3r37BuOeffbZWLt2bUREtG3bNg477LANxlRmnUXtsMMOpVqz6L4sy5cvL9UcAAAAAADY2mQsBClq++23j1NPPTVOPfXUiIhYu3Zt/Oc//4l+/frF22+/nYx74403YvDgwfHLX/4yIiIWLVoU69atS15/9913y3X8RYsWlfh8t27dkhDkzTffjNmzZydXh3yn6K2wzjnnnA02Oa+KOr+Tm5tb5jVLs88IAAAAAABsjarlBg05OTnRpUuXeOutt+IPf/hDsdceeeSRpP3dZuRbamObdXfq1Cl23333iIhYt25dPPPMM8VenzZtWowZMybpb+xWWJVdJwAAAAAAsKFqGYIUdeONN8Yee+yR9MeOHZvcfqpRo0bFxr7//vtRWFhY5sef//znjR6/aLBR9KqPiPW3yPruSor9998/9t577xLXqIo6AQAAAACA4qp9CJKdnR0//elPk/6aNWti3rx5ERFRv379YvtbzJkzp8KPXzQEGTduXHz55ZdJ/6mnnipx3PdVRZ0AAAAAAEBx1T4EiVi/iXpRNWvWTNqHHHJI0n7vvfcq/Ni77bZbdOrUKel/dzXIRx99lGx2np2dHWefffYm16nsOgEAAAAAgOK2ihBkypQpSbt27drRpEmTpH/ccccl7cGDBxfbgLyiFL3K47urP4reGqtz586x4447bnKNqqgTAAAAAAD4/6o0BHnttdciPz+/THO++uqreO2115J+586dIysrK+mff/75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e+4ZPXv2jPfeey8Z17lz52TdAQMGlKmm//3vf3HxxRfHXnvtFfXr14+GDRtGx44d43e/+118++23G53Xo0ePyMrKip49eybPvfPOO0kd33+U5v0CAAAAAMDWIjV7gmTCa6+9Ft27d4+5c+cWe37KlCkxZcqUGDBgQFxxxRVx6623lvsYt956a1x77bWxdu3aYs9PnDgxJk6cGA899FC8+OKLcfTRR5f7GAAAAAAAkEZCkHJ68803o2vXrrFq1arkuaZNm8Zee+0Va9eujUmTJsWiRYvijjvuiOzs8l1wc+ONN8Z1110XERENGjSIvffeO2rXrh2TJ0+O2bNnR0TEkiVL4uSTT47//e9/0aZNm2Lzf/CDH8Rxxx0Xs2bNik8++SQiIpo0aRKdOnUq8XjbbbddueoEAAAAAIDqSAhSDosWLYpf/vKXSQDSuHHjuPfee+Pss8+OnJz1/0tXr14djz/+eFx55ZVx++23lzlgmDhxYowYMSIaN24cd911V3Tr1i1q1qwZERGFhYXxxBNPRK9evWL16tWxbNmyuPbaa2PQoEHF1rjiiiviiiuuiAEDBiS3xOrYsWMMGzZsS/8XAAAAAABAtWdPkHLo169f5OXlRURETk5ODB06NH75y18mAUhERG5ublx00UXx7LPPRmFhYcybN69Mx5g/f37Url073n777ejRo0cSgEREZGVlRffu3ePmm29Onnv++edj2bJlW/jOAAAAAAAgPVITgmxqw++SHm3bti3XcdauXRv9+/dP+hdddFEcdthhGx3/s5/9LM4888xyHeuaa66J/fbbb6Ov9+7dO+rUqRMREStWrIgPP/ywXMfZUnfeeWe0bt26VI/vwiMAAAAAAKhsbodVRv/973/j22+/Tfq9e/fe7JwLL7wwnnnmmTIf64ILLtjk6/Xq1Yv9998/3n333YiImDx5chxxxBFlPs6WWrx4ccyaNavKjwsAAAAAAJuSmhBkUxt+l6RFixblOs7777+ftLfffvvo0KHDZuccfvjhUbNmzVizZk2pj7PLLrvEDjvssNlxrVq1StoLFy4s9foVqWHDhsXq2JS8vLwoKCio5IoAAAAAACBFIUhVbfj99ddfJ+327duXak7NmjVj1113jcmTJ5f6OKUJQCIi6tatm7SXL19e6vUrUt++faNv376lGtu6dWtXjQAAAAAAUCVSsydI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cePGxRVXXBH7779/NG/ePGrVqhU77LBDHHHEEXHzzTdHfn7+ZtcYPnx4ZGVlRVZWVrRt2zZ5ftq0aXHNNddEx44do1GjRlG/fv1o37599OnTJ7744otKfFcAAAAAAJB59gTJkLlz58ZFF10Uzz///AavzZ49O2bPnh2jRo2Kfv36xT333BO/+tWvyrT+E088ERdddFEsX7682POfffZZfPbZZ/HYY49F//79o1u3blv0PgAAAAAAoLoSgmTAV199Fccee2yxqzHq1KkTHTp0iIYNG8bs2bPj008/jcLCwli4cGF07949Fi1aFJdcckmp1h80aFB07949IiJq164d++yzT9SvXz+mTp0aX3/9dURErF69On71q1/FbrvtFgcffHDFv0kAAAAAAMgwt8OqYqtWrYquXbsmAUjLli1j0KBBsXDhwnj//ffjzTffjE8++SS+/vrrOOuss5J5V1xxRYwfP36z6+fn50evXr2iVq1acfvtt8e8efPi/fffj7fffjumT58eQ4cOjUaNGkVEREFBQVx55ZWV80YBAAAAACDDXAlSxf7617/GRx99FBERu+yyS4wePTpatmy5wbjWrVvH008/HQ0aNIhHH3001qxZE1dffXW8+eabm1x/2bJlkZWVFUOHDo3jjz9+g9dPOOGE6N+/f5x22mkRETFq1KiYOnVqtGvXrtzv6c4774w777yzVGPz8vLKfRwAAAAAACgLIUgVWr58edx///1Jf+DAgSUGIEXdfffdMWTIkJg3b1689dZb8dlnn8Wee+65yTk9e/YsMQD5TteuXaNNmzYxffr0iIgYPXr0FoUgixcvjlmzZpV7PgAAAAAAVAYhSBV69dVXY/78+RER8cMf/jCOOOKIzc6pW7dudO3aNR577LGIiHjrrbc2G4L06tVrk69nZWXF4YcfnoQgkydPLk35G9WwYcNo1apVqcbm5eVFQUHBFh0PAAAAAABKQwhShUaOHJm0jz766FLP22effZL2hx9+uMmxubm5ccABB2x2zaKhxcKFC0tdS0n69u0bffv2LdXY1q1bu2oEAAAAAIAqIQSpQp988knSfuWVV2LixImlmlc0NMjPz9/k2KZNm0ZOzuZPa926dZP28uXLS1UHAAAAAABsTYQgVWjevHlJe/LkyeW6DdWiRYs2+Xpubm6Z1ywsLCzzHAAAAAAAqO6yM13A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H+KNN94o8fV58+bFvHnz4rPPPot//OMfcfnll0eXLl3ixhtvjB/+8IdVXC2lVVBQEAsXLoyFCxdGRMTHH38czz33XEREtGzZMs4777zo06dP7LDDDhmsEmDr8tFHH8X1118fL730Uomvr1mzJpYsWRIzZsyIUaNGxX333Rd16tSJn//85/HHP/4xOnToUMUVAwBA6QlBoIIsW7Ys/vnPf27w/MCBA4UgW4kmTZpEp06dNnh++fLlMWPGjJg2bVry3DvvvBNHHnlkjBkzJlq3bl2FVVIaN998c/zxj3/c4IqdZs2aRevWraNJkyaxYMGCyMvLi9mzZ0fE+h+uv/rqq/Haa6/FU089FWeddVYmSud7Svq6XL58eSxYsCC+/fbbyM/PT57Py8uLm266KR588MF4+OGH47TTTqvqcimljX3ebkqrVq0qqRq2VFnOZ/369Su5GsrqzjvvjKuuuioKCgqKPd+gQYPYaaedYvvtt481a9bEnDlzYubMmbFy5cqIiFixYkU8/fTT8cwzz8Tf//73+NWvfpWJ8gEAYLOEIFBBhgwZktwW4PDDD4+PP/44lixZEiNHjoyvvvrKFQNbgY4dO8awYcM2+vrnn38eV111VfJbkjNnzozLLrusxPCLzPnNb34TDz74YNKvXbt2XHLJJdGtW7fYd999Nxg/adKkeOmll+Lee++NvLy8KCwsjG+//bYqS2YTNvd1OXXq1Hjrrbfi/vvvj48++igi1l/lc/rpp8ctt9wSV199dVWVShls7ryydXE+t17f/56Zm5sbF1xwQZx77rlx0EEHRY0aNYqNX7VqVYwcOTL+9a9/Rf/+/WPZsmVRUFDglpIAAFRr9gSBClL0XuXnn39+nHrqqRERUVhYGE888USGqqIi7b777jFkyJBi92t98cUXY968eZkrimIefvjhYj/M6dChQ0yaNCn69etXYgASEbHXXnvF73//+/jiiy/ihhtuiJwcvx+wNWnXrl2cf/75MWHChBgwYEDUqVMnee2aa66JF154IYPVAVRfDz30ULHvmfvss09Mnjw57r///jjkkEM2CEAiImrVqhU/+clP4t57743p06fHVVddVeI4AACoToQgUAG+/vrrePvttyMiok6dOnHaaafFueeem7z+xBNP2Eg7JbKzs+Oyyy5L+uvWrYvx48dnriASX3zxRbFzs+eee8aI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",
"text/plain": [
"<Figure size 3000x1500 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.rcParams[\"figure.figsize\"] = [12, 6]\n",
"\n",
"# Plot the DataFrame with the new colormap and boundaries\n",
"fig, ax = plt.subplots()\n",
"im = ax.imshow(df_ex, cmap=listed_cmap, norm=norm)\n",
"fig.colorbar(im, ax=ax, ticks=boundaries, boundaries=boundaries)\n",
"\n",
"# Set the x and y axis labels with DataFrame column names and index\n",
"ax.set_xticks(np.arange(len(df_ex.columns)))\n",
"ax.set_yticks(np.arange(len(df_ex.index)))\n",
"ax.set_xticklabels(df_ex.columns)\n",
"ax.set_yticklabels(df_ex.index)\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3c22e181",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.10.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment