Repository: AccelQuasarDragon/FastCVApp (language: python)

Issue:
update readme.txt in examples folder
uh, idk maybe copy the md file or smth?
updated readme but this should be done at the same time as im doing the github pages
there is a real bug with seek/play/pause: PARITY
- [x] i know the problem: I schedule the delay blit but ACTUALLY I should first CANCEL the old one THEN schedule delay blit. there is another problem where pause only pauses for ~5 sec and I think that's it
- [x] another one is when you release it might force a play because im mimicking the yt player
- [x] think it's cleared?
double click on mac is wrekt (could skip this tbh)
- [x] it leaves a red dot
- [x] https://stackoverflow.com/questions/68999371/kivy-remove-the-red-dot-creation-on-right-clic
- [x] have to disable multitouch before importing other kivy
- [x] https://stackoverflow.com/a/37572966
- [x] confirmed it works


Discussion / hints:

Fix patch:
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index af460ff..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,167 +0,0 @@
-Love Trial 720p.mp4
-cottonbro studio.mp4
-edge_video.mp4
-pexels-artem-podrez-6003986 1080p.mp4
-pexels-artem-podrez-6003986 720p.mp4
-pexels-artem-podrez-6003986.mp4
-test/skvideo test.py
-【4K⧸60fps⧸MMD】  恋愛裁判 ⧸ Love Trial — YYB 初音MIKU.webm
-【4K⧸60fps⧸MMD】  恋愛裁判 ⧸ Love Trial — YYB 初音MIKU.mp3
-【4K⧸60fps⧸MMD】  恋愛裁判 ⧸ Love Trial — YYB 初音MIKU.f315.webm
-【4K⧸60fps⧸MMD】  恋愛裁判 ⧸ Love Trial — YYB 初音MIKU.f251.webm
-pexels-cottonbro-7791121 1080p.mp4
-pexels-cottonbro-7791121 720p.mp4
-pexels-cottonbro-7791121.mp4
-poetry.lock
-media
-creativecommonsmedia/Elephants Dream charstart.webm
-#creativecommonsmedia/
-examples/build
-examples/dist/MediapipeExample.exe
-BigBuckBunny.mp4
-Elephants Dream charstart2FULL.webm
-cynicalnightplan.mp4
-[MMD] Cynical Night Plan YYB式初音ミク[PV] [OICZAZrm8o8].webm
-Cynical Night Plan YYB 式初音ミク.webm
-
-# test/
-.DS_Store
-site
-
-
-
-launch.json
-
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-wheels/
-pip-wheel-metadata/
-share/python-wheels/
-*.egg-info/
-.installed.cfg
-*.egg
-MANIFEST
-
-# PyInstaller
-#  Usually these files are written by a python script from a template
-#  before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-#*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.nox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*.cover
-*.py,cover
-.hypothesis/
-.pytest_cache/
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-local_settings.py
-db.sqlite3
-db.sqlite3-journal
-
-# Flask stuff:
-instance/
-.webassets-cache
-
-# Scrapy stuff:
-.scrapy
-
-# Sphinx documentation
-docs/_build/
-
-# PyBuilder
-target/
-
-# Jupyter Notebook
-.ipynb_checkpoints
-
-# IPython
-profile_default/
-ipython_config.py
-
-# pyenv
-.python-version
-
-# pipenv
-#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
-#   However, in case of collaboration, if having platform-specific dependencies or dependencies
-#   having no cross-platform support, pipenv may install dependencies that don't work, or not
-#   install all needed dependencies.
-#Pipfile.lock
-
-# PEP 582; used by e.g. github.com/David-OConnor/pyflow
-__pypackages__/
-
-# Celery stuff
-celerybeat-schedule
-celerybeat.pid
-
-# SageMath parsed files
-*.sage.py
-
-# Environments
-.env
-.venv
-env/
-venv/
-ENV/
-env.bak/
-venv.bak/
-
-# Spyder project settings
-.spyderproject
-.spyproject
-
-# Rope project settings
-.ropeproject
-
-# mkdocs documentation
-/site
-
-# mypy
-.mypy_cache/
-.dmypy.json
-dmypy.json
-
-# Pyre type checker
-.pyre/
-test/2023 June 9 cleanup/examples/creativecommonsmedia/Elephants Dream 2s.webm
-test/2023 June 9 cleanup/examples/creativecommonsmedia/Elephants Dream charstart2.webm
-FastCVApp/MediapipeExample.exe
-FastCVApp/MediapipeExample.exe
diff --git a/FastCVApp/__init__.py b/.vscode/settings.json
similarity index 100%
rename from FastCVApp/__init__.py
rename to .vscode/settings.json
diff --git a/FastCVApp/FCVAutils.py b/FastCVApp/FCVAutils.py
deleted file mode 100644
index f473e62..0000000
--- a/FastCVApp/FCVAutils.py
+++ /dev/null
@@ -1,53 +0,0 @@
-import os
-import time
-import sys
-import shutil
-
-def fprint(*args):
-	print(os.getpid(), time.time(), *args, flush = True)
-
-def FCVA_update_resources(*args, sourcelocationVAR = False):
-	'''
-	this is to update paths, for example when an app is packaged with pyinstaller
-	#keyword argument notes: https://treyhunner.com/2018/04/keyword-arguments-in-python/#What_are_keyword_arguments? 
-	ALSO ON MAC: it fixes getcwd to be the location of the pyinstaller exe as per: https://stackoverflow.com/questions/50563950/about-maos-python-building-applications-os-getcwd-to-return-data-problems
-	https://stackoverflow.com/a/50564083
-	'''
-	if hasattr(sys, "_MEIPASS"):
-		# if file is frozen by pyinstaller add the MEIPASS folder to path:
-		sys.path.append(sys._MEIPASS) 
-		#the path is duplicated, maybe that's why it's running twice?
-		#possibly pyinstaller updated
-		print("MMEIPAS APPENDED CORRECT?", sys._MEIPASS)
-		#solution: when u run the exe, check for the file/folder and if it's there or not > then if not copy it from tmpdir
-		if sourcelocationVAR:
-			from sys import platform
-			if platform == "darwin":
-				# https://stackoverflow.com/a/50564083
-				# You can use os.chdir(path) to explicitly set the pwd to the above path.
-				os.chdir(os.path.dirname(sys.executable))
-
-			tempsource = sys._MEIPASS + os.sep + sourcelocationVAR
-			actualsource = os.getcwd() + os.sep + sourcelocationVAR
-			print("cwd????", os.getcwd(), __file__)
-			import pathlib
-			# print("dwc", os.chdir(pathlib.Path(os.path.dirname(os.path.abspath(__file__)))))
-			# print("dwc2", os.path.dirname(sys.executable))
-			# mac getcwd is hell 
-			# https://stackoverflow.com/questions/50563950/about-maos-python-building-applications-os-getcwd-to-return-data-problems
-			# https://stackoverflow.com/questions/54837659/python-pyinstaller-on-mac-current-directory-problem
-			print("what is tempsource?", tempsource, not os.path.isfile(actualsource), "actual", actualsource)
-			if not os.path.isfile(actualsource):
-				#copy to current directory:
-				#again filpaths are a pain, mac needs the initial slash: /var/temp NOT var/temp
-				if platform == "win32":
-					tempsourcefolder = os.path.join(*tempsource.split(os.sep)[:-1]) 
-				if platform == "darwin":
-					tempsourcefolder = os.path.join(os.sep, *tempsource.split(os.sep)[:-1]) 
-				# actualsourcefolder = os.path.join(*actualsource.split(os.sep)[:-1]) 
-				# rootguyvar = os.path.dirname(__file__)
-				# fprint("what is this folder?", sourcelocationVAR, "===", *sourcelocationVAR.split(os.sep)[:-1], "===", tempsourcefolder)
-				actualsourcefolder = os.path.join(*sourcelocationVAR.split(os.sep)[:-1]) 
-				shutil.copytree(tempsourcefolder, actualsourcefolder, dirs_exist_ok = True)
-				# existsornot = os.path.isdir(actualsourcefolder)
-				# print("copyanything", tempsourcefolder, actualsourcefolder, existsornot)
diff --git a/FastCVApp/examples/example_backgroundsubtraction.py b/FastCVApp/examples/example_backgroundsubtraction.py
deleted file mode 100644
index af45c04..0000000
--- a/FastCVApp/examples/example_backgroundsubtraction.py
+++ /dev/null
@@ -1,65 +0,0 @@
-import sys
-
-if hasattr(sys, "_MEIPASS"):
-    # if file is frozen by pyinstaller add the MEIPASS folder to path:
-    #FCVA_update_resources has the sys.path.append(sys._MEIPASS)
-    pass
-else:
-    # if you're making your own app, you don't need this else block. This is just vanity code so I can run this from main FastCVApp folder or from the examples subfolder.
-    # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
-    import os
-
-    # add the right path depending on if you're running from examples or from main folder:
-    if "examples" in os.getcwd().split(os.path.sep)[-1]:
-        sys.path.append(
-            ".."
-        )  # when running from examples folder, append the upper level
-    else:
-        # assume they're in main folder trying `python examples/example_backgroundsubtraction.py`
-        sys.path.append("../FastCVApp")  # when running from main folder
-
-from FCVAutils import FCVA_update_resources
-# / and \ works on windows, only / on mac tho. the solution is to just os.path.join and os.sep for the separator
-sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4") 
-
-FCVA_update_resources(sourcelocationVAR=sourcelocation)
-
-import cv2
-backSub = cv2.createBackgroundSubtractorMOG2()
-
-from collections import deque
-
-def open_backsub(*args):
-    # reference: https://docs.opencv.org/3.4/d1/dc5/tutorial_background_subtraction.html
-    try:
-        # print(args, flush = True)
-        inputdeque = args[0]
-        # FCVAWidget_shared_metadata_dictVAR3 = args[1]
-        bufferlenVAR = args[2]
-        answerdeque = deque(maxlen=bufferlenVAR)
-        landmarkerVAR = args[3]
-        raw_dequeKEYSVAR = args[4]
-        force_monotonic_increasingVAR = args[5]
-
-        while len(inputdeque) > 0:
-            image = inputdeque.popleft()
-            image = backSub.apply(image)
-            image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)
-            # image = cv2.flip(image, 0)
-            answerdeque.append(image)
-        # print("aqlenEND", len(answerdeque),flush = True)
-        return answerdeque
-    except Exception as e:
-        print("open_backsub subprocess died! ", e, flush=True)
-
-if __name__ == "__main__":
-    import multiprocessing 
-    multiprocessing.freeze_support()
-    import FastCVApp
-    app = FastCVApp.FCVA()
-    app.appliedcv = open_backsub
-
-    app.source = sourcelocation
-    app.fps = 1 / 30
-    app.title = "Background subtraction example by Pengindoramu"
-    app.run()
diff --git a/FastCVApp/examples/example_cannyedge.py b/FastCVApp/examples/example_cannyedge.py
deleted file mode 100644
index dd25e83..0000000
--- a/FastCVApp/examples/example_cannyedge.py
+++ /dev/null
@@ -1,68 +0,0 @@
-import sys
-
-if hasattr(sys, "_MEIPASS"):
-    # if file is frozen by pyinstaller add the MEIPASS folder to path:
-    #FCVA_update_resources has the sys.path.append(sys._MEIPASS)
-    pass
-else:
-    # if you're making your own app, you don't need this else block. This is just vanity code so I can run this from main FastCVApp folder or from the examples subfolder.
-    # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
-    import os
-
-    # add the right path depending on if you're running from examples or from main folder:
-    if "examples" in os.getcwd().split(os.path.sep)[-1]:
-        sys.path.append(
-            ".."
-        )  # when running from examples folder, append the upper level
-    else:
-        # assume they're in main folder trying `python examples/example_backgroundsubtraction.py`
-        sys.path.append("../FastCVApp")  # when running from main folder
-
-from FCVAutils import FCVA_update_resources
-sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4") 
-FCVA_update_resources(sourcelocationVAR=sourcelocation)
-
-import cv2
-from collections import deque
-
-def canny_filter(*args):
-    try:
-        # reference: https://docs.opencv.org/4.x/da/d5c/tutorial_canny_detector.html
-        inputdeque = args[0]
-        # FCVAWidget_shared_metadata_dictVAR3 = args[1]
-        bufferlenVAR = args[2]
-        answerdeque = deque(maxlen=bufferlenVAR)
-        landmarkerVAR = args[3]
-        raw_dequeKEYSVAR = args[4]
-        force_monotonic_increasingVAR = args[5]
-
-        low_threshold = 50
-        ratio = 3
-        kernel_size = 3
-        
-        while len(inputdeque) > 0:
-            image = inputdeque.popleft()
-            src_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
-            img_blur = cv2.blur(src_gray, (3, 3))
-            detected_edges = cv2.Canny(
-                img_blur, low_threshold, low_threshold * ratio, kernel_size
-            )
-            mask = detected_edges != 0
-            image = image * (mask[:, :, None].astype(image.dtype))
-            answerdeque.append(image)
-        return answerdeque
-    except Exception as e:
-        print("canny_filter subprocess died! ", e, flush=True)
-
-if __name__ == "__main__":
-    import multiprocessing 
-    multiprocessing.freeze_support()
-    import FastCVApp
-    app = FastCVApp.FCVA()
-    app.appliedcv = canny_filter
-
-    # / and \ works on windows, only / on mac tho
-    app.source = sourcelocation
-    app.fps = 1 / 30
-    app.title = "Canny edge example by Pengindoramu"
-    app.run()
diff --git a/FastCVApp/examples/example_haarcascade.py b/FastCVApp/examples/example_haarcascade.py
deleted file mode 100644
index c89a2f1..0000000
--- a/FastCVApp/examples/example_haarcascade.py
+++ /dev/null
@@ -1,107 +0,0 @@
-import sys
-
-if hasattr(sys, "_MEIPASS"):
-    # if file is frozen by pyinstaller add the MEIPASS folder to path:
-    #FCVA_update_resources has the sys.path.append(sys._MEIPASS)
-    pass
-else:
-    # if you're making your own app, you don't need this else block. This is just vanity code so I can run this from main FastCVApp folder or from the examples subfolder.
-    # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
-    import os
-
-    # add the right path depending on if you're running from examples or from main folder:
-    if "examples" in os.getcwd().split(os.path.sep)[-1]:
-        sys.path.append(
-            ".."
-        )  # when running from examples folder, append the upper level
-    else:
-        # assume they're in main folder trying `python examples/example_backgroundsubtraction.py`
-        sys.path.append("../FastCVApp")  # when running from main folder
-
-from FCVAutils import FCVA_update_resources
-sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4") 
-FCVA_update_resources(sourcelocationVAR=sourcelocation)
-import cv2
-from collections import deque
-
-
-
-if hasattr(sys, "_MEIPASS"):
-    # if file is frozen by pyinstaller add the MEIPASS folder to path:
-    sys.path.append(sys._MEIPASS)
-    import os
-
-    # add the haarcascade xml because it needs to be loaded to run. Look for it in the MEIPASS folder that pyInstaller unzips to
-    sourcing = os.path.join(
-        sys._MEIPASS + os.sep + "haarcascade_frontalface_default.xml"
-    )
-    # print("source?", sourcing, flush = True)
-    face_cascade = cv2.CascadeClassifier(sourcing)
-else:
-    # this example is importing from a higher level package: https://stackoverflow.com/a/41575089
-    sys.path.append("../FastCVApp")
-    face_cascade = cv2.CascadeClassifier(
-        cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
-    )
-
-# print("facecascade loaded?", face_cascade, flush = True)
-
-def cascade_this(*args):
-    try:
-        # reference: https://stackoverflow.com/questions/70805922/why-does-the-haarcascades-does-not-work-on-opencv
-        inputdeque = args[0]
-        # FCVAWidget_shared_metadata_dictVAR3 = args[1]
-        bufferlenVAR = args[2]
-        answerdeque = deque(maxlen=bufferlenVAR)
-        landmarkerVAR = args[3]
-        raw_dequeKEYSVAR = args[4]
-        force_monotonic_increasingVAR = args[5]
-
-        # w_size = (700,500) #still too large, facetimetime is 0.133 sec which is forever
-        w_size = (256,144)
-
-        import time
-        from FCVAutils import fprint
-        while len(inputdeque) > 0:
-            image = inputdeque.popleft()
-            
-            #yikes haarcascades are slow...
-            #plan is to resize  do the mediapipestrat where you apply haarcascade on a smaller image then rescale to original
-            gray = cv2.resize(image,w_size)
-            gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
-
-            wtime = time.time()
-            faces = face_cascade.detectMultiScale(
-                gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)
-            )
-            facetimetime = time.time()
-            fprint("haarcascade is 5 fps, too slow (need ~6 subprocesses, my test machine can't handle it at 3 since it already goes to 100 percent cpu at 3)", facetimetime - wtime)
-
-            for (x, y, w, h) in faces:
-                cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
-            fprint("recttime", time.time() - facetimetime)
-            
-            answerdeque.append(image)
-        return answerdeque
-        
-        
-        
-    except Exception as e:
-        print("cascade_this subprocess died! ", e, flush=True)
-
-
-
-if __name__ == "__main__":
-    import multiprocessing 
-    multiprocessing.freeze_support()
-    import FastCVApp
-    app = FastCVApp.FCVA()
-    app.appliedcv = cascade_this
-    # / and \ works on windows, only / on mac tho
-    app.source = sourcelocation
-    app.cvpartitions = 6
-    app.fps = 1 / 30
-    app.title = (
-        'Haarcascade example by Pengindoramu ("works" but Mediapipe is a lot better)'
-    )
-    app.run()
diff --git a/FastCVApp/examples/example_identityfunc.py b/FastCVApp/examples/example_identityfunc.py
deleted file mode 100644
index 4dfcee6..0000000
--- a/FastCVApp/examples/example_identityfunc.py
+++ /dev/null
@@ -1,65 +0,0 @@
-import sys
-
-if hasattr(sys, "_MEIPASS"):
-    # if file is frozen by pyinstaller add the MEIPASS folder to path:
-    #FCVA_update_resources has the sys.path.append(sys._MEIPASS)
-    pass
-else:
-    # if you're making your own app, you don't need this else block. This is just vanity code so I can run this from main FastCVApp folder or from the examples subfolder.
-    # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
-    import os
-
-    # add the right path depending on if you're running from examples or from main folder:
-    if "examples" in os.getcwd().split(os.path.sep)[-1]:
-        sys.path.append(
-            ".."
-        )  # when running from examples folder, append the upper level
-    else:
-        # assume they're in main folder trying `python examples/example_backgroundsubtraction.py`
-        sys.path.append("../FastCVApp")  # when running from main folder
-
-from FCVAutils import FCVA_update_resources
-sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4") 
-FCVA_update_resources(sourcelocationVAR=sourcelocation)
-
-import cv2
-
-from collections import deque
-
-
-def identity_func(*args):
-    try:
-        inputdeque = args[0]
-        # FCVAWidget_shared_metadata_dictVAR3 = args[1]
-        bufferlenVAR = args[2]
-        answerdeque = deque(maxlen=bufferlenVAR)
-        landmarkerVAR = args[3]
-        raw_dequeKEYSVAR = args[4]
-        force_monotonic_increasingVAR = args[5]
-
-        #you can even just return the inputdeque but showing this for consistency with examples        
-        while len(inputdeque) > 0:
-            image = inputdeque.popleft()
-            #do literally nothing, identity maps an obj to itself
-            answerdeque.append(image)
-        return answerdeque
-
-    except Exception as e:
-        print("identity_func subprocess died! ", e, flush=True)
-
-
-if __name__ == "__main__":
-    import FastCVApp
-    app = FastCVApp.FCVA()
-
-    app.appliedcv = identity_func
-    # / and \ works on windows, only / on mac tho 
-    # C:\Personalize\CODING\FastCVApp\fastcvapp\examples\creativecommonsmedia\Elephants Dream charstart2FULL.webm
-    # C:\Personalize\CODING\FastCVApp\FastCVApp\examples\creativecommonsmedia\Elephants Dream charstart2.webm
-    app.source = sourcelocation
-    # app.source = "examples/creativecommonsmedia/Elephants Dream charstart2FULL.webm"
-    # app.source = "examples/creativecommonsmedia/Elephants Dream charstart2.webm"
-    # app.source = "examples/creativecommonsmedia/JoJo-s Bizarre Adventure - S05E25 - DUAL 1080p WEB H.264 -NanDesuKa (NF) (1).1080.mp4"
-    app.fps = 1 / 30
-    app.title = "Identity example by Pengindoramu"
-    app.run()
diff --git a/FastCVApp/examples/example_mediapipe.py b/FastCVApp/examples/example_mediapipe.py
deleted file mode 100644
index 565278f..0000000
--- a/FastCVApp/examples/example_mediapipe.py
+++ /dev/null
@@ -1,137 +0,0 @@
-import sys
-import os
-import cv2
-import mediapipe as mp
-from mediapipe import solutions
-from mediapipe.framework.formats import landmark_pb2
-import time
-from collections import deque
-
-# # / and \ works on windows, only / on mac tho 
-# sourcelocation = "examples\creativecommonsmedia\Elephants Dream charstart2.webm"
-# sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.webm") 
-sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4") 
-# sourcelocation = "examples\creativecommonsmedia\\30 fps counter.webm"
-# sourcelocation = "NDA"
-
-#u gotta run this from cmd, run python file/F5(debug) on vscode fails., u have to PRESS THE BUTTON 
-
-if hasattr(sys, "_MEIPASS"):
-    pass
-else:
-    # if you're making your own app, you don't need this if-else block. This is just vanity code so this file can be run from main FastCVApp folder or from the examples subfolder.
-    # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
-
-    # add the right path depending on if you're running from examples or from main folder:
-    if "examples" in os.getcwd().split(os.path.sep)[-1]:
-        sys.path.append(
-            ".."
-        )  # when running from examples folder, append the upper level
-    else:
-        # assume they're in main folder trying `python examples/example_backgroundsubtraction.py`
-        sys.path.append("../FastCVApp")  # when running from main folder
-
-from FCVAutils import FCVA_update_resources
-#udpate paths here
-FCVA_update_resources(sourcelocationVAR=sourcelocation) #this has the sys.path.append(sys._MEIPASS)
-
-# importing here means it's available to the subprocess as well. You can probably cut loading time by only loading mediapipe for the right subprocess.
-
-# from mediapipe import solutions
-# from mediapipe.framework.formats import landmark_pb2
-def draw_landmarks_on_image(annotated_image, detection_result):
-    try:
-        pose_landmarks_list = detection_result.pose_landmarks
-        
-        # Loop through the detected poses to visualize.
-        for idx in range(len(pose_landmarks_list)):
-            pose_landmarks = pose_landmarks_list[idx]
-
-            # Draw the pose landmarks.
-            pose_landmarks_proto = landmark_pb2.NormalizedLandmarkList()
-            pose_landmarks_proto.landmark.extend([
-                landmark_pb2.NormalizedLandmark(x=landmark.x, y=landmark.y, z=landmark.z) for landmark in pose_landmarks
-            ])
-            solutions.drawing_utils.draw_landmarks(
-                annotated_image,
-                pose_landmarks_proto,
-                solutions.pose.POSE_CONNECTIONS,
-                solutions.drawing_styles.get_default_pose_landmarks_style())
-        # print("return typoe?", type(annotated_image), len(detection_result.pose_landmarks))
-        return annotated_image
-    except Exception as e:
-        print("open_appliedcv died!", e)
-        import traceback
-        print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
-
-def apply_mediapipe_func(*args): #basicmp
-    try:
-        inputdeque = args[0]
-        # FCVAWidget_shared_metadata_dictVAR3 = args[1]
-        bufferlenVAR = args[2]
-        answerdeque = deque(maxlen=bufferlenVAR)
-        landmarkerVAR = args[3]
-        raw_dequeKEYSVAR = args[4]
-        force_monotonic_increasingVAR = args[5]
-        # print("inputdequelenOG", len(inputdeque),flush = True)
-        #reference: https://stackoverflow.com/questions/48640251/how-to-peek-front-of-deque-without-popping#:~:text=You%20can%20peek%20front%20element,right%20and%20seems%20efficient%20too.
-        peek_to_force_monotonically_increasing = 0
-        while len(inputdeque) > 0:
-            
-            image = inputdeque.popleft()
-            
-            ogimage = image.copy()
-            image = cv2.resize(image, (256, 144)) #interpolation = cv2.INTER_AREA makes mediapipe detect nothing...
-            # image = cv2.resize(image, (640, 360)) #interpolation = cv2.INTER_AREA makes mediapipe detect nothing...
-            # image = cv2.resize(image, (640, 480)) #interpolation = cv2.INTER_AREA makes mediapipe detect nothing...
-            #so mediapipe is probably legit RGB, but opencv is BGR so convert ONLY for the mediapipe code, but when u draw on the copy of the original things are ok
-            image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
-            
-            # Recolor Feed
-            image = mp.Image(image_format=mp.ImageFormat.SRGB, data=image)
-            # Make Detections
-            # results = detector.detect(image)
-            # results = landmarker.detect_for_video(image, int(cap.get(cv2.CAP_PROP_POS_MSEC)))
-            #time has this many digits: 1685543338.9065359, inconsistent digis
-            #int(str(time.time())[-10:])
-            timestr = str(time.time()).split(".")
-            # newint = int(timestr[0][-4:]+timestr[1][:3]) #take last 4 of the whole number and first 3 of the decimal, idk if this matters tho
-            #time.time should work, i'm feeding them in sequence anyways
-            #just making sure they have only the first 3 digits from the decimal and it's an int
-            # results = landmarkerVAR.detect_for_video(image, newint) 
-            #you need this because after SEEK the rawdeque is cleared
-            # results = landmarkerVAR.detect_for_video(image, raw_dequeKEYSVAR[peek_to_force_monotonically_increasing]) 
-            # peek_to_force_monotonically_increasing += 1
-            # print("increase wf??", os.getpid(), force_monotonic_increasingVAR, flush = True)
-            results = landmarkerVAR.detect_for_video(image, force_monotonic_increasingVAR) 
-            force_monotonic_increasingVAR += 1
-            # results = landmarkerVAR.detect(image) 
-            
-            #now draw on original image: 
-            fixed_image = draw_landmarks_on_image(ogimage, results)
-            answerdeque.append(fixed_image)
-        # print("aqlenEND", len(answerdeque),flush = True)
-        return answerdeque
-
-    except Exception as e:
-        print("mediapipe mpvar died!", e, flush=True)
-        import traceback
-        print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
-
-print("location of file base?", __file__, "name vs main", __name__ )
-
-if __name__ == "__main__":
-    import multiprocessing 
-    multiprocessing.freeze_support()
-    print("location of file if name main?", __file__, os.getpid() )
-    # print("paths??", sys.path)
-    import FastCVApp
-    app = FastCVApp.FCVA()
-    app.appliedcv = apply_mediapipe_func
-
-    # # / and \ works on windows, only / on mac tho 
-    app.source = sourcelocation
-    app.fps = 1 / 30
-    app.title = "Mediapipe example by Pengindoramu"
-    # print("starting?", os.getcwd(), os.path.exists(app.source), flush = True)
-    app.run()
diff --git a/FastCVApp/examples/example_rgb2rgba.py b/FastCVApp/examples/example_rgb2rgba.py
deleted file mode 100644
index ca326f6..0000000
--- a/FastCVApp/examples/example_rgb2rgba.py
+++ /dev/null
@@ -1,76 +0,0 @@
-import sys
-
-if hasattr(sys, "_MEIPASS"):
-    # if file is frozen by pyinstaller add the MEIPASS folder to path:
-    #FCVA_update_resources has the sys.path.append(sys._MEIPASS)
-    pass
-else:
-    # if you're making your own app, you don't need this else block. This is just vanity code so I can run this from main FastCVApp folder or from the examples subfolder.
-    # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
-    import os
-
-    # add the right path depending on if you're running from examples or from main folder:
-    if "examples" in os.getcwd().split(os.path.sep)[-1]:
-        sys.path.append(
-            ".."
-        )  # when running from examples folder, append the upper level
-    else:
-        # assume they're in main folder trying `python examples/example_backgroundsubtraction.py`
-        sys.path.append("../FastCVApp")  # when running from main folder
-
-from FCVAutils import FCVA_update_resources
-sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4") 
-FCVA_update_resources(sourcelocationVAR=sourcelocation)
-
-import cv2
-
-from collections import deque
-import numpy as np
-
-def identity_func(*args):
-    try:
-        inputdeque = args[0]
-        # FCVAWidget_shared_metadata_dictVAR3 = args[1]
-        bufferlenVAR = args[2]
-        answerdeque = deque(maxlen=bufferlenVAR)
-        landmarkerVAR = args[3]
-        raw_dequeKEYSVAR = args[4]
-        force_monotonic_increasingVAR = args[5]
-
-        #you can even just return the inputdeque but showing this for consistency with examples        
-        while len(inputdeque) > 0:
-            image = inputdeque.popleft()
-            #do literally nothing, identity maps an obj to itself
-        
-            #convert from rgb to rgba. this means u need to add 1 as the last element to all elements in array:
-            #reference: https://stackoverflow.com/a/39643047
-            # print("zeroes?",np.zeros(image.shape).shape, flush = True)
-            # image_rgba = np.concatenate((image, np.zeros((image.shape[0],image.shape[1], 1))), axis=2).astype(image.dtype) #bad because alpha of 0 means image is nonexistent
-            image_rgba = np.concatenate((image, np.full((image.shape[0],image.shape[1], 1), 255)), axis=2).astype(image.dtype) #reminder to 255 since rgb2rgba gives 255
-            
-            
-            #option 2:
-            # image_rgba = cv2.cvtColor(image, cv2.COLOR_RGB2RGBA)
-            answerdeque.append(image_rgba)
-            print(image_rgba)
-        return answerdeque
-
-    except Exception as e:
-        print("identity_func subprocess died! ", e, flush=True)
-
-
-if __name__ == "__main__":
-    import FastCVApp
-    app = FastCVApp.FCVA()
-
-    app.appliedcv = identity_func
-    # / and \ works on windows, only / on mac tho 
-    # C:\Personalize\CODING\FastCVApp\fastcvapp\examples\creativecommonsmedia\Elephants Dream charstart2FULL.webm
-    # C:\Personalize\CODING\FastCVApp\FastCVApp\examples\creativecommonsmedia\Elephants Dream charstart2.webm
-    app.source = sourcelocation
-    # app.source = "examples/creativecommonsmedia/Elephants Dream charstart2FULL.webm"
-    # app.source = "examples/creativecommonsmedia/Elephants Dream charstart2.webm"
-    # app.source = "examples/creativecommonsmedia/JoJo-s Bizarre Adventure - S05E25 - DUAL 1080p WEB H.264 -NanDesuKa (NF) (1).1080.mp4"
-    app.fps = 1 / 30
-    app.title = "RGB to RGBA example by Pengindoramu"
-    app.run()
diff --git a/FastCVApp/examples/example_sepiafilter.py b/FastCVApp/examples/example_sepiafilter.py
deleted file mode 100644
index f20b78c..0000000
--- a/FastCVApp/examples/example_sepiafilter.py
+++ /dev/null
@@ -1,71 +0,0 @@
-import sys
-
-if hasattr(sys, "_MEIPASS"):
-    # if file is frozen by pyinstaller add the MEIPASS folder to path:
-    #FCVA_update_resources has the sys.path.append(sys._MEIPASS)
-    pass
-else:
-    # if you're making your own app, you don't need this else block. This is just vanity code so I can run this from main FastCVApp folder or from the examples subfolder.
-    # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
-    import os
-
-    # add the right path depending on if you're running from examples or from main folder:
-    if "examples" in os.getcwd().split(os.path.sep)[-1]:
-        sys.path.append(
-            ".."
-        )  # when running from examples folder, append the upper level
-    else:
-        # assume they're in main folder trying `python examples/example_backgroundsubtraction.py`
-        sys.path.append("../FastCVApp")  # when running from main folder
-
-from FCVAutils import FCVA_update_resources
-# sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL.webm") #full is not available on github
-sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2.webm")
-FCVA_update_resources(sourcelocationVAR=sourcelocation)
-
-
-import cv2
-from collections import deque
-import numpy as np
-
-
-def sepia_filter(*args):
-    try:
-        # reference: https://medium.com/dataseries/designing-image-filters-using-opencv-like-abode-photoshop-express-part-2-4479f99fb35
-        inputdeque = args[0]
-        # FCVAWidget_shared_metadata_dictVAR3 = args[1]
-        bufferlenVAR = args[2]
-        answerdeque = deque(maxlen=bufferlenVAR)
-        landmarkerVAR = args[3]
-        raw_dequeKEYSVAR = args[4]
-        force_monotonic_increasingVAR = args[5]
-        
-        while len(inputdeque) > 0:
-            image = inputdeque.popleft()
-            
-            image = np.array(image, dtype=np.float64)  # converting to float to prevent loss
-            image = cv2.transform(
-                image,
-                np.matrix(
-                    [[0.272, 0.534, 0.131], [0.349, 0.686, 0.168], [0.393, 0.769, 0.189]]
-                ),
-            )
-            image[np.where(image > 255)] = 255  # normalizing values greater than 255 to 255
-            image = np.array(image, dtype=np.uint8)  # converting back to int
-            
-            answerdeque.append(image)
-        return answerdeque
-    except Exception as e:
-        print("sepia_filter subprocess died! ", e, flush=True)
-
-if __name__ == "__main__":
-    import multiprocessing 
-    multiprocessing.freeze_support()
-    import FastCVApp
-    app = FastCVApp.FCVA()
-    app.appliedcv = sepia_filter
-    # / and \ works on windows, only / on mac tho
-    app.source = sourcelocation
-    app.fps = 1 / 30
-    app.title = "Sepia filter example by Pengindoramu"
-    app.run()
diff --git a/FastCVApp/examples/requirementsMAC_M1.txt b/FastCVApp/examples/requirementsMAC_M1.txt
deleted file mode 100644
index a91c15c..0000000
--- a/FastCVApp/examples/requirementsMAC_M1.txt
+++ /dev/null
@@ -1,41 +0,0 @@
-absl-py==1.4.0 ; python_full_version >= "3.9.0" and python_version < "3.12"
-attrs==23.1.0 ; python_full_version >= "3.9.0" and python_version < "3.12"
-blosc2==2.2.5 ; python_full_version >= "3.9.0" and python_version < "3.12"
-certifi==2023.5.7 ; python_full_version >= "3.9.0" and python_version < "3.12"
-cffi==1.15.1 ; python_full_version >= "3.9.0" and python_version < "3.12"
-charset-normalizer==3.2.0 ; python_full_version >= "3.9.0" and python_version < "3.12"
-contourpy==1.1.0 ; python_full_version >= "3.9.0" and python_version < "3.12"
-cycler==0.11.0 ; python_full_version >= "3.9.0" and python_version < "3.12"
-docutils==0.20.1 ; python_full_version >= "3.9.0" and python_version < "3.12"
-flatbuffers==23.5.26 ; python_full_version >= "3.9.0" and python_version < "3.12"
-fonttools==4.40.0 ; python_full_version >= "3.9.0" and python_version < "3.12"
-idna==3.4 ; python_full_version >= "3.9.0" and python_version < "3.12"
-importlib-resources==6.0.0 ; python_full_version >= "3.9.0" and python_version < "3.10"
-kivy-deps-angle==0.3.3 ; python_full_version >= "3.9.0" and python_version < "3.12" and sys_platform == "win32"
-kivy-deps-glew==0.3.1 ; python_full_version >= "3.9.0" and python_version < "3.12" and sys_platform == "win32"
-kivy-deps-sdl2==0.6.0 ; python_full_version >= "3.9.0" and python_version < "3.12" and sys_platform == "win32"
-kivy-garden==0.1.5 ; python_full_version >= "3.9.0" and python_version < "3.12"
-kivy==2.2.1 ; python_full_version >= "3.9.0" and python_version < "3.12"
-kiwisolver==1.4.4 ; python_full_version >= "3.9.0" and python_version < "3.12"
-matplotlib==3.7.2 ; python_full_version >= "3.9.0" and python_version < "3.12"
-mediapipe==0.10.2 ; python_full_version >= "3.9.0" and python_version < "3.12"
-msgpack==1.0.5 ; python_full_version >= "3.9.0" and python_version < "3.12"
-ndindex==1.7 ; python_full_version >= "3.9.0" and python_version < "3.12"
-numpy==1.25.1 ; python_version >= "3.9" and python_version < "3.12"
-opencv-contrib-python==4.8.0.74 ; python_full_version >= "3.9.0" and python_version < "3.12"
-opencv-python==4.8.0.74 ; python_full_version >= "3.9.0" and python_version < "3.12"
-packaging==23.1 ; python_full_version >= "3.9.0" and python_version < "3.12"
-pillow==10.0.0 ; python_full_version >= "3.9.0" and python_version < "3.12"
-protobuf==3.20.3 ; python_full_version >= "3.9.0" and python_version < "3.12"
-py-cpuinfo==9.0.0 ; python_full_version >= "3.9.0" and python_version < "3.12"
-pycparser==2.21 ; python_full_version >= "3.9.0" and python_version < "3.12"
-pygments==2.15.1 ; python_full_version >= "3.9.0" and python_version < "3.12"
-pyparsing==3.0.9 ; python_full_version >= "3.9.0" and python_version < "3.12"
-pypiwin32==223 ; python_full_version >= "3.9.0" and python_version < "3.12" and sys_platform == "win32"
-python-dateutil==2.8.2 ; python_full_version >= "3.9.0" and python_version < "3.12"
-pywin32==306 ; python_full_version >= "3.9.0" and python_version < "3.12" and sys_platform == "win32"
-requests==2.31.0 ; python_full_version >= "3.9.0" and python_version < "3.12"
-six==1.16.0 ; python_full_version >= "3.9.0" and python_version < "3.12"
-sounddevice==0.4.6 ; python_full_version >= "3.9.0" and python_version < "3.12"
-urllib3==2.0.3 ; python_full_version >= "3.9.0" and python_version < "3.12"
-zipp==3.16.0 ; python_full_version >= "3.9.0" and python_version < "3.10"
diff --git a/fastcvapp/__init__.py b/fastcvapp/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/FastCVApp/examples/MAC_Backsub.spec b/fastcvapp/examples/MAC_Backsub.spec
similarity index 92%
rename from FastCVApp/examples/MAC_Backsub.spec
rename to fastcvapp/examples/MAC_Backsub.spec
index 505869b..5f2d2fa 100644
--- a/FastCVApp/examples/MAC_Backsub.spec
+++ b/fastcvapp/examples/MAC_Backsub.spec
@@ -10,7 +10,7 @@ a = Analysis(
     ['example_backgroundsubtraction.py'],
     pathex=[],
     binaries=[],
-    datas=[(basedir + "FastCVApp.py", "."), (basedir + "FCVAutils.py", "."), (basedir + "examples//creativecommonsmedia//", "examples//creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
+    datas=[(basedir + "fastcvapp.py", "."), (basedir + "fcvautils.py", "."), (basedir + "examples//creativecommonsmedia//", "examples//creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
     hiddenimports=['kivy', 'blosc2', 'kivy.modules.inspector'], 
     hookspath=[],
     hooksconfig={},
@@ -45,7 +45,10 @@ exe = EXE(
     entitlements_file=None,
 )
 # https://pyinstaller.org/en/stable/spec-files.html#spec-file-options-for-a-macos-bundle
-app = BUNDLE(exe,
+app = BUNDLE(
+    exe,
     name='BacksubMAC.app',
     icon=None,
-    bundle_identifier=None)
+    bundle_identifier=None,
+)
+
diff --git a/FastCVApp/examples/MAC_CannyEdge.spec b/fastcvapp/examples/MAC_CannyEdge.spec
similarity index 95%
rename from FastCVApp/examples/MAC_CannyEdge.spec
rename to fastcvapp/examples/MAC_CannyEdge.spec
index 241a045..1edddf6 100644
--- a/FastCVApp/examples/MAC_CannyEdge.spec
+++ b/fastcvapp/examples/MAC_CannyEdge.spec
@@ -10,7 +10,7 @@ a = Analysis(
     ['example_cannyedge.py'],
     pathex=[],
     binaries=[],
-    datas=[(basedir + "FastCVApp.py", "."), (basedir + "FCVAutils.py", "."), (basedir + "examples//creativecommonsmedia//", "examples//creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
+    datas=[(basedir + "fastcvapp.py", "."), (basedir + "fcvautils.py", "."), (basedir + "examples//creativecommonsmedia//", "examples//creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
     hiddenimports=['kivy', 'blosc2', 'kivy.modules.inspector'],
     hookspath=[],
     hooksconfig={},
diff --git a/FastCVApp/examples/MAC_HaarCascade.spec b/fastcvapp/examples/MAC_HaarCascade.spec
similarity index 95%
rename from FastCVApp/examples/MAC_HaarCascade.spec
rename to fastcvapp/examples/MAC_HaarCascade.spec
index 268736f..c440307 100644
--- a/FastCVApp/examples/MAC_HaarCascade.spec
+++ b/fastcvapp/examples/MAC_HaarCascade.spec
@@ -10,7 +10,7 @@ a = Analysis(
     ['example_haarcascade.py'],
     pathex=[],
     binaries=[],
-    datas=[(basedir + "FastCVApp.py", "."), (basedir + "FCVAutils.py", "."), (cv2.data.haarcascades+'haarcascade_frontalface_default.xml', "."), (basedir + "examples//creativecommonsmedia//", "examples//creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
+    datas=[(basedir + "fastcvapp.py", "."), (basedir + "fcvautils.py", "."), (cv2.data.haarcascades+'haarcascade_frontalface_default.xml', "."), (basedir + "examples//creativecommonsmedia//", "examples//creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
     hiddenimports=['kivy', 'blosc2', 'kivy.modules.inspector'], 
     hookspath=[],
     hooksconfig={},
diff --git a/FastCVApp/examples/MAC_Mediapipe.spec b/fastcvapp/examples/MAC_Mediapipe.spec
similarity index 96%
rename from FastCVApp/examples/MAC_Mediapipe.spec
rename to fastcvapp/examples/MAC_Mediapipe.spec
index 6afbcba..1c3ac43 100644
--- a/FastCVApp/examples/MAC_Mediapipe.spec
+++ b/fastcvapp/examples/MAC_Mediapipe.spec
@@ -15,7 +15,7 @@ a = Analysis(
     ['example_mediapipe.py'],
     pathex=[],
     binaries=[],
-    datas=[(basedir + "FastCVApp.py", "."), (basedir + "FCVAutils.py", "."), (basedir + "examples//creativecommonsmedia//", "examples//creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
+    datas=[(basedir + "fastcvapp.py", "."), (basedir + "fcvautils.py", "."), (basedir + "examples//creativecommonsmedia//", "examples//creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
     hiddenimports=['kivy', 'blosc2', 'kivy.modules.inspector'], 
     hookspath=[],
     hooksconfig={},
diff --git a/fastcvapp/examples/MAC_NofileTest.spec b/fastcvapp/examples/MAC_NofileTest.spec
new file mode 100644
index 0000000..a13ccc6
--- /dev/null
+++ b/fastcvapp/examples/MAC_NofileTest.spec
@@ -0,0 +1,52 @@
+# -*- mode: python ; coding: utf-8 -*-
+
+
+block_cipher = None
+
+basedir = os.path.join(os.sep, os.getcwd().split(os.path.sep)[0] + os.sep, *os.getcwd().split(os.path.sep)[:-1]) + os.path.sep
+
+a = Analysis(
+    ['example_nofiletest.py'],
+    pathex=[],
+    binaries=[],
+    datas=[(basedir + "fastcvapp.py", "."), (basedir + "fcvautils.py", "."), (basedir + "examples//creativecommonsmedia//", "examples//creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
+    hiddenimports=['kivy', 'blosc2', 'kivy.modules.inspector'], 
+    hookspath=[],
+    hooksconfig={},
+    runtime_hooks=[],
+    excludes=[],
+    win_no_prefer_redirects=False,
+    win_private_assemblies=False,
+    cipher=block_cipher,
+    noarchive=False,
+)
+pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
+
+exe = EXE(
+    pyz,
+    a.scripts,
+    a.binaries,
+    a.zipfiles,
+    a.datas,
+    [],
+    name='NofileTestMAC',
+    debug=False,
+    bootloader_ignore_signals=False,
+    strip=False,
+    upx=True,
+    upx_exclude=[],
+    runtime_tmpdir=None,
+    console=False,
+    disable_windowed_traceback=False,
+    argv_emulation=False,
+    target_arch=None,
+    codesign_identity=None,
+    entitlements_file=None,
+)
+# https://pyinstaller.org/en/stable/spec-files.html#spec-file-options-for-a-macos-bundle
+app = BUNDLE(
+    exe,
+    name='NofileTestMAC.app',
+    icon=None,
+    bundle_identifier=None,
+)
\ No newline at end of file
diff --git a/FastCVApp/examples/MAC_Sepiafilter.spec b/fastcvapp/examples/MAC_Sepiafilter.spec
similarity index 95%
rename from FastCVApp/examples/MAC_Sepiafilter.spec
rename to fastcvapp/examples/MAC_Sepiafilter.spec
index 65822b8..8f31cdf 100644
--- a/FastCVApp/examples/MAC_Sepiafilter.spec
+++ b/fastcvapp/examples/MAC_Sepiafilter.spec
@@ -9,7 +9,7 @@ a = Analysis(
     ['example_sepiafilter.py'],
     pathex=[],
     binaries=[],
-    datas=[(basedir + "FastCVApp.py", "."), (basedir + "FCVAutils.py", "."), (basedir + "examples//creativecommonsmedia//", "examples//creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
+    datas=[(basedir + "fastcvapp.py", "."), (basedir + "fcvautils.py", "."), (basedir + "examples//creativecommonsmedia//", "examples//creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
     hiddenimports=['kivy', 'blosc2', 'kivy.modules.inspector'], 
     hookspath=[],
     hooksconfig={},
diff --git a/FastCVApp/examples/Readme.txt b/fastcvapp/examples/Readme.txt
similarity index 67%
rename from FastCVApp/examples/Readme.txt
rename to fastcvapp/examples/Readme.txt
index c5c8c93..f801e33 100644
--- a/FastCVApp/examples/Readme.txt
+++ b/fastcvapp/examples/Readme.txt
@@ -7,6 +7,6 @@ Once poetry is installed:
     cd to this folder
     to build backgroundsubtraction.py using the supplied .spec file:
         python -m PyInstaller Backsub.spec --clean
-    to build for mac, go to main folder and use the spec files there:
-        python -m PyInstaller BacksubMAC.spec --clean
-    Mac spec files were built and used with the M1 Silicon chip.
\ No newline at end of file
+    to build for mac, use the MAC spec files:
+        python -m PyInstaller MAC_Backsub.spec --clean
+    Mac spec files were built and used with the M1 silicon chip.
\ No newline at end of file
diff --git a/FastCVApp/examples/WIN_Backsub.spec b/fastcvapp/examples/WIN_Backsub.spec
similarity index 81%
rename from FastCVApp/examples/WIN_Backsub.spec
rename to fastcvapp/examples/WIN_Backsub.spec
index 94e6e9a..75b2711 100644
--- a/FastCVApp/examples/WIN_Backsub.spec
+++ b/fastcvapp/examples/WIN_Backsub.spec
@@ -11,7 +11,7 @@ a = Analysis(
     ['example_backgroundsubtraction.py'],
     pathex=[''],
     binaries=[],
-    datas=[(basedir + "FastCVApp.py", "."), (basedir + "FCVAutils.py", "."), (basedir + "examples\\creativecommonsmedia\\", "examples\\creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
+    datas=[(basedir + "fastcvapp.py", "."), (basedir + "fcvautils.py", "."), (basedir + os.path.join("examples", "creativecommonsmedia"), os.path.join("examples", "creativecommonsmedia")), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
     hiddenimports=['kivy', 'blosc2', 'kivy.modules.inspector'], 
     hookspath=[],
     hooksconfig={},
@@ -38,7 +38,7 @@ exe = EXE(
     upx=True,
     upx_exclude=[],
     runtime_tmpdir=None,
-    console=False,
+    console=True,
     disable_windowed_traceback=False,
     argv_emulation=False,
     target_arch=None,
diff --git a/FastCVApp/examples/WIN_CannyEdge.spec b/fastcvapp/examples/WIN_CannyEdge.spec
similarity index 93%
rename from FastCVApp/examples/WIN_CannyEdge.spec
rename to fastcvapp/examples/WIN_CannyEdge.spec
index d774474..5eed23b 100644
--- a/FastCVApp/examples/WIN_CannyEdge.spec
+++ b/fastcvapp/examples/WIN_CannyEdge.spec
@@ -10,7 +10,7 @@ a = Analysis(
     ['example_cannyedge.py'],
     pathex=[],
     binaries=[],
-    datas=[(basedir + "FastCVApp.py", "."), (basedir + "FCVAutils.py", "."), (basedir + "examples\\creativecommonsmedia\\", "examples\\creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
+    datas=[(basedir + "fastcvapp.py", "."), (basedir + "fcvautils.py", "."), (basedir + "examples\\creativecommonsmedia\\", "examples\\creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
     hiddenimports=['kivy', 'blosc2', 'kivy.modules.inspector'], 
     hookspath=[],
     hooksconfig={},
@@ -37,7 +37,7 @@ exe = EXE(
     upx=True,
     upx_exclude=[],
     runtime_tmpdir=None,
-    console=False,
+    console=True,
     disable_windowed_traceback=False,
     argv_emulation=False,
     target_arch=None,
diff --git a/FastCVApp/examples/WIN_HaarCascade.spec b/fastcvapp/examples/WIN_HaarCascade.spec
similarity index 79%
rename from FastCVApp/examples/WIN_HaarCascade.spec
rename to fastcvapp/examples/WIN_HaarCascade.spec
index 30af74a..8ea385c 100644
--- a/FastCVApp/examples/WIN_HaarCascade.spec
+++ b/fastcvapp/examples/WIN_HaarCascade.spec
@@ -11,7 +11,7 @@ a = Analysis(
     ['example_haarcascade.py'],
     pathex=[],
     binaries=[],
-    datas=[(basedir + "FastCVApp.py", "."), (cv2.data.haarcascades+'haarcascade_frontalface_default.xml', "."),  (basedir + "FCVAutils.py", "."), (basedir + "examples\\creativecommonsmedia\\", "examples\\creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
+    datas=[(basedir + "fastcvapp.py", "."), (basedir + "fcvautils.py", "."), (cv2.data.haarcascades+'haarcascade_frontalface_default.xml', "."), (basedir + "examples\\creativecommonsmedia\\", "examples\\creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
     hiddenimports=['kivy', 'blosc2', 'kivy.modules.inspector'], 
     hookspath=[],
     hooksconfig={},
diff --git a/FastCVApp/examples/WIN_Mediapipe.spec b/fastcvapp/examples/WIN_Mediapipe.spec
similarity index 97%
rename from FastCVApp/examples/WIN_Mediapipe.spec
rename to fastcvapp/examples/WIN_Mediapipe.spec
index 2c50500..9603487 100644
--- a/FastCVApp/examples/WIN_Mediapipe.spec
+++ b/fastcvapp/examples/WIN_Mediapipe.spec
@@ -26,7 +26,7 @@ a = Analysis(
     ['example_mediapipe.py'],
     pathex=[],
     binaries=[],
-    datas=[(basedir + "FastCVApp.py", "."), (basedir + "FCVAutils.py", "."), (basedir + "examples\\creativecommonsmedia\\", "examples\\creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
+    datas=[(basedir + "fastcvapp.py", "."), (basedir + "fcvautils.py", "."), (basedir + "examples\\creativecommonsmedia\\", "examples\\creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
     hiddenimports=['kivy', 'blosc2', 'kivy.modules.inspector'], 
     hookspath=[],
     hooksconfig={},
diff --git a/fastcvapp/examples/WIN_NofileTest.spec b/fastcvapp/examples/WIN_NofileTest.spec
new file mode 100644
index 0000000..68d135f
--- /dev/null
+++ b/fastcvapp/examples/WIN_NofileTest.spec
@@ -0,0 +1,46 @@
+# -*- mode: python ; coding: utf-8 -*-
+from kivy_deps import sdl2, glew
+
+block_cipher = None
+
+basedir = os.path.join(os.sep, os.getcwd().split(os.path.sep)[0] + os.sep, *os.getcwd().split(os.path.sep)[:-1]) + os.path.sep
+print("file location?", basedir)
+
+a = Analysis(
+    ['example_nofiletest.py'],
+    pathex=[],
+    binaries=[],
+    datas=[(basedir + "fastcvapp.py", "."), (basedir + "fcvautils.py", "."), (basedir + "examples\\creativecommonsmedia\\", "examples\\creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
+    hiddenimports=['kivy', 'blosc2', 'kivy.modules.inspector'],
+    hookspath=[],
+    hooksconfig={},
+    runtime_hooks=[],
+    excludes=[],
+    win_no_prefer_redirects=False,
+    win_private_assemblies=False,
+    cipher=block_cipher,
+    noarchive=False,
+)
+pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
+
+exe = EXE(
+    pyz,
+    a.scripts,
+    a.binaries,
+    a.zipfiles,
+    a.datas,
+    *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
+    name='NofileTest',
+    debug=False,
+    bootloader_ignore_signals=False,
+    strip=False,
+    upx=True,
+    upx_exclude=[],
+    runtime_tmpdir=None,
+    console=True,
+    disable_windowed_traceback=False,
+    argv_emulation=False,
+    target_arch=None,
+    codesign_identity=None,
+    entitlements_file=None,
+)
diff --git a/FastCVApp/examples/WIN_SepiaFilter.spec b/fastcvapp/examples/WIN_SepiaFilter.spec
similarity index 95%
rename from FastCVApp/examples/WIN_SepiaFilter.spec
rename to fastcvapp/examples/WIN_SepiaFilter.spec
index 9f3b729..21cc5e3 100644
--- a/FastCVApp/examples/WIN_SepiaFilter.spec
+++ b/fastcvapp/examples/WIN_SepiaFilter.spec
@@ -10,7 +10,7 @@ a = Analysis(
     ['example_sepiafilter.py'],
     pathex=[],
     binaries=[],
-    datas=[(basedir + "FastCVApp.py", "."), (basedir + "FCVAutils.py", "."), (basedir + "examples\\creativecommonsmedia\\", "examples\\creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
+    datas=[(basedir + "fastcvapp.py", "."), (basedir + "fcvautils.py", "."), (basedir + "examples\\creativecommonsmedia\\", "examples\\creativecommonsmedia"), (basedir + "fonts", "fonts"), (basedir + "logviewer", "logviewer")],
     hiddenimports=['kivy', 'blosc2', 'kivy.modules.inspector'],
     hookspath=[],
     hooksconfig={},
diff --git a/FastCVApp/examples/creativecommonsmedia/30 fps counter.webm b/fastcvapp/examples/creativecommonsmedia/30 fps counter.webm
similarity index 100%
rename from FastCVApp/examples/creativecommonsmedia/30 fps counter.webm
rename to fastcvapp/examples/creativecommonsmedia/30 fps counter.webm
diff --git a/FastCVApp/examples/creativecommonsmedia/Elephants Dream charstart2.webm b/fastcvapp/examples/creativecommonsmedia/Elephants Dream charstart2.webm
similarity index 100%
rename from FastCVApp/examples/creativecommonsmedia/Elephants Dream charstart2.webm
rename to fastcvapp/examples/creativecommonsmedia/Elephants Dream charstart2.webm
diff --git a/FastCVApp/examples/creativecommonsmedia/Elephants Dream charstart2FULL_265.mp4 b/fastcvapp/examples/creativecommonsmedia/Elephants Dream charstart2FULL_265.mp4
similarity index 100%
rename from FastCVApp/examples/creativecommonsmedia/Elephants Dream charstart2FULL_265.mp4
rename to fastcvapp/examples/creativecommonsmedia/Elephants Dream charstart2FULL_265.mp4
diff --git a/FastCVApp/examples/creativecommonsmedia/pose_landmarker_full.task b/fastcvapp/examples/creativecommonsmedia/pose_landmarker_full.task
similarity index 100%
rename from FastCVApp/examples/creativecommonsmedia/pose_landmarker_full.task
rename to fastcvapp/examples/creativecommonsmedia/pose_landmarker_full.task
diff --git a/FastCVApp/examples/creativecommonsmedia/pose_landmarker_lite.task b/fastcvapp/examples/creativecommonsmedia/pose_landmarker_lite.task
similarity index 100%
rename from FastCVApp/examples/creativecommonsmedia/pose_landmarker_lite.task
rename to fastcvapp/examples/creativecommonsmedia/pose_landmarker_lite.task
diff --git a/fastcvapp/examples/example_backgroundsubtraction.py b/fastcvapp/examples/example_backgroundsubtraction.py
new file mode 100644
index 0000000..7fdd4bf
--- /dev/null
+++ b/fastcvapp/examples/example_backgroundsubtraction.py
@@ -0,0 +1,132 @@
+
+try:
+    import sys
+    import os
+    #u gotta run this from cmd, run python file/F5(debug) on vscode fails., u have to PRESS THE BUTTON 
+    '''
+    to compile with pyinstaller on windows/mac
+    cd to examples folder (this folder)
+    python -m PyInstaller WIN_Backsub.spec --clean 
+    OR 
+    python -m PyInstaller MAC_Backsub.spec --clean 
+    '''
+
+    # # / and \ works on windows, only / on mac tho 
+    # sourcelocation = "examples\creativecommonsmedia\Elephants Dream charstart2.webm"
+    # sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.webm") 
+    sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4") 
+    # sourcelocation = "examples\creativecommonsmedia\\30 fps counter.webm"
+    # sourcelocation = "NDA"
+
+    if hasattr(sys, "_MEIPASS"):
+        pass
+    else:
+        # if you're making your own app, you don't need this if-else block. This is just vanity code so this file can be run from main FastCVApp folder or from the examples subfolder.
+        # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
+
+        # add the right path depending on if you're running from examples or from main folder:
+        if os.path.join("fastcvapp", "fastcvapp", "examples").lower() in os.getcwd().lower():
+            # when running from examples folder, append the upper level
+            sys.path.append(
+                ".."
+            )  
+        elif os.path.join("fastcvapp", "fastcvapp").lower() in os.getcwd().lower():
+            # assume they're in main folder (fastcvapp/fastcvapp) trying `python examples/example_backgroundsubtraction.py`
+            sys.path.append(os.path.dirname(os.path.dirname(__file__)))  
+        else:
+            import pathlib
+            solution = []
+            #check all paths in sys.path and find the fastcvapp folder that holds FastCVapp.py
+            for pathstr in sys.path+[os.getcwd()]:
+                pathoption = list(pathlib.Path(pathstr).rglob(os.path.join("FastCVApp", "FastCVApp.py")))
+                testfilter = [pathselection for pathselection in pathoption]
+                if pathoption != []:
+                    # solution = list(pathlib.Path(pathstr).rglob("FastCVApp.py"))[0].resolve().__str__()
+                    # solution.append(*testfilter)
+                    solution += testfilter
+            # print("sol??", solution)
+            # solution = [print("strvar", strvar) for strvar in solution]
+            solution = [os.path.dirname(pathobj) for pathobj in solution]
+            if len(solution) != 1:
+                #warn user if multiple paths detected or none:
+                print("there should only be one path to FastCVApp/FastCVApp.py, check your env", solution, flush=True)
+            for solutionitem in solution:
+                sys.path.append(solutionitem)
+            # print("appended solution!",sys.path)
+
+    try: 
+        import pathlib
+        #in pyinstaller
+        if hasattr(sys, "_MEIPASS"):
+            #using fcva as a project
+            if len(list(pathlib.Path(pathstr).rglob(os.path.join("fcvautils.py")))) > 0:
+                from fcvautils import FCVA_update_resources
+            else:
+                #importing using fastcvapp as a module
+                from fastcvapp.fcvautils import FCVA_update_resources
+        else:
+            # NOT in pyinstaller, using fcva as a module
+            from fastcvapp.fcvautils import FCVA_update_resources
+    except:
+        #importing from fastcvapp project (using fcva as a project)
+        from fcvautils import FCVA_update_resources
+    #udpate paths here
+    # FCVA_update_resources(sourcelocationVAR = ["examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+    FCVA_update_resources(sourcelocationVAR = ["examples"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+
+    import cv2
+    backSub = cv2.createBackgroundSubtractorMOG2()
+
+    from collections import deque
+
+    def open_backsub(*args):
+        # reference: https://docs.opencv.org/3.4/d1/dc5/tutorial_background_subtraction.html
+        try:
+            # print(args, flush = True)
+            inputdeque = args[0]
+            # FCVAWidget_shared_metadata_dictVAR3 = args[1]
+            bufferlenVAR = args[2]
+            answerdeque = deque(maxlen=bufferlenVAR)
+            landmarkerVAR = args[3]
+            raw_dequeKEYSVAR = args[4]
+            force_monotonic_increasingVAR = args[5]
+
+            while len(inputdeque) > 0:
+                image = inputdeque.popleft()
+                image = backSub.apply(image)
+                image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)
+                # image = cv2.flip(image, 0)
+                answerdeque.append(image)
+            # print("aqlenEND", len(answerdeque),flush = True)
+            return answerdeque
+        except Exception as e:
+            print("open_backsub subprocess died! ", e, flush=True)
+
+    if __name__ == "__main__":
+        import multiprocessing 
+        multiprocessing.freeze_support()
+        import fastcvapp
+        try:
+            #as a module
+            # print("paths??", sys.path)
+            app = fastcvapp.FCVA()
+        except:
+            #in the project
+            # print("listdir", os.listdir(os.path.dirname(fastcvapp.__file__)))
+            from fastcvapp.fastcvapp import FCVA
+            app = FCVA()
+        app.appliedcv = open_backsub
+
+        app.source = sourcelocation
+        app.title = "Background subtraction example by Pengindoramu"
+        app.run()
+
+        # import time
+        # print("DON'T RUN!!!")
+        # time.sleep(300)
+except Exception as e: 
+    print("example_backgroundsubtraction died!", e)
+    import traceback
+    print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
+    import time
+    time.sleep(300)
\ No newline at end of file
diff --git a/fastcvapp/examples/example_cannyedge.py b/fastcvapp/examples/example_cannyedge.py
new file mode 100644
index 0000000..e239c93
--- /dev/null
+++ b/fastcvapp/examples/example_cannyedge.py
@@ -0,0 +1,133 @@
+try:
+    import sys
+    import os
+    #u gotta run this from cmd, run python file/F5(debug) on vscode fails., u have to PRESS THE BUTTON 
+
+    '''
+    to compile with pyinstaller on windows/mac
+    cd to examples folder (this folder)
+    python -m PyInstaller WIN_CannyEdge.spec --clean 
+    OR 
+    python -m PyInstaller MAC_CannyEdge.spec --clean 
+    '''
+
+
+    # # / and \ works on windows, only / on mac tho 
+    # sourcelocation = "examples\creativecommonsmedia\Elephants Dream charstart2.webm"
+    # sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.webm") 
+    sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4") 
+    # sourcelocation = "examples\creativecommonsmedia\\30 fps counter.webm"
+    # sourcelocation = "NDA"
+
+    if hasattr(sys, "_MEIPASS"):
+        pass
+    else:
+        # if you're making your own app, you don't need this if-else block. This is just vanity code so this file can be run from main FastCVApp folder or from the examples subfolder.
+        # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
+
+        # add the right path depending on if you're running from examples or from main folder:
+        if os.path.join("fastcvapp", "fastcvapp", "examples").lower() in os.getcwd().lower():
+            # when running from examples folder, append the upper level
+            sys.path.append(
+                ".."
+            )  
+        elif os.path.join("fastcvapp", "fastcvapp").lower() in os.getcwd().lower():
+            # assume they're in main folder (fastcvapp/fastcvapp) trying `python examples/example_backgroundsubtraction.py`
+            sys.path.append(os.path.dirname(os.path.dirname(__file__)))  
+        else:
+            import pathlib
+            solution = []
+            #check all paths in sys.path and find the fastcvapp folder that holds FastCVapp.py
+            for pathstr in sys.path+[os.getcwd()]:
+                pathoption = list(pathlib.Path(pathstr).rglob(os.path.join("FastCVApp", "FastCVApp.py")))
+                testfilter = [pathselection for pathselection in pathoption]
+                if pathoption != []:
+                    # solution = list(pathlib.Path(pathstr).rglob("FastCVApp.py"))[0].resolve().__str__()
+                    # solution.append(*testfilter)
+                    solution += testfilter
+            # print("sol??", solution)
+            # solution = [print("strvar", strvar) for strvar in solution]
+            solution = [os.path.dirname(pathobj) for pathobj in solution]
+            if len(solution) != 1:
+                #warn user if multiple paths detected or none:
+                print("there should only be one path to FastCVApp/FastCVApp.py, check your env", solution, flush=True)
+            for solutionitem in solution:
+                sys.path.append(solutionitem)
+            # print("appended solution!",sys.path)
+
+    try: 
+        import pathlib
+        #in pyinstaller
+        if hasattr(sys, "_MEIPASS"):
+            #using fcva as a project
+            if len(list(pathlib.Path(pathstr).rglob(os.path.join("fcvautils.py")))) > 0:
+                from fcvautils import FCVA_update_resources
+            else:
+                #importing using fastcvapp as a module
+                from fastcvapp.fcvautils import FCVA_update_resources
+        else:
+            # NOT in pyinstaller, using fcva as a module
+            from fastcvapp.fcvautils import FCVA_update_resources
+    except:
+        #importing from fastcvapp project (using fcva as a project)
+        from fcvautils import FCVA_update_resources
+    #udpate paths here
+    # FCVA_update_resources(sourcelocationVAR = ["examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+    FCVA_update_resources(sourcelocationVAR = ["examples"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+    import cv2
+    from collections import deque
+
+    def canny_filter(*args):
+        try:
+            # reference: https://docs.opencv.org/4.x/da/d5c/tutorial_canny_detector.html
+            inputdeque = args[0]
+            # FCVAWidget_shared_metadata_dictVAR3 = args[1]
+            bufferlenVAR = args[2]
+            answerdeque = deque(maxlen=bufferlenVAR)
+            landmarkerVAR = args[3]
+            raw_dequeKEYSVAR = args[4]
+            force_monotonic_increasingVAR = args[5]
+
+            low_threshold = 50
+            ratio = 3
+            kernel_size = 3
+            
+            while len(inputdeque) > 0:
+                image = inputdeque.popleft()
+                src_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
+                img_blur = cv2.blur(src_gray, (3, 3))
+                detected_edges = cv2.Canny(
+                    img_blur, low_threshold, low_threshold * ratio, kernel_size
+                )
+                mask = detected_edges != 0
+                image = image * (mask[:, :, None].astype(image.dtype))
+                answerdeque.append(image)
+            return answerdeque
+        except Exception as e:
+            print("canny_filter subprocess died! ", e, flush=True)
+
+    if __name__ == "__main__":
+        import multiprocessing 
+        multiprocessing.freeze_support()
+        import fastcvapp
+        try:
+            #as a module
+            # print("paths??", sys.path)
+            app = fastcvapp.FCVA()
+        except:
+            #in the project
+            # print("listdir", os.listdir(os.path.dirname(fastcvapp.__file__)))
+            from fastcvapp.fastcvapp import FCVA
+            app = FCVA()
+        app.appliedcv = canny_filter
+
+        # / and \ works on windows, only / on mac tho
+        app.source = sourcelocation
+        app.title = "Canny edge example by Pengindoramu"
+        app.run()
+except Exception as e: 
+    print("example_cannyedge died!", e)
+    import traceback
+    print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
+    import time
+    time.sleep(300)
\ No newline at end of file
diff --git a/fastcvapp/examples/example_haarcascade.py b/fastcvapp/examples/example_haarcascade.py
new file mode 100644
index 0000000..a98502c
--- /dev/null
+++ b/fastcvapp/examples/example_haarcascade.py
@@ -0,0 +1,172 @@
+try:
+    import sys
+    import os
+    #u gotta run this from cmd, run python file/F5(debug) on vscode fails., u have to PRESS THE BUTTON 
+
+    '''
+    to compile with pyinstaller on windows/mac
+    cd to examples folder (this folder)
+    python -m PyInstaller WIN_HaarCascade.spec --clean 
+    OR 
+    python -m PyInstaller MAC_HaarCascade.spec --clean 
+    '''
+
+    # # / and \ works on windows, only / on mac tho 
+    # sourcelocation = "examples\creativecommonsmedia\Elephants Dream charstart2.webm"
+    # sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.webm") 
+    sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4") 
+    # sourcelocation = "examples\creativecommonsmedia\\30 fps counter.webm"
+    # sourcelocation = "NDA"
+
+    if hasattr(sys, "_MEIPASS"):
+        pass
+    else:
+        # if you're making your own app, you don't need this if-else block. This is just vanity code so this file can be run from main FastCVApp folder or from the examples subfolder.
+        # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
+
+        # add the right path depending on if you're running from examples or from main folder:
+        if os.path.join("fastcvapp", "fastcvapp", "examples").lower() in os.getcwd().lower():
+            # when running from examples folder, append the upper level
+            sys.path.append(
+                ".."
+            )  
+        elif os.path.join("fastcvapp", "fastcvapp").lower() in os.getcwd().lower():
+            # assume they're in main folder (fastcvapp/fastcvapp) trying `python examples/example_backgroundsubtraction.py`
+            sys.path.append(os.path.dirname(os.path.dirname(__file__)))  
+        else:
+            import pathlib
+            solution = []
+            #check all paths in sys.path and find the fastcvapp folder that holds FastCVapp.py
+            for pathstr in sys.path+[os.getcwd()]:
+                pathoption = list(pathlib.Path(pathstr).rglob(os.path.join("FastCVApp", "FastCVApp.py")))
+                testfilter = [pathselection for pathselection in pathoption]
+                if pathoption != []:
+                    # solution = list(pathlib.Path(pathstr).rglob("FastCVApp.py"))[0].resolve().__str__()
+                    # solution.append(*testfilter)
+                    solution += testfilter
+            # print("sol??", solution)
+            # solution = [print("strvar", strvar) for strvar in solution]
+            solution = [os.path.dirname(pathobj) for pathobj in solution]
+            if len(solution) != 1:
+                #warn user if multiple paths detected or none:
+                print("there should only be one path to FastCVApp/FastCVApp.py, check your env", solution, flush=True)
+            for solutionitem in solution:
+                sys.path.append(solutionitem)
+            # print("appended solution!",sys.path)
+
+    try: 
+        import pathlib
+        #in pyinstaller
+        if hasattr(sys, "_MEIPASS"):
+            #using fcva as a project
+            if len(list(pathlib.Path(pathstr).rglob(os.path.join("fcvautils.py")))) > 0:
+                from fcvautils import FCVA_update_resources
+            else:
+                #importing using fastcvapp as a module
+                from fastcvapp.fcvautils import FCVA_update_resources
+        else:
+            # NOT in pyinstaller, using fcva as a module
+            from fastcvapp.fcvautils import FCVA_update_resources
+    except:
+        #importing from fastcvapp project (using fcva as a project)
+        from fcvautils import FCVA_update_resources
+    #udpate paths here
+    # FCVA_update_resources(sourcelocationVAR = ["examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+    FCVA_update_resources(sourcelocationVAR = ["examples"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+    import cv2
+    from collections import deque
+
+
+
+    if hasattr(sys, "_MEIPASS"):
+        # if file is frozen by pyinstaller add the MEIPASS folder to path:
+        sys.path.append(sys._MEIPASS)
+        import os
+
+        # add the haarcascade xml because it needs to be loaded to run. Look for it in the MEIPASS folder that pyInstaller unzips to
+        sourcing = os.path.join(
+            sys._MEIPASS + os.sep + "haarcascade_frontalface_default.xml"
+        )
+        # print("source?", sourcing, flush = True)
+        face_cascade = cv2.CascadeClassifier(sourcing)
+    else:
+        # this example is importing from a higher level package: https://stackoverflow.com/a/41575089
+        sys.path.append("../FastCVApp")
+        face_cascade = cv2.CascadeClassifier(
+            cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
+        )
+
+    # print("facecascade loaded?", face_cascade, flush = True)
+
+    def cascade_this(*args):
+        try:
+            # reference: https://stackoverflow.com/questions/70805922/why-does-the-haarcascades-does-not-work-on-opencv
+            inputdeque = args[0]
+            # FCVAWidget_shared_metadata_dictVAR3 = args[1]
+            bufferlenVAR = args[2]
+            answerdeque = deque(maxlen=bufferlenVAR)
+            landmarkerVAR = args[3]
+            raw_dequeKEYSVAR = args[4]
+            force_monotonic_increasingVAR = args[5]
+
+            # w_size = (700,500) #still too large, facetimetime is 0.133 sec which is forever
+            w_size = (256,144)
+
+            import time
+            from fcvautils import fprint
+            while len(inputdeque) > 0:
+                image = inputdeque.popleft()
+                
+                #yikes haarcascades are slow...
+                #plan is to resize  do the mediapipestrat where you apply haarcascade on a smaller image then rescale to original
+                gray = cv2.resize(image,w_size)
+                gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
+
+                wtime = time.time()
+                faces = face_cascade.detectMultiScale(
+                    gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)
+                )
+                facetimetime = time.time()
+                fprint("haarcascade is 5 fps, too slow (need ~6 subprocesses, my test machine can't handle it at 3 since it already goes to 100 percent cpu at 3)", facetimetime - wtime)
+
+                for (x, y, w, h) in faces:
+                    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
+                fprint("recttime", time.time() - facetimetime)
+                
+                answerdeque.append(image)
+            return answerdeque
+            
+            
+            
+        except Exception as e:
+            print("cascade_this subprocess died! ", e, flush=True)
+
+
+
+    if __name__ == "__main__":
+        import multiprocessing 
+        multiprocessing.freeze_support()
+        import fastcvapp
+        try:
+            #as a module
+            # print("paths??", sys.path)
+            app = fastcvapp.FCVA()
+        except:
+            #in the project
+            # print("listdir", os.listdir(os.path.dirname(fastcvapp.__file__)))
+            from fastcvapp.fastcvapp import FCVA
+            app = FCVA()
+        app.appliedcv = cascade_this
+        # / and \ works on windows, only / on mac tho
+        app.source = sourcelocation
+        app.cvpartitions = 6
+        app.title = (
+            'Haarcascade example by Pengindoramu ("works" but Mediapipe is a lot better)'
+        )
+        app.run()
+except Exception as e: 
+    print("example_haarcascade died!", e)
+    import traceback
+    print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
+    import time
+    time.sleep(300)
\ No newline at end of file
diff --git a/fastcvapp/examples/example_identityfunc.py b/fastcvapp/examples/example_identityfunc.py
new file mode 100644
index 0000000..a00a1d0
--- /dev/null
+++ b/fastcvapp/examples/example_identityfunc.py
@@ -0,0 +1,123 @@
+try:
+    import sys
+    import os
+    #u gotta run this from cmd, run python file/F5(debug) on vscode fails., u have to PRESS THE BUTTON 
+
+    # # / and \ works on windows, only / on mac tho 
+    # sourcelocation = "examples\creativecommonsmedia\Elephants Dream charstart2.webm"
+    # sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.webm") 
+    sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4") 
+    # sourcelocation = "examples\creativecommonsmedia\\30 fps counter.webm"
+    # sourcelocation = "NDA"
+
+    if hasattr(sys, "_MEIPASS"):
+        pass
+    else:
+        # if you're making your own app, you don't need this if-else block. This is just vanity code so this file can be run from main FastCVApp folder or from the examples subfolder.
+        # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
+
+        # add the right path depending on if you're running from examples or from main folder:
+        if os.path.join("fastcvapp", "fastcvapp", "examples").lower() in os.getcwd().lower():
+            # when running from examples folder, append the upper level
+            sys.path.append(
+                ".."
+            )  
+        elif os.path.join("fastcvapp", "fastcvapp").lower() in os.getcwd().lower():
+            # assume they're in main folder (fastcvapp/fastcvapp) trying `python examples/example_backgroundsubtraction.py`
+            sys.path.append(os.path.dirname(os.path.dirname(__file__)))  
+        else:
+            import pathlib
+            solution = []
+            #check all paths in sys.path and find the fastcvapp folder that holds FastCVapp.py
+            for pathstr in sys.path+[os.getcwd()]:
+                pathoption = list(pathlib.Path(pathstr).rglob(os.path.join("FastCVApp", "FastCVApp.py")))
+                testfilter = [pathselection for pathselection in pathoption]
+                if pathoption != []:
+                    # solution = list(pathlib.Path(pathstr).rglob("FastCVApp.py"))[0].resolve().__str__()
+                    # solution.append(*testfilter)
+                    solution += testfilter
+            # print("sol??", solution)
+            # solution = [print("strvar", strvar) for strvar in solution]
+            solution = [os.path.dirname(pathobj) for pathobj in solution]
+            if len(solution) != 1:
+                #warn user if multiple paths detected or none:
+                print("there should only be one path to FastCVApp/FastCVApp.py, check your env", solution, flush=True)
+            for solutionitem in solution:
+                sys.path.append(solutionitem)
+            # print("appended solution!",sys.path)
+
+    try: 
+        import pathlib
+        #in pyinstaller
+        if hasattr(sys, "_MEIPASS"):
+            #using fcva as a project
+            if len(list(pathlib.Path(pathstr).rglob(os.path.join("fcvautils.py")))) > 0:
+                from fcvautils import FCVA_update_resources
+            else:
+                #importing using fastcvapp as a module
+                from fastcvapp.fcvautils import FCVA_update_resources
+        else:
+            # NOT in pyinstaller, using fcva as a module
+            from fastcvapp.fcvautils import FCVA_update_resources
+    except:
+        #importing from fastcvapp project (using fcva as a project)
+        from fcvautils import FCVA_update_resources
+    #udpate paths here
+    # FCVA_update_resources(sourcelocationVAR = ["examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+    FCVA_update_resources(sourcelocationVAR = ["examples"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+    import cv2
+
+    from collections import deque
+
+
+    def identity_func(*args):
+        try:
+            inputdeque = args[0]
+            # FCVAWidget_shared_metadata_dictVAR3 = args[1]
+            bufferlenVAR = args[2]
+            answerdeque = deque(maxlen=bufferlenVAR)
+            landmarkerVAR = args[3]
+            raw_dequeKEYSVAR = args[4]
+            force_monotonic_increasingVAR = args[5]
+
+            #you can even just return the inputdeque but showing this for consistency with examples        
+            while len(inputdeque) > 0:
+                image = inputdeque.popleft()
+                #do literally nothing, identity maps an obj to itself
+                answerdeque.append(image)
+            return answerdeque
+
+        except Exception as e:
+            print("identity_func subprocess died! ", e, flush=True)
+
+
+    if __name__ == "__main__":
+        import multiprocessing 
+        multiprocessing.freeze_support()
+        import fastcvapp
+        try:
+            #as a module
+            # print("paths??", sys.path)
+            app = fastcvapp.FCVA()
+        except:
+            #in the project
+            # print("listdir", os.listdir(os.path.dirname(fastcvapp.__file__)))
+            from fastcvapp.fastcvapp import FCVA
+            app = FCVA()
+
+        app.appliedcv = identity_func
+        # / and \ works on windows, only / on mac tho 
+        # C:\Personalize\CODING\FastCVApp\fastcvapp\examples\creativecommonsmedia\Elephants Dream charstart2FULL.webm
+        # C:\Personalize\CODING\FastCVApp\FastCVApp\examples\creativecommonsmedia\Elephants Dream charstart2.webm
+        app.source = sourcelocation
+        # app.source = "examples/creativecommonsmedia/Elephants Dream charstart2FULL.webm"
+        # app.source = "examples/creativecommonsmedia/Elephants Dream charstart2.webm"
+        # app.source = "examples/creativecommonsmedia/JoJo-s Bizarre Adventure - S05E25 - DUAL 1080p WEB H.264 -NanDesuKa (NF) (1).1080.mp4"
+        app.title = "Identity example by Pengindoramu"
+        app.run()
+except Exception as e: 
+    print("example_identityfunc died!", e)
+    import traceback
+    print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
+    import time
+    time.sleep(300)
\ No newline at end of file
diff --git a/fastcvapp/examples/example_mediapipe.py b/fastcvapp/examples/example_mediapipe.py
new file mode 100644
index 0000000..34ba41b
--- /dev/null
+++ b/fastcvapp/examples/example_mediapipe.py
@@ -0,0 +1,197 @@
+try:
+    import sys
+    import os
+    import cv2
+    import mediapipe as mp
+    from mediapipe import solutions
+    from mediapipe.framework.formats import landmark_pb2
+    import time
+    from collections import deque
+
+    #u gotta run this from cmd, run python file/F5(debug) on vscode fails., u have to PRESS THE BUTTON 
+
+    '''
+    to compile with pyinstaller on windows/mac
+    cd to examples folder (this folder)
+    python -m PyInstaller WIN_Mediapipe.spec --clean 
+    OR 
+    python -m PyInstaller MAC_Mediapipe.spec --clean 
+    '''
+
+    # # / and \ works on windows, only / on mac tho 
+    # sourcelocation = "examples\creativecommonsmedia\Elephants Dream charstart2.webm"
+    # sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.webm") 
+    sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4") 
+    # sourcelocation = "examples\creativecommonsmedia\\30 fps counter.webm"
+    # sourcelocation = "NDA"
+
+    if hasattr(sys, "_MEIPASS"):
+        pass
+    else:
+        # if you're making your own app, you don't need this if-else block. This is just vanity code so this file can be run from main FastCVApp folder or from the examples subfolder.
+        # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
+
+        # add the right path depending on if you're running from examples or from main folder:
+        if os.path.join("fastcvapp", "fastcvapp", "examples").lower() in os.getcwd().lower():
+            # when running from examples folder, append the upper level
+            sys.path.append(
+                ".."
+            )  
+        elif os.path.join("fastcvapp", "fastcvapp").lower() in os.getcwd().lower():
+            # assume they're in main folder (fastcvapp/fastcvapp) trying `python examples/example_backgroundsubtraction.py`
+            sys.path.append(os.path.dirname(os.path.dirname(__file__)))  
+        else:
+            import pathlib
+            solution = []
+            #check all paths in sys.path and find the fastcvapp folder that holds FastCVapp.py
+            for pathstr in sys.path+[os.getcwd()]:
+                pathoption = list(pathlib.Path(pathstr).rglob(os.path.join("FastCVApp", "FastCVApp.py")))
+                testfilter = [pathselection for pathselection in pathoption]
+                if pathoption != []:
+                    # solution = list(pathlib.Path(pathstr).rglob("FastCVApp.py"))[0].resolve().__str__()
+                    # solution.append(*testfilter)
+                    solution += testfilter
+            # print("sol??", solution)
+            # solution = [print("strvar", strvar) for strvar in solution]
+            solution = [os.path.dirname(pathobj) for pathobj in solution]
+            if len(solution) != 1:
+                #warn user if multiple paths detected or none:
+                print("check your env, there should only be one path to FastCVApp/FastCVApp.py", solution, flush=True)
+            for solutionitem in solution:
+                sys.path.append(solutionitem)
+            # print("appended solution!",sys.path)
+
+    try: 
+        import pathlib
+        #in pyinstaller
+        if hasattr(sys, "_MEIPASS"):
+            #using fcva as a project
+            if len(list(pathlib.Path(pathstr).rglob(os.path.join("fcvautils.py")))) > 0:
+                from fcvautils import FCVA_update_resources
+            else:
+                #importing using fastcvapp as a module
+                from fastcvapp.fcvautils import FCVA_update_resources
+        else:
+            # NOT in pyinstaller, using fcva as a module
+            from fastcvapp.fcvautils import FCVA_update_resources
+    except:
+        #importing from fastcvapp project (using fcva as a project)
+        from fcvautils import FCVA_update_resources
+    #udpate paths here
+    # FCVA_update_resources(sourcelocationVAR = ["examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+    FCVA_update_resources(sourcelocationVAR = ["examples"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+
+    # importing here means it's available to the subprocess as well. You can probably cut loading time by only loading mediapipe for the right subprocess.
+
+    # from mediapipe import solutions
+    # from mediapipe.framework.formats import landmark_pb2
+    def draw_landmarks_on_image(annotated_image, detection_result):
+        try:
+            pose_landmarks_list = detection_result.pose_landmarks
+            
+            # Loop through the detected poses to visualize.
+            for idx in range(len(pose_landmarks_list)):
+                pose_landmarks = pose_landmarks_list[idx]
+
+                # Draw the pose landmarks.
+                pose_landmarks_proto = landmark_pb2.NormalizedLandmarkList()
+                pose_landmarks_proto.landmark.extend([
+                    landmark_pb2.NormalizedLandmark(x=landmark.x, y=landmark.y, z=landmark.z) for landmark in pose_landmarks
+                ])
+                solutions.drawing_utils.draw_landmarks(
+                    annotated_image,
+                    pose_landmarks_proto,
+                    solutions.pose.POSE_CONNECTIONS,
+                    solutions.drawing_styles.get_default_pose_landmarks_style())
+            # print("return typoe?", type(annotated_image), len(detection_result.pose_landmarks))
+            return annotated_image
+        except Exception as e:
+            print("open_appliedcv died!", e)
+            import traceback
+            print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
+
+    def apply_mediapipe_func(*args): #basicmp
+        try:
+            inputdeque = args[0]
+            # FCVAWidget_shared_metadata_dictVAR3 = args[1]
+            bufferlenVAR = args[2]
+            answerdeque = deque(maxlen=bufferlenVAR)
+            landmarkerVAR = args[3]
+            raw_dequeKEYSVAR = args[4]
+            force_monotonic_increasingVAR = args[5]
+            # print("inputdequelenOG", len(inputdeque),flush = True)
+            #reference: https://stackoverflow.com/questions/48640251/how-to-peek-front-of-deque-without-popping#:~:text=You%20can%20peek%20front%20element,right%20and%20seems%20efficient%20too.
+            peek_to_force_monotonically_increasing = 0
+            while len(inputdeque) > 0:
+                
+                image = inputdeque.popleft()
+                
+                ogimage = image.copy()
+                image = cv2.resize(image, (256, 144)) #interpolation = cv2.INTER_AREA makes mediapipe detect nothing...
+                # image = cv2.resize(image, (640, 360)) #interpolation = cv2.INTER_AREA makes mediapipe detect nothing...
+                # image = cv2.resize(image, (640, 480)) #interpolation = cv2.INTER_AREA makes mediapipe detect nothing...
+                #so mediapipe is probably legit RGB, but opencv is BGR so convert ONLY for the mediapipe code, but when u draw on the copy of the original things are ok
+                image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
+                
+                # Recolor Feed
+                image = mp.Image(image_format=mp.ImageFormat.SRGB, data=image)
+                # Make Detections
+                # results = detector.detect(image)
+                # results = landmarker.detect_for_video(image, int(cap.get(cv2.CAP_PROP_POS_MSEC)))
+                #time has this many digits: 1685543338.9065359, inconsistent digis
+                #int(str(time.time())[-10:])
+                timestr = str(time.time()).split(".")
+                # newint = int(timestr[0][-4:]+timestr[1][:3]) #take last 4 of the whole number and first 3 of the decimal, idk if this matters tho
+                #time.time should work, i'm feeding them in sequence anyways
+                #just making sure they have only the first 3 digits from the decimal and it's an int
+                # results = landmarkerVAR.detect_for_video(image, newint) 
+                #you need this because after SEEK the rawdeque is cleared
+                # results = landmarkerVAR.detect_for_video(image, raw_dequeKEYSVAR[peek_to_force_monotonically_increasing]) 
+                # peek_to_force_monotonically_increasing += 1
+                # print("increase wf??", os.getpid(), force_monotonic_increasingVAR, flush = True)
+                results = landmarkerVAR.detect_for_video(image, force_monotonic_increasingVAR) 
+                force_monotonic_increasingVAR += 1
+                # results = landmarkerVAR.detect(image) 
+                
+                #now draw on original image: 
+                fixed_image = draw_landmarks_on_image(ogimage, results)
+                answerdeque.append(fixed_image)
+            # print("aqlenEND", len(answerdeque),flush = True)
+            return answerdeque
+
+        except Exception as e:
+            print("mediapipe mpvar died!", e, flush=True)
+            import traceback
+            print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
+
+    # print("location of file base?", __file__, "name vs main", __name__ )
+
+    if __name__ == "__main__":
+        import multiprocessing 
+        multiprocessing.freeze_support()
+        print("location of file if name main?", __file__, os.getpid() )
+        import fastcvapp
+        try:
+            #as a module
+            # print("paths??", sys.path)
+            app = fastcvapp.FCVA()
+        except:
+            #in the project
+            # print("listdir", os.listdir(os.path.dirname(fastcvapp.__file__)))
+            from fastcvapp.fastcvapp import FCVA
+            app = FCVA()
+        app.appliedcv = apply_mediapipe_func
+        app.colorfmt = "bgr" #rgb for testing (default should be bgr to match what opencv uses)
+        app.fdimension = [1280, 720] #for testing (default is 1920, 1080)
+
+        # # / and \ works on windows, only / on mac tho 
+        app.source = sourcelocation
+        app.title = "Mediapipe example by Pengindoramu"
+        # print("starting?", os.getcwd(), os.path.exists(app.source), flush = True)
+        app.run()
+except Exception as e: 
+    print("example_mediapipe died!", e)
+    import traceback
+    print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
+    import time
+    time.sleep(300)
\ No newline at end of file
diff --git a/fastcvapp/examples/example_rgb2rgba.py b/fastcvapp/examples/example_rgb2rgba.py
new file mode 100644
index 0000000..1815506
--- /dev/null
+++ b/fastcvapp/examples/example_rgb2rgba.py
@@ -0,0 +1,146 @@
+try:
+    import sys
+    import os
+
+    #####WARNING#####
+    '''
+    If this issue (https://github.com/AccelQuasarDragon/FastCVApp/issues/24) is not closed, 
+    to get this example to work you need to change 2 lines so you can blit RGBA and NOT! RGB which will cause errors
+
+    this line so kivy will read an rgba frame properly
+    frame = np.frombuffer(frame, np.uint8).copy().reshape(1080, 1920, 4)
+    this line so that kivy blits rgba with Texture.create
+    self.colorfmtval = "bgra"
+
+    '''
+
+    #u gotta run this from cmd, run python file/F5(debug) on vscode fails., u have to PRESS THE BUTTON 
+
+    # # / and \ works on windows, only / on mac tho 
+    # sourcelocation = "examples\creativecommonsmedia\Elephants Dream charstart2.webm"
+    # sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.webm") 
+    sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4") 
+    # sourcelocation = "examples\creativecommonsmedia\\30 fps counter.webm"
+    # sourcelocation = "NDA"
+
+    if hasattr(sys, "_MEIPASS"):
+        pass
+    else:
+        # if you're making your own app, you don't need this if-else block. This is just vanity code so this file can be run from main FastCVApp folder or from the examples subfolder.
+        # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
+
+        # add the right path depending on if you're running from examples or from main folder:
+        if os.path.join("fastcvapp", "fastcvapp", "examples").lower() in os.getcwd().lower():
+            # when running from examples folder, append the upper level
+            sys.path.append(
+                ".."
+            )  
+        elif os.path.join("fastcvapp", "fastcvapp").lower() in os.getcwd().lower():
+            # assume they're in main folder (fastcvapp/fastcvapp) trying `python examples/example_backgroundsubtraction.py`
+            sys.path.append(os.path.dirname(os.path.dirname(__file__)))  
+        else:
+            import pathlib
+            solution = []
+            #check all paths in sys.path and find the fastcvapp folder that holds FastCVapp.py
+            for pathstr in sys.path+[os.getcwd()]:
+                pathoption = list(pathlib.Path(pathstr).rglob(os.path.join("FastCVApp", "FastCVApp.py")))
+                testfilter = [pathselection for pathselection in pathoption]
+                if pathoption != []:
+                    # solution = list(pathlib.Path(pathstr).rglob("FastCVApp.py"))[0].resolve().__str__()
+                    # solution.append(*testfilter)
+                    solution += testfilter
+            # print("sol??", solution)
+            # solution = [print("strvar", strvar) for strvar in solution]
+            solution = [os.path.dirname(pathobj) for pathobj in solution]
+            if len(solution) != 1:
+                #warn user if multiple paths detected or none:
+                print("there should only be one path to FastCVApp/FastCVApp.py, check your env", solution, flush=True)
+            for solutionitem in solution:
+                sys.path.append(solutionitem)
+            # print("appended solution!",sys.path)
+
+    try: 
+        import pathlib
+        #in pyinstaller
+        if hasattr(sys, "_MEIPASS"):
+            #using fcva as a project
+            if len(list(pathlib.Path(pathstr).rglob(os.path.join("fcvautils.py")))) > 0:
+                from fcvautils import FCVA_update_resources
+            else:
+                #importing using fastcvapp as a module
+                from fastcvapp.fcvautils import FCVA_update_resources
+        else:
+            # NOT in pyinstaller, using fcva as a module
+            from fastcvapp.fcvautils import FCVA_update_resources
+    except:
+        #importing from fastcvapp project (using fcva as a project)
+        from fcvautils import FCVA_update_resources
+    #udpate paths here
+    # FCVA_update_resources(sourcelocationVAR = ["examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+    FCVA_update_resources(sourcelocationVAR = ["examples"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+    import cv2
+
+    from collections import deque
+    import numpy as np
+
+    def identity_func(*args):
+        try:
+            inputdeque = args[0]
+            # FCVAWidget_shared_metadata_dictVAR3 = args[1]
+            bufferlenVAR = args[2]
+            answerdeque = deque(maxlen=bufferlenVAR)
+            landmarkerVAR = args[3]
+            raw_dequeKEYSVAR = args[4]
+            force_monotonic_increasingVAR = args[5]
+
+            #you can even just return the inputdeque but showing this for consistency with examples        
+            while len(inputdeque) > 0:
+                image = inputdeque.popleft()
+                #do literally nothing, identity maps an obj to itself
+            
+                #convert from rgb to rgba. this means u need to add 1 as the last element to all elements in array:
+                #reference: https://stackoverflow.com/a/39643047
+                # print("zeroes?",np.zeros(image.shape).shape, flush = True)
+                # image_rgba = np.concatenate((image, np.zeros((image.shape[0],image.shape[1], 1))), axis=2).astype(image.dtype) #bad because alpha of 0 means image is nonexistent
+                image_rgba = np.concatenate((image, np.full((image.shape[0],image.shape[1], 1), 255)), axis=2).astype(image.dtype) #reminder to 255 since rgb2rgba gives 255
+                
+                
+                #option 2:
+                # image_rgba = cv2.cvtColor(image, cv2.COLOR_RGB2RGBA)
+                answerdeque.append(image_rgba)
+                # print(image_rgba)
+                print(image_rgba.shape)
+            return answerdeque
+
+        except Exception as e:
+            print("identity_func subprocess died! ", e, flush=True)
+
+
+    if __name__ == "__main__":
+        import fastcvapp
+        try:
+            #as a module
+            # print("paths??", sys.path)
+            app = fastcvapp.FCVA()
+        except:
+            #in the project
+            # print("listdir", os.listdir(os.path.dirname(fastcvapp.__file__)))
+            from fastcvapp.fastcvapp import FCVA
+            app = FCVA()
+
+        app.appliedcv = identity_func
+        # / and \ works on windows, only / on mac tho 
+        # C:\Personalize\CODING\FastCVApp\fastcvapp\examples\creativecommonsmedia\Elephants Dream charstart2FULL.webm
+        # C:\Personalize\CODING\FastCVApp\FastCVApp\examples\creativecommonsmedia\Elephants Dream charstart2.webm
+        app.source = sourcelocation
+        # app.source = "examples/creativecommonsmedia/Elephants Dream charstart2FULL.webm"
+        # app.source = "examples/creativecommonsmedia/Elephants Dream charstart2.webm"
+        # app.source = "examples/creativecommonsmedia/JoJo-s Bizarre Adventure - S05E25 - DUAL 1080p WEB H.264 -NanDesuKa (NF) (1).1080.mp4"
+        app.title = "RGB to RGBA example by Pengindoramu"
+        app.run()
+except Exception as e: 
+    print("example_rgb2rgba died!", e)
+    import traceback
+    print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
+    import time
+    time.sleep(300)
\ No newline at end of file
diff --git a/fastcvapp/examples/example_sepiafilter.py b/fastcvapp/examples/example_sepiafilter.py
new file mode 100644
index 0000000..d1e1714
--- /dev/null
+++ b/fastcvapp/examples/example_sepiafilter.py
@@ -0,0 +1,135 @@
+try:
+    import sys
+    import os
+    #u gotta run this from cmd, run python file/F5(debug) on vscode fails., u have to PRESS THE BUTTON 
+
+    '''
+    to compile with pyinstaller on windows/mac
+    cd to examples folder (this folder)
+    python -m PyInstaller WIN_Sepiafilter.spec --clean 
+    OR 
+    python -m PyInstaller MAC_Sepiafilter.spec --clean 
+    '''
+
+    # # / and \ works on windows, only / on mac tho 
+    # sourcelocation = "examples\creativecommonsmedia\Elephants Dream charstart2.webm"
+    # sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.webm") 
+    sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4") 
+    # sourcelocation = "examples\creativecommonsmedia\\30 fps counter.webm"
+    # sourcelocation = "NDA"
+
+    if hasattr(sys, "_MEIPASS"):
+        pass
+    else:
+        # if you're making your own app, you don't need this if-else block. This is just vanity code so this file can be run from main FastCVApp folder or from the examples subfolder.
+        # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
+
+        # add the right path depending on if you're running from examples or from main folder:
+        if os.path.join("fastcvapp", "fastcvapp", "examples").lower() in os.getcwd().lower():
+            # when running from examples folder, append the upper level
+            sys.path.append(
+                ".."
+            )  
+        elif os.path.join("fastcvapp", "fastcvapp").lower() in os.getcwd().lower():
+            # assume they're in main folder (fastcvapp/fastcvapp) trying `python examples/example_backgroundsubtraction.py`
+            sys.path.append(os.path.dirname(os.path.dirname(__file__)))  
+        else:
+            import pathlib
+            solution = []
+            #check all paths in sys.path and find the fastcvapp folder that holds FastCVapp.py
+            for pathstr in sys.path+[os.getcwd()]:
+                pathoption = list(pathlib.Path(pathstr).rglob(os.path.join("FastCVApp", "FastCVApp.py")))
+                testfilter = [pathselection for pathselection in pathoption]
+                if pathoption != []:
+                    # solution = list(pathlib.Path(pathstr).rglob("FastCVApp.py"))[0].resolve().__str__()
+                    # solution.append(*testfilter)
+                    solution += testfilter
+            # print("sol??", solution)
+            # solution = [print("strvar", strvar) for strvar in solution]
+            solution = [os.path.dirname(pathobj) for pathobj in solution]
+            if len(solution) != 1:
+                #warn user if multiple paths detected or none:
+                print("there should only be one path to FastCVApp/FastCVApp.py, check your env", solution, flush=True)
+            for solutionitem in solution:
+                sys.path.append(solutionitem)
+            # print("appended solution!",sys.path)
+
+    try: 
+        import pathlib
+        #in pyinstaller
+        if hasattr(sys, "_MEIPASS"):
+            #using fcva as a project
+            if len(list(pathlib.Path(pathstr).rglob(os.path.join("fcvautils.py")))) > 0:
+                from fcvautils import FCVA_update_resources
+            else:
+                #importing using fastcvapp as a module
+                from fastcvapp.fcvautils import FCVA_update_resources
+        else:
+            # NOT in pyinstaller, using fcva as a module
+            from fastcvapp.fcvautils import FCVA_update_resources
+    except:
+        #importing from fastcvapp project (using fcva as a project)
+        from fcvautils import FCVA_update_resources
+    #udpate paths here
+    # FCVA_update_resources(sourcelocationVAR = ["examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+    FCVA_update_resources(sourcelocationVAR = ["examples"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+
+    import cv2
+    from collections import deque
+    import numpy as np
+
+
+    def sepia_filter(*args):
+        try:
+            # reference: https://medium.com/dataseries/designing-image-filters-using-opencv-like-abode-photoshop-express-part-2-4479f99fb35
+            inputdeque = args[0]
+            # FCVAWidget_shared_metadata_dictVAR3 = args[1]
+            bufferlenVAR = args[2]
+            answerdeque = deque(maxlen=bufferlenVAR)
+            landmarkerVAR = args[3]
+            raw_dequeKEYSVAR = args[4]
+            force_monotonic_increasingVAR = args[5]
+            
+            while len(inputdeque) > 0:
+                image = inputdeque.popleft()
+                
+                image = np.array(image, dtype=np.float64)  # converting to float to prevent loss
+                image = cv2.transform(
+                    image,
+                    np.matrix(
+                        [[0.272, 0.534, 0.131], [0.349, 0.686, 0.168], [0.393, 0.769, 0.189]]
+                    ),
+                )
+                image[np.where(image > 255)] = 255  # normalizing values greater than 255 to 255
+                image = np.array(image, dtype=np.uint8)  # converting back to int
+                
+                answerdeque.append(image)
+            return answerdeque
+        except Exception as e:
+            print("sepia_filter subprocess died! ", e, flush=True)
+
+    if __name__ == "__main__":
+        import multiprocessing 
+        multiprocessing.freeze_support()
+        import fastcvapp
+        try:
+            #as a module
+            # print("paths??", sys.path)
+            app = fastcvapp.FCVA()
+        except:
+            #in the project
+            # print("listdir", os.listdir(os.path.dirname(fastcvapp.__file__)))
+            from fastcvapp.fastcvapp import FCVA
+            app = FCVA()
+        app.appliedcv = sepia_filter
+        app.fdimension = [1280, 720]
+        # / and \ works on windows, only / on mac tho
+        app.source = sourcelocation
+        app.title = "Sepia filter example by Pengindoramu"
+        app.run()
+except Exception as e: 
+    print("example_sepiafilter died!", e)
+    import traceback
+    print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
+    import time
+    time.sleep(300)
\ No newline at end of file
diff --git a/FastCVApp/FastCVApp.py b/fastcvapp/fastcvapp.py
similarity index 76%
rename from FastCVApp/FastCVApp.py
rename to fastcvapp/fastcvapp.py
index 06453d7..10a286f 100644
--- a/FastCVApp/FastCVApp.py
+++ b/fastcvapp/fastcvapp.py
@@ -3,11 +3,32 @@
 import time
 import os, sys
 import numpy as np
-from FCVAutils import fprint
+'''
+2 things:
+from proj
+as module
+areas:
+terminal: fastcvapp/fastcvapp/examples
+pyinstaller
+
+what fails:
+windows: as project pyinstaller
+
+solution is if meipass AND fcvautils in sys._MEIPASS > from fcvautils import 
+elif meipass then fastcvapp.fcvautils
+no meipass > from fcvautils import fprint
+'''
+try: #if hasattr(sys, "_MEIPASS"):
+    #this only works when frozen as a module....
+    from fastcvapp.fcvautils import fprint
+except:
+    from fcvautils import fprint #from terminal, also when as a pyinstaller project
+# from fcvautils import fprint
 #blosc uses multiprocessing, call it after freeze support so exe doesn't hang
 #https://github.com/pyinstaller/pyinstaller/issues/7470#issuecomment-1448502333
 #I immediately call multiprocessing.freeze_support() in example_mediapipe but it's not good for abstraction, think about it
 import blosc2
+import pathlib
 
 def frameblock(*args):
     '''
@@ -80,6 +101,7 @@ def int_to_partition(*args):
 
 def open_cvpipeline(*args):
     try:
+        import sys
         appliedcv                           = args[0]
         shared_analyzedVAR                  = args[1]
         shared_analyzedKeycountVAR          = args[2]
@@ -93,10 +115,12 @@ def open_cvpipeline(*args):
         FCVAWidget_shared_metadata_dictVAR2 = args[10]
 
         #didn't know about apipreference: https://stackoverflow.com/questions/73753126/why-does-opencv-read-video-faster-than-ffmpeg
-        currentsource = FCVAWidget_shared_metadata_dictVAR2["source"]
         #if source exists (that way you can just start the subprocess w/o requiring a source), if u change source you'll end up triggering the source change code in the while loop so ur good:
         if "source" in FCVAWidget_shared_metadata_dictVAR2.keys():
+            currentsource = FCVAWidget_shared_metadata_dictVAR2["source"]
             sourcecap = cv2.VideoCapture(FCVAWidget_shared_metadata_dictVAR2["source"], apiPreference=cv2.CAP_FFMPEG)
+        else:
+            currentsource = None
         internal_framecount = 0
         force_monotonic_increasing = 0 #mediapipe keeps complaining about " Input timestamp must be monotonically increasing."
         instance_count = 0
@@ -112,13 +136,12 @@ def open_cvpipeline(*args):
         analyzed_dequeKEYS = deque(maxlen=bufferlen)
 
         #some examples do not require mediapipe, only load them when mediapipe has already been loaded
-        import sys
 
         # https://stackoverflow.com/questions/30483246/how-can-i-check-if-a-module-has-been-imported
         # fprint("is it mediapipe or mp? (it's the actual modulename, nice)", "mediapipe" in sys.modules, "mp" in sys.modules)
         modulename = 'mediapipe' #this implies mediapipe was already imported in the actual sourcecode tho
         if modulename in sys.modules:
-            print('You have imported {} module, setting up landmarker'.format(modulename))
+            fprint('{} module detected, setting up landmarker'.format(modulename))
 
             #init mediapipe here so it spawns the right amt of processes
             import mediapipe as mp
@@ -127,10 +150,10 @@ def open_cvpipeline(*args):
             #assume this file structure:
             # this file\examples\creativecommonsmedia\pose_landmarker_full.task is the location
             # https://stackoverflow.com/a/50098973
-            from pathlib import Path
+            # from pathlib import Path
 
-            print("file location?", Path(__file__).absolute())
-            print("cwd???3", os.getcwd())
+            # print("file location?", Path(__file__).absolute())
+            # print("cwd???3", os.getcwd())
             #reminder: a subprocess spawned by multiprocessing will not have the same getcwd set by os.chdir, so you need to check if you're on mac or not:
             # ALSO ON MAC: it fixes getcwd to be the location of the pyinstaller exe as per: https://stackoverflow.com/questions/50563950/about-maos-python-building-applications-os-getcwd-to-return-data-problems
             from sys import platform
@@ -138,6 +161,9 @@ def open_cvpipeline(*args):
                 #hope this works for both py file and running from pyinstaller, i'll have to check
                 # tasklocation = os.path.join(os.path.dirname(__file__), 'examples', 'creativecommonsmedia', 'pose_landmarker_lite.task')
                 tasklocation = os.path.join(os.path.dirname(__file__), 'examples', 'creativecommonsmedia', 'pose_landmarker_full.task')
+                #now to acommodate if this was made with pyinstaller as a module:
+                if hasattr(sys, "_MEIPASS") and "fastcvapp" in tasklocation:
+                    tasklocation = os.path.join(sys._MEIPASS,'examples', 'creativecommonsmedia', 'pose_landmarker_full.task')
                 
             if platform == "darwin":
                 fprint("old cwd", os.getcwd(), "changeddir!", os.path.dirname(sys.executable))
@@ -153,8 +179,6 @@ def open_cvpipeline(*args):
                     # tasklocation = os.path.join(os.getcwd(), 'examples', 'creativecommonsmedia', 'pose_landmarker_lite.task')
                     tasklocation = os.path.join(os.getcwd(), 'examples', 'creativecommonsmedia', 'pose_landmarker_full.task')
 
-
-            fprint("what is getcwd??", os.getcwd())
             #dont rely on examples folder anymore, just assume it exists since fcva utils update resources is called
 
 
@@ -193,6 +217,8 @@ def open_cvpipeline(*args):
         FCVAWidget_shared_metadata_dictVAR2["seek_req_val" + str(os.getpid())] = 0
         FCVAWidget_shared_metadata_dictVAR2["subprocessREAD" + str(pid)] = True
         FCVAWidget_shared_metadata_dictVAR2["subprocess_cv_load" + str(pid)] = True
+
+        # testvar = 0 #remember to delete this
         while True:
             '''
             PLAN:
@@ -218,10 +244,11 @@ def open_cvpipeline(*args):
                 you want to write out the analyzed frames first
                 there is some downtime where kivy reads from a shareddict, in that time I would ideally read/analyze frames (something that doesn't lock the shared dict)
             '''
+            
             #make sure things have started AND this processess is not stopped:
 
             #if source is different, close cap and reopen with new source: also remember this adds time to this already time critical function...
-            if currentsource != FCVAWidget_shared_metadata_dictVAR2["source"]:
+            if "source" in FCVAWidget_shared_metadata_dictVAR2.keys() and currentsource != FCVAWidget_shared_metadata_dictVAR2["source"]:
                 sourcecap.release()
                 sourcecap = cv2.VideoCapture(FCVAWidget_shared_metadata_dictVAR2["source"], apiPreference=cv2.CAP_FFMPEG)
                 currentsource = FCVAWidget_shared_metadata_dictVAR2["source"]
@@ -239,20 +266,39 @@ def open_cvpipeline(*args):
             #on readframe, add a seek to frame
             #from my quick testing takes ~6ms to get to frame, but doesn't matter since everything should wait until all subprocesses seek to that frame
 
-            if "starttime" in FCVAWidget_shared_metadata_dictVAR2 and ("pausetime" not in FCVAWidget_shared_metadata_dictVAR2) and FCVAWidget_shared_metadata_dictVAR2["subprocess" + str(pid)]:
-
+            #now you also have to check for fps ON EVERY RUN.... yikes
+            if "starttime" in FCVAWidget_shared_metadata_dictVAR2 and ("pausetime" not in FCVAWidget_shared_metadata_dictVAR2) and FCVAWidget_shared_metadata_dictVAR2["subprocess" + str(pid)] and "capfps" in FCVAWidget_shared_metadata_dictVAR2.keys():
+                #REMEMBER TO UPDATE FPS:
+                fps = FCVAWidget_shared_metadata_dictVAR2["capfps"]
                 initial_time = time.time()
                 future_time = FCVAWidget_shared_metadata_dictVAR2["starttime"] + ((1/fps)*internal_framecount)
                 current_framenumber = int((time.time() - FCVAWidget_shared_metadata_dictVAR2["starttime"])/(1/fps))
-                # fprint("frame advantage START????", os.getpid(), internal_framecount, current_framenumber, future_time-time.time(), time.time())
+                # fprint("frame advantage START????", internal_framecount, current_framenumber, future_time-time.time(), time.time())
                 
                 newwritestart = time.time()
+                
+                # if testvar <20:
+                #     fprint("need to push data to kivy", 
+                #             len(analyzed_deque) == bufferlen, 
+                #             (max(shared_analyzedKeycountVAR.values()) <= current_framenumber or max(shared_analyzedKeycountVAR.values()) == -1), 
+                #             max(shared_analyzedKeycountVAR.values()) <= current_framenumber, 
+                #             max(shared_analyzedKeycountVAR.values()) == -1, 
+                #             "get max of these and is < current_framenumber", shared_analyzedKeycountVAR.values(),
+                #             "current_framenumber", current_framenumber, 
+                #             "starttime:", FCVAWidget_shared_metadata_dictVAR2["starttime"], 
+                #             time.strftime('%Y-%m-%d %H:%M:%S %Z', time.localtime(FCVAWidget_shared_metadata_dictVAR2["starttime"])),
+                #             "does fps exist?", fps,
+                #             "constructing framenumber", time.time(),
+                #             FCVAWidget_shared_metadata_dictVAR2["starttime"]/(1/fps),
+                #             (time.time() - FCVAWidget_shared_metadata_dictVAR2["starttime"])/(1/fps)
+                #         )
+                #     testvar += 1
                 if len(analyzed_deque) == bufferlen and (max(shared_analyzedKeycountVAR.values()) <= current_framenumber or max(shared_analyzedKeycountVAR.values()) == -1):
                     dictwritetime = time.time()
                     for x in range(bufferlen):
                         shared_analyzedVAR['frame'+str(x)] = analyzed_deque.popleft()
                         shared_analyzedKeycountVAR['key'+str(x)] = analyzed_dequeKEYS.popleft()
-                    fprint("updated shareddict", shared_analyzedKeycountVAR.values())
+                    # fprint("updated shareddict", shared_analyzedKeycountVAR.values())
                 newwriteend = time.time()
                 
                 afteranalyzetimestart = time.time()
@@ -270,7 +316,7 @@ def open_cvpipeline(*args):
                         raw_dequeKEYS, 
                         force_monotonic_increasing)
                     force_monotonic_increasing += bufferlen  
-                    fprint("resultdeque timing (appliedcv)", time.time() - rtime,current_framenumber)
+                    # fprint("resultdeque timing (appliedcv)", time.time() - rtime,current_framenumber)
                     current_framenumber = int((time.time() - FCVAWidget_shared_metadata_dictVAR2["starttime"])/(1/fps))
                     otherhalf = time.time()
 
@@ -283,8 +329,9 @@ def open_cvpipeline(*args):
                             result_compressed = blosc2.compress(result_compressed,filter=blosc2.Filter.SHUFFLE, codec=blosc2.Codec.LZ4)
                             analyzed_deque.append(result_compressed)
                             analyzed_dequeKEYS.append(raw_dequeKEYS.popleft())
-                    fprint("analyzed keys???", [analyzed_dequeKEYS[x] for x in range(len(analyzed_dequeKEYS))], current_framenumber)
+                    # fprint("analyzed keys???", [analyzed_dequeKEYS[x] for x in range(len(analyzed_dequeKEYS))], current_framenumber)
                 afteranalyzetime = time.time()
+                # fprint("trying to analyze correct?")
 
                 #update info for seeking
                 if "seek_req_val" in FCVAWidget_shared_metadata_dictVAR2 and FCVAWidget_shared_metadata_dictVAR2["seek_req_val"] != FCVAWidget_shared_metadata_dictVAR2["seek_req_val" + str(os.getpid())]:
@@ -303,9 +350,9 @@ def open_cvpipeline(*args):
                     #hoping this resets the keycounts so that frames get updated to shared_analyzed deque:
                     for keyvar in shared_analyzedKeycountVAR.keys():
                         shared_analyzedKeycountVAR[keyvar] = -1
-                    fprint("CLEARED deques", len(raw_deque), len(raw_dequeKEYS), len(analyzed_deque), len(analyzed_dequeKEYS))
+                    # fprint("CLEARED deques", len(raw_deque), len(raw_dequeKEYS), len(analyzed_deque), len(analyzed_dequeKEYS))
                     #reset instance count to be at the right spot where internal_framecount is:
-                    fprint("internal framecount to instance", FCVAWidget_shared_metadata_dictVAR2["seek_req_val"],internal_framecount, maxpartitions, bufferlen,  instance_count)
+                    # fprint("internal framecount to instance", FCVAWidget_shared_metadata_dictVAR2["seek_req_val"],internal_framecount, maxpartitions, bufferlen,  instance_count)
 
                 if len(raw_deque) <= int(bufferlen/2) and FCVAWidget_shared_metadata_dictVAR2["subprocessREAD" + str(pid)]:
                     #get the right framecount:
@@ -323,8 +370,12 @@ def open_cvpipeline(*args):
                         # fprint("ret and internal_framecount in framelist", ret, internal_framecount, framelist, ret and (internal_framecount in framelist))
                         if ret and (internal_framecount in framelist):
                             # i might not be picking up a pose because the frame is being read upside down, flip it first before analyzing with mediapipe
+                            framewidth = FCVAWidget_shared_metadata_dictVAR2["fdimension"][0]
+                            frameheight = FCVAWidget_shared_metadata_dictVAR2["fdimension"][1] 
                             # framedata = cv2.resize(framedata, (1280, 720))
-                            framedata = cv2.resize(framedata, (1920, 1080))
+                            fprint("dimension types cv", type(framewidth), framewidth, type(frameheight), frameheight)
+                            framedata = cv2.resize(framedata, (framewidth, frameheight))
+                            # framedata = cv2.resize(framedata, (1920, 1080))
                             # framedata = cv2.resize(framedata, (640, 480))
                             # framedata = cv2.flip(framedata, 0) 
                             # framedata = cv2.cvtColor(framedata, cv2.COLOR_RGB2BGR)
@@ -339,6 +390,10 @@ def open_cvpipeline(*args):
                     if len(raw_deque) != 10:
                         fprint("reading is wrekt", len(raw_deque), [raw_dequeKEYS[x] for x in range(len(raw_dequeKEYS))], "partition number", partitionnumber, instance_count, bufferlen, maxpartitions, internal_framecount, framelist, current_framenumber)
                     # fprint("the for loop structure is slow...", time.time()-timeoog)
+            else:
+                import time
+                # fprint("what's going on", "starttime" in FCVAWidget_shared_metadata_dictVAR2, ("pausetime" not in FCVAWidget_shared_metadata_dictVAR2), FCVAWidget_shared_metadata_dictVAR2["subprocess" + str(pid)] )
+                time.sleep(1)
     except Exception as e: 
         print("open_appliedcv died!", e)
         import traceback
@@ -352,64 +407,45 @@ def __init__(self, *args, **kwargs):
     def run(self):
         try:
             fprint("when compiled, what is __name__?", __name__, "file?", __file__)
-            if __name__ == "FastCVApp":
+            if __name__ == "fastcvapp" or __name__ == "fastcvapp.fastcvapp":
                 import multiprocessing as FCVA_mp
                 # this is so that only 1 window is run when packaging with pyinstaller
                 FCVA_mp.freeze_support()
                 # reference: https://stackoverflow.com/questions/8220108/how-do-i-check-the-operating-system-in-python
-                from sys import platform
-                if platform == "linux" or platform == "linux2":
-                    # linux
-                    pass
-
-                elif platform == "win32" or platform == "darwin":
-                    # Windows...
-                    # check current directory, then check tmpfolder, then complain:
-
-                    # if you're in examples folder, path is gonna be wrong, so fix it:
-                    dirlist = os.getcwd().split(os.path.sep)
-                    if "examples" in dirlist[-1]:
-                        # pathjoin is weird: https://stackoverflow.com/questions/2422798/python-os-path-join-on-windows
-                        dirlist_source = (
-                            dirlist[0]
-                            + os.path.sep
-                            + os.path.join(*dirlist[1 : len(dirlist) - 1])
-                            + os.path.sep
-                            + self.source
-                        )
-                        if not os.path.isfile(dirlist_source):
-                            print("not a playable file: ??", dirlist_source)
+                if hasattr(self, "source"):
+                    from sys import platform
+                    if platform == "linux" or platform == "linux2":
+                        # linux
+                        pass
+
+                    elif platform == "win32" or platform == "darwin":
+                        #TL:DR; this block of code looks for self.source using rglob and looks through sys.path, os.getcwd and sys.MEIPASS to cover all my bases, if it finds more than 1 source it complains and throws an error
+                        if hasattr(sys, "_MEIPASS"):
+                            suspectedpathlist = sys.path+[os.getcwd(), sys._MEIPASS]
                         else:
-                            self.source = dirlist_source
-                    # NOW check current directory:
-                    elif os.path.isfile(self.source):
-                        print("file loaded:", os.getcwd() + os.sep + self.source)
-                    elif not os.path.isfile(self.source):
-                        print(
-                            "Source failed isfile check for current directory: "
-                            + str(os.path.isfile(self.source))
-                            + ". Checking location: "
-                            + str(os.path.join(os.getcwd(), self.source))
-                            + " Checking tmpdir next:"
-                        )
-
-                    # print("#check sys attr:", hasattr(sys, '_MEIPASS'))
-                    if hasattr(sys, "_MEIPASS"):
-                        # if file is frozen by pyinstaller add the MEIPASS folder to path:
-                        sys.path.append(sys._MEIPASS)
-                        tempsource = sys._MEIPASS + os.sep + self.source
-
-                        if os.path.isfile(tempsource):
-                            self.source = tempsource
-                        # checked everything, now complain:
-                        elif not os.path.isfile(tempsource):
-                            raise Exception(
-                                "Source failed isfile check: " + str(tempsource)
-                            )
-                # read just to get the fps
-                video = cv2.VideoCapture(self.source)
-                self.fps = video.get(cv2.CAP_PROP_FPS)
-                video.release()
+                            suspectedpathlist = sys.path+[os.getcwd()]
+                        solution = []
+                        for pathstr in suspectedpathlist:
+                            pathoption = list(pathlib.Path(pathstr).rglob(self.source))
+                            testfilter = [pathselection for pathselection in pathoption if ".app" not in pathselection.resolve().__str__()]
+                            if pathoption != [] and testfilter != []:
+                                # solution.append(*testfilter)
+                                solution += testfilter
+                        if len(solution) == 0:
+                            fprint("Source failed isfile check for current directory:", self.source,", checked these paths:",suspectedpathlist,"check your env", solution)
+                        elif len(solution) != 1:
+                            #warn user if multiple paths detected or none:
+                            fprint("check your env, there should only be one path to source:", self.source, "possible sources:", solution)
+                        # self.source = os.path.join(*solution[0].resolve().__str__().split(os.sep))
+                        self.source = solution[0].resolve().__str__()
+                        if not os.path.isfile(self.source):
+                            fprint("Source failed isfile check (so it doesn't exist or cannot be found): " + self.source, type(self.source))
+                    # read just to get the fps
+                    video = cv2.VideoCapture(self.source)
+                    self.fps = video.get(cv2.CAP_PROP_FPS)
+                    video.release()
+                else:
+                    self.source = None
                 #number of seconds to wait for mediapipe/your cv function to buffer
                 self.bufferwait = 2
 
@@ -417,7 +453,7 @@ def run(self):
                 #sanity checks
                 if not hasattr(self, "fps"):
                     # default to 30fps, else set blit buffer speed to 1/30 sec
-                    self.fps = 1 / 30
+                    self.fps = 30
                 if not hasattr(self, "title"):
                     kvinit_dict[
                         "title"
@@ -432,6 +468,12 @@ def run(self):
                     print(
                         "FCVA.appliedcv is currently None. Not starting the CV subprocess."
                     )
+                if hasattr(self, "fdimension"):
+                    kvinit_dict["fdimension"] = self.fdimension
+                else:
+                    #width then height
+                    kvinit_dict["fdimension"] = [1920, 1080]
+
 
                 bufferlen = 10
                 if hasattr(self, "cvpartitions"):
@@ -439,6 +481,7 @@ def run(self):
                 else:
                     # cvpartitions = 3
                     cvpartitions = 4
+                # print("how many paritions/ cv subprocesses?", cvpartitions)
                 #init shared dicts:
 
                 #nested shared obj works:
@@ -506,8 +549,7 @@ def FCVAWidget_SubprocessInit(*args): #REMINDER: there is no self because I neve
         subprocess_listVAR                  = args[7]
         FCVAWidget_shared_metadata_dictVAR  = args[8]
         # fprint("check args for FCVAWidget_SubprocessInit", args)
-        fprint("bufferwaitVAR2 in right dict??", FCVAWidget_shared_metadata_dictVAR["bufferwaitVAR2"])
-
+        
         for x in range(cvpartitionsVAR):
             #init analyzed/keycount dicts
             shared_analyzedA = shared_mem_managerVAR.dict()
@@ -566,9 +608,18 @@ def FCVAWidgetInit(*args, ):#REMINDER: there is no self because I never instanti
         import datetime
         from functools import partial
         import inspect, os
-
+        from kivy.uix.textinput import TextInput
+
+        class FCVAPopup(Popup):
+            def dismiss(self, *args, **kwargs):
+                #do the source class event
+                super().dismiss(*args, **kwargs)
+                #I need to send the textinput widget and save to the correct instance of FCVAWidget.FCVAWidget_shared_metadata_dict["colorfmt"]
+                self.fcvaref.FCVAWidget_shared_metadata_dict["colorfmt"] = self.fcvapopuptextinputREF.text
+                self.fcvaref.FCVAWidget_shared_metadata_dict["fdimension"] = [int(intvar) for intvar in self.resolutiontextinputREF.text.split(",")]
+                fprint("set data on fcva widget", self.fcvaref.FCVAWidget_shared_metadata_dict["colorfmt"], self.fcvaref.FCVAWidget_shared_metadata_dict["fdimension"])
+                
         class FCVAWidget(BoxLayout):
-
             def __init__(self, *args, **kwargs):
                 super().__init__(*args, **kwargs)
                 #when widget is init start up the subprocesses
@@ -579,10 +630,10 @@ def __init__(self, *args, **kwargs):
                 try:
                     FCVA_mp.Manager()
                 except Exception as e: 
-                    if __name__ == "FastCVApp":
+                    if __name__ == "fastcvapp" or __name__ == "fastcvapp.fastcvapp":
                         import multiprocessing as FCVA_mp
                         FCVA_mp.freeze_support()
-                        print("FCVA FCVAWidget __init__ detected no multiprocessing, importing as such", flush=True)
+                        fprint("FCVA FCVAWidget __init__ detected no multiprocessing, importing as FCVA_mp and started freeze_support")
                         # import traceback
                         # print("full exception (YOU CAN IGNORE THIS, just testing if multiprocess/multiprocessing has already been imported)", "".join(traceback.format_exception(*sys.exc_info())))
                 
@@ -594,17 +645,33 @@ def __init__(self, *args, **kwargs):
                 subprocess_list = []
 
                 self.FCVAWidget_shared_metadata_dict = shared_mem_manager.dict()
-                if hasattr(self, "source"):
+                if hasattr(self, "source") and self.source != None:
                     self.FCVAWidget_shared_metadata_dict["source"] = self.source
                     #sliderdata needs to udpate slider so just schedule for 1st valid frame with clock 0
                     Clock.schedule_once(partial(self.updateSliderData,self.FCVAWidget_shared_metadata_dict), 0)
-                    fprint("schedule once???")
+                elif self.source == None:
+                    self.FCVAWidget_shared_metadata_dict["source"] = self.source
                 if hasattr(self, "bufferwaitVAR2"):
                     self.FCVAWidget_shared_metadata_dict["bufferwaitVAR2"] = self.bufferwaitVAR2
                 else: #default to 3 and say so
                     self.FCVAWidget_shared_metadata_dict["bufferwaitVAR2"] = 3
                     fprint(f"bufferwaitVAR2 defaulted to self.FCVAWidget_shared_metadata_dict['bufferwaitVAR2']")
 
+                # well, change of plans, opencv can't tell you the colorspace:
+                # so just blindly believe the user
+                # https://stackoverflow.com/a/2137355
+                # As rcv said, there is no method to programmatically detect the color space by inspecting the three color channels, unless you have a priori knowledge of the image content (e.g., there is a marker in the image whose color is known). If you will be accepting images from unknown sources, you must allow the user to specify the color space of their image. A good default would be to assume RGB.
+
+                #if kvinit_dictVAR2 has colorfmt, update:
+                if "colorfmt" in self.kvinit_dictVAR2:
+                    self.FCVAWidget_shared_metadata_dict["colorfmt"] = self.kvinit_dictVAR2["colorfmt"]
+                    # fprint("check colorfmt", "colorfmt" in self.kvinit_dictVAR2, self.kvinit_dictVAR2.keys(), self.kvinit_dictVAR2["colorfmt"])
+                else:
+                    self.FCVAWidget_shared_metadata_dict["colorfmt"] = "bgr"
+                    # fprint("no colorfmt, automatically set to bgr", "colorfmt" in self.kvinit_dictVAR2, self.kvinit_dictVAR2.keys(), self.FCVAWidget_shared_metadata_dict["colorfmt"])
+                if "fdimension" in self.kvinit_dictVAR2:
+                    self.FCVAWidget_shared_metadata_dict["fdimension"] = self.kvinit_dictVAR2["fdimension"]
+
                 # Clock.schedule_once(self.updatefont, 0)
                 self.is_cv_loaded = Clock.schedule_interval(self.updatefont_subprocesscheck, 1)
 
@@ -638,33 +705,59 @@ def updatefont(self, *args):
                 #assume font is in this directory/fonts
                 # https://stackoverflow.com/questions/247770/how-to-retrieve-a-modules-path
                 # https://stackoverflow.com/questions/50499/how-do-i-get-the-path-and-name-of-the-file-that-is-currently-executing/50905#50905
-                this_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
+                if hasattr(sys, "_MEIPASS"):
+                    this_dir = sys._MEIPASS
+                else:
+                    this_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
                 font_path = os.path.join(this_dir, "fonts", "materialdesignicons-webfont.ttf")
                 fprint("what is fontpath??", font_path)
                 self.ids['StartScreenButtonID'].font_name = font_path
                 self.ids['StartScreenButtonID'].text = "\U000F040A" #this is play
 
             def on_touch_down(self, touch): #overrides touchdown for entire widget
-                self.ids['vidsliderID'].on_touch_down(touch) #self is automatically passed i think, this is to make sure the slider keeps recieving commands
-                #check if slider is touched as per: https://stackoverflow.com/questions/50590027/how-can-i-detect-when-touch-is-in-the-children-widget-in-kivy and per https://kivy.org/doc/stable/guide/events.html#dispatching-a-property-event
-                if self.ids['vidsliderID'].collide_point(*touch.pos):
-                    # fprint("touched????", touch)
-                    self.CV_off()
-                self.FCVAWidget_shared_metadata_dict["oldsliderpos"] = self.ids['vidsliderID'].value
+                #make sure cv is loaded before doing anything:
+                if len(self.subprocess_list) == self.cvpartitions and len([keyVAR for keyVAR in self.FCVAWidget_shared_metadata_dict.keys() if "subprocess_cv_load" in keyVAR and self.FCVAWidget_shared_metadata_dict[keyVAR]]) == self.cvpartitions:
+                    self.ids['vidsliderID'].on_touch_down(touch) #self is automatically passed i think, this is to make sure the slider keeps recieving commands
+                    #check if slider is touched as per: https://stackoverflow.com/questions/50590027/how-can-i-detect-when-touch-is-in-the-children-widget-in-kivy and per https://kivy.org/doc/stable/guide/events.html#dispatching-a-property-event
+                    if self.ids['vidsliderID'].collide_point(*touch.pos):
+                        # fprint("touched????", touch)
+                        self.CV_off()
+                    self.FCVAWidget_shared_metadata_dict["oldsliderpos"] = self.ids['vidsliderID'].value
+                else:
+                    #popup warning
+                    box = BoxLayout(orientation='vertical')
+                    popup = Popup(title="Please wait while CV is loading...", content=box, size_hint=(0.5, 0.5))
+
+                    mybuttonregret = Button(text="Ok", size_hint=(.5, 0.25))
+                    box.add_widget(mybuttonregret)
+                    mybuttonregret.bind(on_release=popup.dismiss)
+                    popup.open()
+
 
             def on_touch_up(self, touch):
-                #since I catch all the events I must send it to the widgets with touchup events:
-                self.ids['vidsliderID'].on_touch_up(touch)
-                # https://stackoverflow.com/questions/50590027/how-can-i-detect-when-touch-is-in-the-children-widget-in-kivy
-                #if you release on the slider OR the slider value was moved (just checking values doesnt account for leaving it on the same frame):
-                fprint("what are values?", self.FCVAWidget_shared_metadata_dict["oldsliderpos"], self.ids['vidsliderID'].value)
-                #button takes precedence:
-                if self.ids['StartScreenButtonID'].collide_point(*touch.pos):
-                    self.toggleCV()
-                elif self.ids['vidsliderID'].collide_point(*touch.pos) or (self.FCVAWidget_shared_metadata_dict["oldsliderpos"] != self.ids['vidsliderID'].value):
-                    fprint("args dont matter, check sliderpos:",self.ids['vidsliderID'].value)
-                    self.CV_on()
-                
+                #make sure cv is loaded before doing anything:
+                if len(self.subprocess_list) == self.cvpartitions and len([keyVAR for keyVAR in self.FCVAWidget_shared_metadata_dict.keys() if "subprocess_cv_load" in keyVAR and self.FCVAWidget_shared_metadata_dict[keyVAR]]) == self.cvpartitions:
+                    #since I catch all the events I must send it to the widgets with touchup events:
+                    self.ids['vidsliderID'].on_touch_up(touch)
+                    # https://stackoverflow.com/questions/50590027/how-can-i-detect-when-touch-is-in-the-children-widget-in-kivy
+                    #if you release on the slider OR the slider value was moved (just checking values doesnt account for leaving it on the same frame):
+                    fprint("what are values?", self.FCVAWidget_shared_metadata_dict["oldsliderpos"], self.ids['vidsliderID'].value)
+                    #button takes precedence:
+                    if self.ids['StartScreenButtonID'].collide_point(*touch.pos):
+                        self.toggleCV()
+                    elif self.ids['vidsliderID'].collide_point(*touch.pos) or (self.FCVAWidget_shared_metadata_dict["oldsliderpos"] != self.ids['vidsliderID'].value):
+                        fprint("args dont matter, check sliderpos:",self.ids['vidsliderID'].value)
+                        self.CV_on()
+                else:
+                    #popup warning
+                    box = BoxLayout(orientation='vertical')
+                    popup = Popup(title="Please wait while CV is loading...", content=box, size_hint=(0.5, 0.5))
+
+                    mybuttonregret = Button(text="Ok", size_hint=(.5, 0.25))
+                    box.add_widget(mybuttonregret)
+                    mybuttonregret.bind(on_release=popup.dismiss)
+                    popup.open()
+
 
             def updateSliderData(self, *args):
                 '''
@@ -679,7 +772,7 @@ def updateSliderData(self, *args):
                 caplength = int(captest.get(cv2.CAP_PROP_FRAME_COUNT))
                 #update slidermax so that u have a 1 to 1 relationship between sliderval and frame:
                 self.ids['vidsliderID'].max = caplength
-                fprint("what is caplenthg?", caplength)
+                # fprint("what is caplenthg?", caplength)
                 capfps = captest.get(cv2.CAP_PROP_FPS)
                 self.spf = (1/capfps)
                 captest.release()
@@ -688,7 +781,10 @@ def updateSliderData(self, *args):
                 FCVAWidget_shared_metadata_dictVAR["capfps"] = capfps
                 self.fps = FCVAWidget_shared_metadata_dictVAR["capfps"]
                 FCVAWidget_shared_metadata_dictVAR["maxseconds"] = maxseconds
-                print( maxseconds )
+                # fprint( "maxseconds", maxseconds )
+                # fprint("idslist", self.ids)
+                self.ids['StartScreenTimerID'].text = self.updateSliderElapsedTime(self.ids['vidsliderID'].value)
+                #hint, add colorfmtval here to self.FCVAWidget_shared_metadata_dict and also update it on filedrop
 
             def updateSliderElapsedTime(self, *args):
                 # https://stackoverflow.com/questions/775049/how-do-i-convert-seconds-to-hours-minutes-and-seconds
@@ -706,14 +802,24 @@ def updateSliderElapsedTime(self, *args):
                     return ""
 
             def _on_file_drop(self, window, file_path, x, y):
-                print(file_path, str(file_path, encoding='utf-8'))
-                self.FCVAWidget_shared_metadata_dict["source"] = str(file_path, encoding='utf-8')
-                self.updateSliderData(self.FCVAWidget_shared_metadata_dict)
-                #have a popup saying it's loaded or not:
-                self.textpopup(title= "Loading file...", text= "Attempting to load: " + self.FCVAWidget_shared_metadata_dict["source"])
-            
+                if len(self.subprocess_list) == self.cvpartitions and len([keyVAR for keyVAR in self.FCVAWidget_shared_metadata_dict.keys() if "subprocess_cv_load" in keyVAR and self.FCVAWidget_shared_metadata_dict[keyVAR]]) == self.cvpartitions:
+                    print(file_path, str(file_path, encoding='utf-8'))
+                    self.FCVAWidget_shared_metadata_dict["source"] = str(file_path, encoding='utf-8')
+                    self.updateSliderData(self.FCVAWidget_shared_metadata_dict)
+                    #have a popup saying it's loaded or not:
+                    self.textpopupinstance(title= "Loading file...", text= "Attempting to load: " + self.FCVAWidget_shared_metadata_dict["source"])
+                else:
+                    #popup warning
+                    box = BoxLayout(orientation='vertical')
+                    popup = Popup(title="Please wait while CV is loading...", content=box, size_hint=(0.5, 0.5))
+
+                    mybuttonregret = Button(text="Ok", size_hint=(.5, 0.25))
+                    box.add_widget(mybuttonregret)
+                    mybuttonregret.bind(on_release=popup.dismiss)
+                    popup.open()
+
             # https://stackoverflow.com/questions/54501099/how-to-run-a-method-on-the-exit-of-a-kivy-app
-            def textpopup(self, title='', text=''):
+            def textpopupinstance(self, title='', text=''):
                 """Open the pop-up with the name.
 
                 :param title: title of the pop-up to open
@@ -723,12 +829,33 @@ def textpopup(self, title='', text=''):
                 :rtype: None
                 """
                 box = BoxLayout(orientation='vertical')
-                box.add_widget(Label(text=text, text_size= (400, None)))
+                textlabel = Label(text=text, text_size= (None,None))
+                box.add_widget(textlabel)
+                
+                titlewidget = Label(text="Color format of video", text_size= (400, None))
+                box.add_widget(titlewidget)
+                
+                textinputwidget = TextInput(text='bgr', multiline=False)
+                box.add_widget(textinputwidget)
+
+                titlewidget2 = Label(text="frame resolution", text_size= (400, None))
+                box.add_widget(titlewidget2)
+                
+                textinputwidget2 = TextInput(text='1920, 1080', multiline=False)
+                box.add_widget(textinputwidget2)
+                
+                popup = FCVAPopup(title=title, content=box, size_hint=(0.8, 0.8))
+                #give popup the reference to textinput and FCVAWidget
+                popup.fcvapopuptextinputREF = textinputwidget
+                popup.resolutiontextinputREF = textinputwidget2
+                popup.fcvaref = self
+
                 mybuttonregret = Button(text="Ok", size_hint=(.5, 0.25))
                 box.add_widget(mybuttonregret)
-                popup = Popup(title=title, content=box, size_hint=(None, None), size=(600, 300))
                 mybuttonregret.bind(on_release=popup.dismiss)
                 popup.open()
+                #adjust the textlabel text_size after widget is displayed
+                textlabel.text_size = (0.9*popup.width, textlabel.height)
 
             def seektime(self):
                 '''
@@ -770,6 +897,9 @@ def CV_on(self):
                         self.blitschedule.cancel()
                     self.blitschedule = Clock.schedule_once(self.delay_blit, self.FCVAWidget_shared_metadata_dict['bufferwaitVAR2'])
                     fprint("BLIT IN self.FCVAWidget_shared_metadata_dict['bufferwaitVAR2'] SEC REGULAR")
+                #https://stackoverflow.com/a/45163385
+                fprint("set starttime to:", self.FCVAWidget_shared_metadata_dict["starttime"], time.strftime('%Y-%m-%d %H:%M:%S %Z', time.localtime(self.FCVAWidget_shared_metadata_dict["starttime"]))  )
+                #TL:DR, IS SELF.FCVAWidget_shared_metadata_dict DIFFERENT FROM FCVAWidget_shared_metadata_dict ????, they should be the same since I pass self.FCVAWidget_shared_metadata_dict to FCVAWidget_SubprocessInit, it might be different only when I call FCVAWidget_shared_metadata_dict since that is inherited from FCVAKivyBase which calls FCVA.FCVAWidgetInit
 
             def CV_off(self):
                 self.ids['StartScreenButtonID'].text = "\U000F040A" #this is play
@@ -788,7 +918,12 @@ def toggleCV(self, *args):
                     self.CV_off()
 
             def populate_texture(self, texture, bufferVAR, colorformatVAR, bufferfmtVAR):
-                texture.blit_buffer(bufferVAR, colorfmt=colorformatVAR, bufferfmt=bufferfmtVAR)
+                try:
+                    texture.blit_buffer(bufferVAR, colorfmt=colorformatVAR, bufferfmt=bufferfmtVAR)
+                except Exception as e: 
+                    print("populate_texture died!", e, flush=True)
+                    import traceback
+                    print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
             
             def blit_from_shared_memory(self, *args):
                 try:
@@ -822,7 +957,10 @@ def blit_from_shared_memory(self, *args):
                         # https://stackoverflow.com/questions/43748991/how-to-check-if-a-variable-is-either-a-python-list-numpy-array-or-pandas-series
                         if frame != None:
                             frame = blosc2.decompress(frame)
-                            frame = np.frombuffer(frame, np.uint8).copy().reshape(1080, 1920, 3)
+                            framewidth = self.FCVAWidget_shared_metadata_dict["fdimension"][0]
+                            frameheight = self.FCVAWidget_shared_metadata_dict["fdimension"][1]
+                            fprint("dimension types blitting", type(framewidth), framewidth, type(frameheight), frameheight)
+                            frame = np.frombuffer(frame, np.uint8).copy().reshape(frameheight, framewidth, 3)
                             # frame = np.frombuffer(frame, np.uint8).copy().reshape(720, 1280, 3)
                             # frame = np.frombuffer(frame, np.uint8).copy().reshape(720, 1280, 4)
                             # frame = np.frombuffer(frame, np.uint8).copy().reshape(480, 640, 3)
@@ -853,8 +991,12 @@ def blit_from_shared_memory(self, *args):
                                 #     # default to bgr
                                 #     self.colorfmtval = "bgr"
 
-                                self.colorfmtval = "bgr"
+                                # fprint("keys? where do I add colorfmtval?", self.shared_pool_meta_list) #shared pool meta list is from the cv subprocess
+                                # fprint("keys? where do I add colorfmtval?", self.FCVAWidget_shared_metadata_dict.keys()) #NICEC I FOUND THE CORRECT SHARED DICT
+                                # self.colorfmtval = "bgr"
                                 # self.colorfmtval = "bgra"
+                                # print("check colorfmt and type", self.FCVAWidget_shared_metadata_dict["colorfmt"], type(self.FCVAWidget_shared_metadata_dict["colorfmt"]))
+                                self.colorfmtval = self.FCVAWidget_shared_metadata_dict["colorfmt"]
 
                                 # texture documentation: https://github.com/kivy/kivy/blob/master/kivy/graphics/texture.pyx
                                 # blit to texture
@@ -893,10 +1035,12 @@ def blit_from_shared_memory(self, *args):
                                 # print("blitting to texture index:", self.index)
 
                                 ggtime = time.time()
-                                if not hasattr(self, "texture1"):
+                                #make sure texture exists AND it matches the correct size, otherwise delete old texture and create anew
+                                if not hasattr(self, "texture1") or (self.texture1.size[0] != framewidth and self.texture1.size[1] != frameheight) :
                                     self.texture1 = Texture.create(
                                         size=(frame.shape[1], frame.shape[0]), colorfmt=self.colorfmtval)
-                                    fprint("created texture!!!!")
+                                    fprint("created texture!!!!", self.texture1.size)
+                                fprint("texture size", self.texture1.size)
                                 # https://stackoverflow.com/questions/51546327/in-kivy-is-there-a-way-to-dynamically-change-the-shape-of-a-texture
                                 self.texture1.add_reload_observer(self.populate_texture)
                                 self.populate_texture(self.texture1, buf, self.colorfmtval, "ubyte")
@@ -932,6 +1076,7 @@ def blit_from_shared_memory(self, *args):
         FCVAWidget.fps = args[3]
         FCVAWidget.appliedcv = args[4]
         FCVAWidget.bufferwaitVAR2 = args[5]
+        FCVAWidget.kvinit_dictVAR2 = args[6]
 
         # BACKSLASHES NOT COMPATIBLE WITH FSTRINGS: https://stackoverflow.com/questions/66173070/how-to-put-backslash-escape-sequence-into-f-string SOLUTION IS TO DO THINGS IN PYTHON SIDE, (set id.text values, etc)
         FCVAWidget_KV = f"""
@@ -959,6 +1104,7 @@ def blit_from_shared_memory(self, *args):
             id: StartScreenButtonID
             text: 'waiting for cv function/mediapipe to load'
         Label:
+            id: StartScreenTimerID
             # text: str(vidsliderID.value) #convert slider label to a time
             text: root.updateSliderElapsedTime(vidsliderID.value)
 """
@@ -970,6 +1116,9 @@ def open_kivy(*args):
             os.environ["KIVY_NO_CONSOLELOG"] = "1" #logging errs on laptop for some reason
             # if sys.__stdout__ is None or sys.__stderr__ is None:
             #     os.environ["KIVY_NO_CONSOLELOG"] = "1"
+            # disable multitouch that makes red dots on MACM1 as per: https://github.com/AccelQuasarDragon/FastCVApp/issues/3
+            from kivy.config import Config
+            Config.set('input', 'mouse', 'mouse,multitouch_on_demand')
             from kivy.app import App
             from kivy.lang import Builder
             from kivy.uix.screenmanager import ScreenManager, Screen
@@ -996,6 +1145,7 @@ def __init__(self, *args, **kwargs):
                             self.fps,
                             self.appliedcvVAR,
                             self.bufferwaitVAR,
+                            self.kvinit_dictVAR, 
                             )
 
                     if len(kvstring_check) != 0:
@@ -1044,7 +1194,7 @@ def on_request_close(self, *args, **kwargs):
                     # fprint("totality", [widgetVAR.ids for widgetVAR in main_instance.get_running_app().root.walk(loopback=True) if hasattr(widgetVAR, "ids") and "FCVAWidget_id" in  widgetVAR.ids])
                     # fprint("did I get it???", [widgetVAR.ids["FCVAWidget_id"] for widgetVAR in main_instance.get_running_app().root.walk(loopback=True) if hasattr(widgetVAR, "ids")])
 
-                    #now that I found the FCVAWidget_id using root.walk, fire the even to turn off all subprocesses
+                    #now that I found the FCVAWidget_id using root.walk, fire the event to turn off all subprocesses
                     FCVAWidget_searchlist = [widgetVAR for widgetVAR in main_instance.get_running_app().root.walk(loopback=True) if hasattr(widgetVAR, "ids") and "FCVAWidget_id" in  widgetVAR.ids]
                     # now I have the widget by ID, but NOT THE WIDGET: https://stackoverflow.com/a/35795211
                     #fire all the clear events:
@@ -1090,4 +1240,4 @@ class StartScreen(Screen):
         except Exception as e: 
             print("kivy subprocess died!", e, flush=True)
             import traceback
-            print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
+            print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
\ No newline at end of file
diff --git a/fastcvapp/fcvautils.py b/fastcvapp/fcvautils.py
new file mode 100644
index 0000000..7aed338
--- /dev/null
+++ b/fastcvapp/fcvautils.py
@@ -0,0 +1,100 @@
+import os
+import time
+import sys
+import shutil
+
+def fprint(*args):
+	print(os.getpid(), time.time(), *args, flush = True)
+
+def FCVA_update_resources(*args, sourcelocationVAR = False, destlocationVAR = False):
+	'''
+	this is to update paths, for example when an app is packaged with pyinstaller
+	#keyword argument notes: https://treyhunner.com/2018/04/keyword-arguments-in-python/#What_are_keyword_arguments? 
+	ALSO ON MAC: it fixes getcwd to be the location of the pyinstaller exe as per: https://stackoverflow.com/questions/50563950/about-maos-python-building-applications-os-getcwd-to-return-data-problems
+	https://stackoverflow.com/a/50564083
+	'''
+	if hasattr(sys, "_MEIPASS"):
+		# if file is frozen by pyinstaller add the MEIPASS folder to path:
+		sys.path.append(sys._MEIPASS) 
+		#the path is duplicated, maybe that's why it's running twice?
+		#possibly pyinstaller updated
+		print("MMEIPAS APPENDED CORRECT?", sys._MEIPASS)
+		#solution: when u run the exe, check for the file/folder and if it's there or not > then if not copy it from tmpdir
+		if not isinstance(sourcelocationVAR, list):
+			fprint("sourcelocationVAR is not a list usable by os.path.join", sourcelocationVAR, type(sourcelocationVAR))
+		if not isinstance(destlocationVAR, list):
+			fprint("destlocationVAR is not a list usable by os.path.join", destlocationVAR, type(destlocationVAR))
+		if sourcelocationVAR and destlocationVAR and isinstance(sourcelocationVAR, list) and isinstance(destlocationVAR, list):
+			
+			#what needs to happen:
+			#fix directory for mac
+			from sys import platform
+			if platform == "darwin":
+				# https://stackoverflow.com/a/50564083
+				# You can use os.chdir(path) to explicitly set the pwd to the above path.
+				os.chdir(os.path.dirname(sys.executable))
+			
+			#check if paths already exist from source, if source is a file (then copy the directory) or a folder (copy that directory)
+			import pathlib
+			solution = []
+			for pathstr in sys.path+[os.getcwd(), sys._MEIPASS]:
+				pathoption = list(pathlib.Path(pathstr).rglob(os.path.join(*sourcelocationVAR)))
+				testfilter = [pathselection for pathselection in pathoption if "var" not in pathselection.resolve().__str__() or ".app" not in pathselection.resolve().__str__()]
+				# print("pathoption fcvautils", pathoption)
+				# print("testfilter fcvautils", os.getpid(), testfilter)
+				if testfilter != []:
+					# solution.append(*testfilter)
+					solution += testfilter
+			solution = [str(pathobj) for pathobj in solution]
+			if len(solution) == 0:
+				fprint("no sourcelocations detected in sys.path, os.getcwd() and sys._MEIPASS, picking the first one", solution, sourcelocationVAR)
+				return
+			if len(solution) > 1:
+				fprint("multiple sourcelocations detected in sys.path, os.getcwd() and sys._MEIPASS, picking the first one", solution, sourcelocationVAR)
+			
+			print("solution answer?", solution)
+			tempsource = solution[0]
+			print("who is chosen tempsource?", tempsource)
+
+			if os.path.isfile(tempsource):
+				#then copy the dirname of the directory holding tempsource, assuming basepath is os.getcwd\
+				tempsourcefolder = os.path.dirname(tempsource)
+			#if ur a directory u don't have to worry about anything
+			else:
+				tempsourcefolder = tempsource
+
+			actualsourcefolder = os.path.join(os.getcwd(), *destlocationVAR)
+			shutil.copytree(tempsourcefolder, actualsourcefolder, dirs_exist_ok = True)
+				
+			
+			
+			
+
+			 
+			# #check if dir or file first then decide:
+			# if os.path.isdir("data"):
+			# 	actualsource = os.getcwd() + os.sep + destlocationVAR
+			# elif os.path.isfile("data"):
+			# 	actualsourcefolder = os.path.dirname(actualsource)
+			# print("cwd????", os.getcwd(), __file__)
+			# # print("dwc", os.chdir(pathlib.Path(os.path.dirname(os.path.abspath(__file__)))))
+			# # print("dwc2", os.path.dirname(sys.executable))
+			# # mac getcwd is hell 
+			# # https://stackoverflow.com/questions/50563950/about-maos-python-building-applications-os-getcwd-to-return-data-problems
+			# # https://stackoverflow.com/questions/54837659/python-pyinstaller-on-mac-current-directory-problem
+			# print("what is tempsource?", tempsource, not os.path.isfile(actualsource), "actual", actualsource)
+			# if not os.path.isfile(actualsource):
+			# 	#copy to current directory:
+			# 	#again filpaths are a pain, mac needs the initial slash: /var/temp NOT var/temp
+			# 	if platform == "win32":
+			# 		tempsourcefolder = os.path.join(*tempsource.split(os.sep)[:-1]) 
+			# 	if platform == "darwin":
+			# 		tempsourcefolder = os.path.join(os.sep, *tempsource.split(os.sep)[:-1]) 
+			# 	# actualsourcefolder = os.path.join(*actualsource.split(os.sep)[:-1])
+			# 	# rootguyvar = os.path.dirname(__file__)
+			# 	# fprint("what is this folder?", sourcelocationVAR, "===", *sourcelocationVAR.split(os.sep)[:-1], "===", tempsourcefolder)
+			# 	print("temsource VS actualsource and how are they made? it should be examples folder to examples", tempsourcefolder, actualsourcefolder)
+			# 	actualsourcefolder = os.path.join(*sourcelocationVAR.split(os.sep)[:-1]) 
+			# 	shutil.copytree(tempsourcefolder, actualsourcefolder, dirs_exist_ok = True)
+			# 	# existsornot = os.path.isdir(actualsourcefolder)
+			# 	# print("copyanything", tempsourcefolder, actualsourcefolder, existsornot)
\ No newline at end of file
diff --git a/FastCVApp/fonts/materialdesignicons-webfont.ttf b/fastcvapp/fonts/materialdesignicons-webfont.ttf
similarity index 100%
rename from FastCVApp/fonts/materialdesignicons-webfont.ttf
rename to fastcvapp/fonts/materialdesignicons-webfont.ttf
diff --git a/FastCVApp/logviewer/logs.txt b/fastcvapp/logviewer/logs.txt
similarity index 100%
rename from FastCVApp/logviewer/logs.txt
rename to fastcvapp/logviewer/logs.txt
diff --git a/FastCVApp/logviewer/matplot_timeline.py b/fastcvapp/logviewer/matplot_timeline.py
similarity index 100%
rename from FastCVApp/logviewer/matplot_timeline.py
rename to fastcvapp/logviewer/matplot_timeline.py
diff --git a/pyproject.toml b/pyproject.toml
index fdd1cd0..256e9e3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "fastcvapp"
-version = "0.2.0"
+version = "0.2.1"
 description = "Create a computer vision app FAST! Multiprocessing made easy, right out of the box."
 authors = ["AccelQuasarDragon"]
 license = "MIT License"
@@ -11,7 +11,7 @@ include = [
 ]
 
 [tool.poetry.dependencies]
-python = "^3.9.0,<3.12" #python = "^3.8,<3.12"
+python = "^3.9.0,<3.12" #python = "^3.8,<3.12" ("^3.9.0,<3.12" is required b/c pyinstaller...)
 Kivy = "^2.2.0"
 opencv-python = "^4.6.0.66"
 numpy = "^1.23.4"
diff --git a/requirementsMAC_M1.txt b/requirementsMAC_M1.txt
index 16987d1..a898567 100644
--- a/requirementsMAC_M1.txt
+++ b/requirementsMAC_M1.txt
@@ -1,47 +1,750 @@
-absl-py==1.4.0
-altgraph==0.17.3
-async-generator==1.10
-attrs==22.2.0
-black==22.12.0
-certifi==2022.12.7
-charset-normalizer==3.1.0
-click==8.1.3
-contourpy==1.0.7
-cycler==0.11.0
-dill==0.3.6
-docutils==0.19
-exceptiongroup==1.1.1
-flatbuffers==23.3.3
-fonttools==4.39.3
-idna==3.4
-Kivy==2.1.0
-Kivy-Garden==0.1.5
-kiwisolver==1.4.4
-macholib==1.16.2
-matplotlib==3.7.1
-mediapipe-silicon==0.9.1
-mypy-extensions==1.0.0
-numpy==1.24.2
-opencv-contrib-python==4.7.0.72
-opencv-python==4.7.0.72
-outcome==1.2.0
-packaging==23.0
-pathspec==0.11.1
-Pillow==9.4.0
-platformdirs==3.2.0
-protobuf==3.20.3
-pydantic==1.10.7
-Pygments==2.14.0
-pyinstaller==5.9.0
-pyinstaller-hooks-contrib==2023.1
-pyparsing==3.0.9
-PySnooper==1.1.1
-python-dateutil==2.8.2
-requests==2.28.2
-six==1.16.0
-sniffio==1.3.0
-sortedcontainers==2.4.0
-tomli==2.0.1
-trio==0.22.0
-typing_extensions==4.5.0
-urllib3==1.26.15
+absl-py==1.4.0 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:0d3fe606adfa4f7db64792dd4c7aee4ee0c38ab75dfd353b7a83ed3e957fcb47 \
+    --hash=sha256:d2c244d01048ba476e7c080bd2c6df5e141d211de80223460d5b3b8a2a58433d
+attrs==23.1.0 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \
+    --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015
+blosc2==2.2.6 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:0f855dc9ada046170f96ddaf63d13ad67f5f97f93c78e4363dd15f6ca25b1f30 \
+    --hash=sha256:2855a6c95d4ca919e80ced065b8c193569d43ab4e199a662a4cc1e213492b1d6 \
+    --hash=sha256:2e1b00222457516b2ba9a7d205e7be2680fd10caf5242a48fe701ba9beb851d0 \
+    --hash=sha256:391322885b9b27e20372b955dc99a443acc0a585857ea6ecf00909b8a54325e3 \
+    --hash=sha256:3c45291007cacbcb5c46ba22476e85fe6b64efbb2e796079bd619e891e00fff1 \
+    --hash=sha256:690d6f8bd31270aad7cf019a6296bd8da773f0bf3c7b783e443f7177aef74d98 \
+    --hash=sha256:6c611cfdf0fb38cacaaf21cb7f207d7f01fa806f8ae822c923afbb49897d4124 \
+    --hash=sha256:74425f674446304270b38e326a1ce72d2ae0e80f142dacd46ce2872a99fad671 \
+    --hash=sha256:7c22009aab27f5e78c39b2281a7a6add3a26dd02fb71e183d7f1a2997a7ff458 \
+    --hash=sha256:8c75f8acf6a4ea6034d642d5235cc99fa60bd5ea7117a0fef444c4a915ecfe7a \
+    --hash=sha256:95ce6b09399c15138e19e00689a65ba2b9e96a92212d100b7bd20ba04658f2d8 \
+    --hash=sha256:a71163a61350c75b7543c0a4ed84b5d506f1df03f75fac1a8f74b13161698f65 \
+    --hash=sha256:a85bcb247fba4d833aeb2a82b5fe47f4c5545c2cb61dc37618d0739b4563cd56 \
+    --hash=sha256:b107ea9ed29e7a66908264fd6501371b592afb7dd381f51165cb9bedd932d435 \
+    --hash=sha256:b416be54f5770fdf812b463617134a4637ed3d995659b86970a91228150692d1 \
+    --hash=sha256:b6d006b53872d25de4f2a84ddec6f0ad9df7ece77f130cd724e32c9913dfed28 \
+    --hash=sha256:cb8714ac35f7a52860dde1c767930e568d4a8f6faf503763a06970ff59853259 \
+    --hash=sha256:cebcdf8388dd3173edf0a59b452402ee1c1102fc21b03215eb926ca02e89ef87 \
+    --hash=sha256:cf4bb1b89a73b1fbaf65d0606f2e47be04c7e32eb3f5d6038c00d3032c4a2de3 \
+    --hash=sha256:e388e7160075376789542e7b23a08d1a0292f34532fb582f3c610b4ccf80d8f0 \
+    --hash=sha256:e3a6bbdcddb99506de0df08ea21b0e98202534f08454d645a644719d6b283a2a
+certifi==2023.7.22 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \
+    --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9
+cffi==1.15.1 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \
+    --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \
+    --hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \
+    --hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \
+    --hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \
+    --hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \
+    --hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \
+    --hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \
+    --hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \
+    --hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \
+    --hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \
+    --hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \
+    --hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \
+    --hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \
+    --hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \
+    --hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \
+    --hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \
+    --hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \
+    --hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \
+    --hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \
+    --hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \
+    --hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \
+    --hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \
+    --hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \
+    --hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \
+    --hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \
+    --hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \
+    --hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \
+    --hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \
+    --hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \
+    --hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \
+    --hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \
+    --hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \
+    --hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \
+    --hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \
+    --hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \
+    --hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \
+    --hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \
+    --hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \
+    --hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \
+    --hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \
+    --hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \
+    --hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \
+    --hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \
+    --hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \
+    --hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \
+    --hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \
+    --hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \
+    --hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \
+    --hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \
+    --hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \
+    --hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \
+    --hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \
+    --hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \
+    --hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \
+    --hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \
+    --hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \
+    --hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \
+    --hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \
+    --hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \
+    --hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \
+    --hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \
+    --hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \
+    --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0
+charset-normalizer==3.2.0 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96 \
+    --hash=sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c \
+    --hash=sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710 \
+    --hash=sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706 \
+    --hash=sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020 \
+    --hash=sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252 \
+    --hash=sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad \
+    --hash=sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329 \
+    --hash=sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a \
+    --hash=sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f \
+    --hash=sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6 \
+    --hash=sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4 \
+    --hash=sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a \
+    --hash=sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46 \
+    --hash=sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2 \
+    --hash=sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23 \
+    --hash=sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace \
+    --hash=sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd \
+    --hash=sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982 \
+    --hash=sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10 \
+    --hash=sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2 \
+    --hash=sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea \
+    --hash=sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09 \
+    --hash=sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5 \
+    --hash=sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149 \
+    --hash=sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489 \
+    --hash=sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9 \
+    --hash=sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80 \
+    --hash=sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592 \
+    --hash=sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3 \
+    --hash=sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6 \
+    --hash=sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed \
+    --hash=sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c \
+    --hash=sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200 \
+    --hash=sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a \
+    --hash=sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e \
+    --hash=sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d \
+    --hash=sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6 \
+    --hash=sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623 \
+    --hash=sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669 \
+    --hash=sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3 \
+    --hash=sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa \
+    --hash=sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9 \
+    --hash=sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2 \
+    --hash=sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f \
+    --hash=sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1 \
+    --hash=sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4 \
+    --hash=sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a \
+    --hash=sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8 \
+    --hash=sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3 \
+    --hash=sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029 \
+    --hash=sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f \
+    --hash=sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959 \
+    --hash=sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22 \
+    --hash=sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7 \
+    --hash=sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952 \
+    --hash=sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346 \
+    --hash=sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e \
+    --hash=sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d \
+    --hash=sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299 \
+    --hash=sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd \
+    --hash=sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a \
+    --hash=sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3 \
+    --hash=sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037 \
+    --hash=sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94 \
+    --hash=sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c \
+    --hash=sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858 \
+    --hash=sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a \
+    --hash=sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449 \
+    --hash=sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c \
+    --hash=sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918 \
+    --hash=sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1 \
+    --hash=sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c \
+    --hash=sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac \
+    --hash=sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa
+contourpy==1.1.0 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e \
+    --hash=sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104 \
+    --hash=sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70 \
+    --hash=sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882 \
+    --hash=sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f \
+    --hash=sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48 \
+    --hash=sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e \
+    --hash=sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a \
+    --hash=sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37 \
+    --hash=sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a \
+    --hash=sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2 \
+    --hash=sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655 \
+    --hash=sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545 \
+    --hash=sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027 \
+    --hash=sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15 \
+    --hash=sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94 \
+    --hash=sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439 \
+    --hash=sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d \
+    --hash=sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa \
+    --hash=sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae \
+    --hash=sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103 \
+    --hash=sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc \
+    --hash=sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa \
+    --hash=sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f \
+    --hash=sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18 \
+    --hash=sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9 \
+    --hash=sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76 \
+    --hash=sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493 \
+    --hash=sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9 \
+    --hash=sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed \
+    --hash=sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4 \
+    --hash=sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f \
+    --hash=sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3 \
+    --hash=sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21 \
+    --hash=sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e \
+    --hash=sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1 \
+    --hash=sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a \
+    --hash=sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002 \
+    --hash=sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256
+cycler==0.11.0 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3 \
+    --hash=sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f
+docutils==0.20.1 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 \
+    --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b
+flatbuffers==23.5.26 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:9ea1144cac05ce5d86e2859f431c6cd5e66cd9c78c558317c7955fb8d4c78d89 \
+    --hash=sha256:c0ff356da363087b915fde4b8b45bdda73432fc17cddb3c8157472eab1422ad1
+fonttools==4.42.1 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:0eb79a2da5eb6457a6f8ab904838454accc7d4cccdaff1fd2bd3a0679ea33d64 \
+    --hash=sha256:113337c2d29665839b7d90b39f99b3cac731f72a0eda9306165a305c7c31d341 \
+    --hash=sha256:12a7c247d1b946829bfa2f331107a629ea77dc5391dfd34fdcd78efa61f354ca \
+    --hash=sha256:179737095eb98332a2744e8f12037b2977f22948cf23ff96656928923ddf560a \
+    --hash=sha256:19b7db825c8adee96fac0692e6e1ecd858cae9affb3b4812cdb9d934a898b29e \
+    --hash=sha256:37983b6bdab42c501202500a2be3a572f50d4efe3237e0686ee9d5f794d76b35 \
+    --hash=sha256:3a35981d90feebeaef05e46e33e6b9e5b5e618504672ca9cd0ff96b171e4bfff \
+    --hash=sha256:46a0ec8adbc6ff13494eb0c9c2e643b6f009ce7320cf640de106fb614e4d4360 \
+    --hash=sha256:4aa79366e442dbca6e2c8595645a3a605d9eeabdb7a094d745ed6106816bef5d \
+    --hash=sha256:515607ec756d7865f23070682622c49d922901943697871fc292277cf1e71967 \
+    --hash=sha256:53eb5091ddc8b1199330bb7b4a8a2e7995ad5d43376cadce84523d8223ef3136 \
+    --hash=sha256:5d18fc642fd0ac29236ff88ecfccff229ec0386090a839dd3f1162e9a7944a40 \
+    --hash=sha256:5fb289b7a815638a7613d46bcf324c9106804725b2bb8ad913c12b6958ffc4ec \
+    --hash=sha256:62f481ac772fd68901573956231aea3e4b1ad87b9b1089a61613a91e2b50bb9b \
+    --hash=sha256:689508b918332fb40ce117131633647731d098b1b10d092234aa959b4251add5 \
+    --hash=sha256:68a02bbe020dc22ee0540e040117535f06df9358106d3775e8817d826047f3fd \
+    --hash=sha256:6ed2662a3d9c832afa36405f8748c250be94ae5dfc5283d668308391f2102861 \
+    --hash=sha256:7286aed4ea271df9eab8d7a9b29e507094b51397812f7ce051ecd77915a6e26b \
+    --hash=sha256:7cc7d685b8eeca7ae69dc6416833fbfea61660684b7089bca666067cb2937dcf \
+    --hash=sha256:8708b98c278012ad267ee8a7433baeb809948855e81922878118464b274c909d \
+    --hash=sha256:9398f244e28e0596e2ee6024f808b06060109e33ed38dcc9bded452fd9bbb853 \
+    --hash=sha256:9e36344e48af3e3bde867a1ca54f97c308735dd8697005c2d24a86054a114a71 \
+    --hash=sha256:a398bdadb055f8de69f62b0fc70625f7cbdab436bbb31eef5816e28cab083ee8 \
+    --hash=sha256:acb47f6f8680de24c1ab65ebde39dd035768e2a9b571a07c7b8da95f6c8815fd \
+    --hash=sha256:be24fcb80493b2c94eae21df70017351851652a37de514de553435b256b2f249 \
+    --hash=sha256:c391cd5af88aacaf41dd7cfb96eeedfad297b5899a39e12f4c2c3706d0a3329d \
+    --hash=sha256:c95b0724a6deea2c8c5d3222191783ced0a2f09bd6d33f93e563f6f1a4b3b3a4 \
+    --hash=sha256:c9b1ce7a45978b821a06d375b83763b27a3a5e8a2e4570b3065abad240a18760 \
+    --hash=sha256:db372213d39fa33af667c2aa586a0c1235e88e9c850f5dd5c8e1f17515861868 \
+    --hash=sha256:db55cbaea02a20b49fefbd8e9d62bd481aaabe1f2301dabc575acc6b358874fa \
+    --hash=sha256:ed1a13a27f59d1fc1920394a7f596792e9d546c9ca5a044419dca70c37815d7c \
+    --hash=sha256:f2b82f46917d8722e6b5eafeefb4fb585d23babd15d8246c664cd88a5bddd19c \
+    --hash=sha256:f2f806990160d1ce42d287aa419df3ffc42dfefe60d473695fb048355fe0c6a0 \
+    --hash=sha256:f720fa82a11c0f9042376fd509b5ed88dab7e3cd602eee63a1af08883b37342b
+idna==3.4 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \
+    --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2
+importlib-resources==6.0.1 ; python_full_version >= "3.9.0" and python_version < "3.10" \
+    --hash=sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf \
+    --hash=sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4
+kivy-deps-angle==0.3.3 ; python_full_version >= "3.9.0" and python_version < "3.12" and sys_platform == "win32" \
+    --hash=sha256:00a4922a50a55f532722a4419eb394a7a8837d0f78620e2b47f33c6db45a4dc0 \
+    --hash=sha256:0fa32cc718b51b21745b6b7a055e6e171517f567b5900250c49539bae3d69806 \
+    --hash=sha256:6336455e59f5b8dd4dd57caca2adf397a48726af8afc48384f4539dccb7b889c \
+    --hash=sha256:8e571b2c662480a265420d6ded386df208d83272896daf616256672c5648e538 \
+    --hash=sha256:c380fb602782e525deba1200cdc0fd3c03b6b3855edb283d76f68485a185061a \
+    --hash=sha256:de6dbe3273e95a85f6f96c9f52cc0d29a1f92aa05fd10de886ba8c483021b532 \
+    --hash=sha256:e3fd1168dd4090cc2ccf650abe209483c0794c5a454360c41b01633888afbba1 \
+    --hash=sha256:e48457f6830fb53aaaa6bf3bd63d50120c1bc1c94f207d988cc8071c122456e9 \
+    --hash=sha256:f044d7e6a9f839222e44f9ae0441ae25ff42e35a5c1b7d1ea9a4d0845dd57172 \
+    --hash=sha256:fdc3de5ead670a8ee0bb411b603cabeaecf7fe277cf99cd70c9585cd964f19a2
+kivy-deps-glew==0.3.1 ; python_full_version >= "3.9.0" and python_version < "3.12" and sys_platform == "win32" \
+    --hash=sha256:00f4ae0a4682d951266458ddb639451edb24baa54a35215dce889209daf19a06 \
+    --hash=sha256:081a09b92f7e7817f489f8b6b31c9c9623661378de1dce1d6b097af5e7d42b45 \
+    --hash=sha256:22e155ec59ce717387f5d8804811206d200a023ba3d0bc9bbf1393ee28d0053e \
+    --hash=sha256:3f8b89dcf1846032d7a9c5ef88b0ee9cbd13366e9b4c85ada61e01549a910677 \
+    --hash=sha256:4e377ed97670dfda619a1b63a82345a8589be90e7c616a458fba2810708810b1 \
+    --hash=sha256:5bf6a63fe9cc4fe7bbf280ec267ec8c47914020a1175fb22152525ff1837b436 \
+    --hash=sha256:8f4b3ed15acb62474909b6d41661ffb4da9eb502bb5684301fb2da668f288a58 \
+    --hash=sha256:aef2d2a93f129d8425c75234e7f6cc0a34b59a4aee67f6d2cd7a5fdfa9915b53 \
+    --hash=sha256:d64a8625799fab7a7efeb3661ef8779a7f9c6d80da53eed87a956320f55530fa \
+    --hash=sha256:ee2f80ef7ac70f4b61c50da8101b024308a8c59a57f7f25a6e09762b6c48f942
+kivy-deps-sdl2==0.6.0 ; python_full_version >= "3.9.0" and python_version < "3.12" and sys_platform == "win32" \
+    --hash=sha256:12706ce376f258233386cff2e1d31163d2d97e34f23730d7a3b1f3931af4c78d \
+    --hash=sha256:155c2b2ae33550dee39db2343b4128036aa7e039483996763a208f82a4cb20a8 \
+    --hash=sha256:23e6aed2d1570d2a2ba4f93956d8a9fb8610d908391fe816568ceb3096a3808a \
+    --hash=sha256:4d461e4eaa30d19b8e921b40e640efb991ec9b2047cab53c85d5c1d1a30cef4a \
+    --hash=sha256:55e951f89b3e0ad9e703a0f1d3f68092f8beb71e3beebd91cffc0d13f9a06015 \
+    --hash=sha256:78b151065b89bf8fd35694e9415e24f9bd8b4706cf0f439f2371183a6950d857 \
+    --hash=sha256:d3b66da88cc256369be9df19874e55752473f41bffbbbc1a0d146bb09618c5a1 \
+    --hash=sha256:f091c84144f612969e5474bdd2d6e46c6dd94834b621e79770e89b52572bd836 \
+    --hash=sha256:f9c932badc868b948b65626884e4b6617373b7ce8260f4c1ac9de5979cdf30b3 \
+    --hash=sha256:fc1f78d86021a2bf1d8e6107ad611cc8c0610f6faf76062ab39ffdf1de31baef
+kivy-garden==0.1.5 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:2b8377378e87501d5d271f33d94f0e44c089884572c64f89c9d609b1f86a2748 \
+    --hash=sha256:ef50f44b96358cf10ac5665f27a4751bb34ef54051c54b93af891f80afe42929
+kivy==2.2.1 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:0454ad509b83f5ee04dd7bb46682f077adcde99d86c206127f2dd57aedd28f5b \
+    --hash=sha256:0456359afe01a94d39bb29ce8a8dd9d9dcd86cec6532f17bffb0725647a8d63a \
+    --hash=sha256:047a434e8efd32d425321e065fcccf725f165adb0c81ed69dc33c360d4796f7e \
+    --hash=sha256:0e8370d529548d360803424f803231ed8ad19c7f4c351aa893fe9d39bcc940fc \
+    --hash=sha256:0eb5de5ffea53a341790ff7ba4d3cea60d37523f0766a4783692e2aa1d50670e \
+    --hash=sha256:19cd0b0b40046d6233f0a30c8003e1ffe5a135b96ae50a5442bd62ef9d9c6744 \
+    --hash=sha256:35eb3025a77894380196d5d64852da6c539e72aa2ff4970011385eb7a70c46e0 \
+    --hash=sha256:37874a7a2a9983ae494910578e2e6a4aba1568b35f915b014d85f779b5add8b9 \
+    --hash=sha256:42a5e292f232a67bc67dfa91a205aed472dc4df7329ce059c74a88031c652efa \
+    --hash=sha256:4915e931cb26efa016956b16a0d04bcc8eb89abcb2734ed718786c30241795bb \
+    --hash=sha256:564705e8fbd788dce22dae8dfe0488be705e14381fa59d6bdfa3df5255446429 \
+    --hash=sha256:5aa8a0ca0708dd6edb0127c91712db7b8aad3aea3a79d498df145b8a7ee0aee6 \
+    --hash=sha256:6b89bc5add63bf83fd1b026ec4d492ea9c90067b30652c14afe97cd4c30a2b5a \
+    --hash=sha256:7eeda699fe764c5efa2cc43e0ef28275be2a56ccd8af17933b6e2457d66d5b0d \
+    --hash=sha256:97442522fb58ebf4038f3c57a795046e00a23f7c4dc0775b282af9aff845732a \
+    --hash=sha256:9f19ed8efaea7c880ab6342269c41ac47989812cbd036a524abc49ba9923487f \
+    --hash=sha256:a6b47a8b5b47d091ac4604635edef7522ddfb9cf47b3f258cccd8ffbf094b429 \
+    --hash=sha256:a7b8c8725cd1b3575b95f8f8b5d6f804e096af8958156450bb876821fbb2ce37 \
+    --hash=sha256:af45f433208c16a4d0e755fafac5f2238560880a475a8a041ca9d99695a6b166 \
+    --hash=sha256:b7bfbc97f66d50d71bcbc5c254e74386d94d7a1fb051448fbc1ba6742c1d1d21 \
+    --hash=sha256:c932fa9a8ade002ec4468c416bedda4188cda53721be84e4086b278c3b00c654 \
+    --hash=sha256:d1e9cf59dc3875c943c89d3668a73235c96f4c03680c4691416ccc5d1c7f50f0 \
+    --hash=sha256:d78a8d92565c6309bb1edc9a0c99883630adc0503dba25f3eb8b667ceb736395 \
+    --hash=sha256:e317a710e0be3083901d29457fa8a203c14a71b7cef8008e3cdc7d1eb8e4d7c5 \
+    --hash=sha256:e3df4f6230f4b125c78b1dd923f714e93341afda5b55ae9795df2d6b2c5dbc4d \
+    --hash=sha256:f3dcfdce8403dc3df7a8b1a7d424c0939d41bc48a0b627403b685931a609a7ec
+kiwisolver==1.4.5 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf \
+    --hash=sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e \
+    --hash=sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af \
+    --hash=sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f \
+    --hash=sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046 \
+    --hash=sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3 \
+    --hash=sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5 \
+    --hash=sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71 \
+    --hash=sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee \
+    --hash=sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3 \
+    --hash=sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9 \
+    --hash=sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b \
+    --hash=sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985 \
+    --hash=sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea \
+    --hash=sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16 \
+    --hash=sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89 \
+    --hash=sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c \
+    --hash=sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9 \
+    --hash=sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712 \
+    --hash=sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342 \
+    --hash=sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a \
+    --hash=sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958 \
+    --hash=sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d \
+    --hash=sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a \
+    --hash=sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130 \
+    --hash=sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff \
+    --hash=sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898 \
+    --hash=sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b \
+    --hash=sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f \
+    --hash=sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265 \
+    --hash=sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93 \
+    --hash=sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929 \
+    --hash=sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635 \
+    --hash=sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709 \
+    --hash=sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b \
+    --hash=sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb \
+    --hash=sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a \
+    --hash=sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920 \
+    --hash=sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e \
+    --hash=sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544 \
+    --hash=sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45 \
+    --hash=sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390 \
+    --hash=sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77 \
+    --hash=sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355 \
+    --hash=sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff \
+    --hash=sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4 \
+    --hash=sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7 \
+    --hash=sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20 \
+    --hash=sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c \
+    --hash=sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162 \
+    --hash=sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228 \
+    --hash=sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437 \
+    --hash=sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc \
+    --hash=sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a \
+    --hash=sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901 \
+    --hash=sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4 \
+    --hash=sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770 \
+    --hash=sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525 \
+    --hash=sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad \
+    --hash=sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a \
+    --hash=sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29 \
+    --hash=sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90 \
+    --hash=sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250 \
+    --hash=sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d \
+    --hash=sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3 \
+    --hash=sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54 \
+    --hash=sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f \
+    --hash=sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1 \
+    --hash=sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da \
+    --hash=sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238 \
+    --hash=sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa \
+    --hash=sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523 \
+    --hash=sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0 \
+    --hash=sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205 \
+    --hash=sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3 \
+    --hash=sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4 \
+    --hash=sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac \
+    --hash=sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9 \
+    --hash=sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb \
+    --hash=sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced \
+    --hash=sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd \
+    --hash=sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0 \
+    --hash=sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da \
+    --hash=sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18 \
+    --hash=sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9 \
+    --hash=sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276 \
+    --hash=sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333 \
+    --hash=sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b \
+    --hash=sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db \
+    --hash=sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126 \
+    --hash=sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9 \
+    --hash=sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09 \
+    --hash=sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0 \
+    --hash=sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec \
+    --hash=sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7 \
+    --hash=sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff \
+    --hash=sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9 \
+    --hash=sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192 \
+    --hash=sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8 \
+    --hash=sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d \
+    --hash=sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6 \
+    --hash=sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797 \
+    --hash=sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892 \
+    --hash=sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f
+matplotlib==3.7.3 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:085c33b27561d9c04386789d5aa5eb4a932ddef43cfcdd0e01735f9a6e85ce0c \
+    --hash=sha256:0a97af9d22e8ebedc9f00b043d9bbd29a375e9e10b656982012dded44c10fd77 \
+    --hash=sha256:122dcbf9be0086e2a95d9e5e0632dbf3bd5b65eaa68c369363310a6c87753059 \
+    --hash=sha256:12b4f6795efea037ce2d41e7c417ad8bd02d5719c6ad4a8450a0708f4a1cfb89 \
+    --hash=sha256:12f4c0dd8aa280d796c8772ea8265a14f11a04319baa3a16daa5556065e8baea \
+    --hash=sha256:165c8082bf8fc0360c24aa4724a22eaadbfd8c28bf1ccf7e94d685cad48261e4 \
+    --hash=sha256:1990955b11e7918d256cf3b956b10997f405b7917a3f1c7d8e69c1d15c7b1930 \
+    --hash=sha256:1a6094c6f8e8d18db631754df4fe9a34dec3caf074f6869a7db09f18f9b1d6b2 \
+    --hash=sha256:1f9c6c16597af660433ab330b59ee2934b832ee1fabcaf5cbde7b2add840f31e \
+    --hash=sha256:22d65d18b4ee8070a5fea5761d59293f1f9e2fac37ec9ce090463b0e629432fd \
+    --hash=sha256:236024f582e40dac39bca592258888b38ae47a9fed7b8de652d68d3d02d47d2b \
+    --hash=sha256:259999c05285cb993d7f2a419cea547863fa215379eda81f7254c9e932963729 \
+    --hash=sha256:272dba2f1b107790ed78ebf5385b8d14b27ad9e90419de340364b49fe549a993 \
+    --hash=sha256:336e88900c11441e458da01c8414fc57e04e17f9d3bb94958a76faa2652bcf6b \
+    --hash=sha256:39018a2b17592448fbfdf4b8352955e6c3905359939791d4ff429296494d1a0c \
+    --hash=sha256:3bf3a178c6504694cee8b88b353df0051583f2f6f8faa146f67115c27c856881 \
+    --hash=sha256:3f4e7fd5a6157e1d018ce2166ec8e531a481dd4a36f035b5c23edfe05a25419a \
+    --hash=sha256:40e3b9b450c6534f07278310c4e34caff41c2a42377e4b9d47b0f8d3ac1083a2 \
+    --hash=sha256:498a08267dc69dd8f24c4b5d7423fa584d7ce0027ba71f7881df05fc09b89bb7 \
+    --hash=sha256:4aab27d9e33293389e3c1d7c881d414a72bdfda0fedc3a6bf46c6fa88d9b8015 \
+    --hash=sha256:55de4cf7cd0071b8ebf203981b53ab64f988a0a1f897a2dff300a1124e8bcd8b \
+    --hash=sha256:591c123bed1cb4b9996fb60b41a6d89c2ec4943244540776c5f1283fb6960a53 \
+    --hash=sha256:67a410a9c9e07cbc83581eeea144bbe298870bf0ac0ee2f2e10a015ab7efee19 \
+    --hash=sha256:6eaa1cf0e94c936a26b78f6d756c5fbc12e0a58c8a68b7248a2a31456ce4e234 \
+    --hash=sha256:7153453669c9672b52095119fd21dd032d19225d48413a2871519b17db4b0fde \
+    --hash=sha256:747c6191d2e88ae854809e69aa358dbf852ff1a5738401b85c1cc9012309897a \
+    --hash=sha256:74bf57f505efea376097e948b7cdd87191a7ce8180616390aef496639edf601f \
+    --hash=sha256:755bafc10a46918ce9a39980009b54b02dd249594e5adf52f9c56acfddb5d0b7 \
+    --hash=sha256:78b2136cc6c5415b78977e0e8c608647d597204b05b1d9089ccf513c7d913733 \
+    --hash=sha256:7baf98c5ad59c5c4743ea884bb025cbffa52dacdfdac0da3e6021a285a90377e \
+    --hash=sha256:91e36a85ea639a1ba9f91427041eac064b04829945fe331a92617b6cb21d27e5 \
+    --hash=sha256:9c40cde976c36693cc0767e27cf5f443f91c23520060bd9496678364adfafe9c \
+    --hash=sha256:a7240259b4b9cbc62381f6378cff4d57af539162a18e832c1e48042fabc40b6b \
+    --hash=sha256:ac03377fd908aaee2312d0b11735753e907adb6f4d1d102de5e2425249693f6c \
+    --hash=sha256:c568e80e1c17f68a727f30f591926751b97b98314d8e59804f54f86ae6fa6a22 \
+    --hash=sha256:caf5eaaf7c68f8d7df269dfbcaf46f48a70ff482bfcebdcc97519671023f2a7d \
+    --hash=sha256:d48999c4b19b5a0c058c9cd828ff6fc7748390679f6cf9a2ad653a3e802c87d3 \
+    --hash=sha256:d5adc743de91e8e0b13df60deb1b1c285b8effea3d66223afceb14b63c9b05de \
+    --hash=sha256:dfc118642903a23e309b1da32886bb39a4314147d013e820c86b5fb4cb2e36d0 \
+    --hash=sha256:e594ee43c59ea39ca5c6244667cac9d017a3527febc31f5532ad9135cf7469ec \
+    --hash=sha256:e78707b751260b42b721507ad7aa60fe4026d7f51c74cca6b9cd8b123ebb633a \
+    --hash=sha256:ebd8470cc2a3594746ff0513aecbfa2c55ff6f58e6cef2efb1a54eb87c88ffa2 \
+    --hash=sha256:ec726b08a5275d827aa91bb951e68234a4423adb91cf65bc0fcdc0f2777663f7 \
+    --hash=sha256:edf54cac8ee3603f3093616b40a931e8c063969756a4d78a86e82c2fea9659f7 \
+    --hash=sha256:ee152a88a0da527840a426535514b6ed8ac4240eb856b1da92cf48124320e346 \
+    --hash=sha256:f09b3dd6bdeb588de91f853bbb2d6f0ff8ab693485b0c49035eaa510cb4f142e \
+    --hash=sha256:faa3d12d8811d08d14080a8b7b9caea9a457dc495350166b56df0db4b9909ef5
+mediapipe==0.10.3 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:05a3cf6038c832f3a9d4906f63d39bd1338c22898677620b3035394a29c68fde \
+    --hash=sha256:12d11e800038fbbc231d8e0cec9bf92f0676d580741b3d699aeb6339e8a7c09f \
+    --hash=sha256:1503517f8d2be93b99a7f2735c59dafa2bbaf2b98d29cc83a142bc01e0c72d01 \
+    --hash=sha256:370627ea1f8c6be9dbde832aa2bae8f163eb150b7460c1f96ac57ee4c5a7807c \
+    --hash=sha256:5bd13d26c212c5508dbfd73dd3e8874919c730ff0dcde272658499a90fa7f3cd \
+    --hash=sha256:6aadc67c8471fc93b117e87fff50100799960eb0510d4c4f15a1c7bf56a8ef25 \
+    --hash=sha256:83552d129d145ab88dcae742d3ae6ab37fdcd18bdf6efd5b50d3d231598e86f5 \
+    --hash=sha256:84240ae8edd28eba8d3ffa4636178063473b207a416a65d09c19ee1cd9454cbc \
+    --hash=sha256:a3e93d062bb28c9807cbe4c6482fad91b7eeff8164850789884b9c6352c170d4 \
+    --hash=sha256:c3fa2ad9ad29906c5705eee8c6af2a84a15bd2be236f584df56f8c389f2b3f41 \
+    --hash=sha256:cbfa658051bf3294f40ceddbbf5d4a71726e6637345895f3b02ce4442ed82ee9 \
+    --hash=sha256:dbcb2b414443d1c17e8f20f10b69d7b1113f21acff4ee1aada8e97521df71783 \
+    --hash=sha256:df191730be853d8a2afc2b18c8e3f174caa14242a56082f6a84c9d038a6b21a5 \
+    --hash=sha256:e47cd06fe25a52add5c0bbcd8643c8b03677c98ff3a96f8e3c122ac148d63161 \
+    --hash=sha256:f09dd2950f83125b5d720b4e3c24c62cf74968ada3832314816c52eca237564e \
+    --hash=sha256:f3b6178203200c4a9b1829bd2fa93cef55d439418b26c278c3efa6529334c837
+msgpack==1.0.5 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164 \
+    --hash=sha256:0c05a4a96585525916b109bb85f8cb6511db1c6f5b9d9cbcbc940dc6b4be944b \
+    --hash=sha256:137850656634abddfb88236008339fdaba3178f4751b28f270d2ebe77a563b6c \
+    --hash=sha256:17358523b85973e5f242ad74aa4712b7ee560715562554aa2134d96e7aa4cbbf \
+    --hash=sha256:18334484eafc2b1aa47a6d42427da7fa8f2ab3d60b674120bce7a895a0a85bdd \
+    --hash=sha256:1835c84d65f46900920b3708f5ba829fb19b1096c1800ad60bae8418652a951d \
+    --hash=sha256:1967f6129fc50a43bfe0951c35acbb729be89a55d849fab7686004da85103f1c \
+    --hash=sha256:1ab2f3331cb1b54165976a9d976cb251a83183631c88076613c6c780f0d6e45a \
+    --hash=sha256:1c0f7c47f0087ffda62961d425e4407961a7ffd2aa004c81b9c07d9269512f6e \
+    --hash=sha256:20a97bf595a232c3ee6d57ddaadd5453d174a52594bf9c21d10407e2a2d9b3bd \
+    --hash=sha256:20c784e66b613c7f16f632e7b5e8a1651aa5702463d61394671ba07b2fc9e025 \
+    --hash=sha256:266fa4202c0eb94d26822d9bfd7af25d1e2c088927fe8de9033d929dd5ba24c5 \
+    --hash=sha256:28592e20bbb1620848256ebc105fc420436af59515793ed27d5c77a217477705 \
+    --hash=sha256:288e32b47e67f7b171f86b030e527e302c91bd3f40fd9033483f2cacc37f327a \
+    --hash=sha256:3055b0455e45810820db1f29d900bf39466df96ddca11dfa6d074fa47054376d \
+    --hash=sha256:332360ff25469c346a1c5e47cbe2a725517919892eda5cfaffe6046656f0b7bb \
+    --hash=sha256:362d9655cd369b08fda06b6657a303eb7172d5279997abe094512e919cf74b11 \
+    --hash=sha256:366c9a7b9057e1547f4ad51d8facad8b406bab69c7d72c0eb6f529cf76d4b85f \
+    --hash=sha256:36961b0568c36027c76e2ae3ca1132e35123dcec0706c4b7992683cc26c1320c \
+    --hash=sha256:379026812e49258016dd84ad79ac8446922234d498058ae1d415f04b522d5b2d \
+    --hash=sha256:382b2c77589331f2cb80b67cc058c00f225e19827dbc818d700f61513ab47bea \
+    --hash=sha256:476a8fe8fae289fdf273d6d2a6cb6e35b5a58541693e8f9f019bfe990a51e4ba \
+    --hash=sha256:48296af57cdb1d885843afd73c4656be5c76c0c6328db3440c9601a98f303d87 \
+    --hash=sha256:4867aa2df9e2a5fa5f76d7d5565d25ec76e84c106b55509e78c1ede0f152659a \
+    --hash=sha256:4c075728a1095efd0634a7dccb06204919a2f67d1893b6aa8e00497258bf926c \
+    --hash=sha256:4f837b93669ce4336e24d08286c38761132bc7ab29782727f8557e1eb21b2080 \
+    --hash=sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198 \
+    --hash=sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9 \
+    --hash=sha256:5494ea30d517a3576749cad32fa27f7585c65f5f38309c88c6d137877fa28a5a \
+    --hash=sha256:55b56a24893105dc52c1253649b60f475f36b3aa0fc66115bffafb624d7cb30b \
+    --hash=sha256:56a62ec00b636583e5cb6ad313bbed36bb7ead5fa3a3e38938503142c72cba4f \
+    --hash=sha256:57e1f3528bd95cc44684beda696f74d3aaa8a5e58c816214b9046512240ef437 \
+    --hash=sha256:586d0d636f9a628ddc6a17bfd45aa5b5efaf1606d2b60fa5d87b8986326e933f \
+    --hash=sha256:5cb47c21a8a65b165ce29f2bec852790cbc04936f502966768e4aae9fa763cb7 \
+    --hash=sha256:6c4c68d87497f66f96d50142a2b73b97972130d93677ce930718f68828b382e2 \
+    --hash=sha256:821c7e677cc6acf0fd3f7ac664c98803827ae6de594a9f99563e48c5a2f27eb0 \
+    --hash=sha256:916723458c25dfb77ff07f4c66aed34e47503b2eb3188b3adbec8d8aa6e00f48 \
+    --hash=sha256:9e6ca5d5699bcd89ae605c150aee83b5321f2115695e741b99618f4856c50898 \
+    --hash=sha256:9f5ae84c5c8a857ec44dc180a8b0cc08238e021f57abdf51a8182e915e6299f0 \
+    --hash=sha256:a2b031c2e9b9af485d5e3c4520f4220d74f4d222a5b8dc8c1a3ab9448ca79c57 \
+    --hash=sha256:a61215eac016f391129a013c9e46f3ab308db5f5ec9f25811e811f96962599a8 \
+    --hash=sha256:a740fa0e4087a734455f0fc3abf5e746004c9da72fbd541e9b113013c8dc3282 \
+    --hash=sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1 \
+    --hash=sha256:ab31e908d8424d55601ad7075e471b7d0140d4d3dd3272daf39c5c19d936bd82 \
+    --hash=sha256:ac9dd47af78cae935901a9a500104e2dea2e253207c924cc95de149606dc43cc \
+    --hash=sha256:addab7e2e1fcc04bd08e4eb631c2a90960c340e40dfc4a5e24d2ff0d5a3b3edb \
+    --hash=sha256:b1d46dfe3832660f53b13b925d4e0fa1432b00f5f7210eb3ad3bb9a13c6204a6 \
+    --hash=sha256:b2de4c1c0538dcb7010902a2b97f4e00fc4ddf2c8cda9749af0e594d3b7fa3d7 \
+    --hash=sha256:b5ef2f015b95f912c2fcab19c36814963b5463f1fb9049846994b007962743e9 \
+    --hash=sha256:b72d0698f86e8d9ddf9442bdedec15b71df3598199ba33322d9711a19f08145c \
+    --hash=sha256:bae7de2026cbfe3782c8b78b0db9cbfc5455e079f1937cb0ab8d133496ac55e1 \
+    --hash=sha256:bf22a83f973b50f9d38e55c6aade04c41ddda19b00c4ebc558930d78eecc64ed \
+    --hash=sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c \
+    --hash=sha256:c396e2cc213d12ce017b686e0f53497f94f8ba2b24799c25d913d46c08ec422c \
+    --hash=sha256:cb5aaa8c17760909ec6cb15e744c3ebc2ca8918e727216e79607b7bbce9c8f77 \
+    --hash=sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81 \
+    --hash=sha256:d25dd59bbbbb996eacf7be6b4ad082ed7eacc4e8f3d2df1ba43822da9bfa122a \
+    --hash=sha256:e42b9594cc3bf4d838d67d6ed62b9e59e201862a25e9a157019e171fbe672dd3 \
+    --hash=sha256:e57916ef1bd0fee4f21c4600e9d1da352d8816b52a599c46460e93a6e9f17086 \
+    --hash=sha256:ed40e926fa2f297e8a653c954b732f125ef97bdd4c889f243182299de27e2aa9 \
+    --hash=sha256:ef8108f8dedf204bb7b42994abf93882da1159728a2d4c5e82012edd92c9da9f \
+    --hash=sha256:f933bbda5a3ee63b8834179096923b094b76f0c7a73c1cfe8f07ad608c58844b \
+    --hash=sha256:fe5c63197c55bce6385d9aee16c4d0641684628f63ace85f73571e65ad1c1e8d
+ndindex==1.7 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:4c0555d352ac9947b0f022562aea9f5d57fa06743ea069669138f75a88b42884 \
+    --hash=sha256:bf9bd0b76eeada1c8275e04091f8291869ed2b373b7af48e56faf7579fd2efd2
+numpy==1.25.2 ; python_version >= "3.9" and python_version < "3.12" \
+    --hash=sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2 \
+    --hash=sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55 \
+    --hash=sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf \
+    --hash=sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01 \
+    --hash=sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca \
+    --hash=sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901 \
+    --hash=sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d \
+    --hash=sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4 \
+    --hash=sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf \
+    --hash=sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380 \
+    --hash=sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044 \
+    --hash=sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545 \
+    --hash=sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f \
+    --hash=sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f \
+    --hash=sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3 \
+    --hash=sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364 \
+    --hash=sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9 \
+    --hash=sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418 \
+    --hash=sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f \
+    --hash=sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295 \
+    --hash=sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3 \
+    --hash=sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187 \
+    --hash=sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926 \
+    --hash=sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357 \
+    --hash=sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760
+opencv-contrib-python==4.8.0.76 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:1e140c87160369dd3a7b122ff8904bc0cd898e1767324439e1874ab7ab5096b9 \
+    --hash=sha256:45cef2da4422ec8b493c0c138d91d10b90e58f46f86f70b988032da20a6c2709 \
+    --hash=sha256:662798b863f4805b56c262f27534545d4a49529b82ae7cf273cd58cb9a9424a5 \
+    --hash=sha256:79db264071abae645d5a13d03d2b133c2abd0f967e1b014d2ffd430c1c94dfa5 \
+    --hash=sha256:a5c3d755df885899cfd1ab8e35f39b785d329a8a80aba8669f0c5c7adb238158 \
+    --hash=sha256:ae281bf2d43d0b4ee19805d8cdfc0be875ee0dd007ffb32d80311d5cb2922488 \
+    --hash=sha256:d2a9f2d002c421ea8f430514ec4d8e0d3296525648926c9aa38dc7e710bb9ac3
+opencv-python==4.8.0.76 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:48eb3121d809a873086d6677565e3ac963e6946110d13cd115533fa70e2aa2eb \
+    --hash=sha256:56d84c43ce800938b9b1ec74b33942b2edbcef3f70c2754eb9bfe5dff1ee3ace \
+    --hash=sha256:67bce4b9aad307c98a9a07c6afb7de3a4e823c1f4991d6d8e88e229e7dfeee59 \
+    --hash=sha256:93871871b1c9d6b125cddd45b0638a2fa01ee9fd37f5e428823f750e404f2f15 \
+    --hash=sha256:9bcb4944211acf13742dbfd9d3a11dc4e36353ffa1746f2c7dcd6a01c32d1376 \
+    --hash=sha256:b2349dc9f97ed6c9ba163d0a7a24bcef9695a3e216cd143e92f1b9659c5d9a49 \
+    --hash=sha256:ba32cfa75a806abd68249699d34420737d27b5678553387fc5768747a6492147
+packaging==23.1 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 \
+    --hash=sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f
+pillow==10.0.0 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5 \
+    --hash=sha256:040586f7d37b34547153fa383f7f9aed68b738992380ac911447bb78f2abe530 \
+    --hash=sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d \
+    --hash=sha256:1ce91b6ec08d866b14413d3f0bbdea7e24dfdc8e59f562bb77bc3fe60b6144ca \
+    --hash=sha256:1f62406a884ae75fb2f818694469519fb685cc7eaff05d3451a9ebe55c646891 \
+    --hash=sha256:22c10cc517668d44b211717fd9775799ccec4124b9a7f7b3635fc5386e584992 \
+    --hash=sha256:3400aae60685b06bb96f99a21e1ada7bc7a413d5f49bce739828ecd9391bb8f7 \
+    --hash=sha256:349930d6e9c685c089284b013478d6f76e3a534e36ddfa912cde493f235372f3 \
+    --hash=sha256:368ab3dfb5f49e312231b6f27b8820c823652b7cd29cfbd34090565a015e99ba \
+    --hash=sha256:38250a349b6b390ee6047a62c086d3817ac69022c127f8a5dc058c31ccef17f3 \
+    --hash=sha256:3a684105f7c32488f7153905a4e3015a3b6c7182e106fe3c37fbb5ef3e6994c3 \
+    --hash=sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f \
+    --hash=sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538 \
+    --hash=sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3 \
+    --hash=sha256:3f07ea8d2f827d7d2a49ecf1639ec02d75ffd1b88dcc5b3a61bbb37a8759ad8d \
+    --hash=sha256:520f2a520dc040512699f20fa1c363eed506e94248d71f85412b625026f6142c \
+    --hash=sha256:5c6e3df6bdd396749bafd45314871b3d0af81ff935b2d188385e970052091017 \
+    --hash=sha256:608bfdee0d57cf297d32bcbb3c728dc1da0907519d1784962c5f0c68bb93e5a3 \
+    --hash=sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223 \
+    --hash=sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e \
+    --hash=sha256:76edb0a1fa2b4745fb0c99fb9fb98f8b180a1bbceb8be49b087e0b21867e77d3 \
+    --hash=sha256:7be600823e4c8631b74e4a0d38384c73f680e6105a7d3c6824fcf226c178c7e6 \
+    --hash=sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640 \
+    --hash=sha256:88af2003543cc40c80f6fca01411892ec52b11021b3dc22ec3bc9d5afd1c5334 \
+    --hash=sha256:8c11160913e3dd06c8ffdb5f233a4f254cb449f4dfc0f8f4549eda9e542c93d1 \
+    --hash=sha256:8f8182b523b2289f7c415f589118228d30ac8c355baa2f3194ced084dac2dbba \
+    --hash=sha256:9211e7ad69d7c9401cfc0e23d49b69ca65ddd898976d660a2fa5904e3d7a9baa \
+    --hash=sha256:92be919bbc9f7d09f7ae343c38f5bb21c973d2576c1d45600fce4b74bafa7ac0 \
+    --hash=sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396 \
+    --hash=sha256:9f7c16705f44e0504a3a2a14197c1f0b32a95731d251777dcb060aa83022cb2d \
+    --hash=sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485 \
+    --hash=sha256:a74ba0c356aaa3bb8e3eb79606a87669e7ec6444be352870623025d75a14a2bf \
+    --hash=sha256:b4f69b3700201b80bb82c3a97d5e9254084f6dd5fb5b16fc1a7b974260f89f43 \
+    --hash=sha256:bc2ec7c7b5d66b8ec9ce9f720dbb5fa4bace0f545acd34870eff4a369b44bf37 \
+    --hash=sha256:c189af0545965fa8d3b9613cfdb0cd37f9d71349e0f7750e1fd704648d475ed2 \
+    --hash=sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd \
+    --hash=sha256:c7cf14a27b0d6adfaebb3ae4153f1e516df54e47e42dcc073d7b3d76111a8d86 \
+    --hash=sha256:c9f72a021fbb792ce98306ffb0c348b3c9cb967dce0f12a49aa4c3d3fdefa967 \
+    --hash=sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629 \
+    --hash=sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568 \
+    --hash=sha256:ce7b031a6fc11365970e6a5686d7ba8c63e4c1cf1ea143811acbb524295eabed \
+    --hash=sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f \
+    --hash=sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551 \
+    --hash=sha256:d5d0dae4cfd56969d23d94dc8e89fb6a217be461c69090768227beb8ed28c0a3 \
+    --hash=sha256:d5db32e2a6ccbb3d34d87c87b432959e0db29755727afb37290e10f6e8e62614 \
+    --hash=sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff \
+    --hash=sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d \
+    --hash=sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883 \
+    --hash=sha256:db24668940f82321e746773a4bc617bfac06ec831e5c88b643f91f122a785684 \
+    --hash=sha256:dbc02381779d412145331789b40cc7b11fdf449e5d94f6bc0b080db0a56ea3f0 \
+    --hash=sha256:dffe31a7f47b603318c609f378ebcd57f1554a3a6a8effbc59c3c69f804296de \
+    --hash=sha256:edf4392b77bdc81f36e92d3a07a5cd072f90253197f4a52a55a8cec48a12483b \
+    --hash=sha256:efe8c0681042536e0d06c11f48cebe759707c9e9abf880ee213541c5b46c5bf3 \
+    --hash=sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199 \
+    --hash=sha256:f88a0b92277de8e3ca715a0d79d68dc82807457dae3ab8699c758f07c20b3c51 \
+    --hash=sha256:faaf07ea35355b01a35cb442dd950d8f1bb5b040a7787791a535de13db15ed90
+protobuf==3.20.3 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7 \
+    --hash=sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c \
+    --hash=sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2 \
+    --hash=sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b \
+    --hash=sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050 \
+    --hash=sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9 \
+    --hash=sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7 \
+    --hash=sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454 \
+    --hash=sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480 \
+    --hash=sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469 \
+    --hash=sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c \
+    --hash=sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e \
+    --hash=sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db \
+    --hash=sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905 \
+    --hash=sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b \
+    --hash=sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86 \
+    --hash=sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4 \
+    --hash=sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402 \
+    --hash=sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7 \
+    --hash=sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4 \
+    --hash=sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99 \
+    --hash=sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee
+py-cpuinfo==9.0.0 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690 \
+    --hash=sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5
+pycparser==2.21 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \
+    --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206
+pygments==2.16.1 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692 \
+    --hash=sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29
+pyparsing==3.1.1 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb \
+    --hash=sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db
+pypiwin32==223 ; python_full_version >= "3.9.0" and python_version < "3.12" and sys_platform == "win32" \
+    --hash=sha256:67adf399debc1d5d14dffc1ab5acacb800da569754fafdc576b2a039485aa775 \
+    --hash=sha256:71be40c1fbd28594214ecaecb58e7aa8b708eabfa0125c8a109ebd51edbd776a
+python-dateutil==2.8.2 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \
+    --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9
+pywin32==306 ; python_full_version >= "3.9.0" and python_version < "3.12" and sys_platform == "win32" \
+    --hash=sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d \
+    --hash=sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65 \
+    --hash=sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e \
+    --hash=sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b \
+    --hash=sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4 \
+    --hash=sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040 \
+    --hash=sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a \
+    --hash=sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36 \
+    --hash=sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8 \
+    --hash=sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e \
+    --hash=sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802 \
+    --hash=sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a \
+    --hash=sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407 \
+    --hash=sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0
+requests==2.31.0 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \
+    --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1
+setuptools-scm==7.1.0 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:6c508345a771aad7d56ebff0e70628bf2b0ec7573762be9960214730de278f27 \
+    --hash=sha256:73988b6d848709e2af142aa48c986ea29592bbcfca5375678064708205253d8e
+setuptools==68.2.2 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87 \
+    --hash=sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a
+six==1.16.0 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
+    --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
+sounddevice==0.4.6 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:3236b78f15f0415bdf006a620cef073d0c0522851d66f4a961ed6d8eb1482fe9 \
+    --hash=sha256:5de768ba6fe56ad2b5aaa2eea794b76b73e427961c95acad2ee2ed7f866a4b20 \
+    --hash=sha256:7830d4f8f8570f2e5552942f81d96999c5fcd9a0b682d6fc5d5c5529df23be2c \
+    --hash=sha256:8b0b806c205dd3e3cd5a97262b2482624fd21db7d47083b887090148a08051c8 \
+    --hash=sha256:e3ba6e674ffa8f79a591d744a1d4ab922fe5bdfd4faf8b25069a08e051010b7b
+tomli==2.0.1 ; python_full_version >= "3.9.0" and python_version < "3.11" \
+    --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \
+    --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f
+typing-extensions==4.7.1 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36 \
+    --hash=sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2
+urllib3==2.0.4 ; python_full_version >= "3.9.0" and python_version < "3.12" \
+    --hash=sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11 \
+    --hash=sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4
+zipp==3.16.2 ; python_full_version >= "3.9.0" and python_version < "3.10" \
+    --hash=sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0 \
+    --hash=sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147
diff --git a/requirementsWIN.txt b/requirementsWIN.txt
index d966439..a898567 100644
Binary files a/requirementsWIN.txt and b/requirementsWIN.txt differ


Test patch:
diff --git a/fastcvapp/examples/example_nofiletest.py b/fastcvapp/examples/example_nofiletest.py
new file mode 100644
index 0000000..24cef94
--- /dev/null
+++ b/fastcvapp/examples/example_nofiletest.py
@@ -0,0 +1,123 @@
+try:
+    import sys
+    import os
+    #u gotta run this from cmd, run python file/F5(debug) on vscode fails., u have to PRESS THE BUTTON 
+
+    # # / and \ works on windows, only / on mac tho 
+    # sourcelocation = "examples\creativecommonsmedia\Elephants Dream charstart2.webm"
+    # sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.webm") 
+    sourcelocation = os.path.join("examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4") 
+    # sourcelocation = "examples\creativecommonsmedia\\30 fps counter.webm"
+    # sourcelocation = "NDA"
+
+    if hasattr(sys, "_MEIPASS"):
+        pass
+    else:
+        # if you're making your own app, you don't need this if-else block. This is just vanity code so this file can be run from main FastCVApp folder or from the examples subfolder.
+        # this example is importing from a higher level package if running from cmd: https://stackoverflow.com/a/41575089
+
+        # add the right path depending on if you're running from examples or from main folder:
+        if os.path.join("fastcvapp", "fastcvapp", "examples").lower() in os.getcwd().lower():
+            # when running from examples folder, append the upper level
+            sys.path.append(
+                ".."
+            )  
+        elif os.path.join("fastcvapp", "fastcvapp").lower() in os.getcwd().lower():
+            # assume they're in main folder (fastcvapp/fastcvapp) trying `python examples/example_backgroundsubtraction.py`
+            sys.path.append(os.path.dirname(os.path.dirname(__file__)))  
+        else:
+            import pathlib
+            solution = []
+            #check all paths in sys.path and find the fastcvapp folder that holds FastCVapp.py
+            for pathstr in sys.path+[os.getcwd()]:
+                pathoption = list(pathlib.Path(pathstr).rglob(os.path.join("FastCVApp", "FastCVApp.py")))
+                testfilter = [pathselection for pathselection in pathoption]
+                if pathoption != []:
+                    # solution = list(pathlib.Path(pathstr).rglob("FastCVApp.py"))[0].resolve().__str__()
+                    # solution.append(*testfilter)
+                    solution += testfilter
+            # print("sol??", solution)
+            # solution = [print("strvar", strvar) for strvar in solution]
+            solution = [os.path.dirname(pathobj) for pathobj in solution]
+            if len(solution) != 1:
+                #warn user if multiple paths detected or none:
+                print("there should only be one path to FastCVApp/FastCVApp.py, check your env", solution, flush=True)
+            for solutionitem in solution:
+                sys.path.append(solutionitem)
+            # print("appended solution!",sys.path)
+
+    try: 
+        import pathlib
+        #in pyinstaller
+        if hasattr(sys, "_MEIPASS"):
+            #using fcva as a project
+            if len(list(pathlib.Path(pathstr).rglob(os.path.join("fcvautils.py")))) > 0:
+                from fcvautils import FCVA_update_resources
+            else:
+                #importing using fastcvapp as a module
+                from fastcvapp.fcvautils import FCVA_update_resources
+        else:
+            # NOT in pyinstaller, using fcva as a module
+            from fastcvapp.fcvautils import FCVA_update_resources
+    except:
+        #importing from fastcvapp project (using fcva as a project)
+        from fcvautils import FCVA_update_resources
+    #udpate paths here
+    # FCVA_update_resources(sourcelocationVAR = ["examples", "creativecommonsmedia", "Elephants Dream charstart2FULL_265.mp4"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+    FCVA_update_resources(sourcelocationVAR = ["examples"], destlocationVAR = ["examples"]) #this has the sys.path.append(sys._MEIPASS)
+    import cv2
+
+    from collections import deque
+
+
+    def identity_func(*args):
+        try:
+            inputdeque = args[0]
+            # FCVAWidget_shared_metadata_dictVAR3 = args[1]
+            bufferlenVAR = args[2]
+            answerdeque = deque(maxlen=bufferlenVAR)
+            landmarkerVAR = args[3]
+            raw_dequeKEYSVAR = args[4]
+            force_monotonic_increasingVAR = args[5]
+
+            #you can even just return the inputdeque but showing this for consistency with examples        
+            while len(inputdeque) > 0:
+                image = inputdeque.popleft()
+                #do literally nothing, identity maps an obj to itself
+                answerdeque.append(image)
+            return answerdeque
+
+        except Exception as e:
+            print("example_nofile subprocess died! ", e, flush=True)
+
+
+    if __name__ == "__main__":
+        import multiprocessing 
+        multiprocessing.freeze_support()
+        import fastcvapp
+        try:
+            #as a module
+            # print("paths??", sys.path)
+            app = fastcvapp.FCVA()
+        except:
+            #in the project
+            # print("listdir", os.listdir(os.path.dirname(fastcvapp.__file__)))
+            from fastcvapp.fastcvapp import FCVA
+            app = FCVA()
+
+        app.appliedcv = identity_func
+        # / and \ works on windows, only / on mac tho 
+        # C:\Personalize\CODING\FastCVApp\fastcvapp\examples\creativecommonsmedia\Elephants Dream charstart2FULL.webm
+        # C:\Personalize\CODING\FastCVApp\FastCVApp\examples\creativecommonsmedia\Elephants Dream charstart2.webm
+        # app.source = sourcelocation
+        # app.source = "examples/creativecommonsmedia/Elephants Dream charstart2FULL.webm"
+        # app.source = "examples/creativecommonsmedia/Elephants Dream charstart2.webm"
+        # app.source = "examples/creativecommonsmedia/JoJo-s Bizarre Adventure - S05E25 - DUAL 1080p WEB H.264 -NanDesuKa (NF) (1).1080.mp4"
+        app.title = "Identity example (no file at widget start) by Pengindoramu"
+        app.run()
+except Exception as e: 
+    print("example_nofiletest died!", e)
+    import traceback
+    print("full exception", "".join(traceback.format_exception(*sys.exc_info())))
+    import time
+    time.sleep(300)
\ No newline at end of file