{ "cells": [ { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "import geemap\n", "import ee\n", "import folium\n", "import geopandas as gpd" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "ee.Initialize()" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7319d0b609f648c9b74211745a3fd77d", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Map(center=[-8.980207755364754, 13.310742868350161], controls=(WidgetControl(options=['position', 'transparent…" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "datadir = 'C:/Users/jtrum/world_bank/data/'\n", "\n", "# Define the path to your GeoJSON file\n", "aoi_path = datadir + 'luanda2clean.geojson'\n", "\n", "# Load the GeoJSON as a Feature\n", "aoi = geemap.geojson_to_ee(aoi_path)\n", "\n", "# Create a map\n", "Map = geemap.Map()\n", "#choose a different basemap\n", "Map.add_basemap('CartoDB.DarkMatter')\n", "\n", "# Load the ESA Land Cover data\n", "esa = ee.ImageCollection(\"ESA/WorldCover/v100\").first()\n", "\n", "# Filter the data to your AOI\n", "esa = esa.clip(aoi)\n", "\n", "esa_vis = {'bands': ['Map']}\n", "\n", "# Add the ESA Land Cover layer to the map\n", "Map.addLayer(esa, esa_vis, \"ESA Land Cover\")\n", "\n", "# add legend with colors chosen from self-defined palette\n", "Map.add_legend(builtin_legend='ESA_WorldCover', \n", " #legend_title=\"ESA Land Cover\", \n", " #layer_name=\"ESA Land Cover\", \n", " colors=['#05450a', '#086a10', '#54a708', '#78d203', '#009900', '#c6b044', '#dcd159', '#dade48', '#fbff13','#d5n5n5', '#129279'],\n", " labels=['trees', 'shrublands', 'grasslands', 'croplands', 'built-up', 'bare', 'snow and ice', 'water bodies', 'herbaceous vegetation', 'mangroves', 'moss and lichen']\n", " )\n", "\n", "\n", "#start the zoom at the center of the AOI\n", "Map.centerObject(aoi, 10)\n", "\n", "\n", "\n", "# Display the map\n", "Map\n" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Calculating area for group 10 ...\n", "Calculating area for group 20 ...\n", "Calculating area for group 30 ...\n", "Calculating area for group 40 ...\n", "Calculating area for group 50 ...\n", "Calculating area for group 60 ...\n", "Calculating area for group 80 ...\n", "Calculating area for group 90 ...\n", "Calculating area for group 95 ...\n" ] } ], "source": [ "df = geemap.image_area_by_group(esa, scale=1000, denominator=1e6, decimal_places=4, verbose=True)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "area float64\n", "percentage float64\n", "dtype: object" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dtypes" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
typeareapercentage
0Trees42.69931.75
1Shrublands10.79030.44
2Grasslands1460.942559.87
3Croplands6.77400.28
4Built-Up505.171420.70
5Barren135.63235.56
6Water Bodies37.04841.52
7Herbaceous Wetlands195.59008.02
8Mangroves45.38201.86
\n", "
" ], "text/plain": [ " type area percentage\n", "0 Trees 42.6993 1.75\n", "1 Shrublands 10.7903 0.44\n", "2 Grasslands 1460.9425 59.87\n", "3 Croplands 6.7740 0.28\n", "4 Built-Up 505.1714 20.70\n", "5 Barren 135.6323 5.56\n", "6 Water Bodies 37.0484 1.52\n", "7 Herbaceous Wetlands 195.5900 8.02\n", "8 Mangroves 45.3820 1.86" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['percentage'] = df['percentage']*100\n", "\n", "# reset the index and rename the columns to be the name of the Land Cover Type\n", "df = df.reset_index().rename(columns={'group': 'type'})\n", "\n", "\n", "# Create a mapping dictionary with numbers as strings\n", "type_mapping = {\n", " '10': 'Trees',\n", " '20': 'Shrublands',\n", " '30': 'Grasslands',\n", " '40': 'Croplands',\n", " '50': 'Built-Up',\n", " '60': 'Barren',\n", " '70': 'Snow and Ice',\n", " '80': 'Water Bodies',\n", " '90': 'Herbaceous Wetlands',\n", " '95': 'Mangroves',\n", " '100': 'Moss and Lichen'\n", "}\n", "\n", "# Use the mapping dictionary to replace values in the 'type' column\n", "df['type'] = df['type'].replace(type_mapping)\n", "df\n", " " ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9UAAANSCAYAAABr/+1/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAACVYUlEQVR4nOzdd1xW9f//8ScbFRUHiLlzUG4UHDlANCv3Ri1zpyauErNyYGjmHqgprsyFaZoT/ZjmBveemeb8uCeCgRfX7w9/Xt+uDy5OIBiP++3G7eN1zvt6n9f7HOzj83q/z7lszGazWQAAAAAAIMlsU7sAAAAAAABeV4RqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagBAutamTRu1adMmVWvo37+//P39X6rtunXr1LFjR73zzjsqW7as6tWrp8mTJys6OjqFq/zn/P391b9//3/Ux8WLF+Xp6amlS5cmU1UpJynX1Qiz2Sx/f395enrq4MGDKXacl7Vz5055enpq586dqV0KALxS9qldAAAAeLGEhAQFBQVp7dq1atq0qVq1aqVMmTLp4MGDmjlzptavX685c+Yoa9asqV3qM02aNEkuLi6pXca/RmRkpK5cuaLChQsrPDxcZcqUSe2SACBdYqYaAIDXwIwZM7Rq1SqNHz9e33zzjWrVqqXKlSura9eumj59uk6ePKnQ0NDULvO5ihcvrvz586d2Gf8aP//8s8qWLasmTZpozZo1unfvXmqXBADpEqEaAICXsHjxYjVp0kRly5ZV6dKl1bBhQ61Zs8ayf+nSpSpevLgOHjyogIAAlSpVSn5+fpo+fbpVP3fv3tWXX36pihUrysfHR6NGjVJCQsJzjx0fH69Zs2apevXqevfddxPtL1u2rHr37q2iRYtatv3111+aPHmy3n//fZUqVUq1a9dWWFiY5VhTp05ViRIldOvWLau+FixYoOLFi+v69euSpMuXL+uzzz5ThQoVVKZMGbVt21bHjh2ztH+yHHv27Nn64IMPVKFChWcuzf778u8n74uIiFDPnj3l5eUlHx8fff3113rw4MFzz8fL8PT0TPQhQ2hoqDw9Pa22vcrrajKZFBYWpnr16ql06dIqW7asWrZsqcjIyCSP7969e1q/fr38/PxUv359xcXFadmyZU89D/Pnz9fXX3+tChUqyMvLSz179tSNGzes2s2cOVM1a9ZU6dKl1bJlS23cuDHRUu7Dhw+rY8eOqlixosqVK6euXbvq999/f26dv/76q1q3bi0vLy+VLFlS77//vubNm5fk8QJAWkaoBgDgBebPn69BgwapZs2amjZtmkaNGiUHBwcFBQXp8uXLlnYJCQnq3bu36tSpo7CwMJUvX16jR4/W1q1bLfs7deqkTZs2qW/fvhoxYoT2799vFeKe5ujRo7p9+7Zq1KjxzDZdunRRQECApMf32nbt2lUzZsxQs2bNNHXqVL3//vsaP368Bg8eLElq0KCBTCaT/vOf/1j1s2rVKlWuXFlubm66deuWWrZsqaNHj2rgwIEaM2aMEhIS9OGHH+qPP/6wet+4cePUsWNHDR06VJUqVXrpczt48GDlyZNHU6ZMUadOnfTzzz9r6tSpL/3+f+JVX9fRo0dr8uTJCggI0IwZM/TNN9/o9u3b6tWrl2JiYpJU+8qVKxUfH6+GDRsqV65ceuedd7Ro0aKnth03bpwSEhI0duxY9evXT5s2bdK3335r2T9p0iSNHj1aH3zwgaZMmaIyZcqoT58+Vn1ERUWpVatWSkhI0LBhwzR06FD997//VcuWLRP9LjyxadMmde/eXSVKlNCUKVMUGhqqPHnyKCQkRPv27UvSeAEgLeOeagAAXuDChQvq0KGDunfvbtmWN29eNWnSRPv27dMbb7wh6XGY/fTTT9W8eXNJUvny5bV+/Xpt2rRJ1apV05YtW3To0CFNmzZNfn5+kqRKlSq98GFWV65csRzzZWzZskU7duzQqFGj1KBBA0lSlSpV5OzsrAkTJqht27YqUqSIfHx8tHr1arVs2VLS41npffv2aeTIkZKkOXPm6M6dO1q4cKHy5MkjSapevbrq1KmjCRMmaOLEiZZj1q5dW82aNXup+v7O19dXX3zxhSSpcuXK2r59uzZt2qTPP/88yX0l1au+rteuXVOfPn2sHozn7OysHj166OTJk/Ly8nrp2n/++WdVqVJFuXLlkiQ1bdpUffr00a5du1ShQgWrtsWKFdPw4cMtrw8dOqS1a9dKkmJiYjR9+nR9+OGH6tu3rySpatWqio2NtQrpY8aMUb58+TRjxgzZ2dlZ2r377rsKDQ3V+PHjE9V4+vRpNWrUSF9//bVlm5eXlypWrKjdu3erXLlyLz1eAEjLCNUAALzAkyXL9+/f159//qk///zTsmQ3Pj7equ3fg5Gjo6OyZ89umYXcs2ePHBwcVL16dUubjBkzytfXV7t3737m8W1tHy8se9Ey8Sd27dolOzs71alTx2p7gwYNNGHCBO3cuVNFihRRw4YNNXDgQF27dk3u7u5avXq1MmTIYFliHhkZqbffflu5cuXSo0ePLLVUr15dK1assOq7WLFiL1Xb/ypbtqzVaw8PD126dMlQX0n1qq/rmDFjJEm3bt3SuXPndPbsWW3cuPGpx3uekydP6ujRoxo6dKjlPuqKFSsqc+bMCg8PTxSqn3aOY2NjJUkHDhzQw4cP9f7771u1qVevniVUx8TE6PDhw+revbslUEtSlixZVKNGDW3evPmpdXbq1Mny/vPnz+vs2bM6fPhwkscLAGkdoRoAgBc4f/68Bg0apKioKNnb2+vNN9+03JtrNput2jo7O1u9trW1tbS5e/euXF1dLSH5CTc3t+ce/8ks8fPC5q1bt5QpUyY5OTnp7t27ypYtm+ztrf9v/slx7t+/L0l6//33FRISooiICLVt21arVq1S7dq1lSFDBknSnTt3dO7cOZUoUeKpx3wSzCQpZ86czx3Dszw51hN/P18p7VVf18OHD2vIkCE6fPiwnJ2dVaRIEcu1TcqYlyxZIkkaMGCABgwYYLXvP//5j27duqXs2bNbtj3vHD+5p/7v7SXr63n//n2ZzeanXuOcOXNafp/+161btzR48GD9+uuvsrGxUYECBVS+fHlJSRsvAKR1hGoAAJ4jISFBn3zyiRwcHPTTTz+pePHisre31+nTpxPN1r5ItmzZdPv2bZlMJqsZvzt37jz3fW+//bZy5sypLVu26MMPP3xqm+DgYEVFRWnLli3KmjWrbt++rUePHlkF62vXrlnqkCQXFxfVrFlTERERqlq1qk6cOGFZii1JmTNnVoUKFdSvX7+nHtPR0fGlxp1aTCaT1eu/37f8qq9rdHS0OnXqJE9PT61atUqFCxeWra2tNm/erHXr1r30seLi4rRy5UrVrFlTbdu2tdr33//+V1988YWWLFmiTz755KX68/DwkPQ4AL/55puW7X9/gF3mzJllY2OT6OFmknT9+nW5uro+te++ffvqjz/+0OzZs1WuXDk5OjoqNjZWixcvfqnaAOB1wYPKAAB4jtu3b+vs2bNq1qyZSpcubQmpW7ZskfTyS7Klx/cMP3r0SL/++qtlW1xcnLZv3/7c99na2qpdu3batGmTNmzYkGj/7t27tXHjRr333ntydnZWhQoVZDKZEj0o60lYfDJbKEkNGzbUwYMHNX/+fLm7u1s9ZKxChQo6e/asChUqpFKlSll+VqxYocWLF1sFyLTGxcXFci/6E39/ONarvq5nzpzRnTt39PHHH6to0aKWWe2kHm/jxo26ffu2WrVqpYoVK1r9NGrUSEWKFNFPP/300jPBb731ljJnzpzogXV/D/oZM2ZUyZIltWbNGqsPKu7fv69NmzZZ/T793d69e/Xee++pUqVKlg9gjJxfAEjrmKkGAKR7V65c0Q8//JBoe5EiRVS1alXlyZNH8+fPl4eHh7JkyaJt27Zpzpw5kqyXQL9I5cqVVbVqVQ0YMEA3b95Unjx59OOPP+rWrVvKkSPHc9/brl077d69Wz179lTz5s3l5+cnW1tb7dmzR3PnzlXRokUts8zVq1dXxYoVNXjwYF27dk3FixfXrl27NH36dDVu3FhFihSx9Fu1alVlz55d4eHhateundUS5nbt2mn58uVq166dOnTooGzZsmnNmjX66aef9OWXX770uFPC9u3bn/q9zO+//748PDzk5+en1atXq3Tp0ipUqJCWLVumc+fOWdrlyJHjlV7XQoUKycXFRVOnTpW9vb3s7e21bt06y1LuJ8eLi4vTsWPH5OHhYZlF/ruff/5Z2bNnV+XKlZ9aS6NGjTR69Ght27ZN1apVe2HtLi4u6tSpkyZOnKgMGTKoQoUK2rVrlxYuXCjp/+7n//zzz9WxY0d16tRJH330keLj4xUWFqa4uDgFBgY+te/SpUtr5cqVKlGihDw8PLR//35NmzZNNjY2STq/AJDWEaoBAOne+fPnrZ6O/ETjxo1VtWpVTZkyRcOGDVP//v3l6OioIkWK6Pvvv9e3336rPXv2WD3N+UWefH3RxIkT9ddff6lOnTpq0aLFU2eg/87BwUFTpkzRokWLtHz5ckVERCguLk558+ZVly5d1KZNG2XKlEmSZGNjo2nTpmnixImWcJc3b1716dNH7du3t+rXzs5OdevW1Zw5cyxPCn8iV65cCg8P15gxYxQcHKy//vpLBQsW1LBhwww96Ts5rVq1SqtWrUq0/e2335aHh4e+/PJLPXr0SKNGjZK9vb3q1Kmjzz//3Ooe5Fd5XTNnzqwpU6Zo5MiR6tWrlzJlyqS3335b8+bNU+fOnbVnzx75+/vr2rVrCggIUGBgoHr06GF1jKtXr2r79u1q2bJlovvln2jQoIHGjh2r8PDwlwrV0uOvY0tISNCiRYs0c+ZMlSlTRn379tXw4cOVMWNGSY8/OJg9e7YmTpyozz77TI6OjvL29taIESOsvh/977777juFhIQoJCREklSwYEENGTJEK1as0J49e16qNgB4HdiYeVIEAABAmrFkyRLdunXrpe+L/icePXqkVatWqWLFisqdO7dl+/z58zV06FDt3LlTWbJkSfE6AOB1xkw1AABAGhEdHa05c+bo22+/fSXHs7e31/Tp0zVnzhx169ZN2bJl04kTJzRhwgQ1atSIQA0AL4GZagAAgDTCbDbrxIkTevvtt1/ZMS9cuKCxY8dq586dunfvnt544w01aNBAXbp0kYODwyurAwBeV4RqAAAAAAAM4iu1AAAAAAAwiFANAAAAAIBBhGoAAAAAAAzi6d947SQkJOjRo0eytbWVjY1NapcDAAAAIJWYzWYlJCTI3t5etrapM2dMqMZr59GjRzp8+HBqlwEAAAAgjShVqpQcHR1T5diEarx2nnwCVbx48VT7i4NXw2Qy6fDhwypVqpTs7OxSuxykIK51+sL1Tj+41ukH1zr9SGvX+kk9qTVLLRGq8Rp6suTbzs4uTfxFRsrjWqcfXOv0heudfnCt0w+udfqR1q51at4WyoPKAAAAAAAwiFANAAAAAIBBhGoAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVANK0DBkypHYJeEW41ukL1zv94FqnH1xrpFd8pRZeW2npEf5IGXZ2dipevHhql4FXgGudvnC90w+udfrBtU4/bG1t5ODgkNplpCmEary27t2bLbP5UmqXAQAAAKQLdna5lTXrJ7K3J0b+HWcDry2T6aoSEs6ndhkAAAAA0jHuqQYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBBhGoAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVAAAAAAAYRKgGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCBCNQAAAAAgRW3evFk2NjZWP3nz5pUkjR8/XsWKFZOzs7NKly6t1atXP7Of69ev68MPP5S7u7tcXFz0zjvvaM+ePZKkTZs2JTrGk59Nmzbp/v37qlOnjjJlyqRixYpp8+bNln63bdsmR0dHHT9+PMljszGbzeYkvwtIRSaTSQcOHFCBAmuVkHAmtcsBAAAA0gV7+/zKnn2wjh07Jk9PT9nZ2b30e0ePHq2goCB16NBBhQoVkiRlyZJFzs7O6tKli3x8fFSrVi0tWLBAFy9e1Pbt21WxYsVE/bRo0UJLlixRmzZtlC1bNv344496+PChrl+/rhs3bmju3LmWtrdu3dK4ceNUtGhRRUVFadGiRfr000/16aefatWqVcqdO7eioqJkMplUvnx51apVS6NHj076eUnyO5DsLl++rGnTpmnr1q26deuWHB0dVapUKXXo0EFVqlR5ZXXs3LlTH3/8sU6ePJki/Xt6eurHH3986l8OAAAAAP9eu3fvliR98cUXypo1q3LlyiVJatiwoSRp1qxZKlmypGrWrKlatWppypQpT80NJ06cUIYMGdS6dWtlzZpVmzdv1tmzZ2U2m1WgQAENGDDA0rZZs2ZydnbW8uXLlT17dplMJklSQECAjhw5ogcPHkiSpk6dqqtXr2rQoEGGxsby71R26tQpNWjQQHFxcZo+fbr27t2r//znP2rQoIG6d+9utSQBAAAAAF5HT0J12bJl5eHhoSJFimj79u0qUKCAJOmHH37QkSNH9PPPP0uSDh069NR+vvzySyUkJOj9999X5cqV9fvvv2vs2LHKkCGDVbvly5fr559/1tdff623335bktS6dWv5+PjI19dXR44c0eDBg3Xjxg0NHDhQI0aMUJYsWQyNjZnqVDZo0CBVqVJFw4cPt2xzdXVVw4YNlZCQoPj4eC1dulTz5s2Tq6urDh06pMGDB6tChQoaPny4Dh06pJs3bypnzpzq1q2bmjVrJklasGCBZs2apTt37ih37tz6+OOP1bx5c0lSaGiolixZotjYWOXLl0+ffvqpatasmai2jRs3KiwsTOfOnVNMTIxKlSqloUOHqmDBglq6dKkWL16sEiVKaNWqVbKxsZG/v7+Cg4Pl4OCg+Ph4jR49Wr/88otsbGzUqVMnq77XrVuniRMn6sqVK3J3d1f9+vX16aefpuCZBgAAAJAaYmNj5eLiotKlS6tr1666efOmhgwZosaNG2v37t3asmWLxowZozFjxqhUqVKSpOjo6Kf2lTt3buXMmVMNGjTQW2+9pa+++kqDBg1So0aNlD17dku7kJAQ5cyZU3369LFsy549u3bt2qWYmBhlyJBBNjY2+uSTT/TWW2+pdu3aatCggQ4dOqTq1atr2rRpiYL6sxCqU9GVK1e0f/9+/fDDD0/d37hxY0nS0qVLdfToUX333XeaOnWqEhIS1KNHD7m6umr16tVydHTUjz/+qJCQEH3wwQe6deuWhg8fruXLl+vNN9/U1q1b1b17d/n6+urMmTNatGiRli5dKjc3Ny1atEhff/21qlevnqi2Xr16acKECfL399ft27cVGBioyZMna9SoUZKkffv2qXr16tq6dauOHz+utm3b6p133lHdunU1ZcoUbdq0SUuWLFGOHDkUHBxs6fvhw4cKCgrS9OnTVbFiRR07dkwffvihqlatqtKlS6fIuQYAAACQOjJkyJBo5nn37t1asWKF/vjjD+3du1e7du1SfHy8cuXKpbfeektZs2ZN1E98fLyaN28uR0dHTZo0STY2Njp16pQmTZqkZcuWqWPHjpKkXbt2ae/everVq5cyZcqUqJ+MGTNKkvbu3avZs2crKipKw4cP1/79+/Xzzz/L19dX5cuXV69evV5qfCz/TkVXrlyRJHl4eFi2RUZGytvbW97e3vLy8tJ7770nSXJwcFDDhg3l6OgoZ2dnDR06VIMHD5aDg4MuX76sTJky6eHDh7p7967s7OxkNpsVHh6uvXv3qnLlyjpw4IDc3d3l5OSku3fv6qefftKxY8fUvHlzRUZGysHBwaq27Nmza/Xq1fL391d0dLSuXLmibNmy6erVq5Y2zs7O6tq1qxwcHFS6dGl5enrq7Nmzkh4vt+jYsaPy5cunjBkzasCAAbKxsbF675IlSxQZGanChQtr7969BGoAAADgX+jMmTPq06ePJk2aZNl2584dSdKePXvUoUMHRUdHq3r16jpw4IAkqVy5con6uXXrlm7cuKHY2FjFx8dL+r8ZbScnJ0u7lStXSpIaNWr0zJrMZrMCAwPVoUMHlS9fXqdOnVK+fPlUoUIFZcuWLUnPmWKmOhW5ublJkq5evWp5Al7lypUtj4RfunSp5RfPzc1Ntrb/9xnIhQsXNHLkSP35558qWLCg5V6EhIQE5c2bV3PnztWMGTPUtWtXmUwmNWnSREFBQfLy8lJoaKhlv7Ozs9q0aaNu3bpZ1ebg4KBVq1YpPDxcNjY2KlasmKKjo2Vv/3+/Mjly5LAKyg4ODnryMPlr164pd+7cln1ZsmSxfNrk7OyshQsXasqUKfr8888VHR2t9957TwMGDHjqJ1IAAAAAXl9ubm5asGCBbt68qcOHDys6OlpbtmyRj4+PatSoof79+2vr1q1q1qyZZs2aJUdHR/Xo0UOStGXLFm3ZskW1atVSpUqVVK5cOe3bt08ffPCB3n77bc2fP1+urq6qVauW5Xi7d++Wra2tfHx8nlnTDz/8oJMnT1oCeIECBTRnzhx17dpV//3vf1WwYMGXHh8z1akoT548KlWqlBYvXvzCtn8Pr/Hx8erSpYsaNmyonTt36qefflLbtm0t+2/evCmTyaTJkydr586dCgsL05o1a7RkyRJdvnxZOXLk0MyZM7Vr1y6NGDFCU6dO1ZYtW6yOFxERoXnz5mnu3LnavHmzpk+fruLFi7/02Dw8PHThwgXL65iYGN2/f1/S40+Trl27pjFjxmjHjh1atGiRjhw5oqlTp750/wAAAABeD5kzZ9aGDRtUq1YthYeHa/Xq1WrVqpVWrVolHx8fTZs2TSaTSRMnTlSRIkW0bt06y73VGzdu1MCBA7Vt2zZJ0urVq9W+fXsdPXpUc+bM0TvvvKNJkyZZJiwl6dKlS8qRI8dTl35L0t27d/Xll19a7ruWpP79+6ts2bKaO3euateurS5durz0+AjVqezbb7/V1q1bNXDgQMuj4KOjo/XLL78oNDRU7u7uid4THx+vhw8fytnZWTY2Nrp8+bLlPuf4+HhdvnxZHTp0UGRkpGxtbS2Pq8+WLZsOHz6sTp066cSJE3J0dFSOHDks+/7u/v37srW1lbOzs8xms7Zs2aJffvnFssziRZo3b64ZM2bojz/+0F9//aXvvvvO8gj7Bw8eqHPnzlq5cqXMZrPc3d1la2ubqAYAAAAA/w4lS5bU2rVrdffuXd25c0cLFiywZJ3OnTvr3LlzevjwoaKiouTn52d5X3BwsMxms/r27Svp8eTdrFmzdOXKFd2/f18bNmzQW2+9ZXWsw4cP69q1a8+sJWvWrLpy5Yq6d+9u2VawYEFFRkbqwYMHWrduXZJW0LL8O5UVK1ZMq1at0vTp09W1a1ddv35dNjY28vT0VKdOndS8eXOtWrXK6j0ZM2bUt99+qwkTJmjo0KHKkSOHWrRoodOnT+vUqVN67733NGjQIAUHB+vatWvKnDmzWrdurQ8++EA2Njb6888/1a1bN92+fVs5cuTQV199pTJlymjnzp2WYzRu3Fh79+5V3bp1ZWdnpzfffFNt27bV/PnzFRcX98Jxde7cWbGxsfroo4/06NEjtWjRQq6urpKkXLlyaeLEiRo/frwGDRokZ2dn1alTR+3atUvOUwsAAAAAKc7G/OQmWOA1YTKZdODAARUosFYJCWdSuxwAAAAgXbC3z6/s2Qfr2LFj8vT0lJ2dXWqXZMkGZcuWTbV6WP4NAAAAAIBBhGoAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVAAAAAAAYRKgGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBBhGoAAAAAAAwiVAMAAAAAYJB9ahcAGGVnl0u2to9SuwwAAAAgXbCzy53aJaRJhGq8trJkaS87O7vULgMAAABIN8zmBD16xMTW37H8G68tk8mU2iUghZlMJh07doxrnQ5wrdMXrnf6wbVOP7jW6UdCglnx8fGpXUaaQqgGkKbFxsamdgl4RbjW6QvXO/3gWqcfXGukV4RqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCBCNYA0LUOGDKldAl4RrjUAAHgd2ad2AYBRdnZ2qV0CUpidnZ2KFy+e2mXgFXjZa202mWTD330AAJCGEKrx2rr6xRcyHT+e2mUAeEUcihSRx4QJqV0GAACAFUI1XlvxZ84o/ujR1C4DAAAAQDrGPdUAAAAAABhEqAYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBBhGoAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVAAAAAAAYRKgGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCBCNZLk3LlzqV0CACTZrl275O/vryxZssjd3V2tWrXS5cuXJUm7d+9W5cqV5eLiohIlSmjJkiXP7MfGxuapP8HBwZKkfv36ydXVVe7u7goNDbW8786dO3Jzc9PMmTNTdJwAAODVI1T/y3h6eqp06dLy8vJS2bJl5ePjo27duum///3vS73/8uXL8vLysvxj09PTUzt37pQkjRgxQt9///0z33vx4kV5enrq4sWLifb1799f/fv3NzAiAPhnbt68qffff1+7du1S586dVbVqVYWHh6t58+a6efOmateurePHj6tTp06KjY1VixYtFBkZ+dS+QkJCrH5cXV2VIUMGffDBBzp+/LhGjRqlatWqydPTU71791ZMTIwkacCAASpYsKDat2//KocOAABeAfvULgDJb/r06apYsaIkKTo6Wn379lVQUJDmzZv3wve+8cYb2r9//1P33b59O1nrBIBX4dixYypUqJDq1aunIUOGyGw2K2fOnIqMjNSSJUt0584dffXVVxo2bJiqVaumZs2a6YcfflDlypUT9TVgwADLn0NDQ3Xnzh3NmjVLFStW1JEjRyRJNWrU0KVLl7R9+3aZTCYdOnRIYWFh2rp1q2xt+SwbAIB/G/7f/V/OxcVFLVq0sPxjT5L8/f21dOlSy+udO3fK09NT0rNnmydPnqyVK1dq5cqVatCgwT+qaenSpWrRooUGDRqkcuXKqWrVqpoyZYrMZvM/6hcAnqZatWrau3evhgwZIkk6cuSI7ty5o8KFC+vYsWOSZPlv4Ntvvy1JOnr06HP7vHLlir744gvVqlXLMvtcsmRJtW/fXkFBQQoNDdWgQYOUOXNm9ejRQx999JHlw04AAPDvQqj+l7t7965Wr16t2rVr/6N+unfvrvr166t+/fpasWLFP67r4MGDypAhgyIjI/X9999rzpw5z72PEQCSw6FDh/T+++8rISFBw4YNU3R0tCTJ2dnZ6n+fbH+WkSNHKjY2VsOGDbPaPmvWLMXGxiomJkbBwcFasGCBDh48qGHDhqlnz54qVKiQ/P39dfr06RQYHQAASA2E6n+hrl27ytvbW+XKlVOFChW0efNmBQQEpHZZVlxdXdW3b185OTmpVKlSCggISJawDgDPsnbtWlWtWlVXrlxRaGioWrRooUyZMkmS/vrrL0lSbGyspMerfJ4lPj5es2bNUpkyZVShQoVE+x0dHWVvb6/o6GgFBQUpODhYUVFRCg0NVVhYmO7fv6+goKAUGCEAAEgNhOp/oalTp2rPnj3at2+fDh48qG7duqlt27YvXM6YFCtWrJCXl5flZ8WKFXJycpIkmUymRO0fPXokR0dHy+s8efLIwcHB8jp37ty6du1astUHAH+3ZMkS1a9fXyaTScuWLVNgYKCk/1vuferUKav/LVGixDP72rJli+7evatGjRo995hPHmQWGBho6dfX11dFixbVyZMn/+mQAABAGsGDyv7lnJ2d1bFjR4WFhWnHjh0qUaKEbG1tFR8fb2lj5AFkDRo0SHRv9aNHj+Ts7KzLly+rQIECVvvOnz+vmjVrWl5fu3ZNZrNZNjY2kh7fy/3GG28kuQ4AeJGzZ8+qTZs2evTokfz9/XXo0CEdOnRIktSxY0f169dPoaGhio6O1ooVK2RjY6O2bdtKehygt2zZolq1aqlSpUqSHn8FlyTL66c5deqUxo8fr4iICNnb21v+m9ixY0etX79ePj4+KTlkAADwCjFT/S/36NEj/fzzz7p3757Kly8vSSpcuLA2bNighw8f6vr16/rxxx9fqi9HR0fdv3//mfvt7e1Vp04djR49Wn/88Yekx/cl/vDDDzp16pTq1KljaXv9+nWFhYUpPj5ehw4d0uLFi9W8efN/MFIAeLqwsDA9fPhQkvSf//xHAwcOtPw4ODjot99+U4kSJTR9+nQ5OTlp4cKFeueddyRJGzdu1MCBA7Vt2zZLf5cuXZIk5c+f/5nH7Nmzpxo0aCB/f39JUtOmTRUQEKBly5YpV65cGj58eEoNFwAAvGLMVP8Lde7cWXZ2dpIkGxsbFSxYUGPHjlW5cuUkSX379lVwcLCqVKkid3d3tW3bVnv37n1hv3Xq1FGfPn3k5+enTZs2PbXN4MGDNWnSJHXp0kU3b96Ug4ODSpUqpR9//FH58uWztHNzc9PFixdVtWpVZcqUSb169bIK3QCQXIYPH/7cEJszZ05t3779qfuCg4MVHBxstS00NFShoaHPPebatWutXjs4OCg8PPzlCgYAAK8VQvW/zMvcp1e0aFHNnz/falvLli0lSXnz5rXq4+9/rlSpkiIjI5/bt7Ozs/r27au+ffs+t52jo6NCQkIUEhLywnoBAAAAIK1i+TcAAAAAAAYRqgEAAAAAMIhQjVeuSZMm2rhxY2qXAQAAAAD/GKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBBhGoAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVAAAAAAAYRKgGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACD7FO7AMAohzfflO1ff6V2GQBeEYciRVK7BAAAgEQI1Xht5RoxQnZ2dqldBoBXyGwyyYa/9wAAIA1h+TdeWyaTKbVLQAozmUw6duwY1zodeNlrTaAGAABpDaEaQJoWGxub2iXgFeFaAwCA1xGhGgAAAAAAgwjVAAAAAAAYRKgGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEary27OzsUrsESDIlJKR2CQAAAECqsU/tAgCjeq9ep2PXb6Z2Gela0ZzZNbVh3dQuAwAAAEg1hGq8tv64eVuHrl5L7TIAAAAApGMs/wYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBBhGoAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVAAAAAAAYRKgGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCBCNYBX7tdff5WPj48yZcokd3d3tWnTRrdv335q2x07dqhcuXJycXGRt7e3Nm3aZNkXHR2tTz/9VHny5FGmTJnk7e2tNWvWWPb369dPrq6ucnd3V2hoqGX7nTt35ObmppkzZ6bYGAEAAJA+EKqhP//8M7VLQDpy48YNNWjQQFeuXFG3bt1UtWpVzZs3T3379k3U9sSJE/rss89048YNde7cWefPn9cHH3xg+Z399NNP9f3336tcuXLq1q2bTp06pUaNGuno0aM6fvy4Ro0apWrVqsnT01O9e/dWTEyMJGnAgAEqWLCg2rdv/yqHDgAAgH+hVAnV/v7+Wrp0aaLtS5culb+/v+F+27RpYzUb9W+SkJCgSpUqafHixVbbv/76a3l6emrr1q1W21u3bq0RI0a8sN/58+dr4MCBltfPujbJoX///urfv3+K9I3Xx/nz5xUbG6sSJUqoZcuWatGihSTJyckpUdt58+bp0aNHGjRokMaNG6cvvvhCDx8+1MKFC2U2m3X16lWVK1dOy5cv1+jRo9WpUyfFx8drx44dMplMkqQaNWqoQoUKMpvNMplMOnTokMLCwjRp0iTZ2vK5IgAAAP4Z+9QuAC/H1tZW1apVU1RUlJo3by7pcdD+7bff5OXlpfXr16tatWqSpAcPHujQoUPq3bv3C/u9detWSpYNJOLl5aXGjRtr2bJlWrdunSSpcuXKGjNmTKK2R48elSQVK1ZMkvT2229bttvY2FjeL0kmk0mRkZGSpOLFi6tkyZJq3769goKCZGdnp0GDBilz5szq0aOHPvroI1WsWDFFxwkAAID0IU1P05w/f15du3ZVxYoVVaNGDY0bN05xcXGSHs9qN2nSRB06dJC3t7dWrlxpeU+bNm3k4+Ojli1b6tChQ5b+9u3bp48//lhVq1ZVqVKl1KRJEx04cMCyf/v27WrWrJm8vLzk7++vefPmWfbt2LFDzZo1k7e3t+rWrasVK1ZY9iUkJCgsLEy1atVS+fLl1axZM6uZ4/+d/d25c6c8PT0tr0NDQ+Xr66sKFSqoadOm2rBhw1PPh5+fn3bu3Gk1HltbW3Xr1k0bN26U2WyWJO3evVsZM2ZUuXLlJEmrV69W/fr1Vb58eTVp0kTbtm2TJC1btkzTpk3Tnj175O3tneh4V69eVe/eveXv768yZcqoZs2aWrJkiWW/p6en5s6dq/fee09eXl5q2bKlTp48adm/YcMG1a1bV2XLllWXLl2s7pm9evWqOnXqpAoVKqh69eoKDAzUtWvXnjpu/Pu89dZbcnNz0/fff6927dopMjJSAwYMSNQuOjpakuTs7Gz1v0+2P/Hw4UO1bNlSUVFRqlOnjqpUqSJJmjVrlmJjYxUTE6Pg4GAtWLBABw8e1LBhw9SzZ08VKlRI/v7+On36dEoOFwAAAP9iqRaqhwwZIm9vb6ufIUOGWPbHxMSoXbt2Klq0qLZs2aIFCxZox44dVsu7jx49qvr162vHjh169913JT0Ocj179tSOHTvk6+urzp076969e3r48KG6deum9957T1u2bNHOnTuVP39+jRw5UpJ09uxZde3aVS1bttTu3bs1ceJEjR07Vlu3btWJEyfUrVs3ffLJJ9q5c6dCQkL07bffWoLz5MmTNX/+fE2YMEE7d+5Uhw4d9Omnn1oF+meJiorSokWLtHjxYu3cuVPNmzfX119/rfj4+ERtq1atqlu3blkCwIYNG+Tv76/KlSvrwYMHOnjwoKTHHw5Ur15d9vb22rx5swYPHqxBgwZp165d6tGjh3r06KHff/9djRs3VpcuXeTt7a09e/YkOt6AAQPk4OCg1atXa9++ffroo48UEhKiBw8eWNqsXr1a8+bN05YtW5QhQwbL+Txz5ox69eqlLl26aM+ePWrevLnVBw1jx46Vh4eHtm/frjVr1igmJkZhYWEvPF94/S1fvlzDhw9Xp06d1LVrV82YMUOurq6aOHGi5UOzJzJlyiRJ+uuvvyRJsbGxkiQXFxdLm+vXr1s+8PH399eiRYus+nB0dJS9vb2io6MVFBSk4OBgRUVFKTQ0VGFhYbp//76CgoJScsgAAAD4F0u1UD148GDt2bPH6mfw4MGW/Zs2bVJcXJw+++wzOTk5KXfu3OrVq5fmz59vaePg4KCGDRvK0dHRMoPVrFkz+fj4yMHBQV27dpWTk5M2b94sBwcHLVq0SK1bt1ZcXJwuXbokV1dXXb16VdLjcFiiRAk1a9ZM9vb2KlmypBYsWKASJUooPDxcNWvWVO3atWVnZ6dy5cqpRYsWllp+/vlnffLJJypRooTs7e1Vp04d+fv7W83qPouTk5Pu3r2rn376SceOHVPz5s0VGRkpBweHRG2zZs0qLy8vRUVFSXocqmvWrClHR0dVrVrVMsMdGRlpuTd93rx5atWqlXx8fGRnZ6caNWrI399f4eHhL6xt6NChGjx4sBwcHHT58mVlypRJDx8+1N27dy1t2rRpIzc3N2XOnNnqAVJr1qxRyZIl1aBBA9nb26tWrVqqUaOG1bj37t2r1atX68GDB5oxY8ZTZyrx7/NkNcOT36O4uDjFxcXJ3t5ednZ2Vm3feustSdLvv/8uSTp16pQkqUSJEpIer3ioVq2aduzYofbt22vt2rVWgfvvQkJC5OrqqsDAQEs/vr6+Klq0qNUKCwAAACAp0uw91ZcuXdKtW7fk4+Nj2WY2mxUfH6+bN29Kktzc3BI9aChv3ryWP9vY2MjDw0NXr16VnZ2ddu7cqc6dOysmJkZFihSRvb29Zcn0tWvX9MYbb1j19eQf9JcuXVJUVJTVEmmTyaT8+fNLevw043z58iWq48SJEy8cp5eXl0JDQzV37lzNmDFDzs7OatOmjbp16/bUhyj5+voqKipKFSpU0PXr11W5cmVJUs2aNTV79my1adNGf/75p+X+6kuXLmnXrl1auHChVe2VKlV6YW0XLlzQyJEj9eeff6pgwYIqUKCApMfL3Z/ImTOn5c9/P59Xr15NdD7z589vWQI+YMAATZs2TTNnzlT//v311ltvacCAAU9dho5/l9q1a+vrr7/WjBkzZGtrq6NHjyomJkZt27bVxYsXNXfuXBUtWlQBAQFq1aqVxo0bp+DgYB0/flzz58+Xk5OTWrZsKUlq27atTp48KTc3N7355puWh/PVqlXL6nf81KlTGj9+vCIiImRvb2/5Xe7YsaPWr19v9d8ZAAAAICnSbKj28PBQ/vz5tXbtWsu26Oho3bx5U9mzZ5f0ODT/r7/fl5uQkKDLly8rT548OnjwoEJCQhQeHq6SJUtKeny/5dmzZyVJuXPn1ubNm636+vnnn5UjRw55eHiocePG+uabb6yO8yRA5smTRxcuXLB674ULF+Tu7i7p8UPG/r6c++/3Fl++fFk5cuTQzJkzFRcXp8jISAUGBqpEiRLy8/NLND4/Pz/Nnj1bmzZtUrVq1eTo6Cjpcdj++uuvtWbNGnl7eytz5syW89ioUSN98sknVsd8MrP/LPHx8erSpYs+++wztW7dWjY2Njpy5IjVveTP4+HhYfV9wpJ05coVyxOejx07poCAAPXo0UO3bt3S5MmTFRgYaJmFx7+Xl5eXIiIiNGTIEM2ePVtZs2ZVYGCghg8frj179mjgwIGqW7euAgICVKZMGY0fP14zZ85UWFiYihUrpoULF6pQoUI6efKk5UFl169ft3qKvbOzs1Wo7tmzpxo0aGBZwdG0aVMFBARo2bJlKliwoIYPH/5qTwIAAAD+NdLsg8pq1KhhWRYcFxene/fu6YsvvlCfPn2eGqafWLJkiQ4ePKi4uDiFhobK3t5evr6+un//vmxtbS1h8sCBA/rxxx8t93DWrVtXx44d0y+//CKTyaQjR47ou+++k729vZo1a6ZVq1Zp27ZtSkhI0J9//qmPPvpIs2bNkiQ1b95cYWFhOnr0qEwmkyIiIrRx40Y1btxYklS4cGFt2LBBDx8+1PXr1/Xjjz9a6j18+LA6deqkEydOyNHRUTly5JAkZcuW7anjK1asmDJkyKCffvrJ6uvHsmXLprJly2rOnDlWy6xbtGihH3/80XJ/9+HDh9WkSROtWrVK0uNl2NHR0ZYPCJ6Ij4/Xw4cP5ezsLBsbG12+fFmjRo2y7HuRBg0a6NSpU/rpp5/06NEjbdu2TevXr7fsnzp1qkJCQhQdHa0sWbIoQ4YMzxwz/n3effddbdu2TdHR0bp06ZJCQ0Pl4uIiPz8/mc1my++n9PjJ4Hv27FF0dLT27dtn+b339PSU2Wx+6s//fuf12rVrrb6OzsHBQeHh4YqOjtaRI0dUpkyZVzNwAAAA/Ouk2ZlqFxcX/fDDD/ruu+80Y8YMJSQkqGLFivr++++f+77atWtr8ODBOn/+vEqWLKmZM2cqY8aMqlKlilq3bq0PP/xQCQkJyps3r9q0aaMxY8boxo0byp8/v8LCwjRmzBiFhIQoR44c6t+/v6pWrSrp8YO1xo4dq169eilDhgyqV6+ePvvsM0lS+/btlZCQoD59+uj69esqUKCAxo4dqwoVKkiS+vbtq+DgYFWpUkXu7u5q27at9u7dK0l677339Oeff6pbt266ffu2cuTIoa+++uq5/8ivXr26fvrpp0Qz2TVr1tSIESOswvb777+vmJgYffXVV7p8+bJcXV3Vrl07tWnTRtLjDy8WLlyo8uXLW80sZ8yYUd9++60mTJigoUOHKkeOHGrRooVOnz6tU6dOqVChQs+9Dvny5dPUqVP13XffadiwYSpRooTlYXKS9M0332jIkCGqWbOm4uLiVLJkSU2YMOG5fQIAAABAWmNj/t8pSiCNM5lMOnDggAYeOqHd/72S2uWka6VzuWtDxzYp1v+Ta122bNlEDzHDvwvXOn3heqcfXOv0g2udfqS1a50W6kmzy78BAAAAAEjrCNUAAAAAABhEqAYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBBhGoAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVAAAAAAAYRKgGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCD71C4AMKpwjmz6KyEhtctI14rmzJ7aJQAAAACpilCN19b4uu/Jzs4utctI90wJCbKzZdELAAAA0if+JYzXlslkSu0SIBGoAQAAkK7xr2EAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVAAAAAAAYRKgGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEary27OzsUruENMNsNqd2CQAAAEC6ZJ/aBQBGHTx4UA8ePEjtMlKdi4uLvLy8UrsMAAAAIF0iVOO19eDBA927dy+1ywAAAACQjrH8GwAAAAAAgwjVAAAAAAAYRKgGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBBhGoAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVQDq2efNm2djYWP3kzZv3qW3bt2+fqO2AAQMs+5cuXarSpUvL2dlZRYoU0Zw5cyz7+vXrJ1dXV7m7uys0NNSy/c6dO3Jzc9PMmTNTbpAAAABACrJP7QLw6nh6esrJyUl2dnYym81ycHCQt7e3Bg0apNy5c6d2eUgFu3fvliR16NBBhQoVkiRlyZLlmW1dXV31+eefW7ZVq1ZNkhQREaGmTZuqRIkS6tGjhxYsWKD27durZMmSypgxo0aNGqV69erpzp076t27tzp27KiMGTNqwIABKliwoNq3b5/CIwUAAABSBqE6nZk+fboqVqwoSYqOjlbfvn0VFBSkefPmpXJlSA1PQvUXX3yhrFmzKleuXE9t9+DBAx0/flx+fn7q0qWLMmbMqEyZMln2jxs3TpK0fPlyubq66pNPPlFMTIwKFy6sP//8U5JUo0YNXbp0Sdu3b5fJZNKhQ4cUFhamrVu3ytaWRTMAAAB4PfEv2XTMxcVFLVq00JEjRyzb/vjjD3Xp0kV+fn4qXbq06tSpo99++02SdPHiRXl6euq7776Tj4+PhgwZotDQUHXo0EFNmzZVhQoVtHv3bkVHR+ubb76Rr6+vKleurD59+ujGjRtWfSxevFj+/v4qX7682rdvrytXrqTKOUjvnoTqsmXLysPDQ0WKFNH27dsTtdu7d68SEhIUGRkpd3d3Zc6cWc2bN9e9e/cs+21tbdWnTx/lzJlTpUuX1vr16+Xi4qKSJUuqffv2CgoKUmhoqAYNGqTMmTOrR48e+uijjywf8gAAAACvI0J1Onb37l2tXr1atWvXtmzr0aOHihUrpvXr12vPnj2qWrWqgoODrd734MEDbd++XX369JEkRUZGqm/fvvrtt9/k5eWlr776SufOndPSpUv166+/ysXFRYGBgTKbzZY+Nm3apF9++UXr1q3TjRs3NGXKlFcyZvyf2NhYubi4qHTp0hozZoxCQkJ07tw5NW7c2BKWn7h69aoKFiyohg0bavbs2apbt66WLFmioKAgSY9/lxISEhQXF6dZs2apUKFCCgoK0vr16yVJs2bNUmxsrGJiYhQcHKwFCxbo4MGDGjZsmHr27KlChQrJ399fp0+ffuXnAQAAAPgnWP6dznTt2lV2dnZKSEjQgwcPlDlzZk2bNs2yf9q0acqVK5fMZrMuXbqkLFmy6OrVq1Z9NGrUSI6OjnJ0dJQk5cuXT5UrV5Yk3bx5U+vWrVNERIRy5MghSfrqq6/k7e2to0ePytXVVZLUuXNny727/v7+2r9/f0oPHf8jQ4YMOnTokNW23bt3a8WKFdqzZ4/8/f0t25s3b67mzZtbXjds2FDZs2dXRESEJClTpky6d++epk2bpgIFCihLlixq1qyZIiIi9O6770qS5fclOjpaQUFBCg4OVlRUlEJDQ/Wf//xHX331lYKCgrRs2bKUHjoAAACQbAjV6czUqVMty20fPnyo+fPnq23btlq0aJFKlCihEydO6NNPP9X169dVuHBhZc+e3WqGWZLc3d2f+frSpUuSpBYtWli1sbOz08WLFy2hOmfOnJZ99vb2iY6BlHfmzBmFhoaqcOHCCgwMlPT4adzS41sD/m7x4sXauHGjunTporJlyyZqV7p0aW3btk1Xr15VgQIF9OjRI0myuu/6iZCQELm6uiowMFBjxoyRJPn6+qpo0aI6cOBACowUAAAASDmE6nTM2dlZHTt2VFhYmHbs2KGcOXOqV69emjRpkmWWct26dfrPf/5j9T4bG5tnvn7yoKuIiAi5ublZtp8+fVr58uXT9evXU2o4SCI3NzctWLBAN2/e1OHDhxUdHa0tW7bIx8dHuXLl0tChQ1W0aFEFBATIbDZr6tSpWrNmjVq3bq1Vq1ZJkrp37y5JCgwM1LZt2xQQEKCAgAAtXLhQDg4OatasmdUxT506pfHjxysiIkL29vYqUKCAJKljx45av369fHx8Xu1JAAAAAP4h7qlOxx49eqSff/5Z9+7dU/ny5fXgwQOZTCZlyJBB0uMgPHnyZElSXFzcS/WZK1cu+fn5adiwYbp9+7bi4+P1/fffq1mzZonu00Xqypw5szZs2KBatWopPDxcq1evVqtWrbRq1SqdPXtWAwcO1Ny5cyU9Xnkwffp0ZcyYUePGjdODBw80btw4S6gOCAjQ9OnTZWdnpwkTJihHjhz65ZdfVKZMGatj9uzZUw0aNLB8aNO0aVMFBARo2bJlypUrl4YPH/5qTwIAAADwDzFTnc507txZdnZ2kh7PMBcsWFBjx45VuXLlJEn9+vVTUFCQYmNj5eHhoRYtWmjUqFE6deqUZen2i4wcOVJjxoxRo0aNFB0draJFi2rGjBlyc3PTxYsXU2poMKBkyZJau3Ztou3u7u6JluR36tRJnTp1emZfL9ovKdGxHBwcFB4enoSKAQAAgLSFUJ2OnDx58oVtOnbsqI4dO1pta9u27TP76NGjR6I+smbNqm+++eap/efNm/el+gAAAACA1wHLvwEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBBhGoAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVAAAAAAAYRKgGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGCQvdE33rp1S9mzZ0/OWoAkyZQpU2qXkCa4uLikdgkAAABAupWkUP3o0SOFhoZq3rx5MplMWrlypXr37q3vv/9e7u7uKVUj8FRlypSRnZ1dapeRJpjNZtnY2KR2GQAAAEC6k6Tl36GhoYqKitKECRPk4OCgHDlyyMPDQ8OGDUup+oBnMplMqV1CmkGgBgAAAFJHkmaqV65cqYULFypXrlyysbFRxowZNXz4cL377rspVR8AAAAAAGlWkmaqY2JiLPdRm81mSZKzs7NsbXneGQAAAAAg/UlSGi5btqwmTZok6f+Wm86dO1elSpVK/soAAAAAAEjjkrT8++uvv1bbtm21bNkyPXjwQHXq1NGDBw80e/bslKoPAAAAAIA0K0mhOl++fFq9erU2bdqkS5cuycPDQ35+fnylDwAAAAAgXUryzdBxcXH666+/lJCQkBL1AAAAAADw2kjSTPXevXvVrVs3ZciQQR4eHrp8+bK+++47zZ49W0WLFk2pGgEAAAAASJOSNFP97bffqkOHDtq8ebMWLVqkLVu2KCAgQN98801K1QcAAAAAQJqVpFB95swZderUyfLaxsZGXbt21bFjx5K9MAAAAAAA0rokhepChQpp//79Vtt+//13FSlSJFmLAgAAAADgdZCke6orVqyorl27qmnTpipQoICuXbumxYsXq0KFCpbvr5akwMDAZC8UAAAAAIC0Jkmh+siRIypevLiOHz+u48ePS5IKFy6smzdv6ubNm5IeLwkHAAAAACA9SFKonjZtmjJmzJhStQAAAAAA8FpJ0j3VVapU0Zdffqk9e/akVD0AAAAAALw2khSqf/zxR2XKlEmBgYGqXbu2pk6dqqtXr6ZUbQAAAAAApGlJWv5dqlQplSpVSv3799fGjRu1Zs0aNWjQQKVLl1bTpk1Vs2ZNOTg4pFStgBU7O7sU6ddkTpCdTZI+bwIAAACQTiUpVFveZG+v/PnzK2/evHJ1ddXx48cVFhamYcOG6dtvv1W1atWSu04gkb6HftKxB/9N1j6LuuTSpLIfJmufAAAAAP69khSqr169qpUrV2r58uU6e/asfH191a9fP/n5+cnOzk7h4eHq37+/tm/fnlL1AhZ/PLimI/cupXYZAAAAANKxJIXqGjVqqHDhwmrcuLEaNmyoHDlyWO2vVKmSVq9enawFAgAAAACQVr1UqK5fv75WrlyphQsXqkyZMs9sV7BgQc2dOzfZigMAAAAAIC17qacxXbx4UZKeG6gBAAAAAEhvXipU29jYpHQdAAAAAAC8dl5q+XdcXJwmTZr03DaBgYHJUhAAAAAAAK+LlwrVCQkJ2rlz5zP3M5MNAAAAAEiPXipUOzs78wAyAAAAAAD+x0vdUw0AAAAAABJ7qVBtNptTug4AAAAAAF47LxWq9+/fn9J1AAAAAADw2mH5NwAAAAAABhGqAQAAAAAwKEmhOiYmJqXqAAAAAADgtZOkUF2vXj1FR0enVC0AAAAAALxWkrz8OzY2NiXqAAAAAADgtWOflMYVK1ZU8+bNVb16dbm7u1vtCwwMTNbCAAAAAABI65IUqi9evKh8+fLp7NmzOnv2rGW7jY1NshcGAAAAAEBal6RQPXfu3JSqAwAAAACA106S76n+448/NHToUAUGBur27duaN29eStQFAAAAAECal6RQvX37djVv3ly3b9/Wjh079PDhQ02ePFlhYWEpVR8AAAAAAGlWkkL12LFjNW7cOI0ZM0Z2dnbKnTu3wsLCtGjRopSqDwAAAACANCtJofrcuXOqXr26pP97OFmpUqV09+7d5K8MAAAAAIA0Lkmh+o033tC+ffusth0+fFi5c+dO1qIAAAAAAHgdJOnp3126dFG3bt3UqlUrxcfHa/r06Zo7d64+++yzlKoPAAAAAIA0K0mhum7dunJxcdH8+fP1xhtvKCoqSl9//bXee++9lKoPAAAAAIA0K0nLv48cOSJfX1+FhYVp9erVmjlzJoEa+Jvx48fLxsZGo0ePfur+hIQEDRw4UPnz51eGDBlUrFgxTZkyxarN0qVLVbp0aTk7O6tIkSKaM2eOZV+/fv3k6uoqd3d3hYaGWrbfuXNHbm5umjlzZsoMDAAAAMBTJSlUf/jhh2rYsKHmzZun+/fvp1RNwGvn0aNHGjVqlPr27fvcdlOnTtXQoUNVtGhR9ejRQ3Z2durevbu2bt0qSYqIiFDTpk2VkJCgHj16KDY2Vu3bt9fevXt1/PhxjRo1StWqVZOnp6d69+6tmJgYSdKAAQNUsGBBtW/fPsXHCgAAAOD/JClUb9u2TQEBAVqxYoWqVq2qzz//XJGRkSlVW7rg6ekpT09PnTlzJtG+2bNny9PT02pGEmlTiRIl9OWXX6pw4cLPbXfixAlJUr169dSqVSv5+PhIkhwdHSVJ48aNkyQtX75c/fv316ZNm7R//355enrKZDJJkmrUqKEKFSrIbDbLZDLp0KFDCgsL06RJk2Rrm6S/0gAAAAD+oST9Czxz5sxq3bq1fvrpJy1dulR58+bVl19+qXfffTel6ksXsmXLpmXLliXavnTpUrm4uKRCRUgqPz8/7dy5U61atXpuu65du+qNN97QZ599pnLlymnu3LkaP368KlasKEnau3evbG1t1adPH+XMmVOlS5fW+vXr5eLiopIlS6p9+/YKCgpSaGioBg0apMyZM6tHjx766KOPLH0AAAAAeHUMTWvFxMTo0KFDOnz4sO7evavSpUsnd13pSv369bV8+XIlJCRYth06dEhxcXEqXry4ZVt0dLQGDBig2rVrq2zZsqpWrZqmTp1q2e/v769p06apUaNG8vLyUqNGjRQVFWXZf+zYMbVq1UpeXl5q2LChvv/+e/n7+0t6HOCbNGmiDh06yNvbWytXrtTDhw81cuRI+fr6ysfHR23atNGhQ4ckSRMmTFDLli2txjFq1Ch98sknkqQbN26ob9++qlKliqpWrapBgwYpOjpa0uOl0sHBwapSpYoqVqyo1q1ba+/evcl8Vl+tadOmqXz58i9slyVLFuXPn181a9bUrFmz9NZbb6l///7atWuXJOnu3btKSEhQXFycZs2apUKFCikoKEjr16+XJM2aNUuxsbGKiYlRcHCwFixYoIMHD2rYsGHq2bOnChUqJH9/f50+fTpFxwsAAADgsSSF6h07digoKEhVqlTRrFmz5Ovrq02bNmnMmDEpVV+64Ofnp/j4eO3YscOybcmSJWrWrJlVu9GjR+vixYtasmSJ9u/frwEDBmjcuHE6d+6cpc3PP/+sCRMmaMeOHXrrrbcUHBws6XEg79SpkypVqqSdO3dq5MiR+umnn6z6P3r0qOrXr68dO3bo3XffVXBwsLZt26Yff/xR27dvV61atdSuXTtdvnxZzZo108GDB/Xnn39Kkkwmk1asWKFmzZopISFBn376qWxtbbVu3TqtXLlS165d06BBgyQ9Xtq8f/9+RUREaMeOHfLx8dGQIUNS4MymPYGBgYqKitKUKVPUvn17DRs2TA8fPtTkyZMlSZkyZZL0OKS3b99eISEhkh7fa/2Eo6Oj7O3tFR0draCgIAUHBysqKkqhoaEKCwvT/fv3FRQU9OoHBwAAAKRDSQrV3bt3l6Ojo2bPnq2VK1eqbdu2ypo1a0rVlm7Y29urfv36liXgDx8+1Lp169SoUSOrdj169ND48ePl4uKiK1euyMnJSZJ07do1S5tmzZqpQIECypAhg+rXr28JvRs3bpSdnZ169OghR0dHeXp6qlOnTlb9Ozg4qGHDhnJ0dJSNjY1WrVqlzz//XAUKFJCjo6Patm2rN998U6tWrVKePHn0zjvv6JdffpH0+H57k8mkGjVq6MiRIzp69KgGDx4sFxcXZcuWTV988YVWr16t27dvy9nZ2fLhwNmzZ9WrVy+tWLEiZU5uGnPy5ElJj2ekJVlm759cyyerPq5evSrp8ay+9H9h++9CQkLk6uqqwMBAnTp1SpLk6+urokWLWo4DAAAAIGUl6Xuqt23bZvnH/c2bN5U1a1bZ2yepCzxDkyZNFBAQoOjoaP36668qV66c3NzcrNrcvHlTw4YN07Fjx5Q3b16VLFlSkqyWjefMmdPyZ3t7e5nNZknSlStX9MYbb1g9yCpfvnxW/bu5uVn23717V/Hx8cqbN69Vm7x58+rixYuSpObNm2vkyJHq1auXli1bpoYNG8rBwUEXL16UyWSSr6+v1XsdHR114cIF1a1bV/Hx8Vq8eLHGjh2rHDlyqGvXri+8H/l1dO7cOc2dO1dFixZVQECAPvjgA504cUIffvihGjdurDlz5sjGxsaylD4wMNDyQMCAgAAtXLhQDg4OiVYtnDp1SuPHj1dERITs7e1VoEABSVLHjh21fv16ywPQAAAAAKSsJM1UOzo66ttvv5WXl5eqVq2q8uXLa+DAgYqLi0up+tKNt956S2+++aYiIiK0dOnSRCFKknr16qWSJUsqMjJSy5Yt02efffbS/b/xxhu6fPmyJWRL0uXLl63a2NjYWP6cM2dOOTk56cKFC1Ztzp8/L3d3d0lSzZo1FRsbqy1btmjjxo2Wmj08POTs7KydO3dqz5492rNnj3bs2KFffvlFxYsX19mzZ1WiRAnNnz9fe/bsUZ8+fRQcHKzff//9pcfzujh79qwGDhyouXPnSpJGjBihIUOG6NGjRwoNDZWbm5sWLlxoubc9ICBA06dPl52dnSZMmKAcOXLol19+UZkyZaz67dmzpxo0aGB5X9OmTRUQEKBly5YpV65cGj58+KsdKAAAAJBOJSlUT5kyRTt37tT48eO1atUqjR8/XgcPHtT48eNTqLz0pUmTJvrhhx909uzZRLO8knT//n05OzvLzs5Ot27d0tChQyVJ8fHxL+zb399fZrNZU6dOVVxcnM6cOaOZM2c+s72tra2aNm2qsWPH6ty5c4qLi9OcOXN0+vRp1a1bV9Lj5eKNGjXSkCFDVKJECcvXSZUuXVoFChTQd999pwcPHujhw4f69ttv1a5dO5lMJv32228KDAzUxYsX5ezsLFdXV9nb2ytz5sxGTluaEhwcLLPZbPm+aj8/P5nNZq1atUrS43M2aNAgnTlzRjExMTp8+LACAgKs+ujUqZNOnz6t2NhY7du3T3Xq1El0nLVr12rx4sWW1w4ODgoPD1d0dLSOHDmSKIQDAAAASBlJCtUrV67UpEmT5Ovrq8KFC6tGjRqaNGmSVq5cmVL1pSv16tXTuXPn1KBBg6cuqx8+fLjWrFmjcuXKqUmTJsqVK5eKFy9uuZ/2eTJmzKgpU6Zow4YNqlChgj777DNVqVJFDg4Oz3xPv379VLVqVbVr104VK1ZURESEZs6cqUKFClnaNG/eXJcuXbKaWbe3t9e0adN048YN1a5dW1WrVtX58+c1e/ZsOTk56eOPP5afn59atmypsmXLatSoURo3bpw8PDySeMYAAAAAIHXZmP++HvgFfHx8FBkZaRX44uPj9c4772j37t0pUiCSx+3bt3XmzBmrr32aO3euVq9erfDw8FSsLOlMJpMOHDigIbHbtPfe+WTtu2SWPFpX9eWX1SNlPbnWZcuWlZ2dXWqXgxTEtU5fuN7pB9c6/eBapx9p7VqnhXqSNFPt6emZKICFh4erWLFiyVoUkp/JZFLbtm21efNmSdLFixe1YMEC1ahRI5UrAwAAAIDXV5Ie3d27d2916NBBK1asUL58+XT+/HmdPn36uffmIm3ImTOnxo8fr9GjR6t3797KkiWLGjdurI4dO6Z2aQAAAADw2kpSqPb29tby5cu1cuVK3bhxQ++++67Gjx+vPHnypFR9SEa1atVSrVq1UrsMAAAAAPjXSFKoNplMKlSokHr27ClJunr1qnLlypUihQEAAAAAkNa99D3Vo0eP1oABAyyvb926JX9/f40aNSpFCgMAAAAAIK17qVC9aNEirVixQvXr17dsy5YtmyZOnKhly5ZZfV8uAAAAAADpxUst/w4PD9eYMWPk4+Nj2WZjY6OaNWvKzs5OEydOVPPmzVOsSAAAAAAA0qKXmqm+ePGiVaD+u6pVq+r8+eT9rmAAAAAAAF4HLxWq7e3tFRcX99R9CQkJaeJLvwEAAAAAeNVeKlSXKlVKv/7661P3rV+/XoULF07WogAAAAAAeB28VKj++OOPNWTIEK1bt04mk0mS9OjRI61bt04hISH66KOPUrRIAAAAAADSopd6UFnVqlXVrVs3ff7557K3t1fWrFl1584dJSQkqEePHqpTp05K1wkAAAAAQJrzUqFaktq1a6c6depoy5YtunXrltzd3VWtWjXlyJEjJesDAAAAACDNeulQLUnu7u5q1qxZStUCAAAAAMBr5aXuqQYAAAAAAIkRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMeqkHlfn7+8vGxua5bTZs2JAsBQEAAAAA8Lp4qVDdo0cPSdLRo0e1YcMGtW/fXvnz59d///tfzZ49WzVr1kzRIgEAAAAASIteKlQ3btxYkjR79mzNmDFDhQsXtux755139Mknn+iLL75ImQoBAAAAAEijknRP9YULF5Q/f36rbbly5dK1a9eStSgAAAAAAF4HSQrVJUuW1IgRIxQXFydJio2NVUhIiMqXL58ixQEAAAAAkJa91PLvJ4YMGaIuXbooPDxc2bJl0+3bt1WoUCGFhYWlVH0AAAAAAKRZSQrVb775piIiIrRv3z5du3ZNHh4eKleunGxt+WYuAAAAAED6k6RQLUkJCQnKnz+/8ubNK0m6cuWKJOmNN95I3soAAAAAAEjjkhSqIyIiNGjQIEVHR1u2mc1m2djY6Pjx48leHAAAAAAAaVmSQnVoaKg+/PBDNW7cWPb2SZ7kBgAAAADgXyVJyfi///2vAgMDCdRIEwpnctdfMiVrn0VdciVrfwAAAAD+3ZKUjkuUKKHTp0/rrbfeSql6gJc2unQL2dnZJXu/JnOC7Gx4+B4AAACAF0tSqC5XrpzatWun999/Xzlz5rTaFxgYmKyFAS9iMplSJFQTqAEAAAC8rCSF6v3796to0aL6448/9Mcff1i229jYJHthAAAAAACkdUkK1XPnzk2pOgAAAAAAeO0k+YljUVFRunr1qsxmsyQpPj5eJ0+e1IABA5K9OAAAAAAA0rIkheqhQ4cqPDxcmTJlkvT4ntYHDx6oWrVqKVIcAAAAAABpWZJCdUREhObNm6fY2FitWLFC3377rUaMGKGYmJiUqg8AAAAAgDQrSaE6NjZWZcuW1fXr13X06FHZ2NgoMDBQderUSan6AAAAAABIs5L03UEeHh66efOm3NzcdOXKFcXHx8vZ2VnR0dEpVR8AAAAAAGlWkmaqfX191a5dO82ZM0c+Pj766quv5OTkpIIFC6ZQeQAAAAAApF1Jmqn+7LPP1LBhQzk4OGjQoEG6c+eOTp8+rZCQkJSqDwAAAACANCtJM9UODg7q1KmTJClz5syaPn26TCaTzp8/nyLFAQAAAACQliVppvppbty4wYPKAAAAAADp0j8O1ZJkNpuToxsAAAAAAF4ryRKqbWxskqMbAAAAAABeK8kSqgEAAAAASI9e6kFlu3fvfua+W7duJVsxAAAAAAC8Tl4qVLdp0+a5+1n+jdRgZ2eXrP2ZEkyys03ePgEAAAD8u71UqD5x4kRK1wEkWfew7jpy/kiy9OWZx1MzA2cmS18AAAAA0o8kfU81kJb8fvl3HfzzYGqXAQAAACAd40FlAAAAAAAYRKgGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBBhGoAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVAAAAAAAYRKgGksn48eNlY2Oj0aNHP3W/n5+fbGxsEv34+flZ2hQqVCjR/l9//VWS1K9fP7m6usrd3V2hoaGW99y5c0dubm6aOXNmio4PAAAAQGL2qV0AUt+gQYO0cuVKSdKjR48UHx+vDBkyWPZPnz5d3t7eqVVemvfo0SONGzdOX3755XPbdezYUbVq1bK8XrJkiQ4ePKimTZtKkm7cuKE///xTXl5eatKkiaVdkSJFdPz4cY0aNUr16tXTnTt31Lt3b3Xs2FEZM2bUgAEDVLBgQbVv3z5lBggAAADgmQjV0DfffKNvvvlGkrR06VJNmjRJGzduTOWqXh8lSpTQH3/8ocKFC+vUqVPPbNemTRvLn/ft26dvvvlGH3/8sXr06CFJ2r17tySpUaNG6tChg9zd3WVv//iv6JEjRyRJNWrU0KVLl7R9+3aZTCYdOnRIYWFh2rp1q2xtWXgCAAAAvGr8KxzPdfHiRXl6euq7776Tj4+PhgwZIklavXq16tevr/Lly6tJkybatm2b5T1xcXGaMGGCatasqQoVKqhz5846d+6cZf+CBQtUq1YteXt7q379+lq8ePErH1dy8vPz086dO9WqVauXfk+nTp2UJUsWTZw40bLtSaj+7rvvlCdPHmXOnNlyvkuWLKn27dsrKChIoaGhGjRokDJnzqwePXroo48+UsWKFZN3UAAAAABeCqEaL+XBgwfavn27+vTpo82bN2vw4MEaNGiQdu3apR49eqhHjx76/fffJUnjxo3Tpk2b9MMPP2jr1q0qU6aMOnTooL/++ksXLlzQ8OHDFRYWpj179qhfv34KCQnRtWvXUnmExk2bNk3ly5d/6fYrVqzQ/v371a9fP2XNmtWyPTo6Wvny5VOPHj00c+ZMFSxYUMHBwVq4cKEkadasWYqNjVVMTIyCg4O1YMECHTx4UMOGDVPPnj1VqFAh+fv76/Tp08k+RgAAAABPR6jGS2nUqJEcHR2VJUsWzZs3T61atZKPj4/s7OxUo0YN+fv7Kzw8XGazWeHh4frss8+UL18+OTk5qXv37oqPj9emTZtkZ2dnabN3715VrlxZBw4ckLu7e2oP8ZWZOnWq7O3tE90DPXLkSJ0/f14jRoxQhw4d9O2330qSIiIiLG0cHR1lb2+v6OhoBQUFKTg4WFFRUQoNDVVYWJju37+voKCgVzoeAAAAID3jnmq8lL+H3kuXLmnXrl2WGVRJMplMqlSpkm7duqWYmBj16tXL6h7f+Ph4Xbp0Se+9957mzp2rGTNmqGvXrjKZTGrSpImCgoLk5OT0SseUGh48eKDffvtNVapUkZubm9W+4cOH68yZM5o4caIyZMigO3fuSJJcXFwS9RMSEiJXV1cFBgZqzJgxkiRfX18VLVpUBw4cSOlhAAAAAPj/CNV4KTY2NpY/e3h4qFGjRvrkk08s2y5fvixnZ2e5urrKyclJs2bNUtmyZS37z5w5o1y5cunmzZsymUyaPHmyEhIStG/fPsvS5Q8//PBVDinFnTt3TnPnzlXRokUVEBAgSTp8+LAePnyoSpUqJWp/4cIFzZgxQ8eOHVPVqlU1c+ZM2dvbq0uXLlbtTp06pfHjxysiIkL29vYqUKCApMdPF1+/fr18fHxSfnAAAAAAJLH8Gwa0aNFCP/74ow4dOiTpcVBs0qSJVq1aJVtbWzVr1kxjxozRlStXlJCQoGXLlqlevXo6d+6cLl++rA4dOigyMlK2trbKlSuXJClbtmypOaQUcfbsWQ0cOFBz5861bLt06ZIkKX/+/Inajxs3Tp9//rnOnTunCRMmqGDBglqzZo3KlClj1a5nz55q0KCB/P39JUlNmzZVQECAli1bply5cmn48OEpOCoAAAAAf8dMNZLs/fffV0xMjL766itdvnxZrq6uateuneUro7744guFhoaqdevWunPnjvLly6eJEyeqePHikh5/L3ZwcLCuXbumzJkzq3Xr1vrggw9Sc0jJIjg4WMHBwZbXfn5+MpvNVm2aNm2aaNsTTk5OGj16tEaPHv3c46xdu9bqtYODg8LDw40VDQAAAOAfIVTDSpMmTdSkSRPL67x58+rkyZMvbPd3Tk5O6tu3r/r27fvU/c2aNVOzZs2Sp2AAAAAASEUs/wYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBBhGoAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVAAAAAAAYRKgGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBB9qldAGBU0TeK6q9HfyVLX555PJOlHwAAAADpC6Ear63Jn0yWnZ1dsvVnSjDJzjb5+gMAAADw78fyb7y2TCZTsvZHoAYAAACQVIRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFCN15adnV2y9GNKMCdLPwAAAADSH/vULgAw6vM5+3X80v1/1EeR3Jk1uZN3MlUEAAAAIL0hVOO1debqfR0+fze1ywAAAACQjrH8GwAAAAAAgwjVAAAAAAAYRKgGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBBhGoAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVwD8wfvx42djYaPTo0c9s0759e9nY2Fj9DBgwQJIUHR2tTz/9VHny5FGmTJnk7e2tNWvWWN7br18/ubq6yt3dXaGhoZbtd+7ckZubm2bOnJlygwMAAADwQvapXQCe7c8//1TBggVTuww8xaNHjzRu3Dh9+eWXL2y7e/duubq66vPPP7dsq1atmiTp008/1dy5c1WvXj15enoqLCxMjRo10v79+2Vra6tRo0apXr16unPnjnr37q2OHTsqY8aMGjBggAoWLKj27dun2BgBAAAAvBgz1cmge/fu6tu3r9W25cuXy9PTU2PGjLHaPn78eDVp0uSFfc6fP18DBw5MthpDQ0P19ttvy8vLS15eXipTpoxq166t+fPn/6N+PT09tXPnTklS3bp1tWLFiuQoN80rUaKEvvzySxUuXPi57R48eKDjx4+rXLly6tKli/r06aMBAwbI19dXZrNZV69eVbly5bR8+XKNHj1anTp1Unx8vHbs2CGTySRJqlGjhipUqCCz2SyTyaRDhw4pLCxMkyZNkq0tf4UBAACA1MS/yJOBn5+fJVg+sWHDBnl5eWn9+vVW2yMjI+Xv7//CPm/dupWsNUqSt7e39u/fr/379+vAgQMKDg7W8OHDFRUVlSz9r169Wg0aNEiWvtK6J9e8VatWz223d+9eJSQkKDIyUu7u7sqcObOaN2+ue/fuycbGRuvWrdPevXtla2srk8mkyMhISVLx4sVVsmRJtW/fXkFBQQoNDdWgQYOUOXNm9ejRQx999JEqVqz4KoYKAAAA4DkI1cnA19dX169f1x9//CFJiouL09atW/Xll1/q4sWLlu3379/X4cOHVaNGDcXFxWnEiBH64IMP5OXlpcqVKyskJERms1nLli3TtGnTtGfPHnl7e0t6fO/tN998I19fX1WuXFl9+vTRjRs3JEkXL16Up6envvvuO/n4+GjIkCEvrNnGxkbvvPOOihUrpiNHjli2//rrr2rSpInKlSun9957Tz/88IMSEhIkSfHx8Ro+fLgqVqyoSpUqacaMGVZ9+vv7a+nSpZZzMGHCBNWsWVMVKlRQ586dde7cOUvbBQsWqFatWvL29lb9+vW1ePFio6c/VUybNk3ly5d/YburV6+qYMGCatiwoWbPnq26detqyZIlCgoKsmr38OFDtWzZUlFRUapTp46qVKkiSZo1a5ZiY2MVExOj4OBgLViwQAcPHtSwYcPUs2dPFSpUSP7+/jp9+nSKjBMAAADA8xGqk4G7u7uKFy9umfHdvn273N3dVaZMGfn4+GjDhg2SpJ07dypnzpwqUaKE5syZo61bt2rOnDnav3+/pkyZovDwcEVFRalx48bq0qWLvL29tWfPHknSV199pXPnzmnp0qX69ddf5eLiosDAQJnNZksdDx480Pbt29WnT58X1mw2m7Vr1y5dvHhRvr6+kqSoqCj17t1bnTp10q5duzR27FjNnj1bP/74oyRpypQp2rRpk5YsWaKNGzfq1KlTz+x/3Lhx2rRpk3744Qdt3bpVZcqUUYcOHfTXX3/pwoULGj58uMLCwrRnzx7169dPISEhunbtmrELkIY1b95cZ8+e1cKFC9WuXTvLuYyIiLC0uX79umrWrKklS5bI399fixYtsurD0dFR9vb2io6OVlBQkIKDgxUVFaXQ0FCFhYXp/v37iUI6AAAAgFeDUJ1MfH19LUvAf/31V9WsWVPS49nbJ6F6x44dqlGjhiSpRYsW+uGHH+Tm5qZr167p4cOHypQpk65evZqo75s3b2rdunX6+uuvlSNHDmXKlElfffWVDh8+rKNHj1raNWrUSI6OjsqSJctTa9y7d6+8vb3l7e2tUqVKqU2bNvL19VWBAgUkSUuXLlXNmjVVp04d2dvbq0SJEvrkk08UHh4u6fF94h07dlS+fPksD8uysbFJdByz2azw8HB99tlnypcvn5ycnNS9e3fFx8dr06ZNsrOzs7TZu3evKleurAMHDsjd3d3o6U+zFi9erG7duunAgQOSHj+1W5JcXFwkPZ7Jrlatmnbs2KH27dtr7dq1ln3/KyQkRK6urgoMDLR8oOHr66uiRYvq5MmTKT4WAAAAAInx9O9k4ufnpwULFujRo0f67bffLF9/5O/vr+HDh+v27dvavn27vvrqK0lSbGysvvnmG+3evVseHh4qXry4zGazZan13126dEnS4yD+d3Z2drp48aJcXV0l6YWhtHz58po7d67l9alTp9S3b1/17dtXEydO1M2bN/X2229bvSdv3ryW41+7dk25c+e27MuSJYuyZs2a6Di3bt1STEyMevXqZfUgrfj4eF26dEnvvfee5s6dqxkzZqhr164ymUxq0qSJgoKC5OTk9NwxpHXnzp3T3LlzVbRoUQUEBMhsNmvq1Klas2aNWrdurVWrVkl6/HA7SWrbtq1OnjwpNzc3vfnmmxoxYoQkqVatWqpUqZKl31OnTmn8+PGKiIiQvb295YOQjh07av369fLx8XnFIwUAAAAgEaqTTalSpWRra6tffvlFZrNZXl5ekqQ8efKoaNGiWr58ua5du2YJSgMGDFDWrFm1bds2OTk5KSEh4ZnBKFeuXJIeLxl2c3OzbD99+rTy5cun69evS9JTZ42fp1ixYmrevLnlCeV58uTR+fPnrdpcuHDBckwPDw9duHDBsi8mJkb3799P1G+2bNnk5OSkWbNmqWzZspbtZ86cUa5cuXTz5k2ZTCZNnjxZCQkJ2rdvn+X+4A8//DBJY0hrzp49q4EDB6pu3boKCAhQixYtdO/ePY0ZM0bjxo3TG2+8oXHjxql79+46efKk1q1bJ+nxEvC/P+3d2dnZKlT37NlTDRo0sDzkrmnTpgoICNCyZctUsGBBDR8+/NUOFAAAAIAkln8nG1tbW1WvXl1Tp05VjRo1rGZo/f39NWfOHL3zzjuWmdjo6Gg5OTnJ1tZW0dHRGjlypKKjoxUfHy9JcnJyUnR0tMxms3LlyiU/Pz8NGzZMt2/fVnx8vL7//ns1a9ZM9+7dM1zzlStXtGLFCssDt5o2baqNGzcqIiJCJpNJx44d0/Tp09W0aVNJj+8PnjFjhv744w/99ddf+u677yxf+/S/56JZs2YaM2aMrly5ooSEBC1btkz16tXTuXPndPnyZXXo0EGRkZGytbW1fGiQLVs2w2NJLcHBwTKbzZavVPPz85PZbLbMSEtSp06ddPz4cT18+FBnzpxR7969JT3+OjKz2fzUn//9ira1a9daPczNwcFB4eHhio6O1pEjR1SmTJmUHywAAACARAjVycjX11cXLlxI9JVZNWvW1OXLly33U0uPZ6pPnDihChUq6P3331d0dLSqVatmuVe2Ro0aunPnjsqXL6979+5p5MiRypIlixo1aqRKlSpp8+bNmjFjhtXM9Yvs2bPH8j3VXl5eatKkiYoUKWKZqS5TpowmTJig6dOny9vbW4GBgWrVqpW6du0qSercubMaNGigjz76SFWrVlXmzJktS8//1xdffKEyZcqodevW8vb21g8//KCJEyeqePHiKlWqlAYNGqTg4GB5eXnpww8/VOvWrfXBBx8k5XQDAAAAQKqzMf/98dHAa8BkMunAgQMa8p972nPm7j/qq1T+rFo3sMaLGyJVPLnWZcuWlZ2dXWqXgxTEtU5fuN7pB9c6/eBapx9p7VqnhXqYqQYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBBhGoAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVAAAAAAAYRKgGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBB9qldAGDUm7ky669H/6yPIrkzJ08xAAAAANIlQjVeW2PaesnOzu4f92NKMMvO1iYZKgIAAACQ3rD8G68tk8mULP0QqAEAAAAYRagGAAAAAMAgQjUAAAAAAAYRqgEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNV4bdnZ2Vm9NptNqVQJAAAAgPTKPrULAIy6dWCkEu7/IUmyz1xAOcoPTOWKAAAAAKQ3hGq8th7dPy/T3d9TuwwAAAAA6RjLvwEAAAAAMIhQDQAAAACAQYRqAAAAAAAMIlQDAAAAAGAQoRoAAAAAAIMI1QAAAAAAGESoBgAAAADAIEI1AAAAAAAGEaoBAAAAADCIUA0AAAAAgEGEagAAAAAADCJUAwAAAABgEKEaAAAAAACDCNUAAAAAABhEqAYAAAAAwCBCNQAAAAAABhGqAQAAAAAwiFANAAAAAIBBhGoAAAAAAAwiVAMAAAAAYBChGgAAAAAAgwjVAAAAAAAYRKgGAADA/2vv3sNruvM9jn9ylxYn0kS0qlEkQdU1oSlTxK0qOi7RGmQqY1yKBG23KEUI07gVjWrrUj0G1QmNqhqVTkU5SOjFpUpCEY1KG8SIpHLZ6/zhZD/djfa0a8KWeL+eJ8+z9+/3W2v91vo+CZ+9LhsAYBKhGgAAAAAAkwjVAAAAAACYRKjGHe/8+fOKiIiQt7e3/P39NX36dJWWlv7qMjt37pSLi4s6dep0w/74+Hg5OTkpLi7O1jZx4kR5eXmpdu3aSkxMtLXn5eXJ19dXK1eurIjdAQAAAHALEaod6PLly4qLi1PHjh3VsmVLdejQQbGxsTp//rwkKSwsTO+9916FbS8yMtIuzP1cUFCQ0tLSKmx7v2fbjjRgwABt3LhRffv2lb+/v2bOnKn58+f/4viLFy9qyJAhslqtN+zfs2ePZsyYYdf29ddfa968efrDH/6goKAgjR8/XgUFBZKkl156SfXr11dUVFTF7RQAAACAW4JQ7UATJkzQpUuXtGHDBn355ZfatGmTioqKFBUVpZKSEkdP746QmZmp3bt369FHH9XKlSttH2K89dZbv7jMsGHDlJube8O+vLw8DRo0SG5ubnbtZWe+O3furLZt28owDJWWlurQoUNatmyZlixZImdnfh0BAACAyob/xTvQZ599pm7dusnX11eS5OPjo8mTJ6tFixb697//LUn66quvNHDgQLVu3Vq9evVSenq6JOnbb79VUFCQEhISFBISohkzZigxMVGRkZF22/j52e6srCxFRkYqJCREAwcO1KFDh244t5MnT2rkyJHq1KmTmjdvrieeeEI7duyw23ZSUpLCwsLUpk0bRUVF2c6wS1JSUpK6dOmiVq1aKTY2VoWFhba+zMxMDR48WCEhIercubNiY2OVn59fAUf09zty5Iik62fppes18PX1VWZmpoqLi8uNX7p0qTZt2qQ5c+bccH0jRozQ5cuX9eKLL9q1N2vWTFFRUbJYLEpMTNS0adNUo0YNRUdHa8iQIWrXrl0F7xkAAACAW4FQ7UC9evXS9OnTFRcXp61btyo7O1u+vr5KSEiQt7e3JGn37t2aO3eu0tPT1apVK02dOtVuHVevXtX//M//aMKECb9pm//6178UExOjPXv2qGPHjho+fLgtwP9UdHS0AgMDlZKSogMHDqhDhw529wdLUmpqqjZt2qSPPvpIubm5Wrp0qSRp7969mjlzpmbNmqX9+/erRYsWOnz4sG25GTNmKDQ0VOnp6dq4caOOHj2qpKSk33PoKkxZmK9WrZqtrVq1ajIMQ1evXrUbe+TIET3//PMaNWqUnnzyyXLrWrFihZKSkvT666/rgQceKNf/1ltvqbCwUAUFBYqLi9O6det08OBBzZ49WzExMXrwwQcVFhamEydOVPBeAgAAALhZCNUONGvWLE2bNk3fffedpk2bprCwMHXr1k2bN2+2jXn66af1wAMPyNXVVY8//rjOnj1rt44+ffrI3d1dNWvW/E3bjIiIUEhIiNzc3DRq1Ch5eHho586d5ca9+eabio6OlmEYys7OVs2aNZWTk2M3Zvjw4apZs6Z8fHwUFham06dPS5I2b96s7t27KzQ0VK6urho0aJCaNm1qW87Dw0O7du3Stm3b5OzsrPfff99h9xPffffdkqRr167Z2goLC+Xk5GTrK+sfOHCgatWqpWeffVZnzpyxjT1x4oQyMjI0btw4de/eXcHBwfr+++8lXb//Ojs727Yed3d3ubq6Kj8/XxaLRXFxcdq3b58SExO1bNkyXblyRRaL5VbsOgAAAIAK4OroCdzJnJ2d9cc//lF//OMfZRiGTp48qffff18TJ060XRLu5eVlG+/m5lbuqdS1a9f+Xdu8//77ba+dnJxUp06dcmFZko4dO6bRo0frhx9+UMOGDeXt7S3DMOzG+Pj42F67urra+nNycvTQQw/Zja1Xr57t9aJFi5SYmKiFCxfqueeeU+vWrRUXF6eAgIDftS8VoUmTJpKkjIwMSddDcG5urgIDA+3ui/7uu+/01VdfSZJatGhha09PT1dAQIBWrVqlgoICbd++3W4/EhMTdejQIaWmptptNz4+Xl5eXho7dqwWLFggSerYsaMCAgL05Zdf3oxdBQAAAHATcKbaQXbt2qVWrVopLy9P0vWA26hRIz3//PNq2rSpjh49+pvW4+TkZHvt7Oxsdx+w1Wq1rb9M2RnUsv5z586pbt26dmNycnI0btw4TZgwQfv27dPatWsVHh7+m/etTp065c6ol91vbbVadfToUUVHR2v79u365JNPdM8992jSpEm/ef0VqUmTJgoODtbu3bs1bNgw9e3bV5I0dOhQnTlzRrNmzdK7776r2rVrKykpyfZTdql706ZNlZSUpM6dO9v1jxkzRtL1J4v//EngGRkZtg8WXF1d5e/vL+n6A9BSUlJUv379W3cAAAAAAPxHCNUOEhISonvuuUcvvviijh8/ruLiYuXn52vz5s06ffr0L37/8a9p2LChjh8/rszMTJWUlGjFihW2r20qs2HDBh08eFBFRUW2UNexY0e7MVevXlVpaak8PT0lSSdOnNBrr70mSSoqKvp/59G/f399/PHH2rFjh0pKSpScnKyDBw9Kuh78Z82apUWLFunatWvy9vaWh4eHatWq9bv3t6Js2bJFERERSk5O1jfffKMpU6bIYrHo1KlTmjp1qv7+97/rrrvuUkREhO2nZ8+ekiRfX19FRETI39/frj84OFjS9dD98+MbExOjJ598UmFhYZKuH6+nn35aycnJ8vPz08svv3xrDwAAAAAA07j820GqVaumdevWacmSJXr22Wd14cIFubm5qWXLllq1apUaNmz4u9fZtWtX7dmzR0OHDpXValWfPn3Upk0buzHdu3fX9OnTlZWVpWbNmmnlypW666677MY0aNBAEydOlMViUWFhoerUqaOnnnpK8+bNU0ZGht0l6TfSpk0bzZ07VwkJCZowYYIeeeQRtW/f3ta/aNEixcfHq0OHDrJarQoJCVF8fPzv3t+K4ufnd8MHpXXq1KncJe9l6tev/4t90vUz3UOHDr1h37Zt2+zeu7m5af369b99wgAAAABuG07GryUD4DZUWlqqL7/8UvddWaHSy9cvk3f7rwD5dVrh4JmhopXVumXLlnJxcXH0dHATUes7C/W+c1DrOwe1vnPcbrW+HebD5d8AAAAAAJhEqAYAAAAAwCRCNQAA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GzN8+HDVrFlTPj4+CgsL0+nTpyVJmzdvVvfu3RUaGipXV1cNGjTIdlZXkjw8PLRr1y5t27ZNzs7Oev/992/5fcV33323JOnatWu2tsLCQjk5Odn6fqq0tFTPPvusLBaLHnjgAaWkpMjb21vFxcUaMGCArFarlixZoujoaEVFRenUqVO2S8olyd3dXa6ursrPz5fFYlFcXJz27dunxMRELVu2TFeuXJHFYrn5Ow4AAACgQhGqb0O+vr6Srj9V+kZyc3Ntr2vXrm17feHCBdWrV89u7P3336/s7Gzb+7Iz3GXuvffeG27n2LFj6t+/vx577DG99NJLOn78uAzDsBvz09Dv6upq68/JydF9991nN/an81q0aJFatGihhQsXKjQ0VJGRkcrMzLzhvt4sTZo0kSRlZGRIuv5BRm5urgICAuTm5mY3trS0VAMHDtQbb7yhkJAQpaWlqXHjxnbLFRYW2i4bLzsL7uHhUW678fHx8vLy0tixY23b7tixowICAnT8+PGbs7MAAAAAbhpC9W2obt26CgwMvOEZ5AsXLqhz587asmWLJMnJycluuaysLLvxZ8+etYV0SeXONn/77be699577dpycnI0btw4TZgwQfv27dPatWtveCn6L6lTp47Onj1r11Z2v7XVatXRo0cVHR2t7du365NPPtE999yjSZMm/eb1V4QmTZooODhYu3fv1rBhw9S3b19J0tChQ3XmzBnNmjVL7777riRp3rx52rBhg5ydndWpUyetWLHC1u/n56fWrVvr0qVL6tmzp8aOHas1a9bIx8dH3bp1s9tmRkaGFi1apMTERLm6usrf31+SNGzYMKWkpJT7wAMAAADA7Y9QfZuaOnWqNm7cqCVLlujSpUsyDENff/21Ro0apYceekg9evQot0z//v31ySef6J///KdKS0t19OhRLV++XP3797eNSUlJ0Z49e1RSUqINGzYoIyOjXGC+evWqSktL5enpKUk6ceKEXnvtNUlSUVHR/zv3/v376+OPP9aOHTtUUlKi5ORkHTx4UJLk7OysWbNmadGiRbp27Zq8vb3l4eGhWrVqmT5WZm3ZskURERFKTk7WN998oylTpshisejUqVOaOnWq/v73v0uSXn31VUnXPxCYN2+epk6datf/4YcfKioqSl999ZX++7//W+3bt9f27dvtPsyQpJiYGD355JMKCwuT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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "# Make a color dictionary of the colors from the ESA Land Cover legend\n", "color_dict = {\n", " 'Trees': '#006400',\n", " 'Shrublands': '#FFBB22',\n", " 'Grasslands': '#FFFF4C',\n", " 'Croplands': '#F096FF',\n", " 'Built-Up': '#FA0000',\n", " 'Barren': '#B4B4B4',\n", " 'Snow and Ice': '#F0F0F0',\n", " 'Water Bodies': '#0064C8',\n", " 'Herbaceous Wetlands': '#0096A0',\n", " 'Mangroves': '#00CF75',\n", " 'Moss and Lichen': '#FAE6A0'\n", "}\n", "\n", "# Sort the DataFrame by percentage in descending order\n", "df = df.sort_values('percentage', ascending=False)\n", "\n", "# Set the figure size\n", "plt.figure(figsize=(10, 10))\n", "\n", "# Create the barplot\n", "sns.barplot(x='percentage', y='type', data=df, palette=color_dict)\n", "\n", "# Add labels at the end of each bar\n", "for i, v in enumerate(df['percentage']):\n", " plt.text(v + 1, i, str(round(v, 2)) + '%', va='center', color='black', fontweight='bold')\n", "\n", "# Customize labels and title\n", "plt.xlabel('Percentage')\n", "plt.ylabel('Land Cover Type')\n", "plt.title('Land Cover in Luanda, Angola')\n", "\n", "# Show the plot\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "ename": "EEException", "evalue": "Image.load: Asset 'COPERNICUS/S1_GRD' is not an Image.", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mHttpError\u001b[0m Traceback (most recent call last)", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:352\u001b[0m, in \u001b[0;36m_execute_cloud_call\u001b[1;34m(call, num_retries)\u001b[0m\n\u001b[0;32m 351\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[1;32m--> 352\u001b[0m \u001b[39mreturn\u001b[39;00m call\u001b[39m.\u001b[39;49mexecute(num_retries\u001b[39m=\u001b[39;49mnum_retries)\n\u001b[0;32m 353\u001b[0m \u001b[39mexcept\u001b[39;00m googleapiclient\u001b[39m.\u001b[39merrors\u001b[39m.\u001b[39mHttpError \u001b[39mas\u001b[39;00m e:\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\googleapiclient\\_helpers.py:130\u001b[0m, in \u001b[0;36mpositional..positional_decorator..positional_wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 129\u001b[0m logger\u001b[39m.\u001b[39mwarning(message)\n\u001b[1;32m--> 130\u001b[0m \u001b[39mreturn\u001b[39;00m wrapped(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\googleapiclient\\http.py:938\u001b[0m, in \u001b[0;36mHttpRequest.execute\u001b[1;34m(self, http, num_retries)\u001b[0m\n\u001b[0;32m 937\u001b[0m \u001b[39mif\u001b[39;00m resp\u001b[39m.\u001b[39mstatus \u001b[39m>\u001b[39m\u001b[39m=\u001b[39m \u001b[39m300\u001b[39m:\n\u001b[1;32m--> 938\u001b[0m \u001b[39mraise\u001b[39;00m HttpError(resp, content, uri\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39muri)\n\u001b[0;32m 939\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpostproc(resp, content)\n", "\u001b[1;31mHttpError\u001b[0m: ", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[1;31mEEException\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[81], line 64\u001b[0m\n\u001b[0;32m 52\u001b[0m UpperThreshold \u001b[39m=\u001b[39m (difference_smoothed_resampled\n\u001b[0;32m 53\u001b[0m \u001b[39m.\u001b[39mreduceRegion(reducer\u001b[39m=\u001b[39mee\u001b[39m.\u001b[39mReducer\u001b[39m.\u001b[39mpercentile([\u001b[39m6\u001b[39m]),\n\u001b[0;32m 54\u001b[0m geometry\u001b[39m=\u001b[39mLuanda_Extent,\n\u001b[0;32m 55\u001b[0m scale\u001b[39m=\u001b[39m\u001b[39m10\u001b[39m,\n\u001b[0;32m 56\u001b[0m maxPixels\u001b[39m=\u001b[39m\u001b[39m1e9\u001b[39m)\n\u001b[0;32m 57\u001b[0m \u001b[39m.\u001b[39mget(\u001b[39m'\u001b[39m\u001b[39mVV\u001b[39m\u001b[39m'\u001b[39m))\n\u001b[0;32m 58\u001b[0m LowerThreshold \u001b[39m=\u001b[39m (difference_smoothed_resampled\n\u001b[0;32m 59\u001b[0m \u001b[39m.\u001b[39mreduceRegion(reducer\u001b[39m=\u001b[39mee\u001b[39m.\u001b[39mReducer\u001b[39m.\u001b[39mpercentile([\u001b[39m94\u001b[39m]),\n\u001b[0;32m 60\u001b[0m geometry\u001b[39m=\u001b[39mLuanda_Extent,\n\u001b[0;32m 61\u001b[0m scale\u001b[39m=\u001b[39m\u001b[39m10\u001b[39m,\n\u001b[0;32m 62\u001b[0m maxPixels\u001b[39m=\u001b[39m\u001b[39m1e9\u001b[39m)\n\u001b[0;32m 63\u001b[0m \u001b[39m.\u001b[39mget(\u001b[39m'\u001b[39m\u001b[39mVV\u001b[39m\u001b[39m'\u001b[39m))\n\u001b[1;32m---> 64\u001b[0m \u001b[39mprint\u001b[39m(UpperThreshold\u001b[39m.\u001b[39;49mgetInfo())\n\u001b[0;32m 65\u001b[0m \u001b[39mprint\u001b[39m(LowerThreshold\u001b[39m.\u001b[39mgetInfo())\n\u001b[0;32m 66\u001b[0m \u001b[39m# Make Difference Darker Rasters\u001b[39;00m\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\computedobject.py:103\u001b[0m, in \u001b[0;36mComputedObject.getInfo\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 97\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mgetInfo\u001b[39m(\u001b[39mself\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m Optional[Any]:\n\u001b[0;32m 98\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Fetch and return information about this object.\u001b[39;00m\n\u001b[0;32m 99\u001b[0m \n\u001b[0;32m 100\u001b[0m \u001b[39m Returns:\u001b[39;00m\n\u001b[0;32m 101\u001b[0m \u001b[39m The object can evaluate to anything.\u001b[39;00m\n\u001b[0;32m 102\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 103\u001b[0m \u001b[39mreturn\u001b[39;00m data\u001b[39m.\u001b[39;49mcomputeValue(\u001b[39mself\u001b[39;49m)\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:971\u001b[0m, in \u001b[0;36mcomputeValue\u001b[1;34m(obj)\u001b[0m\n\u001b[0;32m 968\u001b[0m body \u001b[39m=\u001b[39m {\u001b[39m'\u001b[39m\u001b[39mexpression\u001b[39m\u001b[39m'\u001b[39m: serializer\u001b[39m.\u001b[39mencode(obj, for_cloud_api\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m)}\n\u001b[0;32m 969\u001b[0m _maybe_populate_workload_tag(body)\n\u001b[1;32m--> 971\u001b[0m \u001b[39mreturn\u001b[39;00m _execute_cloud_call(\n\u001b[0;32m 972\u001b[0m _get_cloud_projects()\n\u001b[0;32m 973\u001b[0m \u001b[39m.\u001b[39;49mvalue()\n\u001b[0;32m 974\u001b[0m \u001b[39m.\u001b[39;49mcompute(body\u001b[39m=\u001b[39;49mbody, project\u001b[39m=\u001b[39;49m_get_projects_path(), prettyPrint\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m)\n\u001b[0;32m 975\u001b[0m )[\u001b[39m'\u001b[39m\u001b[39mresult\u001b[39m\u001b[39m'\u001b[39m]\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:354\u001b[0m, in \u001b[0;36m_execute_cloud_call\u001b[1;34m(call, num_retries)\u001b[0m\n\u001b[0;32m 352\u001b[0m \u001b[39mreturn\u001b[39;00m call\u001b[39m.\u001b[39mexecute(num_retries\u001b[39m=\u001b[39mnum_retries)\n\u001b[0;32m 353\u001b[0m \u001b[39mexcept\u001b[39;00m googleapiclient\u001b[39m.\u001b[39merrors\u001b[39m.\u001b[39mHttpError \u001b[39mas\u001b[39;00m e:\n\u001b[1;32m--> 354\u001b[0m \u001b[39mraise\u001b[39;00m _translate_cloud_exception(e)\n", "\u001b[1;31mEEException\u001b[0m: Image.load: Asset 'COPERNICUS/S1_GRD' is not an Image." ] } ], "source": [ "# Define the location (Luanda, Angola) and Area of Interest (AOI)\n", "# Replace the coordinates in the Point and Polygon geometries with those for Luanda, Angola.\n", "Luanda = ee.Geometry.Point([13.2343, -8.8383])\n", "Luanda_Extent = ee.Geometry.Polygon(\n", " [[[13.1643, -8.9421],\n", " [13.1643, -8.7278],\n", " [13.3597, -8.7278],\n", " [13.3597, -8.9421]]])\n", "# Define the city name and convert it to lowercase\n", "city_name = \"Luanda\"\n", "id = \"Luanda\"\n", "# Create Water Mask\n", "WaterMask = ee.Image('COPERNICUS/S1_GRD')\n", "waterMask = WaterMask.select('transition')\n", "blank = ee.Image(0)\n", "nonWater = blank.addBands(waterMask).unmask().select('transition').eq(0).rename('non_water')\n", "# Create Slope Mask\n", "srtm = ee.Image('USGS/SRTMGL1_003')\n", "slope = ee.Terrain.slope(srtm)\n", "Grade15 = slope.gt(15)\n", "gtGrade15 = Grade15.updateMask(Grade15.neq(0))\n", "slopeMask = gtGrade15.clip(Luanda_Extent).unmask(0).subtract(1).multiply(-1)\n", "# Load Sentinel-1 C-band SAR Ground Range collection (log scaling, VV co-polar)\n", "collection = (ee.ImageCollection('COPERNICUS/S1_GRD')\n", " .filterBounds(Luanda)\n", " .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))\n", " .filter(ee.Filter.eq('orbitProperties_pass', 'DESCENDING'))\n", " .select('VV'))\n", "# Filter by date\n", "during_flood_collection = collection.filterDate('2017-03-14', '2017-03-29')\n", "during_flood = (during_flood_collection.first()\n", " .clip(Luanda_Extent)\n", " .updateMask(nonWater)\n", " .updateMask(slopeMask))\n", "before_flood_collection = collection.filterDate('2016-08-01', '2016-09-30')\n", "before_flood = (before_flood_collection.median()\n", " .clip(Luanda_Extent)\n", " .updateMask(nonWater)\n", " .updateMask(slopeMask))\n", "# Define a smoothing box (30m is 3x size of S1 pixel)\n", "smoothing_box = 30\n", "# Create difference images (during flood - before flood)\n", "difference_smoothed = (during_flood\n", " .focal_median(smoothing_box, 'square', 'meters')\n", " .subtract(before_flood.focal_median(smoothing_box, 'square', 'meters')))\n", "difference_raw = during_flood.subtract(before_flood)\n", "# Resample difference raster\n", "difference_smoothed_resampled = (difference_smoothed\n", " .resample('bilinear')\n", " .reproject(crs=difference_smoothed.projection()))\n", "# Calculate Upper and Lower Thresholds\n", "UpperThreshold = (difference_smoothed_resampled\n", " .reduceRegion(reducer=ee.Reducer.percentile([6]),\n", " geometry=Luanda_Extent,\n", " scale=10,\n", " maxPixels=1e9)\n", " .get('VV'))\n", "LowerThreshold = (difference_smoothed_resampled\n", " .reduceRegion(reducer=ee.Reducer.percentile([94]),\n", " geometry=Luanda_Extent,\n", " scale=10,\n", " maxPixels=1e9)\n", " .get('VV'))\n", "print(UpperThreshold.getInfo())\n", "print(LowerThreshold.getInfo())\n", "# Make Difference Darker Rasters\n", "difference_darker_smoothed_thresholded = difference_smoothed_resampled.lt(UpperThreshold)\n", "difference_darker_thresholded = difference_raw.lt(UpperThreshold)\n", "# Make Difference Brighter Rasters\n", "difference_brighter_smoothed_thresholded = difference_smoothed_resampled.gt(LowerThreshold)\n", "difference_brighter_thresholded = difference_raw.gt(LowerThreshold)\n", "# Display map (you can visualize it in the GEE Code Editor)\n", "Map = ee.Map()\n", "Map.centerObject(Luanda, 13)\n", "Map.addLayer(before_flood, {'min': -30, 'max': 0}, 'Before Flood', 1)\n", "Map.addLayer(during_flood, {'min': -30, 'max': 0}, 'During Flood', 1)\n", "Map.addLayer(difference_raw, {'min': -10, 'max': 10}, 'Difference - Raw', 0)\n", "Map.addLayer(difference_smoothed, {'min': -10, 'max': 10}, 'Difference - Smoothed', 0)\n", "Map.addLayer(difference_smoothed_resampled, {'min': -10, 'max': 10}, 'Difference - Smoothed & Resampled', 1)\n", "# Save maps to Google Drive or export as assets as needed" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [], "source": [ "import spyndex\n", "import geemap\n", "import ee , eemont" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "ename": "EEException", "evalue": "Collection.loadTable: Collection asset 'C:/Users/jtrum/world_bank/data/luanda2clean.geojson' not found.", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mHttpError\u001b[0m Traceback (most recent call last)", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:352\u001b[0m, in \u001b[0;36m_execute_cloud_call\u001b[1;34m(call, num_retries)\u001b[0m\n\u001b[0;32m 351\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[1;32m--> 352\u001b[0m \u001b[39mreturn\u001b[39;00m call\u001b[39m.\u001b[39;49mexecute(num_retries\u001b[39m=\u001b[39;49mnum_retries)\n\u001b[0;32m 353\u001b[0m \u001b[39mexcept\u001b[39;00m googleapiclient\u001b[39m.\u001b[39merrors\u001b[39m.\u001b[39mHttpError \u001b[39mas\u001b[39;00m e:\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\googleapiclient\\_helpers.py:130\u001b[0m, in \u001b[0;36mpositional..positional_decorator..positional_wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 129\u001b[0m logger\u001b[39m.\u001b[39mwarning(message)\n\u001b[1;32m--> 130\u001b[0m \u001b[39mreturn\u001b[39;00m wrapped(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\googleapiclient\\http.py:938\u001b[0m, in \u001b[0;36mHttpRequest.execute\u001b[1;34m(self, http, num_retries)\u001b[0m\n\u001b[0;32m 937\u001b[0m \u001b[39mif\u001b[39;00m resp\u001b[39m.\u001b[39mstatus \u001b[39m>\u001b[39m\u001b[39m=\u001b[39m \u001b[39m300\u001b[39m:\n\u001b[1;32m--> 938\u001b[0m \u001b[39mraise\u001b[39;00m HttpError(resp, content, uri\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39muri)\n\u001b[0;32m 939\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpostproc(resp, content)\n", "\u001b[1;31mHttpError\u001b[0m: ", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[1;31mEEException\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[112], line 13\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[39m# Create a map\u001b[39;00m\n\u001b[0;32m 12\u001b[0m Map \u001b[39m=\u001b[39m geemap\u001b[39m.\u001b[39mMap()\n\u001b[1;32m---> 13\u001b[0m Map\u001b[39m.\u001b[39;49mcenterObject(aoi, \u001b[39m10\u001b[39;49m)\n\u001b[0;32m 15\u001b[0m \u001b[39m# Load the Sentinel-2 image collection\u001b[39;00m\n\u001b[0;32m 16\u001b[0m sentinel \u001b[39m=\u001b[39m ee\u001b[39m.\u001b[39mImageCollection(\u001b[39m'\u001b[39m\u001b[39mCOPERNICUS/S2_SR_HARMONIZED\u001b[39m\u001b[39m'\u001b[39m) \\\n\u001b[0;32m 17\u001b[0m \u001b[39m.\u001b[39mfilterBounds(aoi) \\\n\u001b[0;32m 18\u001b[0m \u001b[39m.\u001b[39mfilterDate(\u001b[39m'\u001b[39m\u001b[39m2019-01-01\u001b[39m\u001b[39m'\u001b[39m, \u001b[39m'\u001b[39m\u001b[39m2019-12-31\u001b[39m\u001b[39m'\u001b[39m) \\\n\u001b[0;32m 19\u001b[0m \u001b[39m.\u001b[39mfilterMetadata(\u001b[39m'\u001b[39m\u001b[39mCLOUDY_PIXEL_PERCENTAGE\u001b[39m\u001b[39m'\u001b[39m, \u001b[39m'\u001b[39m\u001b[39mless_than\u001b[39m\u001b[39m'\u001b[39m, \u001b[39m10\u001b[39m) \\\n\u001b[0;32m 20\u001b[0m \u001b[39m.\u001b[39mfirst() \\\n\u001b[0;32m 21\u001b[0m \u001b[39m.\u001b[39mmultiply(\u001b[39m0.0001\u001b[39m)\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\geemap\\geemap.py:537\u001b[0m, in \u001b[0;36mMap.center_object\u001b[1;34m(self, ee_object, zoom)\u001b[0m\n\u001b[0;32m 535\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mException\u001b[39;00m(\u001b[39m\"\u001b[39m\u001b[39mZoom must be an integer.\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m 536\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m--> 537\u001b[0m centroid \u001b[39m=\u001b[39m geometry\u001b[39m.\u001b[39;49mcentroid(maxError\u001b[39m=\u001b[39;49mmaxError)\u001b[39m.\u001b[39;49mgetInfo()[\u001b[39m\"\u001b[39m\u001b[39mcoordinates\u001b[39m\u001b[39m\"\u001b[39m]\n\u001b[0;32m 538\u001b[0m lat \u001b[39m=\u001b[39m centroid[\u001b[39m1\u001b[39m]\n\u001b[0;32m 539\u001b[0m lon \u001b[39m=\u001b[39m centroid[\u001b[39m0\u001b[39m]\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\computedobject.py:103\u001b[0m, in \u001b[0;36mComputedObject.getInfo\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 97\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mgetInfo\u001b[39m(\u001b[39mself\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m Optional[Any]:\n\u001b[0;32m 98\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Fetch and return information about this object.\u001b[39;00m\n\u001b[0;32m 99\u001b[0m \n\u001b[0;32m 100\u001b[0m \u001b[39m Returns:\u001b[39;00m\n\u001b[0;32m 101\u001b[0m \u001b[39m The object can evaluate to anything.\u001b[39;00m\n\u001b[0;32m 102\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 103\u001b[0m \u001b[39mreturn\u001b[39;00m data\u001b[39m.\u001b[39;49mcomputeValue(\u001b[39mself\u001b[39;49m)\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:971\u001b[0m, in \u001b[0;36mcomputeValue\u001b[1;34m(obj)\u001b[0m\n\u001b[0;32m 968\u001b[0m body \u001b[39m=\u001b[39m {\u001b[39m'\u001b[39m\u001b[39mexpression\u001b[39m\u001b[39m'\u001b[39m: serializer\u001b[39m.\u001b[39mencode(obj, for_cloud_api\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m)}\n\u001b[0;32m 969\u001b[0m _maybe_populate_workload_tag(body)\n\u001b[1;32m--> 971\u001b[0m \u001b[39mreturn\u001b[39;00m _execute_cloud_call(\n\u001b[0;32m 972\u001b[0m _get_cloud_projects()\n\u001b[0;32m 973\u001b[0m \u001b[39m.\u001b[39;49mvalue()\n\u001b[0;32m 974\u001b[0m \u001b[39m.\u001b[39;49mcompute(body\u001b[39m=\u001b[39;49mbody, project\u001b[39m=\u001b[39;49m_get_projects_path(), prettyPrint\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m)\n\u001b[0;32m 975\u001b[0m )[\u001b[39m'\u001b[39m\u001b[39mresult\u001b[39m\u001b[39m'\u001b[39m]\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:354\u001b[0m, in \u001b[0;36m_execute_cloud_call\u001b[1;34m(call, num_retries)\u001b[0m\n\u001b[0;32m 352\u001b[0m \u001b[39mreturn\u001b[39;00m call\u001b[39m.\u001b[39mexecute(num_retries\u001b[39m=\u001b[39mnum_retries)\n\u001b[0;32m 353\u001b[0m \u001b[39mexcept\u001b[39;00m googleapiclient\u001b[39m.\u001b[39merrors\u001b[39m.\u001b[39mHttpError \u001b[39mas\u001b[39;00m e:\n\u001b[1;32m--> 354\u001b[0m \u001b[39mraise\u001b[39;00m _translate_cloud_exception(e)\n", "\u001b[1;31mEEException\u001b[0m: Collection.loadTable: Collection asset 'C:/Users/jtrum/world_bank/data/luanda2clean.geojson' not found." ] } ], "source": [ "import ee\n", "import geemap\n", "\n", "# Define the path to your GeoJSON file\n", "datadir = 'C:/Users/jtrum/world_bank/data/'\n", "aoi_path = datadir + 'luanda2clean.geojson'\n", "\n", "# Load the GeoJSON as a FeatureCollection\n", "aoi = ee.FeatureCollection(aoi_path)\n", "\n", "# Create a map\n", "Map = geemap.Map()\n", "Map.centerObject(aoi, 10)\n", "\n", "# Load the Sentinel-2 image collection\n", "sentinel = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED') \\\n", " .filterBounds(aoi) \\\n", " .filterDate('2019-01-01', '2019-12-31') \\\n", " .filterMetadata('CLOUDY_PIXEL_PERCENTAGE', 'less_than', 10) \\\n", " .first() \\\n", " .multiply(0.0001)\n", "\n", "# Compute the NDVI index\n", "ndvi = sentinel.normalizedDifference(['B8', 'B4'])\n", "\n", "# Add the NDVI band to the image\n", "img = sentinel.addBands(ndvi.rename('NDVI'))\n", "\n", "# Add the NDVI layer to the map\n", "Map.addLayer(img.select('NDVI'), {\"min\": -1, \"max\": 1, \"palette\": ['red', 'white', 'green']}, \"NDVI\")\n", "\n", "# Display the map\n", "Map\n" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "ename": "EEException", "evalue": "Collection.loadTable: Collection asset 'C:/Users/jtrum/world_bank/data/luanda2clean.geojson' not found.", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mHttpError\u001b[0m Traceback (most recent call last)", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:352\u001b[0m, in \u001b[0;36m_execute_cloud_call\u001b[1;34m(call, num_retries)\u001b[0m\n\u001b[0;32m 351\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[1;32m--> 352\u001b[0m \u001b[39mreturn\u001b[39;00m call\u001b[39m.\u001b[39;49mexecute(num_retries\u001b[39m=\u001b[39;49mnum_retries)\n\u001b[0;32m 353\u001b[0m \u001b[39mexcept\u001b[39;00m googleapiclient\u001b[39m.\u001b[39merrors\u001b[39m.\u001b[39mHttpError \u001b[39mas\u001b[39;00m e:\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\googleapiclient\\_helpers.py:130\u001b[0m, in \u001b[0;36mpositional..positional_decorator..positional_wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 129\u001b[0m logger\u001b[39m.\u001b[39mwarning(message)\n\u001b[1;32m--> 130\u001b[0m \u001b[39mreturn\u001b[39;00m wrapped(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\googleapiclient\\http.py:938\u001b[0m, in \u001b[0;36mHttpRequest.execute\u001b[1;34m(self, http, num_retries)\u001b[0m\n\u001b[0;32m 937\u001b[0m \u001b[39mif\u001b[39;00m resp\u001b[39m.\u001b[39mstatus \u001b[39m>\u001b[39m\u001b[39m=\u001b[39m \u001b[39m300\u001b[39m:\n\u001b[1;32m--> 938\u001b[0m \u001b[39mraise\u001b[39;00m HttpError(resp, content, uri\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39muri)\n\u001b[0;32m 939\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpostproc(resp, content)\n", "\u001b[1;31mHttpError\u001b[0m: ", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[1;31mEEException\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[113], line 3\u001b[0m\n\u001b[0;32m 1\u001b[0m aoi_path \u001b[39m=\u001b[39m datadir \u001b[39m+\u001b[39m \u001b[39m'\u001b[39m\u001b[39mluanda2clean.geojson\u001b[39m\u001b[39m'\u001b[39m\n\u001b[0;32m 2\u001b[0m aoi \u001b[39m=\u001b[39m ee\u001b[39m.\u001b[39mFeatureCollection(aoi)\n\u001b[1;32m----> 3\u001b[0m coords \u001b[39m=\u001b[39m aoi\u001b[39m.\u001b[39;49mgeometry()\u001b[39m.\u001b[39;49mcoordinates()\u001b[39m.\u001b[39;49mgetInfo()[\u001b[39m0\u001b[39m]\n\u001b[0;32m 5\u001b[0m roi \u001b[39m=\u001b[39m ee\u001b[39m.\u001b[39mGeometry\u001b[39m.\u001b[39mPoint([\u001b[39m13.230162\u001b[39m, \u001b[39m-\u001b[39m\u001b[39m8.814921\u001b[39m])\n\u001b[0;32m 7\u001b[0m sentinel \u001b[39m=\u001b[39m ee\u001b[39m.\u001b[39mImageCollection(\u001b[39m'\u001b[39m\u001b[39mCOPERNICUS/S2_SR_HARMONIZED\u001b[39m\u001b[39m'\u001b[39m)\\\n\u001b[0;32m 8\u001b[0m \u001b[39m.\u001b[39mfilterBounds(roi)\\\n\u001b[0;32m 9\u001b[0m \u001b[39m.\u001b[39mfilterDate(\u001b[39m'\u001b[39m\u001b[39m2019-01-01\u001b[39m\u001b[39m'\u001b[39m, \u001b[39m'\u001b[39m\u001b[39m2019-12-31\u001b[39m\u001b[39m'\u001b[39m)\\\n\u001b[0;32m 10\u001b[0m \u001b[39m.\u001b[39mfilterMetadata(\u001b[39m'\u001b[39m\u001b[39mCLOUDY_PIXEL_PERCENTAGE\u001b[39m\u001b[39m'\u001b[39m, \u001b[39m'\u001b[39m\u001b[39mless_than\u001b[39m\u001b[39m'\u001b[39m, \u001b[39m10\u001b[39m)\\\n\u001b[0;32m 11\u001b[0m \u001b[39m.\u001b[39mfirst()\\\n\u001b[0;32m 12\u001b[0m \u001b[39m.\u001b[39mmultiply(\u001b[39m0.0001\u001b[39m)\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\computedobject.py:103\u001b[0m, in \u001b[0;36mComputedObject.getInfo\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 97\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mgetInfo\u001b[39m(\u001b[39mself\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m Optional[Any]:\n\u001b[0;32m 98\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Fetch and return information about this object.\u001b[39;00m\n\u001b[0;32m 99\u001b[0m \n\u001b[0;32m 100\u001b[0m \u001b[39m Returns:\u001b[39;00m\n\u001b[0;32m 101\u001b[0m \u001b[39m The object can evaluate to anything.\u001b[39;00m\n\u001b[0;32m 102\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 103\u001b[0m \u001b[39mreturn\u001b[39;00m data\u001b[39m.\u001b[39;49mcomputeValue(\u001b[39mself\u001b[39;49m)\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:971\u001b[0m, in \u001b[0;36mcomputeValue\u001b[1;34m(obj)\u001b[0m\n\u001b[0;32m 968\u001b[0m body \u001b[39m=\u001b[39m {\u001b[39m'\u001b[39m\u001b[39mexpression\u001b[39m\u001b[39m'\u001b[39m: serializer\u001b[39m.\u001b[39mencode(obj, for_cloud_api\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m)}\n\u001b[0;32m 969\u001b[0m _maybe_populate_workload_tag(body)\n\u001b[1;32m--> 971\u001b[0m \u001b[39mreturn\u001b[39;00m _execute_cloud_call(\n\u001b[0;32m 972\u001b[0m _get_cloud_projects()\n\u001b[0;32m 973\u001b[0m \u001b[39m.\u001b[39;49mvalue()\n\u001b[0;32m 974\u001b[0m \u001b[39m.\u001b[39;49mcompute(body\u001b[39m=\u001b[39;49mbody, project\u001b[39m=\u001b[39;49m_get_projects_path(), prettyPrint\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m)\n\u001b[0;32m 975\u001b[0m )[\u001b[39m'\u001b[39m\u001b[39mresult\u001b[39m\u001b[39m'\u001b[39m]\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:354\u001b[0m, in \u001b[0;36m_execute_cloud_call\u001b[1;34m(call, num_retries)\u001b[0m\n\u001b[0;32m 352\u001b[0m \u001b[39mreturn\u001b[39;00m call\u001b[39m.\u001b[39mexecute(num_retries\u001b[39m=\u001b[39mnum_retries)\n\u001b[0;32m 353\u001b[0m \u001b[39mexcept\u001b[39;00m googleapiclient\u001b[39m.\u001b[39merrors\u001b[39m.\u001b[39mHttpError \u001b[39mas\u001b[39;00m e:\n\u001b[1;32m--> 354\u001b[0m \u001b[39mraise\u001b[39;00m _translate_cloud_exception(e)\n", "\u001b[1;31mEEException\u001b[0m: Collection.loadTable: Collection asset 'C:/Users/jtrum/world_bank/data/luanda2clean.geojson' not found." ] } ], "source": [ "aoi_path = datadir + 'luanda2clean.geojson'\n", "aoi = ee.FeatureCollection(aoi)\n", "coords = aoi.geometry().coordinates().getInfo()[0]\n", "\n", "roi = ee.Geometry.Point([13.230162, -8.814921])\n", "\n", "sentinel = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')\\\n", " .filterBounds(roi)\\\n", " .filterDate('2019-01-01', '2019-12-31')\\\n", " .filterMetadata('CLOUDY_PIXEL_PERCENTAGE', 'less_than', 10)\\\n", " .first()\\\n", " .multiply(0.0001)\n", "\n", "idx = spyndex.computeIndex(\n", " index = ['NDVI'], \n", " params = {\n", " \"R\": sentinel[\"B4\"],\n", " \"N\": sentinel[\"B8\"],\n", " \"G\": sentinel[\"B3\"],\n", " \"B\": sentinel[\"B2\"]\n", " }\n", ")\n", "\n", "img = sentinel.addBands(idx)\n", "\n", "Map = geemap.Map()\n", "Map.centerObject(img, 10)\n", "Map.addLayer(img['NDVI'], {\"min\":-1, \"max\":1, \"palette\":['red', 'white', 'green']}, \"NDVI\")\n", "Map" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [], "source": [ "sentinel = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')\\\n", " .filterBounds(roi)\\\n", " .filterDate('2019-01-01', '2019-12-31')\\\n", " .filterMetadata('CLOUDY_PIXEL_PERCENTAGE', 'less_than', 10)\\\n", " .first()\\\n", " .multiply(0.0001)" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [], "source": [ "idx = spyndex.computeIndex(index = 'NDVI', \n", " params = {\"R\": sentinel[\"B4\"],\n", " \"N\": sentinel[\"B8\"],\n", " \"G\": sentinel[\"B3\"],\n", " \"B\": sentinel[\"B2\"]\n", " })" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [], "source": [ "img = sentinel.addBands(idx)" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "ename": "EEException", "evalue": "GeometryConstructors.Polygon, argument 'coordinates': Invalid type.\nExpected type: List.\nActual type: FeatureCollection.", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mHttpError\u001b[0m Traceback (most recent call last)", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:352\u001b[0m, in \u001b[0;36m_execute_cloud_call\u001b[1;34m(call, num_retries)\u001b[0m\n\u001b[0;32m 351\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[1;32m--> 352\u001b[0m \u001b[39mreturn\u001b[39;00m call\u001b[39m.\u001b[39;49mexecute(num_retries\u001b[39m=\u001b[39;49mnum_retries)\n\u001b[0;32m 353\u001b[0m \u001b[39mexcept\u001b[39;00m googleapiclient\u001b[39m.\u001b[39merrors\u001b[39m.\u001b[39mHttpError \u001b[39mas\u001b[39;00m e:\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\googleapiclient\\_helpers.py:130\u001b[0m, in \u001b[0;36mpositional..positional_decorator..positional_wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 129\u001b[0m logger\u001b[39m.\u001b[39mwarning(message)\n\u001b[1;32m--> 130\u001b[0m \u001b[39mreturn\u001b[39;00m wrapped(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\googleapiclient\\http.py:938\u001b[0m, in \u001b[0;36mHttpRequest.execute\u001b[1;34m(self, http, num_retries)\u001b[0m\n\u001b[0;32m 937\u001b[0m \u001b[39mif\u001b[39;00m resp\u001b[39m.\u001b[39mstatus \u001b[39m>\u001b[39m\u001b[39m=\u001b[39m \u001b[39m300\u001b[39m:\n\u001b[1;32m--> 938\u001b[0m \u001b[39mraise\u001b[39;00m HttpError(resp, content, uri\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39muri)\n\u001b[0;32m 939\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpostproc(resp, content)\n", "\u001b[1;31mHttpError\u001b[0m: .\nActual type: FeatureCollection.\". Details: \"GeometryConstructors.Polygon, argument 'coordinates': Invalid type.\nExpected type: List.\nActual type: FeatureCollection.\">", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[1;31mEEException\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[98], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m Map \u001b[39m=\u001b[39m geemap\u001b[39m.\u001b[39mMap()\n\u001b[1;32m----> 2\u001b[0m Map\u001b[39m.\u001b[39;49mcenterObject(img, \u001b[39m10\u001b[39;49m)\n\u001b[0;32m 3\u001b[0m Map\u001b[39m.\u001b[39maddLayer(img[\u001b[39m'\u001b[39m\u001b[39mNDVI\u001b[39m\u001b[39m'\u001b[39m], {\u001b[39m\"\u001b[39m\u001b[39mmin\u001b[39m\u001b[39m\"\u001b[39m:\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39mmax\u001b[39m\u001b[39m\"\u001b[39m:\u001b[39m1\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39mpalette\u001b[39m\u001b[39m\"\u001b[39m:[\u001b[39m'\u001b[39m\u001b[39mred\u001b[39m\u001b[39m'\u001b[39m, \u001b[39m'\u001b[39m\u001b[39mwhite\u001b[39m\u001b[39m'\u001b[39m, \u001b[39m'\u001b[39m\u001b[39mblue\u001b[39m\u001b[39m'\u001b[39m]}, \u001b[39m\"\u001b[39m\u001b[39mNDVI\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m 4\u001b[0m Map\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\geemap\\geemap.py:537\u001b[0m, in \u001b[0;36mMap.center_object\u001b[1;34m(self, ee_object, zoom)\u001b[0m\n\u001b[0;32m 535\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mException\u001b[39;00m(\u001b[39m\"\u001b[39m\u001b[39mZoom must be an integer.\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m 536\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m--> 537\u001b[0m centroid \u001b[39m=\u001b[39m geometry\u001b[39m.\u001b[39;49mcentroid(maxError\u001b[39m=\u001b[39;49mmaxError)\u001b[39m.\u001b[39;49mgetInfo()[\u001b[39m\"\u001b[39m\u001b[39mcoordinates\u001b[39m\u001b[39m\"\u001b[39m]\n\u001b[0;32m 538\u001b[0m lat \u001b[39m=\u001b[39m centroid[\u001b[39m1\u001b[39m]\n\u001b[0;32m 539\u001b[0m lon \u001b[39m=\u001b[39m centroid[\u001b[39m0\u001b[39m]\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\computedobject.py:103\u001b[0m, in \u001b[0;36mComputedObject.getInfo\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 97\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mgetInfo\u001b[39m(\u001b[39mself\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m Optional[Any]:\n\u001b[0;32m 98\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Fetch and return information about this object.\u001b[39;00m\n\u001b[0;32m 99\u001b[0m \n\u001b[0;32m 100\u001b[0m \u001b[39m Returns:\u001b[39;00m\n\u001b[0;32m 101\u001b[0m \u001b[39m The object can evaluate to anything.\u001b[39;00m\n\u001b[0;32m 102\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 103\u001b[0m \u001b[39mreturn\u001b[39;00m data\u001b[39m.\u001b[39;49mcomputeValue(\u001b[39mself\u001b[39;49m)\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:971\u001b[0m, in \u001b[0;36mcomputeValue\u001b[1;34m(obj)\u001b[0m\n\u001b[0;32m 968\u001b[0m body \u001b[39m=\u001b[39m {\u001b[39m'\u001b[39m\u001b[39mexpression\u001b[39m\u001b[39m'\u001b[39m: serializer\u001b[39m.\u001b[39mencode(obj, for_cloud_api\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m)}\n\u001b[0;32m 969\u001b[0m _maybe_populate_workload_tag(body)\n\u001b[1;32m--> 971\u001b[0m \u001b[39mreturn\u001b[39;00m _execute_cloud_call(\n\u001b[0;32m 972\u001b[0m _get_cloud_projects()\n\u001b[0;32m 973\u001b[0m \u001b[39m.\u001b[39;49mvalue()\n\u001b[0;32m 974\u001b[0m \u001b[39m.\u001b[39;49mcompute(body\u001b[39m=\u001b[39;49mbody, project\u001b[39m=\u001b[39;49m_get_projects_path(), prettyPrint\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m)\n\u001b[0;32m 975\u001b[0m )[\u001b[39m'\u001b[39m\u001b[39mresult\u001b[39m\u001b[39m'\u001b[39m]\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:354\u001b[0m, in \u001b[0;36m_execute_cloud_call\u001b[1;34m(call, num_retries)\u001b[0m\n\u001b[0;32m 352\u001b[0m \u001b[39mreturn\u001b[39;00m call\u001b[39m.\u001b[39mexecute(num_retries\u001b[39m=\u001b[39mnum_retries)\n\u001b[0;32m 353\u001b[0m \u001b[39mexcept\u001b[39;00m googleapiclient\u001b[39m.\u001b[39merrors\u001b[39m.\u001b[39mHttpError \u001b[39mas\u001b[39;00m e:\n\u001b[1;32m--> 354\u001b[0m \u001b[39mraise\u001b[39;00m _translate_cloud_exception(e)\n", "\u001b[1;31mEEException\u001b[0m: GeometryConstructors.Polygon, argument 'coordinates': Invalid type.\nExpected type: List.\nActual type: FeatureCollection." ] } ], "source": [ "Map = geemap.Map()\n", "Map.centerObject(img, 10)\n", "Map.addLayer(img['NDVI'], {\"min\":-1, \"max\":1, \"palette\":['red', 'white', 'blue']}, \"NDVI\")\n", "Map" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "ename": "EEException", "evalue": "Image.select: Pattern 'NDVI' did not match any bands.", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mHttpError\u001b[0m Traceback (most recent call last)", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:352\u001b[0m, in \u001b[0;36m_execute_cloud_call\u001b[1;34m(call, num_retries)\u001b[0m\n\u001b[0;32m 351\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[1;32m--> 352\u001b[0m \u001b[39mreturn\u001b[39;00m call\u001b[39m.\u001b[39;49mexecute(num_retries\u001b[39m=\u001b[39;49mnum_retries)\n\u001b[0;32m 353\u001b[0m \u001b[39mexcept\u001b[39;00m googleapiclient\u001b[39m.\u001b[39merrors\u001b[39m.\u001b[39mHttpError \u001b[39mas\u001b[39;00m e:\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\googleapiclient\\_helpers.py:130\u001b[0m, in \u001b[0;36mpositional..positional_decorator..positional_wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 129\u001b[0m logger\u001b[39m.\u001b[39mwarning(message)\n\u001b[1;32m--> 130\u001b[0m \u001b[39mreturn\u001b[39;00m wrapped(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\googleapiclient\\http.py:938\u001b[0m, in \u001b[0;36mHttpRequest.execute\u001b[1;34m(self, http, num_retries)\u001b[0m\n\u001b[0;32m 937\u001b[0m \u001b[39mif\u001b[39;00m resp\u001b[39m.\u001b[39mstatus \u001b[39m>\u001b[39m\u001b[39m=\u001b[39m \u001b[39m300\u001b[39m:\n\u001b[1;32m--> 938\u001b[0m \u001b[39mraise\u001b[39;00m HttpError(resp, content, uri\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39muri)\n\u001b[0;32m 939\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpostproc(resp, content)\n", "\u001b[1;31mHttpError\u001b[0m: ", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[1;31mEEException\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[109], line 34\u001b[0m\n\u001b[0;32m 32\u001b[0m Map \u001b[39m=\u001b[39m geemap\u001b[39m.\u001b[39mMap()\n\u001b[0;32m 33\u001b[0m Map\u001b[39m.\u001b[39mcenterObject(img, \u001b[39m10\u001b[39m)\n\u001b[1;32m---> 34\u001b[0m Map\u001b[39m.\u001b[39;49maddLayer(img\u001b[39m.\u001b[39;49mselect(\u001b[39m'\u001b[39;49m\u001b[39mNDVI\u001b[39;49m\u001b[39m'\u001b[39;49m), {\u001b[39m\"\u001b[39;49m\u001b[39mmin\u001b[39;49m\u001b[39m\"\u001b[39;49m: \u001b[39m-\u001b[39;49m\u001b[39m1\u001b[39;49m, \u001b[39m\"\u001b[39;49m\u001b[39mmax\u001b[39;49m\u001b[39m\"\u001b[39;49m: \u001b[39m1\u001b[39;49m, \u001b[39m\"\u001b[39;49m\u001b[39mpalette\u001b[39;49m\u001b[39m\"\u001b[39;49m: [\u001b[39m'\u001b[39;49m\u001b[39mred\u001b[39;49m\u001b[39m'\u001b[39;49m, \u001b[39m'\u001b[39;49m\u001b[39mwhite\u001b[39;49m\u001b[39m'\u001b[39;49m, \u001b[39m'\u001b[39;49m\u001b[39mblue\u001b[39;49m\u001b[39m'\u001b[39;49m]}, \u001b[39m\"\u001b[39;49m\u001b[39mNDVI\u001b[39;49m\u001b[39m\"\u001b[39;49m)\n\u001b[0;32m 35\u001b[0m Map\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\geemap\\geemap.py:447\u001b[0m, in \u001b[0;36mMap.add_ee_layer\u001b[1;34m(self, ee_object, vis_params, name, shown, opacity)\u001b[0m\n\u001b[0;32m 445\u001b[0m layer_count \u001b[39m=\u001b[39m \u001b[39mlen\u001b[39m(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mlayers)\n\u001b[0;32m 446\u001b[0m name \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mLayer \u001b[39m\u001b[39m\"\u001b[39m \u001b[39m+\u001b[39m \u001b[39mstr\u001b[39m(layer_count \u001b[39m+\u001b[39m \u001b[39m1\u001b[39m)\n\u001b[1;32m--> 447\u001b[0m tile_layer \u001b[39m=\u001b[39m EELeafletTileLayer(ee_object, vis_params, name, shown, opacity)\n\u001b[0;32m 449\u001b[0m layer \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mfind_layer(name\u001b[39m=\u001b[39mname)\n\u001b[0;32m 450\u001b[0m \u001b[39mif\u001b[39;00m layer \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\geemap\\ee_tile_layers.py:134\u001b[0m, in \u001b[0;36mEELeafletTileLayer.__init__\u001b[1;34m(self, ee_object, vis_params, name, shown, opacity, **kwargs)\u001b[0m\n\u001b[0;32m 116\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__init__\u001b[39m(\n\u001b[0;32m 117\u001b[0m \u001b[39mself\u001b[39m,\n\u001b[0;32m 118\u001b[0m ee_object,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 123\u001b[0m \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs,\n\u001b[0;32m 124\u001b[0m ):\n\u001b[0;32m 125\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Initialize the ipyleaflet tile layer.\u001b[39;00m\n\u001b[0;32m 126\u001b[0m \n\u001b[0;32m 127\u001b[0m \u001b[39m Args:\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 132\u001b[0m \u001b[39m opacity (float, optional): The layer's opacity represented as a number between 0 and 1. Defaults to 1.\u001b[39;00m\n\u001b[0;32m 133\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 134\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39murl_format \u001b[39m=\u001b[39m _get_tile_url_format(\n\u001b[0;32m 135\u001b[0m ee_object, _validate_vis_params(vis_params)\n\u001b[0;32m 136\u001b[0m )\n\u001b[0;32m 137\u001b[0m \u001b[39msuper\u001b[39m()\u001b[39m.\u001b[39m\u001b[39m__init__\u001b[39m(\n\u001b[0;32m 138\u001b[0m url\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39murl_format,\n\u001b[0;32m 139\u001b[0m attribution\u001b[39m=\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mGoogle Earth Engine\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 144\u001b[0m \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs,\n\u001b[0;32m 145\u001b[0m )\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\geemap\\ee_tile_layers.py:18\u001b[0m, in \u001b[0;36m_get_tile_url_format\u001b[1;34m(ee_object, vis_params)\u001b[0m\n\u001b[0;32m 16\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_get_tile_url_format\u001b[39m(ee_object, vis_params):\n\u001b[0;32m 17\u001b[0m image \u001b[39m=\u001b[39m _ee_object_to_image(ee_object, vis_params)\n\u001b[1;32m---> 18\u001b[0m map_id_dict \u001b[39m=\u001b[39m ee\u001b[39m.\u001b[39;49mImage(image)\u001b[39m.\u001b[39;49mgetMapId(vis_params)\n\u001b[0;32m 19\u001b[0m \u001b[39mreturn\u001b[39;00m map_id_dict[\u001b[39m\"\u001b[39m\u001b[39mtile_fetcher\u001b[39m\u001b[39m\"\u001b[39m]\u001b[39m.\u001b[39murl_format\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\image.py:126\u001b[0m, in \u001b[0;36mImage.getMapId\u001b[1;34m(self, vis_params)\u001b[0m\n\u001b[0;32m 124\u001b[0m vis_image, request \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_apply_visualization(vis_params)\n\u001b[0;32m 125\u001b[0m request[\u001b[39m'\u001b[39m\u001b[39mimage\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m=\u001b[39m vis_image\n\u001b[1;32m--> 126\u001b[0m response \u001b[39m=\u001b[39m data\u001b[39m.\u001b[39;49mgetMapId(request)\n\u001b[0;32m 127\u001b[0m response[\u001b[39m'\u001b[39m\u001b[39mimage\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\n\u001b[0;32m 128\u001b[0m \u001b[39mreturn\u001b[39;00m response\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:662\u001b[0m, in \u001b[0;36mgetMapId\u001b[1;34m(params)\u001b[0m\n\u001b[0;32m 657\u001b[0m queryParams \u001b[39m=\u001b[39m {\n\u001b[0;32m 658\u001b[0m \u001b[39m'\u001b[39m\u001b[39mfields\u001b[39m\u001b[39m'\u001b[39m: \u001b[39m'\u001b[39m\u001b[39mname\u001b[39m\u001b[39m'\u001b[39m,\n\u001b[0;32m 659\u001b[0m \u001b[39m'\u001b[39m\u001b[39mbody\u001b[39m\u001b[39m'\u001b[39m: request,\n\u001b[0;32m 660\u001b[0m }\n\u001b[0;32m 661\u001b[0m _maybe_populate_workload_tag(queryParams)\n\u001b[1;32m--> 662\u001b[0m result \u001b[39m=\u001b[39m _execute_cloud_call(\n\u001b[0;32m 663\u001b[0m _get_cloud_projects()\n\u001b[0;32m 664\u001b[0m \u001b[39m.\u001b[39;49mmaps()\n\u001b[0;32m 665\u001b[0m \u001b[39m.\u001b[39;49mcreate(parent\u001b[39m=\u001b[39;49m_get_projects_path(), \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mqueryParams)\n\u001b[0;32m 666\u001b[0m )\n\u001b[0;32m 667\u001b[0m map_name \u001b[39m=\u001b[39m result[\u001b[39m'\u001b[39m\u001b[39mname\u001b[39m\u001b[39m'\u001b[39m]\n\u001b[0;32m 668\u001b[0m url_format \u001b[39m=\u001b[39m \u001b[39m'\u001b[39m\u001b[39m%s\u001b[39;00m\u001b[39m/\u001b[39m\u001b[39m%s\u001b[39;00m\u001b[39m/\u001b[39m\u001b[39m%s\u001b[39;00m\u001b[39m/tiles/\u001b[39m\u001b[39m{z}\u001b[39;00m\u001b[39m/\u001b[39m\u001b[39m{x}\u001b[39;00m\u001b[39m/\u001b[39m\u001b[39m{y}\u001b[39;00m\u001b[39m'\u001b[39m \u001b[39m%\u001b[39m (\n\u001b[0;32m 669\u001b[0m _tile_base_url, _cloud_api_utils\u001b[39m.\u001b[39mVERSION, map_name)\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash_scan\\lib\\site-packages\\ee\\data.py:354\u001b[0m, in \u001b[0;36m_execute_cloud_call\u001b[1;34m(call, num_retries)\u001b[0m\n\u001b[0;32m 352\u001b[0m \u001b[39mreturn\u001b[39;00m call\u001b[39m.\u001b[39mexecute(num_retries\u001b[39m=\u001b[39mnum_retries)\n\u001b[0;32m 353\u001b[0m \u001b[39mexcept\u001b[39;00m googleapiclient\u001b[39m.\u001b[39merrors\u001b[39m.\u001b[39mHttpError \u001b[39mas\u001b[39;00m e:\n\u001b[1;32m--> 354\u001b[0m \u001b[39mraise\u001b[39;00m _translate_cloud_exception(e)\n", "\u001b[1;31mEEException\u001b[0m: Image.select: Pattern 'NDVI' did not match any bands." ] } ], "source": [ "import ee\n", "import geopandas as gpd\n", "import geemap\n", "\n", "# Define the path to your GeoJSON file\n", "datadir = 'C:/Users/jtrum/world_bank/data/'\n", "aoi_path = datadir + 'luanda2clean.geojson'\n", "\n", "# Load the GeoJSON file locally using geopandas\n", "aoi_gdf = gpd.read_file(aoi_path)\n", "\n", "# Convert the geopandas GeoDataFrame to a FeatureCollection for Earth Engine\n", "aoi = ee.FeatureCollection(aoi_gdf.__geo_interface__)\n", "\n", "# Rest of your code remains the same\n", "sentinel = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')\\\n", " .filterBounds(aoi)\\\n", " .filterDate('2019-01-01', '2019-12-31')\\\n", " .filterMetadata('CLOUDY_PIXEL_PERCENTAGE', 'less_than', 10)\\\n", " .first()\\\n", " .multiply(0.0001)\n", "\n", "idx = spyndex.computeIndex(index=['VARI', 'NDWI', 'NDVI'], \n", " params={\"R\": sentinel.select(\"B4\"),\n", " \"N\": sentinel.select(\"B8\"),\n", " \"G\": sentinel.select(\"B3\"),\n", " \"B\": sentinel.select(\"B2\")\n", " })\n", "\n", "img = sentinel.addBands(idx)\n", "\n", "Map = geemap.Map()\n", "Map.centerObject(img, 10)\n", "Map.addLayer(img.select('NDVI'), {\"min\": -1, \"max\": 1, \"palette\": ['red', 'white', 'blue']}, \"NDVI\")\n", "Map.addLayer(img.select('NDWI'), {\"min\": -1, \"max\": 1, \"palette\": ['red', 'white', 'blue']}, \"NDWI\")\n", "Map.addLayer(img.select('VARI'), {\"min\": -1, \"max\": 1, \"palette\": ['red', 'white', 'blue']}, \"VARI\")\n", "Map\n" ] } ], "metadata": { "kernelspec": { "display_name": "wash_scan", "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.8.17" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }