{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f992b9af",
   "metadata": {},
   "source": [
    "# Modul 7 – Aktiviti Jupyter: Machine Learning for Image Processing\n",
    "Dalam notebook ini, kita akan:\n",
    "1. Guna **scikit-image** dan **sklearn** untuk preprocessing\n",
    "2. Ekstrak ciri menggunakan **HOG**\n",
    "3. Latih model **SVM** dengan dataset **digits** (MNIST-style)\n",
    "4. Uji model dan visualkan keputusan"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "628d97a7",
   "metadata": {},
   "source": [
    "## 1. Import Pustaka"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "9ccc1c39-d8c7-4d2c-9038-d78fd22cc1ec",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import datasets, svm, metrics\n",
    "from skimage.feature import hog\n",
    "from skimage import exposure"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "367f34c0",
   "metadata": {},
   "source": [
    "## 2. Muat Turun Dataset Digit dari `sklearn.datasets`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "9661c67a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Jumlah imej: 1797\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAGbCAYAAAAr/4yjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAC1tJREFUeJzt3WuoZeMDx/Fnj+ugdBC5FA5D1IRmcotc5iDxgkJeSSLJCykMwvDKnCKS2wiDeIOQIjKMdxqMCBFmxouR+xy3MMzM0rPKb5g587dnzPz3Webzqd3Ze7XWPmufF+t7nnXbvaZpmgIApZRJg14BACYOUQAgRAGAEAUAQhQACFEAIEQBgBAFAEIUAAhR4D/p008/Lb1er9xyyy0b7T1fffXV9j3rT/ivEgUmjIceeqjd6L755pvlv+jpp58up5xyStljjz3KNttsU/baa69y1llnlffee2/Qqwax5eqnwKb07rvvlqGhoXLZZZeVXXbZpXzxxRflwQcfLIcffnh57bXXyiGHHDLoVQRRgP+XG264Ya1pF154YTtiuOeee8q99947kPWCv7L7iE757bff2o3rtGnTyo477li23377cuyxx5b58+evc5nbbrut7L333mXy5MnluOOOG3d3zYcfftjuytlpp53KtttuW6ZPn16effbZf1yfn3/+uV32m2++2aDPs+uuu5btttuufPfddxu0PGxsokCn/PDDD+X+++8vxx9/fBkdHS033nhj+frrr9t99W+//fZa8z/yyCPljjvuKJdeemm55ppr2iCceOKJ5csvv8w877//fjnyyCPLBx98UK6++upy6623trE544wz2uMA/8vrr79eDjrooHLnnXf2/RlqAOo6191JdaRQP9OMGTPW8y8Bm0j9PgWYCObOnVu/26N544031jnPihUrmuXLl/9t2tjYWLPbbrs1F1xwQaYtWbKkfa/Jkyc3S5cuzfQFCxa00y+//PJMmzFjRjN16tTm119/zbRVq1Y1Rx99dDNlypRMmz9/frts/bnmtFmzZvX9OQ888MB2mfrYYYcdmuuuu65ZuXJl38vDpmSkQKdsscUWZeutt26fr1q1qixbtqysWLGi3d3z1ltvrTV//W9/zz33zOt6UPeII44ozz//fPu6Lv/KK6+Uc845p/z444/tbqD6+Pbbb9vRx8cff1w+++yzda5PHbHU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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "digits = datasets.load_digits()\n",
    "print(\"Jumlah imej:\", len(digits.images))\n",
    "plt.imshow(digits.images[23], cmap='gray')\n",
    "plt.title(f'Label: {digits.target[23]}')\n",
    "plt.axis('off')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e336f148",
   "metadata": {},
   "source": [
    "## 3. Ekstrak Ciri HOG daripada Set Imej"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "db2f32c3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saiz ciri HOG: (1797, 32)\n"
     ]
    }
   ],
   "source": [
    "features = []\n",
    "for image in digits.images:\n",
    "    fd, _ = hog(image, orientations=8, pixels_per_cell=(4, 4),\n",
    "               cells_per_block=(1, 1), visualize=True)\n",
    "    features.append(fd)\n",
    "\n",
    "features = np.array(features)\n",
    "print(\"Saiz ciri HOG:\", features.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ac53c98e",
   "metadata": {},
   "source": [
    "## 4. Latih Model SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "fe7f60ad",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model dilatih.\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(features, digits.target, test_size=0.3, random_state=42)\n",
    "\n",
    "clf = svm.SVC(kernel='linear')\n",
    "clf.fit(X_train, y_train)\n",
    "print(\"Model dilatih.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d01cd0e0",
   "metadata": {},
   "source": [
    "## 5. Uji Model dan Papar Hasil"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "9317eeb8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification Report:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "           0       0.86      0.83      0.85        53\n",
      "           1       0.96      0.90      0.93        50\n",
      "           2       0.93      0.89      0.91        47\n",
      "           3       0.60      0.69      0.64        54\n",
      "           4       0.78      0.77      0.77        60\n",
      "           5       0.83      0.82      0.82        66\n",
      "           6       0.86      0.94      0.90        53\n",
      "           7       0.84      0.89      0.87        55\n",
      "           8       0.65      0.70      0.67        43\n",
      "           9       0.78      0.64      0.70        59\n",
      "\n",
      "    accuracy                           0.81       540\n",
      "   macro avg       0.81      0.81      0.81       540\n",
      "weighted avg       0.81      0.81      0.81       540\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA94AAAHICAYAAAC4fTKEAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAIoxJREFUeJzt3QtsnWX9B/CnUBAE/quAIBfpEbl5CSuCGJGwyh1B1nELAqZdxHhD6IIssInrQIUoQhdANF5aEodEiBRDuIlpCV6iiXBmRoxRpGUD4xBpDSig7vzzvEmXtkzYuv04fXs+n+TkLKenv/P07PzO+37fy/M21Wq1WgIAAABCbBNTFgAAAMgEbwAAAAgkeAMAAEAgwRsAAAACCd4AAAAQSPAGAACAQII3AAAABBK8AQAAIJDgDQAAAIEE75KoVCqpq6ur3sOAGUNPwGR6AibTEzCZnqgvwXsT9Pf3p6ampg23HXbYIR100EHpoosuSn/9619TWTzxxBPpvPPOS3vssUfacccd04EHHpiWLl1a72FRQmXviZ6enknjn3r7xS9+Ue8hUjJ6AmZXT2R/+tOf0llnnZXe8pa3pDe/+c3p6KOPToODg/UeFiVV9p4YHh7+n8uI22+/vd7DK4Xmeg+gTK666qr0jne8I7300kvp5z//ebrlllvSvffem1avXl18Ic9k1Wo1tbe3p3322SddeumlabfddktPPfVUWrNmTb2HRomVtSfOOOOMdMABB7zq8SVLlqQXXnghvf/976/LuCg/PQGzoyfy+tEHP/jBtO2226bLLrss7bTTTqmvry+deOKJ6Wc/+1k65phj6j1ESqqsPTHuYx/7WPrIRz4y6bHcK7w+wXsznHLKKemII44o/n3hhRcW4fX6669Pd999d/Eh3JgXX3yx+LKup/Xr16ePf/zj6ZBDDim21Oa93dDIPXHooYcWt6krWWvXri3+ju23375uY6Pc9ATMjp649tpr0+joaBGGDj744OKxT37yk8W61KJFi9Jvf/vbuo6P8iprT4x73/vely644IJ6D6OUHGq+BY499tji/sknnyzu8zkTO++8c3FId94StMsuu6Tzzz9/Q/jt7e1N73nPe4pDS/bcc8/0qU99Kj3//POTatZqtfTlL3857bvvvsVWrw9/+MPp8ccf3+jr59fJt9fz4IMPFguOZcuWFaH7n//8Z/rvf/+7Fd4BKGdPbMwPf/jD4rXGxwdbg56AcvbEI488kg477LANoTvLtU8//fT06KOPpj/+8Y9b9D5A2Xpi6oaAV155ZZp/ceMSvLfA+Ic0b6ka95///CeddNJJxXnU1113XTrzzDOLx3NT5EOVPvShD6UVK1akhQsXppUrVxbP/fe//73h97/0pS+lK6+8Ms2dOzd9/etfT/vvv39xWFP+gE913HHHFbfX89BDDxX3b3rTm4otbHmLWW7Cc889N/3973/fKu8FlKknNia/9tvf/naHD7JV6QkoZ0+8/PLLGz1CcPxQYHu8abSeGLd8+fJiw0AO/vk0pLyDj01U43X19fXV8lv10EMP1Z599tnamjVrarfffnttt912q+244461tWvXFs/r7Owsnnf55ZdP+v1HHnmkeHzlypWTHr///vsnPb5u3bra9ttvXzv11FNr69ev3/C8JUuWFM/L9SdqbW0tbq/n9NNPL34/j/f888+v3XnnnbUrr7yy1tzcXDvqqKMmvRY0Qk9MtXr16qLe4sWLN/t3IdMTMLt64qMf/WitpaWl9o9//GPS4x/84AeLutddd9003hUaWdl7YmRkpHbiiSfWbrnlltpPfvKTWm9vb22//farbbPNNrV77rlni96bRiF4b0ajTL3lD2n+sI8bb5T8wZzo4osvrs2ZM6dohNxoE28777xz7cILLyyed9tttxW/P7Fmln9vY42yqY499tji908++eRJj19zzTXF4z/96U+nVZfGVfaemOqKK64o6q1atWqr1KPx6AmYXT1x7733Fr9/yimn1B599NHaH/7wh9oll1xS22677YrHr7766mnVpXGVvSc25rnnnqvtueeetYMPPnir1ZzNTK62GW6++eZi2v/m5ubinIp83s8220w+Wj//LJ9PMVE+D2hsbKw4XGRj1q1bV9yPjIwU9/kyXxO99a1vLS5lMV3jh0pNnbAhX1rsiiuuSL/85S/T8ccfP+36NK6y9sREeQPkbbfdlt773ve+anIp2Fx6AmZHT+QJsG688cZ0+eWXF5NJZXnm/6985Stp8eLFxaG20Eg9sTG77rprcbh7nowwT8Y5dcxMJnhvhiOPPHLDLIT/Sz6Pemrz5IkQcpPkczA2JjdCpL333ru4z8090XjjTp2QAWZ7T0yUr0+cF1LXXHPNG/aazF56AmZPT+TrK+dQ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C4x/SPOWqnH/+c9/0kknnZSOPvrodN111204ZCQ3RT63Y+HCheniiy8umivvVXjssceK84S222674nlf+tKXikbJjZZvjz76aDrxxBPTK6+88qrXP+6444r74eHhTRpvd3d30Xi57o9+9KOt8h5AmXti6twHb3/729Mxxxwz7b8fytoT+TXy3pR3vetdkx4/8sgjN/w8jxcapSc2xnKCRu6Jhx56qLh/05veVOyx/+1vf1sc+bFgwYL0zW9+M+26665b8V2ZpWq8rr6+vlp+qx566KHas88+W1uzZk3t9ttvr+222261HXfcsbZ27drieZ2dncXzLr/88km//8gjjxSPr1y5ctLj999//6TH161bV9t+++1rp556am39+vUbnrdkyZLiebn+RK2trcVtU9xzzz215ubm2uOPP75hrDvttNM03xEa3WzoiYlWr15d1Fu8ePFm/y7Mhp7I9fbff/9XPf7iiy9udLww23tiKssJGr0nTj/99OL383jPP//82p133lm78sori3xx1FFHTXotNs6h5pvh+OOPT29961uLrZ15opl8GMhdd91VTDAwUT40b6I77rgjzZkzJ51wwgnpb3/724bb4YcfXtTI50mMb0nKW6I+//nPF4f4TdxTvTF5y9SmbLHNNRctWpQ+/elPp3e/+93T/Oth9vTExvZiZA4fpFF74l//+lexF2OqfCjj+M+hkXpiKssJGr0n8qSCWZ5Y8Ac/+EE688wzi4nirr766vTLX/4y/exnP5vW+9FIHGq+GW6++eZi2v98fnQ+p+Lggw9O22wzedtF/lk+n2LqudVjY2PFtPsbs27duuJ+ZGSkuM/T8k+Um/Mtb3nLtMedz+vOjbl8+fJp14DZ1BNTz4O67bbb0nvf+95XTaQDjdIT+Xy9l19++VWP51l3x38OjdQTE1lOsDWVtSfGlwNTJ4DLV7+44oorivCdNyrwvwnemyGf6zY+C+H/kvcYTG2ePBFCbpLxraVT5UaIkhs0n+ORJ8z5xz/+UdzGt1rlBUnewpXPG/lfTQyzrSemyudE5YXUNddc84a9JrNXWXtir732KvaW5OXCxD0kf/nLX4r7vffeO/T1mb3K2hMTWU6wNZW1J8aXA3ljwUTjGWLqBG+8muD9BnjnO99ZHPbxoQ996DX3GrS2tm7YorX//vtvePzZZ5+d9oc5/14O2V/72teK21T5OoLz5893aTEapiemyguwHDTyFlto1J5oa2tL3/3ud9Pvf//7Sack/frXv97wc2iknpjIcoKZoN49kQ9p/853vlNcfnKiZ5555g3fGFZWzvF+A5xzzjnFdPv5HIip8qyFo6Ojxb/z4Rl5NsIbb7yx2OswLl82YLrT/+etUPm8kam3PLt5Pncv/zsfHgKN0hMT5csn5XOm8qyh++2337T+FpgNPZE3wOa6eWbacbn+t771reK8w6OOOmqafxmUsyfGWU4wU8yE5UTeE9/X11fsfR+XN9pm+dxzXps93m+AefPmFdP/50OUqtVqMZ1/boi8JSp/ma9YsSKdddZZxZaiL3zhC8XzTjvttGL6/3x5gPvuuy/tvvvu05r+Px9G3tHR8arH8x7u3/zmNxv9GczmnpjogQceSM8995zJckiN3hP5XMI88c7Xv/71ImjkyXPycuKRRx4p9vZtu+22YX87zMSeGGc5wUxR755429velpYuXVpcquzkk08uMsSqVauKveD5vO+83OC1Cd5vkLzXIB+i8e1vfzstWbKkmDShUqmkCy64oDhkZFw+Hzvvic7Pz+fbfeADHyguWH/qqafWdfwwG3siB4q80Dr77LO3uBaUvSeuvfbaYuKd/Pr5OrF5Yp48c63Da2nUnsgsJ5hJ6t0TX/ziF4vlRN6bnjfWTgzjvL6mfE2xTXgeAAAAMA3O8QYAAIBAgjcAAAAEErwBAAAgkOANAAAAgQRvAAAACCR4AwAAQCDBGwAAAAI1b+oTm5qaUtm0t7eH1e7q6gqr3dbWFla7t7c3pG5/f38qoy25jH0ZeyLyc9vX1xdWe9WqVWG1h4eHS/dej46OhtVutJ7IWlpawmpHfTdGLt8qlUopP7uRptsXZeyJyP//np6esNrVarV0605l1YjLicj13Kjv88gxR/bE6CxeTtjjDQAAAIEEbwAAAAgkeAMAAEAgwRsAAAACCd4AAAAQSPAGAACAQII3AAAABBK8AQAAIJDgDQAAAIEEbwAAAAgkeAMAAEAgwRsAAAACCd4AAAAQSPAGAACAQII3AAAABBK8AQAAIJDgDQAAAIEEbwAAAAgkeAMAAEAgwRsAAAACCd4AAAAQqDmyOADMdENDQ2G1586dG1J3+fLlKUpLS0sqo9HR0XoPYVaI7IfW1taw2p2dnWG1e3p6QupWKpUUpRH7IfL9jPx8jYyMhNQdHh4OqUvJg3fUQn5wcDCVrUmiG6Wvry+kbrVaDakbXbvRRP3/Z2NjY6VcgZg/f35YbQAAyBxqDgAAAIEEbwAAAAgkeAMAAEAgwRsAAAACCd4AAAAQSPAGAACAQII3AAAABBK8AQAAIJDgDQAAAIEEbwAAAAgkeAMAAEAgwRsAAAACCd4AAAAQSPAGAACAQII3AAAABBK8AQAAIJDgDQAAAIEEbwAAAAgkeAMAAEAgwRsAAAACCd4AAAAQqDnNAG1tbalsenp6wmpXq9Ww2o899lhI3ZaWlpC6jUpPTNbb21u6fuvo6EhR+vv7w2o3orlz54bVHhsbC6lbqVRSlCeffDKs9oIFC8JqDwwMpEbS3t4eUre1tTVFWbRoUVjtoaGh0q07dXV1pTIuN2eq4eHh0n2XR65DRy4nIt/rllmcKezxBgAAgECCNwAAAAQSvAEAACCQ4A0AAACBBG8AAAAIJHgDAABAIMEbAAAAAgneAAAAEEjwBgAAgECCNwAAAAQSvAEAACCQ4A0AAACBBG8AAAAIJHgDAABAIMEbAAAAAgneAAAAEEjwBgAAgECCNwAAAAQSvAEAACCQ4A0AAACBBG8AAAAIJHgDAABAoOY0AwwNDYXUffjhh1OUvr6+sNpl1NLSUu8hzCplfD97e3tTGVWr1ZC6lUolpC5b3/Lly8NqL1u2LKRuZ2dnirJo0aKw2gMDA2G1G00ZlxNtbW31HkJDLH/Y+rq6usJq33XXXaVa/mS33nprWO3ZzB5vAAAACCR4AwAAQCDBGwAAAAIJ3gAAABBI8AYAAIBAgjcAAAAEErwBAAAgkOANAAAAgQRvAAAACCR4AwAAQCDBGwAAAAIJ3gAAABBI8AYAAIBAgjcAAAAEErwBAAAgkOANAAAAgQRvAAAACCR4AwAAQCDBGwAAAAIJ3gAAABBI8AYAAIBAzZHFAWCma2lpqfcQZpRqtVrvIbAJBgYGQuouWLAgRent7Q2r3d7eHlYburu7w2qPjY2lsqlUKvUeQinN6uAd+SVc1i/4wcHBkLptbW2pbCsXM1lZP19lFPVe9/T0hNQFAKB8HGoOAAAAgQRvAAAACCR4AwAAQCDBGwAAAAIJ3gAAABBI8AYAAIBAgjcAAAAEErwBAAAgkOANAAAAgQRvAAAACCR4AwAAQCDBGwAAAAIJ3gAAABBI8AYAAIBAgjcAAAAEErwBAAAgkOANAAAAgQRvAAAACCR4AwAAQCDBGwAAAAIJ3gAAABCoObI4AMx0l1xySVjtkZGRkLqtra0pysDAQFjtlpaWsNrM/P//yNqRarVaSN3h4eGQuo2qvb09rPa8efPCai9cuLB0n6/BwcGw2l1dXWG1+/v7Uz0J3tM0NDSUymhsbCykbrVaDanbqMr4fnZ3d4fVrlQqYbWjAszo6GhIXQAAyseh5gAAABBI8AYAAIBAgjcAAAAEErwBAAAgkOANAAAAgQRvAAAACCR4AwAAQCDBGwAAAAIJ3gAAABBI8AYAAIBAgjcAAAAEErwBAAAgkOANAAAAgQRvAAAACCR4AwAAQCDBGwAAAAIJ3gAAABBI8AYAAIBAgjcAAAAEErwBAAAgkOANAAAAgZrTLNbR0RFWu1KppDKaM2dOSN3R0dGQuo1qaGgopO7Y2FiKcsMNN4TVLqOo/0PK1RctLS2lG3PUcoJyaG9vD6vd1tYWVhsiP7tlHPfw8HAqo0pJM9amsMcbAAAAAgneAAAAEEjwBgAAgECCNwAAAAQSvAEAACCQ4A0AAACBBG8AAAAIJHgDAABAIMEbAAAAAgneAAAAEEjwBgAAgECCNwAAAAQSvAEAACCQ4A0AAACBBG8AAAAIJHgDAABAIMEbAAAAAgneAAAAEEjwBgAAgECCNwAAAAQSvAEAACCQ4A0AAACBmtMsVq1Ww2r39vaG1W5paQmrvWLFipC6Q0NDIXUb1ejoaEjd7u7uFKWvry+s9sjISFjtnp6eUv0fsvW1tbWF1Y7qufb29lTG5RszX+Q6SEdHR1jtefPmhdV++OGHQ+oODw+H1G1UZf3uivo+j1xORPVEmf8fN4U93gAAABBI8AYAAIBAgjcAAAAEErwBAAAgkOANAAAAgQRvAAAACCR4AwAAQCDBGwAAAAIJ3gAAABBI8AYAAIBAgjcAAAAEErwBAAAgkOANAAAAgQRvAAAACCR4AwAAQCDBGwAAAAIJ3gAAABBI8AYAAIBAgjcAAAAEErwBAAAgkOANAAAAgQRvAAAACNRUq9VqkS8AAAAAjcwebwAAAAgkeAMAAEAgwRsAAAACCd4AAAAQSPAGAACAQII3AAAABBK8AQAAIJDgDQAAAIEEbwAAAEhx/h+YZD6bUlmgIAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1000x500 with 10 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "y_pred = clf.predict(X_test)\n",
    "print(\"Classification Report:\\n\", metrics.classification_report(y_test, y_pred))\n",
    "\n",
    "# Papar imej dengan ramalan\n",
    "fig, axes = plt.subplots(2, 5, figsize=(10, 5))\n",
    "for ax, img, pred in zip(axes.ravel(), digits.images[-10:], y_pred[-10:]):\n",
    "    ax.imshow(img, cmap='gray')\n",
    "    ax.set_title(f'Pred: {pred}')\n",
    "    ax.axis('off')\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d23fcac3-a8f3-4761-ae82-10d773b3e3a6",
   "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.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
