aboutsummaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorLUXEY Adrien <adrien.luxey@inria.fr>2021-04-30 10:21:15 +0200
committerLUXEY Adrien <adrien.luxey@inria.fr>2021-04-30 15:37:43 +0200
commitbe3b1d8f91b7e9a42dee9083ee0e9ebf52bbc57f (patch)
tree2581343ea7a97118064191ce06639e72d37bfa20 /doc
parentdcfc32cf85bc6276fdff2492898c1cbb527e9b9d (diff)
downloadgarage-talks.tar.gz
garage-talks.zip
created doc/talks subfolder and added my talk and the previous one done at the wide teamtalks
Diffstat (limited to 'doc')
-rw-r--r--doc/book/src/intro.md4
-rw-r--r--doc/talks/2020-12-02_wide-team/.gitignore (renamed from doc/20201202_talk/.gitignore)0
-rw-r--r--doc/talks/2020-12-02_wide-team/Makefile (renamed from doc/20201202_talk/Makefile)0
-rw-r--r--doc/talks/2020-12-02_wide-team/img/Amazon-S3.jpg (renamed from doc/20201202_talk/img/Amazon-S3.jpg)bin45617 -> 45617 bytes
-rw-r--r--doc/talks/2020-12-02_wide-team/img/cloud.png (renamed from doc/20201202_talk/img/cloud.png)bin19631 -> 19631 bytes
-rw-r--r--doc/talks/2020-12-02_wide-team/img/consistent_hashing_1.svg (renamed from doc/20201202_talk/img/consistent_hashing_1.svg)0
-rw-r--r--doc/talks/2020-12-02_wide-team/img/consistent_hashing_2.svg (renamed from doc/20201202_talk/img/consistent_hashing_2.svg)0
-rw-r--r--doc/talks/2020-12-02_wide-team/img/consistent_hashing_3.svg (renamed from doc/20201202_talk/img/consistent_hashing_3.svg)0
-rw-r--r--doc/talks/2020-12-02_wide-team/img/consistent_hashing_4.svg (renamed from doc/20201202_talk/img/consistent_hashing_4.svg)0
-rw-r--r--doc/talks/2020-12-02_wide-team/img/dc.jpg (renamed from doc/20201202_talk/img/dc.jpg)bin368854 -> 368854 bytes
-rw-r--r--doc/talks/2020-12-02_wide-team/img/death.jpg (renamed from doc/20201202_talk/img/death.jpg)bin40176 -> 40176 bytes
-rw-r--r--doc/talks/2020-12-02_wide-team/img/garage_distributed.svg (renamed from doc/20201202_talk/img/garage_distributed.svg)0
-rw-r--r--doc/talks/2020-12-02_wide-team/img/garage_tables.svg (renamed from doc/20201202_talk/img/garage_tables.svg)0
-rw-r--r--doc/talks/2020-12-02_wide-team/img/rustacean-flat-happy.png (renamed from doc/20201202_talk/img/rustacean-flat-happy.png)bin33061 -> 33061 bytes
-rw-r--r--doc/talks/2020-12-02_wide-team/img/shh.jpg (renamed from doc/20201202_talk/img/shh.jpg)bin87684 -> 87684 bytes
-rw-r--r--doc/talks/2020-12-02_wide-team/img/sync.png (renamed from doc/20201202_talk/img/sync.png)bin6283 -> 6283 bytes
-rw-r--r--doc/talks/2020-12-02_wide-team/talk.pdf (renamed from doc/20201202_talk/talk.pdf)bin815667 -> 815667 bytes
-rw-r--r--doc/talks/2020-12-02_wide-team/talk.tex (renamed from doc/20201202_talk/talk.tex)0
-rw-r--r--doc/talks/2021-04-28_spirals-team/.gitignore10
-rw-r--r--doc/talks/2021-04-28_spirals-team/Makefile33
-rw-r--r--doc/talks/2021-04-28_spirals-team/README.md1
-rw-r--r--doc/talks/2021-04-28_spirals-team/bibliography.bib27
-rw-r--r--doc/talks/2021-04-28_spirals-team/conclusion.tex7
-rw-r--r--doc/talks/2021-04-28_spirals-team/escaping_the_cloud.tex124
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/c1.pdfbin0 -> 30105 bytes
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/c2.pdfbin0 -> 30238 bytes
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/c3.pdfbin0 -> 30362 bytes
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/c4.pdfbin0 -> 30663 bytes
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/conflict_acid.pdfbin0 -> 13207 bytes
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/conflict_base.pdfbin0 -> 26396 bytes
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/conflict_crdt.pdfbin0 -> 25331 bytes
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/conflict_problem.pdfbin0 -> 13145 bytes
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/dag_crdt.pngbin0 -> 150909 bytes
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/garage_distributed.pngbin0 -> 34956 bytes
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/garage_tables.pdfbin0 -> 25375 bytes
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/m_proxy_gray.pdfbin0 -> 11898 bytes
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/minio_edge.pngbin0 -> 106219 bytes
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/rustacean-flat-happy.pngbin0 -> 33061 bytes
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/svg/conflict.svg930
-rw-r--r--doc/talks/2021-04-28_spirals-team/figures/svg/crdt.svg227
-rw-r--r--doc/talks/2021-04-28_spirals-team/garage.tex147
-rw-r--r--doc/talks/2021-04-28_spirals-team/header.tex134
-rw-r--r--doc/talks/2021-04-28_spirals-team/introduction.tex99
-rw-r--r--doc/talks/2021-04-28_spirals-team/main.tex70
-rw-r--r--doc/talks/2021-04-28_spirals-team/sota.tex323
-rw-r--r--doc/talks/2021-04-28_spirals-team/talk.pdfbin0 -> 976942 bytes
46 files changed, 2135 insertions, 1 deletions
diff --git a/doc/book/src/intro.md b/doc/book/src/intro.md
index 3440aef3..352f1be1 100644
--- a/doc/book/src/intro.md
+++ b/doc/book/src/intro.md
@@ -89,7 +89,9 @@ If you encounter a specific bug in Garage or plan to patch it, you may jump dire
We love to talk and hear about Garage, that's why we keep a log here:
- - [(fr, 2020-12-02) Garage : jouer dans la cour des grands quand on est un hébergeur associatif](https://git.deuxfleurs.fr/Deuxfleurs/garage/src/branch/main/doc/20201202_talk/talk.pdf)
+ - [(en, 2021-04-28) Distributed object storage is centralised](https://git.deuxfleurs.fr/Deuxfleurs/garage/raw/branch/talks/doc/main/2021-04-28_spirals-team/talk.pdf)
+
+ - [(fr, 2020-12-02) Garage : jouer dans la cour des grands quand on est un hébergeur associatif](https://git.deuxfleurs.fr/Deuxfleurs/garage/raw/branch/main/doc/talks/2020-12-02_wide-team/talk.pdf)
*Did you write or talk about Garage? [Open a pull request](https://git.deuxfleurs.fr/Deuxfleurs/garage/) to add a link here!*
diff --git a/doc/20201202_talk/.gitignore b/doc/talks/2020-12-02_wide-team/.gitignore
index a5e8d18b..a5e8d18b 100644
--- a/doc/20201202_talk/.gitignore
+++ b/doc/talks/2020-12-02_wide-team/.gitignore
diff --git a/doc/20201202_talk/Makefile b/doc/talks/2020-12-02_wide-team/Makefile
index 27dbf788..27dbf788 100644
--- a/doc/20201202_talk/Makefile
+++ b/doc/talks/2020-12-02_wide-team/Makefile
diff --git a/doc/20201202_talk/img/Amazon-S3.jpg b/doc/talks/2020-12-02_wide-team/img/Amazon-S3.jpg
index a9501973..a9501973 100644
--- a/doc/20201202_talk/img/Amazon-S3.jpg
+++ b/doc/talks/2020-12-02_wide-team/img/Amazon-S3.jpg
Binary files differ
diff --git a/doc/20201202_talk/img/cloud.png b/doc/talks/2020-12-02_wide-team/img/cloud.png
index d95b2ae3..d95b2ae3 100644
--- a/doc/20201202_talk/img/cloud.png
+++ b/doc/talks/2020-12-02_wide-team/img/cloud.png
Binary files differ
diff --git a/doc/20201202_talk/img/consistent_hashing_1.svg b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_1.svg
index f8d24fd8..f8d24fd8 100644
--- a/doc/20201202_talk/img/consistent_hashing_1.svg
+++ b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_1.svg
diff --git a/doc/20201202_talk/img/consistent_hashing_2.svg b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_2.svg
index 5ac8faf6..5ac8faf6 100644
--- a/doc/20201202_talk/img/consistent_hashing_2.svg
+++ b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_2.svg
diff --git a/doc/20201202_talk/img/consistent_hashing_3.svg b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_3.svg
index fdfd3efc..fdfd3efc 100644
--- a/doc/20201202_talk/img/consistent_hashing_3.svg
+++ b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_3.svg
diff --git a/doc/20201202_talk/img/consistent_hashing_4.svg b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_4.svg
index 95ed0e02..95ed0e02 100644
--- a/doc/20201202_talk/img/consistent_hashing_4.svg
+++ b/doc/talks/2020-12-02_wide-team/img/consistent_hashing_4.svg
diff --git a/doc/20201202_talk/img/dc.jpg b/doc/talks/2020-12-02_wide-team/img/dc.jpg
index 52cb1e70..52cb1e70 100644
--- a/doc/20201202_talk/img/dc.jpg
+++ b/doc/talks/2020-12-02_wide-team/img/dc.jpg
Binary files differ
diff --git a/doc/20201202_talk/img/death.jpg b/doc/talks/2020-12-02_wide-team/img/death.jpg
index 2ffa9180..2ffa9180 100644
--- a/doc/20201202_talk/img/death.jpg
+++ b/doc/talks/2020-12-02_wide-team/img/death.jpg
Binary files differ
diff --git a/doc/20201202_talk/img/garage_distributed.svg b/doc/talks/2020-12-02_wide-team/img/garage_distributed.svg
index 2db03626..2db03626 100644
--- a/doc/20201202_talk/img/garage_distributed.svg
+++ b/doc/talks/2020-12-02_wide-team/img/garage_distributed.svg
diff --git a/doc/20201202_talk/img/garage_tables.svg b/doc/talks/2020-12-02_wide-team/img/garage_tables.svg
index fc3d8fc5..fc3d8fc5 100644
--- a/doc/20201202_talk/img/garage_tables.svg
+++ b/doc/talks/2020-12-02_wide-team/img/garage_tables.svg
diff --git a/doc/20201202_talk/img/rustacean-flat-happy.png b/doc/talks/2020-12-02_wide-team/img/rustacean-flat-happy.png
index ebce1a14..ebce1a14 100644
--- a/doc/20201202_talk/img/rustacean-flat-happy.png
+++ b/doc/talks/2020-12-02_wide-team/img/rustacean-flat-happy.png
Binary files differ
diff --git a/doc/20201202_talk/img/shh.jpg b/doc/talks/2020-12-02_wide-team/img/shh.jpg
index ad4689ce..ad4689ce 100644
--- a/doc/20201202_talk/img/shh.jpg
+++ b/doc/talks/2020-12-02_wide-team/img/shh.jpg
Binary files differ
diff --git a/doc/20201202_talk/img/sync.png b/doc/talks/2020-12-02_wide-team/img/sync.png
index d0404996..d0404996 100644
--- a/doc/20201202_talk/img/sync.png
+++ b/doc/talks/2020-12-02_wide-team/img/sync.png
Binary files differ
diff --git a/doc/20201202_talk/talk.pdf b/doc/talks/2020-12-02_wide-team/talk.pdf
index b27eca29..b27eca29 100644
--- a/doc/20201202_talk/talk.pdf
+++ b/doc/talks/2020-12-02_wide-team/talk.pdf
Binary files differ
diff --git a/doc/20201202_talk/talk.tex b/doc/talks/2020-12-02_wide-team/talk.tex
index 1acda842..1acda842 100644
--- a/doc/20201202_talk/talk.tex
+++ b/doc/talks/2020-12-02_wide-team/talk.tex
diff --git a/doc/talks/2021-04-28_spirals-team/.gitignore b/doc/talks/2021-04-28_spirals-team/.gitignore
new file mode 100644
index 00000000..450d4638
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/.gitignore
@@ -0,0 +1,10 @@
+*.bbl
+*.aux
+*.bcf
+*.blg
+*.log
+*.run.xml
+*.synctex.gz
+build/
+main.pdf
+figures/crdt.pdf
diff --git a/doc/talks/2021-04-28_spirals-team/Makefile b/doc/talks/2021-04-28_spirals-team/Makefile
new file mode 100644
index 00000000..1db0c37a
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/Makefile
@@ -0,0 +1,33 @@
+.PHONY: all viewpdf pdf clean
+
+TARGET = main
+SOURCE_FILES = $(shell find . -type f -name "*.tex" -print)
+CLASS_FILES = $(shell find . -type f -name "*.cls" -print)
+BIB_FILES = $(shell find . -type f -name "*.bib" -print)
+FIGURES = $(shell find . -path "./figures/*" -type f -print)
+BUILD_PATH = build
+BUILD_FILES = $(shell find $(BUILD_PATH) -type f -print)
+
+BIB_PROCESSOR := biber
+
+.PHONY: all pdf clean figures
+
+all: pdf
+
+pdf: $(TARGET).pdf
+
+clean:
+ @rm $(TARGET).pdf $(BUILD_FILES) > /dev/null 2>&1 || exit 0
+
+figures: figures/crdt.pdf
+
+$(TARGET).pdf: figures $(FIGURES) $(SOURCE_FILES) $(BIB_FILES) $(CLASS_FILES)
+ @mkdir -p $(BUILD_PATH) > /dev/null 2>&1 || exit 0
+ @pdflatex -interaction=nonstopmode -jobname=$(TARGET) -output-directory $(BUILD_PATH) $(TARGET).tex
+ @$(BIB_PROCESSOR) --output-directory $(BUILD_PATH) $(TARGET)
+ @pdflatex -interaction=nonstopmode -jobname=$(TARGET) -output-directory $(BUILD_PATH) $(TARGET).tex # For biber
+ @pdflatex -interaction=nonstopmode -jobname=$(TARGET) -output-directory $(BUILD_PATH) $(TARGET).tex # For biber
+ @ln -fs $(BUILD_PATH)/$(TARGET).pdf $(TARGET).pdf
+
+figures/crdt.pdf: figures/svg/crdt.svg
+ @inkscape -C --file=$< --export-pdf=$@ \ No newline at end of file
diff --git a/doc/talks/2021-04-28_spirals-team/README.md b/doc/talks/2021-04-28_spirals-team/README.md
new file mode 100644
index 00000000..9fb940c4
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/README.md
@@ -0,0 +1 @@
+Presentation of Garage by Adrien on April, 28th 2021, for his research team [Spirals](https://team.inria.fr/spirals/). \ No newline at end of file
diff --git a/doc/talks/2021-04-28_spirals-team/bibliography.bib b/doc/talks/2021-04-28_spirals-team/bibliography.bib
new file mode 100644
index 00000000..d145d2c3
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/bibliography.bib
@@ -0,0 +1,27 @@
+
+@inproceedings{brewer_towards_2000,
+ title = {Towards {{Robust Distributed Systems}}},
+ booktitle = {{{ACM PODC}}},
+ author = {Brewer, Eric},
+ year = {2000}
+}
+
+
+
+@incollection{defago_conflict-free_2011,
+ title = {Conflict-{{Free Replicated Data Types}}},
+ booktitle = {Stabilization, {{Safety}}, and {{Security}} of {{Distributed Systems}}},
+ author = {Shapiro, Marc and Pregui{\c c}a, Nuno and Baquero, Carlos and Zawirski, Marek},
+ year = {2011},
+ address = {{Berlin, Heidelberg}},
+}
+
+
+@inproceedings{decandia_dynamo:_2007,
+ title = {Dynamo: {{Amazon}}'s {{Highly Available Key}}-Value {{Store}}},
+ booktitle = {{ACM SOSP}},
+ author = {DeCandia, Giuseppe and Hastorun, Deniz and Jampani, Madan and Kakulapati, Gunavardhan and Lakshman, Avinash and Pilchin, Alex and Sivasubramanian, Swaminathan and Vosshall, Peter and Vogels, Werner},
+ year = {2007},
+ address = {{New York, USA}},
+}
+
diff --git a/doc/talks/2021-04-28_spirals-team/conclusion.tex b/doc/talks/2021-04-28_spirals-team/conclusion.tex
new file mode 100644
index 00000000..ddbcf0b4
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/conclusion.tex
@@ -0,0 +1,7 @@
+\section{Conclusion}
+
+\begin{frame}{The future is cooler when we bend it our way}
+
+Contributions welcome! :D
+
+\end{frame} \ No newline at end of file
diff --git a/doc/talks/2021-04-28_spirals-team/escaping_the_cloud.tex b/doc/talks/2021-04-28_spirals-team/escaping_the_cloud.tex
new file mode 100644
index 00000000..9f1f13ba
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/escaping_the_cloud.tex
@@ -0,0 +1,124 @@
+\section{Escaping the cloud}
+
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \begin{frame}{Down to Earth with home-hosting}
+
+
+% \todo{Stanley Parabole reference?}
+
+% \end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{Why?}
+
+\begin{itemize}
+ \item \textbf{Privacy}: no prying eyes besides your ISP
+ \item \textbf{Control} of your infrastructure
+ \item \textbf{Ecology}: reuse old hardware
+\end{itemize}
+
+\vfill
+\begin{block}{\emph{Tim Berners-Lee} (1994)}
+``Now, if someone tries to monopolize the Web, for example pushes proprietary variations on network protocols, then that would make me unhappy.''
+\end{block}
+
+\begin{itemize}
+ \item Make Tim Berners-Lee happy
+\end{itemize}
+
+\end{frame}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{What?}
+
+\centering\Large
+A data store for commodity hardware on heterogenous household connections.
+
+
+\vfill\raggedright\normalsize
+
+
+\begin{block}{Targetting user-facing services}
+\begin{itemize}
+ \item Static sites
+ \item E-mails
+ \item Instant communication
+ %\item Video streaming % No need for a data store
+ \item Collaboration
+\end{itemize}
+\end{block}
+\vfill
+
+Nothing fancy like sensors data streams, AI or IoT.
+
+\end{frame}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{What?}
+
+
+\begin{block}{Requirements}
+\begin{itemize}
+ \item \textbf{No single point of failure} / flat hierarchy:
+
+ Any node can die for extended periods of time.
+ \item \textbf{Multi-site}: cluster spans regions/countries.
+ \item \textbf{Acceptable performance}.
+ \item \textbf{Lightweight}: targets legacy hardware.
+ \item \textbf{Conceptually simple}: built for low-tech organisations.
+
+ Adding/maintaining cluster nodes should be easy.
+\end{itemize}
+\end{block}
+\vfill
+
+\begin{block}{Non-goals}
+\begin{itemize}
+ \item \textbf{Super badass performance}.
+ \item \textbf{NAT traversal} etc.: we require full-mesh connectivity.
+\end{itemize}
+\end{block}
+\end{frame}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{How?}
+
+\begin{itemize}
+ \item Theoretically possible with object storage \& CRDTs.
+ \vfill
+ \item Household uplinks are getting decent (optical fibers).
+\end{itemize}
+
+
+
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{Research Questions}
+
+\begin{itemize}
+ \item Decent performance despite bad inter-node connectivity.
+ \vfill
+
+ \item Tailoring workloads as a function of nodes' capabilities:
+
+ \begin{itemize}
+ \item Make use of low-end nodes (e.g. Raspberry Pis),
+ \item Avoid impeding global performance because of low-end nodes.
+ \end{itemize}
+ \vfill
+
+ \item Building CRDTs for target use-cases:
+
+ \begin{itemize}
+ \item Software engineering: DSL or native code?
+ \item Provide APIs to data store users? Risky?
+ \end{itemize}
+ \vfill
+
+ \item Cluster management: effortless UX, low perf. overhead.
+\end{itemize}
+\end{frame} \ No newline at end of file
diff --git a/doc/talks/2021-04-28_spirals-team/figures/c1.pdf b/doc/talks/2021-04-28_spirals-team/figures/c1.pdf
new file mode 100644
index 00000000..4568b702
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/c1.pdf
Binary files differ
diff --git a/doc/talks/2021-04-28_spirals-team/figures/c2.pdf b/doc/talks/2021-04-28_spirals-team/figures/c2.pdf
new file mode 100644
index 00000000..63be7d3c
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/c2.pdf
Binary files differ
diff --git a/doc/talks/2021-04-28_spirals-team/figures/c3.pdf b/doc/talks/2021-04-28_spirals-team/figures/c3.pdf
new file mode 100644
index 00000000..514e66f4
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/c3.pdf
Binary files differ
diff --git a/doc/talks/2021-04-28_spirals-team/figures/c4.pdf b/doc/talks/2021-04-28_spirals-team/figures/c4.pdf
new file mode 100644
index 00000000..348e900e
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/c4.pdf
Binary files differ
diff --git a/doc/talks/2021-04-28_spirals-team/figures/conflict_acid.pdf b/doc/talks/2021-04-28_spirals-team/figures/conflict_acid.pdf
new file mode 100644
index 00000000..4175e14a
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/conflict_acid.pdf
Binary files differ
diff --git a/doc/talks/2021-04-28_spirals-team/figures/conflict_base.pdf b/doc/talks/2021-04-28_spirals-team/figures/conflict_base.pdf
new file mode 100644
index 00000000..95fe0544
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/conflict_base.pdf
Binary files differ
diff --git a/doc/talks/2021-04-28_spirals-team/figures/conflict_crdt.pdf b/doc/talks/2021-04-28_spirals-team/figures/conflict_crdt.pdf
new file mode 100644
index 00000000..bf4354ce
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/conflict_crdt.pdf
Binary files differ
diff --git a/doc/talks/2021-04-28_spirals-team/figures/conflict_problem.pdf b/doc/talks/2021-04-28_spirals-team/figures/conflict_problem.pdf
new file mode 100644
index 00000000..b07ad3b4
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/conflict_problem.pdf
Binary files differ
diff --git a/doc/talks/2021-04-28_spirals-team/figures/dag_crdt.png b/doc/talks/2021-04-28_spirals-team/figures/dag_crdt.png
new file mode 100644
index 00000000..f7abe7fd
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/dag_crdt.png
Binary files differ
diff --git a/doc/talks/2021-04-28_spirals-team/figures/garage_distributed.png b/doc/talks/2021-04-28_spirals-team/figures/garage_distributed.png
new file mode 100644
index 00000000..da658f3b
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/garage_distributed.png
Binary files differ
diff --git a/doc/talks/2021-04-28_spirals-team/figures/garage_tables.pdf b/doc/talks/2021-04-28_spirals-team/figures/garage_tables.pdf
new file mode 100644
index 00000000..a7dd13b3
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/garage_tables.pdf
Binary files differ
diff --git a/doc/talks/2021-04-28_spirals-team/figures/m_proxy_gray.pdf b/doc/talks/2021-04-28_spirals-team/figures/m_proxy_gray.pdf
new file mode 100644
index 00000000..fc96e3ab
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/m_proxy_gray.pdf
Binary files differ
diff --git a/doc/talks/2021-04-28_spirals-team/figures/minio_edge.png b/doc/talks/2021-04-28_spirals-team/figures/minio_edge.png
new file mode 100644
index 00000000..0efce4b7
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/minio_edge.png
Binary files differ
diff --git a/doc/talks/2021-04-28_spirals-team/figures/rustacean-flat-happy.png b/doc/talks/2021-04-28_spirals-team/figures/rustacean-flat-happy.png
new file mode 100644
index 00000000..ebce1a14
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/rustacean-flat-happy.png
Binary files differ
diff --git a/doc/talks/2021-04-28_spirals-team/figures/svg/conflict.svg b/doc/talks/2021-04-28_spirals-team/figures/svg/conflict.svg
new file mode 100644
index 00000000..1c39af9f
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/svg/conflict.svg
@@ -0,0 +1,930 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="119.30722mm"
+ height="121.49291mm"
+ viewBox="0 0 119.30722 121.49291"
+ version="1.1"
+ id="svg8"
+ inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
+ sodipodi:docname="conflict.svg">
+ <defs
+ id="defs2">
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker2999"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2997"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker2964"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2962"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1467"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ inkscape:connector-curvature="0"
+ id="path1465"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker1449"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path1447" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker12071"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend"
+ inkscape:collect="always">
+ <path
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path12069"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker9668"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend"
+ inkscape:collect="always">
+ <path
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path9666"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6943"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path6941"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker5445"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend">
+ <path
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ id="path5443"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1115"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path861"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path826"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path820"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker1101"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path1099"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path817"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4"
+ inkscape:cx="244.86596"
+ inkscape:cy="205.06317"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ inkscape:window-width="1920"
+ inkscape:window-height="1055"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:snap-global="false" />
+ <metadata
+ id="metadata5">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Common"
+ transform="translate(-43.663712,-16.067619)"
+ style="display:inline">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 99.856918,34.684511 h 4.913692"
+ id="path1257"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.79374999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
+ d="M 102.31376,23.208557 V 135.9963"
+ id="path815"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="90.524658"
+ y="19.57423"
+ id="text838"><tspan
+ sodipodi:role="line"
+ id="tspan836"
+ x="90.524658"
+ y="19.57423"
+ style="font-weight:bold;stroke-width:0.26458332px"># vaccines</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="46.748138"
+ y="19.57423"
+ id="text13775"><tspan
+ sodipodi:role="line"
+ id="tspan13773"
+ x="46.748138"
+ y="19.57423"
+ style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Iwona;-inkscape-font-specification:'Iwona Italic';stroke-width:0.26458332px">Paris</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="148.20457"
+ y="19.57423"
+ id="text13798"><tspan
+ sodipodi:role="line"
+ id="tspan13796"
+ x="148.20457"
+ y="19.57423"
+ style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Iwona;-inkscape-font-specification:'Iwona Italic';stroke-width:0.26458332px">Lille</tspan></text>
+ </g>
+ <g
+ inkscape:label="The problem"
+ inkscape:groupmode="layer"
+ id="layer1"
+ style="display:none"
+ transform="translate(-43.663712,-16.067619)">
+ <g
+ id="g13753"
+ transform="translate(0,12.170833)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path850"
+ d="M 97.820644,51.619712 75.828475,64.316897"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1115)" />
+ <text
+ y="-108.69946"
+ x="-183.00148"
+ transform="rotate(180,91.874093,54.229103)"
+ id="text7803"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><textPath
+ id="textPath7973"
+ xlink:href="#path850"><tspan
+ id="tspan7801"
+ style="font-weight:bold;stroke-width:0.26458332px">R</tspan></textPath></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9668)"
+ d="M 75.056888,72.78638 97.049057,85.483565"
+ id="path9498"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="translate(9.4212508,3.3408691)"
+ y="2.986012"
+ x="8.5186663"
+ id="text10668"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><textPath
+ id="textPath10836"
+ xlink:href="#path9498"><tspan
+ id="tspan10666"
+ style="font-weight:bold;stroke-width:0.26458332px">W</tspan></textPath></text>
+ </g>
+ <g
+ id="g13763"
+ transform="translate(0,12.170833)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12071)"
+ d="m 106.80689,51.619712 21.99218,12.697185"
+ id="path11899"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path11901"
+ d="M 129.57066,72.78638 107.57848,85.483565"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9668)" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text13737"
+ transform="rotate(-115.89278,108.31787,47.643413)"
+ x="-372.04132"
+ y="-217.15767"><textPath
+ xlink:href="#path850"
+ id="textPath13735"><tspan
+ style="font-weight:bold;stroke-width:0.26458332px"
+ id="tspan13733">R</tspan></textPath></text>
+ <text
+ transform="rotate(-58.856754,100.88692,38.870944)"
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text13743"
+ x="46.604572"
+ y="6.6609678"><textPath
+ xlink:href="#path9498"
+ id="textPath13741"><tspan
+ style="font-weight:bold;stroke-width:0.26458332px"
+ id="tspan13739">W</tspan></textPath></text>
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ id="path13768"
+ d="m 99.856918,112.89149 h 4.913692"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="43.564934"
+ y="53.51746"
+ id="text13802"><tspan
+ sodipodi:role="line"
+ id="tspan13800"
+ x="43.564934"
+ y="53.51746"
+ style="stroke-width:0.26458332px">We acquired 1000 doses!</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="49.979401"
+ y="82.649841"
+ id="text13806"><tspan
+ sodipodi:role="line"
+ id="tspan13804"
+ x="49.979401"
+ y="82.649841"
+ style="stroke-width:0.26458332px">x + 1000</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="136.842"
+ y="82.649841"
+ id="text13810"><tspan
+ sodipodi:role="line"
+ id="tspan13808"
+ x="136.842"
+ y="82.649841"
+ style="stroke-width:0.26458332px">x + 500</tspan></text>
+ <text
+ id="text13814"
+ y="53.51746"
+ x="112.88577"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332px"
+ y="53.51746"
+ x="112.88577"
+ id="tspan13812"
+ sodipodi:role="line">We acquired 500 doses!</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="108.70142"
+ y="114.62009"
+ id="text13818"><tspan
+ sodipodi:role="line"
+ id="tspan13816"
+ x="108.70142"
+ y="114.62009"
+ style="font-weight:bold;stroke-width:0.26458332px">???</tspan></text>
+ <text
+ id="text3109"
+ y="36.388439"
+ x="108.80019"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px"
+ y="36.388439"
+ x="108.80019"
+ id="tspan3107"
+ sodipodi:role="line">T0: 5000</tspan></text>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="ACID"
+ style="display:none">
+ <rect
+ ry="5.2916665"
+ y="67.923912"
+ x="61.174206"
+ height="39.498508"
+ width="54.42857"
+ id="rect14092"
+ style="opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:0.97409327;fill-rule:nonzero;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.91191711;paint-order:fill markers stroke" />
+ <rect
+ style="opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:0.97409327;fill-rule:nonzero;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.91191711;paint-order:fill markers stroke"
+ id="rect14090"
+ width="54.42857"
+ height="39.498508"
+ x="1.6973262"
+ y="21.886396"
+ ry="5.2916665" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path14037"
+ d="m 56.193207,64.654408 h 4.913692"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 56.193207,110.69192 h 4.913692"
+ id="path14040"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g14075"
+ transform="translate(0,-1.9988201)">
+ <g
+ id="g13993"
+ transform="translate(-43.663711,-25.06345)"
+ style="display:inline">
+ <path
+ inkscape:connector-curvature="0"
+ id="path13977"
+ d="M 97.820644,51.619712 75.828475,64.316897"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1115)" />
+ <text
+ y="-108.69946"
+ x="-183.00148"
+ transform="rotate(180,91.874093,54.229103)"
+ id="text13983"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><textPath
+ id="textPath13981"
+ xlink:href="#path850"><tspan
+ id="tspan13979"
+ style="font-weight:bold;stroke-width:0.26458332px">R</tspan></textPath></text>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9668)"
+ d="M 75.056888,72.78638 97.049057,85.483565"
+ id="path13985"
+ inkscape:connector-curvature="0" />
+ <text
+ transform="translate(9.4212508,3.3408691)"
+ y="2.986012"
+ x="8.5186663"
+ id="text13991"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><textPath
+ id="textPath13989"
+ xlink:href="#path9498"><tspan
+ id="tspan13987"
+ style="font-weight:bold;stroke-width:0.26458332px">W</tspan></textPath></text>
+ </g>
+ <text
+ id="text14044"
+ y="29.833508"
+ x="3.4844763"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332px"
+ y="29.833508"
+ x="3.4844763"
+ id="tspan14042"
+ sodipodi:role="line">AcqDoses(1000)</tspan></text>
+ </g>
+ <g
+ id="g14088"
+ transform="translate(0,-0.41130478)">
+ <g
+ id="g14011"
+ transform="translate(-43.663711,19.386549)"
+ style="display:inline">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12071)"
+ d="m 106.80689,51.619712 21.99218,12.697185"
+ id="path13995"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path13997"
+ d="M 129.57066,72.78638 107.57848,85.483565"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9668)" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text14003"
+ transform="rotate(-115.89278,108.31787,47.643413)"
+ x="-372.04132"
+ y="-217.15767"><textPath
+ xlink:href="#path850"
+ id="textPath14001"><tspan
+ style="font-weight:bold;stroke-width:0.26458332px"
+ id="tspan13999">R</tspan></textPath></text>
+ <text
+ transform="rotate(-58.856754,100.88692,38.870944)"
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text14009"
+ x="46.604572"
+ y="6.6609678"><textPath
+ xlink:href="#path9498"
+ id="textPath14007"><tspan
+ style="font-weight:bold;stroke-width:0.26458332px"
+ id="tspan14005">W</tspan></textPath></text>
+ </g>
+ <text
+ id="text14044-8"
+ y="74.283508"
+ x="82.76487"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332px"
+ y="74.283508"
+ x="82.76487"
+ id="tspan14042-8"
+ sodipodi:role="line">AcqDoses(500)</tspan></text>
+ </g>
+ <text
+ transform="translate(-43.663711,-16.067619)"
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="108.80019"
+ y="82.757004"
+ id="text832-6"><tspan
+ sodipodi:role="line"
+ id="tspan830-8"
+ x="108.80019"
+ y="82.757004"
+ style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px">T1: 6000</tspan></text>
+ <text
+ transform="translate(-43.663711,-16.067619)"
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="108.80019"
+ y="128.8701"
+ id="text832-3"><tspan
+ sodipodi:role="line"
+ id="tspan830-83"
+ x="108.80019"
+ y="128.8701"
+ style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px">T2: 6500</tspan></text>
+ <text
+ transform="translate(-43.663711,-16.067619)"
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="108.80019"
+ y="36.388439"
+ id="text3117"><tspan
+ sodipodi:role="line"
+ id="tspan3115"
+ x="108.80019"
+ y="36.388439"
+ style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px">T0: 5000</tspan></text>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="BASE"
+ style="display:none">
+ <g
+ id="g1463"
+ transform="translate(0,-21.166667)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1449)"
+ d="M 54.156933,47.722926 32.164764,60.420111"
+ id="path1369"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text1375"
+ transform="rotate(180,70.308075,52.117558)"
+ x="-279.42224"
+ y="-209.36409"><textPath
+ xlink:href="#path850"
+ id="textPath1373"><tspan
+ style="font-weight:bold;stroke-width:0.26458332px"
+ id="tspan1371">R</tspan></textPath></text>
+ </g>
+ <g
+ id="g1481"
+ transform="translate(0,-21.166667)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path1377"
+ d="M 31.393177,68.889594 53.385346,81.586779"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1467)" />
+ <text
+ transform="translate(-34.395836)"
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text1383"
+ x="17.939917"
+ y="6.3268809"><textPath
+ xlink:href="#path9498"
+ id="textPath1381"><tspan
+ style="font-weight:bold;stroke-width:0.26458332px"
+ id="tspan1379">W</tspan></textPath></text>
+ </g>
+ <g
+ style="display:inline"
+ transform="translate(-43.663711,-25.063453)"
+ id="g1403">
+ <path
+ inkscape:connector-curvature="0"
+ id="path1387"
+ d="m 106.80689,51.619712 21.99218,12.697185"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker12071)" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9668)"
+ d="M 129.57066,72.78638 107.57848,85.483565"
+ id="path1389"
+ inkscape:connector-curvature="0" />
+ <text
+ y="-217.15767"
+ x="-372.04132"
+ transform="rotate(-115.89278,108.31787,47.643413)"
+ id="text1395"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><textPath
+ id="textPath1393"
+ xlink:href="#path850"><tspan
+ id="tspan1391"
+ style="font-weight:bold;stroke-width:0.26458332px">R</tspan></textPath></text>
+ <text
+ y="6.6609678"
+ x="46.604572"
+ id="text1401"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"
+ transform="rotate(-58.856754,100.88692,38.870944)"><textPath
+ id="textPath1399"
+ xlink:href="#path9498"><tspan
+ id="tspan1397"
+ style="font-weight:bold;stroke-width:0.26458332px">W</tspan></textPath></text>
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ id="path1503"
+ d="m 56.193207,73.650233 h 4.913692"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ id="text1507"
+ y="75.354156"
+ x="64.607315"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px"
+ y="75.354156"
+ x="64.607315"
+ id="tspan1505"
+ sodipodi:role="line">T1: [(T0, 6000),(T0, 5500)]</tspan></text>
+ <g
+ id="g1530"
+ transform="translate(0,38.100002)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path1522"
+ d="M 54.156933,47.722926 32.164764,60.420111"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1449)" />
+ <text
+ y="-209.36409"
+ x="-279.42224"
+ transform="rotate(180,70.308075,52.117558)"
+ id="text1528"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><textPath
+ id="textPath1526"
+ xlink:href="#path850"><tspan
+ id="tspan1524"
+ style="font-weight:bold;stroke-width:0.26458332px">R</tspan></textPath></text>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="8.5044641"
+ y="109.58665"
+ id="text1534"><tspan
+ sodipodi:role="line"
+ id="tspan1532"
+ x="8.5044641"
+ y="109.58665"
+ style="font-weight:normal;stroke-width:0.26458332px">Now solve this!</tspan><tspan
+ sodipodi:role="line"
+ x="8.5044641"
+ y="115.76025"
+ style="font-weight:normal;stroke-width:0.26458332px"
+ id="tspan3159">And write back!</tspan></text>
+ <text
+ id="text1538"
+ y="44.886383"
+ x="6.3156896"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332px"
+ y="44.886383"
+ x="6.3156896"
+ id="tspan1536"
+ sodipodi:role="line">x + 1000</tspan></text>
+ <text
+ id="text1542"
+ y="44.886383"
+ x="93.178284"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="stroke-width:0.26458332px"
+ y="44.886383"
+ x="93.178284"
+ id="tspan1540"
+ sodipodi:role="line">x + 500</tspan></text>
+ <text
+ transform="translate(-43.663711,-16.067619)"
+ id="text3103"
+ y="36.388439"
+ x="108.80019"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px"
+ y="36.388439"
+ x="108.80019"
+ id="tspan3101"
+ sodipodi:role="line">T0: (⊥, 5000)</tspan></text>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="CRDT"
+ style="display:inline">
+ <g
+ style="display:inline"
+ transform="translate(0,-21.166667)"
+ id="g2920">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1467)"
+ d="M 31.393177,68.889594 53.385346,81.586779"
+ id="path2912"
+ inkscape:connector-curvature="0" />
+ <text
+ y="6.3268809"
+ x="17.939917"
+ id="text2918"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"
+ transform="translate(-34.395836)"><textPath
+ id="textPath2916"
+ xlink:href="#path9498"><tspan
+ id="tspan2914"
+ style="font-weight:bold;stroke-width:0.26458332px">W</tspan></textPath></text>
+ </g>
+ <g
+ id="g3013">
+ <path
+ inkscape:connector-curvature="0"
+ id="path2924"
+ d="M 85.906949,47.722927 63.914769,60.420112"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker2999)" />
+ <text
+ transform="rotate(-58.856754,57.228059,65.935492)"
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text2936"
+ x="7.1585193"
+ y="48.970455"><textPath
+ xlink:href="#path9498"
+ id="textPath2934"><tspan
+ style="font-weight:bold;stroke-width:0.26458332px"
+ id="tspan2932">W</tspan></textPath></text>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="15.648211"
+ y="44.007793"
+ id="text2976"><tspan
+ sodipodi:role="line"
+ id="tspan2974"
+ x="15.648211"
+ y="44.007793"
+ style="font-weight:normal;stroke-width:0.26458332px">incr(1000)</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="82.927979"
+ y="44.007793"
+ id="text2980"><tspan
+ sodipodi:role="line"
+ id="tspan2978"
+ x="82.927979"
+ y="44.007793"
+ style="font-weight:normal;stroke-width:0.26458332px">incr(500)</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ id="path2982"
+ d="m 56.193207,72.591896 h 4.913692"
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <text
+ id="text2986"
+ y="74.295815"
+ x="65.136482"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px"
+ y="74.295815"
+ x="65.136482"
+ sodipodi:role="line"
+ id="tspan2995">T1: (5000, </tspan><tspan
+ style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px"
+ y="79.777985"
+ x="65.136482"
+ sodipodi:role="line"
+ id="tspan1204"> {(a, 1000), (b, 500)})</tspan></text>
+ <g
+ style="display:inline"
+ transform="translate(0,38.100003)"
+ id="g3042">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.52969581;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1449)"
+ d="M 54.156933,47.722926 32.164764,60.420111"
+ id="path3034"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text3040"
+ transform="rotate(180,70.308075,52.117558)"
+ x="-279.42224"
+ y="-209.36409"><textPath
+ xlink:href="#path850"
+ id="textPath3038"><tspan
+ style="font-weight:bold;stroke-width:0.26458332px"
+ id="tspan3036">R</tspan></textPath></text>
+ </g>
+ <text
+ id="text3051"
+ y="102.21611"
+ x="17.764879"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-weight:normal;stroke-width:0.26458332px"
+ y="102.21611"
+ x="17.764879"
+ id="tspan3049"
+ sodipodi:role="line">6500</tspan></text>
+ <text
+ transform="translate(-43.663711,-16.067619)"
+ id="text3097"
+ y="36.388439"
+ x="108.80019"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333311px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-weight:normal;font-size:4.93888903px;stroke-width:0.26458332px"
+ y="36.388439"
+ x="108.80019"
+ id="tspan3095"
+ sodipodi:role="line">T0: (5000, ∅)</tspan></text>
+ </g>
+</svg>
diff --git a/doc/talks/2021-04-28_spirals-team/figures/svg/crdt.svg b/doc/talks/2021-04-28_spirals-team/figures/svg/crdt.svg
new file mode 100644
index 00000000..6104116b
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/figures/svg/crdt.svg
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="82.010674mm"
+ height="17.561125mm"
+ viewBox="0 0 82.010674 17.561125"
+ version="1.1"
+ id="svg1579"
+ inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
+ sodipodi:docname="crdt.svg">
+ <defs
+ id="defs1573">
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker2645"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mend">
+ <path
+ transform="scale(-0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path2643"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="marker2605"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Mstart">
+ <path
+ transform="scale(0.6)"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ id="path2603"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mend"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path2206"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mstart"
+ style="overflow:visible"
+ inkscape:isstock="true"
+ inkscape:collect="always">
+ <path
+ id="path2203"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(0.6)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path2197"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(1.1,0,0,1.1,1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Sstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Sstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path2191"
+ d="M 0,0 5,-5 -12.5,0 5,5 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
+ transform="matrix(0.2,0,0,0.2,1.2,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.8"
+ inkscape:cx="148.82928"
+ inkscape:cy="-32.722297"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:snap-bbox="true"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1920"
+ inkscape:window-height="1055"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata1576">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-21.438257,-19.857903)">
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow2Mstart);marker-end:url(#Arrow2Mend)"
+ d="M 44.979166,28.87314 H 58.822544"
+ id="path2177"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g2153">
+ <rect
+ rx="0"
+ ry="3.8793426"
+ y="19.990194"
+ x="21.570549"
+ height="17.296541"
+ width="23.537758"
+ id="rect2124"
+ style="opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:0.97409327;fill-rule:nonzero;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.91191711;paint-order:fill markers stroke" />
+ <text
+ id="text2132"
+ y="29.799105"
+ x="29.366098"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-weight:normal;stroke-width:0.26458332px"
+ y="29.799105"
+ x="29.366098"
+ id="tspan2130"
+ sodipodi:role="line">App</tspan></text>
+ </g>
+ <rect
+ rx="0"
+ ry="3.8793426"
+ y="19.990194"
+ x="58.612213"
+ height="17.296541"
+ width="23.537758"
+ id="rect2155"
+ style="opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:0.97409327;fill-rule:nonzero;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.91191711;paint-order:fill markers stroke" />
+ <text
+ id="text2159"
+ y="30.367077"
+ x="63.842014"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-weight:normal;stroke-width:0.26458332px"
+ y="30.367077"
+ x="63.842014"
+ id="tspan2157"
+ sodipodi:role="line">CRDT</tspan></text>
+ <g
+ id="g4137"
+ transform="translate(-15.875)">
+ <rect
+ rx="0"
+ ry="3.8793426"
+ y="19.990194"
+ x="95.653885"
+ height="17.296541"
+ width="23.537758"
+ id="rect2163"
+ style="opacity:1;vector-effect:none;fill:#f9f9f9;fill-opacity:0.97409327;fill-rule:nonzero;stroke:#000000;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.91191711;paint-order:fill markers stroke" />
+ <text
+ id="text2167"
+ y="30.367077"
+ x="96.969627"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.93888855px;line-height:125%;font-family:Iwona;-inkscape-font-specification:'Iwona, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-weight:normal;stroke-width:0.26458332px"
+ y="30.367077"
+ x="96.969627"
+ id="tspan2165"
+ sodipodi:role="line">Datastore</tspan></text>
+ </g>
+ </g>
+</svg>
diff --git a/doc/talks/2021-04-28_spirals-team/garage.tex b/doc/talks/2021-04-28_spirals-team/garage.tex
new file mode 100644
index 00000000..9f953602
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/garage.tex
@@ -0,0 +1,147 @@
+\section{Introducing Garage}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{Brought to you by the Deuxfleurs association}
+
+\begin{block}{\textbf{deuxfleurs.fr} -- a libre hosting association with a vision}
+``Shifting the current structure of the Internet from a world of a few very large service providers, to a world where services are hosted by a variety of smaller organisations.''
+\end{block}
+
+
+\begin{block}{Our goals}
+\begin{itemize}
+ \item To propose performant \& reliable libre services for the masses
+ \item To host and administer our infrastructure ourselves
+ \item To allow members to contribute storage/compute nodes
+ \item Resilience: for availability \& the sysadmins' sleep
+ \item Conceptual simplicity to ease onboarding \& demistify hosting
+\end{itemize}
+\end{block}
+
+
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{The lacking state of the practice}
+
+\begin{block}{Object storage fitted our needs}
+\begin{itemize}
+ \item Distributed by design
+ \item Objects are replicated
+ \item Conceptually simple
+\end{itemize}
+\end{block}
+\vfill
+
+\begin{block}{Existing object stores did not}
+ \begin{itemize}
+ \item Too specific / complex
+ \item Resource hungry
+ \item Hidden constraints
+ \end{itemize}
+\end{block}
+\vfill
+
+We developed Garage, an object store with minimal functionality.
+
+It works, and serves our static sites and media.
+
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{Introducing Garage}
+
+\centering
+\url{garagehq.deuxfleurs.fr}
+
+\url{git.deuxfleurs.fr/Deuxfleurs/garage}
+
+\includegraphics[width=.4\columnwidth]{figures/garage_distributed.png}
+\vfill
+
+\raggedright
+\begin{itemize}
+ \item Distributed data store
+ \item Based on DynamoDB object store (P2P!)
+ \item Modular data types/protocols with CRDTs:
+ \begin{itemize}
+ \item Done: objects (media, static sites, backups...) via S3 API
+ \item To do: e-mails via IMAP protocol, and more
+ \end{itemize}
+\end{itemize}
+
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[t]{The \textbf{RING}}
+
+\centering
+\fullcite{decandia_dynamo:_2007}
+\vspace{3ex}
+
+\only<1>{\includegraphics[width=.5\columnwidth]{figures/c1.pdf}}%
+\only<2>{\includegraphics[width=.5\columnwidth]{figures/c2.pdf}}%
+\only<3>{\includegraphics[width=.5\columnwidth]{figures/c3.pdf}}%
+\only<4>{\includegraphics[width=.5\columnwidth]{figures/c4.pdf}}%
+\vspace{5ex}
+
+%\raggedright
+\only<1>{Each node is assigned a unique ID on the circular address space.}%
+\only<2-3>{When a new object is added to the store...}%
+\only<3>{\\ It is assigned a unique ID (its \emph{key}) on the address space.}%
+\only<4>{The $R$ nodes after the object are in charge of replicating it.}%
+
+\end{frame}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{Distributed metadata}
+
+\centering
+\includegraphics[width=.8\columnwidth]{figures/garage_tables.pdf}
+\vfill
+
+The objects, versions and blocks are all stored in the ring.
+
+\end{frame}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{Written in Rust}
+
+\begin{columns}
+\column{.65\columnwidth}
+Entirely written in Rust!
+\column{.35\columnwidth}
+\centering
+\includegraphics[width=.85\columnwidth]{figures/rustacean-flat-happy.png}
+\end{columns}
+\vfill
+
+\begin{columns}
+\column[t]{.6\columnwidth}
+ \textbf{Pros:}
+ \begin{itemize}
+ \item Compiled and fast
+ \item Features prevent usual mistakes:
+
+ strongly typed, immutable by default, ownership instead of GC...
+
+ \item Best of several paradigms:
+
+ imperative, OO, functional
+
+ \item Good libraries for network programmings:
+
+ serialization, http, async/await...
+ \end{itemize}
+\column[t]{.4\columnwidth}
+ \textbf{Cons}:
+ \begin{itemize}
+ \item Steep learning curve
+ \item Long compilation times
+ \item Compiler rage
+ \end{itemize}
+\end{columns}
+
+\end{frame} \ No newline at end of file
diff --git a/doc/talks/2021-04-28_spirals-team/header.tex b/doc/talks/2021-04-28_spirals-team/header.tex
new file mode 100644
index 00000000..42eaa25a
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/header.tex
@@ -0,0 +1,134 @@
+%% Imports %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\usepackage{graphicx}
+\usepackage[utf8]{inputenc}
+\usepackage{csquotes} % Elegant quotes (must be loaded before babel)
+\usepackage[english]{babel}
+\usepackage[T1]{fontenc}
+% \usepackage{amsfonts}
+% \usepackage{amssymb}
+%\usepackage{lmodern}
+\usepackage{iwona}
+\usepackage{color}
+\usepackage{xspace}
+\usepackage{amsmath}
+\usepackage{hanging}
+\usepackage{listings}
+\lstset{basicstyle=\scriptsize}
+\usepackage{tikz}
+\usepackage{tikzsymbols} % For emojis
+%\usepackage{setspace} % Activation disables footnoes
+\usepackage{perpage} % Reset footnote counter every page
+\MakePerPage{footnote}
+\usepackage{nameref} % For printing the sections' name
+\usepackage{hyperref}
+
+%% Biblio %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\usepackage[style=alphabetic,giveninits=true,sorting=none,hyperref,backend=biber,maxnames=3]{biblatex}
+\addbibresource{bibliography.bib}
+
+%% Templating %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\usepackage{pgf}
+\usepackage{xifthen, tikz}
+
+\usetheme{default}
+
+\makeatletter
+
+
+%%% colors
+\definecolor{bleuroi}{RGB}{0, 8, 88}
+\definecolor{vertemeraude}{RGB}{0, 64, 44}
+\definecolor{lightgray}{RGB}{245,245,245}
+\definecolor{encre_de_chine}{RGB}{9,36,53}
+\definecolor{im_lost_in_your_eyes}{RGB}{110,138,159}
+\definecolor{metallic_grey}{RGB}{209,219,221}
+\definecolor{metallic_white}{RGB}{229,239,241}
+\definecolor{boss}{RGB}{229,72,27}
+\definecolor{toon_eyes}{RGB}{3,4,6}
+
+\setbeamercolor{frametitle}{bg=bleuroi,fg=white}
+\setbeamercolor*{normal text}{fg=toon_eyes,bg=white}
+\setbeamercolor*{block title}{fg=white,bg=vertemeraude}
+\setbeamercolor*{block body}{fg=toon_eyes,bg=vertemeraude!5}
+\setbeamercolor{alerted text}{fg=vertemeraude}
+\setbeamercolor*{example text}{fg=toon_eyes,bg=white}
+\setbeamercolor*{structure}{fg=bleuroi,bg=white}
+% sectionnavigation:
+\setbeamercolor*{section in head/foot}{fg=bleuroi,bg=white}
+
+% \let\oldtextbf\textbf
+% \renewcommand{\textbf}[1]{\textcolor{bleuroi}{\oldtextbf{#1}}}
+
+%%% Rounded boxes with no shading
+\pgfdeclareverticalshading[lower.bg,upper.bg]{bmb@transition}{200cm}{%
+ color(0pt)=(upper.bg); color(2pt)=(upper.bg); color(4pt)=(upper.bg)}
+\setbeamertemplate{blocks}[rounded][shadow=false]
+
+%%% Who on Earth uses navigation bars?
+\setbeamertemplate{navigation symbols}{}
+
+
+%%% Headline with sections
+\setbeamertemplate{headline}
+{%
+ \begin{beamercolorbox}[wd=\paperwidth,dp=.5ex,ht=2ex]{section in head/foot}
+ \insertsectionnavigationhorizontal{\paperwidth}{\hskip0pt plus1fill}{\hskip0pt plus1fill}\par % Centered
+ %\insertsectionnavigationhorizontal{\paperwidth}{}{\hfill\hfill} % Left aligned
+ \end{beamercolorbox}%
+}
+% Set the colors of the section bar
+\usesectionheadtemplate
+ {\colorbox{fg}{\color{bg} \insertsectionhead}}
+ {\color{fg!40!bg} \insertsectionhead}
+
+% \newlength\lpg@linewd
+% \setbox0=\hbox{\strut}
+% \newlength\strutht \strutht\ht0
+% \newlength\strutdp \strutdp\dp0
+
+\setbeamertemplate{frametitle}
+{
+ \begin{beamercolorbox}[wd=\paperwidth,dp=1ex,ht=2.6ex,leftskip=.7cm,rightskip=.7cm]{frametitle}
+ %\vskip-1ex
+ %[wd=\lpg@linewd, ht=\strutht, dp=\strutdp]{frametitle}
+ %\vskip-.8ex\hskip0.7cm
+ %\vskip-.8ex
+ \usebeamerfont{frametitle}\strut\insertframetitle
+ \ifx\insertframesubtitle\@empty
+ \else
+ \hfill \usebeamerfont{framesubtitle}\strut\insertframesubtitle
+ \fi%
+ \end{beamercolorbox}
+}
+
+
+%%% Page numbering in footline
+\setbeamertemplate{footline}{
+\hbox{\begin{beamercolorbox}[wd=1\paperwidth,ht=2.5ex,dp=1ex,right]{framenumber in head/foot}%
+ \usebeamerfont{framenumber in head/foot}%
+ %\insertframenumber\space/\space\inserttotalframenumber\hspace{0.3em}
+ \insertframenumber\hspace{0.5em}
+\end{beamercolorbox}}}
+
+%%% Reduce foot citation size
+\renewcommand{\footnotesize}{\tiny}
+
+%%% Display footnotes (not working, still no footnotes)
+% \setbeamertemplate{footnote}{%
+% \hangpara{2em}{1}%
+% \makebox[2em][l]{\insertfootnotemark}\footnotesize\insertfootnotetext\par%
+% }
+
+
+\makeatother
+
+%% Commentaires %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\annote}[3]{{
+ \colorbox{#3}{\bfseries\sffamily\footnotesize\textcolor{white}{#2}}
+ \color{#3}
+ $\blacktriangleright$\textit{#1}$\blacktriangleleft$}
+}
+%% Uncomment for final version (removes notes)
+%\renewcommand{\annote}[3]{}
+
+\newcommand{\todo}[1]{\annote{#1}{TODO}{green}}
diff --git a/doc/talks/2021-04-28_spirals-team/introduction.tex b/doc/talks/2021-04-28_spirals-team/introduction.tex
new file mode 100644
index 00000000..a977c09b
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/introduction.tex
@@ -0,0 +1,99 @@
+\section{Introduction}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{A very casual motivation}
+
+
+\begin{center}
+\Large
+I want to host \textbf{resilient web services} with \textbf{acceptable performance} on commodity hardware behind \textbf{household networks}.
+\end{center}
+\vfill
+
+\begin{block}{Keywords}
+\begin{columns}
+\column{.5\columnwidth}
+ \begin{itemize}
+ \item Decentralised networks
+ \item Edge computing
+ \end{itemize}
+\column{.5\columnwidth}
+ \begin{itemize}
+ \item Distributed storage
+ \item Privacy
+ \end{itemize}
+\end{columns}
+\end{block}
+
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{Context}
+
+\textbf{Resilience}: Ability to recover quickly from failures and changes.
+\vspace{1ex}
+
+Only achievable through distribution of the hosted applications across several physical locations.
+\vfill
+
+
+\begin{block}{Application = \textbf{computations} on \textbf{data}}
+\begin{itemize}
+ \item \textbf{Computation}: Stateless; easy to distribute \& orchestrate.
+ % where it is performed does not matter as long as the application's state is accessible R/W
+ %Computation units are "easy" to distribute and orchestrate.
+
+ \item \textbf{Data}: Stateful; hard to distribute \& full of trade-offs.
+\end{itemize}
+\end{block}
+
+\end{frame}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{Concurrent writes example}{How to lose vaccines}
+
+\centering
+
+\includegraphics[width=.5\columnwidth]{figures/conflict_problem.pdf}
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{The problem}
+
+% \textbf{Path dependency}: existing data stores are built for data centres.
+
+% $\implies$ They assume good inter-node connectivity.
+% \vfill
+
+\begin{center}
+\Large
+Can we design an available data store tailored for adverse network conditions?
+\end{center}
+
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Maybe more framing of the context. What kind of data storage? Object vs Block vs what?
+% \begin{frame}{``Stateless'', ``serverless'', and the elephant in the room}
+
+% It seems easy to deploy \& administer web services nowadays ...
+
+% Because the inherent complexity is shadowed by proprietary ``cloud'' solutions.
+
+% The IT crowd can gloss over ``statelessness'' \emph{ad nauseam} ...
+
+% But storing \emph{state} remains an open research problem.
+
+% Data storage is either:
+
+% \begin{itemize}
+% \item A single point of failure;
+% \item Delegated to proprietary solutions;
+% \item Pain.
+% \end{itemize}
+
+% Today, we will review networked storage's history, and discuss open research questions.
+
+% \end{frame} \ No newline at end of file
diff --git a/doc/talks/2021-04-28_spirals-team/main.tex b/doc/talks/2021-04-28_spirals-team/main.tex
new file mode 100644
index 00000000..5cd9dc0c
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/main.tex
@@ -0,0 +1,70 @@
+\documentclass[compress]{beamer}
+
+\input{header.tex}
+
+%% Metadata %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\title{Distributed object storage is centralised}
+\subtitle{A quest for autonomy in the modern hosting ecology}
+\author{Adrien Luxey}
+\date{Wednesday, 28th April, 2021}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Begin document %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{document}
+
+%% Title page %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+{
+\setbeamertemplate{footline}{}
+\setbeamertemplate{headline}{}
+\begin{frame}
+\titlepage
+\end{frame}
+}
+
+%% Contents %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\input{introduction.tex}
+\input{sota.tex}
+\input{escaping_the_cloud.tex}
+\input{garage.tex}
+\input{conclusion.tex}
+
+
+%% Bibliography %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% \begin{frame}
+% \large
+% \raggedright
+% Références
+
+% \printbibliography
+% \end{frame}
+
+%% Ending %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+{
+\setbeamertemplate{footline}{}
+\setbeamertemplate{headline}{}
+\begin{frame}
+\centering
+
+\vspace{1cm}
+\Large Thank you for your attention.
+
+\vspace{2cm}
+\large Now let's chat!
+
+\vspace{1cm}
+\raggedleft
+\includegraphics[width=.2\textwidth]{figures/m_proxy_gray.pdf}
+\end{frame}
+}
+
+%% Appendices %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% \appendix
+% \input{sprinkler_appendix.tex}
+% \input{cascade_appendix.tex}
+% \input{spores_appendix.tex}
+
+
+\end{document} \ No newline at end of file
diff --git a/doc/talks/2021-04-28_spirals-team/sota.tex b/doc/talks/2021-04-28_spirals-team/sota.tex
new file mode 100644
index 00000000..23b9087a
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/sota.tex
@@ -0,0 +1,323 @@
+\section{State of the art}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{The CAP theorem}{Consistency vs. Availability}
+
+\begin{block}{Eric Brewer's theorem}
+``A shared-state system can have \textbf{at most two} of the following properties at any given time:
+
+\begin{itemize}
+ \item \textbf{C}onsistency
+ \item \textbf{A}vailability
+ \item \textbf{P}artition tolerance''
+\end{itemize}
+\end{block}
+
+
+\begin{center}
+\Large
+Under network partitions, a distributed data store has to sacrifice either availability or consistency.
+\end{center}
+\vfill
+
+\begin{itemize}
+ \item \textbf{Consistency-first}: Abort incoming queries;
+ \item \textbf{Availability-first}: Return possibly stale data.
+\end{itemize}
+
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{Consistency-first: the ACID model}{Consistency vs. Availability}
+
+\textbf{Transaction}: unit of work within an ACID data store.
+%Comprises multiple operations.
+%E.g. bank transfer.
+%E.g. a bank transfer from A to B is a transaction involving two operations: withdraw money from A & credit B with the same money amount.
+\vfill
+
+\begin{itemize}
+ \item \textbf{\underline{A}tomicity}: Transactions either complete entirely or fail.
+
+ No transaction ever seen as in-progress.
+
+ \item \textbf{\underline{C}onsistency}: Transactions always generate a valid state.
+
+ The database maintains its invariants across transactions.
+
+ \item \textbf{\underline{I}solation}: Concurrent transactions are seen as sequential.
+
+ Transactions are serializable, or sequentially consistent.
+
+ \item \textbf{\underline{D}urability}: Committed transactions are never forgotten.
+\end{itemize}
+\vfill\centering
+
+Reads are fast, writes are slow.
+
+\vfill\raggedright
+
+Example: relational databases.
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[fragile]{Concurrent writes in ACID}{Consistency vs. Availability}
+
+
+\begin{columns}
+\column{.5\columnwidth}
+ \begin{block}{}
+ \begin{lstlisting}
+transaction AcqDoses(y):
+ x <- SELECT #vaccines;
+ UPDATE #vaccines = (x + y);
+ \end{lstlisting}
+ \end{block}
+ \vspace{5ex}
+
+ Supports compound operations.
+\column{.5\columnwidth}
+\centering
+\includegraphics[width=\columnwidth]{figures/conflict_acid.pdf}
+\end{columns}
+
+\end{frame}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{Availability-first: the BASE model}{Consistency vs. Availability}
+
+
+Some apps prefer availability, e.g. Amazon products' reviews.
+\vfill
+
+The BASE model trades Consistency \& Isolation for Availability.
+
+
+%Some applications do not care about strong consistency and prefer being highly available (e.g. Amazon's product reviews).
+
+%In order to achieve higher availability, the BASE model relaxes consistency constraints of the ACID model: "eventual consistency".
+\vfill
+
+\begin{itemize}
+ \item \textbf{\underline{B}asic \underline{A}vailability}:
+ The data store thrives to be available.
+
+ \item \textbf{\underline{S}oft-state}:
+ Replicas can disagree on the valid state.
+
+ \item \textbf{\underline{E}ventual consistency}:
+ In the absence of write queries,
+ the data store will eventually converge to a single valid state.
+\end{itemize}
+\vfill\centering
+
+Writes are fast, reads are slow.
+
+\vfill\raggedright
+
+Examples: key-value \& object stores.
+
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{Concurrent writes in BASE}{Consistency vs. Availability}
+
+\begin{columns}
+\column{.5\columnwidth}
+ \begin{block}{Object}
+ \begin{itemize}
+ \item Unique key
+ \item Arbitrary value
+ \item Metadata
+ \end{itemize}
+ \end{block}
+ \vspace{5ex}
+
+ Conflict resolution = client's job!
+ \vspace{5ex}
+
+ No compound operations.
+\column{.5\columnwidth}
+ \centering
+ \includegraphics[width=\columnwidth]{figures/conflict_base.pdf}
+\end{columns}
+
+% KV storage is another example, distinction is minor here
+
+% Object = unique key, arbitrary value, metadata.
+
+% Object storage only provides semantics to investigate causal order of queries *for individual objects*. No compound operations, no transactions.
+
+% Much easier to distribute, and "scale-out".
+
+% Write is fast, read is slow (gotta collect all object versions).
+
+% \todo{vaccines example with BASE model}
+
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{Strong Eventual Consistency w/ CRDTs}{Consistency vs. Availability}
+
+\centering\small
+
+\fullcite{defago_conflict-free_2011}
+
+\vfill\raggedright\normalsize
+
+\begin{block}{Strong Eventual Consistency (SEC)}
+ \begin{itemize}
+ \item CRDTs specify distributed operations
+ \item Conflicts will be solved according to specification
+ \item Proven \& bound eventual convergence
+ \end{itemize}
+\end{block}
+
+\vfill\centering
+\includegraphics[width=.5\columnwidth]{figures/crdt.pdf}
+
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}[fragile]{Concurrent writes with CRDTs}{Consistency vs. Availability}
+
+\begin{columns}
+\column{.5\columnwidth}
+ \begin{block}{}
+ \begin{lstlisting}
+CRDT Counter(x0):
+ history = {}
+ op. incr(y):
+ history U= {(UUID(), y)}
+ op. decr(y):
+ history U= {(UUID(), -y)}
+ op. read():
+ x = x0
+ for (_, y) in history:
+ x += y
+ return x
+ \end{lstlisting}
+ \end{block}
+ \vspace{2ex}
+
+ Operations commute?
+
+ $\implies$ screw total order!
+\column{.5\columnwidth}
+ \centering
+ \includegraphics[width=\columnwidth]{figures/conflict_crdt.pdf}
+\end{columns}
+
+\end{frame}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{A complex CRDT: the DAG}{Consistency vs. Availability}
+
+\centering
+\only<1>{\includegraphics[height=\textheight]{figures/dag_crdt.png}}%
+\only<2>{
+ Just to say I swept a lot under the rug.
+ \vfill
+
+ For details, go read:
+
+ \fullcite{defago_conflict-free_2011}
+ \vfill
+
+ For an implementation, check \textbf{AntidoteDB}.
+}
+
+\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{frame}{State of the practice}{Path dependency to the ``cloud''}
+
+\begin{block}{The BASE model is fashionable because}
+\centering
+
+``\emph{High-performance} object storage for \emph{AI analytics} with PBs of \emph{IoT data streams} at the \emph{edge}, using \emph{5G}.''
+ % \begin{itemize}
+ % \item Highest performance
+ % \item IoT data streams are inherently distributed
+ % \end{itemize}
+\end{block}
+
+\vfill\centering
+
+\includegraphics[width=.9\columnwidth]{figures/minio_edge.png}
+
+\vfill\raggedright
+
+
+%\begin{block}{}
+\begin{itemize}
+ \item Always backed by cloud: high performance network links.
+ \item Edge nodes always seen as clients or data sources, not peers.
+\end{itemize}
+%\end{block}
+
+% There is \textbf{always a central cloud cluster} in these use-cases.
+
+% Hidden constraint: \textbf{high performance inter-node connectivity}.
+
+
+
+\end{frame}
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \begin{frame}{A brief history of storage}
+
+% We keep it short because we'll follow chronological order in the next section too.
+
+% \end{frame}
+
+
+% \begin{frame}{In the beginning, there were \emph{monoliths}}
+
+% \includegraphics[width=.5\columnwidth]{figures/stonehenge.jpg}
+
+% Web applications used to be monolithic:
+
+% \begin{itemize}
+% \item One or two servers;
+% \item Availability was not an obsession;
+% \item Latency was acceptable.
+% \end{itemize}
+
+% Relational databases were queens.
+
+% \end{frame}
+
+
+% \begin{frame}{Then came \emph{expectations}}
+% Then, the whole world went online, and suddenly: expectations!
+
+% \begin{itemize}
+% \item ``Milliseconds matter.'' (Algolia slogan)
+% \item Critical networked services (healthcare, logistics) need 100\% availability
+% \end{itemize}
+
+% $\implies$ Microservices \& horizontal scalability.
+
+% \todo{Develop on the `herd not sheep' paradigm a bit.}
+
+% \end{frame}
+
+
+% \begin{frame}{Distributing state/storage: the remaining unknown}
+
+% The microservices orchestration game works well for \emph{stateless} services.
+
+% However, any application requires \emph{state}, persistent data.
+
+% And this is tough. As we will now see.
+
+% (Not that it's not well studied: distributed storage has always been fashionable.)
+
+% \end{frame} \ No newline at end of file
diff --git a/doc/talks/2021-04-28_spirals-team/talk.pdf b/doc/talks/2021-04-28_spirals-team/talk.pdf
new file mode 100644
index 00000000..051d8f6c
--- /dev/null
+++ b/doc/talks/2021-04-28_spirals-team/talk.pdf
Binary files differ