diff --git a/Assets/Asset_col.png b/Assets/Asset_col.png
new file mode 100644
index 0000000000000000000000000000000000000000..ece46d3c6fbef1b8cc43f45f4573a5c3371aafab
Binary files /dev/null and b/Assets/Asset_col.png differ
diff --git a/Assets/Asset_ncol.png b/Assets/Asset_ncol.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea943489f4414191efbd87264046b32ecd56091e
Binary files /dev/null and b/Assets/Asset_ncol.png differ
diff --git a/Assets/Bar.png b/Assets/Bar.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb1f5ab415022ce13cafe7ee5408fb7cd04fd0e0
Binary files /dev/null and b/Assets/Bar.png differ
diff --git a/Assets/BottomBar.png b/Assets/BottomBar.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ad7e88957c23f31d542964c5ff08be5b75516ea
Binary files /dev/null and b/Assets/BottomBar.png differ
diff --git a/Assets/BottomBar.svg b/Assets/BottomBar.svg
new file mode 100644
index 0000000000000000000000000000000000000000..cd18d894f3ac743333fa2b62b8b839b39c276cc7
--- /dev/null
+++ b/Assets/BottomBar.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 32"><defs><style>.cls-1{fill:#c99;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" width="680" height="32" rx="12.9"/></g></g></svg>
\ No newline at end of file
diff --git a/Assets/Circle.png b/Assets/Circle.png
new file mode 100644
index 0000000000000000000000000000000000000000..7aecf6990dffb927a6fc643492617504c6eb6050
Binary files /dev/null and b/Assets/Circle.png differ
diff --git a/Assets/SVG/Asset 2.svg b/Assets/SVG/Asset 2.svg
new file mode 100644
index 0000000000000000000000000000000000000000..fe5749fda05b6880c2d9e96fb42a36104f0d54ba
--- /dev/null
+++ b/Assets/SVG/Asset 2.svg	
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1343 364"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{font-size:48px;}.cls-2,.cls-9{font-family:OdinRounded-Light, Odin Rounded;font-weight:300;}.cls-3{letter-spacing:-0.03em;}.cls-4{font-size:45px;}.cls-10,.cls-4{font-family:MyriadPro-Regular, Myriad Pro;font-weight:400;}.cls-5{letter-spacing:-0.05em;}.cls-6{letter-spacing:-0.04em;}.cls-7{letter-spacing:-0.04em;}.cls-8{fill:url(#linear-gradient-2);}.cls-9{font-size:37px;fill:#333;}.cls-11{letter-spacing:-0.06em;}.cls-12{letter-spacing:-0.03em;}.cls-13{fill:#c799d8;}.cls-14{fill:#ff9986;}</style><linearGradient id="linear-gradient" x1="786.4" y1="-17.01" x2="543.3" y2="404.05" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c799d8"/><stop offset="1" stop-color="#ff9986"/></linearGradient><linearGradient id="linear-gradient-2" x1="484.77" y1="117.16" x2="547.74" y2="117.16" gradientTransform="translate(-0.63 3.24) rotate(-0.25)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#db589a" stop-opacity="0.9"/><stop offset="0.13" stop-color="#d261a2" stop-opacity="0.91"/><stop offset="0.33" stop-color="#ba78b6" stop-opacity="0.93"/><stop offset="0.6" stop-color="#939fd8" stop-opacity="0.96"/><stop offset="0.87" stop-color="#6cf"/></linearGradient></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" x="457" width="429" height="364" rx="59.5"/><text class="cls-2" transform="translate(482 190.42)"><tspan class="cls-3">C</tspan><tspan x="28.7" y="0">omputi</tspan><tspan class="cls-4" x="162.96" y="0">n</tspan><tspan x="187.93" y="0">g</tspan><tspan class="cls-5" x="0" y="57.6">f</tspan><tspan x="16.85" y="57.6">or </tspan><tspan class="cls-6" x="70.99" y="57.6">e</tspan><tspan class="cls-7" x="92.49" y="57.6">v</tspan><tspan x="116.06" y="57.6">er</tspan><tspan class="cls-6" x="154.51" y="57.6">y</tspan><tspan x="177.98" y="57.6">o</tspan><tspan class="cls-4" x="204.24" y="57.6">n</tspan><tspan x="229.21" y="57.6">e</tspan></text><path class="cls-8" d="M490.11,103.42c2.08-.89,4-.53,6.67,0a24.94,24.94,0,0,1,7.34,2.88c.69.39,1.19.68,1.76,1.06,2.32,1.52,3.91,3.13,10.39,7.81.94.68,1.4,1,1.7,1.21.87.57,9.49,6,17,2.94,3.51-1.42,4.08-3.59,6.94-3.41a6.28,6.28,0,0,1,5.18,3.35,6.76,6.76,0,0,1-.26,5.64,9.31,9.31,0,0,1-3.08,3.77c-7.71,5.94-17.28,4.77-17.28,4.77a30.41,30.41,0,0,1-13.54-5.76c-.49-.39-2.05-1.45-4.14-3.18a33.91,33.91,0,0,0-4.9-3.36s-5.9-3.07-10.25-3h-2.16c-2.14.3-2.8,1.3-3.85,1.14-1.67-.25-2.52-3.14-2.65-3.56C483.79,111.57,485.47,105.39,490.11,103.42Z"/><text class="cls-9" transform="translate(553.8 129.53)">Sig<tspan class="cls-10" x="45.65" y="0">n</tspan><tspan class="cls-11" x="66.19" y="0">T</tspan><tspan class="cls-12" x="84.06" y="0">r</tspan><tspan x="94.45" y="0">ack</tspan></text><rect class="cls-13" x="914" width="429" height="364" rx="59.5"/><rect class="cls-14" width="429" height="364" rx="59.5"/></g></g></svg>
\ No newline at end of file
diff --git a/Assets/TopBar.png b/Assets/TopBar.png
new file mode 100644
index 0000000000000000000000000000000000000000..10d04d7afbda889f12552a2abf026fe7b762761b
Binary files /dev/null and b/Assets/TopBar.png differ
diff --git a/Assets/TopBar.svg b/Assets/TopBar.svg
new file mode 100644
index 0000000000000000000000000000000000000000..157211ddafef2291b7d4cd348f4f4bb4fe1b938d
--- /dev/null
+++ b/Assets/TopBar.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 25.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 960 720" style="enable-background:new 0 0 960 720;" xml:space="preserve">
+<style type="text/css">
+	.st0{stroke:#000000;stroke-miterlimit:10;}
+	.st1{fill:#F2F2F2;}
+	.st2{fill:#FF6633;stroke:#000000;stroke-miterlimit:10;}
+	.st3{fill:#FF9933;stroke:#000000;stroke-miterlimit:10;}
+	.st4{fill:#009999;stroke:#000000;stroke-miterlimit:10;}
+	.st5{fill:#CC9999;}
+	.st6{fill:#990033;stroke:#000000;stroke-miterlimit:10;}
+</style>
+<rect x="0.5" y="630.5" class="st0" width="960" height="90"/>
+<rect x="0.5" y="0.5" class="st0" width="960" height="90"/>
+<path class="st1" d="M406.5,64h-28c-3,0-5.5-2.5-5.5-5.5v-8c0-3,2.5-5.5,5.5-5.5h28c3,0,5.5,2.5,5.5,5.5v8
+	C412,61.5,409.5,64,406.5,64z"/>
+<path class="st1" d="M259.5,64h-28c-3,0-5.5-2.5-5.5-5.5v-8c0-3,2.5-5.5,5.5-5.5h28c3,0,5.5,2.5,5.5,5.5v8
+	C265,61.5,262.5,64,259.5,64z"/>
+<path class="st1" d="M113.5,64h-28c-3,0-5.5-2.5-5.5-5.5v-8c0-3,2.5-5.5,5.5-5.5h28c3,0,5.5,2.5,5.5,5.5v8
+	C119,61.5,116.5,64,113.5,64z"/>
+<path class="st2" d="M448.6,49.8H335.9c-7.7,0-13.9-6.2-13.9-13.9v-6.5c0-7.7,6.2-13.9,13.9-13.9h112.8c7.7,0,13.9,6.2,13.9,13.9
+	v6.5C462.5,43.6,456.3,49.8,448.6,49.8z"/>
+<path class="st3" d="M302.1,50.2H189.3c-7.7,0-13.9-6.2-13.9-13.9v-6.5c0-7.7,6.2-13.9,13.9-13.9h112.8c7.7,0,13.9,6.2,13.9,13.9
+	v6.5C316,44,309.7,50.2,302.1,50.2z"/>
+<path class="st4" d="M156.1,50.2H43.3c-7.7,0-13.9-6.2-13.9-13.9v-6.5c0-7.7,6.2-13.9,13.9-13.9h112.8c7.7,0,13.9,6.2,13.9,13.9v6.5
+	C169.9,44,163.7,50.2,156.1,50.2z"/>
+<path class="st5" d="M806.6,691.5H152.4c-7.1,0-12.9-5.8-12.9-12.9v-6.2c0-7.1,5.8-12.9,12.9-12.9h654.2c7.1,0,12.9,5.8,12.9,12.9
+	v6.2C819.5,685.7,813.7,691.5,806.6,691.5z"/>
+<path class="st6" d="M885.6,49.1H481.9c-7.7,0-13.9-6.2-13.9-13.9v-6.5c0-7.7,6.2-13.9,13.9-13.9h403.8c7.7,0,13.9,6.2,13.9,13.9
+	v6.5C899.5,42.9,893.3,49.1,885.6,49.1z"/>
+<path class="st3" d="M164,675.5"/>
+</svg>
diff --git a/Assets/readme/Collecting1.gif b/Assets/readme/Collecting1.gif
new file mode 100644
index 0000000000000000000000000000000000000000..e2840bcc5951e83e68042bb1eb1903b0ef526638
Binary files /dev/null and b/Assets/readme/Collecting1.gif differ
diff --git a/Assets/readme/Collecting2.gif b/Assets/readme/Collecting2.gif
new file mode 100644
index 0000000000000000000000000000000000000000..d8f6076edaf8396de99c2eec5e7653f803e354bf
Binary files /dev/null and b/Assets/readme/Collecting2.gif differ
diff --git a/Assets/readme/Detect1.gif b/Assets/readme/Detect1.gif
new file mode 100644
index 0000000000000000000000000000000000000000..9c2b1b49a9eeba6273e5b2bf388672ba8fbb22ac
Binary files /dev/null and b/Assets/readme/Detect1.gif differ
diff --git a/Assets/readme/Detect2.gif b/Assets/readme/Detect2.gif
new file mode 100644
index 0000000000000000000000000000000000000000..28edf05b893b033331b91d2f5a7f64b35f8f4b2f
Binary files /dev/null and b/Assets/readme/Detect2.gif differ
diff --git a/Assets/readme/SignTrack Logo.svg b/Assets/readme/SignTrack Logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..fe5749fda05b6880c2d9e96fb42a36104f0d54ba
--- /dev/null
+++ b/Assets/readme/SignTrack Logo.svg	
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1343 364"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{font-size:48px;}.cls-2,.cls-9{font-family:OdinRounded-Light, Odin Rounded;font-weight:300;}.cls-3{letter-spacing:-0.03em;}.cls-4{font-size:45px;}.cls-10,.cls-4{font-family:MyriadPro-Regular, Myriad Pro;font-weight:400;}.cls-5{letter-spacing:-0.05em;}.cls-6{letter-spacing:-0.04em;}.cls-7{letter-spacing:-0.04em;}.cls-8{fill:url(#linear-gradient-2);}.cls-9{font-size:37px;fill:#333;}.cls-11{letter-spacing:-0.06em;}.cls-12{letter-spacing:-0.03em;}.cls-13{fill:#c799d8;}.cls-14{fill:#ff9986;}</style><linearGradient id="linear-gradient" x1="786.4" y1="-17.01" x2="543.3" y2="404.05" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c799d8"/><stop offset="1" stop-color="#ff9986"/></linearGradient><linearGradient id="linear-gradient-2" x1="484.77" y1="117.16" x2="547.74" y2="117.16" gradientTransform="translate(-0.63 3.24) rotate(-0.25)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#db589a" stop-opacity="0.9"/><stop offset="0.13" stop-color="#d261a2" stop-opacity="0.91"/><stop offset="0.33" stop-color="#ba78b6" stop-opacity="0.93"/><stop offset="0.6" stop-color="#939fd8" stop-opacity="0.96"/><stop offset="0.87" stop-color="#6cf"/></linearGradient></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" x="457" width="429" height="364" rx="59.5"/><text class="cls-2" transform="translate(482 190.42)"><tspan class="cls-3">C</tspan><tspan x="28.7" y="0">omputi</tspan><tspan class="cls-4" x="162.96" y="0">n</tspan><tspan x="187.93" y="0">g</tspan><tspan class="cls-5" x="0" y="57.6">f</tspan><tspan x="16.85" y="57.6">or </tspan><tspan class="cls-6" x="70.99" y="57.6">e</tspan><tspan class="cls-7" x="92.49" y="57.6">v</tspan><tspan x="116.06" y="57.6">er</tspan><tspan class="cls-6" x="154.51" y="57.6">y</tspan><tspan x="177.98" y="57.6">o</tspan><tspan class="cls-4" x="204.24" y="57.6">n</tspan><tspan x="229.21" y="57.6">e</tspan></text><path class="cls-8" d="M490.11,103.42c2.08-.89,4-.53,6.67,0a24.94,24.94,0,0,1,7.34,2.88c.69.39,1.19.68,1.76,1.06,2.32,1.52,3.91,3.13,10.39,7.81.94.68,1.4,1,1.7,1.21.87.57,9.49,6,17,2.94,3.51-1.42,4.08-3.59,6.94-3.41a6.28,6.28,0,0,1,5.18,3.35,6.76,6.76,0,0,1-.26,5.64,9.31,9.31,0,0,1-3.08,3.77c-7.71,5.94-17.28,4.77-17.28,4.77a30.41,30.41,0,0,1-13.54-5.76c-.49-.39-2.05-1.45-4.14-3.18a33.91,33.91,0,0,0-4.9-3.36s-5.9-3.07-10.25-3h-2.16c-2.14.3-2.8,1.3-3.85,1.14-1.67-.25-2.52-3.14-2.65-3.56C483.79,111.57,485.47,105.39,490.11,103.42Z"/><text class="cls-9" transform="translate(553.8 129.53)">Sig<tspan class="cls-10" x="45.65" y="0">n</tspan><tspan class="cls-11" x="66.19" y="0">T</tspan><tspan class="cls-12" x="84.06" y="0">r</tspan><tspan x="94.45" y="0">ack</tspan></text><rect class="cls-13" x="914" width="429" height="364" rx="59.5"/><rect class="cls-14" width="429" height="364" rx="59.5"/></g></g></svg>
\ No newline at end of file
diff --git a/Assets/readme/SignTrack.png b/Assets/readme/SignTrack.png
new file mode 100644
index 0000000000000000000000000000000000000000..1213cc57bdd153d642f37d5f3f16e5904d9db233
Binary files /dev/null and b/Assets/readme/SignTrack.png differ
diff --git a/Dataset.zip b/Dataset.zip
new file mode 100644
index 0000000000000000000000000000000000000000..fc888a45c4d4344ef36ba1a31ab72ea402842be6
Binary files /dev/null and b/Dataset.zip differ
diff --git a/README.md b/README.md
index a62c53124eaacb170942f2661017c895de0feb6b..f9b00fc68cae951f2c789d866b40559d7fe279a5 100644
--- a/README.md
+++ b/README.md
@@ -1,24 +1,112 @@
-# SignTrack
+![SignTracklogo](Assets/readme/SignTrack.png "SignTrack")
 
-## Table of contents
-* [General info](#general-info)
+## In this guide you can learn about
+
+* [What is SignTrack](#What&nbsp;is&nbsp;SignTrack)
+* [How it works](#How&nbsp;it&nbsp;works)
+* [Showcase](#Quick&nbsp;Guide)
 * [Dependances](#Dependances)
 * [Setup](#setup)
+* [Troubleshoting](#troubleshoting)
+
+## What&nbsp;is&nbsp;SignTrack
+
+SignTrack is a sign language transcriber. It analyzes, processes, and recognizes sign language in real-time, with exceptional accuracy and efficiency. From transforming signs to text to helping you learn sign language by its application in interactive learning, SignTrack helps make computers more open for everyone.
+
+## How&nbsp;it&nbsp;works
+
+SignTrack utilizes a state-of-the-art LSTM model that predicts based on a sequence of data, enabling the detection of whole phrases and moving signs. To further improve precision and efficiency, SignTrack has been trained only on key hand and pose landmarks, that have been extracted using MediaPipe. That way also remains accurate on every skin shade.
+
+Making the data collecting experience friendlier for the user has been one of our top priorities. That's why we made sure to create an easy-to-use data collection user interface, even for those with minimal coding skills.
+
+## Showcase
+
+### Data Collecting
+
+The jouney starts with data collection. Data plays a fundumental role in creating a great model, thats both acurrate and has great performance. The data collection program has been designed to generate data suitable for training the model. Added to that, it has been made to help our users to create an accurate model. With breaks betwen training sessions and intutive design, anyone can create a good training dataset.
+
+Another feature of SignTrack Data Collect is flipping the image to generate data as if you signed with the other hand too! Creating a model that has the ability to make equaly accurate predictions on both hands.
+
+![](Assets/readme/Collecting1.gif "SignTrack Data Collecting Example 1")  ![](Assets/readme/Collecting2.gif "SignTrack Data Collecting Example 2")
+
+### Model Train
 
-## General info
-SignTrack is a real-time sign language transcriber, making interacting with numerous applications. From transforming signs to text to helping you learn sign language by its application in interactive learning.
+Training a neural network can be confusing. From setting training parameters, such as activation functions and the number of neurons on each layer, to the model architecture to the number of epochs, everything in SignTrack is automated, with the power of AutoTrain, requiring minimal, or no adjustment from the user while training.
+AutoTrain makes sure that you get the most out of your dataset. It sets all the training parameters for you, while automatically saving the best-performing model.
+
+### Sign Track Main
+
+Utilizing the created model turned out to be an equally fundumental part of the project. Some people sign faster than the 24 frames that the model requires for making predictions. FastTrack is built into the __SignTrack&nbsp;main.py__ to solve this problem. It randomly duplicates the frames that the model's predictions are based on, while also making sure that the model makes predictions only on frames which the hands are on the frame, enhancing once again the overal performance.
+
+The consistent, unique and identifiable design continues on the main program, while keeping on the display the needed information to understand how the model performs on specific signs. That can save a lot of time for those who work on making their own SignTrack model.
+
+![](Assets/readme/Detect1.gif "SignTrack Main Program Example 1")  ![](Assets/readme/Detect2.gif "SignTrack Main Program Example 2")
 
 ## Dependances
-This project depends on:
+
+This project has been developed using:
+
 * Python: 3.7
 * Tensorflow: 2.5
 * OpenCV: 4.1.2.30
 * Scikit-Learn
 * Matplotlib
 * Mediapipe
+* Cvzone
 
 ## Setup
-Unlike most projects involving Tensorflow, SignTrack installation is beginner friendly.
-* Install Python Poetry (https://python-poetry.org/docs/)
+
+SignTrack uses python poetry to make installation a breeze. Dealing with TensorFlow can often be difficult. We made sure that this is not the case with SignTrack.
+
+### Windows installation
+
+* Install [Python&nbsp;3.7](https://www.python.org/downloads/windows/)
+
+* Install Python [Poetry](https://python-poetry.org/docs/)
+
+* Before installing Tensorflow you also have to install [Visual C++ Redistributable for Visual Studio 2015](https://www.microsoft.com/en-us/download/details.aspx?id=48145)
+
 * Open the location where SignTrack is downloaded on your terminal
-* Run the command: poetry install
\ No newline at end of file
+
+* Run the command: __poetry&nbsp;install__
+
+* ✨Now a virtualenv has been created containing the required dependances✨
+
+### Linux & MacOS installation
+
+* Install [Python&nbsp;3.7](https://askubuntu.com/questions/1251318/how-do-you-install-python3-7-to-ubuntu-20-04)
+
+* Install Python [Poetry](https://python-poetry.org/docs/)
+
+* Open the location where SignTrack is downloaded on your terminal
+
+* Run the command: __poetry&nbsp;install__
+
+* ✨Now a virtualenv has been created containing the required dependances✨
+
+#### To run SignTrack( Applicable on all Operating Systems )
+
+* Navigate to the SignTrack main script (signtrack/main)
+* Open on terminal
+* Type and run on terminal __poetry&nbsp;shell__
+* Type and run on terminal __python&nbsp;main.py__
+
+## Troubleshoting
+
+### OpenCV errors
+
+#### Try changing camera input
+
+You can simply try to change the camera input selection in the first lines of code either on __DataCollect__ or __main__ file in the code.
+
+* Find this line of code __cap&nbsp;=&nbsp;cv2.VideoCapture(0)__
+
+* Change the default value zero to another one like 1 or 2
+
+If that does not work try reinstalling OpenCV
+
+* Type __poetry&nbsp;shell__ on your terminal on the SignTrack directory
+
+* Then type __pip&nbsp;uninstall&nbsp;opencv-python__
+
+* Finally type __pip&nbsp;install&nbsp;opencv-python==4.1.2.30__
diff --git a/model.pack b/model.pack
new file mode 100644
index 0000000000000000000000000000000000000000..0c5d4cafdfced3a552cdeb91a76a339f775de85c
Binary files /dev/null and b/model.pack differ
diff --git a/poetry.lock b/poetry.lock
index e8883234fa1e2e1f100e6c897f905b799ddfc4e7..95f5cf96914a10b84a22e9b9f7b9365b4f6ed17f 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -97,6 +97,18 @@ category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 
+[[package]]
+name = "cvzone"
+version = "1.5.6"
+description = "Computer Vision Helping Library"
+category = "main"
+optional = false
+python-versions = "*"
+
+[package.dependencies]
+numpy = "*"
+opencv-python = "*"
+
 [[package]]
 name = "cycler"
 version = "0.11.0"
@@ -374,7 +386,7 @@ numpy = ">=1.13.3"
 
 [[package]]
 name = "opencv-contrib-python"
-version = "4.5.5.62"
+version = "4.5.5.64"
 description = "Wrapper package for OpenCV python bindings."
 category = "main"
 optional = false
@@ -424,6 +436,22 @@ python-versions = ">=3.6"
 [package.dependencies]
 pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
 
+[[package]]
+name = "pandas"
+version = "1.1.1"
+description = "Powerful data structures for data analysis, time series, and statistics"
+category = "main"
+optional = false
+python-versions = ">=3.6.1"
+
+[package.dependencies]
+numpy = ">=1.15.4"
+python-dateutil = ">=2.7.3"
+pytz = ">=2017.2"
+
+[package.extras]
+test = ["pytest (>=4.0.2)", "pytest-xdist", "hypothesis (>=3.58)"]
+
 [[package]]
 name = "pillow"
 version = "9.0.0"
@@ -534,6 +562,14 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
 [package.dependencies]
 six = ">=1.5"
 
+[[package]]
+name = "pytz"
+version = "2021.3"
+description = "World timezone definitions, modern and historical"
+category = "main"
+optional = false
+python-versions = "*"
+
 [[package]]
 name = "requests"
 version = "2.27.1"
@@ -812,7 +848,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.7"
-content-hash = "e898052a84b51d3a9eb3855ad2ec8f9a23f39ca7b798cf2bf70a22ea1b038bed"
+content-hash = "29cf07116fe53f6c596d81b8bea6ecc58a45bb41b22013649dc5ddeaf5a4e08a"
 
 [metadata.files]
 absl-py = [
@@ -855,6 +891,9 @@ colorama = [
     {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
     {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
 ]
+cvzone = [
+    {file = "cvzone-1.5.6.tar.gz", hash = "sha256:d6fddfc42c0033db1478f6f4ecc8cef91d51202588eaa2fd96e236202ed64242"},
+]
 cycler = [
     {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"},
     {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"},
@@ -1132,13 +1171,13 @@ opencv-contrib-python = [
     {file = "opencv_contrib_python-4.5.2.54-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:40c282c2ab795122ee04ef05dd566aace99799b5ce974999075bfb23d2d67cc3"},
     {file = "opencv_contrib_python-4.5.2.54-cp39-cp39-win32.whl", hash = "sha256:0d12cb62e8494c2e215d6b8f6867f9b0c67b450d071a107803c8ffd6d55efd8c"},
     {file = "opencv_contrib_python-4.5.2.54-cp39-cp39-win_amd64.whl", hash = "sha256:b6ef54585322f66c6300230224308736fb5381c381bee2228d16914e0f370e3a"},
-    {file = "opencv-contrib-python-4.5.5.62.tar.gz", hash = "sha256:80b49c7861689f2f6722bd7a826855ecc8b94992ea3534316d5a66f1f20ac141"},
-    {file = "opencv_contrib_python-4.5.5.62-cp36-abi3-macosx_10_15_x86_64.whl", hash = "sha256:bf53d50297dc71e0681bc08025b53d76f9278abdbf0b595980b72dd4a9025cf5"},
-    {file = "opencv_contrib_python-4.5.5.62-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d71960798c029fffdc37f4f07ec356f760a444f66fc217e3e45185f7bbcc77f3"},
-    {file = "opencv_contrib_python-4.5.5.62-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c5e4c6caf11a45415e8bb40bb4a45f6dd76029e8353e9956c6729bedb43ad"},
-    {file = "opencv_contrib_python-4.5.5.62-cp36-abi3-win32.whl", hash = "sha256:fbdddce88a587308c3789b0a34894032af1e962ac38764c44945f23808f16b26"},
-    {file = "opencv_contrib_python-4.5.5.62-cp36-abi3-win_amd64.whl", hash = "sha256:9522404c265825e4527a1b00eeecd6f0adcb22ddef24a91d8a0c2f2b2c348b4e"},
-    {file = "opencv_contrib_python-4.5.5.62-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:abd6d6114b69685fd8201eaa1da2555dc5f419e20a94567f2dd3e8471f3d748b"},
+    {file = "opencv-contrib-python-4.5.5.64.tar.gz", hash = "sha256:c4ff7cb9c856af521982b54602707a61f8dae8cc28f5949bf1e3d0453d08a9f0"},
+    {file = "opencv_contrib_python-4.5.5.64-cp36-abi3-macosx_10_15_x86_64.whl", hash = "sha256:aff6bcc6d12e664af16be07a583f6a6a637d6e17784bd06abfb07573807a199e"},
+    {file = "opencv_contrib_python-4.5.5.64-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4179b78d8c1eb279fcb2cbb41e6cdb3a127ae5d96c39241ef88dab3382e56da1"},
+    {file = "opencv_contrib_python-4.5.5.64-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4544b8b03dc50fea42f67013cdff5b74a326f7631616055c2a2e998fef652e0f"},
+    {file = "opencv_contrib_python-4.5.5.64-cp36-abi3-win32.whl", hash = "sha256:8381ab5952724719c982e4b8061fbda9ceae5b01f3e2a32beec30b5dd9f74f3f"},
+    {file = "opencv_contrib_python-4.5.5.64-cp36-abi3-win_amd64.whl", hash = "sha256:fc2aa1f3abb564832c1bc289b1d83f491dd249e640b78a30e9cc1831ebbf4410"},
+    {file = "opencv_contrib_python-4.5.5.64-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b54c750ad88eba0e35b09c9286d6d2a1be8d8a6925b1d7e1e487df2396e74397"},
 ]
 opencv-python = [
     {file = "opencv_python-4.1.2.30-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1a2d1801c038f055852bd2379186ca8b19b4ea24afb0b8410293bc802211579b"},
@@ -1176,6 +1215,24 @@ packaging = [
     {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
     {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
 ]
+pandas = [
+    {file = "pandas-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8c9ec12c480c4d915e23ee9c8a2d8eba8509986f35f307771045c1294a2e5b73"},
+    {file = "pandas-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:e4b6c98f45695799990da328e6fd7d6187be32752ed64c2f22326ad66762d179"},
+    {file = "pandas-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:16ae070c47474008769fc443ac765ffd88c3506b4a82966e7a605592978896f9"},
+    {file = "pandas-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:88930c74f69e97b17703600233c0eaf1f4f4dd10c14633d522724c5c1b963ec4"},
+    {file = "pandas-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:fe6f1623376b616e03d51f0dd95afd862cf9a33c18cf55ce0ed4bbe1c4444391"},
+    {file = "pandas-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a81c4bf9c59010aa3efddbb6b9fc84a9b76dc0b4da2c2c2d50f06a9ef6ac0004"},
+    {file = "pandas-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:1acc2bd7fc95e5408a4456897c2c2a1ae7c6acefe108d90479ab6d98d34fcc3d"},
+    {file = "pandas-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:84c101d0f7bbf0d9f1be9a2f29f6fcc12415442558d067164e50a56edfb732b4"},
+    {file = "pandas-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:391db82ebeb886143b96b9c6c6166686c9a272d00020e4e39ad63b792542d9e2"},
+    {file = "pandas-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0366150fe8ee37ef89a45d3093e05026b5f895e42bbce3902ce3b6427f1b8471"},
+    {file = "pandas-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d9644ac996149b2a51325d48d77e25c911e01aa6d39dc1b64be679cd71f683ec"},
+    {file = "pandas-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:41675323d4fcdd15abde068607cad150dfe17f7d32290ee128e5fea98442bd09"},
+    {file = "pandas-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0246c67cbaaaac8d25fed8d4cf2d8897bd858f0e540e8528a75281cee9ac516d"},
+    {file = "pandas-1.1.1-cp38-cp38-win32.whl", hash = "sha256:01b1e536eb960822c5e6b58357cad8c4b492a336f4a5630bf0b598566462a578"},
+    {file = "pandas-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:57c5f6be49259cde8e6f71c2bf240a26b071569cabc04c751358495d09419e56"},
+    {file = "pandas-1.1.1.tar.gz", hash = "sha256:53328284a7bb046e2e885fd1b8c078bd896d7fc4575b915d4936f54984a2ba67"},
+]
 pillow = [
     {file = "Pillow-9.0.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:113723312215b25c22df1fdf0e2da7a3b9c357a7d24a93ebbe80bfda4f37a8d4"},
     {file = "Pillow-9.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bb47a548cea95b86494a26c89d153fd31122ed65255db5dcbc421a2d28eb3379"},
@@ -1292,6 +1349,10 @@ python-dateutil = [
     {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
     {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
 ]
+pytz = [
+    {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"},
+    {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"},
+]
 requests = [
     {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"},
     {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"},
diff --git a/pyproject.toml b/pyproject.toml
index 81a46020da3578270b8e77e7e436ec33c18ffce1..cbe03615b43164417732b97e399d40201f5ef61a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -11,6 +11,8 @@ opencv-python = "4.1.2.30"
 mediapipe = "^0.8.9"
 sklearn = "^0.0"
 matplotlib = "^3.5.1"
+pandas = "1.1.1"
+cvzone = "^1.5.6"
 
 [tool.poetry.dev-dependencies]
 pytest = "^5.2"
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..776479f9b9d45d4ea982c864ce58c734e40d5c74
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,1176 @@
+absl-py==0.15.0; python_version >= "3.6" \
+    --hash=sha256:72d782fbeafba66ba3e525d46bccac949b9a174dbf66233e50ece09ee688dc81 \
+    --hash=sha256:ea907384af023a7e681368bedb896159ab100c7db593efbbd5cde22af11270cd
+aiohttp==3.8.1; python_version >= "3.7" \
+    --hash=sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8 \
+    --hash=sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8 \
+    --hash=sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316 \
+    --hash=sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15 \
+    --hash=sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923 \
+    --hash=sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922 \
+    --hash=sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1 \
+    --hash=sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516 \
+    --hash=sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642 \
+    --hash=sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7 \
+    --hash=sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8 \
+    --hash=sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3 \
+    --hash=sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2 \
+    --hash=sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa \
+    --hash=sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32 \
+    --hash=sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db \
+    --hash=sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632 \
+    --hash=sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad \
+    --hash=sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a \
+    --hash=sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091 \
+    --hash=sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440 \
+    --hash=sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b \
+    --hash=sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec \
+    --hash=sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411 \
+    --hash=sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782 \
+    --hash=sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4 \
+    --hash=sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602 \
+    --hash=sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96 \
+    --hash=sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676 \
+    --hash=sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51 \
+    --hash=sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8 \
+    --hash=sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd \
+    --hash=sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2 \
+    --hash=sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4 \
+    --hash=sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00 \
+    --hash=sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93 \
+    --hash=sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44 \
+    --hash=sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7 \
+    --hash=sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c \
+    --hash=sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9 \
+    --hash=sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17 \
+    --hash=sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785 \
+    --hash=sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b \
+    --hash=sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd \
+    --hash=sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e \
+    --hash=sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd \
+    --hash=sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700 \
+    --hash=sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675 \
+    --hash=sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf \
+    --hash=sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0 \
+    --hash=sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5 \
+    --hash=sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950 \
+    --hash=sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155 \
+    --hash=sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33 \
+    --hash=sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a \
+    --hash=sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75 \
+    --hash=sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237 \
+    --hash=sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74 \
+    --hash=sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca \
+    --hash=sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2 \
+    --hash=sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2 \
+    --hash=sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421 \
+    --hash=sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf \
+    --hash=sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd \
+    --hash=sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d \
+    --hash=sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724 \
+    --hash=sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef \
+    --hash=sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866 \
+    --hash=sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2 \
+    --hash=sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1 \
+    --hash=sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac \
+    --hash=sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578
+aiosignal==1.2.0; python_version >= "3.6" \
+    --hash=sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a \
+    --hash=sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2
+astunparse==1.6.3 \
+    --hash=sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8 \
+    --hash=sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872
+async-timeout==4.0.2; python_version >= "3.6" \
+    --hash=sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15 \
+    --hash=sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c
+asynctest==0.13.0; python_version < "3.8" and python_version >= "3.6" \
+    --hash=sha256:5da6118a7e6d6b54d83a8f7197769d046922a44d2a99c21382f0a6e4fadae676 \
+    --hash=sha256:c27862842d15d83e6a34eb0b2866c323880eb3a75e4485b079ea11748fd77fac
+attrs==21.4.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" \
+    --hash=sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4 \
+    --hash=sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd
+cached-property==1.5.2; python_version < "3.8" and python_version >= "3.6" \
+    --hash=sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130 \
+    --hash=sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0
+cachetools==5.0.0; python_version >= "3.7" and python_version < "4.0" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6") \
+    --hash=sha256:8fecd4203a38af17928be7b90689d8083603073622229ca7077b72d8e5a976e4 \
+    --hash=sha256:486471dfa8799eb7ec503a8059e263db000cdda20075ce5e48903087f79d5fd6
+certifi==2021.10.8; python_full_version >= "3.6.0" and python_version >= "3.6" \
+    --hash=sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569 \
+    --hash=sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872
+charset-normalizer==2.0.10; python_full_version >= "3.6.0" and python_version >= "3.6" \
+    --hash=sha256:876d180e9d7432c5d1dfd4c5d26b72f099d503e8fcc0feb7532c9289be60fcbd \
+    --hash=sha256:cb957888737fc0bbcd78e3df769addb41fd1ff8cf950dc9e7ad7793f1bf44455
+click==8.0.4; python_version >= "3.6" and python_full_version >= "3.6.0" \
+    --hash=sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1 \
+    --hash=sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb
+colorama==0.4.4; python_full_version >= "3.6.0" and platform_system == "Windows" and python_version >= "3.6" \
+    --hash=sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2 \
+    --hash=sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b
+cvzone==1.5.6 \
+    --hash=sha256:d6fddfc42c0033db1478f6f4ecc8cef91d51202588eaa2fd96e236202ed64242
+cycler==0.11.0; python_version >= "3.7" \
+    --hash=sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3 \
+    --hash=sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f
+datasets==2.0.0 \
+    --hash=sha256:6219d3674ebfbd6978f2f27f7db89aabdac6f7392efda735b9e005b5d87d3c76 \
+    --hash=sha256:c93db6b39e5dda72b093d6f11a05945f588e7c5caabb93a0ac4bdf07e0d0ac1a
+dill==0.3.4; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.1.0" \
+    --hash=sha256:7e40e4a70304fd9ceab3535d36e58791d9c4a776b38ec7f7ec9afc8d3dca4d4f \
+    --hash=sha256:9f9734205146b2b353ab3fec9af0070237b6ddae78452af83d2fca84d739e675
+filelock==3.6.0; python_version >= "3.7" and python_full_version >= "3.6.0" \
+    --hash=sha256:f8314284bfffbdcfa0ff3d7992b023d4c628ced6feb957351d4c48d059f56bc0 \
+    --hash=sha256:9cd540a9352e432c7246a48fe4e8712b10acb1df2ad1f30e8c070b82ae1fed85
+flatbuffers==1.12 \
+    --hash=sha256:9e9ef47fa92625c4721036e7c4124182668dc6021d9e7c73704edd395648deb9 \
+    --hash=sha256:63bb9a722d5e373701913e226135b28a6f6ac200d5cc7b4d919fa38d73b44610
+fonttools==4.28.5; python_version >= "3.7" \
+    --hash=sha256:edf251d5d2cc0580d5f72de4621c338d8c66c5f61abb50cf486640f73c8194d5 \
+    --hash=sha256:545c05d0f7903a863c2020e07b8f0a57517f2c40d940bded77076397872d14ca
+frozenlist==1.3.0; python_version >= "3.7" \
+    --hash=sha256:d2257aaba9660f78c7b1d8fea963b68f3feffb1a9d5d05a18401ca9eb3e8d0a3 \
+    --hash=sha256:4a44ebbf601d7bac77976d429e9bdb5a4614f9f4027777f9e54fd765196e9d3b \
+    --hash=sha256:45334234ec30fc4ea677f43171b18a27505bfb2dba9aca4398a62692c0ea8868 \
+    --hash=sha256:47be22dc27ed933d55ee55845d34a3e4e9f6fee93039e7f8ebadb0c2f60d403f \
+    --hash=sha256:03a7dd1bfce30216a3f51a84e6dd0e4a573d23ca50f0346634916ff105ba6e6b \
+    --hash=sha256:691ddf6dc50480ce49f68441f1d16a4c3325887453837036e0fb94736eae1e58 \
+    --hash=sha256:bde99812f237f79eaf3f04ebffd74f6718bbd216101b35ac7955c2d47c17da02 \
+    --hash=sha256:6a202458d1298ced3768f5a7d44301e7c86defac162ace0ab7434c2e961166e8 \
+    --hash=sha256:b9e3e9e365991f8cc5f5edc1fd65b58b41d0514a6a7ad95ef5c7f34eb49b3d3e \
+    --hash=sha256:04cb491c4b1c051734d41ea2552fde292f5f3a9c911363f74f39c23659c4af78 \
+    --hash=sha256:436496321dad302b8b27ca955364a439ed1f0999311c393dccb243e451ff66aa \
+    --hash=sha256:754728d65f1acc61e0f4df784456106e35afb7bf39cfe37227ab00436fb38676 \
+    --hash=sha256:6eb275c6385dd72594758cbe96c07cdb9bd6becf84235f4a594bdf21e3596c9d \
+    --hash=sha256:e30b2f9683812eb30cf3f0a8e9f79f8d590a7999f731cf39f9105a7c4a39489d \
+    --hash=sha256:f7353ba3367473d1d616ee727945f439e027f0bb16ac1a750219a8344d1d5d3c \
+    --hash=sha256:88aafd445a233dbbf8a65a62bc3249a0acd0d81ab18f6feb461cc5a938610d24 \
+    --hash=sha256:4406cfabef8f07b3b3af0f50f70938ec06d9f0fc26cbdeaab431cbc3ca3caeaa \
+    --hash=sha256:8cf829bd2e2956066dd4de43fd8ec881d87842a06708c035b37ef632930505a2 \
+    --hash=sha256:603b9091bd70fae7be28bdb8aa5c9990f4241aa33abb673390a7f7329296695f \
+    --hash=sha256:25af28b560e0c76fa41f550eacb389905633e7ac02d6eb3c09017fa1c8cdfde1 \
+    --hash=sha256:94c7a8a9fc9383b52c410a2ec952521906d355d18fccc927fca52ab575ee8b93 \
+    --hash=sha256:65bc6e2fece04e2145ab6e3c47428d1bbc05aede61ae365b2c1bddd94906e478 \
+    --hash=sha256:3f7c935c7b58b0d78c0beea0c7358e165f95f1fd8a7e98baa40d22a05b4a8141 \
+    --hash=sha256:bd89acd1b8bb4f31b47072615d72e7f53a948d302b7c1d1455e42622de180eae \
+    --hash=sha256:6983a31698490825171be44ffbafeaa930ddf590d3f051e397143a5045513b01 \
+    --hash=sha256:adac9700675cf99e3615eb6a0eb5e9f5a4143c7d42c05cea2e7f71c27a3d0846 \
+    --hash=sha256:0c36e78b9509e97042ef869c0e1e6ef6429e55817c12d78245eb915e1cca7468 \
+    --hash=sha256:57f4d3f03a18facacb2a6bcd21bccd011e3b75d463dc49f838fd699d074fabd1 \
+    --hash=sha256:8c905a5186d77111f02144fab5b849ab524f1e876a1e75205cd1386a9be4b00a \
+    --hash=sha256:b5009062d78a8c6890d50b4e53b0ddda31841b3935c1937e2ed8c1bda1c7fb9d \
+    --hash=sha256:2fdc3cd845e5a1f71a0c3518528bfdbfe2efaf9886d6f49eacc5ee4fd9a10953 \
+    --hash=sha256:92e650bd09b5dda929523b9f8e7f99b24deac61240ecc1a32aeba487afcd970f \
+    --hash=sha256:40dff8962b8eba91fd3848d857203f0bd704b5f1fa2b3fc9af64901a190bba08 \
+    --hash=sha256:768efd082074bb203c934e83a61654ed4931ef02412c2fbdecea0cff7ecd0274 \
+    --hash=sha256:006d3595e7d4108a12025ddf415ae0f6c9e736e726a5db0183326fd191b14c5e \
+    --hash=sha256:871d42623ae15eb0b0e9df65baeee6976b2e161d0ba93155411d58ff27483ad8 \
+    --hash=sha256:aff388be97ef2677ae185e72dc500d19ecaf31b698986800d3fc4f399a5e30a5 \
+    --hash=sha256:9f892d6a94ec5c7b785e548e42722e6f3a52f5f32a8461e82ac3e67a3bd073f1 \
+    --hash=sha256:e982878792c971cbd60ee510c4ee5bf089a8246226dea1f2138aa0bb67aff148 \
+    --hash=sha256:c6c321dd013e8fc20735b92cb4892c115f5cdb82c817b1e5b07f6b95d952b2f0 \
+    --hash=sha256:30530930410855c451bea83f7b272fb1c495ed9d5cc72895ac29e91279401db3 \
+    --hash=sha256:40ec383bc194accba825fbb7d0ef3dda5736ceab2375462f1d8672d9f6b68d07 \
+    --hash=sha256:f20baa05eaa2bcd5404c445ec51aed1c268d62600362dc6cfe04fae34a424bd9 \
+    --hash=sha256:0437fe763fb5d4adad1756050cbf855bbb2bf0d9385c7bb13d7a10b0dd550486 \
+    --hash=sha256:b684c68077b84522b5c7eafc1dc735bfa5b341fb011d5552ebe0968e22ed641c \
+    --hash=sha256:93641a51f89473837333b2f8100f3f89795295b858cd4c7d4a1f18e299dc0a4f \
+    --hash=sha256:d6d32ff213aef0fd0bcf803bffe15cfa2d4fde237d1d4838e62aec242a8362fa \
+    --hash=sha256:31977f84828b5bb856ca1eb07bf7e3a34f33a5cddce981d880240ba06639b94d \
+    --hash=sha256:3c62964192a1c0c30b49f403495911298810bada64e4f03249ca35a33ca0417a \
+    --hash=sha256:4eda49bea3602812518765810af732229b4291d2695ed24a0a20e098c45a707b \
+    --hash=sha256:acb267b09a509c1df5a4ca04140da96016f40d2ed183cdc356d237286c971b51 \
+    --hash=sha256:e1e26ac0a253a2907d654a37e390904426d5ae5483150ce3adedb35c8c06614a \
+    --hash=sha256:f96293d6f982c58ebebb428c50163d010c2f05de0cde99fd681bfdc18d4b2dc2 \
+    --hash=sha256:e84cb61b0ac40a0c3e0e8b79c575161c5300d1d89e13c0e02f76193982f066ed \
+    --hash=sha256:ff9310f05b9d9c5c4dd472983dc956901ee6cb2c3ec1ab116ecdde25f3ce4951 \
+    --hash=sha256:d26b650b71fdc88065b7a21f8ace70175bcf3b5bdba5ea22df4bfd893e795a3b \
+    --hash=sha256:01a73627448b1f2145bddb6e6c2259988bb8aee0fb361776ff8604b99616cd08 \
+    --hash=sha256:772965f773757a6026dea111a15e6e2678fbd6216180f82a48a40b27de1ee2ab \
+    --hash=sha256:ce6f2ba0edb7b0c1d8976565298ad2deba6f8064d2bebb6ffce2ca896eb35b0b
+fsspec==2022.2.0; python_version >= "3.7" \
+    --hash=sha256:eb9c9d9aee49d23028deefffe53e87c55d3515512c63f57e893710301001449a \
+    --hash=sha256:20322c659538501f52f6caa73b08b2ff570b7e8ea30a86559721d090e473ad5c
+gast==0.4.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" \
+    --hash=sha256:b7adcdd5adbebf1adf17378da5ba3f543684dbec47b1cda1f3997e573cd542c4 \
+    --hash=sha256:40feb7b8b8434785585ab224d1568b857edb18297e5a3047f1ba012bc83b42c1
+google-auth-oauthlib==0.4.6; python_version >= "3.6" \
+    --hash=sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a \
+    --hash=sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73
+google-auth==2.4.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6" \
+    --hash=sha256:ef6f4827f6a3f9c5ff884616e2ba779acb5d690486fb70ca5e3091ed85ad932a \
+    --hash=sha256:d1fad279d9d97e7d6b4a09a53e851ab2ee6d36d5c19547354a3f47a8a6ae41b9
+google-pasta==0.2.0 \
+    --hash=sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e \
+    --hash=sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954 \
+    --hash=sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed
+grpcio==1.34.1; python_version >= "3.6" \
+    --hash=sha256:5c4402fd8ce28e2847112105591139dc121c8980770f683eb781be1568a64097 \
+    --hash=sha256:c6f756c11144c7ecb51b87f0d60a4b72e05635b9f24ddfa004286ab0c8527fa0 \
+    --hash=sha256:ec6d1b3daed886a73e40b4dc553474ef415acc111e913d7324cc2c6b0ba9efe0 \
+    --hash=sha256:d757bc8bb12f07014dde55a04b5261c94828b605cf0726d02d491c3dc71aa6bb \
+    --hash=sha256:f74cb93cd090b07528cf586a18628370e5780c08e0239f4af796f60a5e773568 \
+    --hash=sha256:c4355fa382dfc71c130dc3eccd8ae606a13e1729be2a77b6c44cd5a130d0c616 \
+    --hash=sha256:f1a8048428a7a1e5b12322b3ee44ee0bb8e1bea1d67f08fa1813c455f3ef638c \
+    --hash=sha256:0bd906496b9dd3751b9e5cacc7ceb25a57c16ce2aa67315b85ee86a4ba7246f1 \
+    --hash=sha256:5e488a40ebeb883117aa0dba2cea410ef2ab545a2403b2ac9101e62d42808c71 \
+    --hash=sha256:98c06f0f7feeca736cc98f3f46b9b74c5f5fdc5febfc7d72728d1895c57be87f \
+    --hash=sha256:90a4799c15b8b5aa587f65650a0cea28ea88bcd2c5fdf4f1adb2b8b7b4e77a5e \
+    --hash=sha256:121af89d0b9ba1d47c738242783675009dd4e9067359481e4b743eb9e5886682 \
+    --hash=sha256:1be193803c706f78d0df12c817eaf2415fb4d39472fa00d860700e6c7a99f8f7 \
+    --hash=sha256:9e465a1d594a9a5f4252c4abbb93909c42768bee5fbfcd18098d60bf06a35573 \
+    --hash=sha256:8b16d14160b7fd8bc43600be70e0da677d17dd8aafb5a258bbda996fe410320e \
+    --hash=sha256:8a543209ab606dd55c58dc218be8e8619214607f03717dded78c7d27f1d05ba5 \
+    --hash=sha256:f74f270550df347a18f839331f84838b938c8923a9e13a6fa7cc69c79087a686 \
+    --hash=sha256:163a2cf7f4df3ff0a04f49e634526e3d88f02393a7ebf8f34a2134c88b06322e \
+    --hash=sha256:11735ac4efd53691afeb36d006e20db9b7d4b6f3356c751f32d5747aee38fa4c \
+    --hash=sha256:79bda20756e2fc7236b94468ffcce4b516953f946a80b7ea883f89d9e9b25a41 \
+    --hash=sha256:1857f88b351e2382aa57ed892960361a8b71acca4aa1b90998007b4177f15114 \
+    --hash=sha256:6f81fbf9f830e20aee93480305877f73f15bfa58fa87433eb331696be47ae7ba \
+    --hash=sha256:ff8aef869c2e9de65c3a693406f7d1200d87e6d541d096eae69f98e7f301fa60 \
+    --hash=sha256:ece7459c182e00ca90b2e5823940a552651b5eb3acdeee9350377ddb44d9c412 \
+    --hash=sha256:7924ef3a898f6ff985540ee5d8c7554f0c925dc7668c3d63461600ea50b39658 \
+    --hash=sha256:b5e96ca83d5c34c9b60d8951e52492b0d9d072c3fe38a1c19765932e121036ce \
+    --hash=sha256:fe9360347a3f4f2ec6923d8afb03a9194f3f14e054cb09e75e8346af9c0aa9f6 \
+    --hash=sha256:cadc09c9bd24ecf3ba7ae55b5a741f7de694a8843e97e82a7c3fa2e6e81e0f9a \
+    --hash=sha256:5971e6dfcfa0ebeb0df2d15383e1b53fa36208198c8aff9a4eed5ece2a6d4571 \
+    --hash=sha256:a181092b534e996e36d0c0216d81280d4942322170c823b2fb84ec4597dc0bd5 \
+    --hash=sha256:2b97cdd4582445ad7bd441f5f3c57d838bcdc518a05713dab0c7f4b945afb39e \
+    --hash=sha256:ff760c5ce73c177851864e8caaf75467eaf06c1b6857b21e1789658375e720fb \
+    --hash=sha256:fd58ea88dd5439e03c6587f0b672db1627ec8ed47be312c74632650dfed33c2e \
+    --hash=sha256:f6fee4445cffb45593b4c1d9bb0bc7922e77ec846a1237e2e744b1223d69c863 \
+    --hash=sha256:cd4da71e105088b1a7e629d1b033f16d87dec08524d0e4f5d77982af6fe1b6c2 \
+    --hash=sha256:9d43849d8925ec24bf121bccd941a13d4e8c2cffdfa769a04a6d4ed38c6b88a2 \
+    --hash=sha256:696f0de4d47f738063432bbbcecd07f78256864f0839e41369458421f539f00a \
+    --hash=sha256:8fff784ec5d12252a7cc0ab6f1a3206861b94e45ee0ebeba2439bd10a6db2f1a \
+    --hash=sha256:ed8ac4f76cbbef5dc54594cb7bf6fbb985f5be66abcb1f9da8142500e4d76492 \
+    --hash=sha256:8dad4184e4669672e126de26776eba8e3db4914660b4a0a6c7edbdbcf3e2f05f \
+    --hash=sha256:011e9b5e47cb9d2a808e8c2dd5ae86df085d5879d9e8095a24631a32c577f231 \
+    --hash=sha256:49ffc5bb78b201db24d8d1644193beb50a896c3cb35b259b4fb9c44dba18585f \
+    --hash=sha256:cfe0e015cb8db5a27a92621fdd9dc8e69b2f7130db326601802e6ff36626deff \
+    --hash=sha256:809732f300fa8093b40f843c36f6f78423ffb40493098185bc4a96bd67126db5 \
+    --hash=sha256:96dc85c059f15390beb7ac6bf075d1e4cf72e8f5c9b6c37ea179b7cc579816fd \
+    --hash=sha256:1c746a3cd8a830d8d916a9d0476a786aaa98c5cc2a096344af2be955e439f8ac
+h5py==3.1.0; python_version >= "3.6" \
+    --hash=sha256:1cd367f89a5441236bdbb795e9fb9a9e3424929c00b4a54254ca760437f83d69 \
+    --hash=sha256:fea05349f63625a8fb808e57e42bb4c76930cf5d50ac58b678c52f913a48a89b \
+    --hash=sha256:2e37352ddfcf9d77a2a47f7c8f7e125c6d20cc06c2995edeb7be222d4e152636 \
+    --hash=sha256:e33f61d3eb862614c0f273a1f993a64dc2f093e1a3094932c50ada9d2db2170f \
+    --hash=sha256:236ac8d943be30b617ab615c3d4a4bf4a438add2be87e54af3687ab721a18fac \
+    --hash=sha256:02c391fdb980762a1cc03a4bcaecd03dc463994a9a63a02264830114a96e111f \
+    --hash=sha256:f89a3dae38843ffa49d17a31a3509a8129e9b46ece602a0138e1ed79e685c361 \
+    --hash=sha256:ba71f6229d2013fbb606476ecc29c6223fc16b244d35fcd8566ad9dbaf910857 \
+    --hash=sha256:dccb89358bc84abcd711363c3e138f9f4eccfdf866f2139a8e72308328765b2c \
+    --hash=sha256:cb74df83709d6d03d11e60b9480812f58da34f194beafa8c8314dbbeeedfe0a6 \
+    --hash=sha256:80c623be10479e81b64fa713b7ed4c0bbe9f02e8e7d2a2e5382336087b615ce4 \
+    --hash=sha256:1cdfd1c5449ca1329d152f0b66830e93226ebce4f5e07dd8dc16bfc2b1a49d7b \
+    --hash=sha256:1e2516f190652beedcb8c7acfa1c6fa92d99b42331cbef5e5c7ec2d65b0fc3c2
+happytransformer==2.4.1 \
+    --hash=sha256:d42bf30c2552e79d5fa77d859222e34e9929edbb480d64a5878fb23eae1a990f \
+    --hash=sha256:1008835ce8567a41b6ca36a6316313f59a3f7c76b22603fc7cca72022891b452
+huggingface-hub==0.4.0; python_full_version >= "3.6.0" \
+    --hash=sha256:808021af1ce1111104973ae54d81738eaf40be6d1e82fc6bdedb82f81c6206e7 \
+    --hash=sha256:f0e3389f8988eb7781b17de520ae7fd0aa50d9823534e3ae55344d943a88ac87
+idna==3.3; python_full_version >= "3.6.0" and python_version >= "3.6" \
+    --hash=sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff \
+    --hash=sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d
+importlib-metadata==4.10.1; python_version >= "3.7" and python_version < "3.8" and python_full_version >= "3.6.0" \
+    --hash=sha256:899e2a40a8c4a1aec681feef45733de8a6c58f3f6a0dbed2eb6574b4387a77b6 \
+    --hash=sha256:951f0d8a5b7260e9db5e41d429285b5f451e928479f19d80818878527d36e95e
+joblib==1.1.0; python_version >= "3.7" and python_full_version >= "3.6.0" \
+    --hash=sha256:f21f109b3c7ff9d95f8387f752d0d9c34a02aa2f7060c2135f465da0e5160ff6 \
+    --hash=sha256:4158fcecd13733f8be669be0683b96ebdbbd38d23559f54dca7205aea1bf1e35
+keras-nightly==2.5.0.dev2021032900 \
+    --hash=sha256:6ba70f738f4008222de7e7fdd5b2b18c48c49b897a9fca54c844854e25964011
+keras-preprocessing==1.1.2 \
+    --hash=sha256:7b82029b130ff61cc99b55f3bd27427df4838576838c5b2f65940e4fcec99a7b \
+    --hash=sha256:add82567c50c8bc648c14195bf544a5ce7c1f76761536956c3d2978970179ef3
+kiwisolver==1.3.2; python_version >= "3.7" \
+    --hash=sha256:1d819553730d3c2724582124aee8a03c846ec4362ded1034c16fb3ef309264e6 \
+    --hash=sha256:8d93a1095f83e908fc253f2fb569c2711414c0bfd451cab580466465b235b470 \
+    --hash=sha256:c4550a359c5157aaf8507e6820d98682872b9100ce7607f8aa070b4b8af6c298 \
+    --hash=sha256:2210f28778c7d2ee13f3c2a20a3a22db889e75f4ec13a21072eabb5693801e84 \
+    --hash=sha256:82f49c5a79d3839bc8f38cb5f4bfc87e15f04cbafa5fbd12fb32c941cb529cfb \
+    --hash=sha256:9661a04ca3c950a8ac8c47f53cbc0b530bce1b52f516a1e87b7736fec24bfff0 \
+    --hash=sha256:2ddb500a2808c100e72c075cbb00bf32e62763c82b6a882d403f01a119e3f402 \
+    --hash=sha256:72be6ebb4e92520b9726d7146bc9c9b277513a57a38efcf66db0620aec0097e0 \
+    --hash=sha256:83d2c9db5dfc537d0171e32de160461230eb14663299b7e6d18ca6dca21e4977 \
+    --hash=sha256:cba430db673c29376135e695c6e2501c44c256a81495da849e85d1793ee975ad \
+    --hash=sha256:4116ba9a58109ed5e4cb315bdcbff9838f3159d099ba5259c7c7fb77f8537492 \
+    --hash=sha256:19554bd8d54cf41139f376753af1a644b63c9ca93f8f72009d50a2080f870f77 \
+    --hash=sha256:a7a4cf5bbdc861987a7745aed7a536c6405256853c94abc9f3287c3fa401b174 \
+    --hash=sha256:0007840186bacfaa0aba4466d5890334ea5938e0bb7e28078a0eb0e63b5b59d5 \
+    --hash=sha256:ec2eba188c1906b05b9b49ae55aae4efd8150c61ba450e6721f64620c50b59eb \
+    --hash=sha256:3dbb3cea20b4af4f49f84cffaf45dd5f88e8594d18568e0225e6ad9dec0e7967 \
+    --hash=sha256:5326ddfacbe51abf9469fe668944bc2e399181a2158cb5d45e1d40856b2a0589 \
+    --hash=sha256:c6572c2dab23c86a14e82c245473d45b4c515314f1f859e92608dcafbd2f19b8 \
+    --hash=sha256:b5074fb09429f2b7bc82b6fb4be8645dcbac14e592128beeff5461dcde0af09f \
+    --hash=sha256:22521219ca739654a296eea6d4367703558fba16f98688bd8ce65abff36eaa84 \
+    --hash=sha256:c358721aebd40c243894298f685a19eb0491a5c3e0b923b9f887ef1193ddf829 \
+    --hash=sha256:7ba5a1041480c6e0a8b11a9544d53562abc2d19220bfa14133e0cdd9967e97af \
+    --hash=sha256:44e6adf67577dbdfa2d9f06db9fbc5639afefdb5bf2b4dfec25c3a7fbc619536 \
+    --hash=sha256:1d45d1c74f88b9f41062716c727f78f2a59a5476ecbe74956fafb423c5c87a76 \
+    --hash=sha256:70adc3658138bc77a36ce769f5f183169bc0a2906a4f61f09673f7181255ac9b \
+    --hash=sha256:b6a5431940f28b6de123de42f0eb47b84a073ee3c3345dc109ad550a3307dd28 \
+    --hash=sha256:ee040a7de8d295dbd261ef2d6d3192f13e2b08ec4a954de34a6fb8ff6422e24c \
+    --hash=sha256:8dc3d842fa41a33fe83d9f5c66c0cc1f28756530cd89944b63b072281e852031 \
+    --hash=sha256:a498bcd005e8a3fedd0022bb30ee0ad92728154a8798b703f394484452550507 \
+    --hash=sha256:80efd202108c3a4150e042b269f7c78643420cc232a0a771743bb96b742f838f \
+    --hash=sha256:f8eb7b6716f5b50e9c06207a14172cf2de201e41912ebe732846c02c830455b9 \
+    --hash=sha256:f441422bb313ab25de7b3dbfd388e790eceb76ce01a18199ec4944b369017009 \
+    --hash=sha256:30fa008c172355c7768159983a7270cb23838c4d7db73d6c0f6b60dde0d432c6 \
+    --hash=sha256:2f8f6c8f4f1cff93ca5058d6ec5f0efda922ecb3f4c5fb76181f327decff98b8 \
+    --hash=sha256:ba677bcaff9429fd1bf01648ad0901cea56c0d068df383d5f5856d88221fe75b \
+    --hash=sha256:7843b1624d6ccca403a610d1277f7c28ad184c5aa88a1750c1a999754e65b439 \
+    --hash=sha256:e6f5eb2f53fac7d408a45fbcdeda7224b1cfff64919d0f95473420a931347ae9 \
+    --hash=sha256:eedd3b59190885d1ebdf6c5e0ca56828beb1949b4dfe6e5d0256a461429ac386 \
+    --hash=sha256:dedc71c8eb9c5096037766390172c34fb86ef048b8e8958b4e484b9e505d66bc \
+    --hash=sha256:bf7eb45d14fc036514c09554bf983f2a72323254912ed0c3c8e697b62c4c158f \
+    --hash=sha256:2b65bd35f3e06a47b5c30ea99e0c2b88f72c6476eedaf8cfbc8e66adb5479dcf \
+    --hash=sha256:25405f88a37c5f5bcba01c6e350086d65e7465fd1caaf986333d2a045045a223 \
+    --hash=sha256:bcadb05c3d4794eb9eee1dddf1c24215c92fb7b55a80beae7a60530a91060560 \
+    --hash=sha256:fc4453705b81d03568d5b808ad8f09c77c47534f6ac2e72e733f9ca4714aa75c
+markdown==3.3.6; python_version >= "3.6" \
+    --hash=sha256:9923332318f843411e9932237530df53162e29dc7a4e2b91e35764583c46c9a3 \
+    --hash=sha256:76df8ae32294ec39dcf89340382882dfa12975f87f45c3ed1ecdb1e8cefc7006
+matplotlib==3.5.1; python_version >= "3.7" \
+    --hash=sha256:456cc8334f6d1124e8ff856b42d2cc1c84335375a16448189999496549f7182b \
+    --hash=sha256:8a77906dc2ef9b67407cec0bdbf08e3971141e535db888974a915be5e1e3efc6 \
+    --hash=sha256:8e70ae6475cfd0fad3816dcbf6cac536dc6f100f7474be58d59fa306e6e768a4 \
+    --hash=sha256:53273c5487d1c19c3bc03b9eb82adaf8456f243b97ed79d09dded747abaf1235 \
+    --hash=sha256:e3b6f3fd0d8ca37861c31e9a7cab71a0ef14c639b4c95654ea1dd153158bf0df \
+    --hash=sha256:e8c87cdaf06fd7b2477f68909838ff4176f105064a72ca9d24d3f2a29f73d393 \
+    --hash=sha256:e2f28a07b4f82abb40267864ad7b3a4ed76f1b1663e81c7efc84a9b9248f672f \
+    --hash=sha256:d70a32ee1f8b55eed3fd4e892f0286df8cccc7e0475c11d33b5d0a148f5c7599 \
+    --hash=sha256:68fa30cec89b6139dc559ed6ef226c53fd80396da1919a1b5ef672c911aaa767 \
+    --hash=sha256:2e3484d8455af3fdb0424eae1789af61f6a79da0c80079125112fd5c1b604218 \
+    --hash=sha256:e293b16cf303fe82995e41700d172a58a15efc5331125d08246b520843ef21ee \
+    --hash=sha256:e3520a274a0e054e919f5b3279ee5dbccf5311833819ccf3399dab7c83e90a25 \
+    --hash=sha256:2252bfac85cec7af4a67e494bfccf9080bcba8a0299701eab075f48847cca907 \
+    --hash=sha256:abf67e05a1b7f86583f6ebd01f69b693b9c535276f4e943292e444855870a1b8 \
+    --hash=sha256:6c094e4bfecd2fa7f9adffd03d8abceed7157c928c2976899de282f3600f0a3d \
+    --hash=sha256:506b210cc6e66a0d1c2bb765d055f4f6bc2745070fb1129203b67e85bbfa5c18 \
+    --hash=sha256:b04fc29bcef04d4e2d626af28d9d892be6aba94856cb46ed52bcb219ceac8943 \
+    --hash=sha256:577ed20ec9a18d6bdedb4616f5e9e957b4c08563a9f985563a31fd5b10564d2a \
+    --hash=sha256:e486f60db0cd1c8d68464d9484fd2a94011c1ac8593d765d0211f9daba2bd535 \
+    --hash=sha256:b71f3a7ca935fc759f2aed7cec06cfe10bc3100fadb5dbd9c435b04e557971e1 \
+    --hash=sha256:d24e5bb8028541ce25e59390122f5e48c8506b7e35587e5135efcb6471b4ac6c \
+    --hash=sha256:778d398c4866d8e36ee3bf833779c940b5f57192fa0a549b3ad67bc4c822771b \
+    --hash=sha256:bb1c613908f11bac270bc7494d68b1ef6e7c224b7a4204d5dacf3522a41e2bc3 \
+    --hash=sha256:edf5e4e1d5fb22c18820e8586fb867455de3b109c309cb4fce3aaed85d9468d1 \
+    --hash=sha256:40e0d7df05e8efe60397c69b467fc8f87a2affeb4d562fe92b72ff8937a2b511 \
+    --hash=sha256:7a350ca685d9f594123f652ba796ee37219bf72c8e0fc4b471473d87121d6d34 \
+    --hash=sha256:3e66497cd990b1a130e21919b004da2f1dc112132c01ac78011a90a0f9229778 \
+    --hash=sha256:87900c67c0f1728e6db17c6809ec05c025c6624dcf96a8020326ea15378fe8e7 \
+    --hash=sha256:b8a4fb2a0c5afbe9604f8a91d7d0f27b1832c3e0b5e365f95a13015822b4cd65 \
+    --hash=sha256:fe8d40c434a8e2c68d64c6d6a04e77f21791a93ff6afe0dce169597c110d3079 \
+    --hash=sha256:34a1fc29f8f96e78ec57a5eff5e8d8b53d3298c3be6df61e7aa9efba26929522 \
+    --hash=sha256:b19a761b948e939a9e20173aaae76070025f0024fc8f7ba08bef22a5c8573afc \
+    --hash=sha256:6803299cbf4665eca14428d9e886de62e24f4223ac31ab9c5d6d5339a39782c7 \
+    --hash=sha256:14334b9902ec776461c4b8c6516e26b450f7ebe0b3ef8703bf5cdfbbaecf774a \
+    --hash=sha256:b2e9810e09c3a47b73ce9cab5a72243a1258f61e7900969097a817232246ce1c
+mediapipe==0.8.9.1 \
+    --hash=sha256:5725d5b5393c966d11d3a5346e385e3f3a75b0ed7fb437feb1cbed8592a0ceed \
+    --hash=sha256:2cb270484071c7a8469b8107727a42696932fa9d8b8e9dcfe04ab8268bdc4bef \
+    --hash=sha256:6b34c83519bfaba787dd1914e0933b1ec2c4be340f8f99b21ccd989ca6227d8d \
+    --hash=sha256:36b38ac6d08684c7cdaa495a0bdc4002bb19e21bd38b0631999c6f219cac7861 \
+    --hash=sha256:d8228dde9f347a8b979a785d4f02ced23adcec004856161465836741e79a96f1 \
+    --hash=sha256:97550e319484f22dbf68dcaf40288fe6eadd270657e5c87579e0cc347ec5a589 \
+    --hash=sha256:4d10fffc5effe53f125bb587a6425ff981aae9d25876842e10d531fb52ed21db \
+    --hash=sha256:98d9d36808e4b15d8b5c6a96d7b304f237e45118f0969efef1427a0ac3de8254 \
+    --hash=sha256:36f48347067b1684012e991412336262cba7899c427b234c8eea495d883698e0 \
+    --hash=sha256:e7a370faa2cd2907c3aa3351fea284b776e16aafd24f1069d4c261b0b3bd367f \
+    --hash=sha256:319c727ef2fd633ba47d702fdfc610304a16f87c649be63730a9d3e7f015100c \
+    --hash=sha256:7c35fc14b22a0dbe1bf4ceffe8dc8c2fb94896130e98df0e3d15fd956e973641
+multidict==6.0.2; python_version >= "3.7" \
+    --hash=sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2 \
+    --hash=sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3 \
+    --hash=sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c \
+    --hash=sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f \
+    --hash=sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9 \
+    --hash=sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20 \
+    --hash=sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88 \
+    --hash=sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7 \
+    --hash=sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee \
+    --hash=sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672 \
+    --hash=sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9 \
+    --hash=sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87 \
+    --hash=sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389 \
+    --hash=sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293 \
+    --hash=sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658 \
+    --hash=sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51 \
+    --hash=sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608 \
+    --hash=sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3 \
+    --hash=sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4 \
+    --hash=sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b \
+    --hash=sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8 \
+    --hash=sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba \
+    --hash=sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43 \
+    --hash=sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8 \
+    --hash=sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b \
+    --hash=sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15 \
+    --hash=sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc \
+    --hash=sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a \
+    --hash=sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60 \
+    --hash=sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86 \
+    --hash=sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d \
+    --hash=sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0 \
+    --hash=sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d \
+    --hash=sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376 \
+    --hash=sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693 \
+    --hash=sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849 \
+    --hash=sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49 \
+    --hash=sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516 \
+    --hash=sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227 \
+    --hash=sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9 \
+    --hash=sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d \
+    --hash=sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57 \
+    --hash=sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96 \
+    --hash=sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c \
+    --hash=sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e \
+    --hash=sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071 \
+    --hash=sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032 \
+    --hash=sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2 \
+    --hash=sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c \
+    --hash=sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9 \
+    --hash=sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80 \
+    --hash=sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d \
+    --hash=sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb \
+    --hash=sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68 \
+    --hash=sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360 \
+    --hash=sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937 \
+    --hash=sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a \
+    --hash=sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae \
+    --hash=sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013
+multiprocess==0.70.12.2 \
+    --hash=sha256:35d41e410ca2a32977a483ae1f40f86b193b45cecf85567c2fae402fb8bf172e \
+    --hash=sha256:9a02237eae21975155c816883479f72e239d16823a6bc063173d59acec9bcf41 \
+    --hash=sha256:f12a939cd2f01d0a900e7ef2aaee3c351a49fd2297d7f760b537af22727561b8 \
+    --hash=sha256:be3ad3eaf204abc646d85e70e41244f66d88200628a0ab867c8fc206b97cedbf \
+    --hash=sha256:c85ffc38c50c5a4f32f3f3c1a284725b7b5040188f254eba6e572c53d3da525b \
+    --hash=sha256:a9f58945edb234591684c0a181b744a3231643814ef3a8f47cea9a2073b4b2bb \
+    --hash=sha256:0e0a5ae4bd84e4c22baddf824d3b8168214f8c1cce51e2cb080421cb1f7b04d1 \
+    --hash=sha256:916a314a1e0f3454033d59672ba6181fa45948ab1091d68cdd479258576e7b27 \
+    --hash=sha256:b3f866f7d9c7acc1a9cb1b6063a29f5cb140ff545b35b71fd4bfdac6f19d75fa \
+    --hash=sha256:6aa67e805e50b6e9dfc56dd0f0c85ac3409e6791d4ec5405c5f9bc0a47d745a4 \
+    --hash=sha256:85941e650c277af44fc82e3e97faacb920e5ce3615238b540cbad4012d6f60e9 \
+    --hash=sha256:6f812a1d3f198b7cacd63983f60e2dc1338bd4450893f90c435067b5a3127e6f \
+    --hash=sha256:206bb9b97b73f87fec1ed15a19f8762950256aa84225450abc7150d02855a083
+numpy==1.19.5 \
+    --hash=sha256:cc6bd4fd593cb261332568485e20a0712883cf631f6f5e8e86a52caa8b2b50ff \
+    --hash=sha256:aeb9ed923be74e659984e321f609b9ba54a48354bfd168d21a2b072ed1e833ea \
+    --hash=sha256:8b5e972b43c8fc27d56550b4120fe6257fdc15f9301914380b27f74856299fea \
+    --hash=sha256:43d4c81d5ffdff6bae58d66a3cd7f54a7acd9a0e7b18d97abb255defc09e3140 \
+    --hash=sha256:a4646724fba402aa7504cd48b4b50e783296b5e10a524c7a6da62e4a8ac9698d \
+    --hash=sha256:2e55195bc1c6b705bfd8ad6f288b38b11b1af32f3c8289d6c50d47f950c12e76 \
+    --hash=sha256:39b70c19ec771805081578cc936bbe95336798b7edf4732ed102e7a43ec5c07a \
+    --hash=sha256:dbd18bcf4889b720ba13a27ec2f2aac1981bd41203b3a3b27ba7a33f88ae4827 \
+    --hash=sha256:603aa0706be710eea8884af807b1b3bc9fb2e49b9f4da439e76000f3b3c6ff0f \
+    --hash=sha256:cae865b1cae1ec2663d8ea56ef6ff185bad091a5e33ebbadd98de2cfa3fa668f \
+    --hash=sha256:36674959eed6957e61f11c912f71e78857a8d0604171dfd9ce9ad5cbf41c511c \
+    --hash=sha256:06fab248a088e439402141ea04f0fffb203723148f6ee791e9c75b3e9e82f080 \
+    --hash=sha256:6149a185cece5ee78d1d196938b2a8f9d09f5a5ebfbba66969302a778d5ddd1d \
+    --hash=sha256:50a4a0ad0111cc1b71fa32dedd05fa239f7fb5a43a40663269bb5dc7877cfd28 \
+    --hash=sha256:d051ec1c64b85ecc69531e1137bb9751c6830772ee5c1c426dbcfe98ef5788d7 \
+    --hash=sha256:a12ff4c8ddfee61f90a1633a4c4afd3f7bcb32b11c52026c92a12e1325922d0d \
+    --hash=sha256:cf2402002d3d9f91c8b01e66fbb436a4ed01c6498fffed0e4c7566da1d40ee1e \
+    --hash=sha256:1ded4fce9cfaaf24e7a0ab51b7a87be9038ea1ace7f34b841fe3b6894c721d1c \
+    --hash=sha256:012426a41bc9ab63bb158635aecccc7610e3eff5d31d1eb43bc099debc979d94 \
+    --hash=sha256:759e4095edc3c1b3ac031f34d9459fa781777a93ccc633a472a5468587a190ff \
+    --hash=sha256:a9d17f2be3b427fbb2bce61e596cf555d6f8a56c222bd2ca148baeeb5e5c783c \
+    --hash=sha256:99abf4f353c3d1a0c7a5f27699482c987cf663b1eac20db59b8c7b061eabd7fc \
+    --hash=sha256:384ec0463d1c2671170901994aeb6dce126de0a95ccc3976c43b0038a37329c2 \
+    --hash=sha256:811daee36a58dc79cf3d8bdd4a490e4277d0e4b7d103a001a4e73ddb48e7e6aa \
+    --hash=sha256:c843b3f50d1ab7361ca4f0b3639bf691569493a56808a0b0c54a051d260b7dbd \
+    --hash=sha256:d6631f2e867676b13026e2846180e2c13c1e11289d67da08d71cacb2cd93d4aa \
+    --hash=sha256:7fb43004bce0ca31d8f13a6eb5e943fa73371381e53f7074ed21a4cb786c32f8 \
+    --hash=sha256:2ea52bd92ab9f768cc64a4c3ef8f4b2580a17af0a5436f6126b08efbd1838371 \
+    --hash=sha256:400580cbd3cff6ffa6293df2278c75aef2d58d8d93d3c5614cd67981dae68ceb \
+    --hash=sha256:df609c82f18c5b9f6cb97271f03315ff0dbe481a2a02e56aeb1b1a985ce38e60 \
+    --hash=sha256:ab83f24d5c52d60dbc8cd0528759532736b56db58adaa7b5f1f76ad551416a1e \
+    --hash=sha256:0eef32ca3132a48e43f6a0f5a82cb508f22ce5a3d6f67a8329c81c8e226d3f6e \
+    --hash=sha256:a0d53e51a6cb6f0d9082decb7a4cb6dfb33055308c4c44f53103c073f649af73 \
+    --hash=sha256:a76f502430dd98d7546e1ea2250a7360c065a5fdea52b2dffe8ae7180909b6f4
+oauthlib==3.1.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" \
+    --hash=sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc \
+    --hash=sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3
+opencv-contrib-python==4.5.2.54; python_version >= "3.6" \
+    --hash=sha256:e69c421ead33c6b3b9d54b9f80b2d9dee7c6a0415430394ccdcf7cfbacfabc05 \
+    --hash=sha256:02dc1068477420b76d27d649e5de16d7000012ed54819f9fc89ca7f97543a03a \
+    --hash=sha256:c1247971ea9f223c70ae1c593e27aa50d2657ab17d2ed133d8e3af4feb59059e \
+    --hash=sha256:4f780d41dc99c4cafc1efb1b87a272b847b46d4f66218bfd8c0a5309ba7a7819 \
+    --hash=sha256:482d1d2eca42d6f16760e3cd41e2cfefc1b326c1b533ecafefa3494595a9f4c6 \
+    --hash=sha256:1811b312ed7bd4918275e70ac1656a83d463ab51b4ca16521190d87657d85d87 \
+    --hash=sha256:80d3217943562546a57d08b5dd984a2e470f86a1eecc2e2a6b589fc93d2bd2a3 \
+    --hash=sha256:baf52a39455e477465bd3afda45c850b2d78c18aaf9dd1324c9912b6613d56cd \
+    --hash=sha256:dececde5e9b2768807ae6021c15981da83c5d9ea25b9208df38049779e600687 \
+    --hash=sha256:dfb398d58020522696864c32deebd6c45b3d0d4fbf1cfce319705d142330268c \
+    --hash=sha256:bb90c814a3a22a85ae2b5708dc5fa57edba90d9aef30246867087f4920a80a0f \
+    --hash=sha256:8e551ae056e9b66151a314e18f40579b029bb822cc17c1b848d065cef5c54ffe \
+    --hash=sha256:9ea70355894c9897d194db3e80c109c9a674106b1c0270256c5d7e0811f71ef8 \
+    --hash=sha256:91e0e87cdbecf64f869d2b6a0822f911cb27e8f2ad34a124c7647aa6c59ef3d6 \
+    --hash=sha256:0528b07538810dcf2ca9fc68f845c63d6acdb9232e52165baa1cd202672dee39 \
+    --hash=sha256:e993b5f292f09714176839c829997bc0c86d757a6055e99199f7746f08bf3029 \
+    --hash=sha256:023477356304603b88685d360d92b6d32fda6ae35d8070406d04a978dca8df49 \
+    --hash=sha256:40c282c2ab795122ee04ef05dd566aace99799b5ce974999075bfb23d2d67cc3 \
+    --hash=sha256:0d12cb62e8494c2e215d6b8f6867f9b0c67b450d071a107803c8ffd6d55efd8c \
+    --hash=sha256:b6ef54585322f66c6300230224308736fb5381c381bee2228d16914e0f370e3a \
+    --hash=sha256:80b49c7861689f2f6722bd7a826855ecc8b94992ea3534316d5a66f1f20ac141 \
+    --hash=sha256:bf53d50297dc71e0681bc08025b53d76f9278abdbf0b595980b72dd4a9025cf5 \
+    --hash=sha256:d71960798c029fffdc37f4f07ec356f760a444f66fc217e3e45185f7bbcc77f3 \
+    --hash=sha256:4f2c5e4c6caf11a45415e8bb40bb4a45f6dd76029e8353e9956c6729bedb43ad \
+    --hash=sha256:fbdddce88a587308c3789b0a34894032af1e962ac38764c44945f23808f16b26 \
+    --hash=sha256:9522404c265825e4527a1b00eeecd6f0adcb22ddef24a91d8a0c2f2b2c348b4e \
+    --hash=sha256:abd6d6114b69685fd8201eaa1da2555dc5f419e20a94567f2dd3e8471f3d748b \
+    --hash=sha256:c4ff7cb9c856af521982b54602707a61f8dae8cc28f5949bf1e3d0453d08a9f0 \
+    --hash=sha256:aff6bcc6d12e664af16be07a583f6a6a637d6e17784bd06abfb07573807a199e \
+    --hash=sha256:4179b78d8c1eb279fcb2cbb41e6cdb3a127ae5d96c39241ef88dab3382e56da1 \
+    --hash=sha256:4544b8b03dc50fea42f67013cdff5b74a326f7631616055c2a2e998fef652e0f \
+    --hash=sha256:8381ab5952724719c982e4b8061fbda9ceae5b01f3e2a32beec30b5dd9f74f3f \
+    --hash=sha256:fc2aa1f3abb564832c1bc289b1d83f491dd249e640b78a30e9cc1831ebbf4410 \
+    --hash=sha256:b54c750ad88eba0e35b09c9286d6d2a1be8d8a6925b1d7e1e487df2396e74397
+opencv-python==4.1.2.30 \
+    --hash=sha256:1a2d1801c038f055852bd2379186ca8b19b4ea24afb0b8410293bc802211579b \
+    --hash=sha256:e793df2e12093b3a01006b5b27f321e306193c7a5c9e2a6c8bf652e1ad2d6a86 \
+    --hash=sha256:ce7b1f25be04b04f2e678b2bf23a975137f77406dcee66a88a2daeb77cda3e76 \
+    --hash=sha256:6c32d36f52a6e0c02d1ab0bb95223cb4dd5525a7e8292a747116126b3d34c578 \
+    --hash=sha256:22c2ee5f97f85903bfb28c056566b2ecaa1d2f804b880ab39ebf94528a402992 \
+    --hash=sha256:04bec0a6d3a00360a7fb769b755ff4489a4ac8291821b785151f63e6d8bb59ea \
+    --hash=sha256:25127990671dc8bd27ae8b880d7a39f9aae863052a8fbebe8977c6ce8e5fc0c9 \
+    --hash=sha256:73a467a78ffd902d2c0265ab6b2e2cdda423d61b3d08685e0c7d0b4572142ff1 \
+    --hash=sha256:76de8a247970d150b1672c6646cda91217d562682e713721fc9b9bf1434553c4 \
+    --hash=sha256:e6fc00ac42c800fad5fb3927cfb9bf4e60bb3302cb9805f45b826d5d2546119a \
+    --hash=sha256:3cef82b6a1f748d2f4527f5932a86d54ebd10bd89f6cf59b003c36b1015055f7 \
+    --hash=sha256:5f2cf5a0ab244a0a1dbe5ec426c277b55e06ac6a472ad61be77ef643a238cbd3 \
+    --hash=sha256:982d4e80c14356098cde57a6c7d18fe0928a1c3118675bac2252ef38f152e1ab \
+    --hash=sha256:919d5c3ec1a62258ba8c68b869b1056186e2355c4474739b199c295547e66cc1 \
+    --hash=sha256:499a0413e7110a934ab56e635252a4c86f8be64de59f94a62318a7b895dc809e \
+    --hash=sha256:1c7d235faef511aca7669f1aa650897b6c058dfde6412ea3fc58feb0fce78814 \
+    --hash=sha256:c8119248457e909dcd7b598621ed1d139419d69377e8cb4e2b2c49c819de287d \
+    --hash=sha256:9d025e6bf2989bcbc7744c26d8bd90c2629a92d8de3ba2416f62ce2a94615dd9 \
+    --hash=sha256:eae543b3e9253ff702103333aabd87736b5ed5e46ab834d8e0b929f08f494dee \
+    --hash=sha256:e2ffa3161b8662112f1880734e8b9549d0c9e818e59f652a9d1c5bf31e36586a \
+    --hash=sha256:6183c9c7fab4590e0651bc941cde780988c3ad9889bd62de19d581a6f59523ea \
+    --hash=sha256:bb59f98205cd81e29f45eed043cf0f98531486dc0b3f671c9e06fecf08f7ccef \
+    --hash=sha256:d64428bf59ab4d27620b00a2ad6fea2b4d62016a17849c82a7517ec12db97d55 \
+    --hash=sha256:5fec35916a6b9ce935f2e2806084303fd4e3fbb0c973a8db8f54b5aca54613cb \
+    --hash=sha256:67a236db8db84d7fb0f6e127f360ce6669350ef324839132e22879ec90588dab \
+    --hash=sha256:f0af656402b73ead2d9f593c2774c04b01e2d0c63e4f99e0dc2f3fde99be22b4
+opt-einsum==3.3.0; python_version >= "3.5" \
+    --hash=sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147 \
+    --hash=sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549
+packaging==21.3; python_version >= "3.7" and python_full_version >= "3.6.0" \
+    --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 \
+    --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb
+pandas==1.1.1; python_full_version >= "3.6.1" \
+    --hash=sha256:8c9ec12c480c4d915e23ee9c8a2d8eba8509986f35f307771045c1294a2e5b73 \
+    --hash=sha256:e4b6c98f45695799990da328e6fd7d6187be32752ed64c2f22326ad66762d179 \
+    --hash=sha256:16ae070c47474008769fc443ac765ffd88c3506b4a82966e7a605592978896f9 \
+    --hash=sha256:88930c74f69e97b17703600233c0eaf1f4f4dd10c14633d522724c5c1b963ec4 \
+    --hash=sha256:fe6f1623376b616e03d51f0dd95afd862cf9a33c18cf55ce0ed4bbe1c4444391 \
+    --hash=sha256:a81c4bf9c59010aa3efddbb6b9fc84a9b76dc0b4da2c2c2d50f06a9ef6ac0004 \
+    --hash=sha256:1acc2bd7fc95e5408a4456897c2c2a1ae7c6acefe108d90479ab6d98d34fcc3d \
+    --hash=sha256:84c101d0f7bbf0d9f1be9a2f29f6fcc12415442558d067164e50a56edfb732b4 \
+    --hash=sha256:391db82ebeb886143b96b9c6c6166686c9a272d00020e4e39ad63b792542d9e2 \
+    --hash=sha256:0366150fe8ee37ef89a45d3093e05026b5f895e42bbce3902ce3b6427f1b8471 \
+    --hash=sha256:d9644ac996149b2a51325d48d77e25c911e01aa6d39dc1b64be679cd71f683ec \
+    --hash=sha256:41675323d4fcdd15abde068607cad150dfe17f7d32290ee128e5fea98442bd09 \
+    --hash=sha256:0246c67cbaaaac8d25fed8d4cf2d8897bd858f0e540e8528a75281cee9ac516d \
+    --hash=sha256:01b1e536eb960822c5e6b58357cad8c4b492a336f4a5630bf0b598566462a578 \
+    --hash=sha256:57c5f6be49259cde8e6f71c2bf240a26b071569cabc04c751358495d09419e56 \
+    --hash=sha256:53328284a7bb046e2e885fd1b8c078bd896d7fc4575b915d4936f54984a2ba67
+pillow==9.0.0; python_version >= "3.7" \
+    --hash=sha256:113723312215b25c22df1fdf0e2da7a3b9c357a7d24a93ebbe80bfda4f37a8d4 \
+    --hash=sha256:bb47a548cea95b86494a26c89d153fd31122ed65255db5dcbc421a2d28eb3379 \
+    --hash=sha256:31b265496e603985fad54d52d11970383e317d11e18e856971bdbb86af7242a4 \
+    --hash=sha256:d154ed971a4cc04b93a6d5b47f37948d1f621f25de3e8fa0c26b2d44f24e3e8f \
+    --hash=sha256:80fe92813d208ce8aa7d76da878bdc84b90809f79ccbad2a288e9bcbeac1d9bd \
+    --hash=sha256:d5dcea1387331c905405b09cdbfb34611050cc52c865d71f2362f354faee1e9f \
+    --hash=sha256:52abae4c96b5da630a8b4247de5428f593465291e5b239f3f843a911a3cf0105 \
+    --hash=sha256:72c3110228944019e5f27232296c5923398496b28be42535e3b2dc7297b6e8b6 \
+    --hash=sha256:97b6d21771da41497b81652d44191489296555b761684f82b7b544c49989110f \
+    --hash=sha256:72f649d93d4cc4d8cf79c91ebc25137c358718ad75f99e99e043325ea7d56100 \
+    --hash=sha256:7aaf07085c756f6cb1c692ee0d5a86c531703b6e8c9cae581b31b562c16b98ce \
+    --hash=sha256:03b27b197deb4ee400ed57d8d4e572d2d8d80f825b6634daf6e2c18c3c6ccfa6 \
+    --hash=sha256:a09a9d4ec2b7887f7a088bbaacfd5c07160e746e3d47ec5e8050ae3b2a229e9f \
+    --hash=sha256:490e52e99224858f154975db61c060686df8a6b3f0212a678e5d2e2ce24675c9 \
+    --hash=sha256:500d397ddf4bbf2ca42e198399ac13e7841956c72645513e8ddf243b31ad2128 \
+    --hash=sha256:0ebd8b9137630a7bbbff8c4b31e774ff05bbb90f7911d93ea2c9371e41039b52 \
+    --hash=sha256:fd0e5062f11cb3e730450a7d9f323f4051b532781026395c4323b8ad055523c4 \
+    --hash=sha256:9f3b4522148586d35e78313db4db0df4b759ddd7649ef70002b6c3767d0fdeb7 \
+    --hash=sha256:0b281fcadbb688607ea6ece7649c5d59d4bbd574e90db6cd030e9e85bde9fecc \
+    --hash=sha256:b5050d681bcf5c9f2570b93bee5d3ec8ae4cf23158812f91ed57f7126df91762 \
+    --hash=sha256:c2067b3bb0781f14059b112c9da5a91c80a600a97915b4f48b37f197895dd925 \
+    --hash=sha256:2d16b6196fb7a54aff6b5e3ecd00f7c0bab1b56eee39214b2b223a9d938c50af \
+    --hash=sha256:98cb63ca63cb61f594511c06218ab4394bf80388b3d66cd61d0b1f63ee0ea69f \
+    --hash=sha256:bc462d24500ba707e9cbdef436c16e5c8cbf29908278af053008d9f689f56dee \
+    --hash=sha256:3586e12d874ce2f1bc875a3ffba98732ebb12e18fb6d97be482bd62b56803281 \
+    --hash=sha256:68e06f8b2248f6dc8b899c3e7ecf02c9f413aab622f4d6190df53a78b93d97a5 \
+    --hash=sha256:6579f9ba84a3d4f1807c4aab4be06f373017fc65fff43498885ac50a9b47a553 \
+    --hash=sha256:47f5cf60bcb9fbc46011f75c9b45a8b5ad077ca352a78185bd3e7f1d294b98bb \
+    --hash=sha256:2fd8053e1f8ff1844419842fd474fc359676b2e2a2b66b11cc59f4fa0a301315 \
+    --hash=sha256:6c5439bfb35a89cac50e81c751317faea647b9a3ec11c039900cd6915831064d \
+    --hash=sha256:95545137fc56ce8c10de646074d242001a112a92de169986abd8c88c27566a05 \
+    --hash=sha256:ee6e2963e92762923956fe5d3479b1fdc3b76c83f290aad131a2f98c3df0593e
+protobuf==3.19.3; python_version >= "3.6" \
+    --hash=sha256:1cb2ed66aac593adbf6dca4f07cd7ee7e2958b17bbc85b2cc8bc564ebeb258ec \
+    --hash=sha256:898bda9cd37ec0c781b598891e86435de80c3bfa53eb483a9dac5a11ec93e942 \
+    --hash=sha256:8ad761ef3be34c8bdc7285bec4b40372a8dad9e70cfbdc1793cd3cf4c1a4ce74 \
+    --hash=sha256:2cddcbcc222f3144765ccccdb35d3621dc1544da57a9aca7e1944c1a4fe3db11 \
+    --hash=sha256:6202df8ee8457cb00810c6e76ced480f22a1e4e02c899a14e7b6e6e1de09f938 \
+    --hash=sha256:397d82f1c58b76445469c8c06b8dee1ff67b3053639d054f52599a458fac9bc6 \
+    --hash=sha256:e54b8650e849ee8e95e481024bff92cf98f5ec61c7650cb838d928a140adcb63 \
+    --hash=sha256:3bf3a07d17ba3511fe5fa916afb7351f482ab5dbab5afe71a7a384274a2cd550 \
+    --hash=sha256:afa8122de8064fd577f49ae9eef433561c8ace97a0a7b969d56e8b1d39b5d177 \
+    --hash=sha256:18c40a1b8721026a85187640f1786d52407dc9c1ba8ec38accb57a46e84015f6 \
+    --hash=sha256:af7238849fa79285d448a24db686517570099739527a03c9c2971cce99cc5ae2 \
+    --hash=sha256:e765e6dfbbb02c55e4d6d1145743401a84fc0b508f5a81b2c5a738cf86353139 \
+    --hash=sha256:c781402ed5396ab56358d7b866d78c03a77cbc26ba0598d8bb0ac32084b1a257 \
+    --hash=sha256:544fe9705189b249380fae07952d220c97f5c6c9372a6f936cc83a79601dcb70 \
+    --hash=sha256:84bf3aa3efb00dbe1c7ed55da0f20800b0662541e582d7e62b3e1464d61ed365 \
+    --hash=sha256:3f80a3491eaca767cdd86cb8660dc778f634b44abdb0dffc9b2a8e8d0cd617d0 \
+    --hash=sha256:a9401d96552befcc7311f5ef8f0fa7dba0ef5fd805466b158b141606cd0ab6a8 \
+    --hash=sha256:ef02d112c025e83db5d1188a847e358beab3e4bbfbbaf10eaf69e67359af51b2 \
+    --hash=sha256:1291a0a7db7d792745c99d4657b4c5c4942695c8b1ac1bfb993a34035ec123f7 \
+    --hash=sha256:49677e5e9c7ea1245a90c2e8a00d304598f22ea3aa0628f0e0a530a9e70665fa \
+    --hash=sha256:df2ba379ee42427e8fcc6a0a76843bff6efb34ef5266b17f95043939b5e25b69 \
+    --hash=sha256:2acd7ca329be544d1a603d5f13a4e34a3791c90d651ebaf130ba2e43ae5397c6 \
+    --hash=sha256:b53519b2ebec70cfe24b4ddda21e9843f0918d7c3627a785393fb35d402ab8ad \
+    --hash=sha256:8ceaf5fdb72c8e1fcb7be9f2b3b07482ce058a3548180c0bdd5c7e4ac5e14165 \
+    --hash=sha256:f6d4b5b7595a57e69eb7314c67bef4a3c745b4caf91accaf72913d8e0635111b \
+    --hash=sha256:d975a6314fbf5c524d4981e24294739216b5fb81ef3c14b86fb4b045d6690907
+pyarrow==7.0.0; python_version >= "3.7" \
+    --hash=sha256:0f15213f380539c9640cb2413dc677b55e70f04c9e98cfc2e1d8b36c770e1036 \
+    --hash=sha256:29c4e3b3be0b94d07ff4921a5e410fc690a3a066a850a302fc504de5fc638495 \
+    --hash=sha256:8a9bfc8a016bcb8f9a8536d2fa14a890b340bc7a236275cd60fd4fb8b93ff405 \
+    --hash=sha256:49d431ed644a3e8f53ae2bbf4b514743570b495b5829548db51610534b6eeee7 \
+    --hash=sha256:aa6442a321c1e49480b3d436f7d631c895048a16df572cf71c23c6b53c45ed66 \
+    --hash=sha256:f6b01a23cb401750092c6f7c4dcae67cd8fd6b99ae710e26f654f23508f25f25 \
+    --hash=sha256:0f10928745c6ff66e121552731409803bed86c66ac79c64c90438b053b5242c5 \
+    --hash=sha256:759090caa1474cafb5e68c93a9bd6cb45d8bb8e4f2cad2f1a0cc9439bae8ae88 \
+    --hash=sha256:e3fe34bcfc28d9c4a747adc3926d2307a04c5c50b89155946739515ccfe5eab0 \
+    --hash=sha256:040dce5345603e4e621bcf4f3b21f18d557852e7b15307e559bb14c8951c8714 \
+    --hash=sha256:ed4b647c3345ae3463d341a9d28d0260cd302fb92ecf4e2e3e0f1656d6e0e55c \
+    --hash=sha256:e7fecd5d5604f47e003f50887a42aee06cb8b7bf8e8bf7dc543a22331d9ba832 \
+    --hash=sha256:1f2d00b892fe865e43346acb78761ba268f8bb1cbdba588816590abcb780ee3d \
+    --hash=sha256:f439f7d77201681fd31391d189aa6b1322d27c9311a8f2fce7d23972471b02b6 \
+    --hash=sha256:3e06b0e29ce1e32f219c670c6b31c33d25a5b8e29c7828f873373aab78bf30a5 \
+    --hash=sha256:13dc05bcf79dbc1bd2de1b05d26eb64824b85883d019d81ca3c2eca9b68b5a44 \
+    --hash=sha256:06183a7ff2b0c030ec0413fc4dc98abad8cf336c78c280a0b7f4bcbebb78d125 \
+    --hash=sha256:702c5a9f960b56d03569eaaca2c1a05e8728f05ea1a2138ef64234aa53cd5884 \
+    --hash=sha256:c7313038203df77ec4092d6363dbc0945071caa72635f365f2b1ae0dd7469865 \
+    --hash=sha256:e87d1f7dc7a0b2ecaeb0c7a883a85710f5b5626d4134454f905571c04bc73d5a \
+    --hash=sha256:ba69488ae25c7fde1a2ae9ea29daf04d676de8960ffd6f82e1e13ca945bb5861 \
+    --hash=sha256:11a591f11d2697c751261c9d57e6e5b0d38fdc7f0cc57f4fd6edc657da7737df \
+    --hash=sha256:6183c700877852dc0f8a76d4c0c2ffd803ba459e2b4a452e355c2d58d48cf39f \
+    --hash=sha256:d1748154714b543e6ae8452a68d4af85caf5298296a7e5d4d00f1b3021838ac6 \
+    --hash=sha256:fcc8f934c7847a88f13ec35feecffb61fe63bb7a3078bd98dd353762e969ce60 \
+    --hash=sha256:759f59ac77b84878dbd54d06cf6df74ff781b8e7cf9313eeffbb5ec97b94385c \
+    --hash=sha256:3d3e3f93ac2993df9c5e1922eab7bdea047b9da918a74e52145399bc1f0099a3 \
+    --hash=sha256:306120af554e7e137895254a3b4741fad682875a5f6403509cd276de3fe5b844 \
+    --hash=sha256:087769dac6e567d58d59b94c4f866b3356c00d3db5b261387ece47e7324c2150 \
+    --hash=sha256:da656cad3c23a2ebb6a307ab01d35fce22f7850059cffafcb90d12590f8f4f38
+pyasn1-modules==0.2.8; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6" \
+    --hash=sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e \
+    --hash=sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199 \
+    --hash=sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405 \
+    --hash=sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb \
+    --hash=sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8 \
+    --hash=sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74 \
+    --hash=sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d \
+    --hash=sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45 \
+    --hash=sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4 \
+    --hash=sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811 \
+    --hash=sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed \
+    --hash=sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0 \
+    --hash=sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd
+pyasn1==0.4.8; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6") or python_full_version >= "3.6.0" and python_version >= "3.6" and python_version < "4" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6") \
+    --hash=sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3 \
+    --hash=sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf \
+    --hash=sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00 \
+    --hash=sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8 \
+    --hash=sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d \
+    --hash=sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86 \
+    --hash=sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7 \
+    --hash=sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576 \
+    --hash=sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12 \
+    --hash=sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2 \
+    --hash=sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359 \
+    --hash=sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776 \
+    --hash=sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba
+pyparsing==3.0.7; python_version >= "3.7" \
+    --hash=sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484 \
+    --hash=sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea
+python-dateutil==2.8.2; python_full_version >= "3.6.1" and python_version >= "3.7" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7") \
+    --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \
+    --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9
+pytz==2021.3; python_full_version >= "3.6.1" \
+    --hash=sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c \
+    --hash=sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326
+pyyaml==6.0; python_version >= "3.6" and python_full_version >= "3.6.0" \
+    --hash=sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53 \
+    --hash=sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c \
+    --hash=sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc \
+    --hash=sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b \
+    --hash=sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5 \
+    --hash=sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513 \
+    --hash=sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a \
+    --hash=sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86 \
+    --hash=sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f \
+    --hash=sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92 \
+    --hash=sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4 \
+    --hash=sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293 \
+    --hash=sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57 \
+    --hash=sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c \
+    --hash=sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0 \
+    --hash=sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4 \
+    --hash=sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9 \
+    --hash=sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737 \
+    --hash=sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d \
+    --hash=sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b \
+    --hash=sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba \
+    --hash=sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34 \
+    --hash=sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287 \
+    --hash=sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78 \
+    --hash=sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07 \
+    --hash=sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b \
+    --hash=sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174 \
+    --hash=sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803 \
+    --hash=sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3 \
+    --hash=sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0 \
+    --hash=sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb \
+    --hash=sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c \
+    --hash=sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2
+regex==2022.3.15; python_version >= "3.6" and python_full_version >= "3.6.0" \
+    --hash=sha256:42eb13b93765c6698a5ab3bcd318d8c39bb42e5fa8a7fcf7d8d98923f3babdb1 \
+    --hash=sha256:9beb03ff6fe509d6455971c2489dceb31687b38781206bcec8e68bdfcf5f1db2 \
+    --hash=sha256:d0a5a1fdc9f148a8827d55b05425801acebeeefc9e86065c7ac8b8cc740a91ff \
+    --hash=sha256:cb374a2a4dba7c4be0b19dc7b1adc50e6c2c26c3369ac629f50f3c198f3743a4 \
+    --hash=sha256:c33ce0c665dd325200209340a88438ba7a470bd5f09f7424e520e1a3ff835b52 \
+    --hash=sha256:04c09b9651fa814eeeb38e029dc1ae83149203e4eeb94e52bb868fadf64852bc \
+    --hash=sha256:ab5d89cfaf71807da93c131bb7a19c3e19eaefd613d14f3bce4e97de830b15df \
+    --hash=sha256:0e2630ae470d6a9f8e4967388c1eda4762706f5750ecf387785e0df63a4cc5af \
+    --hash=sha256:df037c01d68d1958dad3463e2881d3638a0d6693483f58ad41001aa53a83fcea \
+    --hash=sha256:940570c1a305bac10e8b2bc934b85a7709c649317dd16520471e85660275083a \
+    --hash=sha256:7f63877c87552992894ea1444378b9c3a1d80819880ae226bb30b04789c0828c \
+    --hash=sha256:3e265b388cc80c7c9c01bb4f26c9e536c40b2c05b7231fbb347381a2e1c8bf43 \
+    --hash=sha256:058054c7a54428d5c3e3739ac1e363dc9347d15e64833817797dc4f01fb94bb8 \
+    --hash=sha256:76435a92e444e5b8f346aed76801db1c1e5176c4c7e17daba074fbb46cb8d783 \
+    --hash=sha256:174d964bc683b1e8b0970e1325f75e6242786a92a22cedb2a6ec3e4ae25358bd \
+    --hash=sha256:6e1d8ed9e61f37881c8db383a124829a6e8114a69bd3377a25aecaeb9b3538f8 \
+    --hash=sha256:b52771f05cff7517f7067fef19ffe545b1f05959e440d42247a17cd9bddae11b \
+    --hash=sha256:673f5a393d603c34477dbad70db30025ccd23996a2d0916e942aac91cc42b31a \
+    --hash=sha256:8923e1c5231549fee78ff9b2914fad25f2e3517572bb34bfaa3aea682a758683 \
+    --hash=sha256:764e66a0e382829f6ad3bbce0987153080a511c19eb3d2f8ead3f766d14433ac \
+    --hash=sha256:cd00859291658fe1fda48a99559fb34da891c50385b0bfb35b808f98956ef1e7 \
+    --hash=sha256:aa2ce79f3889720b46e0aaba338148a1069aea55fda2c29e0626b4db20d9fcb7 \
+    --hash=sha256:34bb30c095342797608727baf5c8aa122406aa5edfa12107b8e08eb432d4c5d7 \
+    --hash=sha256:25ecb1dffc5e409ca42f01a2b2437f93024ff1612c1e7983bad9ee191a5e8828 \
+    --hash=sha256:aa5eedfc2461c16a092a2fabc5895f159915f25731740c9152a1b00f4bcf629a \
+    --hash=sha256:7d1a6e403ac8f1d91d8f51c441c3f99367488ed822bda2b40836690d5d0059f5 \
+    --hash=sha256:3e4d710ff6539026e49f15a3797c6b1053573c2b65210373ef0eec24480b900b \
+    --hash=sha256:0100f0ded953b6b17f18207907159ba9be3159649ad2d9b15535a74de70359d3 \
+    --hash=sha256:f320c070dea3f20c11213e56dbbd7294c05743417cde01392148964b7bc2d31a \
+    --hash=sha256:fc8c7958d14e8270171b3d72792b609c057ec0fa17d507729835b5cff6b7f69a \
+    --hash=sha256:6ca6dcd17f537e9f3793cdde20ac6076af51b2bd8ad5fe69fa54373b17b48d3c \
+    --hash=sha256:0214ff6dff1b5a4b4740cfe6e47f2c4c92ba2938fca7abbea1359036305c132f \
+    --hash=sha256:a98ae493e4e80b3ded6503ff087a8492db058e9c68de371ac3df78e88360b374 \
+    --hash=sha256:8b1cc70e31aacc152a12b39245974c8fccf313187eead559ee5966d50e1b5817 \
+    --hash=sha256:b4829db3737480a9d5bfb1c0320c4ee13736f555f53a056aacc874f140e98f64 \
+    --hash=sha256:303b15a3d32bf5fe5a73288c316bac5807587f193ceee4eb6d96ee38663789fa \
+    --hash=sha256:dc7b7c16a519d924c50876fb152af661a20749dcbf653c8759e715c1a7a95b18 \
+    --hash=sha256:ce3057777a14a9a1399b81eca6a6bfc9612047811234398b84c54aeff6d536ea \
+    --hash=sha256:48081b6bff550fe10bcc20c01cf6c83dbca2ccf74eeacbfac240264775fd7ecf \
+    --hash=sha256:dcbb7665a9db9f8d7642171152c45da60e16c4f706191d66a1dc47ec9f820aed \
+    --hash=sha256:c155a1a80c5e7a8fa1d9bb1bf3c8a953532b53ab1196092749bafb9d3a7cbb60 \
+    --hash=sha256:04b5ee2b6d29b4a99d38a6469aa1db65bb79d283186e8460542c517da195a8f6 \
+    --hash=sha256:797437e6024dc1589163675ae82f303103063a0a580c6fd8d0b9a0a6708da29e \
+    --hash=sha256:8afcd1c2297bc989dceaa0379ba15a6df16da69493635e53431d2d0c30356086 \
+    --hash=sha256:0066a6631c92774391f2ea0f90268f0d82fffe39cb946f0f9c6b382a1c61a5e5 \
+    --hash=sha256:b8248f19a878c72d8c0a785a2cd45d69432e443c9f10ab924c29adda77b324ae \
+    --hash=sha256:8d1f3ea0d1924feb4cf6afb2699259f658a08ac6f8f3a4a806661c2dfcd66db1 \
+    --hash=sha256:794a6bc66c43db8ed06698fc32aaeaac5c4812d9f825e9589e56f311da7becd9 \
+    --hash=sha256:4d1445824944e642ffa54c4f512da17a953699c563a356d8b8cbdad26d3b7598 \
+    --hash=sha256:f553a1190ae6cd26e553a79f6b6cfba7b8f304da2071052fa33469da075ea625 \
+    --hash=sha256:75a5e6ce18982f0713c4bac0704bf3f65eed9b277edd3fb9d2b0ff1815943327 \
+    --hash=sha256:f16cf7e4e1bf88fecf7f41da4061f181a6170e179d956420f84e700fb8a3fd6b \
+    --hash=sha256:dad3991f0678facca1a0831ec1ddece2eb4d1dd0f5150acb9440f73a3b863907 \
+    --hash=sha256:491fc754428514750ab21c2d294486223ce7385446f2c2f5df87ddbed32979ae \
+    --hash=sha256:6504c22c173bb74075d7479852356bb7ca80e28c8e548d4d630a104f231e04fb \
+    --hash=sha256:01c913cf573d1da0b34c9001a94977273b5ee2fe4cb222a5d5b320f3a9d1a835 \
+    --hash=sha256:029e9e7e0d4d7c3446aa92474cbb07dafb0b2ef1d5ca8365f059998c010600e6 \
+    --hash=sha256:947a8525c0a95ba8dc873191f9017d1b1e3024d4dc757f694e0af3026e34044a \
+    --hash=sha256:591d4fba554f24bfa0421ba040cd199210a24301f923ed4b628e1e15a1001ff4 \
+    --hash=sha256:b9809404528a999cf02a400ee5677c81959bc5cb938fdc696b62eb40214e3632 \
+    --hash=sha256:f08a7e4d62ea2a45557f561eea87c907222575ca2134180b6974f8ac81e24f06 \
+    --hash=sha256:5a86cac984da35377ca9ac5e2e0589bd11b3aebb61801204bd99c41fac516f0d \
+    --hash=sha256:286908cbe86b1a0240a867aecfe26a439b16a1f585d2de133540549831f8e774 \
+    --hash=sha256:7b7494df3fdcc95a1f76cf134d00b54962dd83189520fd35b8fcd474c0aa616d \
+    --hash=sha256:5b1ceede92400b3acfebc1425937454aaf2c62cd5261a3fabd560c61e74f6da3 \
+    --hash=sha256:0317eb6331146c524751354ebef76a7a531853d7207a4d760dfb5f553137a2a4 \
+    --hash=sha256:9c144405220c5ad3f5deab4c77f3e80d52e83804a6b48b6bed3d81a9a0238e4c \
+    --hash=sha256:5b2e24f3ae03af3d8e8e6d824c891fea0ca9035c5d06ac194a2700373861a15c \
+    --hash=sha256:f2c53f3af011393ab5ed9ab640fa0876757498aac188f782a0c620e33faa2a3d \
+    --hash=sha256:060f9066d2177905203516c62c8ea0066c16c7342971d54204d4e51b13dfbe2e \
+    --hash=sha256:530a3a16e57bd3ea0dff5ec2695c09632c9d6c549f5869d6cf639f5f7153fb9c \
+    --hash=sha256:78ce90c50d0ec970bd0002462430e00d1ecfd1255218d52d08b3a143fe4bde18 \
+    --hash=sha256:c5adc854764732dbd95a713f2e6c3e914e17f2ccdc331b9ecb777484c31f73b6 \
+    --hash=sha256:0a7b75cc7bb4cc0334380053e4671c560e31272c9d2d5a6c4b8e9ae2c9bd0f82
+requests-oauthlib==1.3.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" \
+    --hash=sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a \
+    --hash=sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d \
+    --hash=sha256:fa6c47b933f01060936d87ae9327fead68768b69c6c9ea2109c48be30f2d4dbc
+requests==2.27.1; python_full_version >= "3.6.0" and python_version >= "3.6" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.6.0") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6") \
+    --hash=sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d \
+    --hash=sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61
+responses==0.18.0; python_version >= "3.7" \
+    --hash=sha256:15c63ad16de13ee8e7182d99c9334f64fd81f1ee79f90748d527c28f7ca9dd51 \
+    --hash=sha256:380cad4c1c1dc942e5e8a8eaae0b4d4edf708f4f010db8b7bcfafad1fcd254ff
+rsa==4.8; python_version >= "3.6" and python_version < "4" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6") \
+    --hash=sha256:95c5d300c4e879ee69708c428ba566c59478fd653cc3a22243eeb8ed846950bb \
+    --hash=sha256:5c6bd9dc7a543b7fe4304a631f8a8a3b674e2bbfc49c2ae96200cdbe55df6b17
+sacremoses==0.0.49; python_full_version >= "3.6.0" \
+    --hash=sha256:33ca6d4e125271b9201cc7fdf7f03f3ffdd358ee6dd8079c0432811d82da5377 \
+    --hash=sha256:c2ecd3a50d1c09a26253ad84b0b89e9e3a28a023455b72a2197cfeab27ff5141
+scikit-learn==1.0.2; python_version >= "3.7" \
+    --hash=sha256:b5870959a5484b614f26d31ca4c17524b1b0317522199dc985c3b4256e030767 \
+    --hash=sha256:da3c84694ff693b5b3194d8752ccf935a665b8b5edc33a283122f4273ca3e687 \
+    --hash=sha256:75307d9ea39236cad7eea87143155eea24d48f93f3a2f9389c817f7019f00705 \
+    --hash=sha256:f14517e174bd7332f1cca2c959e704696a5e0ba246eb8763e6c24876d8710049 \
+    --hash=sha256:d9aac97e57c196206179f674f09bc6bffcd0284e2ba95b7fe0b402ac3f986023 \
+    --hash=sha256:d93d4c28370aea8a7cbf6015e8a669cd5d69f856cc2aa44e7a590fb805bb5583 \
+    --hash=sha256:85260fb430b795d806251dd3bb05e6f48cdc777ac31f2bcf2bc8bbed3270a8f5 \
+    --hash=sha256:a053a6a527c87c5c4fa7bf1ab2556fa16d8345cf99b6c5a19030a4a7cd8fd2c0 \
+    --hash=sha256:245c9b5a67445f6f044411e16a93a554edc1efdcce94d3fc0bc6a4b9ac30b752 \
+    --hash=sha256:158faf30684c92a78e12da19c73feff9641a928a8024b4fa5ec11d583f3d8a87 \
+    --hash=sha256:08ef968f6b72033c16c479c966bf37ccd49b06ea91b765e1cc27afefe723920b \
+    --hash=sha256:16455ace947d8d9e5391435c2977178d0ff03a261571e67f627c8fee0f9d431a \
+    --hash=sha256:2f3b453e0b149898577e301d27e098dfe1a36943f7bb0ad704d1e548efc3b448 \
+    --hash=sha256:46f431ec59dead665e1370314dbebc99ead05e1c0a9df42f22d6a0e00044820f \
+    --hash=sha256:ff3fa8ea0e09e38677762afc6e14cad77b5e125b0ea70c9bba1992f02c93b028 \
+    --hash=sha256:9369b030e155f8188743eb4893ac17a27f81d28a884af460870c7c072f114243 \
+    --hash=sha256:7d6b2475f1c23a698b48515217eb26b45a6598c7b1840ba23b3c5acece658dbb \
+    --hash=sha256:285db0352e635b9e3392b0b426bc48c3b485512d3b4ac3c7a44ec2a2ba061e66 \
+    --hash=sha256:5cb33fe1dc6f73dc19e67b264dbb5dde2a0539b986435fdd78ed978c14654830 \
+    --hash=sha256:b1391d1a6e2268485a63c3073111fe3ba6ec5145fc957481cfd0652be571226d \
+    --hash=sha256:bc3744dabc56b50bec73624aeca02e0def06b03cb287de26836e730659c5d29c \
+    --hash=sha256:a999c9f02ff9570c783069f1074f06fe7386ec65b84c983db5aeb8144356a355 \
+    --hash=sha256:7626a34eabbf370a638f32d1a3ad50526844ba58d63e3ab81ba91e2a7c6d037e \
+    --hash=sha256:a90b60048f9ffdd962d2ad2fb16367a87ac34d76e02550968719eb7b5716fd10 \
+    --hash=sha256:7a93c1292799620df90348800d5ac06f3794c1316ca247525fa31169f6d25855 \
+    --hash=sha256:eabceab574f471de0b0eb3f2ecf2eee9f10b3106570481d007ed1c84ebf6d6a1 \
+    --hash=sha256:55f2f3a8414e14fbee03782f9fe16cca0f141d639d2b1c1a36779fa069e1db57 \
+    --hash=sha256:80095a1e4b93bd33261ef03b9bc86d6db649f988ea4dbcf7110d0cded8d7213d \
+    --hash=sha256:fa38a1b9b38ae1fad2863eff5e0d69608567453fdfc850c992e6e47eb764e846 \
+    --hash=sha256:ff746a69ff2ef25f62b36338c615dd15954ddc3ab8e73530237dd73235e76d62 \
+    --hash=sha256:e174242caecb11e4abf169342641778f68e1bfaba80cd18acd6bc84286b9a534 \
+    --hash=sha256:b54a62c6e318ddbfa7d22c383466d38d2ee770ebdb5ddb668d56a099f6eaf75f
+scipy==1.6.1; python_version >= "3.7" \
+    --hash=sha256:a15a1f3fc0abff33e792d6049161b7795909b40b97c6cc2934ed54384017ab76 \
+    --hash=sha256:e79570979ccdc3d165456dd62041d9556fb9733b86b4b6d818af7a0afc15f092 \
+    --hash=sha256:a423533c55fec61456dedee7b6ee7dce0bb6bfa395424ea374d25afa262be261 \
+    --hash=sha256:33d6b7df40d197bdd3049d64e8e680227151673465e5d85723b3b8f6b15a6ced \
+    --hash=sha256:6725e3fbb47da428794f243864f2297462e9ee448297c93ed1dcbc44335feb78 \
+    --hash=sha256:5fa9c6530b1661f1370bcd332a1e62ca7881785cc0f80c0d559b636567fab63c \
+    --hash=sha256:bd50daf727f7c195e26f27467c85ce653d41df4358a25b32434a50d8870fc519 \
+    --hash=sha256:f46dd15335e8a320b0fb4685f58b7471702234cba8bb3442b69a3e1dc329c345 \
+    --hash=sha256:0e5b0ccf63155d90da576edd2768b66fb276446c371b73841e3503be1d63fb5d \
+    --hash=sha256:2481efbb3740977e3c831edfd0bd9867be26387cacf24eb5e366a6a374d3d00d \
+    --hash=sha256:68cb4c424112cd4be886b4d979c5497fba190714085f46b8ae67a5e4416c32b4 \
+    --hash=sha256:5f331eeed0297232d2e6eea51b54e8278ed8bb10b099f69c44e2558c090d06bf \
+    --hash=sha256:0c8a51d33556bf70367452d4d601d1742c0e806cd0194785914daf19775f0e67 \
+    --hash=sha256:83bf7c16245c15bc58ee76c5418e46ea1811edcc2e2b03041b804e46084ab627 \
+    --hash=sha256:794e768cc5f779736593046c9714e0f3a5940bc6dcc1dba885ad64cbfb28e9f0 \
+    --hash=sha256:5da5471aed911fe7e52b86bf9ea32fb55ae93e2f0fac66c32e58897cfb02fa07 \
+    --hash=sha256:8e403a337749ed40af60e537cc4d4c03febddcc56cd26e774c9b1b600a70d3e4 \
+    --hash=sha256:a5193a098ae9f29af283dcf0041f762601faf2e595c0db1da929875b7570353f \
+    --hash=sha256:c4fceb864890b6168e79b0e714c585dbe2fd4222768ee90bc1aa0f8218691b11
+sentencepiece==0.1.96 \
+    --hash=sha256:cc969e6694fb27fba7cee2953f350804faf03913f25ae1ee713a7b8a1bc08018 \
+    --hash=sha256:36e9ff61e7b67c5b7ee96733613622620b4802fc8cf188a4dbc1f355b03dde02 \
+    --hash=sha256:e9e9fe8094ca57549d801e9a2017ac5c24108bbf485ea4f8994a72e8e96ee135 \
+    --hash=sha256:b77d27f59d515c43b61745b8173fbe7c7b3014b14b3702a75bf1793471e7def6 \
+    --hash=sha256:1dac8c2ad02b5ebc1179c0a14cbc7d7c6f4fd73d4dd51820626402d0aefc974e \
+    --hash=sha256:e8ec5bb6777e2060e1499750c50e1b69dca5a0f80f90f2c66656c5f3e5244593 \
+    --hash=sha256:99ea2d9db19e63a2d17d5dc64f9ace83fb9308a735be05a1aaf98eb4b496fba7 \
+    --hash=sha256:aeb090ad462833df03af1debce4ae607a2766ef861f992003ad0c56d074ab805 \
+    --hash=sha256:f8c90df663cd9759b2cf8dd29998b63140ac39e51ada2e739dc13bdac0b4f001 \
+    --hash=sha256:26d20d713b3ba1b7a19205336afb1e93a4327c372b2f795e907b8dc2315ac92e \
+    --hash=sha256:5388882bb24d083f6cc8cffc5c435f3694a7772b018e06ea6fd84d1044009efb \
+    --hash=sha256:a92e1932ee8fd500680ccbe1bf53eb33228f4c9d6524ed6f300bcc80ac359f27 \
+    --hash=sha256:bedf0355117fb4e9b1fc9fc92b4d5ee743a7d468be9f6196e3b94447710ea589 \
+    --hash=sha256:4997c7ccf2ae462320250314aa5709a88d8a09fa271d073458a07bebf33f8e7c \
+    --hash=sha256:a697257a2cd7581732d7741a8d32a06927f0311c3d277dbc47fa1043350c9d17 \
+    --hash=sha256:ff7d752a7f82d87711ec1a95c2262cb74f98be5b457f0300d81a1aefe5be2a95 \
+    --hash=sha256:3e61e0757e49c306fff78ea75d6b75773418fe22214b4a460959203be934e834 \
+    --hash=sha256:ef59ba19340dc1d002ce5713b911c0ef23c577b08f8ed57998ee3c8e62c5bf6e \
+    --hash=sha256:89c038da7f827a6e2ca4c73aeb4e4b25b99d981ce47dd61b04d446c8200cba1e \
+    --hash=sha256:d954d25a8705f972e8bfc1dea5464d7e697dd6f4ade092f1a487387e6d6c829a \
+    --hash=sha256:fd907a8f744e5337de7fc532dd800c4416b571ea47f8c3c66be10cd1bc67c925 \
+    --hash=sha256:335bf84d72112cc91f3c3b691d61802fc963503b7772fd8280d20368048b8f3e \
+    --hash=sha256:e811984b0908c14c56de7d8226fdd494d87a7ccb75af8ac3a07423037aaafc35 \
+    --hash=sha256:8179785883b556cd517416cdbda6244745414b00ec83132cfe1d26000971f3ae \
+    --hash=sha256:466e381f0a812da8fda97a9707498cef3210ea8385a3421bcbadcb5384063969 \
+    --hash=sha256:f8cb24d8d0b2f8b7463815a59183eb81ec1d7a06e3217bed456063f3303eddfb \
+    --hash=sha256:e88354b61f59dfdeb41023f7be8ae31dc627c2dc2dacbc2de8b2d82a0997135c \
+    --hash=sha256:a336575463d75d3aac1f7e32470b8998643ccd9a73786bd726f6b0470520b6b4 \
+    --hash=sha256:81bb77ba3651114943b2f8f77829cf764137dff06e38f4bf7fa43efea12c7f84 \
+    --hash=sha256:eba0471ab0bb2e07ed06d91ecf5185d402c83d194155a41d8e2aa547d187712e \
+    --hash=sha256:78e18d9106c36dcca929e18fd2c412378deac661d47fa3ee25defc55eef8a215 \
+    --hash=sha256:b1c24c1d9405b2148184ff27c062493d5e3be5c144575f95b5a0d7c660a515af \
+    --hash=sha256:940a6999c7d3f55e9d7b194fd5e1f41a7dbed26d3519fb95333216292a39599e \
+    --hash=sha256:384148cead5cdab34a4d74fe1fb6a5a8abaafed25eaa4a7698b49dd9482e4c4e \
+    --hash=sha256:3c703e68ea192e45b65c5d5836f6980849d828a18da4189899d7150fad82dc9e \
+    --hash=sha256:d501713a8396193883aa526f48dc609f5f031a5df1afbafa561cf9ab492ffc76 \
+    --hash=sha256:b8b1dd2712f8a7de5b4c8ec912e6c041d25750bf03e1ce325cdba43bae0944ae \
+    --hash=sha256:d45e3f78e746aa161bc9f5a31c6a2839c512101113a4065f4d2e7a3ab8198d8c \
+    --hash=sha256:5513298d62fe63dd0862d08a6eb52a9aa3537006f597f2386184e3f95bb88889 \
+    --hash=sha256:dadccb2e49244b6e64b4527d13ec14d5e094a90b41cf9b963e457e64182f1941 \
+    --hash=sha256:48c6d13b3bfff08060c138248e85df60f6fad11135ad7a8fc2ef6005aacca839 \
+    --hash=sha256:9bdf097d5bd1d8ce42dfee51f6ff05f5578b96e48c6f6006aa4eff69edfa3639
+setuptools-scm==6.4.2; python_version >= "3.7" \
+    --hash=sha256:acea13255093849de7ccb11af9e1fb8bde7067783450cee9ef7a93139bddf6d4 \
+    --hash=sha256:6833ac65c6ed9711a4d5d2266f8024cfa07c533a0e55f4c12f6eff280a5a9e30
+six==1.15.0; python_full_version >= "3.6.1" and python_version >= "3.7" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7") and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6") \
+    --hash=sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced \
+    --hash=sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259
+sklearn==0.0 \
+    --hash=sha256:e23001573aa194b834122d2b9562459bf5ae494a2d59ca6b8aa22c85a44c0e31
+tensorboard-data-server==0.6.1; python_version >= "3.6" \
+    --hash=sha256:809fe9887682d35c1f7d1f54f0f40f98bb1f771b14265b453ca051e2ce58fca7 \
+    --hash=sha256:fa8cef9be4fcae2f2363c88176638baf2da19c5ec90addb49b1cde05c95c88ee \
+    --hash=sha256:d8237580755e58eff68d1f3abefb5b1e39ae5c8b127cc40920f9c4fb33f4b98a
+tensorboard-plugin-wit==1.8.1; python_version >= "3.6" \
+    --hash=sha256:ff26bdd583d155aa951ee3b152b3d0cffae8005dc697f72b44a8e8c2a77a8cbe
+tensorboard==2.8.0; python_version >= "3.6" \
+    --hash=sha256:65a338e4424e9079f2604923bdbe301792adce2ace1be68da6b3ddf005170def
+tensorflow-estimator==2.5.0 \
+    --hash=sha256:d1fe76dee8b1dcab865d807a0246da0a9c4a635b1eba6e9545bf216c3aad6955
+tensorflow==2.5.0 \
+    --hash=sha256:7e1351ce05b897d5cf1042066b6929ca3f595a717849421ae92dbe8d6d2f1c74 \
+    --hash=sha256:31a3ea994c336fc5a6ba0e6d61f131262b2c6dbff97e2b7473ff6da0cf9383f7 \
+    --hash=sha256:c45059b42bca01ce441004abb965acf7838b40d12e036920063bd7ac540def9a \
+    --hash=sha256:616bc8094cb289b3bd21eded2196b0dba65bce53bad112efcaf2acb6f7d9e6a5 \
+    --hash=sha256:739d25273ccc10fedc74517de099bd5b16a274d1295fad6bfef834ad28cc3401 \
+    --hash=sha256:68b70ca7df7f5f8fbe3d7240e937b3ea8b1a25e51710f60293e7edada00257a2 \
+    --hash=sha256:c46b1d1b0eec54577d7ba545e3951c9dd0355ca05a8eb776c95d9a3e22e7be9c \
+    --hash=sha256:34ab87aac9093de98cbba68d7e8dca9159c36acd06a03e5749c956c7ab08d9da \
+    --hash=sha256:46f10a2edc694bb54a2d869a65b5a09705dab1874a89b529990a943416ad48aa \
+    --hash=sha256:baebb9c95ef1815bb410317ad525dd3dbb26064fe95636b51486459b6536bc6e \
+    --hash=sha256:1ea003f9e11508d0336c242a2a3bc73aea205dd5b31892c3e1d7f5d0f0e60c0a \
+    --hash=sha256:4edec9b9f6ef8f1407762a3a6bd050173177f686d5ea6b59e91487b645173f73
+termcolor==1.1.0 \
+    --hash=sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b
+threadpoolctl==3.0.0; python_version >= "3.7" \
+    --hash=sha256:4fade5b3b48ae4b1c30f200b28f39180371104fccc642e039e0f2435ec8cc211 \
+    --hash=sha256:d03115321233d0be715f0d3a5ad1d6c065fe425ddc2d671ca8e45e9fd5d7a52a
+tokenizers==0.11.6; python_full_version >= "3.6.0" \
+    --hash=sha256:c24f3e0e69edf015efab6bea0a24d45eb19f477106d00a739c19d2a02f6085fc \
+    --hash=sha256:1c5a786fe12a4c1782337abc818fc48ca84e07f8cb0eeab263a27fcd30f7fc6f \
+    --hash=sha256:6f7b82aaedb24e0a4dcd8fe77a79de9a0acf43db8ae173cdb4eca1e767566b47 \
+    --hash=sha256:c7d8ea3a05b593e5744c4ad0e6e2cbba6f82588c302d663855316c1861c09557 \
+    --hash=sha256:3fde9a1e7d18caddff3ac13baf4e31235688b0db2ba42bbc8179dc878327560a \
+    --hash=sha256:46a763d1f43f46448e41884356f105a2f067b6e573c7e0c67d8f93512304b22c \
+    --hash=sha256:6bc5cc6d5b17bf8222049a2c97bcc117974793e37fb2e42b8fb04b2ef984d165 \
+    --hash=sha256:3c1ad5d230bdd6a3f63bbffd16a9fdea6a049ceb6d225e4d70a2664853f40aaf \
+    --hash=sha256:44697b08469dfe3265a851f87ad41c7f04efa511ada8182b6b08aa809765dcb8 \
+    --hash=sha256:0975b9f06f982580909f9fa769baf58b806ab2d099daccc43dc95d60bf56817a \
+    --hash=sha256:d0deaa700f9e442ed4bb4fe2c6482979b3709772bcce2dd7b89dc586ec39ce2e \
+    --hash=sha256:34ac8450ad93e4dae1c72b7ad6c6a74d2941a68beb25df25d05b2b371267daba \
+    --hash=sha256:38420ddd3b47d6f13be20bfecd928f4301c8cbebd1a752a7436c22fe01b3f6c4 \
+    --hash=sha256:c08d5745fb5852adeeffc6bfbe13b77cd95d3f49e7e6129537858c5fb9b7142c \
+    --hash=sha256:820a4cc3ef39c556c6f9495ce7cbd169098ca352e073ed3b34d6b74b53df2fbb \
+    --hash=sha256:6c72383a918e9fef9c2bf4666a961f3b312361fb027165b4446ff333441ebf91 \
+    --hash=sha256:6259833c189e36c29e84a853b9503028324a3b176a2ae3980c815456d326b652 \
+    --hash=sha256:79074927fc9efaf13b3accd53246e50ade37550920077411ab55bd5ed4944153 \
+    --hash=sha256:7ed928ac19a3397af6fe3716b313fb13dcaf54978f0fc159eeabaff8e35e5c92 \
+    --hash=sha256:6840554a8cac1196db627d42edbf77f4b5decf6ce6fa9ca073efaaa2cff887a6 \
+    --hash=sha256:216745a6e92eb52d99b56123e6fece59e0dcf7bd1444f42bee09e1f02c89bbec \
+    --hash=sha256:e6d02076160d60966d6b2b320744affe6b846ee10a37d1c0222b6ca9e640bdb8 \
+    --hash=sha256:7074162348a7784faccbea18cf814138483ce0c47eb17dc482cbc4bbbde8a00c \
+    --hash=sha256:5c5ae264b75b7355db2bc3f34e8e3eb608fcca799ff9a109f3d61e4d9614f947 \
+    --hash=sha256:d393eb6b79ab972e6ebede2aa330903913cf380f6fe975d64a92fca15b5d8579 \
+    --hash=sha256:251978daef3b57257bd313df7ef705aacc6cd5831644f6e2e8a42e2c7b7c4a30 \
+    --hash=sha256:fd3fccc801b7621eca8dfd876494fad0b00bd43fc73afdc1c11d6be3c9136f78 \
+    --hash=sha256:3c1c6e10f655e0f57b9bb9a64ac4b7ea70d20a73f8013f8bd38d21d64d45d96a \
+    --hash=sha256:809b506a6e9f2f6cba86cfe642c1d1e82cbd758574bdc1207efe07229d6fa4d4 \
+    --hash=sha256:5b3829ad386747760e7d805c9ffd5cb5a9309679467029eea3162fb76c8c89dc \
+    --hash=sha256:b9a34bd33d866862f45bfc4a409563132a0b6af5951e08f3ccfde36152cd7683 \
+    --hash=sha256:e75efa0275665ca30536c75dc5b4d33492fc40ae40c90d9085bdcdb99e060044 \
+    --hash=sha256:8afc3c76268cdef4567f84a19d9c06fdd697b22f5142d1af18254ec70703db7b \
+    --hash=sha256:47878a49211f8df63f7ec7de62f13b1c65e68be501f6a98b28f4bbb8d3390f25 \
+    --hash=sha256:0d4f67758f62d64410e86d548c2c38ca5e59310ca38c18e8239637213c49e2fb \
+    --hash=sha256:468c3e3f414a532924fa277a58807e127a27d2a56b04113540ea755fc5ca9ba8 \
+    --hash=sha256:b28966c68a2cdecd5120f4becea159eebe0335b8202e21e292eb381031026edc \
+    --hash=sha256:562b2022faf0882586c915385620d1f11798fc1b32bac55353a530132369a6d0
+tomli==2.0.0; python_version >= "3.7" \
+    --hash=sha256:b5bde28da1fed24b9bd1d4d2b8cba62300bfb4ec9a6187a957e8ddb9434c5224 \
+    --hash=sha256:c292c34f58502a1eb2bbb9f5bbc9a5ebc37bee10ffb8c2d6bbdfa8eb13cc14e1
+torch==1.11.0; python_full_version >= "3.7.0" \
+    --hash=sha256:62052b50fffc29ca7afc0c04ef8206b6f1ca9d10629cb543077e12967e8d0398 \
+    --hash=sha256:866bfba29ac98dec35d893d8e17eaec149d0ac7a53be7baae5c98069897db667 \
+    --hash=sha256:951640fb8db308a59d9b510e7d1ad910aff92913323bbe4bc75435347ddd346d \
+    --hash=sha256:5d77b5ece78fdafa5c7f42995ff9474399d22571cd6b2de21a5d666306a2ff8c \
+    --hash=sha256:b5a38682769b544c875ecc34bcb81fbad5c922139b61319aacffcfd8a32f528c \
+    --hash=sha256:f82d77695a60626f2b7382d85bc566de8a6b3e50d32080755abc040db802e419 \
+    --hash=sha256:b96654d42566080a134e784705f33f8536b3b95b5dcde357ed7879b1692a5f78 \
+    --hash=sha256:8ee7c2e8d7f7020d5bfbc1bb91b9591044c26bbd0cee5e4f694cfd7ed8649260 \
+    --hash=sha256:6860b1d1bf0bb0b67a6bd47f85a0e4c825b518eea13b5d6101999dbbcbd5bc0c \
+    --hash=sha256:4322aa29f50da7f404db06cdf30896ea67b09f673af4a985afc7162bc897864d \
+    --hash=sha256:e4d2e0ddd652f30e94cff750220324ec45705d4ecc69658f773b3cb1c7a28dd0 \
+    --hash=sha256:34ce5ea4d8d85da32cdbadb50d4585106901e9f8a3527991daa70c13a09de1f7 \
+    --hash=sha256:0ccc85cd06227a3edf809e2c795fd5762c3d4e8a38b5c9f744c6e7cf841361bb \
+    --hash=sha256:c1554e49d74f1b2c3e7202d77056ba2dd7465437585bac64062b580f714a44e9 \
+    --hash=sha256:58c7814502b1c129a650d7092033bbb0bbd64faf1a7941631aaa1aeaddc37570 \
+    --hash=sha256:831cf588f01dda9409e75576741d2823453990dee2983d670f2584b37a01adf7 \
+    --hash=sha256:44a1d02fd20f827f0f36dc26fdcfc45e793806a6ad52769a22260655a77a4369 \
+    --hash=sha256:50fd9bf85c578c871c28f1cb0ace9dfc6024401c7f399b174fb0f370899f4454 \
+    --hash=sha256:0e48af66ad755f0f9c5f2664028a414f57c49d6adc37e77e06fe0004da4edb61
+tqdm==4.63.0; python_full_version >= "3.6.0" \
+    --hash=sha256:e643e071046f17139dea55b880dc9b33822ce21613b4a4f5ea57f202833dbc29 \
+    --hash=sha256:1d9835ede8e394bb8c9dcbffbca02d717217113adc679236873eeaac5bc0b3cd
+transformers==4.17.0; python_full_version >= "3.6.0" \
+    --hash=sha256:5c7d1955693ebf4a69a0fa700b2ef730232d5d7c1528e15d44c1d473b38f57b8 \
+    --hash=sha256:986fd59255460555b893a2b1827b9b8dd4e5cd6343e4409d18539208f69fb51b
+typing-extensions==3.7.4.3; python_version < "3.8" and python_version >= "3.7" and python_full_version >= "3.7.0" \
+    --hash=sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f \
+    --hash=sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918 \
+    --hash=sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c
+urllib3==1.26.8; python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.6" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.7") \
+    --hash=sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed \
+    --hash=sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c
+werkzeug==2.0.2; python_version >= "3.6" \
+    --hash=sha256:63d3dc1cf60e7b7e35e97fa9861f7397283b75d765afcaefd993d6046899de8f \
+    --hash=sha256:aa2bb6fc8dee8d6c504c0ac1e7f5f7dc5810a9903e793b6f715a9f015bdadb9a
+wrapt==1.12.1 \
+    --hash=sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7
+xxhash==3.0.0; python_version >= "3.6" \
+    --hash=sha256:219cba13991fd73cf21a5efdafa5056f0ae0b8f79e5e0112967e3058daf73eea \
+    --hash=sha256:3fcbb846af15eff100c412ae54f4974ff277c92eacd41f1ec7803a64fd07fa0c \
+    --hash=sha256:5f475fa817ff7955fc118fc1ca29a6e691d329b7ff43f486af36c22dbdcff1db \
+    --hash=sha256:9200a90f02ff6fd5fb63dea107842da71d8626d99b768fd31be44f3002c60bbe \
+    --hash=sha256:a1403e4f551c9ef7bcef09af55f1adb169f13e4de253db0887928e5129f87af1 \
+    --hash=sha256:fa7f6ca53170189a2268c83af0980e6c10aae69e6a5efa7ca989f89fff9f8c02 \
+    --hash=sha256:5b63fbeb6d9c93d50ae0dc2b8a8b7f52f2de19e40fe9edc86637bfa5743b8ba2 \
+    --hash=sha256:31f25efd10b6f1f6d5c34cd231986d8aae9a42e042daa90b783917f170807869 \
+    --hash=sha256:807e88ed56e0fb347cb57d5bf44851f9878360fed700f2f63e622ef4eede87a5 \
+    --hash=sha256:6d612c55a75d84d25898f6c5ad6a589aa556d1cb9af770b6c574ee62995167f6 \
+    --hash=sha256:6f9309fcaf73f93df3101f03a61dc30644adff3e8d0044fff8c0c195dbbe63e2 \
+    --hash=sha256:a2273fe40720e86346a17f06ef95cd60ee0d66ffce7cf55e390ef7350112b16d \
+    --hash=sha256:fc6f3a334587c83c5ba56c19b254a97542ce1fc05ccfd66fbf568e6117718d65 \
+    --hash=sha256:36cf410da5bfcca51ac3c2c51a3317dcd7af91f70fa61eca57fba39554f06ae3 \
+    --hash=sha256:21752a3e9a2391d91bd51f4aa2fe028ae14ba6a8d37db9ebe00ccac10be5ac4a \
+    --hash=sha256:322068a063ef156455a401ab720f0892f2d2dd1540c1a308e95a7cbf356df51c \
+    --hash=sha256:2984fa9a880587c0bfa46d32717b2d209863ee68727ea0fc17f05fce25efa692 \
+    --hash=sha256:6493dd938b360235da81b1c79d8cd048c4f11977e1159b4e744c54f98d3a7bb4 \
+    --hash=sha256:fb9eca32f9b4acc7149db2c86f8108167b9929b7da1887d4287a90cfdb3ea53a \
+    --hash=sha256:f4125e70e4e1d79992d81de837a0586aa0241665dbc5ce01b9c89330ed5cbb66 \
+    --hash=sha256:583bea142569485bdb0c5900e804058c16edba1850b74519688c22bc546e6175 \
+    --hash=sha256:4f3adf2891acc18abacd15113e9cbbefd30e5f4ecaae32c23e5486fc09c76ea5 \
+    --hash=sha256:ed65a2671d380ae05262ce1e4ccc2b63f3c30506d207bf6fae8cd72be0ad65d4 \
+    --hash=sha256:c604b3dcac9d37e3fceaa11884927024953260cc4224d9b89400d16e6cf34021 \
+    --hash=sha256:1c6fc59e182506496544bc6d426bcf6077066ed1b40cfcd937f707cc06c7ef50 \
+    --hash=sha256:5628375dbb76d33b93b44854a6c5433e2a78115e03ea2ae1bb74a34ab012a43f \
+    --hash=sha256:687aa4373690f23a3f43cc23d81005304d284ff6c041bff1f967664ab6410f36 \
+    --hash=sha256:9fa2100fb68b163e99370561c9e29ed37b9153fe99443600bea28829150eb0e4 \
+    --hash=sha256:891d7651431a055f76fe2c8f86c593c3dede8ec5b10ca55e8ff5c9fdceb55f0b \
+    --hash=sha256:197c32d7b62be02957ca31aa69febadf9c5a34ef953053ea16e2c72465bc450f \
+    --hash=sha256:91fa4df41bda3cbec4084d9696028780b47128c1f8450d1ad9c3e4b6bf8b1f99 \
+    --hash=sha256:4cd38b766fc40e9fe37b80112656d2e5a0cb2f9bc12e01b286353b5ecd2768e8 \
+    --hash=sha256:4258ef78f5a7d1f9c595846134c7d81a868c74942051453258eb383498662d4d \
+    --hash=sha256:b82b1cf4407ad908e04e864473cc3baa8e764c7bbebea959150764cc681a1611 \
+    --hash=sha256:da4d91e28418469b29eed8635c08af28b588e51cd04288bed1ba1cf60f2d91f6 \
+    --hash=sha256:48aab36169b0c00e586cb4eb2814ab8bfed686933126019906f917ff9a78c99e \
+    --hash=sha256:0b0d522570c9ccea6203b3d96ac7f0cfc1d29e613640475d513be432545c48cc \
+    --hash=sha256:d6054434ddb060685e86e7457f52d188b0886834baaa532f9f78b4f2b53cfd9b \
+    --hash=sha256:cbf546ca5f5903ceeb46d9e6abf81f3a64edb95bb7dbe0f75283eec93a7eb2a0 \
+    --hash=sha256:22704f23f23ccbe892cee3e7568c67f07ac25beaa2d1cff183274005d9d39149 \
+    --hash=sha256:83198e223bcc4b2418b5282ac930e444738c2a33859dee4e570b25c8433d83a2 \
+    --hash=sha256:3bcd4cd9b22293ea1c08822518fbb6d933c2960d66662d468a1945a45cace194 \
+    --hash=sha256:f5dd4c37da3408d56ae942dc103f4ae3b43510daa4f5accd0a411fc6e914f10a \
+    --hash=sha256:485f172abc03f78afd4f38dbdbb5665f59c5487126fa4c3181c6582cda4de03b \
+    --hash=sha256:035248b3d7ab6deb7b247278494d293b9faccfa853078319d25e2926f566b2f8 \
+    --hash=sha256:b30ae90c0cfd10ffe852c6b0f263253782eea74a8189d5f2440f6595c1e8047e \
+    --hash=sha256:8fd203d8a3c013e679722047ef4f061f690c6cff49380622444bca4c30f3bf23 \
+    --hash=sha256:6d60059aaef12a01c0cc24f1d7aaaab7933ae9f4b7adfd9ebbd37dc7ceac1745 \
+    --hash=sha256:676c97bf7cc298b65eec0368c2cb5611d87a8e876930843311ca728f69292752 \
+    --hash=sha256:2245c6e20e96e3f8fdfb61ad6bc5cde6ce8a1c2b93aa4a32a27bba7ab3aeaf12 \
+    --hash=sha256:2ae926a52d020085a2d7f69d0e2155cbf819ae409f2e5dbb345dd40a6462de32 \
+    --hash=sha256:0a2efdcb811be3edc520b78364c11a1e54f5d8e5db895a9ff2bcdd4a7ffa36a5 \
+    --hash=sha256:885b3a851980056707ab99a2c19c35dfe2c2ba5f602066dbfcd8af45ea855760 \
+    --hash=sha256:30b2d97aaf11fb122023f6b44ebb97c6955e9e00d7461a96415ca030b5ceb9c7
+yarl==1.7.2; python_version >= "3.6" \
+    --hash=sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95 \
+    --hash=sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b \
+    --hash=sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05 \
+    --hash=sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523 \
+    --hash=sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63 \
+    --hash=sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98 \
+    --hash=sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125 \
+    --hash=sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e \
+    --hash=sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d \
+    --hash=sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23 \
+    --hash=sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245 \
+    --hash=sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739 \
+    --hash=sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72 \
+    --hash=sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c \
+    --hash=sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265 \
+    --hash=sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d \
+    --hash=sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656 \
+    --hash=sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed \
+    --hash=sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee \
+    --hash=sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c \
+    --hash=sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92 \
+    --hash=sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d \
+    --hash=sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b \
+    --hash=sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c \
+    --hash=sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa \
+    --hash=sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d \
+    --hash=sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1 \
+    --hash=sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913 \
+    --hash=sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63 \
+    --hash=sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4 \
+    --hash=sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba \
+    --hash=sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41 \
+    --hash=sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e \
+    --hash=sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332 \
+    --hash=sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52 \
+    --hash=sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185 \
+    --hash=sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986 \
+    --hash=sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4 \
+    --hash=sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b \
+    --hash=sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1 \
+    --hash=sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271 \
+    --hash=sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576 \
+    --hash=sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d \
+    --hash=sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8 \
+    --hash=sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d \
+    --hash=sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6 \
+    --hash=sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a \
+    --hash=sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1 \
+    --hash=sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0 \
+    --hash=sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6 \
+    --hash=sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832 \
+    --hash=sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59 \
+    --hash=sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8 \
+    --hash=sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b \
+    --hash=sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef \
+    --hash=sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f \
+    --hash=sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0 \
+    --hash=sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1 \
+    --hash=sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3 \
+    --hash=sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746 \
+    --hash=sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de \
+    --hash=sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda \
+    --hash=sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b \
+    --hash=sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794 \
+    --hash=sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac \
+    --hash=sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec \
+    --hash=sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe \
+    --hash=sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8 \
+    --hash=sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8 \
+    --hash=sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d \
+    --hash=sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58 \
+    --hash=sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd
+zipp==3.7.0; python_version >= "3.7" and python_version < "3.8" and python_full_version >= "3.6.0" \
+    --hash=sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375 \
+    --hash=sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d
diff --git a/signtrack/Assets/Asset_col.png b/signtrack/Assets/Asset_col.png
new file mode 100644
index 0000000000000000000000000000000000000000..ece46d3c6fbef1b8cc43f45f4573a5c3371aafab
Binary files /dev/null and b/signtrack/Assets/Asset_col.png differ
diff --git a/signtrack/Assets/Asset_ncol.png b/signtrack/Assets/Asset_ncol.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea943489f4414191efbd87264046b32ecd56091e
Binary files /dev/null and b/signtrack/Assets/Asset_ncol.png differ
diff --git a/signtrack/Assets/Bar.png b/signtrack/Assets/Bar.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb1f5ab415022ce13cafe7ee5408fb7cd04fd0e0
Binary files /dev/null and b/signtrack/Assets/Bar.png differ
diff --git a/signtrack/Assets/BottomBar.png b/signtrack/Assets/BottomBar.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ad7e88957c23f31d542964c5ff08be5b75516ea
Binary files /dev/null and b/signtrack/Assets/BottomBar.png differ
diff --git a/signtrack/Assets/BottomBar.svg b/signtrack/Assets/BottomBar.svg
new file mode 100644
index 0000000000000000000000000000000000000000..cd18d894f3ac743333fa2b62b8b839b39c276cc7
--- /dev/null
+++ b/signtrack/Assets/BottomBar.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 680 32"><defs><style>.cls-1{fill:#c99;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" width="680" height="32" rx="12.9"/></g></g></svg>
\ No newline at end of file
diff --git a/signtrack/Assets/Circle.png b/signtrack/Assets/Circle.png
new file mode 100644
index 0000000000000000000000000000000000000000..7aecf6990dffb927a6fc643492617504c6eb6050
Binary files /dev/null and b/signtrack/Assets/Circle.png differ
diff --git a/signtrack/Assets/SVG/Asset 2.svg b/signtrack/Assets/SVG/Asset 2.svg
new file mode 100644
index 0000000000000000000000000000000000000000..fe5749fda05b6880c2d9e96fb42a36104f0d54ba
--- /dev/null
+++ b/signtrack/Assets/SVG/Asset 2.svg	
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1343 364"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{font-size:48px;}.cls-2,.cls-9{font-family:OdinRounded-Light, Odin Rounded;font-weight:300;}.cls-3{letter-spacing:-0.03em;}.cls-4{font-size:45px;}.cls-10,.cls-4{font-family:MyriadPro-Regular, Myriad Pro;font-weight:400;}.cls-5{letter-spacing:-0.05em;}.cls-6{letter-spacing:-0.04em;}.cls-7{letter-spacing:-0.04em;}.cls-8{fill:url(#linear-gradient-2);}.cls-9{font-size:37px;fill:#333;}.cls-11{letter-spacing:-0.06em;}.cls-12{letter-spacing:-0.03em;}.cls-13{fill:#c799d8;}.cls-14{fill:#ff9986;}</style><linearGradient id="linear-gradient" x1="786.4" y1="-17.01" x2="543.3" y2="404.05" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c799d8"/><stop offset="1" stop-color="#ff9986"/></linearGradient><linearGradient id="linear-gradient-2" x1="484.77" y1="117.16" x2="547.74" y2="117.16" gradientTransform="translate(-0.63 3.24) rotate(-0.25)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#db589a" stop-opacity="0.9"/><stop offset="0.13" stop-color="#d261a2" stop-opacity="0.91"/><stop offset="0.33" stop-color="#ba78b6" stop-opacity="0.93"/><stop offset="0.6" stop-color="#939fd8" stop-opacity="0.96"/><stop offset="0.87" stop-color="#6cf"/></linearGradient></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" x="457" width="429" height="364" rx="59.5"/><text class="cls-2" transform="translate(482 190.42)"><tspan class="cls-3">C</tspan><tspan x="28.7" y="0">omputi</tspan><tspan class="cls-4" x="162.96" y="0">n</tspan><tspan x="187.93" y="0">g</tspan><tspan class="cls-5" x="0" y="57.6">f</tspan><tspan x="16.85" y="57.6">or </tspan><tspan class="cls-6" x="70.99" y="57.6">e</tspan><tspan class="cls-7" x="92.49" y="57.6">v</tspan><tspan x="116.06" y="57.6">er</tspan><tspan class="cls-6" x="154.51" y="57.6">y</tspan><tspan x="177.98" y="57.6">o</tspan><tspan class="cls-4" x="204.24" y="57.6">n</tspan><tspan x="229.21" y="57.6">e</tspan></text><path class="cls-8" d="M490.11,103.42c2.08-.89,4-.53,6.67,0a24.94,24.94,0,0,1,7.34,2.88c.69.39,1.19.68,1.76,1.06,2.32,1.52,3.91,3.13,10.39,7.81.94.68,1.4,1,1.7,1.21.87.57,9.49,6,17,2.94,3.51-1.42,4.08-3.59,6.94-3.41a6.28,6.28,0,0,1,5.18,3.35,6.76,6.76,0,0,1-.26,5.64,9.31,9.31,0,0,1-3.08,3.77c-7.71,5.94-17.28,4.77-17.28,4.77a30.41,30.41,0,0,1-13.54-5.76c-.49-.39-2.05-1.45-4.14-3.18a33.91,33.91,0,0,0-4.9-3.36s-5.9-3.07-10.25-3h-2.16c-2.14.3-2.8,1.3-3.85,1.14-1.67-.25-2.52-3.14-2.65-3.56C483.79,111.57,485.47,105.39,490.11,103.42Z"/><text class="cls-9" transform="translate(553.8 129.53)">Sig<tspan class="cls-10" x="45.65" y="0">n</tspan><tspan class="cls-11" x="66.19" y="0">T</tspan><tspan class="cls-12" x="84.06" y="0">r</tspan><tspan x="94.45" y="0">ack</tspan></text><rect class="cls-13" x="914" width="429" height="364" rx="59.5"/><rect class="cls-14" width="429" height="364" rx="59.5"/></g></g></svg>
\ No newline at end of file
diff --git a/signtrack/Assets/TopBar.png b/signtrack/Assets/TopBar.png
new file mode 100644
index 0000000000000000000000000000000000000000..10d04d7afbda889f12552a2abf026fe7b762761b
Binary files /dev/null and b/signtrack/Assets/TopBar.png differ
diff --git a/signtrack/Assets/TopBar.svg b/signtrack/Assets/TopBar.svg
new file mode 100644
index 0000000000000000000000000000000000000000..157211ddafef2291b7d4cd348f4f4bb4fe1b938d
--- /dev/null
+++ b/signtrack/Assets/TopBar.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 25.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 960 720" style="enable-background:new 0 0 960 720;" xml:space="preserve">
+<style type="text/css">
+	.st0{stroke:#000000;stroke-miterlimit:10;}
+	.st1{fill:#F2F2F2;}
+	.st2{fill:#FF6633;stroke:#000000;stroke-miterlimit:10;}
+	.st3{fill:#FF9933;stroke:#000000;stroke-miterlimit:10;}
+	.st4{fill:#009999;stroke:#000000;stroke-miterlimit:10;}
+	.st5{fill:#CC9999;}
+	.st6{fill:#990033;stroke:#000000;stroke-miterlimit:10;}
+</style>
+<rect x="0.5" y="630.5" class="st0" width="960" height="90"/>
+<rect x="0.5" y="0.5" class="st0" width="960" height="90"/>
+<path class="st1" d="M406.5,64h-28c-3,0-5.5-2.5-5.5-5.5v-8c0-3,2.5-5.5,5.5-5.5h28c3,0,5.5,2.5,5.5,5.5v8
+	C412,61.5,409.5,64,406.5,64z"/>
+<path class="st1" d="M259.5,64h-28c-3,0-5.5-2.5-5.5-5.5v-8c0-3,2.5-5.5,5.5-5.5h28c3,0,5.5,2.5,5.5,5.5v8
+	C265,61.5,262.5,64,259.5,64z"/>
+<path class="st1" d="M113.5,64h-28c-3,0-5.5-2.5-5.5-5.5v-8c0-3,2.5-5.5,5.5-5.5h28c3,0,5.5,2.5,5.5,5.5v8
+	C119,61.5,116.5,64,113.5,64z"/>
+<path class="st2" d="M448.6,49.8H335.9c-7.7,0-13.9-6.2-13.9-13.9v-6.5c0-7.7,6.2-13.9,13.9-13.9h112.8c7.7,0,13.9,6.2,13.9,13.9
+	v6.5C462.5,43.6,456.3,49.8,448.6,49.8z"/>
+<path class="st3" d="M302.1,50.2H189.3c-7.7,0-13.9-6.2-13.9-13.9v-6.5c0-7.7,6.2-13.9,13.9-13.9h112.8c7.7,0,13.9,6.2,13.9,13.9
+	v6.5C316,44,309.7,50.2,302.1,50.2z"/>
+<path class="st4" d="M156.1,50.2H43.3c-7.7,0-13.9-6.2-13.9-13.9v-6.5c0-7.7,6.2-13.9,13.9-13.9h112.8c7.7,0,13.9,6.2,13.9,13.9v6.5
+	C169.9,44,163.7,50.2,156.1,50.2z"/>
+<path class="st5" d="M806.6,691.5H152.4c-7.1,0-12.9-5.8-12.9-12.9v-6.2c0-7.1,5.8-12.9,12.9-12.9h654.2c7.1,0,12.9,5.8,12.9,12.9
+	v6.2C819.5,685.7,813.7,691.5,806.6,691.5z"/>
+<path class="st6" d="M885.6,49.1H481.9c-7.7,0-13.9-6.2-13.9-13.9v-6.5c0-7.7,6.2-13.9,13.9-13.9h403.8c7.7,0,13.9,6.2,13.9,13.9
+	v6.5C899.5,42.9,893.3,49.1,885.6,49.1z"/>
+<path class="st3" d="M164,675.5"/>
+</svg>
diff --git a/signtrack/Assets/readme/SignTrack Logo.svg b/signtrack/Assets/readme/SignTrack Logo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..fe5749fda05b6880c2d9e96fb42a36104f0d54ba
--- /dev/null
+++ b/signtrack/Assets/readme/SignTrack Logo.svg	
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1343 364"><defs><style>.cls-1{fill:url(#linear-gradient);}.cls-2{font-size:48px;}.cls-2,.cls-9{font-family:OdinRounded-Light, Odin Rounded;font-weight:300;}.cls-3{letter-spacing:-0.03em;}.cls-4{font-size:45px;}.cls-10,.cls-4{font-family:MyriadPro-Regular, Myriad Pro;font-weight:400;}.cls-5{letter-spacing:-0.05em;}.cls-6{letter-spacing:-0.04em;}.cls-7{letter-spacing:-0.04em;}.cls-8{fill:url(#linear-gradient-2);}.cls-9{font-size:37px;fill:#333;}.cls-11{letter-spacing:-0.06em;}.cls-12{letter-spacing:-0.03em;}.cls-13{fill:#c799d8;}.cls-14{fill:#ff9986;}</style><linearGradient id="linear-gradient" x1="786.4" y1="-17.01" x2="543.3" y2="404.05" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c799d8"/><stop offset="1" stop-color="#ff9986"/></linearGradient><linearGradient id="linear-gradient-2" x1="484.77" y1="117.16" x2="547.74" y2="117.16" gradientTransform="translate(-0.63 3.24) rotate(-0.25)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#db589a" stop-opacity="0.9"/><stop offset="0.13" stop-color="#d261a2" stop-opacity="0.91"/><stop offset="0.33" stop-color="#ba78b6" stop-opacity="0.93"/><stop offset="0.6" stop-color="#939fd8" stop-opacity="0.96"/><stop offset="0.87" stop-color="#6cf"/></linearGradient></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><rect class="cls-1" x="457" width="429" height="364" rx="59.5"/><text class="cls-2" transform="translate(482 190.42)"><tspan class="cls-3">C</tspan><tspan x="28.7" y="0">omputi</tspan><tspan class="cls-4" x="162.96" y="0">n</tspan><tspan x="187.93" y="0">g</tspan><tspan class="cls-5" x="0" y="57.6">f</tspan><tspan x="16.85" y="57.6">or </tspan><tspan class="cls-6" x="70.99" y="57.6">e</tspan><tspan class="cls-7" x="92.49" y="57.6">v</tspan><tspan x="116.06" y="57.6">er</tspan><tspan class="cls-6" x="154.51" y="57.6">y</tspan><tspan x="177.98" y="57.6">o</tspan><tspan class="cls-4" x="204.24" y="57.6">n</tspan><tspan x="229.21" y="57.6">e</tspan></text><path class="cls-8" d="M490.11,103.42c2.08-.89,4-.53,6.67,0a24.94,24.94,0,0,1,7.34,2.88c.69.39,1.19.68,1.76,1.06,2.32,1.52,3.91,3.13,10.39,7.81.94.68,1.4,1,1.7,1.21.87.57,9.49,6,17,2.94,3.51-1.42,4.08-3.59,6.94-3.41a6.28,6.28,0,0,1,5.18,3.35,6.76,6.76,0,0,1-.26,5.64,9.31,9.31,0,0,1-3.08,3.77c-7.71,5.94-17.28,4.77-17.28,4.77a30.41,30.41,0,0,1-13.54-5.76c-.49-.39-2.05-1.45-4.14-3.18a33.91,33.91,0,0,0-4.9-3.36s-5.9-3.07-10.25-3h-2.16c-2.14.3-2.8,1.3-3.85,1.14-1.67-.25-2.52-3.14-2.65-3.56C483.79,111.57,485.47,105.39,490.11,103.42Z"/><text class="cls-9" transform="translate(553.8 129.53)">Sig<tspan class="cls-10" x="45.65" y="0">n</tspan><tspan class="cls-11" x="66.19" y="0">T</tspan><tspan class="cls-12" x="84.06" y="0">r</tspan><tspan x="94.45" y="0">ack</tspan></text><rect class="cls-13" x="914" width="429" height="364" rx="59.5"/><rect class="cls-14" width="429" height="364" rx="59.5"/></g></g></svg>
\ No newline at end of file
diff --git a/signtrack/Assets/readme/SignTrack.png b/signtrack/Assets/readme/SignTrack.png
new file mode 100644
index 0000000000000000000000000000000000000000..1213cc57bdd153d642f37d5f3f16e5904d9db233
Binary files /dev/null and b/signtrack/Assets/readme/SignTrack.png differ
diff --git a/signtrack/Packr.py b/signtrack/Packr.py
new file mode 100644
index 0000000000000000000000000000000000000000..9b09e82398c310ddc4ed92758ecd41ef78ddbafc
--- /dev/null
+++ b/signtrack/Packr.py
@@ -0,0 +1,26 @@
+import zipfile
+from pathlib import Path
+import pandas as pd
+import numpy as np
+import os
+from os.path import exists
+
+
+def ModelPack(mpath, signs):
+    filename = 'model.pack'
+    if exists(filename):
+        try:
+            os.remove(filename)
+        except:
+            pass
+    with zipfile.ZipFile(filename, 'x') as file:
+        np.save('Insights/ModelID', signs)
+        file.write('Insights/ModelID.npy')
+        file.write(mpath)
+
+
+def ModelIDUnpack():
+    filename = 'model.pack'
+    with zipfile.ZipFile(filename, 'r') as file:
+        file.extractall('tmp/')
+        return "tmp/Insights/ModelID.npy"
diff --git a/signtrack/SignTrack.py b/signtrack/SignTrack.py
deleted file mode 100644
index e8d721ef4bc1e08ac0a693bbd56c398d7e495679..0000000000000000000000000000000000000000
--- a/signtrack/SignTrack.py
+++ /dev/null
@@ -1,93 +0,0 @@
-from tensorflow.keras.models import Sequential
-from tensorflow.keras.layers import LSTM, Dense
-import cv2
-import numpy as np
-import mediapipe as mp
-from essentials import mediapipe_detection, display_styled_landmarks, extract_keypoints
-
-actions = np.array(['yes', 'no', 'thanks', 'hello', 'nothing'])
-
-mp_holistic = mp.solutions.holistic  # Holistic model
-mp_drawing = mp.solutions.drawing_utils  # Drawing utilities
-
-
-model = Sequential()
-model.add(LSTM(64, return_sequences=True,
-          activation='relu', input_shape=(24, 126)))
-model.add(LSTM(128, return_sequences=True, activation='relu'))
-model.add(LSTM(64, return_sequences=False, activation='relu'))
-model.add(Dense(64, activation='relu'))
-model.add(Dense(32, activation='relu'))
-model.add(Dense(actions.shape[0], activation='softmax'))
-
-model.load_weights('SignTrack.h5')
-
-colors = [(245, 117, 16), (117, 245, 16), (16, 117, 245),
-          (16, 117, 245), (16, 117, 245)]
-
-
-def prob_viz(res, actions, input_frame, colors):
-    output_frame = input_frame.copy()
-    for num, prob in enumerate(res):
-        cv2.rectangle(output_frame, (0, 60+num*40),
-                      (int(prob*100), 90+num*40), colors[num], -1)
-        cv2.putText(output_frame, actions[num], (0, 85+num*40),
-                    cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)
-
-    return output_frame
-
-
-sequence, sentence = [], []
-threshold = 0.90
-
-cap = cv2.VideoCapture(0)
-# Set mediapipe model
-with mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5) as holistic:
-    while cap.isOpened():
-
-        # Read feed
-        ret, frame = cap.read()
-
-        # Make detections
-        image, results = mediapipe_detection(frame, holistic)
-        print(results)
-
-        # Draw landmarks
-        display_styled_landmarks(image, results)
-
-        # 2. Prediction logic
-        keypoints = extract_keypoints(results)
-
-        sequence.append(keypoints)
-        sequence = sequence[-35:]
-
-        if len(sequence) == 35:
-            res = model.predict(np.expand_dims(sequence, axis=0))[0]
-            print(actions[np.argmax(res)])
-
-        # 3. Viz logic
-            if res[np.argmax(res)] > threshold:
-                if len(sentence) > 0:
-                    if actions[np.argmax(res)] != sentence[-1]:
-                        sentence.append(actions[np.argmax(res)])
-                else:
-                    sentence.append(actions[np.argmax(res)])
-
-            if len(sentence) > 5:
-                sentence = sentence[-5:]
-
-            # Viz probabilities
-            image = prob_viz(res, actions, image, colors)
-
-        cv2.rectangle(image, (0, 0), (640, 40), (245, 117, 16), -1)
-        cv2.putText(image, ' '.join(sentence), (3, 30),
-                    cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)
-
-        # Show to screen
-        cv2.imshow('SignTrack', image)
-
-        # Break gracefully
-        if cv2.waitKey(10) & 0xFF == ord('q'):
-            break
-    cap.release()
-    cv2.destroyAllWindows()
diff --git a/signtrack/SignTrack_DataColect.py b/signtrack/SignTrack_DataColect.py
index 49d87f0e2079063540d6101a9e57ecb645f56125..f06fa888d984d2b9d7f52dd398b39080a6246588 100644
--- a/signtrack/SignTrack_DataColect.py
+++ b/signtrack/SignTrack_DataColect.py
@@ -1,6 +1,7 @@
 # Importing dependancies
 
 import cv2
+import cvzone
 import numpy as np
 import os
 import mediapipe as mp
@@ -8,24 +9,34 @@ from pathlib import Path
 from essentials import mediapipe_detection, extract_keypoints, display_styled_landmarks
 
 # Dataset export location, Changing requires changes in Signtrack_Train
-data_path = os.path.join('Dataset')
+data_path = os.path.join('TEST')
 
 # Actions that we try to detect, Changing requires changes in Signtrack_Train
-signs = np.array(['yes', 'no', 'thanks', 'hello', 'nothing'])
+signs = np.array(["hello"])
 
-# Number of data packs to be collected for each action
-no_datapacks = 3
+# Number of sequences to be collected for each action
+no_datapacks = 25
 
-# Frames per data pack, Changing requires changes in Signtrack_Train
-sequence_length = 24
+# Frames per sequence, Changing requires changes in Signtrack_Train
+seq_length = 24
 
-cap = cv2.VideoCapture(0)  # Choose camera to be used
+# Choose camera input
+cap = cv2.VideoCapture(0)
+
+# Resize camera input
+cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
+cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
 
 mp_holistic = mp.solutions.holistic  # Holistic model
 mp_drawing = mp.solutions.drawing_utils  # Drawing utilities
 
 
 def existing_data(sign):
+    '''
+    Checks for existing data in the
+    dataset folder, to avoid errors while
+    saving new data.
+    '''
     existing_data = 0
     path = Path(data_path + '/' + sign)
     if path.exists():
@@ -34,66 +45,151 @@ def existing_data(sign):
 
 
 for sign in signs:
+    '''
+    Generates new empty forlders,
+    after taking into account existing data,
+    where new data wil be saved.
+    '''
     exdt = existing_data(sign)
-    for sequence in range(no_datapacks * 2 + 1):
+    for seq in range(no_datapacks * 2):
         try:
             os.makedirs(os.path.join(data_path, sign,
-                        str((sequence) + exdt)))
+                        str((seq) + exdt)))
         except:
             pass
 
-
-# Setting mediapipe parameters
-with mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5) as holistic:
-    # Loop through sign
-    for sign in signs:
-        exdt = existing_data(sign) - (no_datapacks * 2 + 1)
-        # Loop through sequences aka videos
-        for sequence in range(no_datapacks):
-            # Loop through video length aka sequence length
-            for frame_num in range(sequence_length):
-
-                # Read feed
-                ret, frame = cap.read()
-                frame_fliped = cv2.flip(frame, 1)
-
-                # Make detections
-                img, results = mediapipe_detection(frame, holistic)
-                img_flipped, results_flipped = mediapipe_detection(
-                    frame_fliped, holistic)
-
-                # Draw landmarks
-                display_styled_landmarks(img, results)
-
-                # NEW Apply wait logic
-                if frame_num == 0:
-                    cv2.putText(img, 'STARTING COLLECTION', (120, 200),
-                                cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 4, cv2.LINE_AA)
-                    cv2.putText(img, 'Sign: {} Sequence: {}'.format(sign, sequence), (15, 12),
-                                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1, cv2.LINE_AA)
-                    # Show to screen
-                    cv2.imshow('SignTrack Training', img)
-                    cv2.waitKey(2000)
-                else:
-                    cv2.putText(img, 'Sign: {} Sequence: {}'.format(sign, sequence), (15, 12),
-                                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1, cv2.LINE_AA)
-                    # Show to screen
-                    cv2.imshow('SignTrack Training', img)
-
-                # Export keypoints
-                keypoints = extract_keypoints(results)
-                keypoints_flipped = extract_keypoints(results_flipped)
-
-                npy_path = os.path.join(
-                    data_path, sign, str((2 * sequence) + exdt), str(frame_num))
-                np.save(npy_path, keypoints)
-                npy_path_flipped = os.path.join(
-                    data_path, sign, str((2 * sequence + 1) + exdt), str(frame_num))
-                np.save(npy_path_flipped, keypoints_flipped)
-
-                #
-                if cv2.waitKey(10) & 0xFF == ord('q'):
-                    break
-
-    cap.release()
-    cv2.destroyAllWindows()
+# Import image assets and resize them to fit the output frame
+
+AssetCol = cv2.imread("Assets/Asset_col.png", cv2.IMREAD_UNCHANGED)
+AssetCol = cv2.resize(AssetCol, (0, 0), None, 0.5, 0.5)
+
+AssetNCol = cv2.imread("Assets/Asset_ncol.png", cv2.IMREAD_UNCHANGED)
+AssetNCol = cv2.resize(AssetNCol, (0, 0), None, 0.5, 0.5)
+
+AssetCircle = cv2.imread("Assets/Circle.png", cv2.IMREAD_UNCHANGED)
+AssetCircle = cv2.resize(AssetCircle, (0, 0), None, 0.5, 0.5)
+
+AssetBar = cv2.imread("Assets/Bar.png", cv2.IMREAD_UNCHANGED)
+AssetBar = cv2.resize(AssetBar, (0, 0), None, 0.5, 0.5)
+
+
+def Graphics(img, sign, sequence, collecting):
+    '''
+        Add the text and the assets to the final
+        display output
+    '''
+    # Adds the circle around the number of sequence
+    # It is displayed at the 1/3 of frame's width (centered)
+    # And at the frame's heignt minus it's height
+    img = cvzone.overlayPNG(
+        img, AssetCircle, [round((wb/3-wc/2)/2), hb-hf])
+
+    # Adds the bar around the current collected sign
+    # It is displayed at the 1/4 of frame's width from the right (centered)
+    # Vertically, it is located at the lowest part of the picture
+    img = cvzone.overlayPNG(
+        img, AssetBar, [round(wb-wb/4-wc/2), hb-hf])
+
+    # This adds the text of the sequence counter
+    # Its location is exactly the same as of its circle around it
+    # Only difference is that its possition also changes
+    #  regarding the number of letters
+    cv2.putText(img, str(sequence), (round((wb/3-wc/2)/2 - (len(str(sequence)))*7.5 + 28),
+                hb-hf+23), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 1, cv2.LINE_AA)
+
+    # Prints the curent collected sign in the frame
+    # Its location is exactly the same as of its bar around it
+    # Only difference is that its possition also changes
+    #  regarding the number of letters
+    cv2.putText(img, str(sign), (round(wb-wb/4-wc/2 + wbar/2-len(sign)*7.5), hb-hf+22),
+                cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 1, cv2.LINE_AA)
+
+    # Displaying the collecting indication at the center
+    if collecting == True:
+        img = cvzone.overlayPNG(
+            img, AssetCol, [round(wb/2-wf/2), hb-hf])
+    else:
+        img = cvzone.overlayPNG(
+            img, AssetNCol, [round(wb/2-wf/2), hb-hf])
+    return img
+
+
+# Setting mediapipe parameters amd initiaize a diferent model for the flipped image
+'''
+Mediapipe uses an LSTM model, just like SignTrack, that means that the results are made 
+based on a sequence of data. Thus when trying to make predictions on the flipped image it is 
+important to utilize a different version of the Mediapipe model, to avoit the model's confusion.
+'''
+
+holisticf = mp_holistic.Holistic(
+    min_detection_confidence=0.5, min_tracking_confidence=0.5)
+
+holistic = mp_holistic.Holistic(
+    min_detection_confidence=0.5, min_tracking_confidence=0.5)
+
+
+def DataAugm(frame):
+    '''
+        Gets as input a frame and outputs the keypoints data of the flipped image
+    '''
+    frame_fliped = cv2.flip(frame, 1)
+    img_flipped, results_flipped = mediapipe_detection(
+        frame_fliped, holisticf)
+    keypoints_flipped = extract_keypoints(results_flipped)
+    return keypoints_flipped
+
+
+# Loop through each sign
+for sign in signs:
+    exdt = existing_data(sign) - (no_datapacks * 2)
+    # Loop through sequences aka videos
+    for seq in range(no_datapacks):
+        # Loop through video length aka sequence length
+        for frame_num in range(seq_length):
+
+            # Read camera feed
+            ret, frame = cap.read()
+
+            # Detect hand and pose landmarks
+            img, results = mediapipe_detection(frame, holistic)
+
+            # Loading the dimentions of cap and the assets
+            hf, wf, cf = AssetCol.shape
+            hb, wb, cb = img.shape
+            hc, wc, cc = AssetCircle.shape
+            hbar, wbar, cbar = AssetBar.shape
+
+            # Draw landmarks
+            display_styled_landmarks(img, results)
+
+            '''
+            The wait logic,
+            If the collected sequence is on its first frame, 
+            changes the apearence of the image accordingly.
+            '''
+            if frame_num == 0:
+                cv2.imshow('SignTrack Data Collect',
+                           Graphics(img, sign, seq, False))
+                cv2.waitKey(700)
+            else:
+                cv2.imshow('SignTrack Data Collect',
+                           Graphics(img, sign, seq, True))
+
+            # Export keypoints
+            keypoints = extract_keypoints(results)
+
+            # Save the landmarks as an numpy array
+            npy_path = os.path.join(
+                data_path, sign, str((2 * seq) + exdt), str(frame_num))
+            np.save(npy_path, keypoints)
+
+            # Save the landmarks of the flipped image as an numpy array
+            npy_path_flipped = os.path.join(
+                data_path, sign, str((2 * seq + 1) + exdt), str(frame_num))
+            np.save(npy_path_flipped, DataAugm(frame))
+
+            if cv2.waitKey(10) & 0xFF == ord('q'):
+                break
+
+cap.release()
+cv2.destroyAllWindows()
diff --git a/signtrack/SignTrack_Train.py b/signtrack/SignTrack_Train.py
index 35cc8b57838a97726ea5ab3a82c1220c55676062..5a54a5964a7efe46f1b8ed3b8480ec7bdf819ced 100644
--- a/signtrack/SignTrack_Train.py
+++ b/signtrack/SignTrack_Train.py
@@ -1,61 +1,89 @@
-from gc import callbacks
-from tensorflow.keras.callbacks import TensorBoard
+from calendar import EPOCH
 from tensorflow.keras.layers import LSTM, Dense
 from tensorflow.keras.models import Sequential
+from keras.callbacks import History
 import numpy as np
 import os
 from matplotlib import pyplot as plt
 from sklearn.model_selection import train_test_split
 from tensorflow.keras.utils import to_categorical
 
+from Packr import ModelPack
+
 # Path for exported data, numpy arrays
 DATA_PATH = os.path.join('Dataset')
 
-# Signs that we try to detect
-signs = np.array(['yes', 'no', 'thanks', 'hello', 'nothing'])
+# Path to save model
+MODEL_PATH = 'Insights/SignTrack.h5'
 
-# Thirty videos worth of data
-no_sequences = 5
+# Signs that we try to detect
+signs = np.array(['no', 'thank you', 'me', 'please', 'good', 'morning', 'want', 'go to', 'night', 'how',
+                  'hello', "what's up", 'yes', 'fine', 'see you later', 'like', 'afternoon', 'you', 'goodbye', 'sorry'])
 
 # Videos are going to be 24 frames in length
 sequence_length = 24
 
+# Creating a label map, where each sign is assigned to a specific numerical value
 label_map = {label: num for num, label in enumerate(signs)}
 
+# Importing data from dataset
 sequences, labels = [], []
 for sign in signs:
-    for sequence in range(no_sequences):
+    print('Importing data for {}...'.format(sign))
+    dirs = os.listdir('Dataset/' + sign)
+    for dir in dirs:
         window = []
         for frame_num in range(sequence_length):
             res = np.load(os.path.join(DATA_PATH, sign, str(
-                sequence), "{}.npy".format(frame_num)))
+                dir), "{}.npy".format(frame_num)))
             window.append(res)
         sequences.append(window)
         labels.append(label_map[sign])
+    print('Data for {} imported'.format(sign))
 
 X = np.array(sequences)
 y = to_categorical(labels).astype(int)
 
 log_dir = os.path.join('Insights')
-tb_callback = TensorBoard(log_dir=log_dir)
 
-X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
-y_test.shape
+# Splitting dataset into Train_Set and Test_set
+X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15)
 
+# Setting up model parameters
+
+# Our model is set so that it predicts based on a sequence of data
 model = Sequential()
+# Adds an LSTM layer with 64 neurons, that returns its results, activation method is Relu (most common for CNNs)
+# to continue on the next layer, with an input shape of (frames per sequence, number of keypoints)
 model.add(LSTM(64, return_sequences=True,
-          activation='relu', input_shape=(24, 126)))
+          activation='relu', input_shape=(24, 258)))
+# Adding an 128 neuron LSTM layer
 model.add(LSTM(128, return_sequences=True, activation='relu'))
+# Adding an 64 neuron LSTM layer this time without returning the data
 model.add(LSTM(64, return_sequences=False, activation='relu'))
 model.add(Dense(64, activation='relu'))
 model.add(Dense(32, activation='relu'))
 model.add(Dense(signs.shape[0], activation='softmax'))
 
-res = [.7, 0.2, 0.1]
 
-model.compile(optimizer='Adam', loss='categorical_crossentropy',
-              metrics=['categorical_accuracy'])
+AutoTrain = model.compile(optimizer='Adam', loss='categorical_crossentropy')
+
+loss = 1
+
+AutoTrain = model.fit(X_train, y_train, epochs=1)
+
+for i in range(1000):
+    if AutoTrain.history['loss'][-1] >= 0.04:
+        AutoTrain = model.fit(X_train, y_train, epochs=1)
+        if AutoTrain.history['loss'][-1] < loss:
+
+            try:
+                os.remove(MODEL_PATH)
+            except:
+                pass
+
+            model.save(MODEL_PATH)
 
-model.fit(X_train, y_train, epochs=70, callbacks=[tb_callback])
+            loss = AutoTrain.history['loss'][-1]
 
-model.save('SignTrack.h5')
+ModelPack(MODEL_PATH, signs)
diff --git a/signtrack/__main__.py b/signtrack/__main__.py
new file mode 100644
index 0000000000000000000000000000000000000000..62237571de63ee91658e843eb014a93f33d269a5
--- /dev/null
+++ b/signtrack/__main__.py
@@ -0,0 +1,242 @@
+from re import I
+from tensorflow.keras.models import Sequential
+from tensorflow.keras.layers import LSTM, Dense
+import cv2
+import cvzone
+import shutil
+import numpy as np
+import mediapipe as mp
+from essentials import mediapipe_detection, display_styled_landmarks, extract_keypoints, HandsOnScene, grammar_correct
+import Packr
+import random
+
+
+# The number of frames per sequence that the model has been trained on
+seq_length = 24
+
+# Choose camera input
+cap = cv2.VideoCapture(0)
+
+# Resize camera input
+cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
+cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
+
+shutil.rmtree('tmp', True)  # Erase previous temporary data
+
+# Unpacks the Model.Pack file and loads the features(signs) of the model
+signs = np.load(Packr.ModelIDUnpack())
+
+mp_holistic = mp.solutions.holistic  # Holistic model
+mp_drawing = mp.solutions.drawing_utils  # Drawing utilities
+
+# Setting up the model archtecture
+model = Sequential()
+model.add(LSTM(64, return_sequences=True,
+          activation='relu', input_shape=(24, 258)))
+model.add(LSTM(128, return_sequences=True, activation='relu'))
+model.add(LSTM(64, return_sequences=False, activation='relu'))
+model.add(Dense(64, activation='relu'))
+model.add(Dense(32, activation='relu'))
+model.add(Dense(signs.shape[0], activation='softmax'))
+
+# Loading the model
+model.load_weights("tmp/Insights/SignTrack.h5")
+
+shutil.rmtree('tmp', True)  # Erase temporary data
+
+
+# Import image assets and resize them to fit the output frame
+TopBar = cv2.imread("Assets/TopBar.png", cv2.IMREAD_UNCHANGED)
+TopBar = cv2.resize(TopBar, (0, 0), None, 0.36, 0.42)
+
+BottomBar = cv2.imread("Assets/BottomBar.png", cv2.IMREAD_UNCHANGED)
+BottomBar = cv2.resize(BottomBar, (0, 0), None, 0.36, 0.42)
+
+
+def prob_vis(res, actions, input_frame):
+    '''
+    It adds to the image a visualization
+    of the chances that an action apears in the
+    image
+    Returns the final image after the process
+
+    '''
+    output_frame = input_frame.copy()
+    resfin = {}
+    resfinshorted = {}
+    to_add = 0
+
+    # Create a dict including the possibility of each sign being in the frames as a percentage
+    for num, prob in enumerate(res):
+        resfin.update({round(prob*100, 2): actions[num]})
+
+    # Adding '--' for non existing values
+    to_add = 7 - len(resfin)
+    if 0 < to_add:
+        for i in range(to_add):
+            resfin.update({0.0001*i: '--'})
+
+    # Creating a shorted version of the dictionary with the most probable signs going first
+    for i in sorted(resfin, reverse=True):
+        resfinshorted[i] = resfin[i]
+
+    # Initializing lists with the shorted signs and their probability of their presence
+    ResValShorted = list(resfinshorted.values())
+    ResKeysShorted = list(resfinshorted.keys())
+
+    # Positioning the assets and the text on the image
+    """ 
+    Adds the bottom bar on the frame, the position is calculated :
+    Horizontally: by calculating half of the width of the frame
+     minus half of the width of the bottom bar
+    Vertically: by calculating the height of the frame minus
+     the height of the bar while leavig 17 pixels space from the top
+    """
+
+    output_frame = cvzone.overlayPNG(
+        output_frame, BottomBar, [round(wc/2-wb/2), round(hc-hb-17)])
+
+    """ 
+    Adds the top bar on the frame, the position is calculated :
+    Horizontally: by calculating half of the difference between 
+    the width of the frame and the width of the bottom bar
+    Vertically: by calculating the height of the bar minus 
+    the height of the bar devided by 1.5
+    """
+    output_frame = cvzone.overlayPNG(
+        output_frame, TopBar, [round((wc-wt)/2), round(ht-(ht/1.5))])
+
+    for i in range(6):
+        """
+        Prints the 6 most probable signs on the top bar,
+         the position is calculated knowing that:
+        Horizontally: the distance between each window is
+         105 pixels, while the first window is 52 pixels 
+         from 0 and that each letter has aproximately a 5.25
+         pixel width 
+        The Y axis possition remains the same at 35 pixels
+        """
+        cv2.putText(output_frame, str(ResValShorted[i]), ((round((52 + 105*(i)-len(ResValShorted[i])*5.25))),
+                                                          35), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 1, cv2.LINE_AA)
+    for i in range(3):
+        """
+        Prints the probabilities of the 3 most probable signs
+         on the top bar, the position is calculated knowing that:
+        Horizontally: the distance between each window is
+         105 pixels, while the first window is 46 from 0axis
+        The Y axis possition remains the same at 53 pixels
+        """
+        cv2.putText(output_frame, str(round(ResKeysShorted[i], 1)), ((round((46 + 105*(i)))),
+                                                                     53), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 0, 0), 1, cv2.LINE_AA)
+
+    """
+    Adds the sentence text on the bottom bar, the position is calculated by:
+    Horizontally: dividing the width of the frame by 6
+    Vertically: calculating the difference of the height of the
+     frame and the height of the bar while keeping a 3 pixel 
+     distance from the top of the bar
+    """
+    cv2.putText(output_frame, text.capitalize(), (round(wc/6), hc-hb+3),
+                cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 0), 1, cv2.LINE_AA)
+
+    return output_frame
+
+
+# Initializing empty values
+text = ''
+seq, sentence = [], []
+HandsOnPrevFrames = [False]
+threshold = 0.90
+res = np.zeros(shape=signs.shape[0])
+# Set mediapipe model
+holistic = mp_holistic.Holistic(
+    min_detection_confidence=0.5, min_tracking_confidence=0.5)
+
+
+while cap.isOpened():
+
+    # Read feed
+    ret, frame = cap.read()
+
+    # Make detections
+    img, results = mediapipe_detection(frame, holistic)
+
+    # Loading the dimentions of cap and the assets
+    hb, wb, cb = BottomBar.shape
+    hc, wc, cc = img.shape
+    ht, wt, ct = TopBar.shape
+    # Draw landmarks
+    display_styled_landmarks(img, results)
+
+    # 2. Prediction logic
+
+    # Creates a history the Hands on Scene results
+    HandsOnPrevFrames.append(HandsOnScene(results))
+    HandsOnPrevFrames = HandsOnPrevFrames[-44:]
+
+    keypoints = extract_keypoints(results)
+
+    # If the hands are in the frame append the leypoints in seq to call the model to make predictions later
+    if True in HandsOnPrevFrames[-5:]:
+        if HandsOnScene(results):
+            seq.append(keypoints)
+            seq = seq[-24:]
+            text = grammar_correct((' '.join(sentence)))
+        # Else if hands are not in the scene for the last 5 frames clear sequence data
+        else:
+            seq = []
+            res = np.zeros(shape=len(signs))
+
+# if the hands are not visible in teh last 44 frames clearthe sentence and process the displayed text
+    if not True in HandsOnPrevFrames:
+        if len(sentence) > 0:
+            text = grammar_correct((' '.join(sentence)))
+        sentence = []
+
+    # If there are 24 frames in seq then call the model to predict
+    if len(seq) == seq_length:
+        res = model.predict(np.expand_dims(seq, axis=0))[0]
+
+        """
+        In case there is more than 60% the amount of needed data
+        call the model to predict in a new version of seq 
+        with randomly duplicated frames
+        """
+
+    elif len(seq) >= seq_length * 0.75:
+        missing = seq_length - len(seq)
+        seqpros = seq
+        for i in range(missing):
+            rand = random.randint(0, len(seq)-1)
+            seqpros.insert(rand, seq[rand])
+        res = model.predict(np.expand_dims(seqpros, axis=0))[0]
+        seqpros = []
+        res = np.zeros(shape=len(signs))
+
+    # 3. Viz logic
+
+    # If the probabillity of the most probable sign is more than the thershold
+    if res[np.argmax(res)] > threshold:
+        # Checking whether it is different than the last prediction then append it in the sentence
+        if len(sentence) > 0:
+            if signs[np.argmax(res)] != sentence[-1]:
+                sentence.append(signs[np.argmax(res)])
+        # If it is empty just add the prediction in the sentence
+        else:
+            sentence.append(signs[np.argmax(res)])
+
+    # Keep the last 6 phrases in sentence
+    sentence = sentence[-6:]
+
+    # Viaualizing probabilities
+    img = prob_vis(res, signs, img)
+
+    # Display the final image
+    cv2.imshow('SignTrack', img)
+
+    # End properly
+    if cv2.waitKey(10) & 0xFF == ord('q'):
+        break
+# Terminating the window
+cap.release()
+cv2.destroyAllWindows()
diff --git a/signtrack/__pycache__/Packr.cpython-37.pyc b/signtrack/__pycache__/Packr.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..39fd4e7ed97fc066bce1538b63693640e91b431e
Binary files /dev/null and b/signtrack/__pycache__/Packr.cpython-37.pyc differ
diff --git a/signtrack/__pycache__/__main__.cpython-37.pyc b/signtrack/__pycache__/__main__.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..68acd3879f5d5f142512243ae6ba6800be08cc3e
Binary files /dev/null and b/signtrack/__pycache__/__main__.cpython-37.pyc differ
diff --git a/signtrack/__pycache__/essentials.cpython-37.pyc b/signtrack/__pycache__/essentials.cpython-37.pyc
index f85b73b8d2e6f475fd6b6269629ee8bd3ecdc4bd..bbdd701fd3836ee581a865f07acd3275a2d53c49 100644
Binary files a/signtrack/__pycache__/essentials.cpython-37.pyc and b/signtrack/__pycache__/essentials.cpython-37.pyc differ
diff --git a/signtrack/essentials.py b/signtrack/essentials.py
index 7c0857b72978839cab936790271390a2e036bab4..98eaf2ebb37874a24780dfa09e58194f37783fa5 100644
--- a/signtrack/essentials.py
+++ b/signtrack/essentials.py
@@ -6,8 +6,15 @@ import mediapipe as mp
 mp_holistic = mp.solutions.holistic  # Holistic model
 mp_drawing = mp.solutions.drawing_utils  # Drawing utilities
 
+phrases = {('how you'): 'how are you?',
+           ('fine'): "I'm fine",
+           ('me fine me'): "I am fine"}
+
 
 def mediapipe_detection(img, model):
+    """
+    It is used to extract the hand and pose landmarks of the frame 
+    """
     # COLOR CONVERSION BGR 2 RGB
     img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
     img.flags.writeable = False                  # Image is no longer writeable
@@ -22,28 +29,61 @@ def draw_landmarks(img, results):
                               mp_holistic.HAND_CONNECTIONS)  # Draw left hand connections
     mp_drawing.draw_landmarks(img, results.right_hand_landmarks,
                               mp_holistic.HAND_CONNECTIONS)  # Draw right hand connections
+    mp_drawing.draw_landmarks(
+        img, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS)  # Draw pose connections
 
 
 def display_styled_landmarks(img, results):
     # Draw left hand connections
     mp_drawing.draw_landmarks(img, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS,
                               mp_drawing.DrawingSpec(
-                                  color=(121, 22, 76), thickness=2, circle_radius=4),
+                                  color=(128, 128, 0), thickness=1, circle_radius=0),
                               mp_drawing.DrawingSpec(
-                                  color=(121, 44, 250), thickness=2, circle_radius=2)
+                                  color=(128, 128, 0), thickness=1, circle_radius=0)
                               )
     # Draw right hand connections
     mp_drawing.draw_landmarks(img, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS,
                               mp_drawing.DrawingSpec(
-                                  color=(245, 117, 66), thickness=2, circle_radius=4),
+                                  color=(128, 128, 0), thickness=1, circle_radius=0),
+                              mp_drawing.DrawingSpec(
+                                  color=(128, 128, 0), thickness=1, circle_radius=0)
+                              )
+    # Draw pose connections
+    mp_drawing.draw_landmarks(img, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS,
+                              mp_drawing.DrawingSpec(
+                                  color=(204, 153, 204), thickness=1, circle_radius=0),
                               mp_drawing.DrawingSpec(
-                                  color=(245, 66, 230), thickness=2, circle_radius=2)
+                                  color=(204, 153, 204), thickness=1, circle_radius=0)
                               )
 
 
+# Checks if the hands are on the scene
+def HandsOnScene(results):
+    '''
+    Gets as an input the results from Medipipe predictions and outputs
+    whether the hands are present in the frame
+    '''
+    if not results.left_hand_landmarks and not results.right_hand_landmarks:
+        return False
+    else:
+        return True
+
+
 def extract_keypoints(results):
+    """
+    This is utilized to convert the keypoint results to a flat numpy array, thats is easy to save and proccess
+    """
     lh = np.array([[res.x, res.y, res.z] for res in results.left_hand_landmarks.landmark]).flatten(
     ) if results.left_hand_landmarks else np.zeros(21*3)
     rh = np.array([[res.x, res.y, res.z] for res in results.right_hand_landmarks.landmark]).flatten(
     ) if results.right_hand_landmarks else np.zeros(21*3)
-    return np.concatenate([lh, rh])
+    pose = np.array([[res.x, res.y, res.z, res.visibility] for res in results.pose_landmarks.landmark]).flatten(
+    ) if results.pose_landmarks else np.zeros(33*4)
+    return np.concatenate([lh, rh, pose])
+
+
+def grammar_correct(sentence):
+    for key in phrases:
+        if key in sentence:
+            sentence = (sentence.replace(key, phrases[key])).capitalize()
+    return sentence
diff --git a/signtrack/model.pack b/signtrack/model.pack
new file mode 100644
index 0000000000000000000000000000000000000000..5daf14e8f9b1aeade5e0b440dbc23b89065429f6
Binary files /dev/null and b/signtrack/model.pack differ
diff --git a/tests/Packr.py b/tests/Packr.py
new file mode 100644
index 0000000000000000000000000000000000000000..9b09e82398c310ddc4ed92758ecd41ef78ddbafc
--- /dev/null
+++ b/tests/Packr.py
@@ -0,0 +1,26 @@
+import zipfile
+from pathlib import Path
+import pandas as pd
+import numpy as np
+import os
+from os.path import exists
+
+
+def ModelPack(mpath, signs):
+    filename = 'model.pack'
+    if exists(filename):
+        try:
+            os.remove(filename)
+        except:
+            pass
+    with zipfile.ZipFile(filename, 'x') as file:
+        np.save('Insights/ModelID', signs)
+        file.write('Insights/ModelID.npy')
+        file.write(mpath)
+
+
+def ModelIDUnpack():
+    filename = 'model.pack'
+    with zipfile.ZipFile(filename, 'r') as file:
+        file.extractall('tmp/')
+        return "tmp/Insights/ModelID.npy"
diff --git a/tests/SignTrack.py b/tests/SignTrack.py
new file mode 100644
index 0000000000000000000000000000000000000000..22885153c7429ec1d4b2f928f6b965bde4229113
--- /dev/null
+++ b/tests/SignTrack.py
@@ -0,0 +1,242 @@
+from re import I
+from tensorflow.keras.models import Sequential
+from tensorflow.keras.layers import LSTM, Dense
+import cv2
+import cvzone
+import shutil
+import numpy as np
+import mediapipe as mp
+from essentials import mediapipe_detection, display_styled_landmarks, extract_keypoints, HandsOnScene, grammar_correct
+import Packr
+import random
+
+
+# The number of frames per sequence that the model has been trained on
+seq_length = 24
+
+# Choose camera input
+cap = cv2.VideoCapture(0)
+
+# Resize camera input
+cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
+cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
+
+shutil.rmtree('tmp', True)  # Erase previous temporary data
+
+# Unpacks the Model.Pack file and loads the features(signs) of the model
+signs = np.load(Packr.ModelIDUnpack())
+
+mp_holistic = mp.solutions.holistic  # Holistic model
+mp_drawing = mp.solutions.drawing_utils  # Drawing utilities
+
+# Setting up the model archtecture
+model = Sequential()
+model.add(LSTM(64, return_sequences=True,
+          activation='relu', input_shape=(24, 258)))
+model.add(LSTM(128, return_sequences=True, activation='relu'))
+model.add(LSTM(64, return_sequences=False, activation='relu'))
+model.add(Dense(64, activation='relu'))
+model.add(Dense(32, activation='relu'))
+model.add(Dense(signs.shape[0], activation='softmax'))
+
+# Loading the model
+model.load_weights("tmp/Insights/SignTrack.h5")
+
+shutil.rmtree('tmp', True)  # Erase temporary data
+
+
+# Import image assets and resize them to fit the output frame
+TopBar = cv2.imread("Assets/TopBar.png", cv2.IMREAD_UNCHANGED)
+TopBar = cv2.resize(TopBar, (0, 0), None, 0.36, 0.42)
+
+BottomBar = cv2.imread("Assets/BottomBar.png", cv2.IMREAD_UNCHANGED)
+BottomBar = cv2.resize(BottomBar, (0, 0), None, 0.36, 0.42)
+
+
+def prob_vis(res, actions, input_frame):
+    '''
+    It adds to the image a visualization
+    of the chances that an action apears in the
+    image
+    Returns the final image after the process
+
+    '''
+    output_frame = input_frame.copy()
+    resfin = {}
+    resfinshorted = {}
+    to_add = 0
+
+    # Create a dict including the possibility of each sign being in the frames as a percentage
+    for num, prob in enumerate(res):
+        resfin.update({round(prob*100, 2): actions[num]})
+
+    # Adding '--' for non existing values
+    to_add = 7 - len(resfin)
+    if 0 < to_add:
+        for i in range(to_add):
+            resfin.update({0.0001*i: '--'})
+
+    # Creating a shorted version of the dictionary with the most probable signs going first
+    for i in sorted(resfin, reverse=True):
+        resfinshorted[i] = resfin[i]
+
+    # Initializing lists with the shorted signs and their probability of their presence
+    ResValShorted = list(resfinshorted.values())
+    ResKeysShorted = list(resfinshorted.keys())
+
+    # Positioning the assets and the text on the image
+    """ 
+    Adds the bottom bar on the frame, the position is calculated :
+    For the X axis: by calculating half of the width of the frame
+     minus half of the width of the bottom bar
+    For the Y axis: by calculating the height of the frame minus
+     the height of the bar while leavig 17 pixels space from the top
+    """
+
+    output_frame = cvzone.overlayPNG(
+        output_frame, BottomBar, [round(wc/2-wb/2), round(hc-hb-17)])
+
+    """ 
+    Adds the top bar on the frame, the position is calculated :
+    For the X axis: by calculating half of the difference between 
+    the width of the frame and the width of the bottom bar
+    For the Y axis: by calculating the height of the bar minus 
+    the height of the bar devided by 1.5
+    """
+    output_frame = cvzone.overlayPNG(
+        output_frame, TopBar, [round((wc-wt)/2), round(ht-(ht/1.5))])
+
+    for i in range(6):
+        """
+        Prints the 6 most probable signs on the top bar,
+         the position is calculated knowing that:
+        For the X axis: the distance between each window is
+         105 pixels, while the first window is 52 pixels 
+         from 0 and that each letter has aproximately a 5.25
+         pixel width 
+        The Y axis possition remains the same at 35 pixels
+        """
+        cv2.putText(output_frame, str(ResValShorted[i]), ((round((52 + 105*(i)-len(ResValShorted[i])*5.25))),
+                                                          35), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 1, cv2.LINE_AA)
+    for i in range(3):
+        """
+        Prints the probabilities of the 3 most probable signs
+         on the top bar, the position is calculated knowing that:
+        For the X : the distance between each window is
+         105 pixels, while the first window is 46 from 0axis
+        The Y axis possition remains the same at 53 pixels
+        """
+        cv2.putText(output_frame, str(round(ResKeysShorted[i], 1)), ((round((46 + 105*(i)))),
+                                                                     53), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 0, 0), 1, cv2.LINE_AA)
+
+    """
+    Adds the sentence text on the bottom bar, the position is calculated by:
+    For the X axis: dividing the width of the frame by 6
+    For the Y axis: calculating the difference of the height of the
+     frame and the height of the bar while keeping a 3 pixel 
+     distance from the top of the bar
+    """
+    cv2.putText(output_frame, text.capitalize(), (round(wc/6), hc-hb+3),
+                cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 0), 1, cv2.LINE_AA)
+
+    return output_frame
+
+
+# Initializing empty values
+text = ''
+seq, sentence = [], []
+HandsOnPrevFrames = [False]
+threshold = 0.90
+res = np.zeros(shape=signs.shape[0])
+# Set mediapipe model
+holistic = mp_holistic.Holistic(
+    min_detection_confidence=0.5, min_tracking_confidence=0.5)
+
+
+while cap.isOpened():
+
+    # Read feed
+    ret, frame = cap.read()
+
+    # Make detections
+    img, results = mediapipe_detection(frame, holistic)
+
+    # Loading the dimentions of cap and the assets
+    hb, wb, cb = BottomBar.shape
+    hc, wc, cc = img.shape
+    ht, wt, ct = TopBar.shape
+    # Draw landmarks
+    display_styled_landmarks(img, results)
+
+    # 2. Prediction logic
+
+    # Creates a history the Hands on Scene results
+    HandsOnPrevFrames.append(HandsOnScene(results))
+    HandsOnPrevFrames = HandsOnPrevFrames[-44:]
+
+    keypoints = extract_keypoints(results)
+
+    # If the hands are in the frame append the leypoints in seq to call the model to make predictions later
+    if True in HandsOnPrevFrames[-5:]:
+        if HandsOnScene(results):
+            seq.append(keypoints)
+            seq = seq[-24:]
+            text = grammar_correct((' '.join(sentence)))
+        # Else if hands are not in the scene for the last 5 frames clear sequence data
+        else:
+            seq = []
+            res = np.zeros(shape=len(signs))
+
+# if the hands are not visible in teh last 44 frames clearthe sentence and process the displayed text
+    if not True in HandsOnPrevFrames:
+        if len(sentence) > 0:
+            text = grammar_correct((' '.join(sentence)))
+        sentence = []
+
+    # If there are 24 frames in seq then call the model to predict
+    if len(seq) == seq_length:
+        res = model.predict(np.expand_dims(seq, axis=0))[0]
+
+        """
+        In case there is more than 60% the amount of needed data
+        call the model to predict in a new version of seq 
+        with randomly duplicated frames
+        """
+
+    elif len(seq) >= seq_length * 0.75:
+        missing = seq_length - len(seq)
+        seqpros = seq
+        for i in range(missing):
+            rand = random.randint(0, len(seq)-1)
+            seqpros.insert(rand, seq[rand])
+        res = model.predict(np.expand_dims(seqpros, axis=0))[0]
+        seqpros = []
+        res = np.zeros(shape=len(signs))
+
+    # 3. Viz logic
+
+    # If the probabillity of the most probable sign is more than the thershold
+    if res[np.argmax(res)] > threshold:
+        # Checking whether it is different than the last prediction then append it in the sentence
+        if len(sentence) > 0:
+            if signs[np.argmax(res)] != sentence[-1]:
+                sentence.append(signs[np.argmax(res)])
+        # If it is empty just add the prediction in the sentence
+        else:
+            sentence.append(signs[np.argmax(res)])
+
+    # Keep the last 6 phrases in sentence
+    sentence = sentence[-6:]
+
+    # Viaualizing probabilities
+    img = prob_vis(res, signs, img)
+
+    # Display the final image
+    cv2.imshow('SignTrack', img)
+
+    # End properly
+    if cv2.waitKey(10) & 0xFF == ord('q'):
+        break
+# Terminating the window
+cap.release()
+cv2.destroyAllWindows()
diff --git a/tests/SignTrack_DataColect.py b/tests/SignTrack_DataColect.py
new file mode 100644
index 0000000000000000000000000000000000000000..a0049c57066d7f241c9f52565302b9d614039122
--- /dev/null
+++ b/tests/SignTrack_DataColect.py
@@ -0,0 +1,195 @@
+# Importing dependancies
+
+import cv2
+import cvzone
+import numpy as np
+import os
+import mediapipe as mp
+from pathlib import Path
+from essentials import mediapipe_detection, extract_keypoints, display_styled_landmarks
+
+# Dataset export location, Changing requires changes in Signtrack_Train
+data_path = os.path.join('Dataset')
+
+# Actions that we try to detect, Changing requires changes in Signtrack_Train
+signs = np.array(["sorry"])
+
+# Number of sequences to be collected for each action
+no_datapacks = 25
+
+# Frames per sequence, Changing requires changes in Signtrack_Train
+seq_length = 24
+
+# Choose camera input
+cap = cv2.VideoCapture(1)
+
+# Resize camera input
+cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
+cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
+
+mp_holistic = mp.solutions.holistic  # Holistic model
+mp_drawing = mp.solutions.drawing_utils  # Drawing utilities
+
+
+def existing_data(sign):
+    '''
+    Checks for existing data in the
+    dataset folder, to avoid errors while
+    saving new data.
+    '''
+    existing_data = 0
+    path = Path(data_path + '/' + sign)
+    if path.exists():
+        existing_data = len(os.listdir(data_path + '/' + sign))
+    return existing_data
+
+
+for sign in signs:
+    '''
+    Generates new empty forlders,
+    after taking into account existing data,
+    where new data wil be saved.
+    '''
+    exdt = existing_data(sign)
+    for seq in range(no_datapacks * 2):
+        try:
+            os.makedirs(os.path.join(data_path, sign,
+                        str((seq) + exdt)))
+        except:
+            pass
+
+# Import image assets and resize them to fit the output frame
+
+AssetCol = cv2.imread("Assets/Asset_col.png", cv2.IMREAD_UNCHANGED)
+AssetCol = cv2.resize(AssetCol, (0, 0), None, 0.5, 0.5)
+
+AssetNCol = cv2.imread("Assets/Asset_ncol.png", cv2.IMREAD_UNCHANGED)
+AssetNCol = cv2.resize(AssetNCol, (0, 0), None, 0.5, 0.5)
+
+AssetCircle = cv2.imread("Assets/Circle.png", cv2.IMREAD_UNCHANGED)
+AssetCircle = cv2.resize(AssetCircle, (0, 0), None, 0.5, 0.5)
+
+AssetBar = cv2.imread("Assets/Bar.png", cv2.IMREAD_UNCHANGED)
+AssetBar = cv2.resize(AssetBar, (0, 0), None, 0.5, 0.5)
+
+
+def Graphics(img, sign, sequence, collecting):
+    '''
+        Add the text and the assets to the final
+        display output
+    '''
+    # Adds the circle around the number of sequence
+    # It is displayed at the 1/3 of frame's width (centered)
+    # And at the frame's heignt minus it's height
+    img = cvzone.overlayPNG(
+        img, AssetCircle, [round((wb/3-wc/2)/2), hb-hf])
+
+    # Adds the bar around the current collected sign
+    # It is displayed at the 1/4 of frame's width from the right (centered)
+    # Vertically, it is located at the lowest part of the picture
+    img = cvzone.overlayPNG(
+        img, AssetBar, [round(wb-wb/4-wc/2), hb-hf])
+
+    # This adds the text of the sequence counter
+    # Its location is exactly the same as of its circle around it
+    # Only difference is that its possition also changes
+    #  regarding the number of letters
+    cv2.putText(img, str(sequence), (round((wb/3-wc/2)/2 - (len(str(sequence)))*7.5 + 28),
+                hb-hf+23), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 1, cv2.LINE_AA)
+
+    # Prints the curent collected sign in the frame
+    # Its location is exactly the same as of its bar around it
+    # Only difference is that its possition also changes
+    #  regarding the number of letters
+    cv2.putText(img, str(sign), (round(wb-wb/4-wc/2 + wbar/2-len(sign)*7.5), hb-hf+22),
+                cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 1, cv2.LINE_AA)
+
+    # Displaying the collecting indication at the center
+    if collecting == True:
+        img = cvzone.overlayPNG(
+            img, AssetCol, [round(wb/2-wf/2), hb-hf])
+    else:
+        img = cvzone.overlayPNG(
+            img, AssetNCol, [round(wb/2-wf/2), hb-hf])
+    return img
+
+
+# Setting mediapipe parameters amd initiaize a diferent model for the flipped image
+'''
+Mediapipe uses an LSTM model, just like SignTrack, that means that the results are made 
+based on a sequence of data. Thus when trying to make predictions on the flipped image it is 
+important to utilize a different version of the Mediapipe model, to avoit the model's confusion.
+'''
+
+holisticf = mp_holistic.Holistic(
+    min_detection_confidence=0.5, min_tracking_confidence=0.5)
+
+holistic = mp_holistic.Holistic(
+    min_detection_confidence=0.5, min_tracking_confidence=0.5)
+
+
+def DataAugm(frame):
+    '''
+        Gets as input a frame and outputs the keypoints data of the flipped image
+    '''
+    frame_fliped = cv2.flip(frame, 1)
+    img_flipped, results_flipped = mediapipe_detection(
+        frame_fliped, holisticf)
+    keypoints_flipped = extract_keypoints(results_flipped)
+    return keypoints_flipped
+
+
+# Loop through each sign
+for sign in signs:
+    exdt = existing_data(sign) - (no_datapacks * 2)
+    # Loop through sequences aka videos
+    for seq in range(no_datapacks):
+        # Loop through video length aka sequence length
+        for frame_num in range(seq_length):
+
+            # Read camera feed
+            ret, frame = cap.read()
+
+            # Detect hand and pose landmarks
+            img, results = mediapipe_detection(frame, holistic)
+
+            # Loading the dimentions of cap and the assets
+            hf, wf, cf = AssetCol.shape
+            hb, wb, cb = img.shape
+            hc, wc, cc = AssetCircle.shape
+            hbar, wbar, cbar = AssetBar.shape
+
+            # Draw landmarks
+            display_styled_landmarks(img, results)
+
+            '''
+            The wait logic,
+            If the collected sequence is on its first frame, 
+            changes the apearence of the image accordingly.
+            '''
+            if frame_num == 0:
+                cv2.imshow('SignTrack Data Collect',
+                           Graphics(img, sign, seq, False))
+                cv2.waitKey(700)
+            else:
+                cv2.imshow('SignTrack Data Collect',
+                           Graphics(img, sign, seq, True))
+
+            # Export keypoints
+            keypoints = extract_keypoints(results)
+
+            # Save the landmarks as an numpy array
+            npy_path = os.path.join(
+                data_path, sign, str((2 * seq) + exdt), str(frame_num))
+            np.save(npy_path, keypoints)
+
+            # Save the landmarks of the flipped image as an numpy array
+            npy_path_flipped = os.path.join(
+                data_path, sign, str((2 * seq + 1) + exdt), str(frame_num))
+            np.save(npy_path_flipped, DataAugm(frame))
+
+            if cv2.waitKey(10) & 0xFF == ord('q'):
+                break
+
+cap.release()
+cv2.destroyAllWindows()
diff --git a/tests/SignTrack_Train.py b/tests/SignTrack_Train.py
new file mode 100644
index 0000000000000000000000000000000000000000..5a54a5964a7efe46f1b8ed3b8480ec7bdf819ced
--- /dev/null
+++ b/tests/SignTrack_Train.py
@@ -0,0 +1,89 @@
+from calendar import EPOCH
+from tensorflow.keras.layers import LSTM, Dense
+from tensorflow.keras.models import Sequential
+from keras.callbacks import History
+import numpy as np
+import os
+from matplotlib import pyplot as plt
+from sklearn.model_selection import train_test_split
+from tensorflow.keras.utils import to_categorical
+
+from Packr import ModelPack
+
+# Path for exported data, numpy arrays
+DATA_PATH = os.path.join('Dataset')
+
+# Path to save model
+MODEL_PATH = 'Insights/SignTrack.h5'
+
+# Signs that we try to detect
+signs = np.array(['no', 'thank you', 'me', 'please', 'good', 'morning', 'want', 'go to', 'night', 'how',
+                  'hello', "what's up", 'yes', 'fine', 'see you later', 'like', 'afternoon', 'you', 'goodbye', 'sorry'])
+
+# Videos are going to be 24 frames in length
+sequence_length = 24
+
+# Creating a label map, where each sign is assigned to a specific numerical value
+label_map = {label: num for num, label in enumerate(signs)}
+
+# Importing data from dataset
+sequences, labels = [], []
+for sign in signs:
+    print('Importing data for {}...'.format(sign))
+    dirs = os.listdir('Dataset/' + sign)
+    for dir in dirs:
+        window = []
+        for frame_num in range(sequence_length):
+            res = np.load(os.path.join(DATA_PATH, sign, str(
+                dir), "{}.npy".format(frame_num)))
+            window.append(res)
+        sequences.append(window)
+        labels.append(label_map[sign])
+    print('Data for {} imported'.format(sign))
+
+X = np.array(sequences)
+y = to_categorical(labels).astype(int)
+
+log_dir = os.path.join('Insights')
+
+# Splitting dataset into Train_Set and Test_set
+X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15)
+
+# Setting up model parameters
+
+# Our model is set so that it predicts based on a sequence of data
+model = Sequential()
+# Adds an LSTM layer with 64 neurons, that returns its results, activation method is Relu (most common for CNNs)
+# to continue on the next layer, with an input shape of (frames per sequence, number of keypoints)
+model.add(LSTM(64, return_sequences=True,
+          activation='relu', input_shape=(24, 258)))
+# Adding an 128 neuron LSTM layer
+model.add(LSTM(128, return_sequences=True, activation='relu'))
+# Adding an 64 neuron LSTM layer this time without returning the data
+model.add(LSTM(64, return_sequences=False, activation='relu'))
+model.add(Dense(64, activation='relu'))
+model.add(Dense(32, activation='relu'))
+model.add(Dense(signs.shape[0], activation='softmax'))
+
+
+AutoTrain = model.compile(optimizer='Adam', loss='categorical_crossentropy')
+
+loss = 1
+
+AutoTrain = model.fit(X_train, y_train, epochs=1)
+
+for i in range(1000):
+    if AutoTrain.history['loss'][-1] >= 0.04:
+        AutoTrain = model.fit(X_train, y_train, epochs=1)
+        if AutoTrain.history['loss'][-1] < loss:
+
+            try:
+                os.remove(MODEL_PATH)
+            except:
+                pass
+
+            model.save(MODEL_PATH)
+
+            loss = AutoTrain.history['loss'][-1]
+
+ModelPack(MODEL_PATH, signs)
diff --git a/tests/__pycache__/Packr.cpython-37.pyc b/tests/__pycache__/Packr.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c7872d53133091b59d723171827e4795cbec3256
Binary files /dev/null and b/tests/__pycache__/Packr.cpython-37.pyc differ
diff --git a/tests/__pycache__/essentials.cpython-37.pyc b/tests/__pycache__/essentials.cpython-37.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e7ca6da5b7647920e5e717aa69a7a3a478a1cef1
Binary files /dev/null and b/tests/__pycache__/essentials.cpython-37.pyc differ
diff --git a/tests/essentials.py b/tests/essentials.py
new file mode 100644
index 0000000000000000000000000000000000000000..efb38495141e8fdbc27fde8726be848eaf8fce62
--- /dev/null
+++ b/tests/essentials.py
@@ -0,0 +1,89 @@
+import numpy as np
+import cv2
+import numpy as np
+import mediapipe as mp
+
+mp_holistic = mp.solutions.holistic  # Holistic model
+mp_drawing = mp.solutions.drawing_utils  # Drawing utilities
+
+phrases = {('how you'): 'how are you',
+           ('fine'): "I'm fine",
+           ('me fine me'): "I am fine"}
+
+
+def mediapipe_detection(img, model):
+    """
+    It is used to extract the hand and pose landmarks of the frame 
+    """
+    # COLOR CONVERSION BGR 2 RGB
+    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
+    img.flags.writeable = False                  # Image is no longer writeable
+    results = model.process(img)                 # Make prediction
+    img.flags.writeable = True                   # Image is now writeable
+    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)  # COLOR COVERSION RGB 2 BGR
+    return img, results
+
+
+def draw_landmarks(img, results):
+    mp_drawing.draw_landmarks(img, results.left_hand_landmarks,
+                              mp_holistic.HAND_CONNECTIONS)  # Draw left hand connections
+    mp_drawing.draw_landmarks(img, results.right_hand_landmarks,
+                              mp_holistic.HAND_CONNECTIONS)  # Draw right hand connections
+    mp_drawing.draw_landmarks(
+        img, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS)  # Draw pose connections
+
+
+def display_styled_landmarks(img, results):
+    # Draw left hand connections
+    mp_drawing.draw_landmarks(img, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS,
+                              mp_drawing.DrawingSpec(
+                                  color=(128, 128, 0), thickness=1, circle_radius=0),
+                              mp_drawing.DrawingSpec(
+                                  color=(128, 128, 0), thickness=1, circle_radius=0)
+                              )
+    # Draw right hand connections
+    mp_drawing.draw_landmarks(img, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS,
+                              mp_drawing.DrawingSpec(
+                                  color=(128, 128, 0), thickness=1, circle_radius=0),
+                              mp_drawing.DrawingSpec(
+                                  color=(128, 128, 0), thickness=1, circle_radius=0)
+                              )
+    # Draw pose connections
+    mp_drawing.draw_landmarks(img, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS,
+                              mp_drawing.DrawingSpec(
+                                  color=(204, 153, 204), thickness=1, circle_radius=0),
+                              mp_drawing.DrawingSpec(
+                                  color=(204, 153, 204), thickness=1, circle_radius=0)
+                              )
+
+
+# Checks if the hands are on the scene
+def HandsOnScene(results):
+    '''
+    Gets as an input the results from Medipipe predictions and outputs
+    whether the hands are present in the frame
+    '''
+    if not results.left_hand_landmarks and not results.right_hand_landmarks:
+        return False
+    else:
+        return True
+
+
+def extract_keypoints(results):
+    """
+    This is utilized to convert the keypoint results to a flat numpy array, thats is easy to save and proccess
+    """
+    lh = np.array([[res.x, res.y, res.z] for res in results.left_hand_landmarks.landmark]).flatten(
+    ) if results.left_hand_landmarks else np.zeros(21*3)
+    rh = np.array([[res.x, res.y, res.z] for res in results.right_hand_landmarks.landmark]).flatten(
+    ) if results.right_hand_landmarks else np.zeros(21*3)
+    pose = np.array([[res.x, res.y, res.z, res.visibility] for res in results.pose_landmarks.landmark]).flatten(
+    ) if results.pose_landmarks else np.zeros(33*4)
+    return np.concatenate([lh, rh, pose])
+
+
+def grammar_correct(sentence):
+    for key in phrases:
+        if key in sentence:
+            sentence = sentence.replace(key, phrases[key])
+    return sentence
diff --git a/tests/model.pack b/tests/model.pack
new file mode 100644
index 0000000000000000000000000000000000000000..0c5d4cafdfced3a552cdeb91a76a339f775de85c
Binary files /dev/null and b/tests/model.pack differ