{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tensorflow Callbacks \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "import datetime\n",
    "from packaging import version\n",
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "keras.__version__\n",
    "\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "assert version.parse(tf.__version__).release[0] >= 2, \\\n",
    "    \"This notebook requires TensorFlow 2.0 or above.\"\n",
    "tf.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "mnist_digits=keras.datasets.mnist\n",
    "(X_train_full, y_train_full),(X_test,y_test) = mnist_digits.load_data()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_full.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('uint8')"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_full.dtype   # should be an byte value from 0 to 255\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfAAAAGdCAYAAADtxiFiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAsw0lEQVR4nO3df3RUZZ7n8U/JjyLQlYwxJlU1xnTWCdsewzLbwIAsQlCIZA/YGHtEmTMLu7RHG5I56cCyInuWmj69xGFWZAa66dO2zQ+FhjNzQNmFVeMioVnEiRkckHaYOIYmjKnOkoYkYEwg9ewf6VRbJEBuVSXFw32/znnOoW7db92nbpf9zfe5z72PxxhjBAAArHJHqjsAAACcI4EDAGAhEjgAABYigQMAYCESOAAAFiKBAwBgIRI4AAAWIoEDAGCh4anuwLUikYg+//xz+Xw+eTyeVHcHAOCQMUbt7e0KBoO6447BqxO//PJLdXV1Jfw5I0eO1KhRo5LQo6F1yyXwzz//XLm5uanuBgAgQY2NjbrnnnsG5bO//PJL5ed9TeHm7oQ/y+/3q6GhwbokfsslcJ/PJ0mapn+v4RqR4t4AAJy6qis6ogPR/z8fDF1dXQo3d6uhLk/pvvir/Lb2iPIn/EpdXV0k8F4/+tGP9Jd/+ZdqamrSAw88oA0bNuihhx66aVzvsPlwjdBwDwkcAKzz2xU2huIyaLrvjoQSuM0G5Vvv3r1bFRUVWr16tY4fP66HHnpIJSUlOnv27GAcDgDgUt0mknBzoqqqSpMmTZLP51N2drbmz5+v06dPx+yzePFieTyemDZlypSYfTo7O1VeXq6srCyNGTNGjz32mM6dO+eoL4OSwNevX68lS5boO9/5ju6//35t2LBBubm52rx582AcDgDgUhGZhJsTNTU1WrZsmY4dO6bq6mpdvXpVxcXFunz5csx+c+bMUVNTU7QdOHAg5v2Kigrt3btXu3bt0pEjR3Tp0iXNnTtX3d0Dv6af9CH0rq4u1dXV6fnnn4/ZXlxcrKNHj/bZv7OzU52dndHXbW1tye4SAOA2FVFEzmrovvFOvPXWWzGvt2zZouzsbNXV1Wn69OnR7V6vV36/v9/PaG1t1auvvqrXXntNs2bNkiS9/vrrys3N1bvvvqtHH310QH1JegV+/vx5dXd3KycnJ2Z7Tk6OwuFwn/2rqqqUkZERbcxABwAMtba2tpj21cLyRlpbWyVJmZmZMdsPHTqk7OxsjR07Vs8884yam5uj79XV1enKlSsqLi6ObgsGgyosLOy30L2eQbvyf+3kBWNMvxMaVq1apdbW1mhrbGwcrC4BAG4z3cYk3CQpNzc3ppisqqq66bGNMaqsrNS0adNUWFgY3V5SUqIdO3bo4MGDeumll1RbW6uHH344+kdBOBzWyJEjdeedd8Z83vUK3etJ+hB6VlaWhg0b1qcTzc3NfapyqWeYwev1JrsbAAAXiOc69rXxUs896+np6dHtA8lLZWVlOnHihI4cORKzfcGCBdF/FxYWauLEicrLy9P+/ftVWlp63c+7XqF7PUmvwEeOHKkJEyaouro6Znt1dbWmTp2a7MMBAJCw9PT0mHazBF5eXq59+/bpvffeu+nDagKBgPLy8lRfXy+p58ExXV1dunDhQsx+1yt0r2dQhtArKyv105/+VD/72c/0ySef6Hvf+57Onj2r5557bjAOBwBwqYiMuhNoTqt3Y4zKysq0Z88eHTx4UPn5+TeNaWlpUWNjowKBgCRpwoQJGjFiREyh29TUpI8//thRoTsoD3JZsGCBWlpa9P3vf19NTU0qLCzUgQMHlJeXNxiHAwC4VLKG0Adq2bJl2rlzp9588035fL7o5eKMjAylpaXp0qVLCoVCeuKJJxQIBHTmzBm98MILysrK0uOPPx7dd8mSJVq+fLnuuusuZWZmasWKFRo3blx0VvpADNqT2JYuXaqlS5cO1scDADDkep9nUlRUFLN9y5YtWrx4sYYNG6aTJ09q+/btunjxogKBgGbOnKndu3fHPFr25Zdf1vDhw/Xkk0+qo6NDjzzyiLZu3aphw4YNuC8eY0z8f7oMgra2NmVkZKhI3+JRqgBgoavmig7pTbW2tsZMDEum3lzxT5/kyJfAo1Tb2yMae/+vB7Wvg+WWW8wEAICBivy2JRJvK3c+AR4AAMtRgQMArNU7mzyReFuRwAEA1uo2PS2ReFuRwAEA1uIaOAAAsAoVOADAWhF51K2BPz+8v3hbkcABANaKmJ6WSLytGEIHAMBCVOAAAGt1JziEnkhsqpHAAQDWcnMCZwgdAAALUYEDAKwVMR5FTAKz0BOITTUSOADAWgyhAwAAq1CBAwCs1a071J1ALdqdxL4MNRI4AMBaJsFr4IZr4AAADD2ugQMAAKtQgQMArNVt7lC3SeAauMXPQieBAwCsFZFHkQQGkyOyN4MzhA4AgIWowAEA1nLzJDYSOADAWolfA2cIHQAADCEqcACAtXomsSWwmAlD6AAADL1Igo9SZRY6AAAYUlTgAABruXkSGwkcAGCtiO5w7YNcSOAAAGt1G4+6E1hRLJHYVOMaOAAAFqICBwBYqzvBWejdDKEDADD0IuYORRKYxBaxeBIbQ+gAAFiIChwAYC2G0AEAsFBEic0kjySvK0OOIXQAACxEBQ4AsFbiD3Kxt44lgQMArJX4o1TtTeD29hwAABejAgcAWIv1wAEAsJCbh9BJ4AAAayV+H7i9CdzengMA4GJU4AAAa0WMR5FEHuRi8XKiJHAAgLUiCQ6h23wfuL09BwDAxajAAQDWSnw5UXvrWBI4AMBa3fKoO4F7uROJTTV7//QAAMDFqMCBr/AMd/6fxLC7swahJ8lxesXX44rrHu18kcW8+5odx4xe6rz6Ca8f6Tjm7yfudhwjSee7LzuOmfw3yx3H/EHlMccx6MEQOgAAFupWYsPg3cnrypCz908PAABcLOkJPBQKyePxxDS/35/swwAAEB1CT6TZalCG0B944AG9++670dfDhg0bjMMAAFyOxUyS/aHDh1N1AwAGnUlwOVHDbWSx6uvrFQwGlZ+fr6eeekqfffbZdfft7OxUW1tbTAMAADeW9AQ+efJkbd++XW+//bZeeeUVhcNhTZ06VS0tLf3uX1VVpYyMjGjLzc1NdpcAALep3iH0RJqtkt7zkpISPfHEExo3bpxmzZql/fv3S5K2bdvW7/6rVq1Sa2trtDU2Nia7SwCA21TvamSJNFsN+n3gY8aM0bhx41RfX9/v+16vV16vd7C7AQDAbWXQxw46Ozv1ySefKBAIDPahAAAu0/3b5UQTaU5UVVVp0qRJ8vl8ys7O1vz583X69OmYfYwxCoVCCgaDSktLU1FRkU6dOhWzT2dnp8rLy5WVlaUxY8boscce07lz5xz1JekJfMWKFaqpqVFDQ4M++OADffvb31ZbW5sWLVqU7EMBAFxuqIfQa2pqtGzZMh07dkzV1dW6evWqiouLdfny7x67u27dOq1fv16bNm1SbW2t/H6/Zs+erfb29ug+FRUV2rt3r3bt2qUjR47o0qVLmjt3rrq7B/5suKQPoZ87d05PP/20zp8/r7vvvltTpkzRsWPHlJeXl+xDAQAwpN56662Y11u2bFF2drbq6uo0ffp0GWO0YcMGrV69WqWlpZJ65oDl5ORo586devbZZ9Xa2qpXX31Vr732mmbNmiVJev3115Wbm6t3331Xjz766ID6kvQEvmvXrmR/JG5Rw+4vcBxjvCMcx3w+4/ccx3RMcb4IhSRlZjiP+8X4+BbKuN387y98jmP+YtMcxzEfjNvpOKbhSofjGEl68dezHccEf2HiOhbiE9EdiiQwmNwbe+0tzAOdn9Xa2ipJyszMlCQ1NDQoHA6ruLg45rNmzJiho0eP6tlnn1VdXZ2uXLkSs08wGFRhYaGOHj064ARu7/x5AIDrdRtPwk2ScnNzY25prqqquumxjTGqrKzUtGnTVFhYKEkKh8OSpJycnJh9c3Jyou+Fw2GNHDlSd95553X3GQhWIwMAuF5jY6PS09OjrwdSfZeVlenEiRM6cuRIn/c8nthr68aYPtuuNZB9vooKHABgrWRNYktPT49pN0vg5eXl2rdvn9577z3dc8890e29jxG/tpJubm6OVuV+v19dXV26cOHCdfcZCBI4AMBaJsGVyIzDJ7EZY1RWVqY9e/bo4MGDys/Pj3k/Pz9ffr9f1dXV0W1dXV2qqanR1KlTJUkTJkzQiBEjYvZpamrSxx9/HN1nIBhCBwBYq1sedSewIInT2GXLlmnnzp1688035fP5opV2RkaG0tLS5PF4VFFRobVr16qgoEAFBQVau3atRo8erYULF0b3XbJkiZYvX6677rpLmZmZWrFiRfQJpgNFAgcAYIA2b94sSSoqKorZvmXLFi1evFiStHLlSnV0dGjp0qW6cOGCJk+erHfeeUc+3+/u1Hj55Zc1fPhwPfnkk+ro6NAjjzyirVu3Olp+mwQOALBWxCih55lHHN71Z8zNAzwej0KhkEKh0HX3GTVqlDZu3KiNGzc668BXkMABANbqvZadSLyt7O05AAAuRgUOALBWRB5FEpjElkhsqpHAAQDW+urT1OKNtxVD6AAAWIgKHOou+mZcceu3/tBxzNgRI+M6FobWFTPwJQ17/beNix3HDL/sfOGPB/+mzHGM71+uOo6RJO9554ugjP7wg7iOhfi4eRIbCRwAYK2InK/pfW28rez90wMAABejAgcAWMskOAvdWFyBk8ABANb66opi8cbbigQOALCWmyex2dtzAABcjAocAGAthtABALCQmx+lyhA6AAAWogIHAFiLIXQAACzk5gTOEDoAABaiAgcAWMvNFTgJHPKe/jyuuLovcx3HjB3x67iOdbtZ3jTFccxnl7Icx2y9728dx0hSa8T5KmE5f300rmPdypyfBQw1NydwhtABALAQFTgAwFpGid3LbfMoCwkcAGAtNw+hk8ABANZycwLnGjgAABaiAgcAWMvNFTgJHABgLTcncIbQAQCwEBU4AMBaxnhkEqiiE4lNNRI4AMBarAcOAACsQgUOALCWmyexkcChq03huOI2/sUfO47573MuO44ZduJrjmP+YelGxzHx+sH5f+M45tNZox3HdF9schyz8MGljmMk6cyfOY/J1z/EdSwgEW6+Bs4QOgAAFqICBwBYiyF0AAAs5OYhdBI4AMBaJsEK3OYEzjVwAAAsRAUOALCWkWRMYvG2IoEDAKwVkUcensQGAABsQQUOALAWs9ABALBQxHjkcel94AyhAwBgISpwAIC1jElwFrrF09BJ4Ihb5pb3Hcfc/T/vchzT3fIbxzEPFP4nxzGSdGr6zxzH7PvJDMcx2RePOo6Jh+f9+BYYyXf+Py2QEm6+Bs4QOgAAFqICBwBYiwrcgcOHD2vevHkKBoPyeDx64403Yt43xigUCikYDCotLU1FRUU6depUsvoLAEBU72pkiTRbOU7gly9f1vjx47Vp06Z+31+3bp3Wr1+vTZs2qba2Vn6/X7Nnz1Z7e3vCnQUA4Kt6J7El0mzleAi9pKREJSUl/b5njNGGDRu0evVqlZaWSpK2bdumnJwc7dy5U88++2xivQUAAJKSPImtoaFB4XBYxcXF0W1er1czZszQ0aP9z7rt7OxUW1tbTAMAYCB6qmhPAi3V3yB+SU3g4XBYkpSTkxOzPScnJ/retaqqqpSRkRFtubm5yewSAOA2lljyTmwCXKoNym1kHk/sCTHG9NnWa9WqVWptbY22xsbGwegSAAC3laTeRub3+yX1VOKBQCC6vbm5uU9V3svr9crr9SazGwAAlzBKbE1vi0fQk1uB5+fny+/3q7q6Orqtq6tLNTU1mjp1ajIPBQCAq4fQHVfgly5d0qeffhp93dDQoI8++kiZmZm69957VVFRobVr16qgoEAFBQVau3atRo8erYULFya14wAAuJnjBP7hhx9q5syZ0deVlZWSpEWLFmnr1q1auXKlOjo6tHTpUl24cEGTJ0/WO++8I5/Pl7xeAwAguXoM3XECLyoqkrnBvHuPx6NQKKRQKJRIv3Cb6j7fMiTHudI2ckiOI0kP/MkvHcf8v83DnB8o0u08BrjdJToM7qYhdAAAbhVuXk6U1cgAALAQFTgAwFqsRgYAgI2MJ/Hm0M1W5Vy8eLE8Hk9MmzJlSsw+nZ2dKi8vV1ZWlsaMGaPHHntM586dc9QPEjgAAA7cbFVOSZozZ46ampqi7cCBAzHvV1RUaO/evdq1a5eOHDmiS5cuae7cueruHvhkVYbQAQDWSsUkthutytnL6/VGn056rdbWVr366qt67bXXNGvWLEnS66+/rtzcXL377rt69NFHB9QPKnAAgL1MEprUZ1XMzs7OhLp16NAhZWdna+zYsXrmmWfU3Nwcfa+urk5XrlyJWbkzGAyqsLDwuit39ocEDgBwvdzc3JiVMauqquL+rJKSEu3YsUMHDx7USy+9pNraWj388MPRPwrC4bBGjhypO++8MybuRit39ochdACAtZI1C72xsVHp6enR7YkssrVgwYLovwsLCzVx4kTl5eVp//79Ki0tvUFfrr9yZ3+owAEAdktw+FyS0tPTY1oyV8kMBALKy8tTfX29pJ6VO7u6unThwoWY/W60cmd/SOAAAAyilpYWNTY2RpfZnjBhgkaMGBGzcmdTU5M+/vhjRyt3MoQOALBWKh7kcqNVOTMzMxUKhfTEE08oEAjozJkzeuGFF5SVlaXHH39ckpSRkaElS5Zo+fLluuuuu5SZmakVK1Zo3Lhx0VnpA0ECBwDYKwWrkd1oVc7Nmzfr5MmT2r59uy5evKhAIKCZM2dq9+7dMatyvvzyyxo+fLiefPJJdXR06JFHHtHWrVs1bNjAFzrymBstLZYCbW1tysjIUJG+peGeEanuDiw17Pcy4orLPOD8r/Etef/HccyMymWOY3y7jzmOAVLhqrmiQ3pTra2tMRPDkqk3V+T+OKQ70kbF/TmRji/V+FxoUPs6WLgGDgCAhRhCBwDYKwVD6LcKEjgAwF4uTuAMoQMAYCEqcACAveJcEjQm3lIkcACAtVKxGtmtgiF0AAAsRAUOALCXiyexkcABAPZy8TVwhtABALAQFTgAwFoe09MSibcVCRwAYC+ugQO3l+6LrXHFtXz3fscxZ/d1OI55/gfbHcesevJxxzHmeHyLuuT+9/edB9l8Pw7sxTVwAABgEypwAIC9GEIHAMBCLk7gDKEDAGAhKnAAgL1cXIGTwAEA9mIWOgAAsAkVOADAWjyJDQAAG7n4GjhD6AAAWIgEDgCAhRhCBwBYy6MEr4EnrSdDjwQOfEXkHz5xHPPUn/9nxzE71vwPxzEfTXG+AIqmOA+RpAfGlDmOKXilyXHM1c/OOI4BYnAbGQAAsAkVOADAXi6ehU4CBwDYy8UJnCF0AAAsRAUOALAWT2IDAMBGDKEDAACbUIEDAOzl4gqcBA4AsJabr4EzhA4AgIWowAEA9nLxo1RJ4AAAe3ENHEC8Mn/2vuOYstPLHMekv3jOcczP/9XbjmMk6dR/2OQ45hu533Ec86//3PlVvO76zxzH4PbFNXAAAGAVKnAAgL1cPITuuAI/fPiw5s2bp2AwKI/HozfeeCPm/cWLF8vj8cS0KVPiXJQYAIAbMb8bRo+nuSqBX758WePHj9emTde/RjZnzhw1NTVF24EDBxLqJAAAiOV4CL2kpEQlJSU33Mfr9crv98fdKQAABoQh9OQ6dOiQsrOzNXbsWD3zzDNqbm6+7r6dnZ1qa2uLaQAADIhJQrNU0hN4SUmJduzYoYMHD+qll15SbW2tHn74YXV2dva7f1VVlTIyMqItNzc32V0CAOC2k/RZ6AsWLIj+u7CwUBMnTlReXp7279+v0tLSPvuvWrVKlZWV0ddtbW0kcQDAgLj5PvBBv40sEAgoLy9P9fX1/b7v9Xrl9XoHuxsAANxWBv1BLi0tLWpsbFQgEBjsQwEA4BqOK/BLly7p008/jb5uaGjQRx99pMzMTGVmZioUCumJJ55QIBDQmTNn9MILLygrK0uPP/54UjsOAICbZ6E7TuAffvihZs6cGX3de/160aJF2rx5s06ePKnt27fr4sWLCgQCmjlzpnbv3i2fz5e8XgMAIK6BO1JUVCRjrv+N3347vsUTADfx/N+PHMd88e1sxzGTFpQ7jpGkD/7LXzmO+ceZP3Uc8ydfL3Yc0zrNcQhudxYn4USwmAkAABZiMRMAgL24Bg4AgH3cfA2cIXQAACxEBQ4AsBdD6AAA2IchdAAAYBUqcACAvRhCBwDAQi5O4AyhAwDgwOHDhzVv3jwFg0F5PB698cYbMe8bYxQKhRQMBpWWlqaioiKdOnUqZp/Ozk6Vl5crKytLY8aM0WOPPaZz58456gcJHABgrd5JbIk0py5fvqzx48dr06ZN/b6/bt06rV+/Xps2bVJtba38fr9mz56t9vb26D4VFRXau3evdu3apSNHjujSpUuaO3euuru7B9wPhtABAPZKwRB6SUmJSkpK+v84Y7RhwwatXr1apaWlkqRt27YpJydHO3fu1LPPPqvW1la9+uqreu211zRr1ixJ0uuvv67c3Fy9++67evTRRwfUDypwAIC9TBKapLa2tpjW2dkZV3caGhoUDodVXPy7hXq8Xq9mzJiho0ePSpLq6up05cqVmH2CwaAKCwuj+wwEFThgie5fNzuOyflr5zGS9OXKq45jRntGOo555ev/y3HM3McrHMeM3vuB4xi4S25ubszrNWvWKBQKOf6ccDgsScrJyYnZnpOTo1/96lfRfUaOHKk777yzzz698QNBAgcAWCtZD3JpbGxUenp6dLvX602sXx5PzGtjTJ9t1xrIPl/FEDoAwF5JGkJPT0+PafEmcL/fL0l9Kunm5uZoVe73+9XV1aULFy5cd5+BIIEDAJAk+fn58vv9qq6ujm7r6upSTU2Npk6dKkmaMGGCRowYEbNPU1OTPv744+g+A8EQOgDAWql4FvqlS5f06aefRl83NDToo48+UmZmpu69915VVFRo7dq1KigoUEFBgdauXavRo0dr4cKFkqSMjAwtWbJEy5cv11133aXMzEytWLFC48aNi85KHwgSOADAXim4jezDDz/UzJkzo68rKyslSYsWLdLWrVu1cuVKdXR0aOnSpbpw4YImT56sd955Rz6fLxrz8ssva/jw4XryySfV0dGhRx55RFu3btWwYcMG3A8SOAAADhQVFcmY62d+j8ejUCh0w1nso0aN0saNG7Vx48a4+0ECBwDYy8XPQieBAwCs5fltSyTeVsxCBwDAQlTgAAB7MYQOAIB9UnEb2a2CBA4AsBcVOIChFJn2h45j/vmPRzmOKfzDM45jpPgWJonHxt/8W8cxo9/8cBB6AtiHBA4AsJvFVXQiSOAAAGu5+Ro4t5EBAGAhKnAAgL2YxAYAgH0YQgcAAFahAgcA2IshdAAA7MMQOgAAsAoVOADAXgyhAwBgIRI4AAD2cfM1cBI48BWeiYWOY/7pz5wv/PHKv9vmOGb6qC7HMUOp01xxHHPsN/nODxRpch4D3IZI4AAAezGEDgCAfTzGyGPiz8KJxKYat5EBAGAhKnAAgL0YQgcAwD5unoXOEDoAABaiAgcA2IshdAAA7MMQOgAAsAoVOADAXgyhAwBgHzcPoZPAAQD2ogIHbl3D8/Mcx/zzfwzGdazQgl2OY5742vm4jnUre+HXEx3H1PzVFMcxd25733EMgB4kcACA1WweBk8ECRwAYC9jeloi8ZZydBtZVVWVJk2aJJ/Pp+zsbM2fP1+nT5+O2ccYo1AopGAwqLS0NBUVFenUqVNJ7TQAAG7nKIHX1NRo2bJlOnbsmKqrq3X16lUVFxfr8uXL0X3WrVun9evXa9OmTaqtrZXf79fs2bPV3t6e9M4DANytdxZ6Is1WjobQ33rrrZjXW7ZsUXZ2turq6jR9+nQZY7RhwwatXr1apaWlkqRt27YpJydHO3fu1LPPPpu8ngMA4OJZ6Ak9ia21tVWSlJmZKUlqaGhQOBxWcXFxdB+v16sZM2bo6NGj/X5GZ2en2traYhoAALixuBO4MUaVlZWaNm2aCgsLJUnhcFiSlJOTE7NvTk5O9L1rVVVVKSMjI9pyc3Pj7RIAwGU8kcSbreJO4GVlZTpx4oR+/vOf93nP4/HEvDbG9NnWa9WqVWptbY22xsbGeLsEAHAbk4RmqbhuIysvL9e+fft0+PBh3XPPPdHtfr9fUk8lHggEotubm5v7VOW9vF6vvF5vPN0AAMC1HFXgxhiVlZVpz549OnjwoPLz82Pez8/Pl9/vV3V1dXRbV1eXampqNHXq1OT0GACA32IW+gAtW7ZMO3fu1Jtvvimfzxe9rp2RkaG0tDR5PB5VVFRo7dq1KigoUEFBgdauXavRo0dr4cKFg/IFAAAu5uIHuThK4Js3b5YkFRUVxWzfsmWLFi9eLElauXKlOjo6tHTpUl24cEGTJ0/WO++8I5/Pl5QOAwDQi9XIBsgM4C8Vj8ejUCikUCgUb59gieFfv9dxTOuEwM13usaC7791852u8dzv7XEcc6tb3uR8sZD3f+R8URJJytz6d45j7oywMAkwlHgWOgDAXi5+kAsJHABgLTcPoSf0JDYAAJAaVOAAAHsxCx0AAPswhA4AAKxCBQ4AsBez0AEAsA9D6AAAwCpU4AAAe0VMT0sk3lIkcACAvbgGDgCAfTxK8Bp40noy9LgGDgCAhajAbzPDA37HMb/52Zi4jvXd/BrHMU/7fh3XsW5lZf8yzXHM32/+Q8cxWX/7seOYzHZWCMNtjiexAQBgH24jAwAAViGBAwDsZZLQHAiFQvJ4PDHN7//dpUtjjEKhkILBoNLS0lRUVKRTp04l+CX7RwIHAFjLY0zCzakHHnhATU1N0Xby5Mnoe+vWrdP69eu1adMm1dbWyu/3a/bs2Wpvb0/m15ZEAgcAwJHhw4fL7/dH29133y2pp/resGGDVq9erdLSUhUWFmrbtm364osvtHPnzqT3gwQOALBXJAlNUltbW0zr7Oy87iHr6+sVDAaVn5+vp556Sp999pkkqaGhQeFwWMXFxdF9vV6vZsyYoaNHjyb1a0skcACAxZI1hJ6bm6uMjIxoq6qq6vd4kydP1vbt2/X222/rlVdeUTgc1tSpU9XS0qJwOCxJysnJiYnJycmJvpdM3EYGAHC9xsZGpaenR197vd5+9yspKYn+e9y4cXrwwQd13333adu2bZoyZYokyeOJfb6bMabPtmSgAgcA2CtJs9DT09Nj2vUS+LXGjBmjcePGqb6+Pjob/dpqu7m5uU9VngwkcACAvXqfxJZIS0BnZ6c++eQTBQIB5efny+/3q7q6Ovp+V1eXampqNHXq1ES/aR8MoQMArDXUT2JbsWKF5s2bp3vvvVfNzc36wQ9+oLa2Ni1atEgej0cVFRVau3atCgoKVFBQoLVr12r06NFauHBh/J28DhI4AAADdO7cOT399NM6f/687r77bk2ZMkXHjh1TXl6eJGnlypXq6OjQ0qVLdeHCBU2ePFnvvPOOfD5f0vtCAh8iXY9OdB7zvd84jnnhDw44jilOu+w45lb36+6OuOKm71vuOOYb//UfHcdkXnS+yEjEcQTgAkO8mMmuXbtu+L7H41EoFFIoFIq/TwNEAgcAWMsT6WmJxNuKSWwAAFiIChwAYC/WAwcAwEJxrCjWJ95SDKEDAGAhKnAAgLXiXRL0q/G2IoEDAOzl4mvgDKEDAGAhKnAAgL2MEnvKkb0FOAkcAGAvroEDAGAjowSvgSetJ0OOa+AAAFiICnyInJnv/G+lfxr3N4PQk+T54cX7HMf8VU2x4xhPt8dxzDd+0OA4RpIKfv2B45juuI4EIClcPAudBA4AsFdEkvO/8WPjLcUQOgAAFqICBwBYi1noAADYyMXXwBlCBwDAQlTgAAB7ubgCJ4EDAOzl4gTOEDoAABaiAgcA2MvF94GTwAEA1uI2MgAAbMQ1cAAAYBMq8CEy9rt/5zhm7ncnDEJPUmusnJ+HeLDACOASESN5EqiiI/ZW4CRwAIC9GEIHAAA2cZTAq6qqNGnSJPl8PmVnZ2v+/Pk6ffp0zD6LFy+Wx+OJaVOmTElqpwEA6GF+V4XH0+SSCrympkbLli3TsWPHVF1dratXr6q4uFiXL1+O2W/OnDlqamqKtgMHDiS10wAASEoseSc6/J5ijq6Bv/XWWzGvt2zZouzsbNXV1Wn69OnR7V6vV36/Pzk9BAAAfSR0Dby1tVWSlJmZGbP90KFDys7O1tixY/XMM8+oubn5up/R2dmptra2mAYAwIBETOLNUnEncGOMKisrNW3aNBUWFka3l5SUaMeOHTp48KBeeukl1dbW6uGHH1ZnZ2e/n1NVVaWMjIxoy83NjbdLAAC3MZHEm6Xivo2srKxMJ06c0JEjR2K2L1iwIPrvwsJCTZw4UXl5edq/f79KS0v7fM6qVatUWVkZfd3W1kYSBwDgJuJK4OXl5dq3b58OHz6se+6554b7BgIB5eXlqb6+vt/3vV6vvF5vPN0AALidi+8Dd5TAjTEqLy/X3r17dejQIeXn5980pqWlRY2NjQoEAnF3EgCAfkUSvBXMLdfAly1bptdff107d+6Uz+dTOBxWOBxWR0eHJOnSpUtasWKF3n//fZ05c0aHDh3SvHnzlJWVpccff3xQvgAAwMW4jWxgNm/eLEkqKiqK2b5lyxYtXrxYw4YN08mTJ7V9+3ZdvHhRgUBAM2fO1O7du+Xz+ZLWaQAA3M7xEPqNpKWl6e23306oQwAADJhRgtfAk9aTIcdiJgAAe7l4EhuLmQAAYCEqcACAvSIRSQk8jCXiwge5AACQcgyhAwAAm1CBAwDs5eIKnAQOALAXT2IDAAA2oQIHAFjLmIhMAkuCJhKbaiRwAIC9jElsGJxr4AAApIBJ8Bq4xQmca+AAAFiIChwAYK9IRPIkcB2ba+AAAKQAQ+gAAMAmVOAAAGuZSEQmgSF0biMDACAVGEIHAAA2oQIHANgrYiSPOytwEjgAwF7GSErkNjJ7EzhD6AAAWIgKHABgLRMxMgkMoRsqcAAAUsBEEm9x+NGPfqT8/HyNGjVKEyZM0C9+8Yskf7GbI4EDAKxlIibh5tTu3btVUVGh1atX6/jx43rooYdUUlKis2fPDsI3vD4SOAAADqxfv15LlizRd77zHd1///3asGGDcnNztXnz5iHtxy13Dbz3esRVXUno3nwAQGpc1RVJQ3N9+arpTGhBkt6+trW1xWz3er3yer199u/q6lJdXZ2ef/75mO3FxcU6evRo3P2Ixy2XwNvb2yVJR3QgxT0BACSivb1dGRkZg/LZI0eOlN/v15Fw4rnia1/7mnJzc2O2rVmzRqFQqM++58+fV3d3t3JycmK25+TkKBwOJ9wXJ265BB4MBtXY2CifzyePxxPzXltbm3Jzc9XY2Kj09PQU9TD1OA89OA89OA89OA89boXzYIxRe3u7gsHgoB1j1KhRamhoUFdXV8KfZYzpk2/6q76/6tr9+/uMwXbLJfA77rhD99xzzw33SU9Pd/V/oL04Dz04Dz04Dz04Dz1SfR4Gq/L+qlGjRmnUqFGDfpyvysrK0rBhw/pU283NzX2q8sHGJDYAAAZo5MiRmjBhgqqrq2O2V1dXa+rUqUPal1uuAgcA4FZWWVmpP/3TP9XEiRP14IMP6ic/+YnOnj2r5557bkj7YVUC93q9WrNmzU2vTdzuOA89OA89OA89OA89OA+Db8GCBWppadH3v/99NTU1qbCwUAcOHFBeXt6Q9sNjbH6OHAAALsU1cAAALEQCBwDAQiRwAAAsRAIHAMBCViXwW2H5tlQKhULyeDwxze/3p7pbg+7w4cOaN2+egsGgPB6P3njjjZj3jTEKhUIKBoNKS0tTUVGRTp06lZrODqKbnYfFixf3+X1MmTIlNZ0dJFVVVZo0aZJ8Pp+ys7M1f/58nT59OmYfN/weBnIe3PB7cDtrEvitsnxbqj3wwANqamqKtpMnT6a6S4Pu8uXLGj9+vDZt2tTv++vWrdP69eu1adMm1dbWyu/3a/bs2dHn6t8ubnYeJGnOnDkxv48DB26vNQVqamq0bNkyHTt2TNXV1bp69aqKi4t1+fLl6D5u+D0M5DxIt//vwfWMJf7oj/7IPPfcczHbvvGNb5jnn38+RT0aemvWrDHjx49PdTdSSpLZu3dv9HUkEjF+v9+8+OKL0W1ffvmlycjIMD/+8Y9T0MOhce15MMaYRYsWmW9961sp6U+qNDc3G0mmpqbGGOPe38O158EYd/4e3MaKCrx3+bbi4uKY7alYvi3V6uvrFQwGlZ+fr6eeekqfffZZqruUUg0NDQqHwzG/Da/XqxkzZrjutyFJhw4dUnZ2tsaOHatnnnlGzc3Nqe7SoGptbZUkZWZmSnLv7+Ha89DLbb8Ht7Eigd9Ky7el0uTJk7V9+3a9/fbbeuWVVxQOhzV16lS1tLSkumsp0/u/v9t/G5JUUlKiHTt26ODBg3rppZdUW1urhx9+WJ2dnanu2qAwxqiyslLTpk1TYWGhJHf+Hvo7D5L7fg9uZNWjVG+F5dtSqaSkJPrvcePG6cEHH9R9992nbdu2qbKyMoU9Sz23/zaknsc79iosLNTEiROVl5en/fv3q7S0NIU9GxxlZWU6ceKEjhw50uc9N/0ernce3PZ7cCMrKvBbafm2W8mYMWM0btw41dfXp7orKdM7C5/fRl+BQEB5eXm35e+jvLxc+/bt03vvvRez/LDbfg/XOw/9uZ1/D25lRQK/lZZvu5V0dnbqk08+USAQSHVXUiY/P19+vz/mt9HV1aWamhpX/zYkqaWlRY2NjbfV78MYo7KyMu3Zs0cHDx5Ufn5+zPtu+T3c7Dz053b8PbheCifQObJr1y4zYsQI8+qrr5pf/vKXpqKiwowZM8acOXMm1V0bMsuXLzeHDh0yn332mTl27JiZO3eu8fl8t/05aG9vN8ePHzfHjx83ksz69evN8ePHza9+9StjjDEvvviiycjIMHv27DEnT540Tz/9tAkEAqatrS3FPU+uG52H9vZ2s3z5cnP06FHT0NBg3nvvPfPggw+a3//937+tzsN3v/tdk5GRYQ4dOmSampqi7Ysvvoju44bfw83Og1t+D25nTQI3xpgf/vCHJi8vz4wcOdJ885vfjLllwg0WLFhgAoGAGTFihAkGg6a0tNScOnUq1d0adO+9956R1KctWrTIGNNz69CaNWuM3+83Xq/XTJ8+3Zw8eTK1nR4ENzoPX3zxhSkuLjZ33323GTFihLn33nvNokWLzNmzZ1Pd7aTq7/tLMlu2bInu44bfw83Og1t+D27HcqIAAFjIimvgAAAgFgkcAAALkcABALAQCRwAAAuRwAEAsBAJHAAAC5HAAQCwEAkcAAALkcABALAQCRwAAAuRwAEAsBAJHAAAC/1/JNaoiskpk3sAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.figure()\n",
    "plt.imshow(X_train_full[0])\n",
    "plt.colorbar()\n",
    "plt.grid(False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "five\n",
      "5\n"
     ]
    }
   ],
   "source": [
    "class_names = ['zero', 'one', 'two', 'three', 'four',\n",
    "               'five', 'six', 'seven', 'eight', 'nine']\n",
    "print(class_names[y_train_full[0]]) \n",
    "print(y_train_full[0])\n",
    " \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxoAAAMpCAYAAACDrkVRAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAACDjUlEQVR4nO3deZzN5f//8dcZZjFjZhhZBmMmyZY9shtJaVEkWkiUaDUqu8IYUimElk/LpxmJyidRlmT5NCSSJWuaQQZ9hixhxpLBXL8/+pmv97nemuO4zpw5cx73263b93s9Xe/3uc6ny/ucV+9zvS+HUkoJAAAAABgU4O0BAAAAACh6KDQAAAAAGEehAQAAAMA4Cg0AAAAAxlFoAAAAADCOQgMAAACAcRQaAAAAAIwr7kqn3NxcyczMlPDwcHE4HJ4eE3yAUkqys7OlYsWKEhDg2XqV+QdnBTn/RJiDsGL+wdv4DIY3Xcn8c6nQyMzMlJiYGCODQ9Gyf/9+qVy5skdfg/mHyymI+SfCHIQ95h+8jc9geJMr88+lQiM8PDzvhBEREVc/Mvi8rKwsiYmJyZsbnsT8g7OCnH8izEFYMf/gbXwGw5uuZP65VGhcvFUWERHBJINFQdxGZf7hcgrqNj5zEHaYf/A2PoPhTa7MPxaDAwAAADCOQgMAAACAcRQaAAAAAIyj0AAAAABgHIUGAAAAAOMoNAAAAAAYR6EBAAAAwDgKDQAAAADGUWgAAAAAMI5CAwAAAIBxFBoAAAAAjKPQAAAAAGAchQYAAAAA4yg0AAAAABhHoQEAAADAOAoNAAAAAMYV9/YAAFydDRs2aNlbb72lZdOnT7e0e/XqpfXp37+/ljVq1OgqRgcAAPwVdzQAAAAAGEehAQAAAMA4Cg0AAAAAxlFoAAAAADCOxeCXuHDhgpadOHHCrXPZLcY9ffq0pZ2Wlqb1efvtt7Vs0KBBWvbpp59a2iEhIVqfYcOGadno0aP1wcJnbNq0Scvat2+vZVlZWVrmcDgs7Y8//ljr89VXX2nZn3/+eQUjBMxbvny5lvXo0cPSXrFihdanRo0aHhsTfN+4ceO0bNSoUVqmlNKy1NRUSzs+Pt7YuICihDsaAAAAAIyj0AAAAABgHIUGAAAAAON8fo3Gvn37tCwnJ8fSXr16tdZn1apVWnb8+HEt++KLL9wfXD5iYmK0zG7DtLlz52pZeHi4pV2/fn2tD78Z9X0//fSTpX3fffdpfezWETmvxxARiYiIsLSDgoK0PkeOHNGyNWvWaNmNN96Y77lweStXrtSyo0ePWtr33ntvQQ2n0Fu3bp2WNW7c2AsjgS9LSUmxtF999VWtT7FixbTMbv2m3TUWgI47GgAAAACMo9AAAAAAYByFBgAAAADjKDQAAAAAGOdTi8F//vlnLWvXrp2WubvJnqc5LzKz2ywoLCxMy5w3phIRqVixoqVdunRprQ+bVRVezps3iohs3LhRyx5++GFLOzMz0+3XvP766y3tIUOGaH0eeOABLWvZsqWWOc/dESNGuD0uf+S82ZeIyM6dOy1tf10Mnpubq2V79uzRMucHgdhtqgZcau/evZb22bNnvTQSFEZr167VshkzZljadg/y2LZtm0vnnzhxoqXt/D1OROT777/Xsp49e2pZ06ZNXXrNwoA7GgAAAACMo9AAAAAAYByFBgAAAADjKDQAAAAAGOdTi8FjY2O17JprrtEyTy4Gt1uAY7cQ+7vvvtMy592T7Rb4wD888cQTWjZr1iyPvuaGDRss7ZMnT2p97HaTt1u4vHXrVmPj8kfTp0/XshYtWnhhJIXPgQMHtOz999/XMufrZ82aNT02JvieZcuWadnUqVPzPc5uHi1YsEDLypcv797AUCh8/vnnWjZgwAAtO3z4sKVt99CJtm3batmRI0e0bNCgQfmOy+78duf67LPP8j1XYcEdDQAAAADGUWgAAAAAMI5CAwAAAIBxFBoAAAAAjPOpxeBRUVFa9vrrr2vZ/PnzLe2GDRtqfRISElx6zQYNGljadgvM7Hbzttsp0pWFaCh6nBdhi9gvLnRlZ2O7RWcdO3bUMrtFZ867kNr9vXD1wQbswnx17Ha/xt8ef/xxl/o573QP/7Vq1Sot6927t5ZlZWXle67Bgwdrmd2DaFB4nT9/3tJet26d1qdv375adurUKS1zfkDKyJEjtT6tWrXSMrtd5++//35L+9tvv9X62GncuLFL/Qor7mgAAAAAMI5CAwAAAIBxFBoAAAAAjPOpNRp2OnfurGXt2rWztMPDw7U+W7Zs0bIPP/xQy5x/6263HsNOnTp1tMxu0ykUPZs2bbK027dvr/Wx+62ww+HQsjvvvNPS/vTTT7U+dhvqvfzyy1rm/Nv3smXLan3q16/v0rgWLlxoaW/cuFHr06hRIy3zR3bXmj/++MMLI/ENx48fd6nfrbfe6tmBwGfYbYCZmZmZ73F2a94eeeQRE0OCF33yySeWdp8+fVw67rbbbtMy5439IiIiXDqX3YaArqzJiImJ0bJevXq59JqFFXc0AAAAABhHoQEAAADAOAoNAAAAAMZRaAAAAAAwzucXg9txZbFOZGSkS+dyXiD+4IMPan0CAqjX/FV6erqWTZgwwdI+ceKE1sduIXZ0dLSWOS8CK1mypNbHbsM+u8yk06dPW9pvvPGG1mfWrFkeHYOvWLRokZadOXPGCyMpfOwWxWdkZLh0bKVKlQyPBr7gyJEjWvbvf/9by4oVK6ZlpUqVsrRfeuklY+OCd9j9Oxw/frylbfdAk2eeeUbLxo0bp2WuLv52ZvdAFlfYbexs933Bl/ANGQAAAIBxFBoAAAAAjKPQAAAAAGAchQYAAAAA44rkYnBXJCYmatmGDRu0zHnX5WXLlml97HaTRNFz9uxZLXPeOV5E3zXbbjHZxx9/rGWNGzfWMl9ZNLx//35vD6HQSktLc6nfDTfc4OGRFD52f38OHjyoZTVq1NCy8PBwj4wJhYvzwwG6dOni9rn69+9vabdr187tc6HgJSUlaZnzwm8RkeDgYEu7Q4cOWp/XXntNy0qUKJHvGP766y8tW7JkiZbt3btXy5RSlvbIkSO1Pp06dcp3DL6GOxoAAAAAjKPQAAAAAGAchQYAAAAA4yg0AAAAABjnt4vBw8LCtOyDDz7QskaNGlnaffv21frcfPPNWma3sNd5J0q73SpReG3cuFHLnBd+2/nqq6+0LD4+3siYUHQ0adLE20NwW1ZWlpYtXrxYyz755BNL224RpR273X+dd3lG0eQ8j7Zu3erScbfccouWDRgwwMiY4HnHjx/XsnfeeUfL7L5HOS/+njdvntvj2LVrl6Xdo0cPrc/69etdOle3bt0s7SFDhrg9Ll/CHQ0AAAAAxlFoAAAAADCOQgMAAACAcX67RsPOddddp2UpKSmW9qOPPqr1sdt8zS47deqUpf3II49ofaKjo/MbJrzkhRde0DLnDXhERNq2bWtp+/p6DLv36E4f/LM///zT2Lk2b95saefm5mp9li9frmW///67luXk5FjaM2fO1PrYnd9u86umTZta2s4ba4mInDt3Tsvs1ryh6LH7Lf2wYcPyPa5169ZaNn36dC2LjIx0a1woeM7XHRGRw4cPu3Ts1KlTLe1Dhw5pfZKTk7XMbj3l9u3bLe3s7Gytj906kYAA/b/jP/zww5a23Vrhoog7GgAAAACMo9AAAAAAYByFBgAAAADjKDQAAAAAGMdi8Hzce++9lna1atW0PgMHDtSyZcuWadnw4cMt7b1792p9XnzxRS2rVKlSvuOEWQsWLNCyTZs2aZndIrB77rnHE0PyGrv36Jw1aNCggEbje+wWRdv9b/rEE09Y2uPHj3f7NZ0Xg9st1g8MDNSy0NBQLatVq5al/dhjj2l9brzxRi1zfiiCiEj58uUt7cqVK2t9zpw5o2U1a9bUMvi2jIwMLevSpYtb56pataqWOc81+JagoCAtK1eunJbZLfSOi4uztK9mc2Tn718RERFan8zMTC275pprtOzuu+92exy+jDsaAAAAAIyj0AAAAABgHIUGAAAAAOMoNAAAAAAYx2LwK1S3bl0tmz17tpbNnz9fy3r37m1p/+tf/9L67Ny5U8uWLl16BSOECXYLUu12KrVbnPbAAw94ZEymnT17VssSExNdOvaWW26xtF999VUTQyqS3nnnHS2LjY3VstWrVxt7zSpVqljanTp10vrUrl1by5o1a2ZsDHbef/99S9tuIafdwl4UPa+99pqWFStWzK1zubJ7OHxLqVKltMxu5/iOHTtq2dGjRy1tu4f42F0Tnb+jiYhERUVZ2g8++KDWx24xuF0/f8UdDQAAAADGUWgAAAAAMI5CAwAAAIBxFBoAAAAAjGMxuAF2i5Z69uypZY8//rilfe7cOa3PypUrtSw1NVXL7HbdRcELCQnRsujoaC+MJH/Oi7/HjRun9ZkwYYKWxcTEaNnAgQMt7ZIlS17l6PzL0KFDvT0Er1i+fHm+fbp27VoAI0FB2rRpk5Z9++23bp3rnnvu0bIaNWq4dS74lqZNm2rZ4cOHPfqazt/JVqxYofWx23mch1r8H+5oAAAAADCOQgMAAACAcRQaAAAAAIxjjcYV2rJli5Z98cUXWrZu3Tots1uT4cxuE602bdq4ODoUNLvfCxcGdr+Jdl5/8fnnn2t97DYx+vLLL42NC8hP586dvT0EGHbbbbdp2bFjx1w61vl3+dOnTzcyJsAVzpv32q3HsMvYsO//cEcDAAAAgHEUGgAAAACMo9AAAAAAYByFBgAAAADjWAx+ibS0NC2bNm2apW23MPbgwYNuvV7x4vr//HabvQUEUA8WNKWUS9m8efO0bMqUKZ4Y0mVNmjRJy8aOHatlJ06csLQffvhhrc/HH39sbmAAICJHjhzRsmLFirl07DPPPGNpszkoClKHDh28PQSfxzdYAAAAAMZRaAAAAAAwjkIDAAAAgHEUGgAAAACM84vF4HaLtWfNmqVlb731lpZlZGQYG0eTJk0s7RdffFHrU1h3mvY3ru7+aTe3EhISLO3HHntM61OmTBkt+/HHH7VsxowZlvbmzZu1Pvv379ey2NhYLbv99tst7aefflrrA3jbzp07tax58+ZeGAnc9eijj1radg/SuHDhgkvnatGihZExAe749ttvvT0En8cdDQAAAADGUWgAAAAAMI5CAwAAAIBxFBoAAAAAjPP5xeB//PGHlm3fvt3SfvbZZ7U+v/76q7ExNG3aVMuGDBmiZZ06dbK02fHb950/f17L3n77bUv7iy++0PpERkZqWXp6ultjsFss2a5dOy1LSkpy6/xAQcrNzfX2EHAFNm3apGVLly61tO0epBEcHKxldg+oKF++vPuDA67S7t27vT0En8c3XQAAAADGUWgAAAAAMI5CAwAAAIBxhXaNxp9//qllTzzxhJbZ/T7U5G/qWrZsaWkPHDhQ69OhQwctK1GihLExoODZbRB20003adlPP/2U77nsNvWzW1tk55prrrG0H3zwQa3PlClTXDoX4AvWrFmjZb179y74gcAlx48f1zJXrm8VK1bUsokTJ5oYEmBM69atLW27zSfxz7ijAQAAAMA4Cg0AAAAAxlFoAAAAADCOQgMAAACAcV5ZDL527VotmzBhgqW9bt06rc/vv/9ubAyhoaFalpCQoGUvvviipR0WFmZsDCi8KleurGVffvmllr333ntaNnbsWLdec8CAAVr21FNPWdrXX3+9W+cGAABXpm7dupa23Wew3QOI7LKyZcuaG5gP4Y4GAAAAAOMoNAAAAAAYR6EBAAAAwDgKDQAAAADGeWUx+Ny5c13KXFG7dm0tu/vuuy3tYsWKaX0GDRqkZaVKlXJrDPAP0dHRWpaYmOhSBkDkjjvusLRnz57tpZHAlJo1a2pZixYtLO3vv/++oIYDeNSIESO0rE+fPi71e+uttyxtu++vRRF3NAAAAAAYR6EBAAAAwDgKDQAAAADGUWgAAAAAMM6hlFL5dcrKypLIyEg5ceKEREREFMS4UMgV5Jxg/sFZQc8J5iAuxfyDt/EZ7B1ZWVladv/992vZ0qVLtey+++6ztJOTk7U+YWFhVzG6gnMlc4I7GgAAAACMo9AAAAAAYByFBgAAAADjvLJhHwAAAOBL7NYj2G08+uKLL2rZO++8Y2nbbe5bFDfx444GAAAAAOMoNAAAAAAYR6EBAAAAwDgKDQAAAADGsRgcAAAAcIPdAvFp06a5lPkD7mgAAAAAMI5CAwAAAIBxFBoAAAAAjHNpjYZSSkREsrKyPDoY+I6Lc+Hi3PAk5h+cFeT8u/R1mIMQYf7B+/gMhjddyfxzqdDIzs4WEZGYmJirGBaKouzsbImMjPT4a4gw/6AriPl38XVEmIOwYv7B2/gMhje5Mv8cyoVyJDc3VzIzMyU8PFwcDoexAcJ3KaUkOztbKlasKAEBnv0FHvMPzgpy/okwB2HF/IO38RkMb7qS+edSoQEAAAAAV4LF4AAAAACMo9AAAAAAYByFBgAAAADjKDTk70Ut/fr1k6ioKHE4HFKqVCl57rnnvD0sAPAo52vfpk2bvD0kACgUHA6HzJs3z9vD8HksBheRb775Rjp16iSpqalStWpVCQgIkBIlSkh4eLi3hwYAHuN87bvmmmukeHGXnnoOAEXawYMHpXTp0hIcHOztofg0PlFEZPfu3RIdHS0tWrTw9lAAt+Tk5EhQUJC3hwEfUxDXvnPnzklgYKDHzg8AnlChQgVvD6FI8PufTvXu3Vv69+8v+/btE4fDIXFxcdK2bdu8n04NHz5cmjVrph1Xr149GT16dF47OTlZatWqJSEhIVKzZk155513CuotwAdlZGSIw+HQ/mnbtq2IiKxevVratGkjJUqUkJiYGElISJBTp07lHR8XFyfjxo2T3r17S2RkpPTt21dERObMmSM33HCDBAcHS1xcnEycONEbbw8+wO7ad/bsWUlISJBy5cpJSEiItGrVStatW5d3TEpKipQqVcpynnnz5lmerZ+YmCgNGjSQjz76SKpWrSrBwcEFtoM2fNM/zbvU1FRxOByyfPlyady4sYSGhkqLFi0kLS3Nco758+fLjTfeKCEhIVK1alUZM2aMnD9/3htvBz6ibdu2kpCQIEOGDJGoqCipUKGCJCYm5v35pT+duviZ/eWXX8rNN98soaGhUr9+fVmzZo3lnPl9dvsl5eeOHz+ukpKSVOXKldWBAwfUoUOHVHx8vBowYIBSSqmtW7cqEVG7du3KO2bbtm1KRFRaWppSSqn3339fRUdHqzlz5qjffvtNzZkzR0VFRamUlBRvvCX4gPPnz6sDBw7k/fPzzz+rMmXKqJEjR6otW7aokiVLqsmTJ6v09HT1ww8/qIYNG6revXvnHR8bG6siIiLU66+/rnbu3Kl27typ1q9frwICAlRSUpJKS0tTycnJqkSJEio5Odl7bxSFlt21LyEhQVWsWFEtWrRIbd++XfXq1UuVLl1aHT16VCmlVHJysoqMjLScZ+7cuerSj5LRo0ersLAw1aFDB7Vx40a1efNmlZubW5BvDT7mn+bdd999p0RENW3aVKWmpqrt27er1q1bqxYtWuQdv3jxYhUREaFSUlLU7t271ZIlS1RcXJxKTEz04rtCYRcfH68iIiJUYmKiSk9PV9OnT1cOh0MtWbJEKaWUiKi5c+cqpZTas2ePEhFVs2ZNtWDBApWWlqa6du2qYmNj1blz55RSyqXPbn/k94WGUkpNnjxZxcbG5rUvLTSUUqpevXoqKSkprz18+HDVpEmTvHZMTIyaNWuW5Zxjx45VzZs399iYUXScOXNGNW3aVHXs2FFduHBB9ezZU/Xr18/S5/vvv1cBAQHqzJkzSqm/C43OnTtb+nTv3l3deuutlmzw4MGqdu3ann0D8FmXXvtOnjypAgMD1cyZM/P+PCcnR1WsWFFNmDBBKeV6oREYGKgOHTrk8fHD9+U37y4WGsuWLcv784ULFyoRybsetm7dWo0fP95y3hkzZqjo6OiCeRPwSfHx8apVq1aWrEmTJmro0KFKKftC48MPP8zru337diUiaseOHUop5dJntz/y+59OuaJHjx4yc+ZMEfn7KS2ffvqp9OjRQ0REDh8+LPv375c+ffpIyZIl8/4ZN26c7N6925vDho/o06ePZGdny6xZsyQgIEA2bNggKSkplvnUoUMHyc3NlT179uQd17hxY8t5duzYIS1btrRkLVu2lJ07d8qFCxcK5L3Ad+3evVvOnTtnmUOBgYFy0003yY4dO67oXLGxsVK2bFnTQ0QR5Oq8q1evXt7/Hx0dLSIihw4dEhGRDRs2SFJSkuWa2bdvXzlw4ICcPn26gN4JfNGl80rk77l1cV7l199uHrry2e1vWAzugu7du8uwYcNk48aNcubMGdm/f788+OCDIiKSm5srIiIffPCBNG3a1HJcsWLFCnys8C3jxo2TxYsXy08//ZT3lLPc3Fx54oknJCEhQetfpUqVvP8/LCzM8mdKKctv5S9mgCsuzhW7OXQxCwgI0ObUuXPntHM5z03gclyZdyJieaDAxfzi529ubq6MGTNGunTpop0/JCTE+JhRdDg/qMLhcOTNq/z6281DVz67/Q2FhgsqV64sbdq0kZkzZ8qZM2ekffv2Ur58eRERKV++vFSqVEl+++23vLscgCvmzJkjSUlJ8s0338h1112Xlzdq1Ei2b98u1apVu6Lz1a5dW1atWmXJVq9eLdWrV6foRb6qVasmQUFBsmrVKunevbuI/F1ErF+/Pu/hGGXLlpXs7Gw5depUXjHB3hu4Gq7Mu/w0atRI0tLSrviaCZjk7md3UUeh4aIePXpIYmKi5OTkyOTJky1/lpiYKAkJCRIRESF33HGHnD17VtavXy/Hjh2TF154wUsjRmG2bds2eeSRR2To0KFyww03yMGDB0VEJCgoSIYOHSrNmjWTZ555Rvr27SthYWGyY8cOWbp0qUybNu2y5xw4cKA0adJExo4dKw888ICsWbNG3nrrLZ6ABpeEhYXJU089JYMHD5aoqCipUqWKTJgwQU6fPi19+vQREZGmTZtKaGiojBgxQvr37y8//fSTpKSkeHfg8Gn5zbvNmzfne45Ro0ZJx44dJSYmRrp16yYBAQGyZcsW2bp1q4wbN64A3gUgbn92F3Ws0XBRt27d5OjRo3L69Gnp3Lmz5c8ef/xx+fDDDyUlJUXq1q0r8fHxkpKSItdee613BotCb/369XL69GkZN26cREdH5/3TpUsXqVevnqxYsUJ27twprVu3loYNG8rIkSPzfg96OY0aNZLZs2fLZ599JnXq1JFRo0ZJUlKS9O7du2DeFHzeq6++Kvfdd5/07NlTGjVqJLt27ZJvv/1WSpcuLSIiUVFR8sknn8iiRYukbt268umnn1oeBwm4I795l58OHTrIggULZOnSpdKkSRNp1qyZTJo0SWJjYz08cuD/uPvZXdSxMzgAAAAA47ijAQAAAMA4Cg0AAAAAxlFoAAAAADCOQgMAAACAcRQaAAAAAIyj0AAAAABgHIUGAAAAAOMoNAAAAAAYV9yVTrm5uZKZmSnh4eHicDg8PSb4AKWUZGdnS8WKFSUgwLP1KvMPzgpy/okwB2HF/IO38RkMb7qS+edSoZGZmSkxMTFGBoeiZf/+/VK5cmWPvgbzD5dTEPNPhDkIe8w/eBufwfAmV+afS4VGeHh43gkjIiKufmTweVlZWRITE5M3NzyJ+QdnBTn/RJiDsGL+wdv4DIY3Xcn8c6nQuHirLCIigkkGi4K4jcr8w+UU1G185iDsMP/gbXwGw5tcmX8sBgcAAABgHIUGAAAAAOMoNAAAAAAYR6EBAAAAwDgKDQAAAADGUWgAAAAAMI5CAwAAAIBxFBoAAAAAjKPQAAAAAGAchQYAAAAA4yg0AAAAABhHoQEAAADAOAoNAAAAAMZRaAAAAAAwjkIDAAAAgHEUGgAAAACMK+7tAQD424ABA7Rs6tSplnadOnW0PgsWLNCy2NhYcwMDAACFVrt27Vzq99///tfDI9FxRwMAAACAcRQaAAAAAIyj0AAAAABgHIUGAAAAAONYDG5Adna2lp08eVLLFi5caGkfOnRI6zNw4EAtCw4OvorRoTDKyMjQshkzZmiZw+GwtH/55Retz6+//qplLAZHftLT07UsJydHy77//ntL++mnn9b6OM9T0zp37qxln332maUdFBTk0THA886dO6dlq1evtrSHDx+ebx+gqHv++ect7TVr1mh9HnnkkYIazj/ijgYAAAAA4yg0AAAAABhHoQEAAADAONZo5GPPnj2W9oQJE7Q+dr+N27p1q1uvd/DgQS1z3rQNvq9s2bJaFh8fr2VfffVVQQwHRcy2bdss7enTp2t9/vOf/2hZbm6ulv3vf/+ztO3WY3h6jYbd34Mnn3zS0n7zzTe1PhEREZ4aEjzgxIkTWta2bVtLu0KFClofu89Nu36ALxo2bJiW/etf/7K0AwMDtT633HKLx8Z0JbijAQAAAMA4Cg0AAAAAxlFoAAAAADCOQgMAAACAcX67GNxukzO7xYSffPKJpX3mzBmtj1JKy6pUqaJl4eHhlrbd5muzZ8/WMrsNsmrWrKll8B1hYWFaxiZ7MGXEiBGWtvNmoUWB8wL3xx57TOvTqlWrghoOCojdwm8Wg6Mo+/HHH7XMeXNVu2vd/fff77ExXQnuaAAAAAAwjkIDAAAAgHEUGgAAAACMo9AAAAAAYFyRXAzuvLvo0KFDtT6ff/65lmVlZbn1etWrV9eyb7/9VsucF+/YLeg+fPiwlh05csStcaHwOn78uJZt3ry54AeCIunWW2+1tF1dDF6uXDkt69Onj6Vtt3t4QIBr/81q9erVlvaKFStcOg4APG3lypVa9vLLL1van376qdYnKirK2Bjszr9161Ytq1atmqX9xhtvGBuDadzRAAAAAGAchQYAAAAA4yg0AAAAABhHoQEAAADAuCK5GHzu3LmW9gcffGDs3M4LcEREli5dqmUxMTFatnPnTmPjgG87ffq0lu3du9etc61bt07L7B40wM7j/uOpp56ytDt37uzScYGBgVpmcodl5wdu1KlTR+vzv//9z6VzOb+nJk2auD0u+LYzZ854ewgoAvr166dl6enplvYvv/yi9bHbldtdzovPRUT+/PNPLfvwww8t7fr16xsbg2nc0QAAAABgHIUGAAAAAOMoNAAAAAAYVyTXaMyePdut4+Li4rTspptusrRfe+01rY/degw7v/76q1vjQtFTsWJFLXv00Ue1bPTo0fmey65PqVKltOzZZ591bXDwecWLWy/trl6jPM15I9Njx465fS7n9xQcHOz2ueDbNmzYoGXNmzf3wkjgy0qUKKFlDofD0v7rr7+Mvd6mTZu0bN++ffmOwfQ4PI07GgAAAACMo9AAAAAAYByFBgAAAADjKDQAAAAAGFckF4M7b2Ty/vvva31uu+02LbPbjK9cuXLGxvXHH38YOxeKnpEjR2qZK4vBgcLos88+0zLna7HdxpWuSkpKcvtYFE7ODzEQ0R9scfz4ca3P7t27PTQiFFV2n7fbtm3Tslq1alnaV7Mx3qlTpyxtu4cLOfcREWnWrJmWde3a1e1xFDTuaAAAAAAwjkIDAAAAgHEUGgAAAACMo9AAAAAAYFyRXAzuvOtyYmKidwbiZPXq1d4eAnyMUsrbQwAsPvnkEy179dVXtcxugW5OTo5br9mgQQMtCwwMdOtcKLycF36LiLRu3drSnj9/fgGNBkXF/v37teyDDz7QMruHEbz99tuWdtmyZd0exwsvvGBpz549W+tTqVIlLfP1747c0QAAAABgHIUGAAAAAOMoNAAAAAAYR6EBAAAAwLgiuRjcpKlTp1radrs22i3YdTgcWma366Szli1balnz5s3zPQ5Fk/M8sptXgLOMjAxLe8aMGVqfZcuWuXXu77//XsvcnZcRERFaZrdb7p133qllJUqUcOs1ARRtW7dutbS7dOmi9Tl8+LCWJSQkaFl8fLxbY3jjjTe0LCUlJd/jXnzxRbderzDjjgYAAAAA4yg0AAAAABhHoQEAAADAOL9Yo3H69Gkt2759u5YlJSVp2cKFC/M9v6trNJw5bywoIpKcnKxlxYoVy/dcAPyT8++RRUTuueceS3vfvn0FNZwr0qZNGy3r16+fF0YCX3b06FFvDwEF4Pz581pmt4HoY489Zmm7+h1tzZo1WjZ+/HhLe+DAgVqfP//8U8v+85//aJnzOHr16qX1eeKJJ7TM13FHAwAAAIBxFBoAAAAAjKPQAAAAAGAchQYAAAAA43x+Mfi5c+e07Oeff7a077vvPq1PZmamloWGhmqZ84LtFi1aaH0WL16sZXYb+zm7cOGCln355ZdaNmDAAC0LCgrK9/wAIGK/GLIwnGv+/PlatmjRIi2z27APuOjrr7/29hBQAD777DMt69Onj5a58jCe66+/XsvWrVuXb2Y31/73v/9pmd13zHLlylnaH330Ub7jLAq4owEAAADAOAoNAAAAAMZRaAAAAAAwjkIDAAAAgHE+tRg8JydHy+wWYt977735nisxMVHLbr75Zi1r1aqVpW23A2S7du20zG63XmeHDh3SsmHDhmlZlSpVtKxz586WdnBwcL6vB9/j7sLblStXatmzzz57tcNBIVS3bl0tS01NtbRnzJih9bn99tu1LCQkxNi4/v3vf2vZ1KlTjZ0f/sH5c9nuAQIoej7//HMte/TRR7XM7sE4pUqVsrRnzZql9SldurSWvfDCC1q2YsUKS9tuwbirO48fOXLE0o6JidH6OF+7RUSuu+46LfMl3NEAAAAAYByFBgAAAADjKDQAAAAAGEehAQAAAMC4QrsY3G7H79GjR2vZhAkT8j3XHXfcoWX9+/fXMucFRCIihw8ftrTtdqjdsmWLltktzh4yZIilbbdg/KuvvtKy7t27a9mtt976j+cWsV/sZKdhw4Yu9UPBc15Q5sqOpyIic+bM0bJffvnF0q5du7b7A0OhFhsba2m/9NJLBT4GuwdusBgcV8ruYSjO7B4Us3fvXi1z/nuBwuu9997TMrvF03bXtscee8yt13zrrbe0rF+/fpb2mjVr3Dq3iEhubq6lbfcAIl9f+G2HOxoAAAAAjKPQAAAAAGAchQYAAAAA4wrNGo0LFy5Y2iNHjtT6vP7661pWsmRJLXvllVcs7YceekjrY7cew24jFue1HBs3btT6VK9eXcveffddLXP+PV5WVpbWZ/Xq1Vo2c+ZMLfv6668tbec1G5dj93vXPXv2uHQsCt6TTz5padv9btVV77//vqX95ptvun0uID/ffvutt4eAIqB48fy/pthtmHb27FlPDAcFpFOnTlrWpUsXLbNbt+Eu5w31RES2b9+e73GfffaZltWpUyff4ypXruzawHwcdzQAAAAAGEehAQAAAMA4Cg0AAAAAxlFoAAAAADCu0CwGd16oarfwOywsTMvsFsfedtttlvaPP/6o9UlOTtayRYsWadmZM2csbbtNAx999FEtc2WBUkREhJbdfvvtLmWffvqppW23YNzO5MmTXeqHwqFWrVreHgK8xG7TUrsF1rfccouWlShRwiNjupyPPvpIy5577rkCHQOKJudFwTVr1tT6/Prrr1pm97CLd955x9i44FkDBgzw6PlPnDihZbNnz863X7Vq1bQ+999/v7mBFUHc0QAAAABgHIUGAAAAAOMoNAAAAAAYR6EBAAAAwDiHsttS00lWVpZERkbKiRMnbBcwmxAdHW1pHzp0SOsTHBysZXYLw06fPm1p79y50+1xjRkzxtIePny41qdYsWJun99XFcSc8MZrFXZ2u9Dv2rXLpWOd/6rbHXfddde5N7ACVtBzoiBe7/vvv7e0x48fr/VZsmSJlmVkZGiZyd1y//zzT0vb7qEZ/fv317KsrKx8zx0aGqplX3/9tZbdfPPN+Z6rIBXF+ecr7B4yYPdwlz/++EPLQkJCPDEkr+Az+Oq88sorWvbSSy9pWbly5SztdevWaX38ZYfvS13JnOCOBgAAAADjKDQAAAAAGEehAQAAAMA4Cg0AAAAAxhWancErVKhgadstBj979qyWbd68Od9z33XXXVrWpk0bLevcubOWxcXFWdr+uPAbhccNN9ygZbt37/bCSGCa84LqrVu3unTchAkTtCw8PNzImEREli5damlv2LBB6+NwOFw6V9u2bS3tp59+WutT2BZ+o/Czm39BQUFeGAkKo71792rZBx98oGUBAfp/e+/Xr5+l7Y8Lv68WdzQAAAAAGEehAQAAAMA4Cg0AAAAAxhWaNRorV660tOfNm6f12bhxo5Y5b6YiIvLYY49Z2qVLl9b68PtN+CLn34uK2G9wBv/xzjvveHsIttfhe+65R8umTJliaRelDdTgPSdOnNAyu+8QXbp0KYDR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cr27PAoNEcvCRofDISIiubm5eVlYWJilf25urkRHR0tqaqp2rlKlSuX1GTNmjHTp0kXrw8UQV6J79+4ybNgw2bhxo5w5c0b2798vDz74oIj83zz94IMPpGnTppbjihUrVuBjhW/iGojCoFixYrJ06VJZvXq1LFmyRKZNmyYvvviirF271rb/b7/9JpmZmZKbmyt79+61fBEEXKX+/9PMLl77Ls0vzf7pOsn17vL8qtAICgqSCxcuXPV5GjVqJAcPHpTixYtLXFzcZfukpaVJtWrVrvr14N8qV64sbdq0kZkzZ8qZM2ekffv2Ur58eRERKV++vFSqVEl+++036dGjh5dHisKOayAKO4fDIS1btpSWLVvKqFGjJDY2VubOnav1y8nJkR49esgDDzwgNWvWlD59+sjWrVvzro2Aq6pVqyZBQUGyatUq6d69u4j8/XS99evXu7ynFde7y/OrQiMuLk7Wrl0rGRkZUrJkSct/sbsS7du3l+bNm0vnzp3ltddekxo1akhmZqYsWrRIOnfuLI0bN5ZRo0ZJx44dJSYmRrp16yYBAQGyZcsW2bp1q4wbN87wO0NR16NHD0lMTJScnByZPHmy5c8SExMlISFBIiIi5I477pCzZ8/K+vXr5dixY/LCCy94acQojLgGojBbu3atLF++XG677TYpV66crF27Vg4fPiy1atWSLVu2WPq++OKLcuLECZk6daqULFlSvvnmG+nTp48sWLDAS6OHrwoLC5OnnnpKBg8eLFFRUVKlShWZMGGCnD59Wvr06aM9Tc8O17vL85vH24qIDBo0SIoVKya1a9eWsmXLyr59+9w6j8PhkEWLFkmbNm3ksccek+rVq8uDDz4oGRkZef81pUOHDrJgwQJZunSpNGnSRJo1ayaTJk2S2NhYk28JfqJbt25y9OhROX36tLY77uOPPy4ffvihpKSkSN26dSU+Pl5SUlLk2muv9c5gUWhxDURhFhERIStXrpQ777xTqlevLi+99JJMnDhR7rjjDku/1NRUefPNN2XGjBkSEREhAQEBMmPGDFm1apW8++67Xho9fNmrr74q9913n/Ts2VMaNWoku3btkm+//fay64Occb27PIdSbLUJAAAAwCy/uqMBAAAAoGBQaAAAAAAwjkIDAAAAgHEUGgAAAACMo9AAAAAAYByFBgAAAADjKDQAAAAAGOfSzuC5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/PNPl8blfH67TdDs1ka5uyEgCje7eTNy5Egt69atm6X91FNPuf2ae/futbTtfhMNXKm7775by7Zv357vcZGRkVpmt5FpiRIl3BsYCi279WjPPvusljlvYtqwYUOtz88//2xuYEUQdzQAAAAAGEehAQAAAMA4Cg0AAAAAxlFoAAAAADDO44vB7RaS2m2k47zxnt2Gd3befvttLbv33nst7TJlyrh0LpP++OMPLXN18Td8x7x587TMeTM+VxdT33TTTVq2fPlySzslJUXr07dvX5fOP378eEu7S5cuWh+788P3nT9/XstatmypZc4PHxAReffddy3t4sXd/9h4+OGHLe3ffvtN6zNo0CC3zw//tG3bNi1zOBz5Hmf3YINbb73VyJhwdewefLJp0yYtS09P1zLnzZE///xzrc/x48ddGsfUqVMt7TvvvFPrU61aNZfO5a+4owEAAADAOAoNAAAAAMZRaAAAAAAwjkIDAAAAgHEeXwxux243zhYtWljari4G37Jli5bt37/f0r6axeDOu0K+9957Lh33n//8x+3XROFkt1D6ueeey/c4ux2/7RZ+T5s2zZ1hSb169bSsd+/eWubKjs5du3bVsvfff1/L1q1b59rgUCh88cUXWpaWlqZl3333nZZFRUW59ZqzZs3Ssh9//NHSttudnsXg+CcvvPCC28e2b9/e0h41atTVDgce4vw9TkSkT58+Wma3GNyZ3XdOu4eo2O0Kf+2111rav//+e76vByvuaAAAAAAwjkIDAAAAgHEUGgAAAACMo9AAAAAAYJxXFoPbcV4MPn36dLfPtWbNGku7QYMGWp/Vq1e7lDnvTjl27Fi3x+WKWrVqaVnp0qU9+ppwTVJSkpadOnUq3+NGjBihZcOHD3drDK1atdKyO+64Q8vKly/v1vlLliypZXaL2eFb7K6nNWrU0DLn67CrDh48qGXPP/+8ll24cMHSfvbZZ7U+7s5dFE1PP/20pT1v3jyXjqtfv76WzZw509Lm2lZ42X0Xsnv4jysPDoqIiNCyKlWquDewq+DK94WiiDsaAAAAAIyj0AAAAABgHIUGAAAAAOMKzRqNxx9/3NJOTU3V+thtAGXnmWee+cf2lVBKWdoOh8Ptc7nil19+0TK736TabVwDczZt2qRlzut1RPTfnIuI5ObmemJIIiJSrVo1j537cpz/DojYv28UXosX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",
      "text/plain": [
       "<Figure size 1000x1000 with 25 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10,10))\n",
    "for i in range(25):\n",
    "    plt.subplot(5,5,i+1)\n",
    "    plt.xticks([])\n",
    "    plt.yticks([])\n",
    "    plt.grid(False)\n",
    "    plt.imshow(X_train_full[i], cmap=plt.cm.binary)\n",
    "    plt.xlabel(class_names[y_train_full[i]])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "#The dataset is randomised so choose first 5000 of training set for validation and remaining 55000 for training\n",
    "#and normalize into range 0->1.0 instead of 0->255\n",
    "X_valid = X_train_full[:5000]/255.0\n",
    "X_train=X_train_full[5000:]/255.0\n",
    "#similarly for the y target labels\n",
    "y_valid=y_train_full[:5000]\n",
    "y_train=y_train_full[5000:]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Mark Huntly\\anaconda3\\Lib\\site-packages\\keras\\src\\layers\\reshaping\\flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n",
      "  super().__init__(**kwargs)\n"
     ]
    }
   ],
   "source": [
    "model = tf.keras.Sequential()\n",
    "model.add(keras.layers.Flatten(input_shape=(28, 28)))\n",
    "model.add(keras.layers.Dense(300, activation='relu'))\n",
    "model.add(keras.layers.Dense(100, activation='relu'))\n",
    "model.add(keras.layers.Dense(10, activation='softmax'))\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[1mModel: \"sequential\"\u001b[0m\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
       "┃<span style=\"font-weight: bold\"> Layer (type)                    </span>┃<span style=\"font-weight: bold\"> Output Shape           </span>┃<span style=\"font-weight: bold\">       Param # </span>┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
       "│ flatten (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Flatten</span>)               │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">784</span>)            │             <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                   │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">300</span>)            │       <span style=\"color: #00af00; text-decoration-color: #00af00\">235,500</span> │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">100</span>)            │        <span style=\"color: #00af00; text-decoration-color: #00af00\">30,100</span> │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                 │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">10</span>)             │         <span style=\"color: #00af00; text-decoration-color: #00af00\">1,010</span> │\n",
       "└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
       "</pre>\n"
      ],
      "text/plain": [
       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
       "┃\u001b[1m \u001b[0m\u001b[1mLayer (type)                   \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape          \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
       "│ flatten (\u001b[38;5;33mFlatten\u001b[0m)               │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m784\u001b[0m)            │             \u001b[38;5;34m0\u001b[0m │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense (\u001b[38;5;33mDense\u001b[0m)                   │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m300\u001b[0m)            │       \u001b[38;5;34m235,500\u001b[0m │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense_1 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m100\u001b[0m)            │        \u001b[38;5;34m30,100\u001b[0m │\n",
       "├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
       "│ dense_2 (\u001b[38;5;33mDense\u001b[0m)                 │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m10\u001b[0m)             │         \u001b[38;5;34m1,010\u001b[0m │\n",
       "└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">266,610</span> (1.02 MB)\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m266,610\u001b[0m (1.02 MB)\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">266,610</span> (1.02 MB)\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m266,610\u001b[0m (1.02 MB)\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
       "</pre>\n"
      ],
      "text/plain": [
       "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss='sparse_categorical_crossentropy',optimizer='sgd',metrics=[\"accuracy\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.7354 - loss: 1.0129 - val_accuracy: 0.9152 - val_loss: 0.3080\n",
      "Epoch 2/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9130 - loss: 0.3067 - val_accuracy: 0.9328 - val_loss: 0.2454\n",
      "Epoch 3/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9275 - loss: 0.2572 - val_accuracy: 0.9418 - val_loss: 0.2087\n",
      "Epoch 4/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9402 - loss: 0.2172 - val_accuracy: 0.9486 - val_loss: 0.1879\n",
      "Epoch 5/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9466 - loss: 0.1879 - val_accuracy: 0.9558 - val_loss: 0.1639\n",
      "Epoch 6/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9526 - loss: 0.1647 - val_accuracy: 0.9598 - val_loss: 0.1488\n",
      "Epoch 7/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9588 - loss: 0.1445 - val_accuracy: 0.9622 - val_loss: 0.1372\n",
      "Epoch 8/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9613 - loss: 0.1376 - val_accuracy: 0.9654 - val_loss: 0.1297\n",
      "Epoch 9/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9659 - loss: 0.1211 - val_accuracy: 0.9694 - val_loss: 0.1179\n",
      "Epoch 10/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9696 - loss: 0.1110 - val_accuracy: 0.9684 - val_loss: 0.1152\n",
      "Epoch 11/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9715 - loss: 0.1018 - val_accuracy: 0.9694 - val_loss: 0.1079\n",
      "Epoch 12/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9740 - loss: 0.0944 - val_accuracy: 0.9718 - val_loss: 0.1022\n",
      "Epoch 13/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9773 - loss: 0.0838 - val_accuracy: 0.9736 - val_loss: 0.0964\n",
      "Epoch 14/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9774 - loss: 0.0809 - val_accuracy: 0.9752 - val_loss: 0.0928\n",
      "Epoch 15/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9791 - loss: 0.0745 - val_accuracy: 0.9736 - val_loss: 0.0915\n",
      "Epoch 16/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9813 - loss: 0.0683 - val_accuracy: 0.9774 - val_loss: 0.0850\n",
      "Epoch 17/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9824 - loss: 0.0656 - val_accuracy: 0.9782 - val_loss: 0.0830\n",
      "Epoch 18/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 1ms/step - accuracy: 0.9839 - loss: 0.0599 - val_accuracy: 0.9770 - val_loss: 0.0808\n",
      "Epoch 19/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9849 - loss: 0.0563 - val_accuracy: 0.9770 - val_loss: 0.0807\n",
      "Epoch 20/20\n",
      "\u001b[1m1719/1719\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - accuracy: 0.9858 - loss: 0.0523 - val_accuracy: 0.9792 - val_loss: 0.0762\n"
     ]
    }
   ],
   "source": [
    "log_dir = \"logs/fit/\" + datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n",
    "tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)\n",
    "\n",
    "history=model.fit(X_train,y_train,epochs=20,validation_data=(X_valid,y_valid), callbacks=[tensorboard_callback])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m313/313\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 776us/step\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., ..., 1., 0., 0.],\n",
       "       [0., 0., 1., ..., 0., 0., 0.],\n",
       "       [0., 1., 0., ..., 0., 0., 0.],\n",
       "       ...,\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.],\n",
       "       [0., 0., 0., ..., 0., 0., 0.]], dtype=float32)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_new=X_test[:]\n",
    "X_test.shape\n",
    "y_proba=model.predict(X_new)\n",
    "y_proba\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#first image is class 9, second class 2, third is class 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred=tf.argmax(y_proba, axis=1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tf.Tensor([7 2 1 ... 4 5 6], shape=(10000,), dtype=int64)\n"
     ]
    }
   ],
   "source": [
    "print(y_pred)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 974    0    0    1    1    0    0    1    2    1]\n",
      " [   0 1126    3    1    0    1    1    1    2    0]\n",
      " [   4    2 1003   10    3    0    1    7    2    0]\n",
      " [   0    0    0  999    0    2    0    4    3    2]\n",
      " [   4    0    1    1  945    0    5    4    2   20]\n",
      " [   5    1    0   12    1  858    6    2    5    2]\n",
      " [   6    3    2    1    5    5  935    0    1    0]\n",
      " [   2    3    9    2    0    0    0 1005    1    6]\n",
      " [   5    1    5   13    4    3    5    4  932    2]\n",
      " [   4    3    1   11    5    0    1    8    1  975]]\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0      0.970     0.994     0.982       980\n",
      "           1      0.989     0.992     0.990      1135\n",
      "           2      0.979     0.972     0.976      1032\n",
      "           3      0.951     0.989     0.969      1010\n",
      "           4      0.980     0.962     0.971       982\n",
      "           5      0.987     0.962     0.974       892\n",
      "           6      0.980     0.976     0.978       958\n",
      "           7      0.970     0.978     0.974      1028\n",
      "           8      0.980     0.957     0.968       974\n",
      "           9      0.967     0.966     0.967      1009\n",
      "\n",
      "    accuracy                          0.975     10000\n",
      "   macro avg      0.975     0.975     0.975     10000\n",
      "weighted avg      0.975     0.975     0.975     10000\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn import metrics\n",
    "# Print the confusion matrix\n",
    "print(metrics.confusion_matrix(y_test, y_pred))\n",
    "\n",
    "# Print the precision and recall, among other metrics\n",
    "print(metrics.classification_report(y_test, y_pred, digits=3))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "      <iframe id=\"tensorboard-frame-425cc79456a74374\" width=\"100%\" height=\"800\" frameborder=\"0\">\n",
       "      </iframe>\n",
       "      <script>\n",
       "        (function() {\n",
       "          const frame = document.getElementById(\"tensorboard-frame-425cc79456a74374\");\n",
       "          const url = new URL(\"/\", window.location);\n",
       "          const port = 6006;\n",
       "          if (port) {\n",
       "            url.port = port;\n",
       "          }\n",
       "          frame.src = url;\n",
       "        })();\n",
       "      </script>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%tensorboard --logdir logs/fit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
