Cracking a Code using Machine Learning - 404 CTF Hackathon

Handwritten Digit Classification

Project Details

  • Category: Machine Learning
  • Language: Python
  • Mark: 19/20 (national contest)
  • Date: May 2023
  • GitHub: Project Repository

In May 2023, I participated in the 404 CTF Hackathon where I embarked on a project to crack a code using the power of artificial intelligence. Armed with a folder containing handwritten digit images, I used an AI model capable of detecting and classifying these digits. By training the model on a carefully curated dataset and leveraging techniques like Convolutional Neural Networks, I successfully deciphered the hidden code in the images. This project highlights the potential of AI in code decryption and pattern recognition tasks.


Here's a screenshot of some digit images:



Data Collection
For this project, I began by carefully collecting a comprehensive dataset of handwritten digit images. I meticulously gathered a diverse range of examples, ensuring that the dataset represented various writing styles and variations in digit formation. To augment my dataset, I utilized existing databases such as MNIST, which is a popular benchmark dataset for handwritten digit recognition. Additionally, I also considered creating my own dataset by manually collecting handwritten digit images from various sources.

Data Preprocessing
Once I had compiled the dataset, I embarked on the critical task of preprocessing the images to optimize them for training my AI model. This preprocessing stage involved several essential steps. Firstly, I converted the images from their original formats to grayscale, as the color information was unnecessary for digit recognition. Next, to standardize the input, I resized all the images to a uniform dimension of 28x28 pixels. Finally, to ensure reliable model performance, I normalized the pixel intensities, bringing them to a consistent scale. This preprocessing phase played a vital role in enhancing the effectiveness and robustness of my model.

AI Model Development
To tackle the challenge of digit recognition, I developed a powerful AI model utilizing advanced machine learning techniques, specifically Convolutional Neural Networks (CNNs). CNNs have proven to be highly effective in image-related tasks due to their ability to extract essential visual features automatically. By leveraging the power of CNNs, I created a model capable of detecting and classifying handwritten digits within the images accurately. This involved designing and configuring multiple layers of convolutional, pooling, and fully connected layers, each contributing to the model's ability to learn and recognize distinct patterns and structures associated with the digits.

Model Training
With the architecture of my AI model in place, I proceeded to train it using the carefully curated dataset. During the training process, I inputted the training images along with their corresponding labels (which represent the actual digits). The model underwent an iterative learning process, continuously adjusting its internal parameters to minimize the discrepancy between its predictions and the ground truth labels. This iterative process, driven by backpropagation and optimization algorithms like stochastic gradient descent, allowed the model to learn and refine its ability to associate visual features with the correct digit labels.

Model Validation and Fine-tuning
To ensure that my AI model generalized well to unseen data and produced reliable predictions, I subjected it to rigorous validation and fine-tuning procedures. I reserved a portion of the dataset as a separate validation set, which was not used during training. I evaluated the model's performance on this validation set, analyzing metrics such as accuracy, precision, and recall. Based on the validation results, I made necessary adjustments to the model's hyperparameters, including the learning rate, regularization techniques, and network architecture. This iterative process of validation and fine-tuning helped optimize the model's performance and ensure its effectiveness on real-world scenarios.

Testing the Model on Challenge Images
With a well-trained and fine-tuned model at hand, I put it to the test by applying it to the challenge images provided in the 404 CTF. The goal was to leverage the model's capability to predict the digits present in the challenge images accurately. By feeding the challenge images into the model, I obtained predictions for each digit within the images. This step allowed me to detect and classify the digits, gradually revealing the hidden code embedded within the images.

Code Decryption
Thanks to the accurate predictions made by my AI model, I successfully deciphered the code hidden within the challenge images. By carefully analyzing the predicted digits, I deduced the correct code sequence. Through meticulous translation and interpretation of the predicted digits, I successfully converted them into a usable code, enabling me to solve the encryption challenge presented in the 404 CTF. This accomplishment demonstrated the power of AI in tackling complex problem-solving scenarios and showcased my proficiency in developing effective AI models for real-world challenges.

import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
import numpy as np

mnist = tf.keras.datasets.mnist  
(x_train, y_train),(x_test, y_test) = mnist.load_data()  

x_train = tf.keras.utils.normalize(x_train, axis=1)  
x_test = tf.keras.utils.normalize(x_test, axis=1) 

model = tf.keras.models.Sequential()  
model.add(tf.keras.layers.Flatten())  
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))  
model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu))  
model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax))  

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])  

model.fit(x_train, y_train, epochs=10)  

val_loss, val_acc = model.evaluate(x_test, y_test)  
print("\nloss =", val_loss)  
print("precision =", val_acc)  

y_predicted = model.predict(x_test)
np.argmax(y_predicted[0])

y_predicted_labels = [np.argmax(i) for i in y_predicted]
y_predicted_labels[:1]

Epoch 1/10
1875/1875 [==============================] - 5s 2ms/step - loss: 0.2636 - accuracy: 0.9231
Epoch 2/10
1875/1875 [==============================] - 3s 2ms/step - loss: 0.1058 - accuracy: 0.9672
Epoch 3/10
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0716 - accuracy: 0.9773
Epoch 4/10
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0525 - accuracy: 0.9829
Epoch 5/10
1875/1875 [==============================] - 3s 2ms/step - loss: 0.0394 - accuracy: 0.9866
Epoch 6/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0315 - accuracy: 0.9892
Epoch 7/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0245 - accuracy: 0.9920
Epoch 8/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0198 - accuracy: 0.9934
Epoch 9/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0162 - accuracy: 0.9944
Epoch 10/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.0158 - accuracy: 0.9946
313/313 [==============================] - 1s 2ms/step - loss: 0.1257 - accuracy: 0.9727

loss = 0.12572124600410461
precision = 0.9726999998092651
313/313 [==============================] - 1s 2ms/step

import os
from PIL import Image

# Preparation of the folder containing the images
image_folder = 'C:\Users\theog\404-ctf\poeme\images'
image_files = [f for f in os.listdir(image_folder) if os.path.isfile(os.path.join(image_folder, f))]

# Initialize the list to store the images
images = []

for image_file in image_files:
    # Open each image, convert it to grayscale, and resize it to 28x28 pixels
    image = Image.open(os.path.join(image_folder, image_file)).convert('L').resize((28, 28))
    
    # Convert the image to a numpy array and normalize it (similar to what we did for the training data)
    image = tf.keras.utils.normalize(np.array(image), axis=1)
    
    # Add the image to our list
    images.append(image)

# Convert the list of images into a numpy array
images = np.array(images)

# Predict the classes for each image
predictions = model.predict(images)

# Retrieve the index of the predicted class for each image
predicted_labels = [np.argmax(p) for p in predictions]

print(predicted_labels)

