diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2d549ff8530cc217b74cf891886ff2552d117a38..79f586e5636e5c9435ba33ab92b52470c30aee54 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -73,7 +73,7 @@ build dev on gitlab.pasteur.fr:
       --docker-password="$DOCKER_TOKEN"
       --docker-email=kubernetes@pasteur.fr
       --dry-run=client
-      -n "$NAMESPACE" -o yaml | kubectl apply -f -
+      -o yaml | kubectl apply -f -
     - helmfile lint
     - helmfile template
     - helmfile sync
diff --git a/Project.toml b/Project.toml
index 92409a387837513b5781a01d55322e3bee3853d1..c0988dd6a547e0f579a517e251b1c385ea5b8d2f 100644
--- a/Project.toml
+++ b/Project.toml
@@ -1,7 +1,7 @@
 name = "NyxUI"
 uuid = "2c32e805-e4ca-4d0f-96f6-9d2d6204339d"
 authors = ["François Laurent <francois.laurent@pasteur.fr>"]
-version = "0.1.0"
+version = "0.2.0"
 
 [deps]
 Bonito = "824d6782-a2ef-11e9-3a09-e5662e0c26f8"
@@ -11,14 +11,18 @@ Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
 Genie = "c43c736e-a2d1-11e8-161f-af95117fbd1e"
 GenieSession = "03cc5b98-4f21-4eb6-99f2-22eced81f962"
 JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
+LarvaTagger = "8b3b36f1-dfed-446e-8561-ea19fe966a4d"
 LazyArtifacts = "4af54fe1-eca0-43a8-85a7-787d91b784e3"
 NyxPlots = "e8b8ccdb-0776-4145-b74f-57bbbfff4409"
 NyxWidgets = "c288fd06-43d3-4b04-8307-797133353e2e"
 Observables = "510215fc-4207-5dde-b226-833fc4488ee2"
+ObservationPolicies = "6317928a-6b1a-42e8-b853-b8e2fc3e9ca3"
 OrderedCollections = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
+PlanarLarvae = "c2615984-ef14-4d40-b148-916c85b43307"
 PlotlyBase = "a03496cd-edff-5a9b-9e67-9cda94a718b5"
 Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
 Stipple = "4acbeb90-81a0-11ea-1966-bdaff8155998"
 StippleUI = "a3c5d34a-b254-4859-a8fa-b86abb7e84a3"
 StructTypes = "856f2bd8-1eba-4b0a-8007-ebc267875bd4"
 TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76"
+TidyObservables = "c8131bbd-73a8-4254-a42d-d5d4c5febb31"
diff --git a/README.md b/README.md
index bfddaa8a59120b2c8c1835ac81a578b8cd9506fc..4b6613d49b827be7f5327db4ddfc1184f91a04a3 100644
--- a/README.md
+++ b/README.md
@@ -2,11 +2,12 @@ The Nyx project focuses on the neural activity and locomotion of the *Drosophila
 
 # NyxUI.jl
 
