diff --git a/assets/cortex-m-layers.svg b/assets/cortex-m-layers.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8998168cba48f74273fc20a369b736a050970972
--- /dev/null
+++ b/assets/cortex-m-layers.svg
@@ -0,0 +1,352 @@
+<?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="800"
+   height="240"
+   viewBox="0 0 211.66666 63.5"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.1 r"
+   sodipodi:docname="multitask.svg">
+  <defs
+     id="defs2" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="-8.2091291"
+     inkscape:cy="337.09993"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1920"
+     inkscape:window-height="1080"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <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 />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-233.49998)">
+    <rect
+       style="fill:#a8b3cd;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect875-6"
+       width="66.145836"
+       height="31.749998"
+       x="105.83334"
+       y="249.37497" />
+    <rect
+       id="rect10"
+       width="66.145836"
+       height="31.75"
+       x="39.6875"
+       y="-281.12497"
+       style="fill:#ffd1aa;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       transform="scale(1,-1)" />
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot855"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:25px;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+       transform="matrix(0.26458333,0,0,0.26458333,0,138.24998)"><flowRegion
+         id="flowRegion857"><rect
+           id="rect859"
+           width="253.54829"
+           height="54.548237"
+           x="-44.446712"
+           y="110.07602" /></flowRegion><flowPara
+         id="flowPara861" /></flowRoot>    <rect
+       style="fill:#526491;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect875-7"
+       width="52.916664"
+       height="15.874998"
+       x="119.0625"
+       y="249.37498" />
+    <rect
+       style="fill:#67989a;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect907"
+       width="132.29167"
+       height="15.874999"
+       x="39.6875"
+       y="233.49998" />
+    <g
+       aria-label="f3"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;line-height:6.61458349px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       id="text819-35">
+      <path
+         d="m 143.93921,254.09514 c -0.92287,0 -1.6256,0.51647 -1.6256,1.33774 v 0.889 h -1.05833 v 0.56726 h 1.05833 v 3.54754 h 0.71967 v -3.54754 h 1.43086 l 0.0762,-0.56726 h -1.50706 v -0.90594 c 0,-0.49106 0.31326,-0.7366 0.93133,-0.7366 0.33867,0 0.66887,0.0593 0.95673,0.18627 l 0.2286,-0.5334 c -0.34713,-0.14393 -0.72813,-0.23707 -1.21073,-0.23707 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4812" />
+      <path
+         d="m 147.81364,254.51001 c -0.60114,0 -1.15994,0.2032 -1.65947,0.67733 l 0.38947,0.4318 c 0.38946,-0.3556 0.7366,-0.5334 1.23613,-0.5334 0.61807,0 1.10067,0.34714 1.10067,0.98214 0,0.70273 -0.54187,1.016 -1.10067,1.016 h -0.34713 l -0.0847,0.56726 h 0.4826 c 0.69427,0 1.21073,0.27094 1.21073,1.10914 0,0.72813 -0.4826,1.18533 -1.2954,1.18533 -0.47413,0 -0.9652,-0.18627 -1.2954,-0.57573 l -0.47413,0.38946 c 0.44027,0.5334 1.13453,0.77047 1.78647,0.77047 1.21073,0 2.02353,-0.762 2.02353,-1.76953 0,-0.90594 -0.64347,-1.38007 -1.3208,-1.43087 0.6096,-0.11853 1.13453,-0.65193 1.13453,-1.35467 0,-0.79586 -0.6858,-1.46473 -1.78646,-1.46473 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4814" />
+    </g>
+    <g
+       aria-label="cortex-m"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;line-height:6.61458302px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       id="text819">
+      <path
+         d="m 55.152861,272.75569 c -0.770466,0 -1.329266,-0.49953 -1.329266,-1.69333 0,-1.17687 0.550333,-1.74414 1.3208,-1.74414 0.397933,0 0.770466,0.13547 1.151466,0.38947 l 0.347134,-0.46567 c -0.414867,-0.34713 -0.9144,-0.52493 -1.490134,-0.52493 -1.329266,0 -2.099733,1.00753 -2.099733,2.34527 0,1.397 0.762,2.30293 2.099733,2.30293 0.516467,0 1.1176,-0.2032 1.4986,-0.5334 l -0.338666,-0.46567 c -0.338667,0.2286 -0.7112,0.38947 -1.159934,0.38947 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4753" />
+      <path
+         d="m 59.907821,268.71709 c -1.253067,0 -1.9304,0.95673 -1.9304,2.32833 0,1.40547 0.668866,2.31987 1.921933,2.31987 1.2446,0 1.921933,-0.95673 1.921933,-2.32833 0,-1.40547 -0.6604,-2.31987 -1.913466,-2.31987 z m 0,0.5842 c 0.762,0 1.142999,0.5588 1.142999,1.73567 0,1.1938 -0.380999,1.74413 -1.151466,1.74413 -0.770467,0 -1.151467,-0.55033 -1.151467,-1.73567 0,-1.18533 0.389467,-1.74413 1.159934,-1.74413 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4755" />
+      <path
+         d="m 66.296846,268.71709 c -0.804333,0 -1.261533,0.42333 -1.6002,1.15147 l -0.135466,-1.05834 h -1.236133 v 0.55034 h 0.702733 v 3.36126 h -0.702733 v 0.55034 h 2.319866 v -0.55034 H 64.73898 v -1.8796 c 0.287866,-0.98213 0.778933,-1.4732 1.464733,-1.4732 h 0.04233 v 0.95674 h 0.575734 l 0.1016,-1.51554 c -0.194734,-0.0508 -0.381,-0.0931 -0.626534,-0.0931 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4757" />
+      <path
+         d="m 71.906939,273.04356 -0.2794,-0.4826 c -0.237067,0.127 -0.524933,0.21166 -0.855133,0.21166 -0.6096,0 -0.855134,-0.26246 -0.855134,-0.75353 v -2.65007 h 1.456267 l 0.09313,-0.5588 h -1.5494 v -1.0922 l -0.7112,0.0847 v 1.00753 h -1.024466 v 0.5588 h 1.024466 v 2.65854 c 0,0.77893 0.541867,1.33773 1.4986,1.33773 0.423334,0 0.889,-0.11853 1.202267,-0.32173 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4759" />
+      <path
+         d="m 74.003365,271.29096 h 2.9972 c 0.0085,-0.0931 0.01693,-0.2286 0.01693,-0.381 0,-1.35467 -0.694266,-2.19287 -1.820333,-2.19287 -1.185333,0 -1.938867,0.98213 -1.938867,2.32833 0,1.38854 0.7366,2.31987 2.040467,2.31987 0.550333,0 1.109133,-0.19473 1.524,-0.51647 l -0.3302,-0.47413 c -0.397933,0.26247 -0.7366,0.39793 -1.1938,0.39793 -0.6858,0 -1.261533,-0.44873 -1.2954,-1.48166 z m 1.202267,-1.98967 c 0.677333,0 1.100666,0.49107 1.1176,1.4478 h -2.319867 c 0.05927,-0.98213 0.541867,-1.4478 1.202267,-1.4478 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4761" />
+      <path
+         d="m 78.953058,273.27216 1.227666,-1.91347 1.227667,1.91347 h 0.8636 l -1.642533,-2.3876 1.447799,-2.07434 h -0.821266 l -1.0414,1.65947 -1.032933,-1.65947 h -0.846667 l 1.4478,2.1082 -1.642533,2.35374 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4763" />
+      <path
+         d="m 83.589484,271.26556 h 3.386666 v -0.6096 h -3.386666 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4765" />
+      <path
+         d="m 91.604111,268.71709 c -0.448733,0 -0.7366,0.23707 -0.982133,0.59267 -0.135467,-0.4572 -0.465667,-0.59267 -0.804333,-0.59267 -0.448734,0 -0.728134,0.27093 -0.9652,0.61807 l -0.0508,-0.52494 h -0.550334 v 4.46194 h 0.651934 v -3.46287 c 0.245533,-0.381 0.499533,-0.5334 0.778933,-0.5334 0.321733,0 0.347133,0.2286 0.347133,0.79587 v 3.2004 h 0.6604 v -3.46287 c 0.245534,-0.381 0.508,-0.5334 0.778934,-0.5334 0.321733,0 0.347133,0.2286 0.347133,0.79587 v 3.2004 h 0.651933 v -3.31894 c 0,-1.02446 -0.4318,-1.23613 -0.8636,-1.23613 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4767" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;line-height:6.61458349px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       x="85.486809"
+       y="296.99997"
+       id="text819-3-9"><tspan
+         sodipodi:role="line"
+         id="tspan817-6-3"
+         x="85.486809"
+         y="296.99997"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332">HARDWARE</tspan></text>
+    <rect
+       style="fill:#d79f6e;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect873"
+       height="10.583332"
+       x="42.333332"
+       y="275.83331"
+       width="60.854164" />
+    <g
+       aria-label="cortex-m-rt"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;line-height:6.61458349px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       id="text819-3">
+      <path
+         d="m 47.664817,283.339 c -0.770467,0 -1.329267,-0.49953 -1.329267,-1.69333 0,-1.17687 0.550333,-1.74413 1.3208,-1.74413 0.397933,0 0.770467,0.13546 1.151466,0.38946 l 0.347134,-0.46566 c -0.414867,-0.34714 -0.9144,-0.52494 -1.490133,-0.52494 -1.329267,0 -2.099734,1.00754 -2.099734,2.34527 0,1.397 0.762,2.30293 2.099734,2.30293 0.516466,0 1.117599,-0.2032 1.498599,-0.5334 l -0.338666,-0.46566 c -0.338667,0.2286 -0.7112,0.38946 -1.159933,0.38946 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4770" />
+      <path
+         d="m 52.419776,279.3004 c -1.253067,0 -1.9304,0.95674 -1.9304,2.32834 0,1.40546 0.668867,2.31986 1.921933,2.31986 1.2446,0 1.921933,-0.95673 1.921933,-2.32833 0,-1.40547 -0.6604,-2.31987 -1.913466,-2.31987 z m 0,0.5842 c 0.762,0 1.143,0.5588 1.143,1.73567 0,1.1938 -0.381,1.74413 -1.151467,1.74413 -0.770466,0 -1.151466,-0.55033 -1.151466,-1.73566 0,-1.18534 0.389466,-1.74414 1.159933,-1.74414 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4772" />
+      <path
+         d="m 58.808802,279.3004 c -0.804334,0 -1.261534,0.42334 -1.6002,1.15147 l -0.135467,-1.05833 h -1.236133 v 0.55033 h 0.702733 v 3.36127 h -0.702733 v 0.55033 h 2.319866 v -0.55033 h -0.905933 v -1.8796 c 0.287867,-0.98214 0.778933,-1.4732 1.464733,-1.4732 h 0.04233 v 0.95673 h 0.575733 l 0.1016,-1.51553 c -0.194733,-0.0508 -0.381,-0.0931 -0.626533,-0.0931 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4774" />
+      <path
+         d="m 64.418894,283.62687 -0.2794,-0.4826 c -0.237066,0.127 -0.524933,0.21167 -0.855133,0.21167 -0.6096,0 -0.855133,-0.26247 -0.855133,-0.75354 v -2.65006 h 1.456266 l 0.09313,-0.5588 h -1.5494 v -1.0922 l -0.7112,0.0847 v 1.00754 h -1.024467 v 0.5588 h 1.024467 v 2.65853 c 0,0.77893 0.541866,1.33773 1.4986,1.33773 0.423333,0 0.889,-0.11853 1.202266,-0.32173 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4776" />
+      <path
+         d="m 66.51532,281.87427 h 2.9972 c 0.0085,-0.0931 0.01693,-0.2286 0.01693,-0.381 0,-1.35467 -0.694266,-2.19287 -1.820333,-2.19287 -1.185333,0 -1.938866,0.98214 -1.938866,2.32834 0,1.38853 0.7366,2.31986 2.040466,2.31986 0.550334,0 1.109133,-0.19473 1.524,-0.51646 l -0.3302,-0.47414 c -0.397933,0.26247 -0.7366,0.39794 -1.1938,0.39794 -0.6858,0 -1.261533,-0.44874 -1.2954,-1.48167 z m 1.202267,-1.98967 c 0.677333,0 1.100666,0.49107 1.1176,1.4478 H 66.51532 c 0.05927,-0.98213 0.541867,-1.4478 1.202267,-1.4478 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4778" />
+      <path
+         d="m 71.465013,283.85547 1.227666,-1.91347 1.227667,1.91347 h 0.8636 l -1.642533,-2.3876 1.4478,-2.07433 h -0.821267 l -1.0414,1.65946 -1.032933,-1.65946 h -0.846667 l 1.4478,2.1082 -1.642533,2.35373 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4780" />
+      <path
+         d="m 76.101439,281.84887 h 3.386666 v -0.6096 h -3.386666 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4782" />
+      <path
+         d="m 84.116066,279.3004 c -0.448733,0 -0.736599,0.23707 -0.982133,0.59267 -0.135466,-0.4572 -0.465666,-0.59267 -0.804333,-0.59267 -0.448733,0 -0.728133,0.27094 -0.9652,0.61807 l -0.0508,-0.52493 h -0.550333 v 4.46193 H 81.4152 v -3.46287 c 0.245533,-0.381 0.499533,-0.5334 0.778933,-0.5334 0.321734,0 0.347134,0.2286 0.347134,0.79587 v 3.2004 h 0.6604 v -3.46287 c 0.245533,-0.381 0.507999,-0.5334 0.778933,-0.5334 0.321733,0 0.347133,0.2286 0.347133,0.79587 v 3.2004 h 0.651933 v -3.31893 c 0,-1.02447 -0.4318,-1.23614 -0.8636,-1.23614 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4784" />
+      <path
+         d="m 86.254824,281.84887 h 3.386666 v -0.6096 h -3.386666 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4786" />
+      <path
+         d="m 94.345648,279.3004 c -0.804333,0 -1.261533,0.42334 -1.6002,1.15147 l -0.135467,-1.05833 h -1.236133 v 0.55033 h 0.702733 v 3.36127 h -0.702733 v 0.55033 h 2.319867 v -0.55033 h -0.905934 v -1.8796 c 0.287867,-0.98214 0.778934,-1.4732 1.464733,-1.4732 h 0.04233 v 0.95673 h 0.575733 l 0.1016,-1.51553 c -0.194733,-0.0508 -0.381,-0.0931 -0.626533,-0.0931 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4788" />
+      <path
+         d="m 99.955742,283.62687 -0.2794,-0.4826 c -0.237066,0.127 -0.524933,0.21167 -0.855133,0.21167 -0.6096,0 -0.855133,-0.26247 -0.855133,-0.75354 v -2.65006 h 1.456266 l 0.09313,-0.5588 h -1.5494 v -1.0922 l -0.7112,0.0847 v 1.00754 h -1.024467 v 0.5588 h 1.024467 v 2.65853 c 0,0.77893 0.541866,1.33773 1.4986,1.33773 0.423333,0 0.889,-0.11853 1.202266,-0.32173 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4790" />
+    </g>
+    <g
+       aria-label="stm32f30x"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;line-height:6.61458349px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       id="text819-7">
+      <path
+         d="m 118.35396,275.82061 c -0.52494,0 -0.99907,-0.19473 -1.3462,-0.4826 l -0.39794,0.46567 c 0.381,0.3302 0.93134,0.60113 1.74414,0.60113 0.94826,0 1.87113,-0.37253 1.87113,-1.32927 0,-0.82973 -0.57573,-1.13453 -1.4478,-1.3716 -0.89747,-0.24553 -1.17687,-0.381 -1.17687,-0.7874 0,-0.33866 0.254,-0.5842 0.9652,-0.5842 0.57574,0 0.95674,0.1778 1.28694,0.4064 l 0.32173,-0.49106 c -0.381,-0.27094 -0.90593,-0.49107 -1.6256,-0.49107 -1.00753,0 -1.69333,0.47413 -1.69333,1.2192 0,0.77893 0.60113,1.05833 1.524,1.28693 0.94826,0.23707 1.07526,0.44874 1.07526,0.84667 0,0.4318 -0.41486,0.7112 -1.10066,0.7112 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4793" />
+      <path
+         d="m 125.45418,276.08308 -0.2794,-0.4826 c -0.23706,0.127 -0.52493,0.21166 -0.85513,0.21166 -0.6096,0 -0.85513,-0.26246 -0.85513,-0.75353 v -2.65007 h 1.45626 l 0.0931,-0.5588 h -1.5494 v -1.0922 l -0.7112,0.0847 v 1.00753 h -1.02447 v 0.5588 h 1.02447 v 2.65854 c 0,0.77893 0.54186,1.33773 1.4986,1.33773 0.42333,0 0.889,-0.11853 1.20226,-0.32173 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4795" />
+      <path
+         d="m 129.92128,271.75661 c -0.44874,0 -0.7366,0.23707 -0.98214,0.59267 -0.13546,-0.4572 -0.46566,-0.59267 -0.80433,-0.59267 -0.44873,0 -0.72813,0.27093 -0.9652,0.61807 l -0.0508,-0.52494 h -0.55033 v 4.46194 h 0.65193 v -3.46287 c 0.24553,-0.381 0.49953,-0.5334 0.77893,-0.5334 0.32174,0 0.34714,0.2286 0.34714,0.79587 v 3.2004 h 0.6604 v -3.46287 c 0.24553,-0.381 0.508,-0.5334 0.77893,-0.5334 0.32173,0 0.34713,0.2286 0.34713,0.79587 v 3.2004 h 0.65194 v -3.31894 c 0,-1.02446 -0.4318,-1.23613 -0.8636,-1.23613 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4797" />
+      <path
+         d="m 133.4909,270.38501 c -0.60113,0 -1.15993,0.2032 -1.65946,0.67733 l 0.38946,0.4318 c 0.38947,-0.3556 0.7366,-0.5334 1.23614,-0.5334 0.61806,0 1.10066,0.34714 1.10066,0.98214 0,0.70273 -0.54186,1.016 -1.10066,1.016 h -0.34714 l -0.0847,0.56726 h 0.4826 c 0.69426,0 1.21073,0.27094 1.21073,1.10914 0,0.72813 -0.4826,1.18533 -1.2954,1.18533 -0.47413,0 -0.9652,-0.18627 -1.2954,-0.57573 l -0.47413,0.38946 c 0.44026,0.5334 1.13453,0.77047 1.78646,0.77047 1.21074,0 2.02354,-0.762 2.02354,-1.76953 0,-0.90594 -0.64347,-1.38007 -1.3208,-1.43087 0.6096,-0.11853 1.13453,-0.65193 1.13453,-1.35467 0,-0.79586 -0.6858,-1.46473 -1.78647,-1.46473 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4799" />
+      <path
+         d="m 138.5676,270.38501 c -0.7874,0 -1.3208,0.2794 -1.778,0.8382 l 0.49106,0.381 c 0.37254,-0.4318 0.6858,-0.61807 1.25307,-0.61807 0.65193,0 1.04987,0.39794 1.04987,1.04987 0,0.94827 -0.47414,1.59173 -2.67547,3.69993 v 0.57574 h 3.47133 l 0.0847,-0.6096 h -2.7432 c 1.92193,-1.7526 2.60773,-2.6162 2.60773,-3.69147 0,-0.92287 -0.6604,-1.6256 -1.76106,-1.6256 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4801" />
+      <path
+         d="m 144.84655,269.97014 c -0.92286,0 -1.6256,0.51647 -1.6256,1.33774 v 0.889 h -1.05833 v 0.56726 h 1.05833 v 3.54754 h 0.71967 v -3.54754 h 1.43087 l 0.0762,-0.56726 h -1.50707 v -0.90594 c 0,-0.49106 0.31327,-0.7366 0.93133,-0.7366 0.33867,0 0.66887,0.0593 0.95674,0.18627 l 0.2286,-0.5334 c -0.34714,-0.14393 -0.72814,-0.23707 -1.21074,-0.23707 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4803" />
+      <path
+         d="m 148.72098,270.38501 c -0.60113,0 -1.15993,0.2032 -1.65947,0.67733 l 0.38947,0.4318 c 0.38947,-0.3556 0.7366,-0.5334 1.23613,-0.5334 0.61807,0 1.10067,0.34714 1.10067,0.98214 0,0.70273 -0.54187,1.016 -1.10067,1.016 h -0.34713 l -0.0847,0.56726 h 0.4826 c 0.69427,0 1.21074,0.27094 1.21074,1.10914 0,0.72813 -0.4826,1.18533 -1.2954,1.18533 -0.47414,0 -0.9652,-0.18627 -1.2954,-0.57573 l -0.47414,0.38946 c 0.44027,0.5334 1.13454,0.77047 1.78647,0.77047 1.21073,0 2.02353,-0.762 2.02353,-1.76953 0,-0.90594 -0.64346,-1.38007 -1.3208,-1.43087 0.6096,-0.11853 1.13454,-0.65193 1.13454,-1.35467 0,-0.79586 -0.6858,-1.46473 -1.78647,-1.46473 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4805" />
+      <path
+         d="m 154.06014,270.38501 c -1.25307,0 -1.905,1.07527 -1.905,3.00567 0,1.93886 0.65193,3.01413 1.905,3.01413 1.25307,0 1.905,-1.07527 1.905,-3.01413 0,-1.9304 -0.65193,-3.00567 -1.905,-3.00567 z m 0,0.57573 c 0.72813,0 1.15993,0.7112 1.15993,2.42994 0,1.7272 -0.4318,2.4384 -1.15993,2.4384 -0.71967,0 -1.15993,-0.7112 -1.15993,-2.4384 0,-1.71874 0.44026,-2.42994 1.15993,-2.42994 z m 0,1.8796 c -0.31327,0 -0.55033,0.24554 -0.55033,0.55034 0,0.31326 0.23706,0.5588 0.55033,0.5588 0.32173,0 0.5588,-0.24554 0.5588,-0.5588 0,-0.3048 -0.23707,-0.55034 -0.5588,-0.55034 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4807" />
+      <path
+         d="m 157.88377,276.31168 1.22766,-1.91347 1.22767,1.91347 h 0.8636 l -1.64253,-2.3876 1.4478,-2.07434 h -0.82127 l -1.0414,1.65947 -1.03293,-1.65947 h -0.84667 l 1.4478,2.1082 -1.64253,2.35374 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4809" />
+    </g>
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 39.6875,288.7979 H 171.97917"
+       id="path4629"
+       inkscape:connector-curvature="0" />
+    <rect
+       id="rect10-0"
+       width="52.916664"
+       height="15.874999"
+       x="39.6875"
+       y="-265.24997"
+       style="fill:#86c98a;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       transform="scale(1,-1)" />
+    <g
+       aria-label="???"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;line-height:6.61458349px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       id="text819-6">
+      <path
+         d="m 61.115704,254.30258 c -0.677333,0 -1.278466,0.26247 -1.769533,0.8382 l 0.499534,0.381 c 0.3556,-0.4318 0.804333,-0.62653 1.202266,-0.62653 0.567267,0 0.999067,0.2794 0.999067,0.762 0,0.95673 -1.4986,0.94826 -1.4986,2.31986 v 0.3302 h 0.7112 v -0.28786 c 0,-1.2446 1.532466,-1.04987 1.532466,-2.40454 0,-0.66886 -0.635,-1.31233 -1.6764,-1.31233 z m -0.186266,4.88527 c -0.321733,0 -0.567267,0.254 -0.567267,0.56726 0,0.32174 0.245534,0.56727 0.567267,0.56727 0.3302,0 0.567266,-0.24553 0.567266,-0.56727 0,-0.31326 -0.237066,-0.56726 -0.567266,-0.56726 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4746" />
+      <path
+         d="m 66.192397,254.30258 c -0.677333,0 -1.278467,0.26247 -1.769533,0.8382 l 0.499533,0.381 c 0.3556,-0.4318 0.804333,-0.62653 1.202267,-0.62653 0.567266,0 0.999066,0.2794 0.999066,0.762 0,0.95673 -1.4986,0.94826 -1.4986,2.31986 v 0.3302 h 0.7112 v -0.28786 c 0,-1.2446 1.532467,-1.04987 1.532467,-2.40454 0,-0.66886 -0.635,-1.31233 -1.6764,-1.31233 z m -0.186267,4.88527 c -0.321733,0 -0.567266,0.254 -0.567266,0.56726 0,0.32174 0.245533,0.56727 0.567266,0.56727 0.3302,0 0.567267,-0.24553 0.567267,-0.56727 0,-0.31326 -0.237067,-0.56726 -0.567267,-0.56726 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4748" />
+      <path
+         d="m 71.26909,254.30258 c -0.677334,0 -1.278467,0.26247 -1.769534,0.8382 l 0.499534,0.381 c 0.3556,-0.4318 0.804333,-0.62653 1.202266,-0.62653 0.567267,0 0.999067,0.2794 0.999067,0.762 0,0.95673 -1.4986,0.94826 -1.4986,2.31986 v 0.3302 h 0.7112 v -0.28786 c 0,-1.2446 1.532467,-1.04987 1.532467,-2.40454 0,-0.66886 -0.635,-1.31233 -1.6764,-1.31233 z m -0.186267,4.88527 c -0.321733,0 -0.567267,0.254 -0.567267,0.56726 0,0.32174 0.245534,0.56727 0.567267,0.56727 0.3302,0 0.567267,-0.24553 0.567267,-0.56727 0,-0.31326 -0.237067,-0.56726 -0.567267,-0.56726 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4750" />
+    </g>
+    <g
+       aria-label="Multitask app"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;line-height:6.61458349px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
+       id="text819-9"
+       transform="translate(5.1317439,9.2643738e-6)">
+      <path
+         d="M 72.379284,237.97884 H 71.34635 l -0.905933,3.99627 -0.948267,-3.99627 h -1.024466 l -0.3302,5.83354 h 0.694267 l 0.152399,-3.048 c 0.04233,-0.72814 0.03387,-1.78647 0.01693,-2.1082 l 1.049866,4.10633 h 0.7366 l 0.982134,-4.10633 c 0,0.28786 0,1.30386 0.0508,2.1082 l 0.1778,3.048 h 0.7112 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4721"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 74.518043,239.35044 h -0.7112 v 3.24274 c 0,0.82973 0.423333,1.31233 1.286933,1.31233 0.524934,0 1.075267,-0.24553 1.430867,-0.69427 l 0.05927,0.60114 h 0.6096 v -4.46194 h -0.7112 v 3.28507 c -0.245534,0.381 -0.719667,0.7112 -1.210734,0.7112 -0.516466,0 -0.753533,-0.254 -0.753533,-0.82973 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4723"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 80.627669,237.55551 h -2.0828 v 0.56727 h 1.3716 v 4.55506 c 0,0.77047 0.5334,1.22767 1.3208,1.22767 0.4572,0 0.821267,-0.1016 1.058333,-0.2286 l -0.186266,-0.51647 c -0.245534,0.0931 -0.4826,0.1524 -0.745067,0.1524 -0.4318,0 -0.7366,-0.16086 -0.7366,-0.60113 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4725"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 87.507761,243.58378 -0.2794,-0.4826 c -0.237066,0.127 -0.524933,0.21166 -0.855133,0.21166 -0.6096,0 -0.855133,-0.26246 -0.855133,-0.75353 v -2.65007 h 1.456266 l 0.09313,-0.5588 h -1.5494 v -1.0922 l -0.7112,0.0847 v 1.00753 h -1.024467 v 0.5588 h 1.024467 v 2.65854 c 0,0.77893 0.541867,1.33773 1.4986,1.33773 0.423333,0 0.889,-0.11853 1.202266,-0.32173 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4727"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 90.730254,237.26764 c -0.3048,0 -0.508,0.21167 -0.508,0.49954 0,0.28786 0.2032,0.49953 0.508,0.49953 0.313267,0 0.524933,-0.21167 0.524933,-0.49953 0,-0.28787 -0.211666,-0.49954 -0.524933,-0.49954 z m 0.567267,2.0828 h -2.040467 v 0.56727 h 1.329267 v 3.3274 h -1.3716 v 0.56727 h 3.335866 v -0.56727 h -1.253066 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4729"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 97.661147,243.58378 -0.2794,-0.4826 c -0.237067,0.127 -0.524934,0.21166 -0.855134,0.21166 -0.6096,0 -0.855133,-0.26246 -0.855133,-0.75353 v -2.65007 h 1.456267 l 0.09313,-0.5588 h -1.5494 v -1.0922 l -0.7112,0.0847 v 1.00753 H 93.93581 v 0.5588 h 1.024467 v 2.65854 c 0,0.77893 0.541867,1.33773 1.4986,1.33773 0.423333,0 0.889,-0.11853 1.202267,-0.32173 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4731"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 102.39071,242.83871 v -2.14207 c 0,-0.88053 -0.5588,-1.43933 -1.66794,-1.43933 -0.44026,0 -0.914397,0.0847 -1.464731,0.2794 l 0.194734,0.54187 c 0.4572,-0.16087 0.863597,-0.2286 1.159937,-0.2286 0.6604,0 1.05833,0.23706 1.05833,0.889 v 0.36406 h -0.6604 c -1.346201,0 -2.082801,0.51647 -2.082801,1.43087 0,0.82973 0.541867,1.3716 1.439331,1.3716 0.57574,0 1.07527,-0.21167 1.397,-0.62653 0.11854,0.4064 0.4318,0.5842 0.8128,0.635 l 0.1778,-0.508 c -0.254,-0.0762 -0.36406,-0.21167 -0.36406,-0.56727 z m -1.84574,0.5334 c -0.584197,0 -0.855131,-0.28787 -0.855131,-0.84667 0,-0.57573 0.355601,-0.93133 1.337731,-0.93133 h 0.64347 v 1.143 c -0.26247,0.39793 -0.6858,0.635 -1.12607,0.635 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4733"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 105.791,243.32131 c -0.52493,0 -0.99907,-0.19473 -1.3462,-0.4826 l -0.39793,0.46567 c 0.381,0.3302 0.93133,0.60113 1.74413,0.60113 0.94827,0 1.87113,-0.37253 1.87113,-1.32927 0,-0.82973 -0.57573,-1.13453 -1.4478,-1.3716 -0.89746,-0.24553 -1.17686,-0.381 -1.17686,-0.7874 0,-0.33866 0.254,-0.5842 0.9652,-0.5842 0.57573,0 0.95673,0.1778 1.28693,0.4064 l 0.32173,-0.49106 c -0.381,-0.27094 -0.90593,-0.49107 -1.6256,-0.49107 -1.00753,0 -1.69333,0.47413 -1.69333,1.2192 0,0.77893 0.60113,1.05833 1.524,1.28693 0.94827,0.23707 1.07527,0.44874 1.07527,0.84667 0,0.4318 -0.41487,0.7112 -1.10067,0.7112 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4735"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 110.10569,237.47084 -0.7112,0.0847 v 6.25687 h 0.7112 z m 2.9718,1.8796 h -0.9144 l -1.9812,2.02354 2.19287,2.4384 h 0.9398 l -2.2352,-2.44687 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4737"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 122.69748,242.83871 v -2.14207 c 0,-0.88053 -0.5588,-1.43933 -1.66794,-1.43933 -0.44026,0 -0.9144,0.0847 -1.46473,0.2794 l 0.19473,0.54187 c 0.4572,-0.16087 0.8636,-0.2286 1.15994,-0.2286 0.6604,0 1.05833,0.23706 1.05833,0.889 v 0.36406 h -0.6604 c -1.3462,0 -2.0828,0.51647 -2.0828,1.43087 0,0.82973 0.54187,1.3716 1.43933,1.3716 0.57574,0 1.07527,-0.21167 1.397,-0.62653 0.11854,0.4064 0.4318,0.5842 0.8128,0.635 l 0.1778,-0.508 c -0.254,-0.0762 -0.36406,-0.21167 -0.36406,-0.56727 z m -1.84574,0.5334 c -0.5842,0 -0.85513,-0.28787 -0.85513,-0.84667 0,-0.57573 0.3556,-0.93133 1.33773,-0.93133 h 0.64347 v 1.143 c -0.26247,0.39793 -0.6858,0.635 -1.12607,0.635 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4739"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 126.5719,239.25731 c -0.5334,0 -1.00753,0.26247 -1.32926,0.71967 l -0.0593,-0.62654 h -0.6096 v 6.25687 l 0.7112,-0.0847 v -2.12513 c 0.3048,0.33867 0.69427,0.508 1.18533,0.508 1.15994,0 1.71874,-0.97367 1.71874,-2.32833 0,-1.397 -0.4318,-2.31987 -1.61714,-2.31987 z m -0.16933,0.57573 c 0.70273,0 1.016,0.5842 1.016,1.74414 0,1.18533 -0.37253,1.73566 -1.10913,1.73566 -0.42334,0 -0.7874,-0.21166 -1.02447,-0.5588 v -2.2098 c 0.24553,-0.3556 0.62653,-0.7112 1.1176,-0.7112 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4741"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 131.64859,239.25731 c -0.5334,0 -1.00753,0.26247 -1.32926,0.71967 l -0.0593,-0.62654 h -0.6096 v 6.25687 l 0.7112,-0.0847 v -2.12513 c 0.3048,0.33867 0.69427,0.508 1.18533,0.508 1.15994,0 1.71874,-0.97367 1.71874,-2.32833 0,-1.397 -0.4318,-2.31987 -1.61714,-2.31987 z m -0.16933,0.57573 c 0.70273,0 1.016,0.5842 1.016,1.74414 0,1.18533 -0.37253,1.73566 -1.10913,1.73566 -0.42334,0 -0.7874,-0.21166 -1.02447,-0.5588 v -2.2098 c 0.24553,-0.3556 0.62653,-0.7112 1.1176,-0.7112 z"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46666622px;font-family:'Fira Code';-inkscape-font-specification:'Fira Code';stroke-width:0.26458332"
+         id="path4743"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+</svg>
diff --git a/assets/vscode-build.png b/assets/vscode-build.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e1ad1db0fbeb5fc2578bcaf373fb08964112c36
Binary files /dev/null and b/assets/vscode-build.png differ
diff --git a/assets/vscode-debug.png b/assets/vscode-debug.png
new file mode 100644
index 0000000000000000000000000000000000000000..d76847733ee38fa0ca5cc8d34e0777d633806f21
Binary files /dev/null and b/assets/vscode-debug.png differ
diff --git a/doc/Quickstart.md b/doc/Quickstart.md
new file mode 100644
index 0000000000000000000000000000000000000000..d1ba92cd5421dd7d47896376c3f1c96e17e401b3
--- /dev/null
+++ b/doc/Quickstart.md
@@ -0,0 +1,639 @@
+# Quickstart: a template for Cortex-M development
+
+## Abstraction layers
+
+![Abstraction layers](/assets/cortex-m-layers.svg)
+
+- `cortex-m` is a crate that provides an API to use functionality common to all Cortex-M
+  microcontrollers.
+
+- `stm32f30x` is a *device crate*. It provides an API to access the hardware of a device. This crate
+  is automatically generated from a [SVD file][svd] and provides a low level API to manipulate
+  registers.
+
+[svd]: https://github.com/posborne/cmsis-svd/blob/master/data/STMicro/STM32F103xx.svd
+
+- `f3` is a *board support crate*. It provides a higher level API (`Serial`, `I2C`, etc.) tailored
+  to a specific development board.
+
+- `cortex-m-rt` is a minimal "runtime" that handles initialization of RAM and provides the default
+  exception handling behavior. It is also gives your program the required memory layout.
+
+- `???` is a concurrency framework that we'll introduce in a later lecture.
+
+## Dependencies for development
+
+- `arm-none-eabi-ld`, linker
+
+- `arm-none-eabi-gdb`, debugger
+
+- `openocd`, for flashing / debugging the device
+
+- `xargo`, for compiling the `core` crate. Xargo is a Cargo wrapper -- it has the exact same UI.
+  Xargo takes care of building the `core` crate and linking it to your program / library.
+
+- And other handy Cargo subcommands
+
+### Linux
+
+- Arch Linux
+
+``` console
+$ sudo pacman -Sy arm-none-eabi-{ld,gdb} openocd
+```
+
+### macOS
+
+``` console
+$ brew cask install gcc-arm-embedded
+$ brew install openocd
+```
+
+If the brew cask command doesn't work (Error: Unknown command: cask), then run `brew tap
+Caskroom/tap` first and try again.
+
+### Windows
+
+Installers below
+
+- [`arm-none-eabi` toolchain](https://launchpad.net/gcc-arm-embedded/5.0/5-2016-q3-update/+download/gcc-arm-none-eabi-5_4-2016q3-20160926-win32.exe)
+
+- [OpenOCD](http://sysprogs.com/files/gnutoolchains/arm-eabi/openocd/OpenOCD-20170821.7z). Unzip to
+  your C (system) drive
+
+## All
+
+``` console
+$ # we have to use the nightly channel for embedded development
+$ rustup default nightly
+
+$ cargo install cargo-clone xargo
+```
+
+## Demo
+
+In the first part of the demo we'll use command line tools in the terminal then we'll transition to
+the Visual Studio Code IDE. It's a good idea to get familiar with the command line tools. The IDE is
+nice because it calls these tools with the right arguments for you but when things go south it pays
+off to understand what the IDE is doing under the hood.
+
+### Creating a new project
+
+These steps will give you a minimal Cortex-M project. If you run into any problem running these
+commands check out the [troubleshooting guide][troubleshoot].
+
+[troubleshoot]: https://docs.rs/cortex-m-quickstart/0.2.1/cortex_m_quickstart/#troubleshooting
+
+``` console
+$ # fetch the Cargo project template
+$ cargo clone cortex-m-quickstart
+
+$ # rename it as you wish
+$ mv cortex-m-quickstart app
+
+$ cd app
+
+$ # Cargo.toml.orig has a nicer format so let's use that instead of the reformatted one
+$ mv Cargo.toml{.orig,}
+
+$ # update the crate name and author
+$ $EDITOR Cargo.toml
+$ cat Cargo.toml
+[package]
+authors = ["Jorge Aparicio <jorge@japaric.io>"]
+name = "app"
+version = "0.1.0"
+
+[dependencies]
+cortex-m = "0.3.0"
+cortex-m-semihosting = "0.2.0"
+
+[dependencies.cortex-m-rt]
+features = ["abort-on-panic"]
+version = "0.3.3"
+
+[profile.release]
+debug = true
+lto = true
+
+$ # we need to specify the memory layout of the device
+$ $EDITOR memory.x
+
+$ # for the blue-pill you should have
+$ cat memory.x
+MEMORY
+{
+  /* NOTE K = KiBi = 1024 bytes */
+  FLASH : ORIGIN = 0x08000000, LENGTH = 64K
+  RAM : ORIGIN = 0x20000000, LENGTH = 20K
+}
+
+$ # for the NUCLEO-F401RE you should have
+$ cat memory.x
+{
+  /* NOTE K = KiBi = 1024 bytes */
+  FLASH : ORIGIN = 0x08000000, LENGTH = 512K
+  RAM : ORIGIN = 0x20000000, LENGTH = 96K
+}
+```
+
+### Hello world
+
+Let's start with the hello world example:
+
+``` console
+$ rm -rf src
+$ mkdir src
+$ cp examples/hello.rs src/main.rs
+```
+
+This is the hello world program. You can ignore the `INTERRUPTS` + `default_handler` part -- that's
+a generic interrupt table that we'll remove later.
+
+``` rust
+#![feature(used)]
+#![no_std]
+
+extern crate cortex_m;
+extern crate cortex_m_rt;
+extern crate cortex_m_semihosting;
+
+use core::fmt::Write;
+
+use cortex_m::asm;
+use cortex_m_semihosting::hio;
+
+fn main() {
+    // get a handle to the *host* standard output
+    let mut stdout = hio::hstdout().unwrap();
+
+    // write "Hello, world!" to it
+    writeln!(stdout, "Hello, world!").unwrap();
+}
+
+// As we are not using interrupts, we just register a dummy catch all handler
+#[link_section = ".vector_table.interrupts"]
+#[used]
+static INTERRUPTS: [extern "C" fn(); 240] = [default_handler; 240];
+
+extern "C" fn default_handler() {
+    asm::bkpt();
+}
+```
+
+The new thing here is the `#![no_std]` attribute. This indicates that this program will *not* link
+to the `std`, standard, crate. Instead it will link to the `core` crate. The `core` crate is a
+subset of the `std` crate that has no dependencies to OS mechanisms like threads, dynamic memory
+allocation, sockets, etc. `core` provides the minimal amount of support to run Rust on a bare metal
+system.
+
+### Build and analyze
+
+Let's build this:
+
+``` console
+$ # NOTE use `thumbv7m-none-eabi` for the blue-pill, and `thumbv7em-none-eabihf` for the nucleo
+$ xargo build --target thumbv7m-none-eabi
+```
+
+> The `thumbv7m-none-eabi` target corresponds to the Cortex-M3 architecture. The
+> `thumbv7em-none-eabihf` target corresponds to the Cortex-M4F architecture -- note the "F": this
+> means that the architecture has hardware support for floating point operations).
+
+This produces an unoptimized binary.
+
+``` console
+$ # mind the target name (use thumbv7em-none-eabihf for the nucleo)
+$ arm-none-eabi-size target/thumbv7m-none-eabi/debug/app
+   text    data     bss     dec     hex filename
+  14596       0       0   14596    3904 target/thumbv7m-none-eabi/debug/app
+```
+
+Let's rebuild in release mode. To avoid repeating myself I'll create a `$TARGET` variable that
+contains the name of the target.
+
+``` console
+$ TARGET=thumbv7m-none-eabi
+
+$ xargo build --target $TARGET --release
+```
+
+Now the binary is much smaller.
+
+``` console
+$ arm-none-eabi-size target/$TARGET/release/app
+   text    data     bss     dec     hex filename
+   3646       0       0    3646     e3e target/thumbv7m-none-eabi/release/app
+```
+
+You can get a breakdown of the memory usage by passing the `-Ax` flag:
+
+``` console
+$ arm-none-eabi-size -Ax target/$TARGET/debug/app
+section                 size         addr
+.vector_table          0x400    0x8000000
+.text                 0x27f8    0x8000400
+.rodata                0xd0c    0x8002c00
+.bss                     0x0   0x20000000
+.data                    0x0   0x20000000
+```
+
+`.bss` and `.data` are statically allocated (`static`) variables; there are none in this program.
+`.text` holds the program code. `.rodata` are constants, usually you'll find strings like our
+"Hello, world!" in this section. `.vector_table` is a region of memory that holds the vector table.
+
+> **Exercise** Do you remember the start address of the Flash memory and RAM? (hint: memory.x) Which
+> sections are located in Flash memory? Which sections are located in RAM?
+
+Another interesting thing to do here is to look at the disassembly of the program:
+
+``` console
+$ arm-none-eabi-objdump -CD target/$TARGET/release/app
+Disassembly of section .vector_table:
+
+08000000 <_svector_table>:
+ 8000000:       20005000        andcs   r5, r0, r0
+
+08000004 <cortex_m_rt::RESET_VECTOR>:
+ 8000004:       08000401        stmdaeq r0, {r0, sl}
+
+08000008 <EXCEPTIONS>:
+ 8000008:       08000639        stmdaeq r0, {r0, r3, r4, r5, r9, sl}
+ (..)
+
+Disassembly of section .text:
+
+08000400 <cortex_m_rt::reset_handler>:
+ 8000400:       b580            push    {r7, lr}
+ 8000402:       466f            mov     r7, sp
+ 8000404:       b088            sub     sp, #32
+ 8000406:       f240 0000       movw    r0, #0
+ 800040a:       f240 0100       movw    r1, #0
+ 800040e:       f2c2 0000       movt    r0, #8192       ; 0x2000
+ 8000412:       f2c2 0100       movt    r1, #8192       ; 0x2000
+ 8000416:       4281            cmp     r1, r0
+ (..)
+
+08000638 <BUS_FAULT>:
+ 8000638:       f3ef 8008       mrs     r0, MSP
+ 800063c:       f7ff bffa       b.w     8000634 <cortex_m_rt::default_handler>
+ (..)
+
+Disassembly of section .rodata:
+
+08000d44 <vtable.8>:
+ 8000d44:       080004cb        stmdaeq r0, {r0, r1, r3, r6, r7, sl}
+ 8000d48:       00000004        andeq   r0, r0, r4
+ 8000d4c:       00000004        andeq   r0, r0, r4
+ 8000d50:       080005e9        stmdaeq r0, {r0, r3, r5, r6, r7, r8, sl}
+ (..)
+```
+
+> **Exercise** Compare the contents of the `.vector_table` linker section, see above (or look at
+> your local output), to the diagram of the vector table in the [ARM documentation][vector_table].
+> What are the values of the "Initial SP value", "Reset", "NMI", "Hard fault" entries according to
+> the disassembly? What do these values mean? Investigate how these values are used in the boot
+> process and the exception handling mechanism.
+
+[vector_table]: https://developer.arm.com/docs/dui0552/latest/the-cortex-m3-processor/exception-model/vector-table
+
+If you are curious about how the program ended with this particular memory layout look at the linker
+scripts in the `target` directory -- these scripts instruct the linker where to place things.
+
+``` console
+$ # list of linker scripts
+$ find target -name '*.x'
+target/thumbv7m-none-eabi/release/build/app-4c6a87e0e5f739ae/out/memory.x
+target/thumbv7m-none-eabi/release/build/cortex-m-rt-4f13cf879b7980df/out/link.x
+```
+
+You can also visualize the exact linker command `rustc` used to link the binary by running the
+following command:
+
+``` console
+$ xargo rustc --target $TARGET --release -- -Z print-link-args
+"arm-none-eabi-ld" "-L" (..)
+```
+
+### Flash and debug
+
+To flash the program into the microcontroller we must first start OpenOCD. OpenOCD will connect to
+the SWD programmer (built into the NUCLEO-F401RE board; for the blue-pill you'll need an external
+one) and start a GDB server.
+
+``` console
+$ # for the blue-pill
+$ openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg
+
+$ # for the NUCLE-F401RE
+$ openocd -f interface/stlink-v2-1.cfg -f target/stm32f4x.cfg
+```
+
+You should see some output like this:
+
+``` console
+Open On-Chip Debugger 0.10.0
+Licensed under GNU GPL v2
+For bug reports, read
+        http://openocd.org/doc/doxygen/bugs.html
+Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
+Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
+adapter speed: 2000 kHz
+adapter_nsrst_delay: 100
+none separate
+Info : Unable to match requested speed 2000 kHz, using 1800 kHz
+Info : Unable to match requested speed 2000 kHz, using 1800 kHz
+Info : clock speed 1800 kHz
+Info : STLINK v2 JTAG v27 API v2 SWIM v15 VID 0x0483 PID 0x374B
+Info : using stlink api v2
+Info : Target voltage: 3.268993
+Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints
+```
+
+You should definitively get the last line -- maybe with some different numbers -- if you don't that
+indicates a problem: it could be a connection problem, or you could have used the wrong
+configuration file.
+
+The program will block. That's OK. Leave it running.
+
+Apart from the GDB server OpenOCD also starts a telnet server. You can connect to this server and
+issue commands to the SWD programmer.
+
+``` console
+$ telnet localhost 4444
+
+> # this is the telnet propmt
+
+> # the following command will reset the microcontroller and halt the processor
+
+> reset halt
+adapter speed: 1800 kHz
+target halted due to debug-request, current mode: Thread
+xPSR: 0x01000000 pc: 0x08000188 msp: 0x20018000
+
+> exit
+```
+
+The documentation of these commands is [here][openocd-commands].
+
+[openocd-commands]: http://openocd.org/doc/html/General-Commands.html
+
+With OpenOCD working now we can flash and debug the program using GDB.
+
+``` console
+$ # enable .gdbinit files
+$ echo 'add-auto-load-safe-path /' >> ~/.gdbinit
+
+$ arm-none-eabi-gdb target/$TARGET/debug/app
+
+(gdb) # this is the GDB shell
+```
+
+The processor will be halted at the entry point. You can print the source code that the processor is
+about to execute using the `list` command:
+
+``` console
+(gdb) # source code
+(gdb) list
+331     ///
+332     /// This is the entry point of all programs
+333     #[cfg(target_arch = "arm")]
+334     #[link_section = ".reset_handler"]
+335     unsafe extern "C" fn reset_handler() -> ! {
+336         r0::zero_bss(&mut _sbss, &mut _ebss);
+337         r0::init_data(&mut _sdata, &mut _edata, &_sidata);
+338
+339         match () {
+340             #[cfg(not(has_fpu))]
+```
+
+We can skip to our program `main` by creating a breakpoint and then calling `continue`.
+
+``` console
+(gdb) break app::main
+Breakpoint 1 at 0x800045c: file src/main.rs, line 18.
+
+(gdb) continue
+Continuing.
+Note: automatically using hardware breakpoints for read-only addresses.
+
+Breakpoint 1, app::main () at src/main.rs:18
+18          let mut stdout = hio::hstdout().unwrap();
+```
+
+We are now in `main` we can execute each line of code in this function be repeatedly calling the
+`next` command.
+
+``` console
+(gdb) next
+19          writeln!(stdout, "Hello, world!").unwrap();
+
+(gdb) next
+20      }
+```
+
+After executing `writeln!` you should see "Hello, world!" printed *on the OpenOCD console*.
+
+``` console
+$ openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg
+(..)
+Info : halted: PC: 0x08000aee
+Hello, world!
+Info : halted: PC: 0x0800049c
+(..)
+```
+
+One more thing we can do here is to reset the microcontroller using the `monitor` command. `monitor`
+will forward the command to the telnet server.
+
+``` console
+(gdb) monitor reset halt
+target halted due to debug-request, current mode: Thread
+xPSR: 0x01000000 pc: 0x08000400 msp: 0x20005000, semihosting
+```
+
+This is the same command we ran before from the `telnet` prompt.
+
+You can find the list of all the GDB commands [here][gdb-commands].
+
+Note that semihosting is *very slow*. Each write operation takes *hundreds* of milliseconds; the
+processor will be in a halted state for the duration of the write operation. Semihosting is nice
+because it requires no extra wiring or stream but it's only appropriate for simple programs where
+timing is not a concern.
+
+### Device specific program
+
+Let's replace that weird `INTERRUPTS` + `default_handler` with something proper. Change
+`src/main.rs` to:
+
+``` rust
+#![no_std]
+
+extern crate cortex_m_semihosting;
+extern crate stm32f103xx; // heads up! use `stm32f40x` for the NUCLEO-401RE
+
+use core::fmt::Write;
+
+use cortex_m_semihosting::hio;
+
+fn main() {
+    // get a handle to the *host* standard output
+    let mut stdout = hio::hstdout().unwrap();
+
+    // write "Hello, world!" to it
+    writeln!(stdout, "Hello, world!").unwrap();
+}
+```
+
+What we have done here is replace the *generic* vector table with one tailored for the device we
+are targeting. Note that `cortex-m-rt` is gone; that crate is now provided by the device crate.
+
+Before we can compile this we have to tell Cargo where to get the device crate from. This info goes
+in the Cargo.toml file:
+
+``` console
+$ $EDITOR Cargo.toml
+
+$ cat Cargo.toml
+# ..
+
+# for the blue-pill (NOTE use this dependency or the other but not both)
+[dependencies.stm32f103xx]
+features = ["rt"] # this feature indicates that the device crate will provide the vector table
+version = "0.7.5"
+
+# for the blue-pill (NOTE use this dependency or the other but not both)
+[dependencies.stm32f40x]
+features = ["rt"] # see comment above
+git = "https://gitlab.henriktjader.com/pln/STM32F40x"
+
+# ..
+```
+
+You should now be able to compile the program again.
+
+``` console
+$ xargo build --target $TARGET --release
+
+$ arm-none-eabi-size -Ax target/$TARGET/release/app
+section                size         addr
+.vector_table         0x130    0x8000000
+.text                 0x944    0x8000130
+.rodata                0xfc    0x8000a74
+.bss                    0x0   0x20000000
+.data                   0x0   0x20000000
+```
+
+If you are careful observer you probably have noticed that the `.vector_table` is now smaller.
+All the interrupts of a device are listed in the vector table and each device has a different number
+of interrupts thus the size of the vector table will vary according to the device.
+
+In the original program we were using a "generic" vector table that assumed that the device had 240
+interrupts -- that's the maximum number of interrupts a device can have but devices usually have way
+less interrupts.
+
+### Bonus: setting a default target
+
+So far we have always been calling Xargo with the `--target` flag. We can skip that by setting a
+default target in `.cargo/config`.
+
+``` console
+$ cat >>.cargo/config <<EOF
+[build]
+target = "$TARGET"
+EOF
+```
+
+Now you can build your program by simply calling `xargo build` or `xargo build --release`.
+
+## Transitioning to Visual Code Studio
+
+> **NOTE** Here I assume that you have already installed the [vscode-rust] plugin.
+
+[vscode-rust]: https://github.com/editor-rs/vscode-rust
+
+First some cleanup:
+
+- Terminate any open GDB clients connected to the OpenOCD GDB server.
+
+- Terminate the OpenOCD process.
+
+- Remove, or rename, the local `.gdbinit` file.
+
+Now open the `app` folder with VSCode.
+
+``` console
+$ code .
+```
+
+### Formatting
+
+You can enable format on save by adding `"editor.formatOnSave": true` to the User settings which you
+can open hitting `Ctrl + ,`
+
+### Build task
+
+You make the build task work with Cortex-M projects you'll have to tweak the default build task.
+Pick from the menu: `Tasks > Configure Tasks...` then pick `Rust: cargo build`. In `tasks.json`
+write:
+
+``` js
+{
+    "version": "2.0.0",
+    "tasks": [
+        {
+            "type": "shell",
+            "taskName": "xargo build",
+            "command": "xargo",
+            "args": [
+                "build"
+            ],
+            "problemMatcher": [
+                "$rustc"
+            ]
+        }
+    ]
+}
+```
+
+Now pick from the menu: `Tasks > Configure Default Build Task...` and pick `xargo build`.
+
+Now you should be able to build your project by picking `Tasks > Run Build Task...` from the menu or
+by hitting the shorcut `Ctrl + Shift + B`.
+
+![Build task](/assets/vscode-build.png)
+
+### Debugging
+
+You'll need to configure Native Debug to work with embedded projects. Pick `Debug > Open
+Configurations` from the menu, pick `GDB` from the drop down menu and then write this into
+`launch.json`.
+
+``` js
+{
+    "configurations": [
+        {
+            "autorun": [
+                "monitor arm semihosting enable",
+                "load",
+                "break app::main" // Heads up: crate name
+            ],
+            "cwd": "${workspaceRoot}",
+            "gdbpath": "arm-none-eabi-gdb",
+            "executable": "./target/thumbv7m-none-eabi/debug/app", // Heads up: target name
+            "name": "Debug",
+            "remote": true,
+            "request": "attach",
+            "target": ":3333",
+            "type": "gdb"
+        }
+    ],
+    "version": "0.2.0"
+}
+```
+
+Now you should be able to debug your program by pressing `F5`. Note that (a) you have to build the
+program first (e.g. by pressing `Ctrl + Shift + B`) and that (b) the debugger will execute your
+program right after flashing the device so you'll always need at least one breakpoint.
+
+![Debug session](/assets/vscode-debug.png)