205/205 [==============================] - 0s 1ms/step
[6, 6, 9, 1, 0, 1, 1, 6, 3, 1, 3, 0, 8, 1, 6, 6, 3, 0, 3, 0, 3, 8, 5, 5, 5, 2, 6, 1, 0, 6, 8, 9, 7, 6, 9, 9, 2, 1, 3, 8, 9, 1, 6, 7, 5, 3, 6, 2, 6, 3, 5, 3, 8, 2, 3, 1, 0, 6, 4, 7, 0, 0, 6, 2, 6, 9, 7, 1, 9, 9, 6, 2, 0, 1, 6, 5, 1, 0, 3, 6, 8, 3, 7, 8, 3, 9, 8, 6, 5, 8, 8, 5, 6, 1, 7, 5, 2, 2, 0, 0, 6, 6, 1, 0, 2, 0, 6, 6, 6, 0, 6, 1, 0, 1, 9, 1, 9, 0, 5, 2, 3, 9, 2, 2, 6, 5, 0, 0, 8, 7, 6, 2, 9, 1, 8, 6, 6, 6, 3, 9, 6, 6, 2, 6, 5, 6, 5, 1, 7, 8, 0, 5, 2, 6, 0, 9, 9, 0, 7, 5, 6, 0, 0, 0, 5, 1, 6, 0, 1, 6, 6, 1, 2, 5, 1, 3, 8, 6, 3, 9, 6, 6, 0, 3, 8, 5, 3, 8, 2, 6, 8, 1, 7, 8, 8, 0, 5, 6, 6, 1, 6, 9, 0, 8, 0, 2, 6, 6, 3, 3, 3, 8, 1, 9, 1, 8, 1, 3, 5, 2, 0, 3, 3, 0, 2, 6, 8, 1, 5, 2, 8, 8, 1, 1, 5, 1, 0, 7, 0, 9, 9, 0, 0, 0, 3, 0, 1, 3, 4, 6, 5, 1, 0, 2, 7, 2, 5, 9, 6, 2, 0, 2, 0, 3, 8, 0, 6, 2, 6, 0, 0, 3, 1, 5, 6, 5, 3, 0, 8, 7, 6, 1, 8, 5, 9, 5, 3, 0, 7, 1, 9, 0, 1, 8, 8, 1, 6, 0, 1, 2, 6, 6, 0, 8, 3, 0, 3, 0, 6, 6, 1, 5, 0, 0, 0, 5, 1, 0, 0, 3, 6, 3, 6, 3, 3, 1, 6, 6, 4, 5, 3, 6, 2, 3, 1, 1, 1, 7, 7, 6, 0, 8, 2, 6, 6, 8, 0, 7, 0, 0, 6, 5, 7, 0, 0, 6, 0, 3, 6, 8, 7, 3, 8, 6, 0, 3, 5, 6, 3, 6, 3, 7, 6, 8, 1, 9, 6, 9, 1, 0, 4, 1, 0, 6, 3, 2, 7, 1, 0, 0, 6, 8, 2, 7, 0, 3, 3, 0, 2, 5, 6, 7, 8, 6, 1, 5, 0, 9, 5, 5, 0, 0, 1, 9, 0, 7, 6, 3, 6, 0, 6, 9, 3, 9, 3, 6, 9, 8, 7, 2, 6, 2, 6, 5, 0, 6, 3, 0, 0, 9, 2, 0, 6, 2, 0, 1, 0, 6, 0, 1, 7, 3, 0, 5, 6, 3, 0, 6, 8, 5, 2, 6, 0, 8, 0, 8, 1, 5, 0, 0, 7, 5, 8, 3, 6, 5, 3, 8, 5, 3, 6, 7, 0, 2, 6, 5, 2, 5, 8, 8, 5, 6, 8, 1, 5, 2, 0, 5, 1, 0, 8, 3, 8, 9, 9, 4, 6, 5, 5, 2, 2, 1, 2, 6, 6, 2, 1, 9, 8, 2, 1, 1, 0, 2, 7, 0, 3, 0, 0, 1, 8, 3, 1, 1, 1, 6, 2, 6, 5, 3, 9, 1, 8, 6, 0, 6, 9, 3, 2, 0, 8, 8, 6, 6, 1, 9, 0, 6, 1, 6, 3, 6, 6, 8, 3, 1, 1, 0, 5, 5, 6, 5, 8, 9, 1, 1, 6, 6, 2, 0, 6, 6, 3, 3, 6, 5, 5, 9, 6, 6, 5, 0, 1, 6, 2, 0, 6, 3, 0, 0, 5, 0, 1, 8, 8, 6, 2, 9, 3, 3, 5, 6, 3, 6, 7, 6, 0, 7, 3, 6, 3, 6, 2, 3, 8, 2, 9, 1, 0, 9, 0, 0, 3, 8, 8, 2, 5, 0, 6, 7, 3, 6, 0, 6, 7, 6, 0, 7, 0, 5, 6, 6, 3, 8, 8, 0, 0, 2, 3, 6, 2, 0, 1, 2, 0, 9, 1, 5, 2, 6, 8, 5, 3, 9, 6, 6, 2, 5, 6, 5, 1, 1, 5, 0, 6, 9, 3, 8, 9, 7, 5, 1, 2, 7, 6, 0, 1, 2, 0, 8, 0, 4, 6, 0, 6, 6, 5, 2, 4, 6, 5, 6, 3, 1, 2, 1, 7, 6, 0, 9, 1, 4, 0, 0, 0, 1, 6, 6, 0, 5, 1, 6, 5, 7, 6, 6, 7, 1, 6, 9, 6, 6, 7, 3, 0, 6, 8, 5, 8, 8, 5, 1, 1, 2, 4, 0, 9, 8, 0, 8, 3, 9, 0, 6, 2, 0, 6, 6, 3, 1, 1, 0, 8, 3, 0, 0, 6, 1, 2, 8, 5, 0, 2, 6, 6, 6, 7, 7, 0, 8, 3, 8, 7, 2, 6, 8, 7, 6, 6, 1, 3, 3, 2, 0, 9, 7, 0, 7, 2, 8, 7, 1, 1, 5, 3, 3, 6, 6, 5, 3, 0, 2, 9, 0, 8, 2, 2, 0, 2, 0, 2, 3, 8, 2, 6, 1, 8, 9, 2, 8, 1, 3, 0, 8, 1, 6, 9, 8, 2, 1, 9, 4, 8, 2, 6, 2, 3, 5, 1, 6, 0, 8, 8, 3, 6, 5, 1, 6, 6, 9, 3, 1, 0, 6, 7, 3, 0, 0, 0, 1, 7, 5, 8, 0, 7, 6, 3, 3, 7, 6, 7, 2, 8, 6, 6, 6, 6, 6, 0, 2, 2, 2, 7, 0, 2, 1, 2, 3, 8, 6, 1, 6, 1, 0, 2, 6, 8, 2, 8, 9, 3, 8, 2, 0, 0, 8, 9, 7, 1, 9, 1, 0, 0, 2, 8, 2, 8, 6, 1, 6, 2, 0, 6, 0, 6, 7, 3, 3, 9, 1, 6, 7, 2, 6, 1, 7, 6, 3, 9, 7, 1, 1, 9, 9, 1, 3, 2, 3, 1, 0, 7, 8, 5, 5, 1, 0, 6, 9, 0, 8, 2, 8, 9, 1, 2, 0, 6, 6, 2, 6, 3, 3, 5, 0, 2, 7, 0, 6, 2, 1, 6, 1, 7, 8, 6, 6, 6, 2, 3, 5, 8, 1, 6, 0, 8, 0, 6, 3, 7, 6, 6, 7, 0, 7, 0, 8, 5, 1, 9, 0, 1, 8, 4, 0, 3, 3, 5, 0, 6, 6, 0, 8, 0, 1, 1, 1, 3, 6, 1, 6, 3, 2, 7, 7, 5, 2, 6, 1, 7, 5, 0, 2, 9, 6, 2, 6, 0, 1, 6, 6, 9, 6, 8, 6, 5, 6, 6, 2, 8, 6, 0, 2, 0, 1, 1, 1, 7, 1, 7, 6, 1, 3, 6, 8, 9, 8, 5, 5, 1, 2, 5, 2, 1, 0, 6, 3, 1, 1, 0, 7, 6, 3, 8, 9, 2, 8, 3, 3, 2, 6, 9, 6, 0, 6, 3, 5, 5, 8, 6, 7, 4, 3, 6, 0, 9, 1, 3, 2, 2, 0, 1, 8, 6, 6, 2, 5, 0, 0, 5, 0, 6, 3, 8, 1, 0, 9, 3, 1, 6, 0, 0, 1, 3, 0, 1, 0, 1, 2, 0, 7, 6, 0, 0, 0, 2, 0, 8, 1, 3, 8, 0, 0, 0, 6, 2, 0, 9, 5, 2, 6, 8, 5, 4, 5, 8, 0, 5, 2, 2, 0, 0, 8, 0, 6, 1, 1, 9, 8, 3, 8, 8, 9, 5, 6, 3, 3, 2, 0, 5, 0, 6, 1, 1, 6, 6, 8, 9, 0, 6, 1, 6, 3, 9, 9, 8, 1, 1, 0, 2, 0, 3, 1, 9, 8, 8, 2, 8, 1, 0, 3, 7, 1, 0, 1, 0, 5, 6, 9, 2, 0, 1, 1, 0, 2, 6, 6, 2, 1, 6, 3, 6, 9, 0, 6, 6, 8, 5, 0, 3, 5, 0, 6, 9, 6, 8, 3, 0, 8, 0, 1, 0, 6, 0, 9, 0, 0, 2, 5, 3, 4, 2, 5, 6, 1, 6, 6, 3, 5, 1, 0, 1, 1, 8, 6, 1, 1, 0, 6, 7, 5, 3, 3, 8, 2, 6, 6, 8, 6, 2, 3, 0, 8, 2, 6, 7, 9, 5, 8, 6, 1, 1, 9, 0, 6, 0, 6, 8, 8, 1, 8, 6, 8, 6, 6, 4, 9, 3, 0, 3, 0, 0, 0, 1, 6, 5, 1, 2, 1, 3, 6, 9, 8, 8, 3, 9, 5, 8, 0, 5, 5, 0, 0, 6, 1, 9, 1, 3, 6, 8, 8, 0, 7, 9, 6, 3, 6, 0, 6, 6, 0, 9, 6, 0, 3, 1, 7, 0, 0, 1, 5, 6, 3, 1, 9, 1, 9, 2, 5, 9, 8, 0, 6, 6, 5, 1, 0, 1, 9, 1, 6, 4, 5, 6, 6, 1, 8, 9, 3, 2, 9, 3, 3, 0, 8, 0, 0, 0, 8, 6, 6, 8, 6, 0, 9, 1, 7, 6, 0, 6, 3, 1, 6, 5, 7, 6, 1, 6, 9, 6, 5, 2, 3, 1, 2, 8, 0, 0, 1, 0, 6, 3, 9, 6, 6, 5, 0, 7, 0, 3, 5, 9, 5, 1, 8, 3, 6, 8, 5, 3, 2, 3, 8, 6, 2, 9, 9, 5, 9, 2, 1, 5, 1, 8, 0, 1, 9, 1, 7, 8, 0, 1, 1, 0, 6, 1, 9, 1, 9, 9, 8, 6, 6, 6, 1, 6, 5, 0, 6, 6, 6, 2, 3, 7, 8, 5, 6, 6, 2, 3, 9, 1, 1, 0, 1, 9, 0, 6, 0, 7, 2, 9, 5, 1, 8, 8, 6, 8, 6, 1, 6, 3, 1, 8, 1, 0, 1, 6, 5, 3, 0, 6, 7, 2, 6, 5, 5, 1, 5, 6, 5, 6, 0, 0, 3, 1, 1, 7, 1, 0, 5, 8, 6, 0, 0, 1, 6, 5, 0, 3, 6, 3, 2, 1, 8, 1, 0, 2, 7, 6, 7, 6, 7, 7, 2, 2, 2, 3, 8, 1, 0, 1, 2, 9, 0, 6, 6, 7, 1, 8, 6, 1, 0, 1, 6, 1, 0, 9, 6, 3, 6, 5, 6, 2, 6, 0, 8, 9, 8, 3, 2, 3, 5, 1, 0, 0, 5, 5, 3, 1, 7, 9, 1, 2, 5, 0, 0, 9, 5, 6, 6, 3, 1, 8, 0, 2, 5, 2, 7, 8, 6, 0, 3, 0, 1, 1, 6, 9, 1, 6, 1, 0, 5, 8, 5, 6, 0, 1, 0, 7, 0, 0, 0, 6, 0, 0, 6, 6, 6, 8, 9, 1, 4, 0, 2, 1, 2, 0, 6, 7, 3, 4, 3, 9, 5, 1, 6, 6, 5, 7, 3, 0, 5, 9, 3, 8, 1, 1, 3, 2, 8, 0, 8, 2, 6, 0, 9, 6, 1, 7, 5, 6, 8, 0, 0, 5, 2, 2, 1, 0, 0, 3, 8, 6, 6, 6, 8, 0, 3, 8, 9, 6, 0, 3, 7, 9, 6, 5, 5, 0, 0, 6, 2, 5, 0, 5, 3, 1, 7, 9, 9, 3, 6, 0, 1, 3, 3, 0, 8, 1, 7, 1, 6, 0, 2, 6, 2, 0, 8, 6, 6, 0, 2, 2, 8, 6, 0, 8, 3, 3, 9, 0, 8, 6, 8, 0, 1, 1, 7, 0, 0, 3, 6, 8, 6, 9, 2, 1, 6, 8, 0, 2, 8, 5, 9, 6, 0, 6, 8, 6, 1, 2, 1, 5, 2, 5, 1, 8, 2, 5, 5, 1, 3, 3, 2, 6, 7, 3, 8, 2, 6, 5, 8, 9, 3, 1, 6, 0, 6, 8, 5, 6, 7, 0, 0, 2, 6, 2, 7, 7, 6, 7, 3, 7, 5, 3, 6, 5, 9, 7, 8, 9, 0, 1, 8, 0, 5, 3, 5, 9, 8, 7, 6, 0, 8, 7, 5, 2, 0, 6, 8, 0, 0, 7, 3, 2, 3, 2, 6, 6, 9, 6, 9, 0, 2, 0, 1, 2, 7, 0, 2, 3, 1, 0, 8, 5, 5, 6, 3, 6, 1, 5, 2, 2, 6, 0, 5, 6, 3, 3, 5, 2, 6, 2, 4, 3, 8, 7, 1, 7, 8, 1, 8, 5, 2, 8, 0, 5, 8, 8, 1, 3, 6, 1, 8, 3, 7, 1, 0, 8, 7, 5, 6, 2, 2, 2, 5, 6, 6, 9, 6, 2, 8, 6, 1, 1, 3, 0, 2, 0, 9, 0, 9, 1, 7, 5, 6, 3, 0, 1, 8, 6, 1, 6, 2, 9, 8, 5, 3, 6, 3, 3, 6, 6, 1, 9, 9, 9, 8, 7, 0, 1, 5, 9, 5, 6, 2, 2, 1, 7, 0, 0, 0, 0, 8, 6, 5, 0, 1, 0, 6, 0, 6, 6, 2, 5, 9, 1, 6, 6, 9, 6, 0, 8, 3, 9, 0, 5, 9, 6, 0, 2, 0, 1, 3, 2, 6, 4, 5, 6, 6, 7, 3, 3, 6, 2, 3, 0, 3, 6, 5, 1, 3, 5, 6, 8, 7, 0, 6, 8, 5, 1, 5, 8, 0, 6, 0, 6, 6, 9, 1, 8, 9, 3, 8, 1, 6, 0, 9, 0, 2, 9, 6, 0, 8, 0, 6, 9, 1, 1, 8, 6, 8, 9, 0, 0, 1, 0, 8, 1, 3, 3, 3, 2, 6, 7, 3, 6, 7, 1, 1, 4, 0, 2, 5, 0, 0, 9, 4, 1, 6, 2, 1, 1, 9, 5, 9, 6, 0, 2, 1, 8, 3, 2, 0, 7, 8, 7, 6, 1, 1, 5, 3, 0, 5, 8, 3, 6, 9, 1, 3, 6, 0, 8, 9, 3, 8, 1, 7, 6, 4, 5, 3, 3, 0, 0, 9, 8, 0, 3, 8, 1, 3, 2, 6, 8, 8, 1, 1, 6, 8, 6, 6, 6, 6, 8, 3, 6, 6, 3, 3, 6, 1, 0, 0, 1, 6, 0, 0, 2, 6, 2, 0, 1, 6, 3, 6, 5, 8, 1, 8, 0, 5, 3, 0, 7, 1, 3, 2, 6, 5, 8, 1, 9, 6, 0, 7, 3, 0, 5, 3, 0, 7, 5, 1, 7, 9, 0, 5, 6, 8, 1, 2, 2, 1, 8, 2, 3, 5, 6, 0, 1, 6, 5, 6, 8, 8, 7, 6, 6, 0, 8, 8, 8, 6, 0, 3, 9, 1, 0, 3, 2, 2, 0, 1, 8, 0, 9, 8, 0, 6, 2, 6, 3, 1, 6, 6, 6, 8, 0, 9, 1, 9, 1, 6, 0, 9, 1, 4, 6, 6, 3, 5, 1, 2, 6, 7, 1, 8, 6, 0, 5, 2, 6, 1, 5, 2, 0, 0, 9, 0, 3, 1, 8, 7, 2, 6, 7, 1, 5, 9, 1, 2, 6, 8, 9, 9, 5, 8, 1, 1, 7, 0, 0, 8, 8, 3, 1, 0, 1, 0, 6, 2, 0, 5, 5, 6, 6, 8, 6, 0, 4, 3, 1, 6, 2, 6, 7, 6, 0, 6, 6, 1, 0, 6, 5, 9, 3, 0, 0, 3, 3, 8, 5, 6, 2, 2, 8, 2, 0, 7, 5, 6, 0, 5, 6, 1, 1, 3, 5, 5, 9, 2, 7, 0, 1, 6, 9, 5, 5, 9, 6, 2, 5, 6, 6, 5, 7, 8, 2, 5, 2, 6, 9, 2, 5, 6, 9, 8, 8, 5, 7, 3, 0, 0, 1, 2, 0, 0, 2, 0, 2, 1, 1, 6, 6, 0, 3, 6, 0, 6, 1, 9, 8, 7, 8, 5, 8, 9, 0, 6, 7, 1, 2, 6, 0, 2, 8, 0, 1, 7, 9, 2, 6, 0, 0, 1, 0, 7, 3, 0, 9, 7, 5, 9, 6, 1, 3, 0, 6, 3, 6, 6, 9, 6, 3, 9, 8, 6, 7, 1, 1, 6, 8, 0, 1, 7, 0, 6, 3, 6, 6, 3, 2, 5, 1, 5, 2, 1, 2, 8, 6, 9, 0, 1, 1, 6, 3, 0, 0, 0, 3, 1, 3, 0, 6, 1, 6, 1, 9, 6, 8, 2, 7, 3, 4, 2, 8, 6, 5, 2, 0, 8, 6, 8, 3, 0, 0, 5, 3, 0, 2, 9, 8, 3, 6, 0, 5, 5, 9, 0, 0, 1, 8, 6, 1, 7, 1, 0, 6, 6, 7, 0, 8, 9, 0, 9, 0, 8, 5, 8, 5, 5, 0, 9, 0, 1, 2, 1, 4, 6, 0, 3, 1, 1, 8, 7, 2, 8, 7, 0, 8, 5, 1, 3, 0, 9, 9, 8, 6, 7, 1, 6, 2, 0, 8, 6, 8, 8, 3, 9, 0, 6, 0, 6, 3, 7, 0, 5, 3, 8, 0, 0, 6, 6, 3, 2, 7, 5, 2, 1, 1, 6, 2, 8, 0, 5, 7, 1, 6, 7, 9, 9, 6, 5, 0, 5, 0, 1, 5, 6, 7, 0, 1, 9, 1, 3, 2, 2, 1, 8, 6, 1, 5, 2, 2, 0, 0, 6, 7, 6, 8, 3, 6, 6, 0, 6, 6, 8, 6, 0, 5, 2, 6, 1, 6, 9, 6, 6, 1, 9, 6, 1, 2, 6, 2, 9, 2, 1, 1, 0, 8, 8, 1, 0, 1, 6, 8, 5, 0, 2, 6, 6, 6, 2, 6, 3, 7, 6, 8, 8, 6, 7, 6, 6, 7, 3, 6, 1, 5, 3, 8, 2, 0, 5, 5, 7, 8, 6, 1, 8, 8, 6, 6, 8, 7, 5, 1, 3, 6, 2, 0, 2, 0, 1, 6, 6, 7, 7, 0, 2, 9, 2, 3, 8, 5, 1, 3, 0, 1, 3, 6, 0, 0, 0, 2, 2, 6, 3, 7, 0, 6, 6, 6, 1, 8, 1, 8, 1, 0, 8, 8, 0, 8, 2, 6, 0, 6, 6, 0, 0, 6, 6, 6, 3, 1, 6, 5, 9, 1, 0, 0, 0, 6, 3, 1, 8, 1, 3, 7, 7, 6, 3, 7, 1, 9, 6, 3, 1, 3, 0, 3, 3, 9, 0, 6, 6, 7, 0, 2, 2, 1, 8, 6, 0, 3, 0, 0, 0, 3, 9, 0, 2, 0, 6, 0, 8, 6, 3, 1, 6, 5, 5, 5, 5, 6, 3, 6, 5, 9, 6, 3, 8, 8, 8, 1, 1, 1, 1, 0, 0, 3, 0, 8, 6, 1, 8, 6, 6, 3, 0, 6, 6, 3, 3, 8, 0, 5, 6, 7, 8, 2, 7, 2, 6, 0, 6, 6, 1, 6, 3, 6, 1, 6, 5, 6, 5, 8, 2, 3, 3, 0, 8, 1, 8, 9, 0, 7, 6, 5, 3, 8, 0, 5, 0, 0, 1, 6, 1, 0, 7, 0, 6, 1, 8, 3, 9, 8, 1, 6, 8, 6, 8, 0, 2, 3, 8, 1, 0, 0, 5, 2, 1, 2, 4, 1, 7, 8, 0, 7, 0, 8, 0, 6, 3, 8, 6, 8, 6, 0, 9, 6, 1, 1, 0, 6, 8, 3, 2, 9, 4, 8, 1, 6, 1, 1, 3, 1, 6, 3, 1, 8, 8, 3, 2, 0, 5, 2, 5, 5, 1, 1, 2, 8, 3, 6, 0, 1, 3, 0, 0, 7, 3, 8, 0, 6, 0, 8, 6, 8, 8, 0, 6, 6, 6, 8, 0, 5, 1, 6, 6, 1, 6, 2, 8, 7, 0, 8, 6, 9, 0, 6, 6, 3, 1, 8, 3, 2, 9, 5, 2, 2, 1, 5, 1, 3, 7, 0, 1, 0, 6, 3, 3, 0, 7, 1, 0, 2, 6, 6, 1, 9, 5, 0, 1, 8, 8, 6, 6, 1, 0, 0, 0, 2, 8, 6, 6, 5, 1, 0, 3, 8, 8, 1, 0, 9, 7, 5, 0, 1, 0, 2, 6, 5, 8, 1, 6, 2, 8, 5, 6, 9, 7, 0, 9, 5, 6, 1, 5, 3, 0, 6, 6, 6, 8, 6, 6, 6, 0, 8, 0, 0, 1, 9, 2, 6, 1, 8, 2, 0, 1, 0, 3, 0, 6, 0, 3, 6, 6, 0, 1, 9, 0, 6, 6, 0, 5, 8, 0, 7, 9, 6, 1, 0, 3, 6, 2, 7, 1, 7, 1, 2, 6, 9, 1, 8, 0, 9, 0, 8, 1, 5, 9, 1, 6, 6, 6, 0, 7, 6, 2, 9, 6, 6, 5, 6, 0, 8, 6, 3, 6, 8, 2, 5, 1, 8, 6, 6, 8, 1, 2, 3, 3, 5, 6, 5, 7, 8, 6, 2, 0, 5, 6, 0, 2, 0, 6, 3, 2, 6, 9, 1, 0, 6, 5, 6, 0, 0, 1, 1, 6, 0, 2, 8, 6, 6, 6, 6, 8, 1, 9, 6, 3, 5, 1, 1, 0, 0, 6, 5, 7, 6, 6, 1, 9, 2, 5, 1, 9, 0, 0, 3, 0, 6, 6, 1, 5, 2, 8, 5, 6, 0, 5, 2, 0, 5, 2, 2, 0, 8, 0, 8, 9, 1, 5, 0, 3, 7, 6, 9, 0, 3, 0, 1, 8, 0, 9, 0, 1, 8, 6, 3, 6, 0, 9, 9, 2, 6, 9, 9, 7, 8, 1, 3, 8, 8, 9, 9, 3, 1, 6, 5, 2, 2, 5, 8, 6, 1, 0, 8, 0, 5, 6, 1, 8, 9, 7, 3, 6, 6, 1, 5, 1, 2, 1, 0, 0, 1, 8, 3, 9, 8, 1, 8, 1, 9, 7, 8, 0, 6, 3, 6, 1, 3, 6, 6, 6, 1, 0, 3, 6, 6, 8, 0, 6, 3, 8, 3, 2, 2, 1, 7, 1, 6, 3, 8, 7, 6, 0, 5, 1, 1, 0, 8, 0, 0, 9, 8, 7, 3, 1, 0, 2, 7, 9, 3, 6, 3, 3, 1, 0, 6, 0, 0, 0, 6, 5, 3, 7, 1, 1, 7, 5, 6, 6, 1, 1, 6, 8, 1, 6, 1, 1, 3, 7, 6, 1, 6, 4, 1, 7, 0, 8, 7, 0, 2, 8, 0, 8, 8, 6, 6, 7, 0, 9, 0, 6, 1, 3, 1, 6, 9, 9, 6, 6, 5, 6, 5, 2, 2, 3, 0, 0, 0, 8, 6, 6, 0, 1, 7, 8, 9, 7, 0, 6, 3, 6, 5, 3, 0, 1, 0, 2, 7, 8, 2, 1, 5, 1, 6, 6, 3, 3, 6, 2, 2, 0, 6, 1, 3, 5, 8, 5, 1, 1, 6, 5, 6, 0, 9, 8, 6, 1, 3, 5, 5, 0, 3, 8, 5, 8, 1, 3, 9, 0, 0, 5, 5, 3, 8, 5, 0, 5, 8, 9, 2, 6, 2, 6, 0, 8, 0, 6, 5, 6, 1, 0, 6, 7, 9, 8, 2, 0, 8, 8, 0, 9, 6, 0, 9, 0, 8, 5, 6, 3, 6, 1, 6, 0, 3, 1, 9, 1, 6, 6, 9, 7, 2, 4, 0, 1, 5, 0, 8, 0, 0, 2, 5, 5, 0, 5, 0, 3, 3, 3, 1, 8, 6, 3, 6, 2, 7, 9, 0, 1, 8, 3, 2, 9, 8, 8, 1, 6, 6, 2, 2, 4, 6, 0, 1, 3, 5, 9, 0, 7, 3, 6, 6, 0, 9, 8, 6, 2, 8, 6, 0, 3, 9, 1, 6, 1, 2, 6, 8, 2, 1, 7, 6, 6, 0, 7, 5, 2, 6, 6, 1, 6, 8, 8, 7, 2, 8, 6, 5, 3, 7, 6, 6, 0, 2, 6, 3, 0, 1, 7, 0, 7, 1, 3, 3, 2, 1, 5, 3, 5, 0, 5, 6, 3, 0, 5, 9, 3, 0, 6, 6, 5, 8, 6, 0, 5, 6, 0, 6, 2, 8, 0, 2, 9, 7, 2, 6, 9, 5, 9, 8, 8, 7, 1, 0, 8, 6, 0, 1, 2, 9, 8, 9, 0, 5, 6, 2, 8, 6, 3, 6, 3, 5, 2, 1, 1, 2, 8, 7, 5, 6, 6, 6, 5, 8, 3, 6, 0, 2, 6, 3, 8, 5, 3, 5, 6, 1, 6, 0, 6, 2, 7, 1, 6, 3, 0, 8, 6, 0, 0, 3, 3, 0, 1, 0, 6, 0, 1, 2, 6, 6, 2, 6, 3, 1, 5, 6, 8, 6, 6, 1, 2, 1, 1, 1, 6, 5, 6, 1, 0, 6, 6, 9, 1, 8, 5, 8, 3, 6, 1, 0, 5, 6, 3, 7, 3, 1, 2, 3, 1, 8, 0, 3, 0, 2, 1, 6, 5, 7, 1, 6, 8, 2, 1, 1, 6, 5, 9, 0, 8, 1, 8, 1, 6, 6, 9, 7, 0, 0, 6, 8, 7, 0, 9, 0, 3, 7, 8, 1, 6, 5, 6, 9, 5, 7, 1, 3, 0, 7, 6, 6, 0, 3, 6, 2, 6, 1, 0, 6, 0, 3, 3, 2, 0, 5, 3, 6, 3, 2, 8, 3, 3, 2, 0, 5, 7, 9, 6, 7, 0, 1, 2, 9, 1, 3, 4, 4, 1, 3, 1, 7, 6, 9, 0, 8, 8, 0, 5, 2, 0, 6, 6, 8, 8, 8, 0, 9, 9, 8, 6, 0, 8, 6, 0, 3, 1, 1, 6, 5, 8, 9, 9, 2, 1, 9, 6, 8, 8, 2, 9, 6, 1, 1, 7, 9, 8, 6, 0, 0, 2, 3, 7, 3, 0, 8, 0, 9, 0, 8, 5, 1, 0, 0, 2, 6, 7, 6, 3, 3, 1, 0, 3, 1, 7, 0, 6, 1, 1, 9, 7, 2, 7, 8, 8, 2, 1, 1, 8, 1, 2, 0, 7, 0, 7, 6, 5, 7, 8, 1, 0, 1, 0, 9, 2, 1, 9, 1, 6, 0, 8, 9, 8, 9, 7, 0, 9, 6, 4, 7, 7, 2, 2, 6, 1, 6, 3, 9, 7, 2, 6, 6, 8, 6, 0, 3, 8, 0, 2, 0, 1, 0, 3, 8, 2, 6, 6, 6, 6, 3, 3, 2, 1, 2, 0, 0, 3, 0, 1, 7, 3, 2, 0, 0, 6, 6, 8, 0, 9, 0, 0, 6, 0, 6, 6, 1, 1, 8, 3, 3, 9, 1, 2, 0, 5, 5, 6, 9, 5, 8, 1, 3, 6, 7, 9, 1, 9, 1, 2, 1, 0, 8, 8, 1, 5, 9, 2, 6, 3, 8, 8, 6, 7, 5, 0, 6, 8, 0, 2, 0, 5, 3, 0, 6, 3, 5, 6, 8, 2, 0, 3, 0, 0, 5, 6, 0, 1, 6, 1, 3, 8, 1, 6, 0, 0, 2, 6, 0, 3, 8, 0, 1, 7, 3, 8, 3, 1, 1, 6, 9, 3, 8, 3, 0, 5, 9, 8, 6, 3, 9, 0, 9, 8, 1, 3, 0, 8, 3, 5, 2, 0, 8, 6, 5, 4, 6, 8, 6, 0, 0, 0, 3, 5, 8, 6, 2, 6, 9, 8, 6, 0, 5, 2, 8, 1, 6, 0, 2, 0, 9, 8, 0, 1, 6, 9, 8, 6, 8, 9, 1, 6, 3, 7, 7, 5, 5, 1, 7, 7, 6, 5, 1, 0, 0, 3, 9, 5, 5, 0, 2, 0, 5, 3, 6, 6, 2, 0, 6, 2, 2, 0, 2, 6, 1, 1, 5, 3, 2, 6, 0, 7, 8, 9, 3, 3, 8, 6, 1, 9, 3, 2, 9, 7, 1, 0, 0, 8, 6, 2, 6, 6, 1, 0, 2, 6, 6, 0, 2, 1, 3, 1, 1, 6, 5, 6, 0, 0, 7, 3, 6, 0, 6, 9, 8, 3, 0, 1, 8, 8, 0, 8, 5, 1, 6, 0, 6, 1, 5, 6, 2, 3, 8, 1, 0, 2, 2, 1, 1, 0, 6, 7, 8, 5, 7, 8, 3, 0, 0, 1, 8, 1, 0, 6, 0, 0, 1, 0, 2, 6, 9, 1, 1, 0, 9, 2, 5, 5, 6, 1, 5, 6, 0, 9, 5, 6, 5, 0, 6, 2, 4, 2, 7, 8, 6, 2, 0, 0, 2, 9, 6, 9, 2, 8, 8, 6, 2, 6, 3, 8, 2, 5, 6, 9, 3, 6, 6, 3, 6, 0, 5, 2, 4, 8, 8, 8, 1, 5, 2, 0, 7, 6, 3, 0, 8, 1, 7, 5, 0, 0, 6, 1, 8, 0, 6, 0, 8, 0, 0, 9, 2, 8, 3, 5, 2, 0, 2, 6, 3, 8, 5, 6, 6, 3, 0, 6, 2, 6, 2, 0, 8, 7, 9, 0, 2, 1, 6, 2, 0, 8, 7, 5, 6, 8, 5, 6, 0, 0, 0, 5, 1, 6, 8, 8, 0, 9, 0, 1, 5, 2, 3, 8, 8, 9, 0, 6, 1, 1, 2, 9, 3, 6, 1, 8, 0, 5, 0, 0, 7, 1, 5, 6, 9, 6, 1, 6, 2, 6, 0, 3, 9, 2, 1, 1, 5, 3, 2, 0, 2, 2, 9, 3, 1, 6, 6, 2, 8, 6, 1, 6, 3, 5, 1, 3, 9, 6, 0, 1, 6, 0, 1, 5, 6, 0, 6, 8, 8, 6, 2, 9, 3, 5, 8, 6, 1, 1, 0, 6, 1, 1, 0, 5, 5, 9, 2, 0, 8, 6, 6, 1, 0, 0, 1, 0, 0, 1, 6, 6, 1, 6, 0, 8, 6, 0, 0, 9, 1, 0, 1, 6, 1, 6, 0, 5, 3, 3, 0, 1, 1, 9, 6, 1, 1, 5, 9, 0, 6, 6, 6, 0, 5, 0, 9, 6, 0, 6, 9, 9, 0, 2, 1, 2, 6, 2, 5, 0, 0, 9, 9, 5, 8, 0, 1, 6, 1, 0, 0, 7, 1, 1, 2, 6, 1, 5, 2, 7, 2, 1, 0, 0, 8, 5, 1, 6, 3, 7, 0, 9, 7, 0, 3, 8, 7, 2, 3, 0, 1, 8, 6, 8, 3, 6, 0, 8, 5, 0, 6, 8, 2, 0, 2, 0, 4, 1, 5, 8, 2, 6, 6, 8, 7, 2, 7, 6, 5, 3, 1, 1, 8, 7, 5, 3, 0, 0, 1, 2, 5, 6, 9, 0, 3, 0, 8, 0, 1, 2, 0, 2, 3, 8, 6, 6, 2, 8, 8, 2, 5, 3, 9, 2, 3, 8, 6, 9, 1, 6, 5, 8, 3, 2, 6, 1, 0, 9, 3, 1, 3, 2, 0, 0, 2, 0, 1, 5, 8, 9, 1, 3, 8, 3, 8, 3, 5, 0, 8, 4, 5, 1, 0, 5, 2, 1, 2, 1, 2, 5, 6, 5, 6, 3, 0, 3, 9, 2, 6, 1, 2, 6, 8, 3, 6, 6, 0, 0, 6, 0, 0, 1, 1, 8, 3, 1, 7, 2, 6, 2, 7, 5, 6, 2, 5, 8, 7, 6, 2, 8, 9, 2, 2, 1, 9, 1, 8, 7, 6, 7, 2, 6, 5, 0, 6, 6, 3, 1, 7, 8, 6, 6, 1, 8, 0, 5, 1, 8, 0, 8, 5, 0, 1, 6, 3, 1, 1, 8, 0, 0, 8, 4, 2, 3, 5, 6, 0, 1, 2, 6, 0, 5, 3, 1, 6, 2, 0, 6, 0, 0, 7, 1, 1, 1, 7, 9, 1, 6, 7, 0, 6, 7, 8, 0, 2, 6, 6, 0, 6, 5, 3, 3, 6, 0, 3, 1, 0, 6, 1, 6, 0, 6, 1, 6, 8, 2, 7, 2, 9, 7, 6, 0, 3, 6, 0, 3, 3, 0, 9, 8, 6, 6, 9, 2, 5, 3, 0, 3, 1, 8, 2, 6, 6, 5, 9, 0, 6, 5, 8, 3, 2, 6, 6, 9, 6, 0, 2, 8, 8, 8, 0, 0, 7, 3, 6, 7, 8, 1, 4, 2, 3, 5, 8, 0, 6, 9, 8, 0, 8, 5, 7, 0, 5, 0, 8, 8, 9, 7, 8, 8, 0, 6, 1, 1, 0, 2, 6, 1, 0, 1, 6, 0, 8, 8, 8, 1, 3, 6, 3, 6, 5, 1, 0, 1, 9, 3, 2, 0, 6, 6, 0, 8, 6, 6, 1, 3, 1, 4, 6, 1, 0, 6, 0, 7, 8, 6, 8, 6, 6, 6, 6, 8, 6, 0, 5, 6, 1, 2, 8, 6, 8, 7, 3, 6, 3, 2, 0, 7, 6, 1, 1, 0, 2, 0, 6, 8, 2, 6, 3, 0, 0, 3, 5, 6, 0, 6, 5, 9, 2, 6, 0, 7, 5, 0, 2, 9, 8, 0, 6, 7, 2, 0, 2, 7, 6, 6, 6, 6, 5, 3, 2, 6, 3, 0, 8, 3, 1, 3, 6, 7, 7, 0, 1, 0, 0, 8, 3, 2, 0, 8, 6, 6, 5, 3, 6, 0, 7, 3, 3, 2, 1, 2, 7, 1, 3, 5, 5, 0, 1, 9, 0, 6, 5, 7, 2, 8, 2, 2, 3, 5, 7, 3, 3, 0, 6, 6, 3, 6, 3, 1, 1, 6, 1, 5, 2, 9, 3, 8, 8, 8, 6, 0, 0, 8, 6, 3, 3, 8, 6, 6, 6, 8, 0, 3, 1, 6, 0, 6, 3, 6, 8, 5, 8, 3, 9, 6, 6, 1, 5, 8, 0, 3, 1, 9, 0, 5, 0, 5, 6, 5, 5, 8, 2, 5, 0, 1, 5, 0, 0, 3, 2, 1, 3, 1, 3, 3, 0, 3, 8, 1, 3, 0, 6, 0, 9, 4, 3, 0, 0, 7, 8, 5, 8, 5, 0, 8, 1, 5, 8, 8, 5, 1, 5, 0, 3, 9, 0, 9, 5, 6, 2, 8, 6, 9, 5, 0, 0, 8, 6, 6, 6, 0, 6, 0, 7, 0, 1, 2, 1, 6, 6, 9, 9, 1, 8, 2, 9, 3, 6, 1, 6, 1, 5, 5, 2, 3, 5, 6, 9, 0, 7, 6, 0, 2, 2, 1, 9, 6, 3, 9, 7, 7, 3, 1, 6, 3, 1, 3, 5, 0, 3, 0, 3, 0, 7, 0, 3, 8, 8, 1, 5, 1, 5, 8, 3, 8, 6, 8, 8, 2, 3, 1, 0, 0, 6, 3, 6, 8, 2, 8, 6, 1, 1, 8, 0, 7, 5, 1, 6, 2, 3, 6, 3, 5, 8, 7, 9, 6, 0, 0, 9, 1, 8, 8, 8, 5, 9, 6, 3, 5, 8, 9, 1, 6, 9, 9, 0, 7, 7, 9, 4, 6, 0, 6, 3, 6, 6, 1, 1, 0, 0, 0, 6, 1, 1, 8, 9, 5, 0, 6, 9, 8, 6, 6, 3, 9, 7, 0, 9, 0, 0, 2, 1, 3, 6, 1, 8, 1, 9, 6, 6, 1, 3, 8, 0, 9, 5, 2, 6, 9, 0, 6, 6, 3, 9, 8, 2, 1, 7, 0, 8, 7, 8, 3, 5, 3, 0, 3, 8, 6, 6, 6, 2, 5, 2, 7, 8, 6, 0, 0, 6, 7, 2, 0, 7, 6, 8, 7, 0, 1, 6, 2, 8, 6, 8, 8, 3, 3, 4, 5, 5, 0, 1, 3, 6, 1, 3, 1, 5, 8, 6, 0, 2, 1, 7, 0, 8, 3, 3, 6, 1, 2, 9, 1, 6, 2, 5, 8, 1, 3, 2, 0, 6, 0, 2, 6, 6, 6, 6, 0, 7, 1, 0, 1, 1, 5, 1, 0, 3, 1, 3, 3, 6, 0, 1, 0, 6, 9, 9, 6, 2, 1, 1, 0, 0, 7, 0, 5, 1, 6, 2, 1, 6, 5, 1, 6, 9, 3, 6, 6, 2, 0, 3, 1, 8, 1, 9, 2, 9, 1, 0, 0, 6, 3, 3, 1, 2, 1, 6, 8, 9, 2, 1, 9, 0, 3, 3, 7, 2, 0, 8, 6, 1, 0, 6, 8, 1, 1, 0, 6, 6, 7, 9, 5, 2, 1, 6, 6, 2, 6, 3, 8, 6, 6, 2, 2, 9, 9, 9, 6, 6, 5, 5, 8, 0, 1, 1, 1, 8, 9, 0, 1, 6, 9, 8, 6, 0, 6, 8, 0, 7, 8, 8, 4, 9, 1, 3, 6, 6, 6, 0, 6, 6, 0, 7, 0, 1, 0, 1, 6, 1, 2, 1, 0, 7, 2, 6, 0, 8, 3, 6, 5, 1, 3, 0, 2, 9, 3, 0, 8, 5, 3, 1, 8, 1, 8, 2, 6, 6, 8, 7, 6, 2, 6, 0, 0, 9, 0, 0, 5, 4, 0, 1, 6, 2, 8, 8, 0, 7, 8, 0, 0, 9, 3, 6, 2, 3, 6, 0, 8, 6, 2, 0, 0, 7, 5, 8, 0, 5, 1, 8, 5, 0, 3, 5, 9, 8, 3, 6, 1, 2, 6, 3, 1, 8, 6, 2, 0, 8, 8, 6, 1, 0, 0, 6, 3, 6, 3, 0, 6, 9, 0, 5, 6, 2, 8, 9, 9, 2, 1, 1, 8, 6, 1, 0, 6, 0, 9, 7, 1, 0, 6, 7, 6, 1, 6, 0, 0, 7, 6, 6, 0, 0, 6, 6, 7, 6, 5, 8, 2, 0, 3, 8, 8, 7, 1, 6, 8, 1, 3, 0, 1, 6, 5, 7, 0, 9, 1, 6, 1, 8, 2, 8, 5, 6, 2, 8, 2, 6, 8, 8, 1, 1, 0, 2, 7, 0, 6, 0, 7, 0, 3, 0, 8, 5, 8, 3, 2, 5, 3, 0, 4, 9, 5, 6, 9, 0, 9, 1, 1, 0, 6, 0, 3, 6, 6, 7, 7, 3, 0, 6, 1, 1, 6, 2, 6, 6, 1, 0, 2, 6, 6, 2, 2, 3, 3, 6, 2, 1, 3, 3, 8, 8, 3, 9, 2, 1, 1, 8, 2, 3, 8, 7, 9, 8, 2, 2, 0, 9, 1, 6, 9, 3, 8, 5, 9, 0, 3, 5, 6, 1, 5, 6, 7, 6, 2, 6, 0, 5, 9, 1, 2, 6, 6, 6, 3, 0, 0, 1, 7, 8, 6, 6, 3, 7, 1, 8, 5, 2, 6, 2, 6, 0, 2, 8, 5, 6, 0, 6, 7, 5, 1, 8, 8, 9, 7, 8, 1, 1, 3, 7, 6, 9, 3, 1, 8, 5, 2, 6, 6, 6, 1, 5, 8, 5, 3, 1, 5, 6, 0, 8, 5, 1, 6, 2, 9, 8, 0, 7, 8, 3, 5, 8, 2, 2, 6, 1, 2, 2, 3, 1, 0, 8, 0, 6, 3, 6, 2, 5, 5, 6, 8, 8, 6, 8, 2, 0, 8, 0, 8, 0, 9, 8, 6, 0, 8, 6, 6, 3, 1, 8, 0, 9, 6, 5, 0, 2, 8, 6, 5, 1, 9, 1, 0, 6, 0, 3, 3, 6, 0, 3, 9, 2, 2, 1, 1, 0, 2, 8, 6, 0, 0, 3, 7, 8, 5, 1, 0, 5, 8, 8, 9, 9, 5, 8, 8, 1, 2, 8, 1, 0, 6, 1, 1, 0, 6, 6, 6, 0, 2, 9, 3, 1, 8, 2, 5, 7, 6, 5, 3, 1, 8, 0, 2, 2, 5, 8, 0, 1, 2, 1, 0, 4, 0, 2, 6, 1, 9, 8, 6, 0, 0, 9, 1, 2, 3, 7, 2, 0, 0, 8, 9, 6, 0, 3, 1, 9, 0, 0, 7, 2, 0, 3, 2, 5, 3, 6, 8, 9, 6, 2, 7, 5, 0, 8, 5, 6, 0, 9, 7, 0, 8, 0, 6, 1, 9, 3, 1, 5, 2, 9, 6, 1, 6, 2, 7, 6, 9, 2, 3, 1, 1, 0, 2, 1, 8, 0, 3, 8, 1, 0, 2, 3, 6, 5, 6, 0, 5, 6, 3, 1, 1, 8, 2, 8, 8, 2, 0, 5, 0, 0, 5, 6, 8, 9, 8, 0, 2, 0, 1, 7, 3, 6, 2, 5, 8, 6, 9, 5, 3, 0, 7, 7, 7, 6, 9, 1, 6, 5, 9, 7, 1, 3, 5, 0, 8, 5, 1, 2, 0, 3, 1, 1, 1, 1, 0, 0, 6, 0, 3, 0, 0, 0, 6, 6, 8, 0, 1, 1, 0, 1, 2, 7, 2, 8, 1, 6, 9, 9, 2, 1, 6, 9, 8, 7, 5, 8, 3, 3, 1, 8, 1, 7, 9, 3, 7, 3, 6, 5, 9, 0, 6, 6, 1, 0, 8, 6, 9, 8, 7, 7, 2, 1, 5, 6, 6, 6, 0, 9, 8, 6, 1, 6, 1, 9, 0, 9, 3, 8, 6, 3, 9, 6, 0, 6, 1, 8, 6, 6, 6, 6, 9, 2, 3, 0, 0, 0, 6, 0, 2, 6, 8, 2, 1, 2, 1, 5, 3, 2, 1, 1, 0, 1, 0, 7, 0, 5, 3, 2, 2, 7, 1, 8, 8, 7, 8, 1, 1, 3, 0, 6, 6, 5, 4, 0, 0, 2, 0, 8, 7, 8, 3, 5, 8, 6, 0, 1, 8]

Conclusion

In summary, my project involved developing an AI model capable of detecting and classifying handwritten digits. I applied this model to solve a code decryption challenge by predicting the digits in the challenge images.