-Web interface meant to be served at [nyx.pasteur.cloud](https://nyx.pasteur.cloud/).
+Web interface meant to be served at [nyx.pasteur.cloud](https://nyx.pasteur.cloud/) (public) and [nyx.dev.pasteur.cloud](https://nyx.dev.pasteur.cloud/) (internal).
 
-It features an app catalog, with currently a single available app:
+It features an app catalog, with the following apps:
 
-* an editor for muscular activity programs.
+* an editor for muscular activity programs,
+* [LarvaTagger.jl](https://gitlab.pasteur.fr/nyx/larvatagger.jl) without any automating tagging backends.
 
 
 ## Local installation
@@ -29,3 +30,9 @@ julia --project=. routes.jl
 You may be asked whether to authorize ports 9284 and 9285; please give the app permission.
 
 From there, in a web browser, open http://localhost:9284/ to access the app.
+
+Note that the generated files can be found somewhere in directory *storage/exports*.
+
+The download buttons in the LarvaTagger app will not work in the web browser.
+To make them work, the reverse proxy setup in the container image called *front* is required.
+If you have [Podman](https://podman.io/), as an alternative to the above installation procedure, you can simply run `front/build.sh --now` and, once the container is up and running, connect to http://localhost:8080/.
diff --git a/front/Containerfile b/front/Containerfile
index 662262b35b6df9b4739083ca259bd3ebf8b50171..ca3adb2ca753e1ccc03e122f5601699f51eaeb6d 100644
--- a/front/Containerfile
+++ b/front/Containerfile
@@ -5,7 +5,10 @@ COPY . /app
 WORKDIR /app
 
 RUN git rev-parse --short HEAD > src/version.txt \
- && rm -rf .git public storage
+ && rm -rf .git public storage \
+ && git clone --branch dev https://gitlab.pasteur.fr/nyx/LarvaTagger.jl /app/LarvaTagger.jl \
+ && (cd LarvaTagger.jl && git rev-parse --short HEAD) > src/apps/larvatagger/version.txt \
+ && rm -rf LarvaTagger.jl/.git
 
 FROM docker.io/nginxinc/nginx-unprivileged:1.27
 
@@ -13,7 +16,7 @@ ENV JULIA_PROJECT /app
 ENV JULIA_DEPOT_PATH /app/julia
 ENV JULIAUP_DEPOT_PATH /app/juliaup
 
-ARG JULIA_VERSION=1.10.7
+ARG JULIA_VERSION=1.10.8
 
 # UID/GID should match with same arguments defined in:
 # https://github.com/nginxinc/docker-nginx-unprivileged/blob/main/mainline/debian/Dockerfile
@@ -30,9 +33,10 @@ ENV PATH "$PATH:$JULIA_PROJECT/.juliaup/bin"
 
 RUN cd "$JULIA_PROJECT" \
  && cp front/Manifest.toml . \
- && julia -e 'using Pkg; Pkg.instantiate()' \
+ && julia -e 'using Pkg; Pkg.instantiate(); Pkg.develop(PackageSpec(path="LarvaTagger.jl"))' \
  && mkdir -p public \
- && chmod a+x front/entrypoint.sh
+ && chmod a+x front/entrypoint.sh \
+ && juliaup config versionsdbupdateinterval 0
 
 ARG PUBLIC_URL
 
diff --git a/front/Containerfile.local b/front/Containerfile.local
index fe9d00be6787f412c9d4d895313223a840769cb6..1449a18a07a320562569f5b34085d88edbb3e1ea 100644
--- a/front/Containerfile.local
+++ b/front/Containerfile.local
@@ -6,7 +6,7 @@ COPY ./NyxUI.jl/front/proxy.conf /etc/nginx/conf.d/default.conf
 
 ENV JULIAUP_DEPOT_PATH /juliaup
 ENV JULIA_DEPOT_PATH /julia
-ARG JULIA_VERSION=1.10.7
+ARG JULIA_VERSION=1.10.8
 
 RUN curl -fsSL https://install.julialang.org \
   | sh -s -- --yes --default-channel $JULIA_VERSION
@@ -16,14 +16,16 @@ ENV PATH "$PATH:/root/.juliaup/bin"
 COPY ./NyxWidgets.jl /app/NyxWidgets.jl
 COPY ./NyxPlots.jl /app/NyxPlots.jl
 COPY ./NyxUI.jl /app/NyxUI.jl
+COPY ./LarvaTagger.jl /app/LarvaTagger.jl
 
 ENV JULIA_PROJECT /app/NyxUI.jl
 
 RUN cd /app/NyxUI.jl \
- && julia -e 'using Pkg; Pkg.add([PackageSpec(path="../NyxWidgets.jl"), PackageSpec(path="../NyxPlots.jl")]); Pkg.instantiate();' \
+ && julia -e 'using Pkg; Pkg.add([PackageSpec(path="../NyxWidgets.jl"), PackageSpec(path="../NyxPlots.jl"), PackageSpec(url="https://gitlab.pasteur.fr/nyx/PlanarLarvae.jl"), PackageSpec(url="https://gitlab.com/dbc-nyx/ObservationPolicies.jl"), PackageSpec(url="https://gitlab.com/dbc-nyx/TidyObservables.jl"), PackageSpec(path="../LarvaTagger.jl")]); Pkg.instantiate();' \
  && mkdir -p public \
  && chmod a+x front/entrypoint.sh \
- && sed -i -E 's/worker_processes .*;/worker_processes 2;/' /etc/nginx/nginx.conf
+ && sed -i -E 's/worker_processes .*;/worker_processes 2;/' /etc/nginx/nginx.conf \
+ && juliaup config versionsdbupdateinterval 0
 
 ENTRYPOINT ["/app/NyxUI.jl/front/entrypoint.sh"]
 CMD []
diff --git a/front/Manifest.toml b/front/Manifest.toml
index eead5c8a00b39085359de72b2b85bfd8c44b1f67..7b87bea4414da2f15a4abc08c99fb472c32226cf 100644
--- a/front/Manifest.toml
+++ b/front/Manifest.toml
@@ -1,8 +1,51 @@
 # This file is machine-generated - editing it directly is not advised
 
-julia_version = "1.10.7"
+julia_version = "1.10.8"
 manifest_format = "2.0"
-project_hash = "7b4a57cbc9fc956109742c120d30a1b52ed917fd"
+project_hash = "f30a6bd140cd9f9b66d3656725e83b8d83e18ee6"
+
+[[deps.AbstractFFTs]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef"
+uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c"
+version = "1.5.0"
+weakdeps = ["ChainRulesCore", "Test"]
+
+    [deps.AbstractFFTs.extensions]
+    AbstractFFTsChainRulesCoreExt = "ChainRulesCore"
+    AbstractFFTsTestExt = "Test"
+
+[[deps.AbstractTrees]]
+git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177"
+uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c"
+version = "0.4.5"
+
+[[deps.Adapt]]
+deps = ["LinearAlgebra", "Requires"]
+git-tree-sha1 = "50c3c56a52972d78e8be9fd135bfb91c9574c140"
+uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
+version = "4.1.1"
+weakdeps = ["StaticArrays"]
+
+    [deps.Adapt.extensions]
+    AdaptStaticArraysExt = "StaticArrays"
+
+[[deps.AdaptivePredicates]]
+git-tree-sha1 = "7e651ea8d262d2d74ce75fdf47c4d63c07dba7a6"
+uuid = "35492f91-a3bd-45ad-95db-fcad7dcfedb7"
+version = "1.2.0"
+
+[[deps.AliasTables]]
+deps = ["PtrArrays", "Random"]
+git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff"
+uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8"
+version = "1.1.3"
+
+[[deps.Animations]]
+deps = ["Colors"]
+git-tree-sha1 = "e092fa223bf66a3c41f9c022bd074d916dc303e7"
+uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340"
+version = "0.4.2"
 
 [[deps.ArgParse]]
 deps = ["Logging", "TextWrap"]
@@ -17,9 +60,32 @@ version = "1.1.1"
 [[deps.Artifacts]]
 uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33"
 
+[[deps.Automa]]
+deps = ["PrecompileTools", "SIMD", "TranscodingStreams"]
+git-tree-sha1 = "a8f503e8e1a5f583fbef15a8440c8c7e32185df2"
+uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b"
+version = "1.1.0"
+
+[[deps.AxisAlgorithms]]
+deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"]
+git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712"
+uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950"
+version = "1.1.0"
+
+[[deps.AxisArrays]]
+deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"]
+git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f"
+uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9"
+version = "0.4.7"
+
 [[deps.Base64]]
 uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f"
 
+[[deps.Bessels]]
+git-tree-sha1 = "4435559dc39793d53a9e3d278e185e920b4619ef"
+uuid = "0e736298-9ec6-45e8-9647-e4fc86a2fe38"
+version = "0.2.8"
+
 [[deps.BitFlags]]
 git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d"
 uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35"
@@ -27,9 +93,34 @@ version = "0.1.9"
 
 [[deps.Bonito]]
 deps = ["Base64", "CodecZlib", "Colors", "Dates", "Deno_jll", "HTTP", "Hyperscript", "LinearAlgebra", "Markdown", "MsgPack", "Observables", "RelocatableFolders", "SHA", "Sockets", "Tables", "ThreadPools", "URIs", "UUIDs", "WidgetsBase"]
-git-tree-sha1 = "534820940e4359c09adc615f8bd06ca90d508ba6"
+git-tree-sha1 = "d7635780a8cfe0cb43c075276fd358c5b166695e"
 uuid = "824d6782-a2ef-11e9-3a09-e5662e0c26f8"
-version = "4.0.1"
+version = "3.2.4"
+
+[[deps.BufferedStreams]]
+git-tree-sha1 = "6863c5b7fc997eadcabdbaf6c5f201dc30032643"
+uuid = "e1450e63-4bb3-523b-b2a4-4ffa8c0fd77d"
+version = "1.2.2"
+
+[[deps.Bzip2_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e"
+uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0"
+version = "1.0.9+0"
+
+[[deps.CEnum]]
+git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc"
+uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82"
+version = "0.5.0"
+
+[[deps.CRC32c]]
+uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc"
+
+[[deps.CRlibm_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc"
+uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0"
+version = "1.0.1+0"
 
 [[deps.CSTParser]]
 deps = ["Tokenize"]
@@ -37,6 +128,28 @@ git-tree-sha1 = "0157e592151e39fa570645e2b2debcdfb8a0f112"
 uuid = "00ebfdb7-1f24-5e51-bd34-a7502290713f"
 version = "3.4.3"
 
+[[deps.Cairo_jll]]
+deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"]
+git-tree-sha1 = "009060c9a6168704143100f36ab08f06c2af4642"
+uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a"
+version = "1.18.2+1"
+
+[[deps.ChainRulesCore]]
+deps = ["Compat", "LinearAlgebra"]
+git-tree-sha1 = "1713c74e00545bfe14605d2a2be1712de8fbcb58"
+uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+version = "1.25.1"
+weakdeps = ["SparseArrays"]
+
+    [deps.ChainRulesCore.extensions]
+    ChainRulesCoreSparseArraysExt = "SparseArrays"
+
+[[deps.CircularArrays]]
+deps = ["OffsetArrays"]
+git-tree-sha1 = "e24a6f390e5563583bb4315c73035b5b3f3e7ab4"
+uuid = "7a955b69-7140-5f4e-a0ed-f168c5e2e749"
+version = "1.4.0"
+
 [[deps.CodeTracking]]
 deps = ["InteractiveUtils", "UUIDs"]
 git-tree-sha1 = "7eee164f122511d3e4e1ebadb7956939ea7e1c77"
@@ -49,11 +162,17 @@ git-tree-sha1 = "bce6804e5e6044c6daab27bb533d1295e4a2e759"
 uuid = "944b1d66-785c-5afd-91f1-9de20f533193"
 version = "0.7.6"
 
+[[deps.ColorBrewer]]
+deps = ["Colors", "JSON"]
+git-tree-sha1 = "e771a63cc8b539eca78c85b0cabd9233d6c8f06f"
+uuid = "a2cac450-b92f-5266-8821-25eda20663c8"
+version = "0.4.1"
+
 [[deps.ColorSchemes]]
 deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"]
-git-tree-sha1 = "c785dfb1b3bfddd1da557e861b919819b82bbe5b"
+git-tree-sha1 = "26ec26c98ae1453c692efded2b17e15125a5bea1"
 uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4"
-version = "3.27.1"
+version = "3.28.0"
 
 [[deps.ColorTypes]]
 deps = ["FixedPointNumbers", "Random"]
@@ -72,13 +191,11 @@ deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statist
 git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1"
 uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4"
 version = "0.11.0"
+weakdeps = ["SpecialFunctions"]
 
     [deps.ColorVectorSpace.extensions]
     SpecialFunctionsExt = "SpecialFunctions"
 
-    [deps.ColorVectorSpace.weakdeps]
-    SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b"
-
 [[deps.Colors]]
 deps = ["ColorTypes", "FixedPointNumbers", "Reexport"]
 git-tree-sha1 = "64e15186f0aa277e174aa81798f7eb8598e0157e"
@@ -112,6 +229,22 @@ git-tree-sha1 = "f36e5e8fdffcb5646ea5da81495a5a7566005127"
 uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb"
 version = "2.4.3"
 
+[[deps.ConstructionBase]]
+git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157"
+uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
+version = "1.5.8"
+weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"]
+
+    [deps.ConstructionBase.extensions]
+    ConstructionBaseIntervalSetsExt = "IntervalSets"
+    ConstructionBaseLinearAlgebraExt = "LinearAlgebra"
+    ConstructionBaseStaticArraysExt = "StaticArrays"
+
+[[deps.Contour]]
+git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8"
+uuid = "d38c429a-6771-53c6-b99e-75d170b6e991"
+version = "0.6.3"
+
 [[deps.Crayons]]
 git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15"
 uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f"
@@ -137,6 +270,12 @@ version = "1.0.0"
 deps = ["Printf"]
 uuid = "ade2ca70-3891-5945-98fb-dc099432e06a"
 
+[[deps.DelaunayTriangulation]]
+deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"]
+git-tree-sha1 = "5620ff4ee0084a6ab7097a27ba0c19290200b037"
+uuid = "927a84f5-c5f4-47a5-9785-b46e178433df"
+version = "1.6.4"
+
 [[deps.DelimitedFiles]]
 deps = ["Mmap"]
 git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae"
@@ -149,10 +288,43 @@ git-tree-sha1 = "cd6756e833c377e0ce9cd63fb97689a255f12323"
 uuid = "04572ae6-984a-583e-9378-9577a1c2574d"
 version = "1.33.4+0"
 
+[[deps.Distances]]
+deps = ["LinearAlgebra", "Statistics", "StatsAPI"]
+git-tree-sha1 = "c7e3a542b999843086e2f29dac96a618c105be1d"
+uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7"
+version = "0.10.12"
+weakdeps = ["ChainRulesCore", "SparseArrays"]
+
+    [deps.Distances.extensions]
+    DistancesChainRulesCoreExt = "ChainRulesCore"
+    DistancesSparseArraysExt = "SparseArrays"
+
 [[deps.Distributed]]
 deps = ["Random", "Serialization", "Sockets"]
 uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b"
 
+[[deps.Distributions]]
+deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"]
+git-tree-sha1 = "03aa5d44647eaec98e1920635cdfed5d5560a8b9"
+uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
+version = "0.25.117"
+
+    [deps.Distributions.extensions]
+    DistributionsChainRulesCoreExt = "ChainRulesCore"
+    DistributionsDensityInterfaceExt = "DensityInterface"
+    DistributionsTestExt = "Test"
+
+    [deps.Distributions.weakdeps]
+    ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+    DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d"
+    Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
+
+[[deps.DocOpt]]
+deps = ["Dates", "Printf"]
+git-tree-sha1 = "9c2681389ed8d9cf6193b1ba31796f12456b111a"
+uuid = "968ba79b-81e4-546f-ab3a-2eecfa62a9db"
+version = "0.5.0"
+
 [[deps.DocStringExtensions]]
 deps = ["LibGit2"]
 git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d"
@@ -170,18 +342,80 @@ deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"]
 uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6"
 version = "1.6.0"
 
+[[deps.EarCut_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053"
+uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5"
+version = "2.2.4+0"
+
+[[deps.EnumX]]
+git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237"
+uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56"
+version = "1.0.4"
+
+[[deps.ExactPredicates]]
+deps = ["IntervalArithmetic", "Random", "StaticArrays"]
+git-tree-sha1 = "b3f2ff58735b5f024c392fde763f29b057e4b025"
+uuid = "429591f6-91af-11e9-00e2-59fbe8cec110"
+version = "2.2.8"
+
 [[deps.ExceptionUnwrapping]]
 deps = ["Test"]
 git-tree-sha1 = "d36f682e590a83d63d1c7dbd287573764682d12a"
 uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4"
 version = "0.1.11"
 
+[[deps.Expat_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "d55dffd9ae73ff72f1c0482454dcf2ec6c6c4a63"
+uuid = "2e619515-83b5-522b-bb60-26c02a35a201"
+version = "2.6.5+0"
+
+[[deps.Extents]]
+git-tree-sha1 = "063512a13dbe9c40d999c439268539aa552d1ae6"
+uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910"
+version = "0.1.5"
+
 [[deps.EzXML]]
 deps = ["Printf", "XML2_jll"]
 git-tree-sha1 = "380053d61bb9064d6aa4a9777413b40429c79901"
 uuid = "8f5d6c58-4d21-5cfd-889c-e3ad7ee6a615"
 version = "1.2.0"
 
+[[deps.FFMPEG_jll]]
+deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"]
+git-tree-sha1 = "8cc47f299902e13f90405ddb5bf87e5d474c0d38"
+uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5"
+version = "6.1.2+0"
+
+[[deps.FFTW]]
+deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"]
+git-tree-sha1 = "7de7c78d681078f027389e067864a8d53bd7c3c9"
+uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
+version = "1.8.1"
+
+[[deps.FFTW_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "4d81ed14783ec49ce9f2e168208a12ce1815aa25"
+uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a"
+version = "3.3.10+3"
+
+[[deps.FileIO]]
+deps = ["Pkg", "Requires", "UUIDs"]
+git-tree-sha1 = "2dd20384bf8c6d411b5c7370865b1e9b26cb2ea3"
+uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
+version = "1.16.6"
+weakdeps = ["HTTP"]
+
+    [deps.FileIO.extensions]
+    HTTPExt = "HTTP"
+
+[[deps.FilePaths]]
+deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"]
+git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629"
+uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824"
+version = "0.8.3"
+
 [[deps.FilePathsBase]]
 deps = ["Compat", "Dates"]
 git-tree-sha1 = "7878ff7172a8e6beedd1dea14bd27c3c6340d361"
@@ -196,17 +430,59 @@ weakdeps = ["Mmap", "Test"]
 [[deps.FileWatching]]
 uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee"
 
+[[deps.FillArrays]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "6a70198746448456524cb442b8af316927ff3e1a"
+uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
+version = "1.13.0"
+weakdeps = ["PDMats", "SparseArrays", "Statistics"]
+
+    [deps.FillArrays.extensions]
+    FillArraysPDMatsExt = "PDMats"
+    FillArraysSparseArraysExt = "SparseArrays"
+    FillArraysStatisticsExt = "Statistics"
+
 [[deps.FixedPointNumbers]]
 deps = ["Statistics"]
 git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172"
 uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93"
 version = "0.8.5"
 
+[[deps.Fontconfig_jll]]
+deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"]
+git-tree-sha1 = "21fac3c77d7b5a9fc03b0ec503aa1a6392c34d2b"
+uuid = "a3f928ae-7b40-5064-980b-68af3947d34b"
+version = "2.15.0+0"
+
 [[deps.Format]]
 git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc"
 uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8"
 version = "1.3.7"
 
+[[deps.FreeType]]
+deps = ["CEnum", "FreeType2_jll"]
+git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999"
+uuid = "b38be410-82b0-50bf-ab77-7b57e271db43"
+version = "4.1.1"
+
+[[deps.FreeType2_jll]]
+deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "786e968a8d2fb167f2e4880baba62e0e26bd8e4e"
+uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7"
+version = "2.13.3+1"
+
+[[deps.FreeTypeAbstraction]]
+deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics"]
+git-tree-sha1 = "d52e255138ac21be31fa633200b65e4e71d26802"
+uuid = "663a7486-cb36-511b-a19d-713bb74d65c9"
+version = "0.10.6"
+
+[[deps.FriBidi_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "846f7026a9decf3679419122b49f8a1fdb48d2d5"
+uuid = "559328eb-81f9-559d-9380-de523a88c83c"
+version = "1.0.16+0"
+
 [[deps.GMP_jll]]
 deps = ["Artifacts", "Libdl"]
 uuid = "781609d7-10c4-51f6-84f2-b8444358ff6d"
@@ -230,39 +506,244 @@ git-tree-sha1 = "5f5ffc33251d0d5f110072f7a0c07717c9453c97"
 uuid = "5c4fdc26-39e3-47cf-9034-e533e09961c2"
 version = "1.1.0"
 
+[[deps.GeoFormatTypes]]
+git-tree-sha1 = "8e233d5167e63d708d41f87597433f59a0f213fe"
+uuid = "68eda718-8dee-11e9-39e7-89f7f65f511f"
+version = "0.4.4"
+
+[[deps.GeoInterface]]
+deps = ["DataAPI", "Extents", "GeoFormatTypes"]
+git-tree-sha1 = "294e99f19869d0b0cb71aef92f19d03649d028d5"
+uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f"
+version = "1.4.1"
+
+[[deps.GeometryBasics]]
+deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"]
+git-tree-sha1 = "f0895e73ba6c469ec8efaa13712eb5ee1a3647a3"
+uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
+version = "0.5.2"
+
+[[deps.Gettext_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"]
+git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046"
+uuid = "78b55507-aeef-58d4-861c-77aaff3498b1"
+version = "0.21.0+0"
+
+[[deps.Giflib_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "6570366d757b50fabae9f4315ad74d2e40c0560a"
+uuid = "59f7168a-df46-5410-90c8-f2779963d0ec"
+version = "5.2.3+0"
+
+[[deps.Glib_jll]]
+deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"]
+git-tree-sha1 = "b0036b392358c80d2d2124746c2bf3d48d457938"
+uuid = "7746bdde-850d-59dc-9ae8-88ece973131d"
+version = "2.82.4+0"
+
 [[deps.Glob]]
 git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496"
 uuid = "c27321d9-0574-5035-807b-f59d2c89b15c"
 version = "1.3.1"
 
+[[deps.Graphite2_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "01979f9b37367603e2848ea225918a3b3861b606"
+uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472"
+version = "1.3.14+1"
+
+[[deps.GridLayoutBase]]
+deps = ["GeometryBasics", "InteractiveUtils", "Observables"]
+git-tree-sha1 = "dc6bed05c15523624909b3953686c5f5ffa10adc"
+uuid = "3955a311-db13-416c-9275-1d80ed98e5e9"
+version = "0.11.1"
+
+[[deps.Grisu]]
+git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2"
+uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe"
+version = "1.0.2"
+
+[[deps.HDF5]]
+deps = ["Compat", "HDF5_jll", "Libdl", "MPIPreferences", "Mmap", "Preferences", "Printf", "Random", "Requires", "UUIDs"]
+git-tree-sha1 = "e856eef26cf5bf2b0f95f8f4fc37553c72c8641c"
+uuid = "f67ccb44-e63f-5c2f-98bd-6dc0ccc4ba2f"
+version = "0.17.2"
+
+    [deps.HDF5.extensions]
+    MPIExt = "MPI"
+
+    [deps.HDF5.weakdeps]
+    MPI = "da04e1cc-30fd-572f-bb4f-1f8673147195"
+
+[[deps.HDF5_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "LazyArtifacts", "LibCURL_jll", "Libdl", "MPICH_jll", "MPIPreferences", "MPItrampoline_jll", "MicrosoftMPI_jll", "OpenMPI_jll", "OpenSSL_jll", "TOML", "Zlib_jll", "libaec_jll"]
+git-tree-sha1 = "38c8874692d48d5440d5752d6c74b0c6b0b60739"
+uuid = "0234f1f7-429e-5d53-9886-15a909be8d59"
+version = "1.14.2+1"
+
 [[deps.HTTP]]
 deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "PrecompileTools", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"]
 git-tree-sha1 = "c67b33b085f6e2faf8bf79a61962e7339a81129c"
 uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3"
 version = "1.10.15"
 
+[[deps.HarfBuzz_jll]]
+deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"]
+git-tree-sha1 = "55c53be97790242c29031e5cd45e8ac296dadda3"
+uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566"
+version = "8.5.0+0"
+
 [[deps.HttpCommon]]
 deps = ["Dates", "Nullables", "Test", "URIParser"]
 git-tree-sha1 = "46313284237aa6ca67a6bce6d6fbd323d19cff59"
 uuid = "77172c1b-203f-54ac-aa54-3f1198fe9f90"
 version = "0.5.0"
 
+[[deps.Hwloc_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "50aedf345a709ab75872f80a2779568dc0bb461b"
+uuid = "e33a78d0-f292-5ffc-b300-72abe9b543c8"
+version = "2.11.2+3"
+
+[[deps.HypergeometricFunctions]]
+deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"]
+git-tree-sha1 = "2bd56245074fab4015b9174f24ceba8293209053"
+uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a"
+version = "0.3.27"
+
 [[deps.Hyperscript]]
 deps = ["Test"]
 git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4"
 uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91"
 version = "0.0.5"
 
+[[deps.ImageAxes]]
+deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"]
+git-tree-sha1 = "e12629406c6c4442539436581041d372d69c55ba"
+uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac"
+version = "0.6.12"
+
+[[deps.ImageBase]]
+deps = ["ImageCore", "Reexport"]
+git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909"
+uuid = "c817782e-172a-44cc-b673-b171935fbb9e"
+version = "0.1.7"
+
+[[deps.ImageCore]]
+deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"]
+git-tree-sha1 = "8c193230235bbcee22c8066b0374f63b5683c2d3"
+uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534"
+version = "0.10.5"
+
+[[deps.ImageIO]]
+deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs", "WebP"]
+git-tree-sha1 = "696144904b76e1ca433b886b4e7edd067d76cbf7"
+uuid = "82e4d734-157c-48bb-816b-45c225c6df19"
+version = "0.6.9"
+
+[[deps.ImageMetadata]]
+deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"]
+git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec"
+uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49"
+version = "0.9.10"
+
+[[deps.Imath_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "0936ba688c6d201805a83da835b55c61a180db52"
+uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1"
+version = "3.1.11+0"
+
+[[deps.IndirectArrays]]
+git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f"
+uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959"
+version = "1.0.0"
+
+[[deps.Inflate]]
+git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d"
+uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9"
+version = "0.1.5"
+
 [[deps.Inflector]]
 deps = ["Unicode"]
 git-tree-sha1 = "c82a172a07c94887709e613cc67cec0b472fb742"
 uuid = "6d011eab-0732-4556-8808-e463c76bf3b6"
 version = "1.1.0"
 
+[[deps.IntelOpenMP_jll]]
+deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"]
+git-tree-sha1 = "0f14a5456bdc6b9731a5682f439a672750a09e48"
+uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0"
+version = "2025.0.4+0"
+
 [[deps.InteractiveUtils]]
 deps = ["Markdown"]
 uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240"
 
+[[deps.Interpolations]]
+deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"]
+git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0"
+uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59"
+version = "0.15.1"
+weakdeps = ["Unitful"]
+
+    [deps.Interpolations.extensions]
+    InterpolationsUnitfulExt = "Unitful"
+
+[[deps.IntervalArithmetic]]
+deps = ["CRlibm_jll", "LinearAlgebra", "MacroTools", "RoundingEmulator"]
+git-tree-sha1 = "eb6ca9aef11db0c08b7ac0a5952c6c6ba6fbebf0"
+uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253"
+version = "0.22.22"
+
+    [deps.IntervalArithmetic.extensions]
+    IntervalArithmeticDiffRulesExt = "DiffRules"
+    IntervalArithmeticForwardDiffExt = "ForwardDiff"
+    IntervalArithmeticIntervalSetsExt = "IntervalSets"
+    IntervalArithmeticRecipesBaseExt = "RecipesBase"
+
+    [deps.IntervalArithmetic.weakdeps]
+    DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b"
+    ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210"
+    IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953"
+    RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01"
+
+[[deps.IntervalSets]]
+git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0"
+uuid = "8197267c-284f-5f27-9208-e0e47529a953"
+version = "0.7.10"
+weakdeps = ["Random", "RecipesBase", "Statistics"]
+
+    [deps.IntervalSets.extensions]
+    IntervalSetsRandomExt = "Random"
+    IntervalSetsRecipesBaseExt = "RecipesBase"
+    IntervalSetsStatisticsExt = "Statistics"
+
+[[deps.InverseFunctions]]
+git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb"
+uuid = "3587e190-3f89-42d0-90ee-14403ec27112"
+version = "0.1.17"
+weakdeps = ["Dates", "Test"]
+
+    [deps.InverseFunctions.extensions]
+    InverseFunctionsDatesExt = "Dates"
+    InverseFunctionsTestExt = "Test"
+
+[[deps.IrrationalConstants]]
+git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2"
+uuid = "92d709cd-6900-40b7-9082-c6be49f344b6"
+version = "0.2.2"
+
+[[deps.Isoband]]
+deps = ["isoband_jll"]
+git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137"
+uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4"
+version = "0.1.1"
+
+[[deps.IterTools]]
+git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023"
+uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
+version = "1.10.0"
+
 [[deps.IteratorInterfaceExtensions]]
 git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856"
 uuid = "82899510-4779-5014-852e-03e436cf321d"
@@ -292,6 +773,18 @@ version = "1.14.1"
     [deps.JSON3.weakdeps]
     ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd"
 
+[[deps.JpegTurbo]]
+deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"]
+git-tree-sha1 = "fa6d0bcff8583bac20f1ffa708c3913ca605c611"
+uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0"
+version = "0.1.5"
+
+[[deps.JpegTurbo_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "eac1206917768cb54957c65a615460d87b455fc1"
+uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8"
+version = "3.1.1+0"
+
 [[deps.JuliaFormatter]]
 deps = ["CSTParser", "CommonMark", "DataStructures", "Glob", "PrecompileTools", "TOML", "Tokenize"]
 git-tree-sha1 = "59cf7ad64f1b0708a4fa4369879d33bad3239b56"
@@ -300,19 +793,62 @@ version = "1.0.62"
 
 [[deps.JuliaInterpreter]]
 deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"]
-git-tree-sha1 = "10da5154188682e5c0726823c2b5125957ec3778"
+git-tree-sha1 = "a729439c18f7112cbbd9fcdc1771ecc7f071df6a"
 uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a"
-version = "0.9.38"
+version = "0.9.39"
+
+[[deps.KernelDensity]]
+deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"]
+git-tree-sha1 = "7d703202e65efa1369de1279c162b915e245eed1"
+uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b"
+version = "0.6.9"
+
+[[deps.LAME_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd"
+uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d"
+version = "3.100.2+0"
+
+[[deps.LERC_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3"
+uuid = "88015f11-f218-50d7-93a8-a6af411a945d"
+version = "4.0.1+0"
+
+[[deps.LLVMOpenMP_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "78211fb6cbc872f77cad3fc0b6cf647d923f4929"
+uuid = "1d63c593-3942-5779-bab2-d838dc0a180e"
+version = "18.1.7+0"
+
+[[deps.LZO_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a"
+uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac"
+version = "2.10.3+0"
 
 [[deps.LaTeXStrings]]
 git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c"
 uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f"
 version = "1.4.0"
 
+[[deps.LarvaTagger]]
+deps = ["Bonito", "Colors", "Dates", "DocOpt", "Format", "LinearAlgebra", "Logging", "Makie", "Meshes", "NearestNeighbors", "NyxWidgets", "Observables", "ObservationPolicies", "OrderedCollections", "PlanarLarvae", "Random", "StaticArrays", "Statistics", "TidyObservables", "WGLMakie"]
+git-tree-sha1 = "c9c185beb0bf417ed98afe9b8b9da557a0b886b7"
+repo-rev = "main"
+repo-url = "https://gitlab.pasteur.fr/nyx/larvatagger.jl"
+uuid = "8b3b36f1-dfed-446e-8561-ea19fe966a4d"
+version = "0.19.1"
+
 [[deps.LazyArtifacts]]
 deps = ["Artifacts", "Pkg"]
 uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3"
 
+[[deps.LazyModules]]
+git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e"
+uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e"
+version = "0.3.1"
+
 [[deps.LibCURL]]
 deps = ["LibCURL_jll", "MozillaCACerts_jll"]
 uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21"
@@ -340,16 +876,74 @@ version = "1.11.0+1"
 [[deps.Libdl]]
 uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb"
 
+[[deps.Libffi_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "27ecae93dd25ee0909666e6835051dd684cc035e"
+uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490"
+version = "3.2.2+2"
+
+[[deps.Libgcrypt_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"]
+git-tree-sha1 = "8be878062e0ffa2c3f67bb58a595375eda5de80b"
+uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4"
+version = "1.11.0+0"
+
+[[deps.Libglvnd_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"]
+git-tree-sha1 = "ff3b4b9d35de638936a525ecd36e86a8bb919d11"
+uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29"
+version = "1.7.0+0"
+
+[[deps.Libgpg_error_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "df37206100d39f79b3376afb6b9cee4970041c61"
+uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8"
+version = "1.51.1+0"
+
 [[deps.Libiconv_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "61dfdba58e585066d8bce214c5a51eaa0539f269"
+git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809"
 uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531"
-version = "1.17.0+1"
+version = "1.18.0+0"
+
+[[deps.Libmount_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "89211ea35d9df5831fca5d33552c02bd33878419"
+uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9"
+version = "2.40.3+0"
+
+[[deps.Libtiff_jll]]
+deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"]
+git-tree-sha1 = "4ab7581296671007fc33f07a721631b8855f4b1d"
+uuid = "89763e89-9b03-5906-acba-b20f662cd828"
+version = "4.7.1+0"
+
+[[deps.Libuuid_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "e888ad02ce716b319e6bdb985d2ef300e7089889"
+uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700"
+version = "2.40.3+0"
 
 [[deps.LinearAlgebra]]
 deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"]
 uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
 
+[[deps.LogExpFunctions]]
+deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"]
+git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f"
+uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688"
+version = "0.3.29"
+
+    [deps.LogExpFunctions.extensions]
+    LogExpFunctionsChainRulesCoreExt = "ChainRulesCore"
+    LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables"
+    LogExpFunctionsInverseFunctionsExt = "InverseFunctions"
+
+    [deps.LogExpFunctions.weakdeps]
+    ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
+    ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0"
+    InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112"
+
 [[deps.Logging]]
 uuid = "56ddb016-857b-54e1-b83d-db4d58db5568"
 
@@ -365,21 +959,73 @@ git-tree-sha1 = "688d6d9e098109051ae33d126fcfc88c4ce4a021"
 uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b"
 version = "3.1.0"
 
+[[deps.MAT]]
+deps = ["BufferedStreams", "CodecZlib", "HDF5", "SparseArrays"]
+git-tree-sha1 = "1d2dd9b186742b0f317f2530ddcbf00eebb18e96"
+uuid = "23992714-dd62-5051-b70f-ba57cb901cac"
+version = "0.10.7"
+
 [[deps.MIMEs]]
 git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb"
 uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65"
 version = "0.1.4"
 
+[[deps.MKL_jll]]
+deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"]
+git-tree-sha1 = "5de60bc6cb3899cd318d80d627560fae2e2d99ae"
+uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7"
+version = "2025.0.1+1"
+
+[[deps.MPICH_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "7715e65c47ba3941c502bffb7f266a41a7f54423"
+uuid = "7cb0a576-ebde-5e09-9194-50597f1243b4"
+version = "4.2.3+0"
+
+[[deps.MPIPreferences]]
+deps = ["Libdl", "Preferences"]
+git-tree-sha1 = "c105fe467859e7f6e9a852cb15cb4301126fac07"
+uuid = "3da0fdf6-3ccc-4f1b-acd9-58baa6c99267"
+version = "0.1.11"
+
+[[deps.MPItrampoline_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML"]
+git-tree-sha1 = "70e830dab5d0775183c99fc75e4c24c614ed7142"
+uuid = "f1f71cc9-e9ae-5b93-9b94-4fe0e1ad3748"
+version = "5.5.1+2"
+
 [[deps.MacroTools]]
-deps = ["Markdown", "Random"]
-git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df"
+git-tree-sha1 = "72aebe0b5051e5143a079a4685a46da330a40472"
 uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09"
-version = "0.5.13"
+version = "0.5.15"
+
+[[deps.Makie]]
+deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"]
+git-tree-sha1 = "9680336a5b67f9f9f6eaa018f426043a8cd68200"
+uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a"
+version = "0.22.1"
+
+[[deps.MakieCore]]
+deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"]
+git-tree-sha1 = "c731269d5a2c85ffdc689127a9ba6d73e978a4b1"
+uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b"
+version = "0.9.0"
+
+[[deps.MappedArrays]]
+git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e"
+uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900"
+version = "0.4.2"
 
 [[deps.Markdown]]
 deps = ["Base64"]
 uuid = "d6f4376e-aef5-505a-96c1-9c027394607a"
 
+[[deps.MathTeXEngine]]
+deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"]
+git-tree-sha1 = "f45c8916e8385976e1ccd055c9874560c257ab13"
+uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53"
+version = "0.6.2"
+
 [[deps.MbedTLS]]
 deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"]
 git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf"
@@ -391,11 +1037,29 @@ deps = ["Artifacts", "Libdl"]
 uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1"
 version = "2.28.2+1"
 
+[[deps.Meshes]]
+deps = ["Bessels", "CircularArrays", "Distances", "IterTools", "LinearAlgebra", "NearestNeighbors", "Random", "Rotations", "SparseArrays", "StaticArrays", "StatsBase", "Tables", "TransformsBase"]
+git-tree-sha1 = "a1a152787767f3393362276452897605584964b1"
+uuid = "eacbb407-ea5a-433e-ab97-5258b1ca43fa"
+version = "0.29.0"
+
+[[deps.MicrosoftMPI_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "bc95bf4149bf535c09602e3acdf950d9b4376227"
+uuid = "9237b28f-5490-5468-be7b-bb81f5f5e6cf"
+version = "10.1.4+3"
+
 [[deps.Millboard]]
 git-tree-sha1 = "ea6a5b7e56e76d8051023faaa11d91d1d881dac3"
 uuid = "39ec1447-df44-5f4c-beaa-866f30b4d3b2"
 version = "0.2.5"
 
+[[deps.Missings]]
+deps = ["DataAPI"]
+git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d"
+uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28"
+version = "1.2.0"
+
 [[deps.Mixers]]
 deps = ["MacroTools"]
 git-tree-sha1 = "58ec7ac60dad6e8ca4553225251dfd380e3930dd"
@@ -405,6 +1069,12 @@ version = "0.1.2"
 [[deps.Mmap]]
 uuid = "a63ad114-7e13-5084-954f-fe012c677804"
 
+[[deps.MosaicViews]]
+deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"]
+git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe"
+uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389"
+version = "0.3.4"
+
 [[deps.MozillaCACerts_jll]]
 uuid = "14a3606d-f60d-562e-9121-12d972cd8159"
 version = "2023.1.10"
@@ -415,6 +1085,18 @@ git-tree-sha1 = "f5db02ae992c260e4826fe78c942954b48e1d9c2"
 uuid = "99f44e22-a591-53d1-9472-aa23ef4bd671"
 version = "1.2.1"
 
+[[deps.NearestNeighbors]]
+deps = ["Distances", "StaticArrays"]
+git-tree-sha1 = "8a3271d8309285f4db73b4f662b1b290c715e85e"
+uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce"
+version = "0.4.21"
+
+[[deps.Netpbm]]
+deps = ["FileIO", "ImageCore", "ImageMetadata"]
+git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd"
+uuid = "f09324ee-3d7c-5217-9330-fc30815ba969"
+version = "1.1.1"
+
 [[deps.Nettle]]
 deps = ["Libdl", "Nettle_jll"]
 git-tree-sha1 = "6fa48cbae828267848ee32c1bb31d1652e210d7d"
@@ -423,9 +1105,9 @@ version = "1.0.0"
 
 [[deps.Nettle_jll]]
 deps = ["Artifacts", "GMP_jll", "JLLWrappers", "Libdl"]
-git-tree-sha1 = "19961ade0a39b98575505bed6f842e8a0ec35af9"
+git-tree-sha1 = "fd4678a4bd1f7156c98691200fab47c76b376360"
 uuid = "4c82536e-c426-54e4-b420-14f461c4ed8b"
-version = "3.10.0+2"
+version = "3.10.1+0"
 
 [[deps.NetworkOptions]]
 uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908"
@@ -438,30 +1120,76 @@ version = "1.0.0"
 
 [[deps.NyxPlots]]
 deps = ["Bonito", "Observables", "PlotlyBase"]
-git-tree-sha1 = "3d54e1c527baaf6a003e0d7a4fce5fcb9d3dd775"
+git-tree-sha1 = "796b76b7aa7d642cf41b60c2f4635f4140048db9"
 repo-rev = "main"
 repo-url = "https://gitlab.com/dbc-nyx/NyxPlots.jl"
 uuid = "e8b8ccdb-0776-4145-b74f-57bbbfff4409"
-version = "0.1.2"
+version = "0.2.0"
 
 [[deps.NyxWidgets]]
 deps = ["Bonito", "Colors", "Format", "LazyArtifacts", "Observables"]
-git-tree-sha1 = "936f80aa61413c47da00f96abbc0186078698bca"
+git-tree-sha1 = "d5addf940e4265b3ca2a6fe29b8ff24bf3b13b98"
 repo-rev = "main"
 repo-url = "https://gitlab.com/dbc-nyx/NyxWidgets.jl"
 uuid = "c288fd06-43d3-4b04-8307-797133353e2e"
-version = "0.1.1"
+version = "0.2.1"
 
 [[deps.Observables]]
 git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225"
 uuid = "510215fc-4207-5dde-b226-833fc4488ee2"
 version = "0.5.5"
 
+[[deps.ObservationPolicies]]
+deps = ["Observables"]
+git-tree-sha1 = "d54b4c26b41238806c172f85e1913736c2583b0a"
+repo-rev = "main"
+repo-url = "https://gitlab.com/dbc-nyx/ObservationPolicies.jl"
+uuid = "6317928a-6b1a-42e8-b853-b8e2fc3e9ca3"
+version = "0.2.4"
+
+[[deps.OffsetArrays]]
+git-tree-sha1 = "5e1897147d1ff8d98883cda2be2187dcf57d8f0c"
+uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
+version = "1.15.0"
+weakdeps = ["Adapt"]
+
+    [deps.OffsetArrays.extensions]
+    OffsetArraysAdaptExt = "Adapt"
+
+[[deps.Ogg_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f"
+uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051"
+version = "1.3.5+1"
+
 [[deps.OpenBLAS_jll]]
 deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"]
 uuid = "4536629a-c528-5b80-bd46-f80d51c5b363"
 version = "0.3.23+4"
 
+[[deps.OpenEXR]]
+deps = ["Colors", "FileIO", "OpenEXR_jll"]
+git-tree-sha1 = "97db9e07fe2091882c765380ef58ec553074e9c7"
+uuid = "52e1d378-f018-4a11-a4be-720524705ac7"
+version = "0.3.3"
+
+[[deps.OpenEXR_jll]]
+deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "8292dd5c8a38257111ada2174000a33745b06d4e"
+uuid = "18a262bb-aa17-5467-a713-aee519bc75cb"
+version = "3.2.4+0"
+
+[[deps.OpenLibm_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "05823500-19ac-5b8b-9628-191a04bc5112"
+version = "0.8.1+2"
+
+[[deps.OpenMPI_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "Hwloc_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "MPIPreferences", "TOML", "Zlib_jll"]
+git-tree-sha1 = "2dace87e14256edb1dd0724ab7ba831c779b96bd"
+uuid = "fe0851c0-eecd-5654-98d4-656369965a5c"
+version = "5.0.6+0"
+
 [[deps.OpenSSL]]
 deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"]
 git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4"
@@ -474,11 +1202,52 @@ git-tree-sha1 = "7493f61f55a6cce7325f197443aa80d32554ba10"
 uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95"
 version = "3.0.15+3"
 
+[[deps.OpenSpecFun_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335"
+uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e"
+version = "0.5.6+0"
+
+[[deps.Opus_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575"
+uuid = "91d4177d-7536-5919-b921-800302f37372"
+version = "1.3.3+0"
+
 [[deps.OrderedCollections]]
 git-tree-sha1 = "12f1439c4f986bb868acda6ea33ebc78e19b95ad"
 uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d"
 version = "1.7.0"
 
+[[deps.PCRE2_jll]]
+deps = ["Artifacts", "Libdl"]
+uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15"
+version = "10.42.0+1"
+
+[[deps.PDMats]]
+deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"]
+git-tree-sha1 = "966b85253e959ea89c53a9abebbf2e964fbf593b"
+uuid = "90014a1f-27ba-587c-ab20-58faa44d9150"
+version = "0.11.32"
+
+[[deps.PNGFiles]]
+deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"]
+git-tree-sha1 = "67186a2bc9a90f9f85ff3cc8277868961fb57cbd"
+uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883"
+version = "0.4.3"
+
+[[deps.Packing]]
+deps = ["GeometryBasics"]
+git-tree-sha1 = "bc5bf2ea3d5351edf285a06b0016788a121ce92c"
+uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566"
+version = "0.5.1"
+
+[[deps.PaddedViews]]
+deps = ["OffsetArrays"]
+git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f"
+uuid = "5432bcbf-9aad-5242-b902-cca2824c8663"
+version = "0.5.12"
+
 [[deps.Parameters]]
 deps = ["OrderedCollections", "UnPack"]
 git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe"
@@ -491,17 +1260,48 @@ git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821"
 uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0"
 version = "2.8.1"
 
+[[deps.Pixman_jll]]
+deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"]
+git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b"
+uuid = "30392449-352a-5448-841d-b1acce4e97dc"
+version = "0.43.4+0"
+
 [[deps.Pkg]]
 deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"]
 uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
 version = "1.10.0"
 
+[[deps.PkgVersion]]
+deps = ["Pkg"]
+git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da"
+uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688"
+version = "0.3.3"
+
+[[deps.PlanarLarvae]]
+deps = ["DelimitedFiles", "HDF5", "JSON3", "LinearAlgebra", "MAT", "Meshes", "OrderedCollections", "Random", "SHA", "StaticArrays", "Statistics", "StatsBase", "StructTypes"]
+git-tree-sha1 = "d964d040e319fe3bd9140e5bf91d648de6acc96f"
+repo-rev = "main"
+repo-url = "https://gitlab.pasteur.fr/nyx/PlanarLarvae.jl"
+uuid = "c2615984-ef14-4d40-b148-916c85b43307"
+version = "0.16.0"
+
+[[deps.PlotUtils]]
+deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"]
+git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18"
+uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043"
+version = "1.4.3"
+
 [[deps.PlotlyBase]]
 deps = ["ColorSchemes", "Dates", "DelimitedFiles", "DocStringExtensions", "JSON", "LaTeXStrings", "Logging", "Parameters", "Pkg", "REPL", "Requires", "Statistics", "UUIDs"]
 git-tree-sha1 = "56baf69781fc5e61607c3e46227ab17f7040ffa2"
 uuid = "a03496cd-edff-5a9b-9e67-9cda94a718b5"
 version = "0.8.19"
 
+[[deps.PolygonOps]]
+git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6"
+uuid = "647866c9-e3ac-4575-94e7-e3d426903924"
+version = "0.1.2"
+
 [[deps.PrecompileTools]]
 deps = ["Preferences"]
 git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f"
@@ -518,6 +1318,41 @@ version = "1.4.3"
 deps = ["Unicode"]
 uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7"
 
+[[deps.ProgressMeter]]
+deps = ["Distributed", "Printf"]
+git-tree-sha1 = "8f6bc219586aef8baf0ff9a5fe16ee9c70cb65e4"
+uuid = "92933f4c-e287-5a05-a399-4b506db050ca"
+version = "1.10.2"
+
+[[deps.PtrArrays]]
+git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d"
+uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d"
+version = "1.3.0"
+
+[[deps.QOI]]
+deps = ["ColorTypes", "FileIO", "FixedPointNumbers"]
+git-tree-sha1 = "8b3fc30bc0390abdce15f8822c889f669baed73d"
+uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65"
+version = "1.0.1"
+
+[[deps.QuadGK]]
+deps = ["DataStructures", "LinearAlgebra"]
+git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284"
+uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc"
+version = "2.11.2"
+
+    [deps.QuadGK.extensions]
+    QuadGKEnzymeExt = "Enzyme"
+
+    [deps.QuadGK.weakdeps]
+    Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9"
+
+[[deps.Quaternions]]
+deps = ["LinearAlgebra", "Random", "RealDot"]
+git-tree-sha1 = "994cc27cdacca10e68feb291673ec3a76aa2fae9"
+uuid = "94ee1d12-ae83-5a48-8b1c-48b8ff168ae0"
+version = "0.7.6"
+
 [[deps.REPL]]
 deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"]
 uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"
@@ -526,6 +1361,27 @@ uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb"
 deps = ["SHA"]
 uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
 
+[[deps.RangeArrays]]
+git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5"
+uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d"
+version = "0.3.2"
+
+[[deps.Ratios]]
+deps = ["Requires"]
+git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b"
+uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439"
+version = "0.4.5"
+weakdeps = ["FixedPointNumbers"]
+
+    [deps.Ratios.extensions]
+    RatiosFixedPointNumbersExt = "FixedPointNumbers"
+
+[[deps.RealDot]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "9f0a1b71baaf7650f4fa8a1d168c7fb6ee41f0c9"
+uuid = "c1ae055f-0cd5-4b69-90a6-9a35b1a98df9"
+version = "0.1.0"
+
 [[deps.RecipesBase]]
 deps = ["PrecompileTools"]
 git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff"
@@ -551,18 +1407,51 @@ version = "1.3.0"
 
 [[deps.Revise]]
 deps = ["CodeTracking", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "REPL", "Requires", "UUIDs", "Unicode"]
-git-tree-sha1 = "b5e7c125687aa818de948ef8a0b9dc59f043342c"
+git-tree-sha1 = "9bb80533cb9769933954ea4ffbecb3025a783198"
 uuid = "295af30f-e4ad-537b-8983-00126c2a3abe"
-version = "3.7.1"
+version = "3.7.2"
 weakdeps = ["Distributed"]
 
     [deps.Revise.extensions]
     DistributedExt = "Distributed"
 
+[[deps.Rmath]]
+deps = ["Random", "Rmath_jll"]
+git-tree-sha1 = "852bd0f55565a9e973fcfee83a84413270224dc4"
+uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa"
+version = "0.8.0"
+
+[[deps.Rmath_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8"
+uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f"
+version = "0.5.1+0"
+
+[[deps.Rotations]]
+deps = ["LinearAlgebra", "Quaternions", "Random", "StaticArrays"]
+git-tree-sha1 = "5680a9276685d392c87407df00d57c9924d9f11e"
+uuid = "6038ab10-8711-5258-84ad-4b1120ba62dc"
+version = "1.7.1"
+weakdeps = ["RecipesBase"]
+
+    [deps.Rotations.extensions]
+    RotationsRecipesBaseExt = "RecipesBase"
+
+[[deps.RoundingEmulator]]
+git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b"
+uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705"
+version = "0.2.1"
+
 [[deps.SHA]]
 uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce"
 version = "0.7.0"
 
+[[deps.SIMD]]
+deps = ["PrecompileTools"]
+git-tree-sha1 = "fea870727142270bdf7624ad675901a1ee3b4c87"
+uuid = "fdea26ae-647d-5447-a871-4b548cad5224"
+version = "3.7.1"
+
 [[deps.Scratch]]
 deps = ["Dates"]
 git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386"
@@ -572,24 +1461,125 @@ version = "1.2.1"
 [[deps.Serialization]]
 uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
 
+[[deps.ShaderAbstractions]]
+deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays"]
+git-tree-sha1 = "818554664a2e01fc3784becb2eb3a82326a604b6"
+uuid = "65257c39-d410-5151-9873-9b3e5be5013e"
+version = "0.5.0"
+
+[[deps.SharedArrays]]
+deps = ["Distributed", "Mmap", "Random", "Serialization"]
+uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383"
+
+[[deps.Showoff]]
+deps = ["Dates", "Grisu"]
+git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de"
+uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f"
+version = "1.0.3"
+
+[[deps.SignedDistanceFields]]
+deps = ["Random", "Statistics", "Test"]
+git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9"
+uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96"
+version = "0.4.0"
+
 [[deps.SimpleBufferStream]]
 git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1"
 uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7"
 version = "1.2.0"
 
+[[deps.SimpleTraits]]
+deps = ["InteractiveUtils", "MacroTools"]
+git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231"
+uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d"
+version = "0.9.4"
+
+[[deps.Sixel]]
+deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"]
+git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6"
+uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47"
+version = "0.1.3"
+
 [[deps.Sockets]]
 uuid = "6462fe0b-24de-5631-8697-dd941f90decc"
 
+[[deps.SortingAlgorithms]]
+deps = ["DataStructures"]
+git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085"
+uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c"
+version = "1.2.1"
+
 [[deps.SparseArrays]]
 deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"]
 uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
 version = "1.10.0"
 
+[[deps.SpecialFunctions]]
+deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"]
+git-tree-sha1 = "64cca0c26b4f31ba18f13f6c12af7c85f478cfde"
+uuid = "276daf66-3868-5448-9aa4-cd146d93841b"
+version = "2.5.0"
+weakdeps = ["ChainRulesCore"]
+
+    [deps.SpecialFunctions.extensions]
+    SpecialFunctionsChainRulesCoreExt = "ChainRulesCore"
+
+[[deps.StableRNGs]]
+deps = ["Random"]
+git-tree-sha1 = "83e6cce8324d49dfaf9ef059227f91ed4441a8e5"
+uuid = "860ef19b-820b-49d6-a774-d7a799459cd3"
+version = "1.0.2"
+
+[[deps.StackViews]]
+deps = ["OffsetArrays"]
+git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c"
+uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15"
+version = "0.1.1"
+
+[[deps.StaticArrays]]
+deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"]
+git-tree-sha1 = "02c8bd479d26dbeff8a7eb1d77edfc10dacabc01"
+uuid = "90137ffa-7385-5640-81b9-e52037218182"
+version = "1.9.11"
+weakdeps = ["ChainRulesCore", "Statistics"]
+
+    [deps.StaticArrays.extensions]
+    StaticArraysChainRulesCoreExt = "ChainRulesCore"
+    StaticArraysStatisticsExt = "Statistics"
+
+[[deps.StaticArraysCore]]
+git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682"
+uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c"
+version = "1.4.3"
+
 [[deps.Statistics]]
 deps = ["LinearAlgebra", "SparseArrays"]
 uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2"
 version = "1.10.0"
 
+[[deps.StatsAPI]]
+deps = ["LinearAlgebra"]
+git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed"
+uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0"
+version = "1.7.0"
+
+[[deps.StatsBase]]
+deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"]
+git-tree-sha1 = "29321314c920c26684834965ec2ce0dacc9cf8e5"
+uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91"
+version = "0.34.4"
+
+[[deps.StatsFuns]]
+deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"]
+git-tree-sha1 = "b423576adc27097764a90e163157bcfc9acf0f46"
+uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c"
+version = "1.3.2"
+weakdeps = ["ChainRulesCore", "InverseFunctions"]
+
+    [deps.StatsFuns.extensions]
+    StatsFunsChainRulesCoreExt = "ChainRulesCore"
+    StatsFunsInverseFunctionsExt = "InverseFunctions"
+
 [[deps.Stipple]]
 deps = ["Dates", "FilePathsBase", "Genie", "GenieSession", "GenieSessionFileSession", "JSON3", "Logging", "MacroTools", "Mixers", "Observables", "OrderedCollections", "Parameters", "Pkg", "PrecompileTools", "Random", "Reexport", "Requires", "StructTypes", "Tables"]
 git-tree-sha1 = "9dbe489bf243b6f652b32a221cbe13346ccac1e4"
@@ -624,12 +1614,37 @@ git-tree-sha1 = "b765e46ba27ecf6b44faf70df40c57aa3a547dcb"
 uuid = "69024149-9ee7-55f6-a4c4-859efe599b68"
 version = "0.3.7"
 
+[[deps.StructArrays]]
+deps = ["ConstructionBase", "DataAPI", "Tables"]
+git-tree-sha1 = "5a3a31c41e15a1e042d60f2f4942adccba05d3c9"
+uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a"
+version = "0.7.0"
+
+    [deps.StructArrays.extensions]
+    StructArraysAdaptExt = "Adapt"
+    StructArraysGPUArraysCoreExt = ["GPUArraysCore", "KernelAbstractions"]
+    StructArraysLinearAlgebraExt = "LinearAlgebra"
+    StructArraysSparseArraysExt = "SparseArrays"
+    StructArraysStaticArraysExt = "StaticArrays"
+
+    [deps.StructArrays.weakdeps]
+    Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
+    GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527"
+    KernelAbstractions = "63c18a36-062a-441e-b654-da1e3ab1ce7c"
+    LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
+    SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
+    StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
+
 [[deps.StructTypes]]
 deps = ["Dates", "UUIDs"]
 git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8"
 uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4"
 version = "1.11.0"
 
+[[deps.SuiteSparse]]
+deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"]
+uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9"
+
 [[deps.SuiteSparse_jll]]
 deps = ["Artifacts", "Libdl", "libblastrampoline_jll"]
 uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c"
@@ -678,6 +1693,20 @@ git-tree-sha1 = "50cb5f85d5646bc1422aa0238aa5bfca99ca9ae7"
 uuid = "b189fb0b-2eb5-4ed4-bc0c-d34c51242431"
 version = "2.1.1"
 
+[[deps.TidyObservables]]
+deps = ["Observables"]
+git-tree-sha1 = "0589ec7397374678942cae9aa356b4bb6c1e9bf4"
+repo-rev = "main"
+repo-url = "https://gitlab.com/dbc-nyx/TidyObservables.jl"
+uuid = "c8131bbd-73a8-4254-a42d-d5d4c5febb31"
+version = "0.1.1"
+
+[[deps.TiffImages]]
+deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "SIMD", "UUIDs"]
+git-tree-sha1 = "f21231b166166bebc73b99cea236071eb047525b"
+uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69"
+version = "0.11.3"
+
 [[deps.Tokenize]]
 git-tree-sha1 = "468b4685af4abe0e9fd4d7bf495a6554a6276e75"
 uuid = "0796e94c-ce3b-5d07-9a54-7f471281c624"
@@ -688,6 +1717,17 @@ git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742"
 uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa"
 version = "0.11.3"
 
+[[deps.TransformsBase]]
+deps = ["AbstractTrees"]
+git-tree-sha1 = "2412fb54902b0063c69c2bcfbec6b571120cc856"
+uuid = "28dd2a49-a57a-4bfb-84ca-1a49db9b96b8"
+version = "0.1.2"
+
+[[deps.TriplotBase]]
+git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b"
+uuid = "981d1d27-644d-49a2-9326-4793e63143c3"
+version = "0.1.0"
+
 [[deps.URIParser]]
 deps = ["Unicode"]
 git-tree-sha1 = "53a9f49546b8d2dd2e688d216421d050c9a31d0d"
@@ -711,18 +1751,113 @@ version = "1.0.2"
 [[deps.Unicode]]
 uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5"
 
+[[deps.UnicodeFun]]
+deps = ["REPL"]
+git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf"
+uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1"
+version = "0.4.1"
+
+[[deps.Unitful]]
+deps = ["Dates", "LinearAlgebra", "Random"]
+git-tree-sha1 = "c0667a8e676c53d390a09dc6870b3d8d6650e2bf"
+uuid = "1986cc42-f94f-5a68-af5c-568840ba703d"
+version = "1.22.0"
+weakdeps = ["ConstructionBase", "InverseFunctions"]
+
+    [deps.Unitful.extensions]
+    ConstructionBaseUnitfulExt = "ConstructionBase"
+    InverseFunctionsUnitfulExt = "InverseFunctions"
+
+[[deps.WGLMakie]]
+deps = ["Bonito", "Colors", "FileIO", "FreeTypeAbstraction", "GeometryBasics", "Hyperscript", "LinearAlgebra", "Makie", "Observables", "PNGFiles", "PrecompileTools", "RelocatableFolders", "ShaderAbstractions", "StaticArrays"]
+git-tree-sha1 = "d76bbe29bdac0dc4096e3838c044ed079bb8682b"
+uuid = "276b4fcb-3e11-5398-bf8b-a0c2d153d008"
+version = "0.11.1"
+
+[[deps.WebP]]
+deps = ["CEnum", "ColorTypes", "FileIO", "FixedPointNumbers", "ImageCore", "libwebp_jll"]
+git-tree-sha1 = "aa1ca3c47f119fbdae8770c29820e5e6119b83f2"
+uuid = "e3aaa7dc-3e4b-44e0-be63-ffb868ccd7c1"
+version = "0.1.3"
+
 [[deps.WidgetsBase]]
 deps = ["Observables"]
 git-tree-sha1 = "30a1d631eb06e8c868c559599f915a62d55c2601"
 uuid = "eead4739-05f7-45a1-878c-cee36b57321c"
 version = "0.1.4"
 
+[[deps.WoodburyMatrices]]
+deps = ["LinearAlgebra", "SparseArrays"]
+git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511"
+uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6"
+version = "1.0.0"
+
 [[deps.XML2_jll]]
 deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"]
 git-tree-sha1 = "04a51d15436a572301b5abbb9d099713327e9fc4"
 uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a"
 version = "2.10.4+0"
 
+[[deps.XSLT_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "XML2_jll", "Zlib_jll"]
+git-tree-sha1 = "7d1671acbe47ac88e981868a078bd6b4e27c5191"
+uuid = "aed1982a-8fda-507f-9586-7b0439959a61"
+version = "1.1.42+0"
+
+[[deps.XZ_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "56c6604ec8b2d82cc4cfe01aa03b00426aac7e1f"
+uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800"
+version = "5.6.4+1"
+
+[[deps.Xorg_libX11_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"]
+git-tree-sha1 = "9dafcee1d24c4f024e7edc92603cedba72118283"
+uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc"
+version = "1.8.6+3"
+
+[[deps.Xorg_libXau_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "e9216fdcd8514b7072b43653874fd688e4c6c003"
+uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec"
+version = "1.0.12+0"
+
+[[deps.Xorg_libXdmcp_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "89799ae67c17caa5b3b5a19b8469eeee474377db"
+uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05"
+version = "1.1.5+0"
+
+[[deps.Xorg_libXext_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
+git-tree-sha1 = "d7155fea91a4123ef59f42c4afb5ab3b4ca95058"
+uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3"
+version = "1.3.6+3"
+
+[[deps.Xorg_libXrender_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"]
+git-tree-sha1 = "a490c6212a0e90d2d55111ac956f7c4fa9c277a6"
+uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa"
+version = "0.9.11+1"
+
+[[deps.Xorg_libpthread_stubs_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "c57201109a9e4c0585b208bb408bc41d205ac4e9"
+uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74"
+version = "0.1.2+0"
+
+[[deps.Xorg_libxcb_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"]
+git-tree-sha1 = "1a74296303b6524a0472a8cb12d3d87a78eb3612"
+uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b"
+version = "1.17.0+3"
+
+[[deps.Xorg_xtrans_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "6dba04dbfb72ae3ebe5418ba33d087ba8aa8cb00"
+uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10"
+version = "1.5.1+0"
+
 [[deps.YAML]]
 deps = ["Base64", "Dates", "Printf", "StringEncodings"]
 git-tree-sha1 = "dea63ff72079443240fbd013ba006bcbc8a9ac00"
@@ -734,17 +1869,95 @@ deps = ["Libdl"]
 uuid = "83775a58-1f1d-513f-b197-d71354ab007a"
 version = "1.2.13+1"
 
+[[deps.Zstd_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "622cf78670d067c738667aaa96c553430b65e269"
+uuid = "3161d3a3-bdf6-5164-811a-617609db77b4"
+version = "1.5.7+0"
+
+[[deps.isoband_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"]
+git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c"
+uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4"
+version = "0.2.3+0"
+
+[[deps.libaec_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "f5733a5a9047722470b95a81e1b172383971105c"
+uuid = "477f73a3-ac25-53e9-8cc3-50b2fa2566f0"
+version = "1.1.3+0"
+
+[[deps.libaom_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "522c1df09d05a71785765d19c9524661234738e9"
+uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b"
+version = "3.11.0+0"
+
+[[deps.libass_jll]]
+deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e"
+uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0"
+version = "0.15.2+0"
+
 [[deps.libblastrampoline_jll]]
 deps = ["Artifacts", "Libdl"]
 uuid = "8e850b90-86db-534c-a0d3-1478176c7d93"
 version = "5.11.0+0"
 
+[[deps.libfdk_aac_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38"
+uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280"
+version = "2.0.3+0"
+
+[[deps.libpng_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"]
+git-tree-sha1 = "055a96774f383318750a1a5e10fd4151f04c29c5"
+uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f"
+version = "1.6.46+0"
+
+[[deps.libsixel_jll]]
+deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"]
+git-tree-sha1 = "c1733e347283df07689d71d61e14be986e49e47a"
+uuid = "075b6546-f08a-558a-be8f-8157d0f608a5"
+version = "1.10.5+0"
+
+[[deps.libvorbis_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"]
+git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3"
+uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a"
+version = "1.3.7+2"
+
+[[deps.libwebp_jll]]
+deps = ["Artifacts", "Giflib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libglvnd_jll", "Libtiff_jll", "libpng_jll"]
+git-tree-sha1 = "d2408cac540942921e7bd77272c32e58c33d8a77"
+uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2"
+version = "1.5.0+0"
+
 [[deps.nghttp2_jll]]
 deps = ["Artifacts", "Libdl"]
 uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d"
 version = "1.52.0+1"
 
+[[deps.oneTBB_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "7d0ea0f4895ef2f5cb83645fa689e52cb55cf493"
+uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e"
+version = "2021.12.0+0"
+
 [[deps.p7zip_jll]]
 deps = ["Artifacts", "Libdl"]
 uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0"
 version = "17.4.0+2"
+
+[[deps.x264_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7"
+uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a"
+version = "10164.0.1+0"
+
+[[deps.x265_jll]]
+deps = ["Artifacts", "JLLWrappers", "Libdl"]
+git-tree-sha1 = "dcc541bb19ed5b0ede95581fb2e41ecf179527d2"
+uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76"
+version = "3.6.0+0"
diff --git a/front/build-run-local.sh b/front/build-run-local.sh
index 2d209dc30aafc6fb78bdd3aa9c6a801dea58ad3f..79c9f43c516b343ebe6ad3c278c5d3cd2efc4a21 100755
--- a/front/build-run-local.sh
+++ b/front/build-run-local.sh
@@ -11,13 +11,14 @@ IMAGE=nyx-dev
 
 podman rmi -f $IMAGE || true
 
+rm -rf ../LarvaTagger.jl; cp -Rp ../../LarvaTagger/LarvaTagger.jl ../
+
 podman build --tag $IMAGE -f "$CONTAINERFILE" .. # --no-cache
 
 #mkdir -p public
 
 podman run -d -p 8081:80 -p 9484:9284 -p 9485:9285 \
   $IMAGE
-#  -v `realpath ./public`:/usr/share/nginx/html \
 
 CONTAINER=`podman ps | grep $IMAGE | cut -d' ' -f1`
 
diff --git a/front/entrypoint.sh b/front/entrypoint.sh
index 44cf7549089f588a81a3ee33ef6c780b9627e5e0..ae9288c705d3be255e713840b01b6dda44475ac1 100644
--- a/front/entrypoint.sh
+++ b/front/entrypoint.sh
@@ -3,7 +3,7 @@
 set -m
 
 
-/docker-entrypoint.sh nginx -g "daemon off;" &
+/docker-entrypoint.sh nginx -g "daemon off;" &>/dev/null &
 NGINX_PID=$!
 
 
diff --git a/k8s/front-deployment.yaml b/k8s/front-deployment.yaml
deleted file mode 100644
index 6cdee87c1596605c2b807c2f750e789a7403b48f..0000000000000000000000000000000000000000
--- a/k8s/front-deployment.yaml
+++ /dev/null
@@ -1,38 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
-  name: ${APP_NAME}-front
-  labels:
-    app: $APP_NAME
-spec:
-  replicas: 1
-  selector:
-    matchLabels:
-      app: $APP_NAME
-  template:
-    metadata:
-      labels:
-        app: $APP_NAME
-        nyxui/component: front
-    spec:
-      containers:
-        - name: $APP_NAME
-          image: $FQ_IMAGE_NAME
-          resources:
-            limits:
-              cpu: "2"
-              ephemeral-storage: 1Gi
-              memory: 4Gi
-            requests:
-              cpu: "2"
-              ephemeral-storage: 1Gi
-              memory: 4Gi
-          ports:
-            - name: http
-              containerPort: 8080
-              protocol: TCP
-          securityContext:
-            allowPrivilegeEscalation: false
-            capabilities:
-              drop:
-                - ALL
\ No newline at end of file
diff --git a/k8s/front-service.yaml b/k8s/front-service.yaml
deleted file mode 100644
index 64f770f72932c56f81bed168bf45da31af8a6c3d..0000000000000000000000000000000000000000
--- a/k8s/front-service.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
-  name: ${APP_NAME}-front
-spec:
-  selector:
-    app: $APP_NAME
-    nyxui/component: front
-  ports:
-    - protocol: TCP
-      port: 80
-      targetPort: http
-      name: http
diff --git a/k8s/ingress.yaml b/k8s/ingress.yaml
deleted file mode 100644
index cbaeb77f35b7d87eb9c0558c74e54e514c918842..0000000000000000000000000000000000000000
--- a/k8s/ingress.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
-  name: $APP_NAME
-  labels:
-    app: $APP_NAME
-spec:
-  ingressClassName: internal
-  rules:
-    - host: $PUBLIC_URL
-      http:
-        paths:
-          - path: /
-            pathType: Prefix
-            backend:
-              service:
-                name: ${APP_NAME}-front
-                port:
-                  number: 80
diff --git a/nyxui/Chart.yaml b/nyxui/Chart.yaml
index 94afc3b14e04b5366844eab130c7c49b0e5bffc5..567ea86302b3a01ca09c28aa9ff20c3b221acfe9 100644
--- a/nyxui/Chart.yaml
+++ b/nyxui/Chart.yaml
@@ -15,10 +15,10 @@ type: application
 # This is the chart version. This version number should be incremented each time you make changes
 # to the chart and its templates, including the app version.
 # Versions are expected to follow Semantic Versioning (https://semver.org/)
-version: 0.1.0
+version: 0.2.0
 
 # This is the version number of the application being deployed. This version number should be
 # incremented each time you make changes to the application. Versions are not expected to
 # follow Semantic Versioning. They should reflect the version the application is using.
 # It is recommended to use it with quotes.
-appVersion: "0.1"
+appVersion: "0.2.0"
diff --git a/routes.jl b/routes.jl
index 3e6bc03f7bc64ea4600ede766529f57d98e427be..bca171df89008462befc35e52176fb0814e628c7 100755
--- a/routes.jl
+++ b/routes.jl
@@ -31,7 +31,7 @@ if Genie.Configuration.isprod()
 end
 
 function modelview(model, view)
-    page(model, NyxUI.add_footer(view); title=nyxui_title)
+    page(model, view; title=nyxui_title)
 end
 
 Stipple.Layout.add_css(nyxui_css)
@@ -49,6 +49,13 @@ route("/muscles") do
     MuscleApp.handler(modelview)
 end
 
+include("src/apps/larvatagger/app.jl")
+LarvaTagger.bonito_app.name = "larvatagger"
+
+route("/larvatagger") do
+    LarvaTagger.handler(modelview)
+end
+
 run_as_script = isinteractive()
 up(; async=run_as_script)
 #display(NyxUI.bonitoserver())
diff --git a/src/BonitoServer.jl b/src/BonitoServer.jl
index be863e6b67fe2682ce9011326fde7f5f002f7847..e8488437d46a3fe3591d691353672dbe52198a11 100644
--- a/src/BonitoServer.jl
+++ b/src/BonitoServer.jl
@@ -55,14 +55,21 @@ function route(session::AbstractString, suffix::AbstractString="",
     return join(parts, "/")
 end
 
-addsession(args...; kwargs...) = addsession(bonitoserver(; kwargs...), args...)
+function addsession(args...; restart=false, kwargs...)
+    addsession(bonitoserver(; kwargs...), args...; restart=restart)
+end
 
-function addsession(server::Bonito.Server, named_app, session_id)
-    appname = name(named_app)
-    if !Bonito.has_route(server.routes, route(session_id, appname))
-        @info "New user session" session_id appname
+function addsession(server::Bonito.Server, named_app, session_id; restart=false)
+    app_name = name(named_app)
+    app_route = route(session_id, app_name)
+    if restart || !Bonito.has_route(server.routes, app_route)
+        if Bonito.has_route(server.routes, app_route)
+            @info "New handler" session_id app_name
+        else
+            @info "New user session" session_id app_name
+        end
         app = named_app.app
-        Bonito.route!(server, route(session_id, appname) => app(session_id))
+        Bonito.route!(server, app_route => app(session_id))
         Bonito.HTTPServer.start(server)
     end
 end
diff --git a/src/GenieExtras.jl b/src/GenieExtras.jl
index 53ca6eb3c9bf6fe4194c3dcb8002f39ccc06538b..40cf48a4fa308ea6ab9a3b9c735bfdc133852c19 100644
--- a/src/GenieExtras.jl
+++ b/src/GenieExtras.jl
@@ -2,7 +2,7 @@ module GenieExtras
 
 import Genie.Renderer.Html
 
-export publish_css, add_footer
+export publish_css, appinfo, add_footer
 
 const project_root = dirname(Base.current_project())
 
@@ -30,7 +30,7 @@ function publish_css(; clear=true)
     return css_dir
 end
 
-function footer()
+function appinfo()
     version = string(pkgversion(@__MODULE__))
     if endswith(version, ".0")
         version = version[1:end-2]
@@ -39,12 +39,14 @@ function footer()
     if isfile(versionfile)
         version = join((version, readchomp(versionfile)), "-")
     end
-    tagurl = "https://gitlab.com/dbc-nyx/NyxUI.jl/-/tags"
-    Html.footer("NyxUI.jl <a href=\"$tagurl\">v$version</a>")
+    tagurl = "https://gitlab.pasteur.fr/nyx/NyxUI/-/tags"
+    return "NyxUI.jl <a href=\"$tagurl\">v$version</a>"
 end
 
-add_footer(ui::AbstractString) = "$ui$(footer())"
+footer() = Html.footer(appinfo())
 
-add_footer(ui::Function) = () -> add_footer(ui())
+add_footer(ui::AbstractString, footer=footer) = "$ui$(footer())"
+
+add_footer(ui::Function, footer=footer) = () -> add_footer(ui(), footer)
 
 end
diff --git a/src/Storage.jl b/src/Storage.jl
index 24c879e4f79c269a1af82ceacf2e7e70b57f35aa..d037cbbb1a12c2e5a746c1db706b7eca5aa8fd34 100644
--- a/src/Storage.jl
+++ b/src/Storage.jl
@@ -3,7 +3,7 @@ module Storage
 using Dates
 using TOML
 
-export getconfig, getbucket, clear_oldest
+export getconfig, getbucket, clear_oldest, purge_appdata
 
 const __storage_location__ = get(ENV, "STORAGE",
                                  joinpath(dirname(Base.current_project()), "storage"))
@@ -32,10 +32,12 @@ function getconfig(key, morekeys...; default=nothing)
     config isa Dict ? default : config
 end
 
-getbucket(session_id) = joinpath(__storage_location__, "exports", session_id)
+function getbucket(session_id, appname)
+    joinpath(__storage_location__, "exports", session_id, appname)
+end
 
-function getbucket(session_id, mode)
-    session_bucket = getbucket(session_id)
+function getbucket(session_id, appname, mode)
+    session_bucket = getbucket(session_id, appname)
     if mode === :read
         session_bucket
     elseif mode === :write
@@ -50,8 +52,10 @@ end
 
 function getbucket(; child_resource)
     parts = splitpath(child_resource)
-    session_id = parts[findfirst(==("exports"), parts) + 1]
-    return getbucket(session_id)
+    exports = findfirst(==("exports"), parts)
+    session_id = parts[exports + 1]
+    appname = parts[exports + 2]
+    return getbucket(session_id, appname)
 end
 
 function clear_oldest(session_bucket)
@@ -61,4 +65,11 @@ function clear_oldest(session_bucket)
     rm(oldest; recursive=true)
 end
 
+function purge_appdata(session_id, appname)
+    bucket = getbucket(session_id, appname, :read)
+    isdir(bucket) && rm(bucket; recursive=true)
+    exportdir = joinpath("public", session_id, appname)
+    isdir(exportdir) && rm(exportdir; recursive=true)
+end
+
 end
diff --git a/src/apps/catalog/app.jl b/src/apps/catalog/app.jl
index 240cf82bb95dd1eefd6c767f6ebab700d3ad2162..cc5c45f9791c9adea27df3892548c63051ec4e4e 100644
--- a/src/apps/catalog/app.jl
+++ b/src/apps/catalog/app.jl
@@ -34,10 +34,10 @@ function app_catalog_view()
                     Html.div(class=caption, "Coming soon!"),
                 ),
             ]))),
-            item(item(class=app, Html.a(href="", class="disabled", [
+            item(item(class=app, Html.a(href=Router.link_to(:get_larvatagger), [
                 Html.h1("LarvaTagger", style=header2),
                 imageview(src="/images/LarvaTagger.png", style=img,
-                    Html.div(class=caption, "Coming soon!"),
+                    Html.div(class=caption, "Partially available"),
                 ),
             ]))),
         ]),
diff --git a/src/apps/larvatagger/app.jl b/src/apps/larvatagger/app.jl
new file mode 100644
index 0000000000000000000000000000000000000000..dbdea6201e1c0fe84e2a892f9758f348ceaa7d84
--- /dev/null
+++ b/src/apps/larvatagger/app.jl
@@ -0,0 +1,164 @@
+module LarvaTagger
+
+using NyxUI, NyxUI.Storage, NyxUI.GenieExtras
+using NyxWidgets.Base: Cache
+import LarvaTagger as LT
+using GenieSession, Stipple
+import Stipple: @app, @init, @private, @in, @onchange, @onbutton, @click
+import StippleUI: tooltip
+
+const sizefactors = Dict("1.0"=>1., "1.5"=>1.5, "2.0"=>2.)
+const sizefactors_str = Dict(v=>k for (k,v) in pairs(sizefactors))
+const appheight = Dict("1.0"=>"900px", "1.5"=>"1300px", "2.0"=>"1700px")
+const appwidth = Dict("1.0"=>"1680px", "1.5"=>"2280px", "2.0"=>"2880px")
+
+mutable struct Model
+    sizefactor
+    app # TODO: check whether explicitly closing apps helps
+    appdata
+end
+
+const bonito_models = Cache{String, Model}()
+
+const bonito_app = NamedApp("larvatagger",
+    function (session)
+        bucket = getbucket(session, "larvatagger", :read)
+        mkpath(bucket)
+        model = lock(bonito_models) do
+            if haskey(bonito_models, session)
+                bonito_models.cache[session]
+            else
+                inputfile = Ref{Union{Nothing, String}}(nothing)
+                bonito_models.cache[session] = Model(1.0, nothing, inputfile)
+            end
+        end
+        exportdir = joinpath("public", session, "larvatagger")
+        function prepare_download(srcfile)
+            mkpath(exportdir)
+            filename = basename(srcfile)
+            tempfile = joinpath(exportdir, filename)
+            if !samefile(srcfile, tempfile)
+                open(tempfile, "w") do fout
+                    open(srcfile, "r") do fin
+                        write(fout, read(fin))
+                    end
+                end
+            end
+            return "/$session/larvatagger/$filename"
+        end
+        isnothing(model.app) || close(model.app)
+        model.app = app = LT.larvaeditor(model.appdata;
+                                         root_directory=bucket,
+                                         enable_uploads=true,
+                                         enable_downloads=true,
+                                         prepare_download=prepare_download,
+                                         enable_new_directories=true,
+                                         enable_delete=true,
+                                         viewfactor=model.sizefactor)
+        return app
+    end
+)
+
+function purgesession(session)
+    model = lock(bonito_models) do
+        pop!(bonito_models.cache, session)
+    end
+    isnothing(model.app) || close(model.app)
+    purge_appdata(session, "larvatagger")
+    BonitoServer.addsession(bonito_app, session; restart=true)
+end
+
+
+@app begin
+    @private bonito_session_id = ""
+    @in sizefactor = "1.0"
+    @in reset_bonito_session = false
+
+    @onchange isready begin
+        genie_session = GenieSession.session()
+        bonito_session_id = genie_session.id[1:32]
+        if haskey(bonito_models, bonito_session_id)
+            sizefactor = sizefactors_str[bonito_models[bonito_session_id].sizefactor]
+        else
+            BonitoServer.addsession(bonito_app, bonito_session_id)
+        end
+        url = bonito_url(bonito_app, bonito_session_id)
+        width = appwidth[sizefactor]
+        height = appheight[sizefactor]
+        run(__model__, """
+            const iframe = document.getElementById('bonito');
+            iframe.src = '$url';
+            iframe.style.height = '$height';
+            document.getElementById('footer').style.width = '$width';
+            document.getElementById('iframe_alt_text').style.display = 'none';
+        """)
+    end
+
+    @onchange sizefactor begin
+        new_sizefactor = sizefactors[sizefactor]
+        if new_sizefactor != bonito_models[bonito_session_id].sizefactor
+            @info "New size factor; refreshing the iframe"
+            bonito_models[bonito_session_id].sizefactor = new_sizefactor
+            BonitoServer.addsession(bonito_app, bonito_session_id; restart=true) # restart
+            width = appwidth[sizefactor]
+            height = appheight[sizefactor]
+            run(__model__, """
+                const iframe = document.getElementById('bonito');
+                iframe.style.height = '$height';
+                iframe.src += '';
+                document.getElementById('footer').style.width = '$width';
+            """)
+        end
+    end
+
+    @onbutton reset_bonito_session begin
+        purgesession(bonito_session_id)
+        # reset UI to defaults
+        bonito_session_id[!] = ""
+        sizefactor[!] = "1.0"
+        # reload page
+        run(__model__, "location.reload(true);")
+    end
+end
+
+function view()
+    [
+        Html.div("Refresh the page if the present message does not disappear after a few seconds";
+                 id="iframe_alt_text",
+                 style="width:$(appwidth["1.0"]);margin:auto;padding:2rem;"),
+        Html.iframe(; id="bonito", style="width:100%;height:0;border:none;"),
+        Html.div([
+            Html.div([
+                Html.span("2D view size factor:&nbsp;"; style="margin-right:0.5rem;"),
+                Html.select(:sizefactor; options=collect(keys(sizefactors)),
+                            multiple=false, clearable=false, counter=false, usechips=false,
+                            dense=true, var"options-dense"=true)];
+                style="display:flex;flex-direction:horizontal;align-items:center;"),
+            Html.span("Reset session", @click(:reset_bonito_session),
+                      style="cursor:pointer;",
+                      [tooltip("Useful when the app crashes. All data will be lost!")]),
+            Html.span(appinfo())];
+            id="footer",
+        ),
+    ]
+end
+
+function appinfo()
+    version = string(pkgversion(LT))
+    if endswith(version, ".0")
+        version = version[1:end-2]
+    end
+    versionfile = joinpath(@__DIR__, "version.txt")
+    if isfile(versionfile)
+        version = join((version, readchomp(versionfile)), "-")
+    end
+    tagurl = "https://gitlab.pasteur.fr/nyx/LarvaTagger.jl/-/tags"
+    return "LarvaTagger.jl <a href=\"$tagurl\">v$version</a>"
+end
+
+function handler(_)
+    model = @init
+    page(model, view; title="LarvaTagger")
+end
+
+end
diff --git a/src/apps/muscles/Backbone.jl b/src/apps/muscles/Backbone.jl
index eb4758a59f0e5864392c222e985a7d631015d9b1..5547f559f2007fab4c3a50d8d513536747340842 100644
--- a/src/apps/muscles/Backbone.jl
+++ b/src/apps/muscles/Backbone.jl
@@ -9,7 +9,7 @@ include("MuscleWidgets.jl")
 using .MuscleWidgets
 
 export hasmodel, getmodel, setmodel, newsequence, getsequence, withsequences,
-       exportsequence, loadsequence, deletesequence
+       exportsequence, loadsequence, deletesequence, purgesession
 
 # mutable struct Backbone{W}
 #     widget::Union{Nothing, W}
@@ -132,10 +132,10 @@ end
 
 ## persistent storage
 
-function exportsequence(session_id)
+function exportsequence(session_id; appname="muscles")
     sequence = getsequence(session_id)
     isempty(sequence.program_name) && return ""
-    dir = getbucket(session_id, :write)
+    dir = getbucket(session_id, appname, :write)
     filepath = joinpath(dir, sequence.program_name * ".json")
     MuscleActivities.to_json_file(filepath, sequence)
     return filepath
@@ -166,4 +166,20 @@ function deletesequence(session_id)
     end
 end
 
+function purgesession(session_id; appname="muscles")
+   model = lock(__backbone_cache__) do
+        if session_id in keys(__backbone_cache__.cache)
+            #pop!(__valid_sessions__, session_id) # not sure what to do with it
+            pop!(__backbone_cache__.cache, session_id)
+        end
+    end
+    lock(__sequences__) do
+        if session_id in keys(__sequences__.cache)
+            pop!(__sequences__.cache, session_id)
+        end
+    end
+    purge_appdata(session_id, appname)
+    return model
+end
+
 end
diff --git a/src/apps/muscles/MuscleWidgets.jl b/src/apps/muscles/MuscleWidgets.jl
index e5577ed86345d7c58f1d200b59fb2ccd05e3ea1c..0c12617989856f547b119331022cb1afdbc5c42b 100644
--- a/src/apps/muscles/MuscleWidgets.jl
+++ b/src/apps/muscles/MuscleWidgets.jl
@@ -22,7 +22,6 @@ struct MuscleWidget
     sequence::AbstractObservable
     colormap::AbstractObservable
     colorscheme::AbstractObservable
-    setvalue::AbstractObservable
     overview::Muscles.MultiSegmentMuscleWidget
     individualsegments::Vector{Muscles.MuscleWidget}
     heatmaps::Vector{Heatmap}
@@ -39,17 +38,16 @@ function MuscleWidget(sequence)
     on(colormap) do c
         colorscheme[] = scale2scheme(c)
     end
-    setvalue = Observable{Float64}(1)
     editmode = Observable(false)
     #
-    overview = Muscles.MultiSegmentMuscleWidget(; musclelabel=false)
+    overview = Muscles.MultiSegmentMuscleWidget(; musclelabel=false, sidelabel=:right)
     individualsegments = [Muscles.MuscleWidget(; segment=segment.segment,
                                                side=segment.side,
                                                upsidedown=segment.side=="right",
                                                segmentlabel=true,
                                                style="width: 40%; margin-top: 2rem;")
                           for segment in segments(overview)]
-    moveto = clipboard = zlim = nothing
+    moveto = clipboard = zlim = setvalue = nothing
     heatmaps = Heatmap[]
     for segment in individualsegments
         halfsegment = sequence[][segment.segment, segment.side]
@@ -61,10 +59,12 @@ function MuscleWidget(sequence)
                           pick=moveto,
                           clipboard=clipboard,
                           setvalue=setvalue,
-                          zlim=zlim)
+                          zlim=zlim,
+                          prompt_on_assign=true)
         moveto = heatmap.pick
         clipboard = heatmap.clipboard
         zlim = heatmap.zlim
+        setvalue = heatmap.setvalue
         push!(heatmaps, heatmap)
     end
     detailedviews = [Div(widget, heatmap; style=:row)
@@ -137,7 +137,7 @@ function MuscleWidget(sequence)
             heatmaps[layer-1].editing[] = b
         end
     end
-    return MuscleWidget(sequence, colormap, colorscheme, setvalue, overview,
+    return MuscleWidget(sequence, colormap, colorscheme, overview,
                         individualsegments, heatmaps, animation, editmode)
 end
 
diff --git a/src/apps/muscles/app.jl b/src/apps/muscles/app.jl
index 082584919dcbe8e831b50d195d406f2e2ff249b1..6140bd2cb844c63fc6efdb74953b6a4ca7958b12 100644
--- a/src/apps/muscles/app.jl
+++ b/src/apps/muscles/app.jl
@@ -1,6 +1,6 @@
 module MuscleApp
 
-using NyxUI, NyxUI.Storage
+using NyxUI, NyxUI.Storage, NyxUI.GenieExtras
 using Observables
 using Genie, GenieSession, Stipple, StippleUI
 import Stipple: @app, @init, @private, @in, @out, @onchange, @onbutton, @notify
@@ -21,7 +21,7 @@ const maxlength = getconfig("muscle-activity", "maxlength")
 const bonito_app = NamedApp(:inherit, Backbone.app)
 
 @app begin
-    @private back_session_id = ""
+    @private bonito_session_id = ""
 
     @private sequence = MuscleActivity("")
     @in new_sequence_click = false
@@ -39,7 +39,6 @@ const bonito_app = NamedApp(:inherit, Backbone.app)
     @out first_time_in_editmode = true # and in the heatmap view
     @in editmode = false
     @out editmode_disable = true
-    @in setvalue = 1.0
     @in series_length::Float64 = 21
     @in time_interval = 0.05
     @in start_time = 0.0
@@ -52,6 +51,8 @@ const bonito_app = NamedApp(:inherit, Backbone.app)
     @in delete_sequence_click = false
     @out no_sequences_yet = true
 
+    @in reset_bonito_session = false
+
     @onchange isready begin
         _, url = init_model(__model__)
         run(__model__, """
@@ -61,7 +62,7 @@ const bonito_app = NamedApp(:inherit, Backbone.app)
         loader.style.display = 'block';
         iframe.src = '$url';
         """)
-        session_id = back_session_id
+        session_id = bonito_session_id
         model = getmodel(session_id)
         if true # TODO: diagnose missing Stipple initialization
             # restore state after page reload (Ctrl+R)
@@ -71,7 +72,6 @@ const bonito_app = NamedApp(:inherit, Backbone.app)
             colormap = model.colormap[]
             editmode = model.editmode[]
             sequence_name = name
-            setvalue = model.setvalue[]
             seq = model.sequence[]
             series_length = length(seq.times)
             time_interval = step(seq.times)
@@ -94,8 +94,33 @@ const bonito_app = NamedApp(:inherit, Backbone.app)
         end
     end
 
+    @onbutton reset_bonito_session begin
+        model = purgesession(bonito_session_id; appname=bonito_app.name)
+        # reset UI to defaults
+        #bonito_session_id[!] = ""
+        sequence[!] = MuscleActivity("")
+        new_sequence_type[!] = "Empty"
+        make_new_sequences_random[!] = false
+        sequence_names[!] = String[]
+        selected_sequence_name[!] = ""
+        selected_sequence_index[!] = 0
+        sequence_name[!] = ""
+        export_sequence_link[!] = ""
+        colormap[!] = default_colormap
+        first_time_in_editmode[!] = true
+        editmode[!] = false
+        series_length[!] = 21
+        time_interval[!] = 0.05
+        start_time[!] = 0.0
+        heatmap_view[!] = false
+        no_sequences_yet[!] = true
+        # reload page
+        setmodel(bonito_session_id, sequence)
+        run(__model__, "location.reload(true);")
+    end
+
     @onchange start_time, time_interval, series_length begin
-        model = getmodel(back_session_id)
+        model = getmodel(bonito_session_id)
         seq = model.sequence[]
         # input validation
         valid = true
@@ -140,7 +165,7 @@ const bonito_app = NamedApp(:inherit, Backbone.app)
     end
 
     @onbutton new_sequence_click begin
-        sequence = newsequence(back_session_id, new_sequence_type, sequence_names,
+        sequence = newsequence(bonito_session_id, new_sequence_type, sequence_names,
                                start_time, time_interval, round(Int, series_length))
         # propagate
         name = sequence.program_name
@@ -169,7 +194,7 @@ const bonito_app = NamedApp(:inherit, Backbone.app)
 
     @onchange selected_sequence_name begin
         isempty(selected_sequence_name) && return
-        seq = getsequence(back_session_id, selected_sequence_name)
+        seq = getsequence(bonito_session_id, selected_sequence_name)
         if !isnothing(seq)
             ix = findfirst(==(selected_sequence_name), sequence_names)
             selected_sequence_index[!] = ix
@@ -204,7 +229,7 @@ const bonito_app = NamedApp(:inherit, Backbone.app)
                 break
             end
         end
-        model = getmodel(back_session_id)
+        model = getmodel(bonito_session_id)
         if valid
             model.sequence[].program_name = sequence[!].program_name = sequence_name
             sequence_names[!][selected_sequence_index] = sequence_name
@@ -216,12 +241,17 @@ const bonito_app = NamedApp(:inherit, Backbone.app)
     end
 
     @onchange colormap begin
-        model = getmodel(back_session_id)
+        model = getmodel(bonito_session_id)
         model.colormap[] = colormap
     end
 
     @onchange editmode begin
-        model = getmodel(back_session_id)
+        if editmode && isempty(sequence_name)
+            @notify "Create a new program or load one first" :error
+            editmode = false
+            return
+        end
+        model = getmodel(bonito_session_id)
         model.editmode[] = editmode
         editmode_disable = !editmode
         if editmode && first_time_in_editmode && heatmap_view
@@ -240,24 +270,20 @@ const bonito_app = NamedApp(:inherit, Backbone.app)
         @notify "Toggle the \"edit mode\" off to browse the sequence with the heatmap" :info
     end
 
-    @onchange setvalue begin
-        model = getmodel(back_session_id)
-        model.setvalue[] = setvalue
-    end
-
     @onbutton export_sequence_click begin
-        filepath = exportsequence(back_session_id)
+        filepath = exportsequence(bonito_session_id; appname=bonito_app.name)
         if isempty(filepath)
             @notify "No available motor programs; create one first" :error
         else
             filename = basename(filepath)
-            mkpath("./public/$back_session_id")
-            open("./public/$back_session_id/$filename", "w") do o
+            appname = bonito_app.name
+            mkpath("./public/$bonito_session_id/$appname")
+            open("./public/$bonito_session_id/$appname/$filename", "w") do o
                 open(filepath, "r") do i
                     write(o, read(i))
                 end
             end
-            export_sequence_link = "/$back_session_id/$filename"
+            export_sequence_link = "/$bonito_session_id/$appname/$filename"
         end
     end
 
@@ -277,7 +303,7 @@ const bonito_app = NamedApp(:inherit, Backbone.app)
         if !isempty(fileuploads)
             file = fileuploads["path"]
             try
-                sequence = loadsequence(back_session_id, file)
+                sequence = loadsequence(bonito_session_id, file)
                 if !(sequence.program_name in sequence_names)
                     push!(sequence_names, sequence.program_name)
                 end
@@ -298,13 +324,13 @@ const bonito_app = NamedApp(:inherit, Backbone.app)
         @notify  "Selection copied! Press Ctrl while clicking to paste" :info
     end
     @onchange area_selected begin
-        @notify "Click inside the selected area to assign the setvalue, or press Ctrl while clicking to copy the selection" :info
+        @notify "Click inside the selected area to assign a value, or press Ctrl while clicking to copy the selection" :info
     end
 
     @onbutton delete_sequence_click begin
         isempty(selected_sequence_name) && return
         # update the model
-        deletesequence(back_session_id)
+        deletesequence(bonito_session_id)
         popat!(sequence_names, selected_sequence_index)
         if length(sequence_names) < selected_sequence_index
             selected_sequence_index[!] -= 1
@@ -313,7 +339,7 @@ const bonito_app = NamedApp(:inherit, Backbone.app)
             n = round(Int, series_length)
             stop_time = start_time + (n-1) * time_interval
             time_support = start_time:time_interval:stop_time
-            model = getmodel(back_session_id)
+            model = getmodel(bonito_session_id)
             muscles = model.overview
             sequence = MuscleActivity("", time_support, muscles)
             # update the view
@@ -331,6 +357,12 @@ const bonito_app = NamedApp(:inherit, Backbone.app)
         # update the view
         notify(sequence_names)
     end
+
+    @onchange no_sequences_yet begin
+        if no_sequences_yet && editmode
+            editmode = false
+        end
+    end
 end
 
 function dropdown(key, options, label; margin=true, class=nothing)
@@ -366,8 +398,6 @@ function muscle_view(bonito_url=""; channel=":channel")
         Html.div(class="edit-panel", style=col, [
             toggle("Toggle edit mode", :editmode, color="blue"),
             textfield("Motor program name", :sequence_name, disable=:editmode_disable),
-            textfield("Set value", :setvalue, type="number", step="any",
-                      disable=:editmode_disable),
             textfield("Number of time steps", :series_length, type="number", step="1",
                       disable=:editmode_disable),
             textfield("Time interval", :time_interval, type="number", step="any",
@@ -379,6 +409,12 @@ function muscle_view(bonito_url=""; channel=":channel")
                  disable=:no_sequences_yet)),
     ])
 
+    footer = Html.div([
+        Html.span("Reset session", @click(:reset_bonito_session), style="cursor:pointer;",
+                  [tooltip("Useful when the app crashes. All data will be lost!")]),
+        Html.span(appinfo()),
+    ]; id="footer", style="width:1354.617px;")
+
     Html.div(style=col, [
         topbar,
         Html.div(style=row, [
@@ -389,6 +425,7 @@ function muscle_view(bonito_url=""; channel=":channel")
             ]),
             sidepanel,
         ]),
+        footer,
     ])
 end
 
@@ -420,7 +457,7 @@ function init_model(muscle_model=nothing)
         setmodel(session_id, muscle_model.sequence[!])
     end
     BonitoServer.addsession(bonito_app, session_id)
-    muscle_model.back_session_id[!] = session_id
+    muscle_model.bonito_session_id[!] = session_id
     url = bonito_url(bonito_app, session_id)
     return muscle_model, url
 end
diff --git a/src/apps/muscles/bonito.css b/src/apps/muscles/bonito.css
index 0feaf047580dcb279aa96fab0a9137f1febc2312..ca696314b5442f86ad184b63a4f0080ef30b64b6 100644
--- a/src/apps/muscles/bonito.css
+++ b/src/apps/muscles/bonito.css
@@ -1,4 +1,4 @@
-.nyx-animated-layers, .nyx-player select, .nyx-player span {
+.nyx-animated-layers, .nyx-player select, .nyx-player span, .nyx-segment-side-label-left, .nyx-segment-side-label-right {
   font-family: Open Sans;
 }
 
diff --git a/src/nyxui.css b/src/nyxui.css
index 12eb97966aee199dd1718486bdf93ff6be27dda1..6535400e12621ae7d486eb49e7e0f9ca006a1af0 100644
--- a/src/nyxui.css
+++ b/src/nyxui.css
@@ -54,3 +54,14 @@ footer {
   text-align: right;
   padding-right: 1rem;
 }
+
+#footer {
+  display: flex;
+  flex-direction: horizontal;
+  justify-content: space-between;
+  align-items: center;
+  height: 40px;
+  max-width: 100%;
+  padding: 0;
+  padding-left: 1rem;
+}