summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Albers <thomas@thomaslabs.org>2023-03-08 23:43:00 +0100
committerThomas Albers <thomas@thomaslabs.org>2023-03-08 23:43:00 +0100
commit61b5ce20f25c5785e41574998a12c6d06eb05a5e (patch)
tree20e2225b4f30b15d8dee30351041d1f33d42b34a
parent561bac75579391c14e47eaccfabdf9eda98855da (diff)
Restructure build system and directory structuresHEADmaster
-rw-r--r--.gitignore4
-rw-r--r--Makefile15
-rw-r--r--math/index.org13
-rw-r--r--math/integrals.org20
-rw-r--r--math/math.css85
-rw-r--r--math_options.org39
-rw-r--r--options.org2
-rwxr-xr-xpublish.el205
-rwxr-xr-xrun.sh2
-rw-r--r--server/lighttpd.conf62
-rw-r--r--server/mime.conf1369
-rw-r--r--server/modules.conf9
-rw-r--r--site/DejaVuSans.woff2bin0 -> 257460 bytes
-rw-r--r--site/css/math.css41
-rw-r--r--site/css/style.css166
-rw-r--r--site/img/programmer_side.pngbin0 -> 1827240 bytes
-rw-r--r--site/img/programmer_top.pngbin0 -> 2969390 bytes
-rw-r--r--site/img/prototype1.jpgbin0 -> 2988593 bytes
-rw-r--r--site/img/prototype2_1.jpgbin0 -> 3079552 bytes
-rw-r--r--site/img/prototype2_2.jpgbin0 -> 3509082 bytes
-rw-r--r--site/robots.txt2
-rw-r--r--site/sitemap26
-rw-r--r--site/thomas.pub1
-rw-r--r--src/abgabe.org101
-rw-r--r--src/arm/adventures.org58
-rw-r--r--src/math/cylindrical_coordinates.org (renamed from math/cylindrical_coordinates.org)11
-rw-r--r--src/math/derivatives.org (renamed from math/derivatives.org)21
-rw-r--r--src/math/diff.org100
-rw-r--r--src/math/fft.org141
-rw-r--r--src/math/index.org19
-rw-r--r--src/math/integrals.org35
-rw-r--r--src/math/lagrange.org23
-rw-r--r--src/math/laplace.org39
-rw-r--r--src/math/levi_cevita.org (renamed from math/levi_cevita.org)7
-rw-r--r--src/math/matrices.org (renamed from math/matrices.org)9
-rw-r--r--src/math/orbit.org (renamed from math/orbit.org)46
-rw-r--r--src/math/polar_coordinates.org (renamed from math/polar_coordinates.org)10
-rw-r--r--src/math/spherical-harmonics.org119
-rw-r--r--src/math/spherical_coordinates.org (renamed from math/spherical_coordinates.org)11
-rw-r--r--src/math/trigonometry.org (renamed from math/trigonometry.org)12
-rw-r--r--src/math/variation.org19
-rw-r--r--src/math/vectors.org (renamed from math/vectors.org)6
-rw-r--r--src/physics/lorentz-transformation.org62
-rw-r--r--src/style.css123
-rw-r--r--src/svg/fft.tex44
-rw-r--r--src/z80/prototype1.org2
-rw-r--r--src/z80/prototype2.org4
-rw-r--r--template.el0
48 files changed, 2575 insertions, 508 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..36698df
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+site/**/*.html
+site/img-small/*
+site/svg/*
+build/*
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..c2399c7
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,15 @@
+all :
+ find site -name "*.html" -printf "https://thomaslabs.org/%P\n" > site/sitemap
+
+.PHONY : svg
+svg :
+ latex -output-directory build -interaction nonstopmode src/svg/fft.tex
+ dvisvgm build/fft.dvi --no-fonts --exact-bbox --output=site/svg/fft.svg
+
+.PHONY : clean
+clean :
+ rm -rf site/svg/* site/img-small site/math site/programs site/z80 site/index.html site/privacy.html site/arm site/sitemap
+
+.PHONY : upload
+upload :
+ rsync -Pa --delete "site/" "thomas@gamma:/srv/web/thomaslabs/"
diff --git a/math/index.org b/math/index.org
deleted file mode 100644
index 069c4b6..0000000
--- a/math/index.org
+++ /dev/null
@@ -1,13 +0,0 @@
-#+TITLE: Math and Physics articles
-#+SETUPFILE: ../math_options.org
-
-- [[file:vectors.org][Cross Product]]
-- [[file:cylindrical_coordinates.org][Cylindrical Coordinates]]
-- [[file:matrices.org][Matrix Properties]]
-- [[file:orbit.org][Orbit]]
-- [[file:polar_coordinates.org][Polar Coordinates]]
-- [[file:spherical_coordinates.org][Spherical Coordinates]]
-- [[file:derivatives.org][Table of Derivatives]]
-- [[file:integrals.org][Table of Integrals]]
-- [[file:levi_cevita.org][The Levi Cevita Symbol]]
-- [[file:trigonometry.org][Trigonometric identities]] \ No newline at end of file
diff --git a/math/integrals.org b/math/integrals.org
deleted file mode 100644
index 6a32903..0000000
--- a/math/integrals.org
+++ /dev/null
@@ -1,20 +0,0 @@
-#+TITLE:Table of Integrals
-#+SETUPFILE: ../math_options.org
-#+LATEX_HEADER: \usepackage{bm}
-#+LATEX_HEADER: \usepackage{mathtools}
-#+LATEX_HEADER: \newcommand{\intg}[2]{\int #1 \text{d}x &= #2 + C}
-
-* Disclaimer
-This site as of now just a technology demonstration and its claims
-should not be taken as true (even though I myself am pretty confident
-they are)
-
-* Trigonometric Funtions
-\begin{align*}
-\intg{\sin(x)}{-\cos(x)}\\
-\intg{\cos(x)}{\sin(x)}\\
-\intg{\tan(x)}{-\ln(\cos(x))}\\
-\intg{\sec(x)}{\ln(\sec(x) + \tan(x))}\\
-\intg{\csc(x)}{-\ln(\csc(x) + \cot(x))}\\
-\intg{\cot(x)}{\ln(\sin(x))}
-\end{align*}
diff --git a/math/math.css b/math/math.css
deleted file mode 100644
index d4e1054..0000000
--- a/math/math.css
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
-p.author
-p.date
-p.creator
-.title
-.subtitle
-.todo
-.done
-.WAITING
-.timestamp
-.timestamp-kwd
-.timestamp-wrapper
-.tag
-._HOME
-.target
-.linenr
-.code-highlighted
-div.outline-N
-div.outline-text-N
-.section-number-N
-.figure-number
-.table-number
-.listing-number
-div.figure
-pre.src
-pre.example
-p.verse
-div.footnotes
-p.footnote
-.footref
-.footnum
-.org-svg
-*/
-
-html {
- height: 100%;
- color: #cccccc;
- background-color: hsl(240, 30%, 10%);
-}
-
-body {
- margin: auto;
- max-width: 64em;
- min-height: 100%;
- display: flex;
- flex-direction: column;
- background-color: hsl(240, 30%, 15%);
-}
-
-main {
- padding: 2em 2em 2em 2em;
- flex-grow: 1;
-}
-
-h1 {
- text-align: center;
-}
-
-#content {
- max-width: 50em;
- margin: auto;
-}
-
-div.outline-2:first-of-type {
- padding: 0.25em 1em;
- background-color: hsl(60,30%,30%);
-}
-
-.equation-container {
- display: block;
- padding: 1em 2em;
- background-color: hsl(240, 30%, 20%);
- overflow: auto;
- border: 1px solid hsl(240, 30%, 50%)
-}
-
-img {
- max-width: unset;
-}
-
-.equation-container img {
- object-fit: contain;
- display: block;
- margin: auto;
-}
diff --git a/math_options.org b/math_options.org
index 5fd9baa..75cde25 100644
--- a/math_options.org
+++ b/math_options.org
@@ -1,5 +1,34 @@
-#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="/style.css" />
-#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="/math.css" />
-#+HTML_HEAD_EXTRA: <meta name="author" content="Thomas Albers Raviola">
-#+HTML_HEAD_EXTRA: <meta name="description" content="Hobbyist electronics, programming and more">
-#+MACRO: date_place $1, $2, {{{date(%B %d\, %Y)}}}
+#+html_head: <link rel="stylesheet" type="text/css" href="/css/style.css" />
+#+html_head: <link rel="stylesheet" type="text/css" href="/css/math.css" />
+#+html_head_extra: <meta name="author" content="Thomas Albers Raviola">
+#+html_head_extra: <meta name="description" content="Hobbyist electronics, programming and more">
+
+#+macro: date_place $1, $2, {{{date(%B %d\, %Y)}}}
+
+#+macro: beg-eqn \begin{equation*}
+#+macro: end-eqn \end{equation*}
+
+#+macro: beg-align \begin{align*}
+#+macro: end-align \end{align*}
+
+#+macro: ref
+
+#+latex_header: \usepackage{bm}
+#+latex_header: \usepackage{amssymb}
+
+#+latex_header: \newcommand{\deriv}[2]{\frac{\text{d}#1}{\text{d}#2}}
+#+latex_header: \newcommand{\pderiv}[2]{\frac{\partial{}#1}{\partial{}#2}}
+#+latex_header: \newcommand{\unitv}[1]{\bm{\hat{e}}_#1}
+#+latex_header: \newcommand{\dcoff}[1]{\frac{\text{d}}{\text{d}x} #1}
+#+latex_header: \newcommand{\sdcoff}[1]{\frac{\text{d}#1}{\text{d}x}}
+
+#+latex_header: \newcommand{\ddx}[2]{\frac{\text{d}}{\text{d}x} #1}
+#+latex_header: \newcommand{\intg}[2]{\int #1 \text{d}x &= #2 + C}
+#+latex_header: \newcommand{\D}[1]{\text{d}#1}
+
+#+latex_header: \DeclareMathOperator\arsinh{arsinh}
+#+latex_header: \DeclareMathOperator\arcosh{arcosh}
+#+latex_header: \DeclareMathOperator\artanh{artanh}
+#+latex_header: \DeclareMathOperator\arcoth{arcoth}
+#+latex_header: \DeclareMathOperator\arsech{arsech}
+#+latex_header: \DeclareMathOperator\arcsch{arcsch}
diff --git a/options.org b/options.org
index 234c394..3434526 100644
--- a/options.org
+++ b/options.org
@@ -1,4 +1,4 @@
-#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="/style.css" />
+#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="/css/style.css" />
#+HTML_HEAD_EXTRA: <meta name="author" content="Thomas Albers Raviola">
#+HTML_HEAD_EXTRA: <meta name="description" content="Hobbyist electronics, programming and more">
#+MACRO: date_place $1, $2, {{{date(%B %d\, %Y)}}}
diff --git a/publish.el b/publish.el
index a327d02..6786c7d 100755
--- a/publish.el
+++ b/publish.el
@@ -15,6 +15,8 @@
"programs"))
(li (a (@ (href "/math/"))
"math"))
+ (li (a (@ (href "https://git.thomaslabs.org"))
+ "git"))
(li (a (@ (href "/privacy.html"))
"contact &amp; privacy policy"))))))
@@ -22,7 +24,7 @@
(sxml-to-xml
`(footer
(p
- "Copyright © 2021 - 2022 Thomas Albers Raviola"
+ "Copyright © 2021 - 2023 Thomas Albers Raviola"
(br)
"This website and its contents are published under the
following licences, unless otherwise specified"
@@ -51,9 +53,14 @@ following licences, unless otherwise specified"
,(org-html--build-head info))
(body
,(if-let ((title (plist-get info :title)))
- `(header
- (p "Thomas' Labs")
- (h1 ,(org-export-data title info)))
+ (let ((subtitle (plist-get info :subtitle)))
+ `(header
+ (div "Thomas' Labs")
+ (h1 ,(org-export-data title info))
+ ,@(if subtitle
+ `((div (@ (class "subtitle"))
+ ,(car subtitle)))
+ '())))
`(header
(h1 "Thomas' Labs")))
,(thomaslabs-navbar)
@@ -72,7 +79,8 @@ should not be taken as true (even though I myself am pretty confident
they are"))))
(defun math-sitemap (title entries)
- (concat (format "#+TITLE: %s\n#+SETUPFILE: ../math_options.org\n\n" title)
+ (concat "#+title: " title "\n"
+ "#+setupfile: ../../math_options.org\n\n"
(org-list-to-org entries)))
@@ -82,7 +90,6 @@ they are"))))
description))
(defun org-img-link-export (link description format info)
- (message "%s" info)
(format "<a href=\"%s\">%s</a>"
link
description))
@@ -98,6 +105,18 @@ they are"))))
:follow #'org-local-link-follow
:export #'org-img-link-export)
+(defvar root-dir (expand-file-name ""))
+
+(defun org-export-file-uri (filename)
+ "Return file URI associated to FILENAME."
+ (cond ((not (file-name-absolute-p filename))
+ (string-remove-prefix "site" filename))
+ ((string-suffix-p ".jpg" filename)
+ (concat "/img-small" (string-remove-prefix "/img" filename)))
+ (t
+ (string-remove-prefix (concat root-dir "/site")
+ (expand-file-name filename)))))
+
(org-export-define-derived-backend 'thomaslabs-html 'html
:translate-alist
'((template . thomaslabs-template)))
@@ -110,96 +129,112 @@ they are"))))
plist
pub-dir))
-(setq org-publish-project-alist
- `(("thomaslabs_html"
- :base-directory "~/Code/websites/thomaslabs/src"
- :publishing-directory "/srv/web/thomaslabs"
- :publishing-function thomaslabs-publish-to-html
- :with-toc nil
- :recursive t
+(defun image-dimensions (pathname)
+ (with-temp-buffer
+ (call-process "identify" nil (current-buffer) nil
+ "-ping" "-format" "%wx%h" pathname)
+ (mapcar #'cl-parse-integer (split-string (buffer-string) "x"))))
+
+(defun resize-image (factor input output)
+ (let ((percentage (format "%.01f%%" (* 100.0 factor))))
+ (call-process "convert" nil nil nil input "-resize" percentage output)))
+
+(defun thomaslabs-publish-image (_plist filename pub-dir)
+ (unless (file-directory-p pub-dir)
+ (make-directory pub-dir t))
+ (let ((output (expand-file-name (file-name-nondirectory filename) pub-dir)))
+ (unless (file-equal-p (expand-file-name (file-name-directory filename))
+ (file-name-as-directory (expand-file-name pub-dir)))
+ (let* ((dimensions (image-dimensions filename))
+ (width (cl-first dimensions))
+ (height (cl-second dimensions))
+ (factor (min (/ 800.0 width) (/ 800.0 height) 1.0)))
+ (resize-image factor filename output)))
+ ;; Return file name.
+ output))
+
+(defun org-html--wrap-latex-environment (contents _ &optional caption label)
+ "Wrap CONTENTS string within appropriate environment for equations.
+When optional arguments CAPTION and LABEL are given, use them for
+caption and \"id\" attribute."
+ (format "\n<div%s class=\"equation-container\">\n%s%s\n</div>"
+ ;; ID.
+ (if (org-string-nw-p label) (format " id=\"%s\"" label) "")
+ ;; Contents.
+ (format "<span class=\"equation\">\n%s\n</span>" contents)
+ ;; Caption.
+ (if (not (org-string-nw-p caption)) ""
+ (format "\n<span class=\"equation-label\">(%s)</span>"
+ caption))))
+
+(defvar default-html-project-properties
+ '(:publishing-function thomaslabs-publish-to-html
+ :with-toc nil
+ :recursive nil
+
+ :language "en_US"
+ :html-head-include-default-style nil
+ :html-head-include-scripts nil
+ :html-preamble nil
+ :html-postamble nil
+ :html-use-infojs nil
+ :html-html5-fancy t
+ :html-doctype "html5"
+ :with-toc nil
+ :section-numbers nil
+ :with-latex dvisvgm))
- :language "en_US"
-
- :html-head-include-default-style nil
- :html-head-include-scripts nil
- :html-preamble nil
- :html-postamble nil
- :html-use-infojs nil
- :html-html5-fancy t
- :html-doctype "html5"
- :with-toc nil
- :section-numbers nil
- :with-latex dvisvgm)
-
- ("math_html"
- :base-directory "~/Code/websites/thomaslabs/math"
- :publishing-directory "/srv/web/thomaslabs/math"
+(setq org-publish-project-alist
+ `(("root"
+ :base-directory "src"
+ :publishing-directory "site"
+ ,@default-html-project-properties)
+ ("arm"
+ :base-directory "src/arm"
+ :publishing-directory "site/arm"
+ ,@default-html-project-properties
+ :recursive t)
+ ("programs"
+ :base-directory "src/programs"
+ :publishing-directory "site/programs"
+ ,@default-html-project-properties
+ :recursive t)
+ ("z80"
+ :base-directory "src/z80"
+ :publishing-directory "site/z80"
+ ,@default-html-project-properties
+ :recursive t)
+
+ ("math"
+ :base-directory "src/math"
+ :publishing-directory "site/math"
:publishing-function thomaslabs-publish-to-html
- :with-toc nil
- :recursive t
+ ,@(org-plist-delete default-html-project-properties :html-preamble)
- :language "en_US"
-
- :html-head-include-default-style nil
- :html-head-include-scripts nil
:html-preamble math-preamble
- :html-postamble nil
- :html-use-infojs nil
- :html-html5-fancy t
- :html-doctype "html5"
- :with-toc nil
:auto-sitemap t
:sitemap-filename "index.org"
:sitemap-title "Math and Physics articles"
- :sitemap-function math-sitemap
-
- :section-numbers nil
- :with-latex dvisvgm)
-
- ("math_svg"
- :base-directory "~/Code/websites/thomaslabs/math/ltximg"
- :base-extension "svg"
- :publishing-directory "/srv/web/thomaslabs/math/ltximg"
- :publishing-function org-publish-attachment)
-
- ("math_css"
- :base-directory "~/Code/websites/thomaslabs/math"
- :base-extension "css"
- :publishing-directory "/srv/web/thomaslabs"
- :publishing-function org-publish-attachment)
-
- ("thomaslabs_css"
- :base-directory "~/Code/websites/thomaslabs/src"
- :base-extension "css"
- :publishing-directory "/srv/web/thomaslabs"
- :publishing-function org-publish-attachment)
-
- ("thomaslabs_media"
- :base-directory "~/Code/websites/thomaslabs/media"
- :base-extension "jpg\\|gif\\|png"
- :publishing-directory "/srv/web/thomaslabs/media"
- :publishing-function org-publish-attachment)
+ :sitemap-function math-sitemap)
- ("thomaslabs"
- :components ("thomaslabs_html"
- "thomaslabs_media"
- "thomaslabs_css"))
+ ("img"
+ :base-directory "site/img"
+ :publishing-directory "site/img-small"
+ :base-extension "png\\|jpg\\|gif"
+ :recursive t
+ :publishing-function thomaslabs-publish-image)
- ("thomaslabs_math"
- :components ("math_html"
- "math_css"
- "math_svg"))))
-(plist-put org-format-latex-options :html-foreground "#cccccc")
+ ("thomaslabs"
+ :components ("root" "arm" "programs" "z80" "math" "img"))))
-(org-publish "thomaslabs" t)
-(org-publish "thomaslabs_math" t)
+;; (plist-put org-format-latex-options :html-foreground "#cccccc")
+(plist-put org-format-latex-options :html-foreground "#000000")
-;; (let ((opt "--delete -Prlpte 'ssh -p 1764'")
-;; (src "'/srv/web/thomaslabs/'")
-;; (dst "'root@thomaslabs.org:/var/www/math/'"))
-;; (call-process-shell-command (format "rsync %s %s %s" opt src dst)))
+(setq org-publish-timestamp-directory (concat (getenv "XDG_CACHE_HOME") "/org-timestamps/"))
+(setq org-preview-latex-image-directory (expand-file-name "site/svg"))
+(setq org-html-htmlize-output-type 'css)
-;; (org-publish "thomaslabs" t)
-;; (org-publish "math_svg" t)
+(org-publish "thomaslabs" t)
+;; fork ox-html?
diff --git a/run.sh b/run.sh
new file mode 100755
index 0000000..6c745b4
--- /dev/null
+++ b/run.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+lighttpd -f server/lighttpd.conf -D
diff --git a/server/lighttpd.conf b/server/lighttpd.conf
new file mode 100644
index 0000000..181f2c6
--- /dev/null
+++ b/server/lighttpd.conf
@@ -0,0 +1,62 @@
+var.log_root = env.HOME + "/.local/share/lighttpd"
+var.server_root = env.PWD + "/site"
+var.state_dir = "/tmp"
+var.home_dir = "/tmp"
+var.conf_dir = env.PWD + "/server"
+
+var.cache_dir = env.HOME + "/.cache/lighttpd"
+var.socket_dir = home_dir + "/sockets"
+
+server.modules = (
+ "mod_access",
+ "mod_fastcgi",
+ "mod_scgi",
+ "mod_accesslog"
+)
+
+fastcgi.debug = 1
+fastcgi.server = (
+ ".cgi" => ((
+ "host" => "127.0.0.1",
+ "port" => "9000",
+ "check-local" => "disable"
+ )))
+
+server.bind = "0.0.0.0"
+server.port = 8080
+server.document-root = server_root
+server.pid-file = state_dir + "/lighttpd.pid"
+
+server.errorlog = log_root + "/error.log"
+accesslog.filename = log_root + "/access.log"
+
+server.max-fds = 1024
+
+index-file.names += (
+ "index.html"
+)
+
+url.access-deny = ( "~", ".inc" )
+
+static-file.exclude-extensions = ( ".cgi", ".fcgi", ".scgi" )
+
+include conf_dir + "/mime.conf"
+
+dir-listing.exclude = ( "~$" )
+dir-listing.encoding = "UTF-8"
+
+## This time we launch the rails application via scgi_rails externally.
+##
+#$HTTP["host"] == "rails2.example.com" {
+# server.document-root = server_root + "/rails/someapp/public"
+# server.error-handler-404 = "/dispatch.scgi"
+# scgi.server = ( ".scgi" =>
+# ( "scgi-tcp" =>
+# (
+# "host" => "127.0.0.1",
+# "port" => 9998,
+# "check-local" => "disable",
+# )
+# )
+# )
+#}
diff --git a/server/mime.conf b/server/mime.conf
new file mode 100644
index 0000000..6daffd6
--- /dev/null
+++ b/server/mime.conf
@@ -0,0 +1,1369 @@
+# created by create-mime.conf.pl
+
+#######################################################################
+##
+## MimeType handling
+## -------------------
+##
+## https://redmine.lighttpd.net/projects/lighttpd/wiki/Mimetype_assignDetails
+
+##
+## mimetype.xattr-name
+## Set the extended file attribute name used to obtain mime type
+## (must also set mimetype.use-xattr = "enable")
+##
+## Default value is "Content-Type"
+##
+## freedesktop.org Shared MIME-info Database specification suggests
+## user-defined value ("user.mime_type") as name for extended file attribute
+#mimetype.xattr-name = "user.mime_type"
+
+##
+## Use extended attribute named in mimetype.xattr-name (default "Content-Type")
+## to obtain mime type if possible
+##
+## Disabled by default
+##
+#mimetype.use-xattr = "enable"
+
+##
+## mimetype ("Content-Type" HTTP header) mapping for static file handling
+##
+## The first matching suffix is used. If no mapping is found
+## 'application/octet-stream' is used, and caching (etag/last-modified handling)
+## is disabled to prevent clients from caching "unknown" mime types.
+##
+## Therefore the last mapping is:
+## "" => "application/octet-stream"
+## This matches all extensions and acts as default mime type, and enables
+## caching for those.
+mimetype.assign = (
+ ".sarif.json" => "application/sarif+json",
+ ".sarif-external-properties.json" => "application/sarif-external-properties+json",
+ ".1905.1" => "application/vnd.ieee.1905",
+ ".tar.bz2" => "application/x-gtar-compressed",
+ ".tar.gz" => "application/x-gtar-compressed",
+ ".a2l" => "application/A2L",
+ ".aml" => "application/AML",
+ ".atf" => "application/ATF",
+ ".atfx" => "application/ATFX",
+ ".atxml" => "application/ATXML",
+ ".cdfx" => "application/CDFX+XML",
+ ".cea" => "application/CEA",
+ ".dcd" => "application/DCD",
+ ".dii" => "application/DII",
+ ".dit" => "application/DIT",
+ ".lxf" => "application/LXF",
+ ".mf4" => "application/MF4",
+ ".oda" => "application/ODA",
+ ".odx" => "application/ODX",
+ ".pdx" => "application/PDX",
+ ".ez" => "application/andrew-inset",
+ ".atom" => "application/atom+xml",
+ ".atomcat" => "application/atomcat+xml",
+ ".atomdeleted" => "application/atomdeleted+xml",
+ ".atomsvc" => "application/atomsvc+xml",
+ ".dwd" => "application/atsc-dwd+xml",
+ ".held" => "application/atsc-held+xml",
+ ".rsat" => "application/atsc-rsat+xml",
+ ".apxml" => "application/auth-policy+xml",
+ ".xdd" => "application/bacnet-xdd+zip",
+ ".xcs" => "application/calendar+xml",
+ ".cbor" => "application/cbor",
+ ".c3ex" => "application/cccex",
+ ".ccmp" => "application/ccmp+xml",
+ ".ccxml" => "application/ccxml+xml",
+ ".cdmia" => "application/cdmi-capability",
+ ".cdmic" => "application/cdmi-container",
+ ".cdmid" => "application/cdmi-domain",
+ ".cdmio" => "application/cdmi-object",
+ ".cdmiq" => "application/cdmi-queue",
+ ".cellml" => "application/cellml+xml",
+ ".cml" => "application/cellml+xml",
+ ".1clr" => "application/clr",
+ ".cmsc" => "application/cms",
+ ".cpl" => "application/cpl+xml",
+ ".csrattrs" => "application/csrattrs",
+ ".mpd" => "application/dash+xml",
+ ".mpdd" => "application/dashdelta",
+ ".davmount" => "application/davmount+xml",
+ ".dcm" => "application/dicom",
+ ".xmls" => "application/dskpp+xml",
+ ".dssc" => "application/dssc+der",
+ ".xdssc" => "application/dssc+xml",
+ ".dvc" => "application/dvcs",
+ ".es" => "application/ecmascript",
+ ".efi" => "application/efi",
+ ".emma" => "application/emma+xml",
+ ".emotionml" => "application/emotionml+xml",
+ ".epub" => "application/epub+zip",
+ ".exi" => "application/exi",
+ ".finf" => "application/fastinfoset",
+ ".fdt" => "application/fdt+xml",
+ ".pfr" => "application/font-tdpfr",
+ ".geojson" => "application/geo+json",
+ ".gpkg" => "application/geopackage+sqlite3",
+ ".glbin" => "application/gltf-buffer",
+ ".glbuf" => "application/gltf-buffer",
+ ".gml" => "application/gml+xml",
+ ".gz" => "application/gzip",
+ ".tgz" => "application/gzip",
+ ".stk" => "application/hyperstudio",
+ ".ink" => "application/inkml+xml",
+ ".inkml" => "application/inkml+xml",
+ ".ipfix" => "application/ipfix",
+ ".its" => "application/its+xml",
+ ".jrd" => "application/jrd+json",
+ ".json" => "application/json",
+ ".json-patch" => "application/json-patch+json",
+ ".jsonld" => "application/ld+json",
+ ".lgr" => "application/lgr+xml",
+ ".wlnk" => "application/link-format",
+ ".lostxml" => "application/lost+xml",
+ ".lostsyncxml" => "application/lostsync+xml",
+ ".lpf" => "application/lpf+zip",
+ ".hqx" => "application/mac-binhex40",
+ ".cpt" => "application/mac-compactpro",
+ ".mads" => "application/mads+xml",
+ ".mrc" => "application/marc",
+ ".mrcx" => "application/marcxml+xml",
+ ".ma" => "application/mathematica",
+ ".mb" => "application/mathematica",
+ ".nb" => "application/mathematica",
+ ".mml" => "application/mathml+xml",
+ ".mbox" => "application/mbox",
+ ".metalink" => "application/metalink+xml",
+ ".meta4" => "application/metalink4+xml",
+ ".mets" => "application/mets+xml",
+ ".h5" => "application/mipc",
+ ".maei" => "application/mmt-aei+xml",
+ ".musd" => "application/mmt-usd+xml",
+ ".mods" => "application/mods+xml",
+ ".m21" => "application/mp21",
+ ".mp21" => "application/mp21",
+ ".doc" => "application/msword",
+ ".mxf" => "application/mxf",
+ ".nq" => "application/n-quads",
+ ".nt" => "application/n-triples",
+ ".orq" => "application/ocsp-request",
+ ".ors" => "application/ocsp-response",
+ ".bin" => "application/octet-stream",
+ ".class" => "application/octet-stream",
+ ".dll" => "application/octet-stream",
+ ".exe" => "application/octet-stream",
+ ".img" => "application/octet-stream",
+ ".iso" => "application/octet-stream",
+ ".lha" => "application/octet-stream",
+ ".lzh" => "application/octet-stream",
+ ".so" => "application/octet-stream",
+ ".opf" => "application/oebps-package+xml",
+ ".ogx" => "application/ogg",
+ ".owx" => "application/owl+xml",
+ ".oxps" => "application/oxps",
+ ".relo" => "application/p2p-overlay+xml",
+ ".pdf" => "application/pdf",
+ ".pem" => "application/pem-certificate-chain",
+ ".pgp" => "application/pgp-encrypted",
+ ".sig" => "application/pgp-signature",
+ ".p10" => "application/pkcs10",
+ ".p12" => "application/pkcs12",
+ ".pfx" => "application/pkcs12",
+ ".p7c" => "application/pkcs7-mime",
+ ".p7m" => "application/pkcs7-mime",
+ ".p7s" => "application/pkcs7-signature",
+ ".p8" => "application/pkcs8",
+ ".p8e" => "application/pkcs8-encrypted",
+ ".cer" => "application/pkix-cert",
+ ".crl" => "application/pkix-crl",
+ ".pkipath" => "application/pkix-pkipath",
+ ".pki" => "application/pkixcmp",
+ ".pls" => "application/pls+xml",
+ ".ai" => "application/postscript",
+ ".eps" => "application/postscript",
+ ".ps" => "application/postscript",
+ ".provx" => "application/provenance+xml",
+ ".cw" => "application/prs.cww",
+ ".cww" => "application/prs.cww",
+ ".hpub" => "application/prs.hpub+zip",
+ ".rct" => "application/prs.nprend",
+ ".rnd" => "application/prs.nprend",
+ ".rdf-crypt" => "application/prs.rdf-xml-crypt",
+ ".xsf" => "application/prs.xsf+xml",
+ ".pskcxml" => "application/pskc+xml",
+ ".rdf" => "application/rdf+xml",
+ ".rif" => "application/reginfo+xml",
+ ".rnc" => "application/relax-ng-compact-syntax",
+ ".rl" => "application/resource-lists+xml",
+ ".rld" => "application/resource-lists-diff+xml",
+ ".rfcxml" => "application/rfc+xml",
+ ".rs" => "application/rls-services+xml",
+ ".rapd" => "application/route-apd+xml",
+ ".sls" => "application/route-s-tsid+xml",
+ ".rusd" => "application/route-usd+xml",
+ ".gbr" => "application/rpki-ghostbusters",
+ ".mft" => "application/rpki-manifest",
+ ".roa" => "application/rpki-roa",
+ ".rss" => "application/rss+xml",
+ ".rtf" => "application/rtf",
+ ".sarif" => "application/sarif+json",
+ ".sarif-external-properties" => "application/sarif-external-properties+json",
+ ".scim" => "application/scim+json",
+ ".scq" => "application/scvp-cv-request",
+ ".scs" => "application/scvp-cv-response",
+ ".spq" => "application/scvp-vp-request",
+ ".spp" => "application/scvp-vp-response",
+ ".sdp" => "application/sdp",
+ ".senmlc" => "application/senml+cbor",
+ ".senml" => "application/senml+json",
+ ".senmlx" => "application/senml+xml",
+ ".senml-etchc" => "application/senml-etch+cbor",
+ ".senml-etchj" => "application/senml-etch+json",
+ ".senmle" => "application/senml-exi",
+ ".sensmlc" => "application/sensml+cbor",
+ ".sensml" => "application/sensml+json",
+ ".sensmlx" => "application/sensml+xml",
+ ".sensmle" => "application/sensml-exi",
+ ".soc" => "application/sgml-open-catalog",
+ ".shf" => "application/shf+xml",
+ ".sieve" => "application/sieve",
+ ".siv" => "application/sieve",
+ ".cl" => "application/simple-filter+xml",
+ ".smi" => "application/smil+xml",
+ ".smil" => "application/smil+xml",
+ ".sml" => "application/smil+xml",
+ ".rq" => "application/sparql-query",
+ ".srx" => "application/sparql-results+xml",
+ ".sql" => "application/sql",
+ ".gram" => "application/srgs",
+ ".grxml" => "application/srgs+xml",
+ ".sru" => "application/sru+xml",
+ ".ssml" => "application/ssml+xml",
+ ".stix" => "application/stix+json",
+ ".swidtag" => "application/swid+xml",
+ ".tau" => "application/tamp-apex-update",
+ ".auc" => "application/tamp-apex-update-confirm",
+ ".tcu" => "application/tamp-community-update",
+ ".cuc" => "application/tamp-community-update-confirm",
+ ".ter" => "application/tamp-error",
+ ".tsa" => "application/tamp-sequence-adjust",
+ ".sac" => "application/tamp-sequence-adjust-confirm",
+ ".tur" => "application/tamp-update",
+ ".tuc" => "application/tamp-update-confirm",
+ ".jsontd" => "application/td+json",
+ ".odd" => "application/tei+xml",
+ ".tei" => "application/tei+xml",
+ ".teiCorpus" => "application/tei+xml",
+ ".tfi" => "application/thraud+xml",
+ ".tsq" => "application/timestamp-query",
+ ".tsr" => "application/timestamp-reply",
+ ".tsd" => "application/timestamped-data",
+ ".trig" => "application/trig",
+ ".ttml" => "application/ttml+xml",
+ ".gsheet" => "application/urc-grpsheet+xml",
+ ".rsheet" => "application/urc-ressheet+xml",
+ ".td" => "application/urc-targetdesc+xml",
+ ".uis" => "application/urc-uisocketdesc+xml",
+ ".vxml" => "application/voicexml+xml",
+ ".vcj" => "application/voucher-cms+json",
+ ".wasm" => "application/wasm",
+ ".wif" => "application/watcherinfo+xml",
+ ".wgt" => "application/widget",
+ ".wsdl" => "application/wsdl+xml",
+ ".wspolicy" => "application/wspolicy+xml",
+ ".xav" => "application/xcap-att+xml",
+ ".xca" => "application/xcap-caps+xml",
+ ".xdf" => "application/xcap-diff+xml",
+ ".xel" => "application/xcap-el+xml",
+ ".xer" => "application/xcap-error+xml",
+ ".xns" => "application/xcap-ns+xml",
+ ".xht" => "application/xhtml+xml",
+ ".xhtm" => "application/xhtml+xml",
+ ".xhtml" => "application/xhtml+xml",
+ ".xlf" => "application/xliff+xml",
+ ".dtd" => "application/xml-dtd",
+ ".xop" => "application/xop+xml",
+ ".xsl" => "application/xslt+xml",
+ ".xslt" => "application/xslt+xml",
+ ".mxml" => "application/xv+xml",
+ ".xhvml" => "application/xv+xml",
+ ".xvm" => "application/xv+xml",
+ ".xvml" => "application/xv+xml",
+ ".yang" => "application/yang",
+ ".yin" => "application/yin+xml",
+ ".zip" => "application/zip",
+ ".zst" => "application/zstd",
+ ".1km" => "application/vnd.1000minds.decision-model+xml",
+ ".pwn" => "application/vnd.3M.Post-it-Notes",
+ ".plb" => "application/vnd.3gpp.pic-bw-large",
+ ".psb" => "application/vnd.3gpp.pic-bw-small",
+ ".pvb" => "application/vnd.3gpp.pic-bw-var",
+ ".sms" => "application/vnd.3gpp2.sms",
+ ".tcap" => "application/vnd.3gpp2.tcap",
+ ".imgcal" => "application/vnd.3lightssoftware.imagescal",
+ ".gph" => "application/vnd.FloGraphIt",
+ ".zmm" => "application/vnd.HandHeld-Entertainment+xml",
+ ".kne" => "application/vnd.Kinar",
+ ".knp" => "application/vnd.Kinar",
+ ".sdf" => "application/vnd.Kinar",
+ ".mwf" => "application/vnd.MFER",
+ ".daf" => "application/vnd.Mobius.DAF",
+ ".dis" => "application/vnd.Mobius.DIS",
+ ".mbk" => "application/vnd.Mobius.MBK",
+ ".mqy" => "application/vnd.Mobius.MQY",
+ ".msl" => "application/vnd.Mobius.MSL",
+ ".plc" => "application/vnd.Mobius.PLC",
+ ".txf" => "application/vnd.Mobius.TXF",
+ ".qwd" => "application/vnd.Quark.QuarkXPress",
+ ".qwt" => "application/vnd.Quark.QuarkXPress",
+ ".qxb" => "application/vnd.Quark.QuarkXPress",
+ ".qxd" => "application/vnd.Quark.QuarkXPress",
+ ".qxl" => "application/vnd.Quark.QuarkXPress",
+ ".qxt" => "application/vnd.Quark.QuarkXPress",
+ ".twd" => "application/vnd.SimTech-MindMapper",
+ ".twds" => "application/vnd.SimTech-MindMapper",
+ ".aso" => "application/vnd.accpac.simply.aso",
+ ".imp" => "application/vnd.accpac.simply.imp",
+ ".acu" => "application/vnd.acucobol",
+ ".acutc" => "application/vnd.acucorp",
+ ".atc" => "application/vnd.acucorp",
+ ".swf" => "application/vnd.adobe.flash.movie",
+ ".fcdt" => "application/vnd.adobe.formscentral.fcdt",
+ ".fxp" => "application/vnd.adobe.fxp",
+ ".fxpl" => "application/vnd.adobe.fxp",
+ ".xdp" => "application/vnd.adobe.xdp+xml",
+ ".xfdf" => "application/vnd.adobe.xfdf",
+ ".afp" => "application/vnd.afpc.modca",
+ ".list3820" => "application/vnd.afpc.modca",
+ ".listafp" => "application/vnd.afpc.modca",
+ ".pseg3820" => "application/vnd.afpc.modca",
+ ".ovl" => "application/vnd.afpc.modca-overlay",
+ ".psg" => "application/vnd.afpc.modca-pagesegment",
+ ".ahead" => "application/vnd.ahead.space",
+ ".azf" => "application/vnd.airzip.filesecure.azf",
+ ".azs" => "application/vnd.airzip.filesecure.azs",
+ ".azw3" => "application/vnd.amazon.mobi8-ebook",
+ ".acc" => "application/vnd.americandynamics.acc",
+ ".ami" => "application/vnd.amiga.ami",
+ ".ota" => "application/vnd.android.ota",
+ ".apk" => "application/vnd.android.package-archive",
+ ".apkg" => "application/vnd.anki",
+ ".cii" => "application/vnd.anser-web-certificate-issue-initiation",
+ ".fti" => "application/vnd.anser-web-funds-transfer-initiation",
+ ".dist" => "application/vnd.apple.installer+xml",
+ ".distz" => "application/vnd.apple.installer+xml",
+ ".mpkg" => "application/vnd.apple.installer+xml",
+ ".pkg" => "application/vnd.apple.installer+xml",
+ ".keynote" => "application/vnd.apple.keynote",
+ ".m3u8" => "application/vnd.apple.mpegurl",
+ ".numbers" => "application/vnd.apple.numbers",
+ ".pages" => "application/vnd.apple.pages",
+ ".swi" => "application/vnd.aristanetworks.swi",
+ ".artisan" => "application/vnd.artisan+json",
+ ".iota" => "application/vnd.astraea-software.iota",
+ ".aep" => "application/vnd.audiograph",
+ ".package" => "application/vnd.autopackage",
+ ".bmml" => "application/vnd.balsamiq.bmml+xml",
+ ".bmpr" => "application/vnd.balsamiq.bmpr",
+ ".ac2" => "application/vnd.banana-accounting",
+ ".mpm" => "application/vnd.blueice.multipass",
+ ".ep" => "application/vnd.bluetooth.ep.oob",
+ ".le" => "application/vnd.bluetooth.le.oob",
+ ".bmi" => "application/vnd.bmi",
+ ".rep" => "application/vnd.businessobjects",
+ ".tlclient" => "application/vnd.cendio.thinlinc.clientconf",
+ ".cdxml" => "application/vnd.chemdraw+xml",
+ ".pgn" => "application/vnd.chess-pgn",
+ ".mmd" => "application/vnd.chipnuts.karaoke-mmd",
+ ".cdy" => "application/vnd.cinderella",
+ ".csl" => "application/vnd.citationstyles.style+xml",
+ ".cla" => "application/vnd.claymore",
+ ".rp9" => "application/vnd.cloanto.rp9",
+ ".c4d" => "application/vnd.clonk.c4group",
+ ".c4f" => "application/vnd.clonk.c4group",
+ ".c4g" => "application/vnd.clonk.c4group",
+ ".c4p" => "application/vnd.clonk.c4group",
+ ".c4u" => "application/vnd.clonk.c4group",
+ ".c11amc" => "application/vnd.cluetrust.cartomobile-config",
+ ".c11amz" => "application/vnd.cluetrust.cartomobile-config-pkg",
+ ".coffee" => "application/vnd.coffeescript",
+ ".xodt" => "application/vnd.collabio.xodocuments.document",
+ ".xott" => "application/vnd.collabio.xodocuments.document-template",
+ ".xodp" => "application/vnd.collabio.xodocuments.presentation",
+ ".xotp" => "application/vnd.collabio.xodocuments.presentation-template",
+ ".xods" => "application/vnd.collabio.xodocuments.spreadsheet",
+ ".xots" => "application/vnd.collabio.xodocuments.spreadsheet-template",
+ ".cbz" => "application/vnd.comicbook+zip",
+ ".cbr" => "application/vnd.comicbook-rar",
+ ".ic0" => "application/vnd.commerce-battelle",
+ ".ic1" => "application/vnd.commerce-battelle",
+ ".ic2" => "application/vnd.commerce-battelle",
+ ".ic3" => "application/vnd.commerce-battelle",
+ ".ic4" => "application/vnd.commerce-battelle",
+ ".ic5" => "application/vnd.commerce-battelle",
+ ".ic6" => "application/vnd.commerce-battelle",
+ ".ic7" => "application/vnd.commerce-battelle",
+ ".ic8" => "application/vnd.commerce-battelle",
+ ".ica" => "application/vnd.commerce-battelle",
+ ".icd" => "application/vnd.commerce-battelle",
+ ".icf" => "application/vnd.commerce-battelle",
+ ".csp" => "application/vnd.commonspace",
+ ".cst" => "application/vnd.commonspace",
+ ".cdbcmsg" => "application/vnd.contact.cmsg",
+ ".ign" => "application/vnd.coreos.ignition+json",
+ ".ignition" => "application/vnd.coreos.ignition+json",
+ ".cmc" => "application/vnd.cosmocaller",
+ ".clkx" => "application/vnd.crick.clicker",
+ ".clkk" => "application/vnd.crick.clicker.keyboard",
+ ".clkp" => "application/vnd.crick.clicker.palette",
+ ".clkt" => "application/vnd.crick.clicker.template",
+ ".clkw" => "application/vnd.crick.clicker.wordbank",
+ ".wbs" => "application/vnd.criticaltools.wbs+xml",
+ ".ssvc" => "application/vnd.crypto-shade-file",
+ ".c9r" => "application/vnd.cryptomator.encrypted",
+ ".c9s" => "application/vnd.cryptomator.encrypted",
+ ".cryptomator" => "application/vnd.cryptomator.vault",
+ ".pml" => "application/vnd.ctc-posml",
+ ".ppd" => "application/vnd.cups-ppd",
+ ".curl" => "application/vnd.curl",
+ ".dart" => "application/vnd.dart",
+ ".rdz" => "application/vnd.data-vision.rdz",
+ ".dbf" => "application/vnd.dbf",
+ ".deb" => "application/vnd.debian.binary-package",
+ ".udeb" => "application/vnd.debian.binary-package",
+ ".uvd" => "application/vnd.dece.data",
+ ".uvf" => "application/vnd.dece.data",
+ ".uvvd" => "application/vnd.dece.data",
+ ".uvvf" => "application/vnd.dece.data",
+ ".uvt" => "application/vnd.dece.ttml+xml",
+ ".uvvt" => "application/vnd.dece.ttml+xml",
+ ".uvvx" => "application/vnd.dece.unspecified",
+ ".uvx" => "application/vnd.dece.unspecified",
+ ".uvvz" => "application/vnd.dece.zip",
+ ".uvz" => "application/vnd.dece.zip",
+ ".dsm" => "application/vnd.desmume.movie",
+ ".dna" => "application/vnd.dna",
+ ".docjson" => "application/vnd.document+json",
+ ".scld" => "application/vnd.doremir.scorecloud-binary-document",
+ ".dpg" => "application/vnd.dpgraph",
+ ".dpgraph" => "application/vnd.dpgraph",
+ ".mwc" => "application/vnd.dpgraph",
+ ".dfac" => "application/vnd.dreamfactory",
+ ".fla" => "application/vnd.dtg.local.flash",
+ ".ait" => "application/vnd.dvb.ait",
+ ".svc" => "application/vnd.dvb.service",
+ ".geo" => "application/vnd.dynageo",
+ ".dzr" => "application/vnd.dzr",
+ ".mag" => "application/vnd.ecowin.chart",
+ ".nml" => "application/vnd.enliven",
+ ".esf" => "application/vnd.epson.esf",
+ ".msf" => "application/vnd.epson.msf",
+ ".qam" => "application/vnd.epson.quickanime",
+ ".slt" => "application/vnd.epson.salt",
+ ".ssf" => "application/vnd.epson.ssf",
+ ".qca" => "application/vnd.ericsson.quickcall",
+ ".qcall" => "application/vnd.ericsson.quickcall",
+ ".espass" => "application/vnd.espass-espass+zip",
+ ".es3" => "application/vnd.eszigno3+xml",
+ ".et3" => "application/vnd.eszigno3+xml",
+ ".asice" => "application/vnd.etsi.asic-e+zip",
+ ".sce" => "application/vnd.etsi.asic-e+zip",
+ ".asics" => "application/vnd.etsi.asic-s+zip",
+ ".tst" => "application/vnd.etsi.timestamp-token",
+ ".ecigprofile" => "application/vnd.evolv.ecig.profile",
+ ".ecig" => "application/vnd.evolv.ecig.settings",
+ ".ecigtheme" => "application/vnd.evolv.ecig.theme",
+ ".mpw" => "application/vnd.exstream-empower+zip",
+ ".pub" => "application/vnd.exstream-package",
+ ".ez2" => "application/vnd.ezpix-album",
+ ".ez3" => "application/vnd.ezpix-package",
+ ".dim" => "application/vnd.fastcopy-disk-image",
+ ".fdf" => "application/vnd.fdf",
+ ".msd" => "application/vnd.fdsn.mseed",
+ ".mseed" => "application/vnd.fdsn.mseed",
+ ".dataless" => "application/vnd.fdsn.seed",
+ ".seed" => "application/vnd.fdsn.seed",
+ ".flb" => "application/vnd.ficlab.flb+zip",
+ ".zfc" => "application/vnd.filmit.zfc",
+ ".ftc" => "application/vnd.fluxtime.clip",
+ ".sfd" => "application/vnd.font-fontforge-sfd",
+ ".fm" => "application/vnd.framemaker",
+ ".fnc" => "application/vnd.frogans.fnc",
+ ".ltf" => "application/vnd.frogans.ltf",
+ ".fsc" => "application/vnd.fsc.weblaunch",
+ ".oas" => "application/vnd.fujitsu.oasys",
+ ".oa2" => "application/vnd.fujitsu.oasys2",
+ ".oa3" => "application/vnd.fujitsu.oasys3",
+ ".fg5" => "application/vnd.fujitsu.oasysgp",
+ ".bh2" => "application/vnd.fujitsu.oasysprs",
+ ".ddd" => "application/vnd.fujixerox.ddd",
+ ".xdw" => "application/vnd.fujixerox.docuworks",
+ ".xbd" => "application/vnd.fujixerox.docuworks.binder",
+ ".xct" => "application/vnd.fujixerox.docuworks.container",
+ ".fzs" => "application/vnd.fuzzysheet",
+ ".txd" => "application/vnd.genomatix.tuxedo",
+ ".ggb" => "application/vnd.geogebra.file",
+ ".ggs" => "application/vnd.geogebra.slides",
+ ".ggt" => "application/vnd.geogebra.tool",
+ ".gex" => "application/vnd.geometry-explorer",
+ ".gre" => "application/vnd.geometry-explorer",
+ ".gxt" => "application/vnd.geonext",
+ ".g2w" => "application/vnd.geoplan",
+ ".g3w" => "application/vnd.geospace",
+ ".gmx" => "application/vnd.gmx",
+ ".kml" => "application/vnd.google-earth.kml+xml",
+ ".kmz" => "application/vnd.google-earth.kmz",
+ ".gqf" => "application/vnd.grafeq",
+ ".gqs" => "application/vnd.grafeq",
+ ".gac" => "application/vnd.groove-account",
+ ".ghf" => "application/vnd.groove-help",
+ ".gim" => "application/vnd.groove-identity-message",
+ ".grv" => "application/vnd.groove-injector",
+ ".gtm" => "application/vnd.groove-tool-message",
+ ".tpl" => "application/vnd.groove-tool-template",
+ ".vcg" => "application/vnd.groove-vcard",
+ ".hal" => "application/vnd.hal+xml",
+ ".bpd" => "application/vnd.hbci",
+ ".hbc" => "application/vnd.hbci",
+ ".hbci" => "application/vnd.hbci",
+ ".kom" => "application/vnd.hbci",
+ ".pkd" => "application/vnd.hbci",
+ ".upa" => "application/vnd.hbci",
+ ".hdt" => "application/vnd.hdt",
+ ".les" => "application/vnd.hhe.lesson-player",
+ ".hpgl" => "application/vnd.hp-HPGL",
+ ".pcl" => "application/vnd.hp-PCL",
+ ".hpi" => "application/vnd.hp-hpid",
+ ".hpid" => "application/vnd.hp-hpid",
+ ".hps" => "application/vnd.hp-hps",
+ ".jlt" => "application/vnd.hp-jlyt",
+ ".sfd-hdstx" => "application/vnd.hydrostatix.sof-data",
+ ".x3d" => "application/vnd.hzn-3d-crossword",
+ ".mpy" => "application/vnd.ibm.MiniPay",
+ ".emm" => "application/vnd.ibm.electronic-media",
+ ".irm" => "application/vnd.ibm.rights-management",
+ ".sc" => "application/vnd.ibm.secure-container",
+ ".icc" => "application/vnd.iccprofile",
+ ".icm" => "application/vnd.iccprofile",
+ ".igl" => "application/vnd.igloader",
+ ".imf" => "application/vnd.imagemeter.folder+zip",
+ ".imi" => "application/vnd.imagemeter.image+zip",
+ ".ivp" => "application/vnd.immervision-ivp",
+ ".ivu" => "application/vnd.immervision-ivu",
+ ".imscc" => "application/vnd.ims.imsccv1p1",
+ ".igm" => "application/vnd.insors.igm",
+ ".xpw" => "application/vnd.intercon.formnet",
+ ".xpx" => "application/vnd.intercon.formnet",
+ ".i2g" => "application/vnd.intergeo",
+ ".qbo" => "application/vnd.intu.qbo",
+ ".qfx" => "application/vnd.intu.qfx",
+ ".rcprofile" => "application/vnd.ipunplugged.rcprofile",
+ ".irp" => "application/vnd.irepository.package+xml",
+ ".xpr" => "application/vnd.is-xpr",
+ ".fcs" => "application/vnd.isac.fcs",
+ ".jam" => "application/vnd.jam",
+ ".rms" => "application/vnd.jcp.javame.midlet-rms",
+ ".jisp" => "application/vnd.jisp",
+ ".joda" => "application/vnd.joost.joda-archive",
+ ".ktr" => "application/vnd.kahootz",
+ ".ktz" => "application/vnd.kahootz",
+ ".karbon" => "application/vnd.kde.karbon",
+ ".chrt" => "application/vnd.kde.kchart",
+ ".kfo" => "application/vnd.kde.kformula",
+ ".flw" => "application/vnd.kde.kivio",
+ ".kon" => "application/vnd.kde.kontour",
+ ".kpr" => "application/vnd.kde.kpresenter",
+ ".kpt" => "application/vnd.kde.kpresenter",
+ ".ksp" => "application/vnd.kde.kspread",
+ ".kwd" => "application/vnd.kde.kword",
+ ".kwt" => "application/vnd.kde.kword",
+ ".htke" => "application/vnd.kenameaapp",
+ ".kia" => "application/vnd.kidspiration",
+ ".skd" => "application/vnd.koan",
+ ".skm" => "application/vnd.koan",
+ ".skp" => "application/vnd.koan",
+ ".skt" => "application/vnd.koan",
+ ".sse" => "application/vnd.kodak-descriptor",
+ ".las" => "application/vnd.las",
+ ".lasjson" => "application/vnd.las.las+json",
+ ".lasxml" => "application/vnd.las.las+xml",
+ ".lbd" => "application/vnd.llamagraphics.life-balance.desktop",
+ ".lbe" => "application/vnd.llamagraphics.life-balance.exchange+xml",
+ ".lca" => "application/vnd.logipipe.circuit+zip",
+ ".lcs" => "application/vnd.logipipe.circuit+zip",
+ ".loom" => "application/vnd.loom",
+ ".123" => "application/vnd.lotus-1-2-3",
+ ".wk1" => "application/vnd.lotus-1-2-3",
+ ".wk3" => "application/vnd.lotus-1-2-3",
+ ".wk4" => "application/vnd.lotus-1-2-3",
+ ".apr" => "application/vnd.lotus-approach",
+ ".vew" => "application/vnd.lotus-approach",
+ ".pre" => "application/vnd.lotus-freelance",
+ ".prz" => "application/vnd.lotus-freelance",
+ ".ndl" => "application/vnd.lotus-notes",
+ ".ns2" => "application/vnd.lotus-notes",
+ ".ns3" => "application/vnd.lotus-notes",
+ ".ns4" => "application/vnd.lotus-notes",
+ ".nsf" => "application/vnd.lotus-notes",
+ ".nsg" => "application/vnd.lotus-notes",
+ ".nsh" => "application/vnd.lotus-notes",
+ ".ntf" => "application/vnd.lotus-notes",
+ ".or2" => "application/vnd.lotus-organizer",
+ ".or3" => "application/vnd.lotus-organizer",
+ ".org" => "application/vnd.lotus-organizer",
+ ".scm" => "application/vnd.lotus-screencam",
+ ".lwp" => "application/vnd.lotus-wordpro",
+ ".sam" => "application/vnd.lotus-wordpro",
+ ".portpkg" => "application/vnd.macports.portpkg",
+ ".mvt" => "application/vnd.mapbox-vector-tile",
+ ".mdc" => "application/vnd.marlin.drm.mdcf",
+ ".mmdb" => "application/vnd.maxmind.maxmind-db",
+ ".mcd" => "application/vnd.mcd",
+ ".mc1" => "application/vnd.medcalcdata",
+ ".cdkey" => "application/vnd.mediastation.cdkey",
+ ".mfm" => "application/vnd.mfmp",
+ ".flo" => "application/vnd.micrografx.flo",
+ ".igx" => "application/vnd.micrografx.igx",
+ ".mif" => "application/vnd.mif",
+ ".mpn" => "application/vnd.mophun.application",
+ ".mpc" => "application/vnd.mophun.certificate",
+ ".xul" => "application/vnd.mozilla.xul+xml",
+ ".3mf" => "application/vnd.ms-3mfdocument",
+ ".cil" => "application/vnd.ms-artgalry",
+ ".asf" => "application/vnd.ms-asf",
+ ".cab" => "application/vnd.ms-cab-compressed",
+ ".xla" => "application/vnd.ms-excel",
+ ".xlc" => "application/vnd.ms-excel",
+ ".xlm" => "application/vnd.ms-excel",
+ ".xls" => "application/vnd.ms-excel",
+ ".xlt" => "application/vnd.ms-excel",
+ ".xlw" => "application/vnd.ms-excel",
+ ".xlam" => "application/vnd.ms-excel.addin.macroEnabled.12",
+ ".xlsb" => "application/vnd.ms-excel.sheet.binary.macroEnabled.12",
+ ".xlsm" => "application/vnd.ms-excel.sheet.macroEnabled.12",
+ ".xltm" => "application/vnd.ms-excel.template.macroEnabled.12",
+ ".eot" => "application/vnd.ms-fontobject",
+ ".chm" => "application/vnd.ms-htmlhelp",
+ ".ims" => "application/vnd.ms-ims",
+ ".lrm" => "application/vnd.ms-lrm",
+ ".thmx" => "application/vnd.ms-officetheme",
+ ".pot" => "application/vnd.ms-powerpoint",
+ ".pps" => "application/vnd.ms-powerpoint",
+ ".ppt" => "application/vnd.ms-powerpoint",
+ ".ppam" => "application/vnd.ms-powerpoint.addin.macroEnabled.12",
+ ".pptm" => "application/vnd.ms-powerpoint.presentation.macroEnabled.12",
+ ".sldm" => "application/vnd.ms-powerpoint.slide.macroEnabled.12",
+ ".ppsm" => "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
+ ".potm" => "application/vnd.ms-powerpoint.template.macroEnabled.12",
+ ".mpp" => "application/vnd.ms-project",
+ ".mpt" => "application/vnd.ms-project",
+ ".tnef" => "application/vnd.ms-tnef",
+ ".tnf" => "application/vnd.ms-tnef",
+ ".docm" => "application/vnd.ms-word.document.macroEnabled.12",
+ ".dotm" => "application/vnd.ms-word.template.macroEnabled.12",
+ ".wcm" => "application/vnd.ms-works",
+ ".wdb" => "application/vnd.ms-works",
+ ".wks" => "application/vnd.ms-works",
+ ".wps" => "application/vnd.ms-works",
+ ".wpl" => "application/vnd.ms-wpl",
+ ".xps" => "application/vnd.ms-xpsdocument",
+ ".msa" => "application/vnd.msa-disk-image",
+ ".mseq" => "application/vnd.mseq",
+ ".crtr" => "application/vnd.multiad.creator",
+ ".cif" => "application/vnd.multiad.creator.cif",
+ ".mus" => "application/vnd.musician",
+ ".msty" => "application/vnd.muvee.style",
+ ".taglet" => "application/vnd.mynfc",
+ ".line" => "application/vnd.nebumind.line",
+ ".nebul" => "application/vnd.nebumind.line",
+ ".bkm" => "application/vnd.nervana",
+ ".entity" => "application/vnd.nervana",
+ ".kcm" => "application/vnd.nervana",
+ ".request" => "application/vnd.nervana",
+ ".nlu" => "application/vnd.neurolanguage.nlu",
+ ".nimn" => "application/vnd.nimn",
+ ".nds" => "application/vnd.nintendo.nitro.rom",
+ ".sfc" => "application/vnd.nintendo.snes.rom",
+ ".smc" => "application/vnd.nintendo.snes.rom",
+ ".nitf" => "application/vnd.nitf",
+ ".nnd" => "application/vnd.noblenet-directory",
+ ".nns" => "application/vnd.noblenet-sealer",
+ ".nnw" => "application/vnd.noblenet-web",
+ ".ac" => "application/vnd.nokia.n-gage.ac+xml",
+ ".ngdat" => "application/vnd.nokia.n-gage.data",
+ ".n-gage" => "application/vnd.nokia.n-gage.symbian.install",
+ ".rpst" => "application/vnd.nokia.radio-preset",
+ ".rpss" => "application/vnd.nokia.radio-presets",
+ ".edm" => "application/vnd.novadigm.EDM",
+ ".edx" => "application/vnd.novadigm.EDX",
+ ".ext" => "application/vnd.novadigm.EXT",
+ ".odc" => "application/vnd.oasis.opendocument.chart",
+ ".otc" => "application/vnd.oasis.opendocument.chart-template",
+ ".odb" => "application/vnd.oasis.opendocument.database",
+ ".odf" => "application/vnd.oasis.opendocument.formula",
+ ".odg" => "application/vnd.oasis.opendocument.graphics",
+ ".otg" => "application/vnd.oasis.opendocument.graphics-template",
+ ".odi" => "application/vnd.oasis.opendocument.image",
+ ".oti" => "application/vnd.oasis.opendocument.image-template",
+ ".odp" => "application/vnd.oasis.opendocument.presentation",
+ ".otp" => "application/vnd.oasis.opendocument.presentation-template",
+ ".ods" => "application/vnd.oasis.opendocument.spreadsheet",
+ ".ots" => "application/vnd.oasis.opendocument.spreadsheet-template",
+ ".odt" => "application/vnd.oasis.opendocument.text",
+ ".odm" => "application/vnd.oasis.opendocument.text-master",
+ ".ott" => "application/vnd.oasis.opendocument.text-template",
+ ".oth" => "application/vnd.oasis.opendocument.text-web",
+ ".xo" => "application/vnd.olpc-sugar",
+ ".dd" => "application/vnd.oma.dd+xml",
+ ".dd2" => "application/vnd.oma.dd2+xml",
+ ".dcf" => "application/vnd.oma.drm.content",
+ ".o4a" => "application/vnd.oma.drm.dcf",
+ ".o4v" => "application/vnd.oma.drm.dcf",
+ ".dm" => "application/vnd.oma.drm.message",
+ ".drc" => "application/vnd.oma.drm.rights+wbxml",
+ ".dr" => "application/vnd.oma.drm.rights+xml",
+ ".tam" => "application/vnd.onepager",
+ ".tamp" => "application/vnd.onepagertamp",
+ ".tamx" => "application/vnd.onepagertamx",
+ ".tat" => "application/vnd.onepagertat",
+ ".tatp" => "application/vnd.onepagertatp",
+ ".tatx" => "application/vnd.onepagertatx",
+ ".obgx" => "application/vnd.openblox.game+xml",
+ ".obg" => "application/vnd.openblox.game-binary",
+ ".oeb" => "application/vnd.openeye.oeb",
+ ".oxt" => "application/vnd.openofficeorg.extension",
+ ".osm" => "application/vnd.openstreetmap.data+xml",
+ ".pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation",
+ ".sldx" => "application/vnd.openxmlformats-officedocument.presentationml.slide",
+ ".ppsx" => "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
+ ".potx" => "application/vnd.openxmlformats-officedocument.presentationml.template",
+ ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+ ".xltx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
+ ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+ ".dotx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
+ ".ndc" => "application/vnd.osa.netdeploy",
+ ".mgp" => "application/vnd.osgeo.mapguide.package",
+ ".dp" => "application/vnd.osgi.dp",
+ ".esa" => "application/vnd.osgi.subsystem",
+ ".oxlicg" => "application/vnd.oxli.countgraph",
+ ".oprc" => "application/vnd.palm",
+ ".pdb" => "application/vnd.palm",
+ ".pqa" => "application/vnd.palm",
+ ".prc" => "application/vnd.palm",
+ ".plp" => "application/vnd.panoply",
+ ".dive" => "application/vnd.patentdive",
+ ".paw" => "application/vnd.pawaafile",
+ ".str" => "application/vnd.pg.format",
+ ".ei6" => "application/vnd.pg.osasli",
+ ".pil" => "application/vnd.piaccess.application-licence",
+ ".efif" => "application/vnd.picsel",
+ ".wg" => "application/vnd.pmi.widget",
+ ".plf" => "application/vnd.pocketlearn",
+ ".pbd" => "application/vnd.powerbuilder6",
+ ".preminet" => "application/vnd.preminet",
+ ".box" => "application/vnd.previewsystems.box",
+ ".vbox" => "application/vnd.previewsystems.box",
+ ".mgz" => "application/vnd.proteus.magazine",
+ ".psfs" => "application/vnd.psfs",
+ ".qps" => "application/vnd.publishare-delta-tree",
+ ".ptid" => "application/vnd.pvi.ptid1",
+ ".bar" => "application/vnd.qualcomm.brew-app-res",
+ ".quiz" => "application/vnd.quobject-quoxdocument",
+ ".quox" => "application/vnd.quobject-quoxdocument",
+ ".tree" => "application/vnd.rainstor.data",
+ ".rar" => "application/vnd.rar",
+ ".bed" => "application/vnd.realvnc.bed",
+ ".mxl" => "application/vnd.recordare.musicxml",
+ ".cryptonote" => "application/vnd.rig.cryptonote",
+ ".link66" => "application/vnd.route66.link66+xml",
+ ".st" => "application/vnd.sailingtracker.track",
+ ".SAR" => "application/vnd.sar",
+ ".scd" => "application/vnd.scribus",
+ ".sla" => "application/vnd.scribus",
+ ".slaz" => "application/vnd.scribus",
+ ".s3df" => "application/vnd.sealed.3df",
+ ".scsf" => "application/vnd.sealed.csf",
+ ".s1w" => "application/vnd.sealed.doc",
+ ".sdo" => "application/vnd.sealed.doc",
+ ".sdoc" => "application/vnd.sealed.doc",
+ ".sem" => "application/vnd.sealed.eml",
+ ".seml" => "application/vnd.sealed.eml",
+ ".smh" => "application/vnd.sealed.mht",
+ ".smht" => "application/vnd.sealed.mht",
+ ".s1p" => "application/vnd.sealed.ppt",
+ ".sppt" => "application/vnd.sealed.ppt",
+ ".stif" => "application/vnd.sealed.tiff",
+ ".s1e" => "application/vnd.sealed.xls",
+ ".sxl" => "application/vnd.sealed.xls",
+ ".sxls" => "application/vnd.sealed.xls",
+ ".s1h" => "application/vnd.sealedmedia.softseal.html",
+ ".stml" => "application/vnd.sealedmedia.softseal.html",
+ ".s1a" => "application/vnd.sealedmedia.softseal.pdf",
+ ".spd" => "application/vnd.sealedmedia.softseal.pdf",
+ ".spdf" => "application/vnd.sealedmedia.softseal.pdf",
+ ".see" => "application/vnd.seemail",
+ ".sema" => "application/vnd.sema",
+ ".semd" => "application/vnd.semd",
+ ".semf" => "application/vnd.semf",
+ ".ssv" => "application/vnd.shade-save-file",
+ ".ifm" => "application/vnd.shana.informed.formdata",
+ ".itp" => "application/vnd.shana.informed.formtemplate",
+ ".iif" => "application/vnd.shana.informed.interchange",
+ ".ipk" => "application/vnd.shana.informed.package",
+ ".shp" => "application/vnd.shp",
+ ".shx" => "application/vnd.shx",
+ ".sr" => "application/vnd.sigrok.session",
+ ".mmf" => "application/vnd.smaf",
+ ".notebook" => "application/vnd.smart.notebook",
+ ".teacher" => "application/vnd.smart.teacher",
+ ".pt" => "application/vnd.snesdev-page-table",
+ ".ptrom" => "application/vnd.snesdev-page-table",
+ ".fo" => "application/vnd.software602.filler.form+xml",
+ ".zfo" => "application/vnd.software602.filler.form-xml-zip",
+ ".sdkd" => "application/vnd.solent.sdkm+xml",
+ ".sdkm" => "application/vnd.solent.sdkm+xml",
+ ".dxp" => "application/vnd.spotfire.dxp",
+ ".sfs" => "application/vnd.spotfire.sfs",
+ ".sqlite" => "application/vnd.sqlite3",
+ ".sqlite3" => "application/vnd.sqlite3",
+ ".smzip" => "application/vnd.stepmania.package",
+ ".sm" => "application/vnd.stepmania.stepchart",
+ ".wadl" => "application/vnd.sun.wadl+xml",
+ ".sxc" => "application/vnd.sun.xml.calc",
+ ".stc" => "application/vnd.sun.xml.calc.template",
+ ".sxd" => "application/vnd.sun.xml.draw",
+ ".std" => "application/vnd.sun.xml.draw.template",
+ ".sxi" => "application/vnd.sun.xml.impress",
+ ".sti" => "application/vnd.sun.xml.impress.template",
+ ".sxm" => "application/vnd.sun.xml.math",
+ ".sxw" => "application/vnd.sun.xml.writer",
+ ".sxg" => "application/vnd.sun.xml.writer.global",
+ ".stw" => "application/vnd.sun.xml.writer.template",
+ ".sus" => "application/vnd.sus-calendar",
+ ".susp" => "application/vnd.sus-calendar",
+ ".scl" => "application/vnd.sycle+xml",
+ ".sis" => "application/vnd.symbian.install",
+ ".xsm" => "application/vnd.syncml+xml",
+ ".bdm" => "application/vnd.syncml.dm+wbxml",
+ ".xdm" => "application/vnd.syncml.dm+xml",
+ ".ddf" => "application/vnd.syncml.dmddf+xml",
+ ".tao" => "application/vnd.tao.intent-module-archive",
+ ".cap" => "application/vnd.tcpdump.pcap",
+ ".dmp" => "application/vnd.tcpdump.pcap",
+ ".pcap" => "application/vnd.tcpdump.pcap",
+ ".qvd" => "application/vnd.theqvd",
+ ".ppttc" => "application/vnd.think-cell.ppttc+json",
+ ".vfr" => "application/vnd.tml",
+ ".viaframe" => "application/vnd.tml",
+ ".tmo" => "application/vnd.tmobile-livetv",
+ ".tpt" => "application/vnd.trid.tpt",
+ ".mxs" => "application/vnd.triscape.mxs",
+ ".tra" => "application/vnd.trueapp",
+ ".frm" => "application/vnd.ufdl",
+ ".ufd" => "application/vnd.ufdl",
+ ".ufdl" => "application/vnd.ufdl",
+ ".utz" => "application/vnd.uiq.theme",
+ ".umj" => "application/vnd.umajin",
+ ".unityweb" => "application/vnd.unity",
+ ".uo" => "application/vnd.uoml+xml",
+ ".uoml" => "application/vnd.uoml+xml",
+ ".urim" => "application/vnd.uri-map",
+ ".urimap" => "application/vnd.uri-map",
+ ".vmt" => "application/vnd.valve.source.material",
+ ".vcx" => "application/vnd.vcx",
+ ".model-inter" => "application/vnd.vd-study",
+ ".mxi" => "application/vnd.vd-study",
+ ".study-inter" => "application/vnd.vd-study",
+ ".vwx" => "application/vnd.vectorworks",
+ ".istc" => "application/vnd.veryant.thin",
+ ".isws" => "application/vnd.veryant.thin",
+ ".VES" => "application/vnd.ves.encrypted",
+ ".vsc" => "application/vnd.vidsoft.vidconference",
+ ".vsd" => "application/vnd.visio",
+ ".vss" => "application/vnd.visio",
+ ".vst" => "application/vnd.visio",
+ ".vsw" => "application/vnd.visio",
+ ".vis" => "application/vnd.visionary",
+ ".vsf" => "application/vnd.vsf",
+ ".mms" => "application/vnd.wap.mms-message",
+ ".sic" => "application/vnd.wap.sic",
+ ".slc" => "application/vnd.wap.slc",
+ ".wbxml" => "application/vnd.wap.wbxml",
+ ".wmlc" => "application/vnd.wap.wmlc",
+ ".wmlsc" => "application/vnd.wap.wmlscriptc",
+ ".wtb" => "application/vnd.webturbo",
+ ".p2p" => "application/vnd.wfa.p2p",
+ ".wsc" => "application/vnd.wfa.wsc",
+ ".wmc" => "application/vnd.wmc",
+ ".m" => "application/vnd.wolfram.mathematica.package",
+ ".nbp" => "application/vnd.wolfram.player",
+ ".wpd" => "application/vnd.wordperfect",
+ ".wqd" => "application/vnd.wqd",
+ ".stf" => "application/vnd.wt.stf",
+ ".wv" => "application/vnd.wv.csp+wbxml",
+ ".xar" => "application/vnd.xara",
+ ".xfd" => "application/vnd.xfdl",
+ ".xfdl" => "application/vnd.xfdl",
+ ".cpkg" => "application/vnd.xmpie.cpkg",
+ ".dpkg" => "application/vnd.xmpie.dpkg",
+ ".ppkg" => "application/vnd.xmpie.ppkg",
+ ".xlim" => "application/vnd.xmpie.xlim",
+ ".hvd" => "application/vnd.yamaha.hv-dic",
+ ".hvs" => "application/vnd.yamaha.hv-script",
+ ".hvp" => "application/vnd.yamaha.hv-voice",
+ ".osf" => "application/vnd.yamaha.openscoreformat",
+ ".saf" => "application/vnd.yamaha.smaf-audio",
+ ".spf" => "application/vnd.yamaha.smaf-phrase",
+ ".yme" => "application/vnd.yaoweme",
+ ".cmp" => "application/vnd.yellowriver-custom-menu",
+ ".zir" => "application/vnd.zul",
+ ".zirz" => "application/vnd.zul",
+ ".zaz" => "application/vnd.zzazz.deck+xml",
+ ".anx" => "application/x-annodex",
+ ".bcpio" => "application/x-bcpio",
+ ".torrent" => "application/x-bittorrent",
+ ".bz2" => "application/x-bzip2",
+ ".vcd" => "application/x-cdlink",
+ ".crx" => "application/x-chrome-extension",
+ ".cpio" => "application/x-cpio",
+ ".csh" => "application/x-csh",
+ ".dcr" => "application/x-director",
+ ".dir" => "application/x-director",
+ ".dxr" => "application/x-director",
+ ".dvi" => "application/x-dvi",
+ ".spl" => "application/x-futuresplash",
+ ".gtar" => "application/x-gtar",
+ ".tbz" => "application/x-gtar-compressed",
+ ".hdf" => "application/x-hdf",
+ ".jar" => "application/x-java-archive",
+ ".jnlp" => "application/x-java-jnlp-file",
+ ".pack" => "application/x-java-pack200",
+ ".kil" => "application/x-killustrator",
+ ".latex" => "application/x-latex",
+ ".cdf" => "application/x-netcdf",
+ ".nc" => "application/x-netcdf",
+ ".pl" => "application/x-perl",
+ ".rpm" => "application/x-rpm",
+ ".sh" => "application/x-sh",
+ ".shar" => "application/x-shar",
+ ".sit" => "application/x-stuffit",
+ ".sv4cpio" => "application/x-sv4cpio",
+ ".sv4crc" => "application/x-sv4crc",
+ ".tar" => "application/x-tar",
+ ".tcl" => "application/x-tcl",
+ ".tex" => "application/x-tex",
+ ".texi" => "application/x-texinfo",
+ ".texinfo" => "application/x-texinfo",
+ ".1" => "application/x-troff-man",
+ ".2" => "application/x-troff-man",
+ ".3" => "application/x-troff-man",
+ ".4" => "application/x-troff-man",
+ ".5" => "application/x-troff-man",
+ ".6" => "application/x-troff-man",
+ ".7" => "application/x-troff-man",
+ ".8" => "application/x-troff-man",
+ ".man" => "application/x-troff-man",
+ ".me" => "application/x-troff-me",
+ ".ms" => "application/x-troff-ms",
+ ".ustar" => "application/x-ustar",
+ ".src" => "application/x-wais-source",
+ ".xpi" => "application/x-xpinstall",
+ ".xspf" => "application/x-xspf+xml",
+ ".xz" => "application/x-xz",
+ ".726" => "audio/32kadpcm",
+ ".amr" => "audio/AMR",
+ ".awb" => "audio/AMR-WB",
+ ".aal" => "audio/ATRAC-ADVANCED-LOSSLESS",
+ ".atx" => "audio/ATRAC-X",
+ ".aa3" => "audio/ATRAC3",
+ ".at3" => "audio/ATRAC3",
+ ".omg" => "audio/ATRAC3",
+ ".evc" => "audio/EVRC",
+ ".evb" => "audio/EVRCB",
+ ".enw" => "audio/EVRCNW",
+ ".evw" => "audio/EVRCWB",
+ ".l16" => "audio/L16",
+ ".qcp" => "audio/QCELP",
+ ".smv" => "audio/SMV",
+ ".aac" => "audio/aac",
+ ".adts" => "audio/aac",
+ ".ass" => "audio/aac",
+ ".ac3" => "audio/ac3",
+ ".acn" => "audio/asc",
+ ".au" => "audio/basic",
+ ".snd" => "audio/basic",
+ ".dls" => "audio/dls",
+ ".lbc" => "audio/iLBC",
+ ".mhas" => "audio/mhas",
+ ".kar" => "audio/midi",
+ ".mid" => "audio/midi",
+ ".midi" => "audio/midi",
+ ".mxmf" => "audio/mobile-xmf",
+ ".m4a" => "audio/mp4",
+ ".mp1" => "audio/mpeg",
+ ".mp2" => "audio/mpeg",
+ ".mp3" => "audio/mpeg",
+ ".mpga" => "audio/mpeg",
+ ".oga" => "audio/ogg",
+ ".ogg" => "audio/ogg",
+ ".opus" => "audio/ogg",
+ ".spx" => "audio/ogg",
+ ".psid" => "audio/prs.sid",
+ ".sid" => "audio/prs.sid",
+ ".sofa" => "audio/sofa",
+ ".loas" => "audio/usac",
+ ".xhe" => "audio/usac",
+ ".koz" => "audio/vnd.audiokoz",
+ ".uva" => "audio/vnd.dece.audio",
+ ".uvva" => "audio/vnd.dece.audio",
+ ".eol" => "audio/vnd.digital-winds",
+ ".mlp" => "audio/vnd.dolby.mlp",
+ ".dts" => "audio/vnd.dts",
+ ".dtshd" => "audio/vnd.dts.hd",
+ ".plj" => "audio/vnd.everad.plj",
+ ".lvp" => "audio/vnd.lucent.voice",
+ ".pya" => "audio/vnd.ms-playready.media.pya",
+ ".vbk" => "audio/vnd.nortel.vbk",
+ ".ecelp4800" => "audio/vnd.nuera.ecelp4800",
+ ".ecelp7470" => "audio/vnd.nuera.ecelp7470",
+ ".ecelp9600" => "audio/vnd.nuera.ecelp9600",
+ ".multitrack" => "audio/vnd.presonus.multitrack",
+ ".rip" => "audio/vnd.rip",
+ ".s1m" => "audio/vnd.sealedmedia.softseal.mpeg",
+ ".smp" => "audio/vnd.sealedmedia.softseal.mpeg",
+ ".smp3" => "audio/vnd.sealedmedia.softseal.mpeg",
+ ".aif" => "audio/x-aiff",
+ ".aifc" => "audio/x-aiff",
+ ".aiff" => "audio/x-aiff",
+ ".axa" => "audio/x-annodex",
+ ".flac" => "audio/x-flac",
+ ".mka" => "audio/x-matroska",
+ ".669" => "audio/x-mod",
+ ".m15" => "audio/x-mod",
+ ".med" => "audio/x-mod",
+ ".mod" => "audio/x-mod",
+ ".mtm" => "audio/x-mod",
+ ".ult" => "audio/x-mod",
+ ".uni" => "audio/x-mod",
+ ".m3u" => "audio/x-mpegurl",
+ ".wax" => "audio/x-ms-wax",
+ ".wma" => "audio/x-ms-wma",
+ ".ram" => "audio/x-pn-realaudio",
+ ".rm" => "audio/x-pn-realaudio",
+ ".ra" => "audio/x-realaudio",
+ ".s3m" => "audio/x-s3m",
+ ".stm" => "audio/x-stm",
+ ".wav" => "audio/x-wav",
+ ".xyz" => "chemical/x-xyz",
+ ".ttc" => "font/collection",
+ ".otf" => "font/otf",
+ ".ttf" => "font/ttf",
+ ".woff" => "font/woff",
+ ".woff2" => "font/woff2",
+ ".exr" => "image/aces",
+ ".avci" => "image/avci",
+ ".avcs" => "image/avcs",
+ ".avif" => "image/avif",
+ ".hif" => "image/avif",
+ ".bmp" => "image/bmp",
+ ".dib" => "image/bmp",
+ ".cgm" => "image/cgm",
+ ".drle" => "image/dicom-rle",
+ ".emf" => "image/emf",
+ ".fit" => "image/fits",
+ ".fits" => "image/fits",
+ ".fts" => "image/fits",
+ ".gif" => "image/gif",
+ ".heic" => "image/heic",
+ ".heics" => "image/heic-sequence",
+ ".heif" => "image/heif",
+ ".heifs" => "image/heif-sequence",
+ ".hej2" => "image/hej2k",
+ ".hsj2" => "image/hsj2",
+ ".ief" => "image/ief",
+ ".jls" => "image/jls",
+ ".jp2" => "image/jp2",
+ ".jpg2" => "image/jp2",
+ ".jfif" => "image/jpeg",
+ ".jpe" => "image/jpeg",
+ ".jpeg" => "image/jpeg",
+ ".jpg" => "image/jpeg",
+ ".jph" => "image/jph",
+ ".jhc" => "image/jphc",
+ ".jpgm" => "image/jpm",
+ ".jpm" => "image/jpm",
+ ".jpf" => "image/jpx",
+ ".jpx" => "image/jpx",
+ ".jxl" => "image/jxl",
+ ".jxr" => "image/jxr",
+ ".jxra" => "image/jxrA",
+ ".jxrs" => "image/jxrS",
+ ".jxs" => "image/jxs",
+ ".jxsc" => "image/jxsc",
+ ".jxsi" => "image/jxsi",
+ ".jxss" => "image/jxss",
+ ".ktx" => "image/ktx",
+ ".ktx2" => "image/ktx2",
+ ".png" => "image/png",
+ ".btf" => "image/prs.btif",
+ ".btif" => "image/prs.btif",
+ ".pti" => "image/prs.pti",
+ ".svg" => "image/svg+xml",
+ ".svgz" => "image/svg+xml",
+ ".t38" => "image/t38",
+ ".tif" => "image/tiff",
+ ".tiff" => "image/tiff",
+ ".tfx" => "image/tiff-fx",
+ ".webp" => "image/webp",
+ ".wmf" => "image/wmf",
+ ".psd" => "image/vnd.adobe.photoshop",
+ ".azv" => "image/vnd.airzip.accelerator.azv",
+ ".uvg" => "image/vnd.dece.graphic",
+ ".uvi" => "image/vnd.dece.graphic",
+ ".uvvg" => "image/vnd.dece.graphic",
+ ".uvvi" => "image/vnd.dece.graphic",
+ ".djv" => "image/vnd.djvu",
+ ".djvu" => "image/vnd.djvu",
+ ".dwg" => "image/vnd.dwg",
+ ".dxf" => "image/vnd.dxf",
+ ".fbs" => "image/vnd.fastbidsheet",
+ ".fpx" => "image/vnd.fpx",
+ ".fst" => "image/vnd.fst",
+ ".mmr" => "image/vnd.fujixerox.edmics-mmr",
+ ".rlc" => "image/vnd.fujixerox.edmics-rlc",
+ ".pgb" => "image/vnd.globalgraphics.pgb",
+ ".ico" => "image/vnd.microsoft.icon",
+ ".apng" => "image/vnd.mozilla.apng",
+ ".mdi" => "image/vnd.ms-modi",
+ ".b16" => "image/vnd.pco.b16",
+ ".hdr" => "image/vnd.radiance",
+ ".rgbe" => "image/vnd.radiance",
+ ".xyze" => "image/vnd.radiance",
+ ".s1n" => "image/vnd.sealed.png",
+ ".spn" => "image/vnd.sealed.png",
+ ".spng" => "image/vnd.sealed.png",
+ ".s1g" => "image/vnd.sealedmedia.softseal.gif",
+ ".sgi" => "image/vnd.sealedmedia.softseal.gif",
+ ".sgif" => "image/vnd.sealedmedia.softseal.gif",
+ ".s1j" => "image/vnd.sealedmedia.softseal.jpg",
+ ".sjp" => "image/vnd.sealedmedia.softseal.jpg",
+ ".sjpg" => "image/vnd.sealedmedia.softseal.jpg",
+ ".tap" => "image/vnd.tencent.tap",
+ ".vtf" => "image/vnd.valve.source.texture",
+ ".wbmp" => "image/vnd.wap.wbmp",
+ ".xif" => "image/vnd.xiff",
+ ".pcx" => "image/vnd.zbrush.pcx",
+ ".ras" => "image/x-cmu-raster",
+ ".pnm" => "image/x-portable-anymap",
+ ".pbm" => "image/x-portable-bitmap",
+ ".pgm" => "image/x-portable-graymap",
+ ".ppm" => "image/x-portable-pixmap",
+ ".rgb" => "image/x-rgb",
+ ".tga" => "image/x-targa",
+ ".xbm" => "image/x-xbitmap",
+ ".xpm" => "image/x-xpixmap",
+ ".xwd" => "image/x-xwindowdump",
+ ".u8msg" => "message/global",
+ ".u8dsn" => "message/global-delivery-status",
+ ".u8mdn" => "message/global-disposition-notification",
+ ".u8hdr" => "message/global-headers",
+ ".art" => "message/rfc822",
+ ".eml" => "message/rfc822",
+ ".mail" => "message/rfc822",
+ ".gltf" => "model/gltf+json",
+ ".glb" => "model/gltf-binary",
+ ".iges" => "model/iges",
+ ".igs" => "model/iges",
+ ".mesh" => "model/mesh",
+ ".msh" => "model/mesh",
+ ".silo" => "model/mesh",
+ ".mtl" => "model/mtl",
+ ".obj" => "model/obj",
+ ".stl" => "model/stl",
+ ".vrml" => "model/vrml",
+ ".wrl" => "model/vrml",
+ ".x3db" => "model/x3d+xml",
+ ".x3dv" => "model/x3d-vrml",
+ ".x3dvz" => "model/x3d-vrml",
+ ".dae" => "model/vnd.collada+xml",
+ ".dwf" => "model/vnd.dwf",
+ ".dor" => "model/vnd.gdl",
+ ".gdl" => "model/vnd.gdl",
+ ".gsm" => "model/vnd.gdl",
+ ".ism" => "model/vnd.gdl",
+ ".lmp" => "model/vnd.gdl",
+ ".msm" => "model/vnd.gdl",
+ ".rsm" => "model/vnd.gdl",
+ ".win" => "model/vnd.gdl",
+ ".gtw" => "model/vnd.gtw",
+ ".moml" => "model/vnd.moml+xml",
+ ".mts" => "model/vnd.mts",
+ ".ogex" => "model/vnd.opengex",
+ ".pyo" => "model/vnd.pytha.pyox",
+ ".pyox" => "model/vnd.pytha.pyox",
+ ".vds" => "model/vnd.sap.vds",
+ ".usdz" => "model/vnd.usdz+zip",
+ ".bsp" => "model/vnd.valve.source.compiled-map",
+ ".vtu" => "model/vnd.vtu",
+ ".vpm" => "multipart/voice-message",
+ ".bmed" => "multipart/vnd.bint.med-plus",
+ ".sgm" => "text/SGML",
+ ".sgml" => "text/SGML",
+ ".appcache" => "text/cache-manifest",
+ ".manifest" => "text/cache-manifest",
+ ".ics" => "text/calendar",
+ ".ifb" => "text/calendar",
+ ".CQL" => "text/cql",
+ ".css" => "text/css;charset=utf-8",
+ ".csv" => "text/csv;charset=utf-8",
+ ".csvs" => "text/csv-schema",
+ ".soa" => "text/dns",
+ ".zone" => "text/dns",
+ ".gff3" => "text/gff3",
+ ".htm" => "text/html",
+ ".html" => "text/html",
+ ".sandboxed" => "text/html-sandboxed",
+ ".js" => "text/javascript",
+ ".mjs" => "text/javascript",
+ ".cnd" => "text/jcr-cnd",
+ ".markdown" => "text/markdown;charset=utf-8",
+ ".md" => "text/markdown;charset=utf-8",
+ ".miz" => "text/mizar",
+ ".n3" => "text/n3",
+ ".asc" => "text/plain;charset=utf-8",
+ ".c" => "text/plain;charset=utf-8",
+ ".cc" => "text/plain;charset=utf-8",
+ ".conf" => "text/plain;charset=utf-8",
+ ".cxx" => "text/plain;charset=utf-8",
+ ".el" => "text/plain;charset=utf-8",
+ ".f90" => "text/plain;charset=utf-8",
+ ".h" => "text/plain;charset=utf-8",
+ ".hh" => "text/plain;charset=utf-8",
+ ".hxx" => "text/plain;charset=utf-8",
+ ".log" => "text/plain;charset=utf-8",
+ ".pm" => "text/plain;charset=utf-8",
+ ".spec" => "text/plain;charset=utf-8",
+ ".text" => "text/plain;charset=utf-8",
+ ".txt" => "text/plain;charset=utf-8",
+ ".provn" => "text/provenance-notation",
+ ".rst" => "text/prs.fallenstein.rst",
+ ".dsc" => "text/prs.lines.tag",
+ ".tag" => "text/prs.lines.tag",
+ ".rtx" => "text/richtext",
+ ".shaclc" => "text/shaclc",
+ ".shc" => "text/shaclc",
+ ".spdx" => "text/spdx",
+ ".tsv" => "text/tab-separated-values",
+ ".roff" => "text/troff",
+ ".t" => "text/troff",
+ ".tr" => "text/troff",
+ ".ttl" => "text/turtle",
+ ".uri" => "text/uri-list",
+ ".uris" => "text/uri-list",
+ ".vcard" => "text/vcard",
+ ".vcf" => "text/vcard",
+ ".vtt" => "text/vtt",
+ ".rng" => "text/xml",
+ ".xml" => "text/xml",
+ ".xsd" => "text/xml",
+ ".ent" => "text/xml-external-parsed-entity",
+ ".dms" => "text/vnd.DMClientScript",
+ ".a" => "text/vnd.a",
+ ".abc" => "text/vnd.abc",
+ ".ascii" => "text/vnd.ascii-art",
+ ".copyright" => "text/vnd.debian.copyright",
+ ".sub" => "text/vnd.dvb.subtitle",
+ ".jtd" => "text/vnd.esmertec.theme-descriptor",
+ ".flt" => "text/vnd.ficlab.flt",
+ ".fly" => "text/vnd.fly",
+ ".flx" => "text/vnd.fmi.flexstor",
+ ".dot" => "text/vnd.graphviz",
+ ".gv" => "text/vnd.graphviz",
+ ".hans" => "text/vnd.hans",
+ ".hgl" => "text/vnd.hgl",
+ ".3dm" => "text/vnd.in3d.3dml",
+ ".3dml" => "text/vnd.in3d.3dml",
+ ".spo" => "text/vnd.in3d.spot",
+ ".spot" => "text/vnd.in3d.spot",
+ ".mpf" => "text/vnd.ms-mediapackage",
+ ".ccc" => "text/vnd.net2phone.commcenter.command",
+ ".mc2" => "text/vnd.senx.warpscript",
+ ".uric" => "text/vnd.si.uricatalogue",
+ ".sos" => "text/vnd.sosi",
+ ".jad" => "text/vnd.sun.j2me.app-descriptor",
+ ".ts" => "text/vnd.trolltech.linguist",
+ ".si" => "text/vnd.wap.si",
+ ".sl" => "text/vnd.wap.sl",
+ ".wml" => "text/vnd.wap.wml",
+ ".wmls" => "text/vnd.wap.wmlscript",
+ ".pod" => "text/x-pod",
+ ".etx" => "text/x-setext",
+ ".3gp" => "video/3gpp",
+ ".3gpp" => "video/3gpp",
+ ".3g2" => "video/3gpp2",
+ ".3gpp2" => "video/3gpp2",
+ ".m4s" => "video/iso.segment",
+ ".mj2" => "video/mj2",
+ ".mjp2" => "video/mj2",
+ ".m4v" => "video/mp4",
+ ".mp4" => "video/mp4",
+ ".mpg4" => "video/mp4",
+ ".m1v" => "video/mpeg",
+ ".m2v" => "video/mpeg",
+ ".mpe" => "video/mpeg",
+ ".mpeg" => "video/mpeg",
+ ".mpg" => "video/mpeg",
+ ".ogv" => "video/ogg",
+ ".mov" => "video/quicktime",
+ ".qt" => "video/quicktime",
+ ".webm" => "video/webm",
+ ".uvh" => "video/vnd.dece.hd",
+ ".uvvh" => "video/vnd.dece.hd",
+ ".uvm" => "video/vnd.dece.mobile",
+ ".uvvm" => "video/vnd.dece.mobile",
+ ".uvu" => "video/vnd.dece.mp4",
+ ".uvvu" => "video/vnd.dece.mp4",
+ ".uvp" => "video/vnd.dece.pd",
+ ".uvvp" => "video/vnd.dece.pd",
+ ".uvs" => "video/vnd.dece.sd",
+ ".uvvs" => "video/vnd.dece.sd",
+ ".uvv" => "video/vnd.dece.video",
+ ".uvvv" => "video/vnd.dece.video",
+ ".dvb" => "video/vnd.dvb.file",
+ ".fvt" => "video/vnd.fvt",
+ ".m4u" => "video/vnd.mpegurl",
+ ".mxu" => "video/vnd.mpegurl",
+ ".pyv" => "video/vnd.ms-playready.media.pyv",
+ ".nim" => "video/vnd.nokia.interleaved-multimedia",
+ ".bik" => "video/vnd.radgamettools.bink",
+ ".bk2" => "video/vnd.radgamettools.bink",
+ ".smk" => "video/vnd.radgamettools.smacker",
+ ".s11" => "video/vnd.sealed.mpeg1",
+ ".smpg" => "video/vnd.sealed.mpeg1",
+ ".s14" => "video/vnd.sealed.mpeg4",
+ ".ssw" => "video/vnd.sealed.swf",
+ ".sswf" => "video/vnd.sealed.swf",
+ ".s1q" => "video/vnd.sealedmedia.softseal.mov",
+ ".smo" => "video/vnd.sealedmedia.softseal.mov",
+ ".smov" => "video/vnd.sealedmedia.softseal.mov",
+ ".viv" => "video/vnd.vivo",
+ ".yt" => "video/vnd.youtube.yt",
+ ".axv" => "video/x-annodex",
+ ".flv" => "video/x-flv",
+ ".fxm" => "video/x-javafx",
+ ".mkv" => "video/x-matroska",
+ ".mk3d" => "video/x-matroska-3d",
+ ".asx" => "video/x-ms-asf",
+ ".wm" => "video/x-ms-wm",
+ ".wmv" => "video/x-ms-wmv",
+ ".wmx" => "video/x-ms-wmx",
+ ".wvx" => "video/x-ms-wvx",
+ ".avi" => "video/x-msvideo",
+ ".movie" => "video/x-sgi-movie",
+ ".ice" => "x-conference/x-cooltalk",
+ ".sisx" => "x-epoc/x-sisx-app",
+ "README" => "text/plain;charset=utf-8",
+ "Makefile" => "text/x-makefile;charset=utf-8",
+
+ # enable caching for unknown mime types:
+ "" => "application/octet-stream"
+)
diff --git a/server/modules.conf b/server/modules.conf
new file mode 100644
index 0000000..e25538c
--- /dev/null
+++ b/server/modules.conf
@@ -0,0 +1,9 @@
+server.modules = (
+# "mod_rewrite",
+ "mod_access",
+# "mod_auth",
+# "mod_authn_file",
+# "mod_redirect",
+# "mod_setenv",
+# "mod_alias",
+)
diff --git a/site/DejaVuSans.woff2 b/site/DejaVuSans.woff2
new file mode 100644
index 0000000..8437d4e
--- /dev/null
+++ b/site/DejaVuSans.woff2
Binary files differ
diff --git a/site/css/math.css b/site/css/math.css
new file mode 100644
index 0000000..d111d1f
--- /dev/null
+++ b/site/css/math.css
@@ -0,0 +1,41 @@
+/*
+p.author
+p.date
+p.creator
+.title
+.subtitle
+.todo
+.done
+.WAITING
+.timestamp
+.timestamp-kwd
+.timestamp-wrapper
+.tag
+._HOME
+.target
+.linenr
+.code-highlighted
+div.outline-N
+div.outline-text-N
+.section-number-N
+.figure-number
+.table-number
+.listing-number
+div.figure
+pre.src
+pre.example
+p.verse
+div.footnotes
+p.footnote
+.footref
+.footnum
+.org-svg
+*/
+
+/*
+html {
+ height: 100%;
+ color: #cccccc;
+ background-color: hsl(240, 30%, 50%);
+}
+*/
diff --git a/site/css/style.css b/site/css/style.css
new file mode 100644
index 0000000..c8e04e0
--- /dev/null
+++ b/site/css/style.css
@@ -0,0 +1,166 @@
+@font-face {
+ font-family: "DejaVuSans";
+ src: url(/DejaVuSans.woff2) format("woff2");
+}
+
+/* Main layout of the page */
+
+html {
+ height: 100%;
+ background-color: hsl(240, 30%, 50%);
+ font-family: "DejaVuSans";
+}
+
+body {
+ margin: auto;
+ max-width: 25cm;
+ min-height: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+body, header {
+ background-color: hsl(240, 30%, 80%);
+}
+
+header {
+ text-align: center;
+}
+
+header > * {
+ margin: 0.5rem auto;
+}
+
+nav {
+ background-color: hsl(240, 30%, 20%);
+}
+
+nav > ul {
+ display: flex;
+ padding: 0;
+ margin: 0 auto;
+}
+
+nav li {
+ display: block;
+ list-style: none;
+}
+
+nav li:hover {
+ background-color: hsl(240, 30%, 30%);
+}
+
+nav > ul > li:last-child {
+ margin-left: auto;
+}
+
+nav a {
+ text-decoration: none;
+ color: #dddddd;
+ display: block;
+ line-height: 2em;
+ height: 2em;
+ padding: 0 1em;
+}
+
+main {
+ padding: 2em;
+ flex-grow: 1;
+}
+
+footer {
+ padding: 1em 2em;
+}
+
+/* Other elements */
+
+h1, h2, h3, h4, h5, h6 {
+ text-align: center;
+}
+
+hr {
+ margin: 0;
+ margin-top: auto;
+}
+
+figure {
+ text-align: center;
+}
+
+figure img {
+ /* max-width: 30em; */
+ max-width: 100%;
+ object-fit: contain;
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+figcaption {
+ margin-top: 1em;
+}
+
+.equation-container {
+ display: block;
+ padding: 1em 2em;
+ overflow: auto;
+}
+
+.equation-container img {
+ object-fit: contain;
+ display: block;
+ margin: auto;
+}
+
+pre, figure, .equation-container {
+ margin: 1rem;
+ padding: 1rem;
+ box-sizing: border-box;
+ background-color: hsl(240, 30%, 90%);
+ border: 1px solid hsl(240, 60%, 50%);
+ overflow: scroll;
+
+}
+
+/* Inline math */
+p > .org-svg {
+ max-height: 1rem;
+ display: inline-block;
+}
+
+.article-date {
+ margin-left: auto;
+}
+
+.link-like, a {
+ color: #111111;
+ text-decoration: underline;
+}
+
+/* Source code */
+.src-common-lisp .org-keyword {
+ color: #3a81c3;
+ font-weight: bold;
+}
+
+.src-common-lisp .org-builtin {
+ color: #3a81c3;
+}
+
+.src-common-lisp .org-function-name {
+ color: #6c3163;
+ font-weight: bold;
+}
+
+.src-common-lisp .org-doc {
+ color: #da8b55;
+}
+
+.src-common-lisp .org-comment {
+ color: #2aa1ae;
+}
+
+/* NOTE: orgmode uses `code` only for inline code */
+code {
+ background-color: hsl(240, 40%, 90%);
+}
diff --git a/site/img/programmer_side.png b/site/img/programmer_side.png
new file mode 100644
index 0000000..a3f4baa
--- /dev/null
+++ b/site/img/programmer_side.png
Binary files differ
diff --git a/site/img/programmer_top.png b/site/img/programmer_top.png
new file mode 100644
index 0000000..827464e
--- /dev/null
+++ b/site/img/programmer_top.png
Binary files differ
diff --git a/site/img/prototype1.jpg b/site/img/prototype1.jpg
new file mode 100644
index 0000000..33ac569
--- /dev/null
+++ b/site/img/prototype1.jpg
Binary files differ
diff --git a/site/img/prototype2_1.jpg b/site/img/prototype2_1.jpg
new file mode 100644
index 0000000..64d0786
--- /dev/null
+++ b/site/img/prototype2_1.jpg
Binary files differ
diff --git a/site/img/prototype2_2.jpg b/site/img/prototype2_2.jpg
new file mode 100644
index 0000000..349c04b
--- /dev/null
+++ b/site/img/prototype2_2.jpg
Binary files differ
diff --git a/site/robots.txt b/site/robots.txt
new file mode 100644
index 0000000..b463ba6
--- /dev/null
+++ b/site/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow: /privacy.html
diff --git a/site/sitemap b/site/sitemap
new file mode 100644
index 0000000..33c5925
--- /dev/null
+++ b/site/sitemap
@@ -0,0 +1,26 @@
+https://thomaslabs.org/privacy.html
+https://thomaslabs.org/index.html
+https://thomaslabs.org/arm/adventures.html
+https://thomaslabs.org/programs/index.html
+https://thomaslabs.org/z80/index.html
+https://thomaslabs.org/z80/prototype1.html
+https://thomaslabs.org/z80/spi.html
+https://thomaslabs.org/z80/prototype2.html
+https://thomaslabs.org/z80/plm.html
+https://thomaslabs.org/math/spherical-harmonics.html
+https://thomaslabs.org/math/laplace.html
+https://thomaslabs.org/math/diff.html
+https://thomaslabs.org/math/variation.html
+https://thomaslabs.org/math/lagrange.html
+https://thomaslabs.org/math/derivatives.html
+https://thomaslabs.org/math/cylindrical_coordinates.html
+https://thomaslabs.org/math/polar_coordinates.html
+https://thomaslabs.org/math/vectors.html
+https://thomaslabs.org/math/matrices.html
+https://thomaslabs.org/math/integrals.html
+https://thomaslabs.org/math/levi_cevita.html
+https://thomaslabs.org/math/index.html
+https://thomaslabs.org/math/spherical_coordinates.html
+https://thomaslabs.org/math/orbit.html
+https://thomaslabs.org/math/trigonometry.html
+https://thomaslabs.org/math/fft.html
diff --git a/site/thomas.pub b/site/thomas.pub
new file mode 100644
index 0000000..87b380f
--- /dev/null
+++ b/site/thomas.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCz+zwLS2s41AFwBAb/sj7B0s9v9OcMWnNQ1QgHlYQOgHHsat1MOdfFGh1Le7qAE+LxXBxsUIUq3sXC3Ui53AKz3lFG1YPGdLA48a156Xxqhb4m4cbuUZ0Gg3hazeEjQXu+451o3ZzmSy6jWx9eGMtE2tzb5RvCwVBZixsWm8DUAzdl1xrGekZXliJcr2EAI5utJHjleNGwWJ5UD6/YL8XDkUhtRIGqNLjXqlQ+J3vMb4xQ3npuPLoCupU3FdqPjhayOiZlCIOEWPr0TNVMi89pb94+9yDrZmfHZhysv+OVei+0qS+qgVSu4chi80VHAdTuY6gJgib2kIxI3uU1Di9pRHGQQ6VNjJtOjfzetK1gGXw7ANUG53NX00wtLfqddfANNFYKSI+iLqls/AxMthSXyFk3W1b5fTTtZoHVqBTl5vtmoVRtr7feEwG9Y9g7xTZLmRK/Nzo9x55Cthga0T8Ibq2dDh4Wfyy8pam8vn99nlHZ7Uw/+AS4/zlpwEloESC3px6eBitbNznsXZnogs1V8vgMXY/nWBJblHl7eGfZaP8yRCwqljuu+NoARyFkcCr+N1hocOQiqGYqTtqeWzs4piIA/36SUj9pzuukzY3tkhamkCX9pUrcCK9vPIIbTY503AjUMvCdgfBZ4bHwgcKJt+5hTWrBArVCeLGaK2lcGw== thomas@alpha
diff --git a/src/abgabe.org b/src/abgabe.org
deleted file mode 100644
index 772d04d..0000000
--- a/src/abgabe.org
+++ /dev/null
@@ -1,101 +0,0 @@
-#+TITLE: Übungsblatt 5 - Aufgabe 3
-#+HTML_HEAD_EXTRA: <meta name="robots" content="noindex">
-#+SETUPFILE: ../options.org
-
-[[https://thomaslabs.org/shortcoil.m][Quellcode herunterladen]]
-
-* Ergebnisse des Programms
-[[https://thomaslabs.org/media/betrag.png]]
-
-[[https://thomaslabs.org/media/richtung.png]]
-
-[[https://thomaslabs.org/media/spulenachse.png]]
-* Octave / Matlab Quellcode
-#+BEGIN_SRC octave
- clear all;
- close all;
- clc;
-
- %% length of the observed region in m
- len = 40e-3; %m
- len = len / 2; %we shall go from -len to +len
- %% number of points in x- and z-direction
- N_space = 50;
- %% number of points for integration along coil
- N_phi = 250;
- %% radius
- R = 5e-3; %m
- %% length
- L = 23e-3; %m
- %% number of windings
- N = 5;
- %% current
- I = 8; %A
- %% vacuumpermeability
- mu0 = 4 * pi * 1e-7; %Vs/Am
-
- %% define grid
- z = linspace(-len, len, N_space); %m
- x = linspace(-len, len, N_space); %m
-
- %% parameter of coil-wire-path-paramtrisation
- phi = linspace(0, N * 2 * pi, N_phi);
- dphi = phi(2) - phi(1);
-
- %% Precalculate cos and sin
- p_sin = sin(phi);
- p_cos = cos(phi);
-
- %% loop through all x-z-points
- for iz = 1 : N_space
- for ix = 1 : N_space
- %% r of this x-z-point
- r = [x(ix); 0; z(iz)];
- B = [0; 0; 0];
-
- %% Riemann sum along the coil
- for ip = 1 : N_phi
- %% Point along the coil
- l = [R * p_cos(ip); R * p_sin(ip); ip * L / N_phi - L / 2];
- %% Vector tangent to the coil of length dl = R * dphi
- dl = [- R * p_sin(ip); R * p_cos(ip); L / 2 / N / pi];
- dl = (R * dphi / norm(dl)) * dl;
- %% Vector from the coil to the x-z-point
- rp = r - l;
- %% Add dB
- B = B + (mu0 / 4 / pi) * I * (1 / norm(rp) ^ 3) * cross(dl, rp);
- end
-
- B_X(iz, ix) = B(1);
- B_Y(iz, ix) = B(2);
- B_Z(iz, ix) = B(3);
- end
- end
-
- figure('Name', 'Richtung der Flußdichte', 'NumberTitle', 'off');
- quiver(x * 1e3, z * 1e3, B_X ./ sqrt(B_X .^ 2 + B_Z .^ 2),
- B_Z ./ sqrt(B_X .^ 2 + B_Z .^ 2));
- title('Richtung der Flußdichte')
- xlabel('x [mm]')
- ylabel('z [mm]')
- axis image
- saveas(gca, 'richtung.png')
-
- betrag = sqrt(B_X .^ 2 + B_Y .^ 2 + B_Z .^ 2)
- figure('Name', 'Betrag der Flußdichte', 'NumberTitle', 'off');
- imagesc(x * 1e3, z * 1e3, betrag);
- title('Betrag der Flußdichte');
- xlabel('x [mm]')
- ylabel('z [mm]')
- colormap(gray);
- colorbar('title', 'B [T]');
- saveas(gca, 'betrag.png')
-
- figure('Name', 'Flußdichte entlang Spulenachse', 'NumberTitle', 'off');
- B_2 = B_Z(:, round((N_space - 1) / 2));
- plot(x * 1e3, B_2);
- title('Flußdichte entlang Spulenachse');
- xlabel('z [mm]');
- ylabel('Flußdichte [T]');
- saveas(gca, 'spulenachse.png')
-#+END_SRC
diff --git a/src/arm/adventures.org b/src/arm/adventures.org
new file mode 100644
index 0000000..8712435
--- /dev/null
+++ b/src/arm/adventures.org
@@ -0,0 +1,58 @@
+#+title: New adventures in ARM
+#+author: Thomas Albers Raviola
+#+date: 2022-10-10
+
+* Backgroud
+If you have read my poorly written articles about my Z80 computers, it is
+probably no surprise that I ended up playing with ARM processors.
+
+Way back I bought a Beaglebone Black based on the Sitara AM335x series of armhf
+processors. I never really gave it much use as I got more interested in Z80 and
+the idea of myself building and soldering my own computer.
+
+This changed some weeks ago, when while enjoying the free time between semesters
+at university I decided to buy a Pinenote from Pine64. I had seen before the
+E-Ink tablet of one of my tutors and wanted to replace taking notes on paper for
+some kind of digital form. Initially I used my X200T laptop for this end but the
+battery life does leave some performance to wish for.
+
+The alternatives I found in the market shared all the same disadvantages. For
+example, the reMarkable tablet of my Tutor seems to work in some kind of
+restricted ecosystem with cloud syncing bullshit I don't care about.
+
+If I am not able to run the software I want, I don't care about the product.
+
+The Pinenote on the other hand, while still in development and with basically no
+finished software ready, is designed to leave complete freedom to the user.
+
+My plan was to experiment with my Beaglebone, learning to compile a kernel and a
+GNU/Linux distro for ARM and then apply this knowledge to port some system to
+the Pinenote.
+
+This however was not at all necessary, as there are already people who have
+reverse engineered the DRM driver for the display and documented how to comile a
+custom kernel to run on the ARM processor of the Pinenote. This process ended up
+being actually really easy.
+
+I won't claim to be able to explain it better. Nonetheless I have documented (or
+will) the process as part of this series of articles about my experiments with
+low-level ARM hacking.
+
+This topic evolved rapidly into an extremly deep rabbit hole. As I still plan to
+learn how the boot process for ARM devices work by writing a bare-bones blink
+LED code, the Hello World! of low-level programming, for my Beaglebone. I plan
+this to be the continuation of me learning low-level stuff as with my Z80.
+
+I also discovered that the ebook reader I had and that now is left redundant by
+my Pinenote also has an ARM processor (I know, not a big surprise). But instead
+of writing the system to a eMMC, tolino packed a SD card with the system,
+rendering the process of testing other code a trivial one.
+
+Given my despise for Android and how satisfied I am with my Pinenote, I actually
+decided to buy the Pinephone Pro and the Pinebook Pro. When the time comes, I
+would like to also write articles on how I port my favourite GNU/Linux distro,
+GNU/Guix, to these platforms. Hopefully I won't need to use a damn Android
+device ever again and will actually be able to use my devices the way I want.
+
+Ranting aside, I now invite you to check the writings about the findings in my
+new adventures in the ARM world.
diff --git a/math/cylindrical_coordinates.org b/src/math/cylindrical_coordinates.org
index fab185b..bfb6d57 100644
--- a/math/cylindrical_coordinates.org
+++ b/src/math/cylindrical_coordinates.org
@@ -1,14 +1,11 @@
-#+TITLE:Cylindrical Coordinates
-#+SETUPFILE: ../math_options.org
-#+LATEX_HEADER: \usepackage{bm}
-#+LATEX_HEADER: \usepackage{mathtools}
-#+LATEX_HEADER: \newcommand{\deriv}[2]{\frac{\text{d}#1}{\text{d}#2}}
-#+LATEX_HEADER: \newcommand{\unitv}[1]{\bm{\hat{e}}_#1}
+#+title:Cylindrical Coordinates
+#+setupfile: ../../math_options.org
* Disclaimer
This site as of now just a technology demonstration and its claims
should not be taken as true (even though I myself am pretty confident
they are)
+
* Coordinate transformations
\begin{align*}
x &= r \cos\varphi\\
@@ -22,6 +19,7 @@ z &= z
\unitv{\theta} &= -\sin\theta \unitv{x} + \cos\theta \unitv{y}\\
\unitv{z} &= \unitv{z}
\end{align*}
+
* Kinematic in cylindrical coordinates
** Time derivatives of the local unit vectors
\begin{align*}
@@ -29,6 +27,7 @@ z &= z
\deriv{\unitv{\theta}}{t} &= -\dot{\theta}\unitv{r}\\
\deriv{\unitv{z}}{t} &= 0
\end{align*}
+
** Position vector and its time derivatives
\begin{align*}
\bm{r} &= r\unitv{r} + z\unitv{z}\\
diff --git a/math/derivatives.org b/src/math/derivatives.org
index 4d5d4be..b9d431d 100644
--- a/math/derivatives.org
+++ b/src/math/derivatives.org
@@ -1,10 +1,5 @@
-#+TITLE:Table of Derivatives
-#+SETUPFILE: ../math_options.org
-#+LATEX_HEADER: \usepackage{bm}
-#+LATEX_HEADER: \usepackage{mathtools}
-#+LATEX_HEADER: \newcommand{\dcoff}[1]{\frac{\text{d}}{\text{d}x} #1}
-#+LATEX_HEADER: \newcommand{\sdcoff}[1]{\frac{\text{d}#1}{\text{d}x}}
-#+LATEX_HEADER: \newcommand{\deriv}[2]{\frac{\text{d}}{\text{d}x} #1 &= #2}
+#+title:Table of Derivatives
+#+setupfile: ../../math_options.org
* Disclaimer
This site as of now just a technology demonstration and its claims
@@ -22,10 +17,10 @@ Let $f$ and $g$ be real valued functions and $c$ some real constant:
* Trigonometric Funtions
\begin{align*}
-\deriv{\sin(x)}{\cos(x)}\\
-\deriv{\cos(x)}{-\sin(x)}\\
-\deriv{\tan(x)}{\sec^2(x)}\\
-\deriv{\sec(x)}{\sec(x)\tan(x)}\\
-\deriv{\csc(x)}{\csc(x)\cot(x)}\\
-\deriv{\csc(x)}{-\csc^2(x)}
+\ddx{\sin(x)} &= \cos(x)\\
+\ddx{\cos(x)} &= -\sin(x)\\
+\ddx{\tan(x)} &= \sec^2(x)\\
+\ddx{\sec(x)} &= \sec(x)\tan(x)\\
+\ddx{\csc(x)} &= \csc(x)\cot(x)\\
+\ddx{\csc(x)} &= -\csc^2(x)
\end{align*}
diff --git a/src/math/diff.org b/src/math/diff.org
new file mode 100644
index 0000000..bbb8fa6
--- /dev/null
+++ b/src/math/diff.org
@@ -0,0 +1,100 @@
+#+title: Method for solving first order and Bernoulli's differential equations
+#+author: Thomas Albers Raviola
+#+date: 2022-10-01
+#+setupfile: ../../math_options.org
+
+* Disclaimer
+This site as of now just a technology demonstration and its claims
+should not be taken as true (even though I myself am pretty confident
+they are)
+
+* History
+I came across the method concerning this article in an old math book from Doctor
+Granville (Elements of differential and integral calculus - ISBN-13:
+978-968-18-1178-5). It doesn't appear to be a popular technique as when using it
+for my assignments I always had to explain what I was doing. As of yet, I still
+haven't found another text referencing it, which is why I decided to include it
+in my website.
+
+In the original book this procedure is shown but never really explained, it is
+left as a sort of "it just works" thing. Here is my attempt to it clear.
+
+* Theory
+Throughout this article we'll consider first order differential equations with
+function coefficients just as a special case of the Bernoulli's differential
+equation with $n = 0$.
+
+Consider now the following ODE:
+\begin{equation*}
+y' + P(x)y = Q(x)y^n
+\end{equation*}
+
+let $y$ be the product of two arbitrary functions $w$ and $z$ such that
+
+\begin{align*}
+y &= wz \\
+y' &= w'z + wz'
+\end{align*}
+
+we now restrict $z$ to be the solution of the ODE
+
+\begin{equation*}
+z' + P(x)z = 0
+\end{equation*}
+
+with this it is possible to solve for $z$ by integrating
+
+\begin{equation*}
+\frac{z'}{z} = - P(x) \\
+\end{equation*}
+
+using $z$ we solve for $w$ by replacing $y$ inside the original ODE
+
+\begin{align*}
+w'z + wz' + P(x)wz &= Q(x)w^nz^n \\
+w'z + w\left(z' + P(x)z\right) &= Q(x)w^nz^n \\
+w'z &= Q(x)w^nz^n \\
+\frac{w'}{w^n} &= Q(x)z^{n-1} \\
+\end{align*}
+
+the general solution to our original ODE can be simply obtained by multiplying
+$w$ and $z$.
+
+* Comments
+This method, while functional, may not always be the most practical. In some
+cases the differential equations for $w$ and $z$ may not have closed algebraic
+solutions. A more traditional substitution may in some situations also be easier
+than this method. Like always it is up to one to know which tool to apply for a
+given problem.
+
+* Example
+Let's solve an example to show the method in practice
+
+\begin{align*}
+y' - 3x^2y &= -x^2y^3 \\
+w'z + wz' - 3x^2wz &= -x^2w^3z^3 \\
+w'z + w\left(z' - 3x^2z\right) &= -x^2w^3z^3
+\end{align*}
+
+solve now for $z$
+
+\begin{align*}
+z' - 3x^2z &= 0 \\
+\frac{z'}{z} &= 3x^2 \\
+z &= c e^{x^3}
+\end{align*}
+
+replace $z$ in the equation
+
+\begin{align*}
+w' &= -x^2w^3z^2 \\
+- \frac{w'}{w^3} &= c^2 e^(2x^3)x^2 \\
+\frac{1}{2 w^2} &= c^2\left(\frac{e^{2x^3}}{6} + k\right) \\
+w &= \pm \frac{1}{c} \sqrt{\frac{3}{e^{2x^3} + k}}
+\end{align*}
+
+finally with $w$ and $z$ get $y$
+
+\begin{equation*}
+y = \pm e^{x^3} \sqrt{\frac{3}{e^{2x^3} + k}}
+\end{equation*}
diff --git a/src/math/fft.org b/src/math/fft.org
new file mode 100644
index 0000000..45e9595
--- /dev/null
+++ b/src/math/fft.org
@@ -0,0 +1,141 @@
+#+title: Fast Fourier Transform
+#+subtitle: Implementation in Common Lisp
+#+author: Thomas Albers Raviola
+#+date: <2023-03-06>
+#+setupfile: ../../math_options.org
+
+In this article I attept to explain the principles of the fast fourier transform
+(FFT) and develop in incremental steps an implementation in common lisp.
+
+*NOTE*: This is part of my personal notes and as such may contain mistakes or
+not be correct at all. If you find any issues please contact me at my email
+address.
+
+* Introduction
+
+The FFT is an algorithm for computing the discrete fourier transform (DFT) of an
+array of values that is meant to be faster than the usual naive implementation.
+Instead of having the usual \[ O(n^2) \] behaviour it is an \[ O(n\log(n)) \]
+algorithm.
+
+* Derivation
+
+To derive the FFT we first consider the definition of the DFT
+
+Let \[ \xi_k \] be an array of N, possible complex, numbers. The DFT of \[ \xi_k
+\] is an array of the same length \[ x_k \] defined as:
+
+{{{beg-eqn}}}
+x_k = \sum_{n=0}^{N-1} \xi_n e^{- \frac{2 \pi i}{N} n k}
+{{{end-eqn}}}
+
+A possible implementation of this in code would be something like the following:
+
+#+begin_src common-lisp
+ (defun dft (x)
+ "Naive discrete fourier transform, not fft"
+ (flet ((transform (k)
+ (loop :with i = (complex 0 1)
+ :for n :below (length x)
+ :sum (* (aref x n) (exp (- (/ (* 2 pi i k n) (length x))))))))
+ (map-seq-iota #'transform (length x))))
+#+end_src
+
+But we can do a lot better in terms of performance. To this end we first split
+the sum {{{ref}}} into even and odd members
+
+{{{beg-align}}}
+x_k &= \sum_{n=0}^{N/2-1} \xi_{2n} e^{- \frac{2 \pi i}{N} (2n) k} +
+\sum_{n=0}^{N/2-1} \xi_{2n+1} e^{- \frac{2 \pi i}{N} (2n+1) k}\\
+&= \sum_{n=0}^{N/2-1} \xi_{2n} e^{- \frac{2 \pi i}{N/2} n k} +
+e^{-\frac{2 \pi i}{N}k} \sum_{n=0}^{N/2-1} \xi_{2n+1} e^{- \frac{2 \pi i}{N/2} n
+k}\\
+&=E_k + e^{-\frac{2 \pi i}{N}k} O_k
+{{{end-align}}}
+
+Where \[ E_k \] and \[ O_k \] themselves are FFTs of a smaller array each.
+Furthermore notice how thanks to the cyclic nature of the complex exponential
+function it is possible to half the number of computations:
+
+{{{beg-align}}}
+x_{k+\frac{N}{2}} &= E_{k+\frac{N}{2}} + e^{-\frac{2 \pi i}{N} (k +
+\frac{N}{2})} O_{k+\frac{N}{2}}\\
+&= E_k - e^{-\frac{2 \pi i}{N} k} O_k
+{{{end-align}}}
+
+Thus
+
+{{{beg-eqn}}}
+\begin{aligned}
+x_k &= E_k + e^{-\frac{2 \pi i}{N} k} O_k\\
+x_{k+\frac{N}{2}} &= E_k - e^{-\frac{2 \pi i}{N} k} O_k
+\end{aligned}\,\text{,}\quad k=0,\dots,\frac{N}{2}-1
+{{{end-eqn}}}
+
+* Implementing the FFT
+
+With the reduction identities we derived for the FFT a preliminary
+implementation could be:
+
+#+begin_src common-lisp
+ (defun fft (sequence)
+ (labels
+ ((fft-step (n step offset)
+ (let ((ret (make-array n)))
+ (if (= n 1)
+ (setf (aref ret 0) (aref sequence offset))
+ (loop
+ :with n2 = (/ n 2)
+ :with ek = (fft-step n2 (* 2 step) offset)
+ :with ok = (fft-step n2 (* 2 step) (+ offset step))
+ :for k :below n2
+ :for c = (exp (- (/ (* 2 pi (complex 0 1) k) n)))
+ :do
+ (setf (aref ret k) (+ (aref ek k) (* c (aref ok k)))
+ (aref ret (+ k n2)) (- (aref ek k) (* c (aref ok k))))))
+ ret)))
+ (fft-step (length sequence) 1 0)))
+#+end_src
+
+The function ~fft-step~ needs to be able to access both even and odd terms, for
+this we use the ~step~ and ~offset~ arguments. ~step~ indicate the distance
+between consecutive elements of the input to the fft. If we wanted to compute
+the FFT of the even terms, this distance would be 2. For the fft inside this
+outer fft of the even entries we also want to split further into even an odd
+members, this ~step~ needs to be 4 and so on. ~offset~ represents how many
+elements must be skipped until the first element of the subarray.
+
+Notice that we are allocating in each step a new array to return. The FFT can
+however be computed with a single array allocation. For that we store the values
+of \[ E_k \] in the first half of the return array and the values of \[ O_k \]
+in the second half. Finally we use the so called "butterfly" operations to
+compute the final result.
+
+#+caption: Diagram of the abstract data flow inside the FFT. Observe how the FFT itself is define recursively halving the number of items in each step
+[[/svg/fft.svg]]
+
+#+begin_src common-lisp
+ (defun fft* (sequence)
+ (let ((result (make-array (length sequence))))
+ (labels ((fft-step (n step offset roffset)
+ (if (= n 1)
+ (setf (aref result roffset) (aref sequence offset))
+ (let ((n2 (/ n 2)))
+ (fft-step n2 (* 2 step) offset roffset) ; e_k
+ (fft-step n2 (* 2 step) (+ offset step) (+ roffset n2)) ; o_k
+ (loop :for k :below n2
+ :for j = (+ roffset k)
+ :for c = (exp (- (/ (* 2 pi (complex 0d0 1d0) k) n)))
+ :for ek = (aref result j)
+ :for ok = (aref result (+ j n2))
+ :do
+ (setf (aref result j) (+ ek (* c ok))
+ (aref result (+ j n2)) (- ek (* c ok))))))))
+ (fft-step (length sequence) 1 0 0)
+ result)))
+#+end_src
+
+There are still many optimizations that could be made to speed up our code, like
+twiddle factors, cache optimizations and more. But this goes beyond the scope I
+planned for this article. Many would probably be also beyond the scope of my
+current abilities.
diff --git a/src/math/index.org b/src/math/index.org
new file mode 100644
index 0000000..38e2eaa
--- /dev/null
+++ b/src/math/index.org
@@ -0,0 +1,19 @@
+#+title: Math and Physics articles
+#+setupfile: ../../math_options.org
+
+- [[file:vectors.org][Cross Product]]
+- [[file:cylindrical_coordinates.org][Cylindrical Coordinates]]
+- [[file:fft.org][Fast Fourier Transform]]
+- [[file:lagrange.org][Lagrange Mechanics]]
+- [[file:laplace.org][Laplace Transformations]]
+- [[file:matrices.org][Matrix Properties]]
+- [[file:diff.org][Method for solving first order and Bernoulli's differential equations]]
+- [[file:orbit.org][Orbit]]
+- [[file:polar_coordinates.org][Polar Coordinates]]
+- [[file:spherical-harmonics.org][Solving the laplace equation in Spherical coordinates]]
+- [[file:spherical_coordinates.org][Spherical Coordinates]]
+- [[file:derivatives.org][Table of Derivatives]]
+- [[file:integrals.org][Table of Integrals]]
+- [[file:levi_cevita.org][The Levi Cevita Symbol]]
+- [[file:trigonometry.org][Trigonometric identities]]
+- [[file:variation.org][Variation Calculus]] \ No newline at end of file
diff --git a/src/math/integrals.org b/src/math/integrals.org
new file mode 100644
index 0000000..a8e9677
--- /dev/null
+++ b/src/math/integrals.org
@@ -0,0 +1,35 @@
+#+title:Table of Integrals
+#+setupfile: ../../math_options.org
+
+* Disclaimer
+This site as of now just a technology demonstration and its claims
+should not be taken as true (even though I myself am pretty confident
+they are)
+
+* $a + bx$
+\begin{align*}
+\intg{(a + bx)^n}{\frac{(a+bx)^{n+1}}{b(n+1)}}\\
+\int\frac{\D{x}}{a + bx} &= \frac{1}{b}\log(a+bx) + C\\
+\int\frac{x\D{x}}{a + bx} &= \frac{1}{b^2}(a + bx - a\log(a+bx)) + C
+\end{align*}
+
+* Trigonometric Funtions
+\begin{align*}
+\intg{\sin(x)}{-\cos(x)}\\
+\intg{\cos(x)}{\sin(x)}\\
+\intg{\tan(x)}{-\ln(\cos(x))}\\
+\intg{\sec(x)}{\ln(\sec(x) + \tan(x))}\\
+\intg{\csc(x)}{-\ln(\csc(x) + \cot(x))}\\
+\intg{\cot(x)}{\ln(\sin(x))}
+\end{align*}
+* Hyperbolic Funtions as results
+\begin{align*}
+\int\frac{\text{d}x}{\sqrt{x^2 + a^2}} &= \arsinh{\frac{x}{a}} + C\\
+\int\frac{\text{d}x}{\sqrt{x^2 - a^2}} &= \arcosh{\frac{x}{a}} + C\\
+\int\frac{\text{d}x}{a^2 - x^2} &= \frac{1}{a}\artanh{\frac{x}{a}} + C\\
+%\int\frac{\text{d}x}{x^2 - a^2} &= -\frac{1}{a}\arcoth{\frac{x}{a}} + C\\
+\int\frac{\text{d}x}{x\sqrt{a^2 - x^2}} &= -\frac{1}{a}\arsech{\frac{x}{a}} + C\\
+\int\frac{\text{d}x}{x\sqrt{x^2 + a^2}} &= -\frac{1}{a}\arcsch{\frac{x}{a}} + C\\
+\intg{\sqrt{x^2+a^2}}{\frac{x}{2}\sqrt{x^2+a^2} + \frac{a^2}{2}\arsinh{\frac{x}{a}}}\\
+\intg{\sqrt{x^2-a^2}}{\frac{x}{2}\sqrt{x^2-a^2} - \frac{a^2}{2}\arcosh{\frac{x}{a}}}
+\end{align*}
diff --git a/src/math/lagrange.org b/src/math/lagrange.org
new file mode 100644
index 0000000..565c7e7
--- /dev/null
+++ b/src/math/lagrange.org
@@ -0,0 +1,23 @@
+#+title:Lagrange Mechanics
+#+author: Thomas Albers Raviola
+#+date: 2022-10-01
+#+setupfile: ../../math_options.org
+
+* Disclaimer
+This site as of now just a technology demonstration and its claims
+should not be taken as true (even though I myself am pretty confident
+they are)
+
+* Eliminating the constraints
+\begin{align*}
+m_i \ddot{x}_i &= F_i + \sum_{n=1}^R \lambda_n \pderiv{g_n}{x_i}\\
+m_i \ddot{x}_i \pderiv{x_i}{q_k} &= F_i \pderiv{x_i}{q_k} + \sum_{n=1}^R \lambda_n \pderiv{g_n}{x_i} \pderiv{x_i}{q_k}\\
+\sum_{i=1}^{3N} m_i \ddot{x}_i \pderiv{x_i}{q_k} &= \sum_{i=1}^{3N}F_i \pderiv{x_i}{q_k} + \sum_{n=1}^R \lambda_n \sum_{i=1}^{3N} \pderiv{g_n}{x_i} \pderiv{x_i}{q_k}\\
+\sum_{i=1}^{3N} m_i \ddot{x}_i \pderiv{x_i}{q_k} &= \sum_{i=1}^{3N}F_i \pderiv{x_i}{q_k} + \sum_{n=1}^R \lambda_n \deriv{g_n}{q_k}\\
+\sum_{i=1}^{3N} m_i \ddot{x}_i \pderiv{x_i}{q_k} &= \sum_{i=1}^{3N}F_i \pderiv{x_i}{q_k}\\
+\deriv{}{t}\pderiv{(T - U)}{\dot{q}_k} - \pderiv{T}{q_k} &= \sum_{i=1}^{3N}F_i \pderiv{x_i}{q_k}\\
+\deriv{}{t}\pderiv{(T - U)}{\dot{q}_k} - \pderiv{T}{q_k} &= - \sum_{i=1}^{3N}\pderiv{U}{x_i} \pderiv{x_i}{q_k}\\
+\deriv{}{t}\pderiv{(T - U)}{\dot{q}_k} - \left(\pderiv{T}{q_k} - \pderiv{U}{q_k}\right) &= 0\\
+\deriv{}{t}\pderiv{(T - U)}{\dot{q}_k} - \pderiv{T - U}{q_k} &= 0\\
+\deriv{}{t}\pderiv{\mathcal{L}}{\dot{q}_k} - \pderiv{\mathcal{L}}{q_k} &= 0
+\end{align*}
diff --git a/src/math/laplace.org b/src/math/laplace.org
new file mode 100644
index 0000000..ea2c638
--- /dev/null
+++ b/src/math/laplace.org
@@ -0,0 +1,39 @@
+#+title:Laplace Transformations
+#+author: Thomas Albers Raviola
+#+date: 2022-10-01
+#+setupfile: ../../math_options.org
+
+\begin{align*}
+\delta(t) & 1\\
+\delta(t - a) & e^{as}\\
+1 & \frac{1}{s}\\
+t & \frac{1}{s^2}\\
+\frac{t^{n-1}}{(n-1)!} & \frac{1}{s^n}, n \in \mathbb{N}\\
+\frac{t^{a-1}}{\Gamma(a)} & \frac{1}{s^a}\\
+e^{-at} & \frac{1}{s+a}\\
+\frac{t^{n-1}e^{-at}}{(n-1)!} & \frac{1}{(s+a)^n}, n \in \mathbb{N}\\
+\frac{e^{-at}-e^{-bt}}{b - a} & \frac{1}{(s+a)(s+b)}, a \neq b\\
+\frac{1}{a}\sin(at) & \frac{1}{s^2 + a^2}\\
+\cos(at) & \frac{s}{s^2+a^2}\\
+\frac{1}{a}\sinh(at) & \frac{1}{s^2-a^2}\\
+\cosh(at) & \frac{s}{s^2-a^2}\\
+\frac{1-\cos(at)}{a^2} & \frac{1}{s(s^2+a^2)}\\
+\frac{at - \sin(at)}{a^3} & \frac{1}{s^2(s^2 + a^2)}\\
+\frac{\sin(at) - at\cos(at)}{2a^3} & \frac{1}{(s^2 + a^2)^2}\\
+
+\frac{t\sin(at)}{2a} & \frac{s}{(s^2+a^2)^2}\\
+\frac{\sin(at) + at\cos(at)}{2a} & \frac{s^2}{(s^2 + a^2)^2}\\
+\frac{b\sin(at) - a\sin(bt)}{ab(b^2 - a^2)} & \frac{1}{(s^2+a^2)(s^2+b^2)}, a^2 \neq b^2
+\frac{\cos(at) - \cos(bt)}{b^2 - a^2} & \frac{s}{(s^2+a^2)(s^2+b^2)}, a^2 \neq b^2
+\frac{1}{b}e^{-at}\sin(bt) & \frac{1}{(s+a)^2 + b^2}\\
+e^{-at}\cos(bt) & \frac{s+a}{(s+a)^2 + b^2}\\
+\frac{\sinh(at) - \sin(at)}{2a^3} & \frac{1}{s^4 - a^4}\\
+\frac{\sin(at)\sinh(at)}{2a^2} & \frac{s}{s^4+4a^4}\\
+\frac{1}{\sqrt{\pi t}} & \frac{1}{\sqrt{s}}\\
+\frac{\sin{at}{t}} & \arctan{\frac{a}{s}}\\
+u(t) - u(t-k) & \frac{1-e^{-ks}}{s}\\
+\frac{(t-k)^{a-1}}{\Gamma(a)}u(t-k) & \frac{1}{s^a}e^{-ks}, a > 0\\
+\sum_{n=0}^\inf u(t-nk) & \frac{1}{s(1-e^{-ks})}\\
+\frac{1}{2}(\sin(t) + \|\sin(t)\|) & \frac{1}{(s^2 + 1)(1 - e^{\pi s})}\\
+\|\sin(at)\| & \frac{a\coth(\frac{\pi s}{2 a})}{s^2 + a^2}
+\end{align*}
diff --git a/math/levi_cevita.org b/src/math/levi_cevita.org
index aaa2074..983130e 100644
--- a/math/levi_cevita.org
+++ b/src/math/levi_cevita.org
@@ -1,12 +1,11 @@
-#+TITLE: The Levi Cevita Symbol
-#+SETUPFILE: ../math_options.org
-#+LATEX_HEADER: \usepackage{bm}
-#+LATEX_HEADER: \usepackage{mathtools}
+#+title: The Levi Cevita Symbol
+#+setupfile: ../../math_options.org
* Disclaimer
This site as of now just a technology demonstration and its claims
should not be taken as true (even though I myself am pretty confident
they are)
+
* Levi Cevita symbol
\begin{equation*}
\varepsilon_{ijk} = \left\{\begin{array}{rl}
diff --git a/math/matrices.org b/src/math/matrices.org
index a7ba58b..c968f8c 100644
--- a/math/matrices.org
+++ b/src/math/matrices.org
@@ -1,22 +1,23 @@
-#+TITLE:Matrix Properties
-#+SETUPFILE: ../math_options.org
-#+LATEX_HEADER: \usepackage{bm}
-#+LATEX_HEADER: \usepackage{mathtools}
+#+title:Matrix Properties
+#+setupfile: ../../math_options.org
* Disclaimer
This site as of now just a technology demonstration and its claims
should not be taken as true (even though I myself am pretty confident
they are)
+
* Basic properties
\begin{align*}
A + B = B + A
\end{align*}
+
* Dot product
\begin{align*}
(A^\text{T})^\text{T} &= A\\
(A + B)^\text{T} &= A^\text{T} + B^\text{T}\\
(AB)^\text{T} &= B^\text{T}A^\text{T}
\end{align*}
+
* Transpose
\begin{align*}
\bm{a} \cdot \bm{b} &= \overline{\bm{b}} \cdot \bm{a}\\
diff --git a/math/orbit.org b/src/math/orbit.org
index 88079a6..5e4040a 100644
--- a/math/orbit.org
+++ b/src/math/orbit.org
@@ -1,15 +1,11 @@
-#+TITLE:Orbit
-#+SETUPFILE: ../math_options.org
-#+LATEX_HEADER: \usepackage{bm}
-#+LATEX_HEADER: \usepackage{mathtools}
-#+LATEX_HEADER: \usepackage{amssymb}
-#+LATEX_HEADER: \newcommand{\deriv}[2]{\frac{\text{d}#1}{\text{d}#2}}
-#+LATEX_HEADER: \newcommand{\unitv}[1]{\bm{\hat{e}}_#1}
+#+title:Orbit
+#+setupfile: ../../math_options.org
* Disclaimer
This site as of now just a technology demonstration and its claims
should not be taken as true (even though I myself am pretty confident
they are)
+
* Deriving Kepler's first law from Newton's law of universal gravitation
The movement of an object with mass $m$ orbiting another body with mass $M$ is
@@ -18,76 +14,76 @@ the position of the larger object constant and use it as the origin of our
coordinate system. Then the following equation applies for movement of the
smaller object:
-\begin{equation*}
+{{{beg-eqn}}}
m\ddot{\bm{r}} = - \frac{GMm}{r^3}\bm{r} \Leftrightarrow \ddot{\bm{r}} = - \frac{GM}{r^3}\bm{r}
-\end{equation*}
+{{{end-eqn}}}
In order to solve this differential equation we first consider the angular
momentum of or object around its orbit.
-\begin{equation*}
+{{{beg-eqn}}}
\bm{L} = \bm{r} \times m \dot{\bm{r}}
-\end{equation*}
+{{{end-eqn}}}
In the abscense of external toques, because the only force acting on the object
is parallel to its position, the angular momentum is conserved.
-\begin{equation*}
+{{{beg-eqn}}}
\deriv{\bm{L}}{t} = \dot{\bm{r}} \times m \dot{\bm{r}} + \bm{r} \times m \ddot{\bm{r}} = 0
-\end{equation*}
+{{{end-eqn}}}
We now multiply both sides of our equation from the right by the angular
momentum and develop the right side of the equation using vector identities.
-\begin{align*}
+{{{beg-align}}}
\ddot{\bm{r}} \times \bm{L} &= -GM\frac{\bm{r} \times \left(\bm{r} \times m \dot{\bm{r}}\right)}{r^3}\\
&= - \frac{GMm}{r^3} \left(\left(\bm{r} \cdot \dot{\bm{r}}\right)\bm{r} - \left(\bm{r} \cdot \bm{r}\right)\dot{\bm{r}}\right)\\
&= GMm\left(\frac{\left(\bm{r} \cdot \bm{r}\right)\dot{\bm{r}}}{r^3} - \frac{\left(\bm{r} \cdot \dot{\bm{r}}\right)\bm{r}}{r^3}\right)\\
&= GMm\left(\frac{\dot{\bm{r}}}{r} - \frac{\left(\bm{r} \cdot \dot{\bm{r}}\right)\bm{r}}{r^3}\right)\\
&= GMm\left(\frac{1}{r} \deriv{\bm{r}}{t} + \deriv{}{t}\left(\frac{1}{r}\right)\bm{r}\right)\\
&= GMm\deriv{}{t}\left(\frac{\bm{r}}{r}\right)
-\end{align*}
+{{{end-align}}}
We observe that each side of our equation is a derivative of a quantity. We know
integrate both sides and take the integrations constant into account.
-\begin{align*}
+{{{beg-align}}}
& \deriv{}{t} \left(\dot{\bm{r}} \times \bm{L}\right) = GM \deriv{}{t}\left(\frac{\bm{r}}{r}\right)\\
\Leftrightarrow \quad & \dot{\bm{r}} \times \bm{L} = GM \frac{\bm{r}}{r} + \bm{a}
-\end{align*}
+{{{end-align}}}
Our objective is now to solve the equation for $r$, so we multiply both sides by $\bm{r}$:
-\begin{align*}
+{{{beg-align}}}
\dot{\bm{r}} \times \left(\bm{r} \times \dot{\bm{r}}\right) &= GM \frac{\bm{r}}{r} + \bm{a}\\
\bm{r} \cdot \left(\dot{\bm{r}} \times \left(\bm{r} \times \dot{\bm{r}}\right)\right) &= GMr + \bm{r} \cdot \bm{a}
-\end{align*}
+{{{end-align}}}
By applying a cyclic permutation of the resulting triple product and using the
known property of the scalar product we now express the equation only in terms
of the magnitudes of the vectors.
-\begin{align*}
+{{{beg-align}}}
\left(\bm{r} \times \dot{\bm{r}}\right) \cdot \left(\bm{r} \times \dot{\bm{r}}\right) &= GMr + \bm{r} \cdot \bm{a}\\
\left(\frac{L}{m}\right)^2 &= GMr + \bm{r} \cdot \bm{a}\\
\left(\frac{L}{m}\right)^2 &= GMr + r a \cos\theta
-\end{align*}
+{{{end-align}}}
The last steps are to solve for $r$
-\begin{align*}
+{{{beg-align}}}
r &= \left(\frac{L}{m}\right)^2 \frac{1}{GM + a \cos\theta}\\
&= \left(\frac{L}{m}\right)^2 \frac{1}{GM} \frac{1}{1 + \frac{a}{GM} \cos\theta}\\
&= \left(\frac{L}{m}\right)^2 \frac{1}{GM} \frac{1}{1 + e\cos\theta}
-\end{align*}
+{{{end-align}}}
Finally we reach our result. Objects orbiting according to Newton's Law of
Gravitation follow paths that correspond to the conic sections. Here is Kepler's
first Law a special case, where our object has a stable orbit around the larger
body.
-\begin{equation*}
+{{{beg-eqn}}}
r &= \frac{L^2}{GM m^2} \frac{1}{1 + e\cos\theta}
-\end{equation*}
+{{{end-eqn}}}
* Deriving a physical interpretation of the excentricity of the orbit
diff --git a/math/polar_coordinates.org b/src/math/polar_coordinates.org
index ff07be3..0d26138 100644
--- a/math/polar_coordinates.org
+++ b/src/math/polar_coordinates.org
@@ -1,14 +1,11 @@
-#+TITLE:Polar Coordinates
-#+SETUPFILE: ../math_options.org
-#+LATEX_HEADER: \usepackage{bm}
-#+LATEX_HEADER: \usepackage{mathtools}
-#+LATEX_HEADER: \newcommand{\deriv}[2]{\frac{\text{d}#1}{\text{d}#2}}
-#+LATEX_HEADER: \newcommand{\unitv}[1]{\bm{\hat{e}}_#1}
+#+title:Polar Coordinates
+#+setupfile: ../../math_options.org
* Disclaimer
This site as of now just a technology demonstration and its claims
should not be taken as true (even though I myself am pretty confident
they are)
+
* Coordinate transformations
\begin{align*}
x &= r \cos\theta\\
@@ -27,6 +24,7 @@ y &= r \sin\theta
\deriv{\unitv{r}}{t} &= \dot{\theta}\unitv{\theta}\\
\deriv{\unitv{\theta}}{t} &= -\dot{\theta}\unitv{r}
\end{align*}
+
** Position vector and its time derivatives
\begin{align*}
\bm{r} &= r\unitv{r}\\
diff --git a/src/math/spherical-harmonics.org b/src/math/spherical-harmonics.org
new file mode 100644
index 0000000..b5183b5
--- /dev/null
+++ b/src/math/spherical-harmonics.org
@@ -0,0 +1,119 @@
+#+title: Solving the laplace equation in Spherical coordinates
+#+author: Thomas Albers Raviola
+#+date: 2022-12-15
+#+setupfile: ../../math_options.org
+
+* Disclaimer
+This site as of now just a technology demonstration and its claims
+should not be taken as true (even though I myself am pretty confident
+they are)
+
+* Laplace equation
+
+{{{beg-eqn}}}
+\Delta \phi = 0
+{{{end-eqn}}}
+
+Solutions to this equation are called harmonics
+
+* Laplace equation in spherical coordinates
+
+Using the definition for the laplace operator in spherical coordinates, it
+follows:
+
+{{{beg-align}}}
+\frac{1}{r^2}\pderiv{}{r}\left(r^2 \pderiv{\phi}{r}\right) + \frac{1}{r^2\sin\theta} \pderiv{}{\theta}\left(\sin\theta\pderiv{\phi}{\theta}\right) + \frac{1}{r^2\sin^2\theta}\frac{\partial^2\phi}{\partial\varphi^2} &= 0\\
+\pderiv{}{r}\left(r^2 \pderiv{\phi}{r}\right) + \frac{1}{\sin\theta} \pderiv{}{\theta}\left(\sin\theta\pderiv{\phi}{\theta}\right) + \frac{1}{\sin^2\theta}\frac{\partial^2\phi}{\partial\varphi^2} &= 0
+{{{end-align}}}
+
+Using sepration of variables $\phi$ becomes
+{{{beg-eqn}}}
+\phi(r, \theta, \varphi) = R(r)Y(\theta, \varphi)
+{{{end-eqn}}}
+
+Applying this to the original equation produces
+
+{{{beg-align}}}
+\pderiv{}{r}\left(r^2 \pderiv{R}{r}\right)Y(\theta, \phi) + \left(\frac{1}{\sin\theta} \pderiv{}{\theta}\left(\sin\theta\pderiv{\phi}{\theta}\right) + \frac{1}{\sin^2\theta}\frac{\partial^2\phi}{\partial\varphi^2}\right)R(r) &= 0\\
+\frac{1}{R(r)}\pderiv{}{r}\left(r^2 \pderiv{R}{r}\right) + \frac{1}{Y(\theta, \phi)}\left(\frac{1}{\sin\theta} \pderiv{}{\theta}\left(\sin\theta\pderiv{\phi}{\theta}\right) + \frac{1}{\sin^2\theta}\frac{\partial^2\phi}{\partial\varphi^2}\right) &= 0
+{{{end-align}}}
+
+Because the terms depend on different independant variables, the only way the
+equation holds is if both terms are constant.
+
+{{{beg-align}}}
+&\frac{1}{R(r)}\pderiv{}{r}\left(r^2 \pderiv{R}{r}\right) = \lambda\\
+&\frac{1}{Y(\theta, \phi)}\left(\frac{1}{\sin\theta} \pderiv{}{\theta}\left(\sin\theta\pderiv{Y}{\theta}\right)+ \frac{1}{\sin^2\theta}\frac{\partial^2Y}{\partial\varphi^2}\right) = -\lambda
+{{{end-align}}}
+
+* Angle dependant term
+We again use separation of variables to solve the partial differential equation
+of the angle dependant term.
+
+{{{beg-eqn}}}
+Y(\theta, \varphi) = \Theta(\theta)\Phi(\varphi)
+{{{end-eqn}}}
+
+Replacing into the equation
+
+{{{beg-eqn}}}
+\lambda\sin^2\theta + \frac{\sin\theta}{\Theta(\theta)}\pderiv{}{\theta}\left(\sin\theta\pderiv{\Theta}{\theta}\right)
++ \frac{1}{\Phi(\varphi)}\frac{\partial^2\Phi}{\partial\varphi^2} = 0
+{{{end-eqn}}}
+
+Based on a similar argument it follows that both terms must be constant, with
+this we may now solve for $\Phi$
+
+{{{beg-eqn}}}
+\frac{1}{\Phi(\varphi)}\frac{\partial^2\Phi}{\partial\varphi^2} = -m^2
+{{{end-eqn}}}
+
+{{{beg-eqn}}}
+\Phi(\varphi) = e^{-m\varphi{}i}
+{{{end-eqn}}}
+
+{{{beg-eqn}}}
+\lambda\sin^2\theta + \frac{\sin\theta}{\Theta(\theta)}\pderiv{}{\theta}\left(\sin\theta\pderiv{\Theta}{\theta}\right) = m^2
+{{{end-eqn}}}
+
+{{{beg-eqn}}}
+l(l+1)\sin^2(\theta)\Theta(\theta) + \pderiv{}{\theta}\left(\sin\theta\pderiv{\Theta}{\theta}\right) = m^2\Theta(\theta)
+{{{end-eqn}}}
+
+{{{beg-eqn}}}
+l(l+1)\sin^2(\theta)\Theta(\theta) + \sin(\theta)\left(\cos(\theta) \Theta'(\theta) + \sin(\theta) \Theta''(\theta)\right) = m^2\Theta(\theta)
+{{{end-eqn}}}
+
+{{{beg-eqn}}}
+\sin^2(\theta) \Theta''(\theta) + \sin(\theta)\cos(\theta) \Theta'(\theta) + (l(l+1)\sin^2(\theta) - m^2)\Theta(\theta) = 0
+{{{end-eqn}}}
+
+{{{beg-eqn}}}
+\Theta''(\theta) + \cot(\theta)\Theta'(\theta) + \left(l(l+1) - \frac{m^2}{\sin^2\theta}\right)\Theta(\theta) = 0
+{{{end-eqn}}}
+
+{{{beg-eqn}}}
+\Theta(\theta) = P(\cos \theta)
+{{{end-eqn}}}
+
+{{{beg-eqn}}}
+\cot(\theta)\Theta'(\theta) = \cot(\theta) \deriv{}{\theta}P(\cos \theta)=-\cos(\theta) P'(\cos\theta)
+{{{end-eqn}}}
+
+{{{beg-eqn}}}
+\frac{\text{d}^2}{\text{d}\theta^2}(P(\cos\theta)) = \sin^2(\theta) P''(\cos\theta) - \cos(\theta) P'(\cos\theta)
+{{{end-eqn}}}
+
+{{{beg-eqn}}}
+\sin^2(\theta) P''(\cos\theta) - 2\cos(\theta) P'(\cos\theta) + \left(l(l+1)-\frac{m^2}{\sin^2\theta}\right)P(\cos\theta) = 0
+{{{end-eqn}}}
+
+{{{beg-eqn}}}
+x = \cos\theta
+{{{end-eqn}}}
+
+{{{beg-eqn}}}
+(1 - x^2)P''(x) - 2xP'(x) + \left(l(l+1)-\frac{m^2}{1-x^2}\right)P(x) = 0
+{{{end-eqn}}}
+
+Solve using Frobenius Method
diff --git a/math/spherical_coordinates.org b/src/math/spherical_coordinates.org
index 1c7fd9c..bf3b8d0 100644
--- a/math/spherical_coordinates.org
+++ b/src/math/spherical_coordinates.org
@@ -1,14 +1,11 @@
-#+TITLE:Spherical Coordinates
-#+SETUPFILE: ../math_options.org
-#+LATEX_HEADER: \usepackage{bm}
-#+LATEX_HEADER: \usepackage{mathtools}
-#+LATEX_HEADER: \newcommand{\deriv}[2]{\frac{\text{d}#1}{\text{d}#2}}
-#+LATEX_HEADER: \newcommand{\unitv}[1]{\bm{\hat{e}}_#1}
+#+title:Spherical Coordinates
+#+setupfile: ../../math_options.org
* Disclaimer
This site as of now just a technology demonstration and its claims
should not be taken as true (even though I myself am pretty confident
they are)
+
* Coordinate transformations
\begin{align*}
x &= r \sin\theta \cos\varphi\\
@@ -22,6 +19,7 @@ z &= r \cos\theta
\bm{\hat{e}}_\theta &= \cos\theta \cos\varphi \bm{\hat{e}}_x + \cos\theta \sin\varphi \bm{\hat{e}}_y - \sin\theta \bm{\hat{e}}_z\\
\bm{\hat{e}}_\varphi &= - \sin\theta \sin\varphi \bm{\hat{e}}_x + \sin\theta \cos\varphi \bm{\hat{e}}_y
\end{align*}
+
* Kinematic in spherical coordinates
** Time derivatives of the local unit vectors
\begin{align*}
@@ -29,6 +27,7 @@ z &= r \cos\theta
\deriv{\unitv{\theta}}{t} &= -\dot{\theta}\unitv{r} + \dot{\varphi}\cos\theta \unitv{\varphi}\\
\deriv{\unitv{\varphi}}{t} &= -\dot{\varphi} \left(\sin\theta\unitv{r} + \cos\theta\unitv{\theta}\right)
\end{align*}
+
** Position vector and its time derivatives
\begin{align*}
\bm{r} &= r\unitv{r}\\
diff --git a/math/trigonometry.org b/src/math/trigonometry.org
index 3e81eeb..d2afc32 100644
--- a/math/trigonometry.org
+++ b/src/math/trigonometry.org
@@ -1,7 +1,5 @@
-#+TITLE:Trigonometric identities
-#+SETUPFILE: ../math_options.org
-#+LATEX_HEADER: \usepackage{bm}
-#+LATEX_HEADER: \usepackage{mathtools}
+#+title:Trigonometric identities
+#+setupfile: ../../math_options.org
* Disclaimer
This site as of now just a technology demonstration and its claims
@@ -14,27 +12,32 @@ they are)
&\tan^2\left(x\right) + 1 = \sec^2\left(x\right)\\
&1 + \cot^2\left(x\right) = \csc^2\left(x\right)
\end{align*}
+
* Sum of angles
\begin{align*}
&\sin\left(a \pm b\right) = \sin\left(a\right)\cos\left(b\right) \pm \cos\left(a\right)\sin\left(b\right)\\
&\cos\left(a \pm b\right) = \cos\left(a\right)\cos\left(b\right) \mp \sin\left(a\right)\sin\left(b\right)\\
&\tan(a \pm b) = \frac{\tan(a) \pm \tan(b)}{1 \mp \tan(a) \tan(b)}
\end{align*}
+
* Multiple angles
\begin{align*}
&\sin(2\theta) = 2\sin(\theta)\cos(\theta)\\
&\cos(2\theta) = \cos^2\theta - \sin^2\theta = 2\cos^2\theta - 1 = 1 - 2\sin^2\theta
\end{align*}
+
* Half-angle formulae
\begin{align*}
&\sin \frac{\theta}{2} = \pm \sqrt{\frac{1-\cos\theta}{2}}\\
&\cos \frac{\theta}{2} = \pm \sqrt{\frac{1+\cos\theta}{2}}
\end{align*}
+
* Power-reduction formulae
\begin{align*}
&\sin^2\theta = \frac{1 - \cos(2\theta)}{2}\\
&\cos^2\theta = \frac{1 + \cos(2\theta)}{2}
\end{align*}
+
* Product-to-sum formulae
\begin{align*}
&2 \cos\theta \cos\varphi = \cos(\theta-\varphi) + \cos(\theta+\varphi)\\
@@ -42,6 +45,7 @@ they are)
&2 \sin\theta \cos\varphi = \sin(\theta+\varphi) + \sin(\theta-\varphi)\\
&2\cos\theta\sin\varphi = \sin(\theta+\varphi) - \sin(\theta-\varphi)
\end{align*}
+
* Sum-to-product formulae
\begin{align*}
&\sin\theta \pm \sin\varphi = 2 \sin\left(\frac{\theta\pm\varphi}{2}\right) \cos\left(\frac{\theta\mp\varphi}{2}\right)\\
diff --git a/src/math/variation.org b/src/math/variation.org
new file mode 100644
index 0000000..fcbfb14
--- /dev/null
+++ b/src/math/variation.org
@@ -0,0 +1,19 @@
+#+title:Variation Calculus
+#+author: Thomas Albers Raviola
+#+date: 2022-10-01
+#+setupfile: ../../math_options.org
+
+* Disclaimer
+This site as of now just a technology demonstration and its claims
+should not be taken as true (even though I myself am pretty confident
+they are)
+
+* Beltrami identity
+\begin{align*}
+\deriv{}{x}\pderiv{F}{\dot{y}} &= \pderiv{F}{y}\\
+\deriv{}{x}\left(\pderiv{F}{\dot{y}}\right)\deriv{y}{x} &= \pderiv{F}{y}\deriv{y}{x}\\
+\deriv{}{x}\left(\pderiv{F}{\dot{y}}\right)\deriv{y}{x} + \pderiv{F}{\dot{y}}\deriv{\dot{y}}{x} + \pderiv{F}{x} &= \pderiv{F}{y}\deriv{y}{x} + \pderiv{F}{\dot{y}} \deriv{\dot{y}}{x} + \pderiv{F}{x}\\
+\deriv{}{x}\left(\pderiv{F}{\dot{y}}\dot{y}\right) + \pderiv{F}{x} &= \deriv{F}{x}\\
+\deriv{}{x}\left(\pderiv{F}{\dot{y}}\dot{y} - F\right) &= - \pderiv{F}{x}\\
+\pderiv{F}{\dot{y}}\dot{y} - F\right &= C
+\end{align*}
diff --git a/math/vectors.org b/src/math/vectors.org
index 49d8132..ceab691 100644
--- a/math/vectors.org
+++ b/src/math/vectors.org
@@ -1,7 +1,5 @@
-#+TITLE:Cross Product
-#+SETUPFILE: ../math_options.org
-#+LATEX_HEADER: \usepackage{bm}
-#+LATEX_HEADER: \usepackage{mathtools}
+#+title:Cross Product
+#+setupfile: ../../math_options.org
* Disclaimer
This site as of now just a technology demonstration and its claims
diff --git a/src/physics/lorentz-transformation.org b/src/physics/lorentz-transformation.org
new file mode 100644
index 0000000..a5e3c8f
--- /dev/null
+++ b/src/physics/lorentz-transformation.org
@@ -0,0 +1,62 @@
+#+TITLE:Lorentz Transformation
+#+SETUPFILE: ../math_options.org
+#+LATEX_HEADER: \usepackage{bm}
+#+LATEX_HEADER: \usepackage{mathtools}
+#+LATEX_HEADER: \newcommand{\dcoff}[1]{\frac{\text{d}}{\text{d}x} #1}
+#+LATEX_HEADER: \newcommand{\sdcoff}[1]{\frac{\text{d}#1}{\text{d}x}}
+#+LATEX_HEADER: \newcommand{\deriv}[2]{\frac{\text{d}}{\text{d}x} #1 &= #2}
+
+As a direct consequence of the second postulate, it follows, that for 2 events
+in spacetime describing the propagation of a beam of light it must hold
+
+\begin{equation*}
+c^2(t_2 - t_1)^2 - (x_2 - x_1)^2 - (y_2 - y_1)^2 - (z_2 - z_1)^2 = 0
+\end{equation*}
+
+To abbreviate we introduce the following expressions
+
+\begin{align*}
+t &= t_2 - t_1\\
+x &= x_2 - x_1\\
+y &= y_2 - y_1\\
+z &= z_2 - z_1
+\end{align*}
+
+Furthermore, because this must also hold in any other reference frame, for
+example $\Sigma'$, we have:
+
+\begin{equation*}
+c^2t^2 - x^2 - y^2 - z^2 = c^2{t'}^2 - {x'}^2 - {y'}^2 - {z'}^2 = 0
+\begin{end*}
+
+We introducing the Minkowski metric $\eta$ and rewrite this using matrices
+
+\begin{equation*}
+\sum_{\mu\nu} \eta_{\mu\nu} {x'}_\mu {x'}_\nu = \sum_{\alpha\beta} \eta_{\alpha\beta} x_\alpha x_\beta
+\end{equation*}
+
+Let us now consider some inertial system $\Sigma'$ that is moving away in
+respect to $\Sigma$ with some constant speed $v$ in the x direction. We are
+interested in the transformation that will allow us to convert the coordinates
+between this 2 systems.
+
+Further development of our last equation yields:
+
+\begin{align*}
+\sum_{\alpha\beta} \eta_{\alpha\beta} x_\alpha x_\beta &= \sum_{\mu\nu} \eta_{\mu\nu} \left(\sum_\alpha \Lambda_{\mu\alpha} x_\alpha \right) \left(\sum_\beta \Lambda_{\nu\beta} x_\beta \right)\\
+&= \sum_{\mu\nu\alpha\beta} \eta_{\mu\nu} \Lambda_{\mu\alpha} \Lambda_{\nu\beta} x_\alpha x_\beta
+\end{align*}
+
+From this we notice
+
+\begin{align*}
+\eta_{\alpha\beta} &= \sum_{\mu\nu} \eta_{\mu\nu} \Lambda_{\mu\alpha} \Lambda_{\nu\beta}\\
+&=\sum_{\mu\nu} (\Lambda^\text{T})_{\alpha\mu} \eta_{\mu\nu} \Lambda_{\nu\beta}\\
+&=\sum_{\nu} \left(\sum_\mu (\Lambda^\text{T})_{\alpha\mu} \eta_{\mu\nu}\right) \Lambda_{\nu\beta}
+\end{align*}
+
+And thus
+
+\begin{equation*}
+\eta = \Lambda^\text{T}\eta\Lambda
+\end{equation*}
diff --git a/src/style.css b/src/style.css
deleted file mode 100644
index bd731ad..0000000
--- a/src/style.css
+++ /dev/null
@@ -1,123 +0,0 @@
-html {
- height: 100%;
- color: #cccccc;
- background-color: hsl(240, 30%, 10%);/*#452b41*/ /*#2c314b*/
-}
-
-body {
- margin: auto;
- max-width: 64em;
- min-height: 100%;
- display: flex;
- flex-direction: column;
- background-color: hsl(240, 30%, 15%);
-}
-
-nav {
- /*#3a2438*/ /*#2a3257*/
- background-color: hsl(240, 30%, 20%);
-}
-
-nav > ul {
- display: flex;
- margin: 0 auto;
-}
-
-nav > ul > li:last-child {
- margin-left: auto;
-}
-
-nav ul {
- padding: 0;
-}
-
-nav li {
- margin: 2px;
- display: block;
- list-style: none;
-}
-
-nav li:hover {
- background-color: hsl(240, 30%, 30%);
-}
-
-nav .submenu:hover .submenu-contents {
- display: block;
-}
-
-nav .submenu-contents {
- display: none;
- position: absolute;
- z-index: 10;
- background-color: red;
-}
-
-nav a,
-nav span {
- text-decoration: none;
- color: #dddddd;
- display: block;
- line-height: 2em;
- height: 2em;
- margin-left: 1em;
- margin-right: 1em;
-}
-
-nav span {
- cursor: pointer;
-}
-
-.article-date {
- margin-left: auto;
-}
-
-.link-like, a {
- color: #eeeeee;
- text-decoration: underline;
-}
-
-.rel-header {
- padding: 1em 2em 1em 2em;
-}
-
-header {
- background-color: hsl(240, 30%, 10%);
-}
-
-header p {
- text-align: center;
- margin-bottom: 0.15em;
-}
-
-header p ~ h1 {
- margin-top: 0.15em;
-}
-
-main {
- padding: 2em 2em 2em 2em;
- flex-grow: 1;
-}
-
-hr {
- margin: 0;
- margin-top: auto;
-}
-
-footer {
- padding: 1em 2em 1em 2em;
-}
-
-figure {
- text-align: center;
-}
-
-figure img {
- max-width: 30em;
- object-fit: contain;
- display: block;
- margin: auto;
-}
-
-h1, h2, h3, h4, h5, h6 {
- text-align: center;
-}
diff --git a/src/svg/fft.tex b/src/svg/fft.tex
new file mode 100644
index 0000000..82af9df
--- /dev/null
+++ b/src/svg/fft.tex
@@ -0,0 +1,44 @@
+\documentclass{standalone}
+
+\usepackage{tikz}
+
+\begin{document}
+\begin{tikzpicture}
+ \foreach \y in {7,6,...,0} {
+ \draw (0,\y) node {$\xi_\y$};
+ \draw (.3, \y) -- (.7,\y);
+ \draw (6.4, \y) -- (7, \y);
+ \draw (7.05, \y) circle (0.05);
+ \draw (.25, \y) circle (0.05);
+
+ \draw (8.95, \y) -- (10.25, \y);
+ \draw (9.25,\y+0.3) node {$W_N^\y$};
+ \draw (10.3, \y) circle (0.05);
+ \draw (10.7,\y) node {$x_\y$};
+ }
+
+ \foreach \y in {0, 1, 2, 3} {
+ \draw (6.8,\y+4+0.3) node {$O_\y$};
+ \draw (6.8,\y+0.3) node {$E_\y$};
+ \draw[->,red] (7.1, \y) -- (8.95, \y+4);
+ \draw[->, blue] (7.1, \y+4) -- (8.95, \y);
+
+ \draw[->, blue] (7.1, \y) -- (8.95, \y);
+ \draw[->, red] (7.1, \y+4) -- (8.95, \y+4);
+
+ \draw[->] (.7, 2 * \y) -- (2.2, \y);
+ \draw (2.25, \y + 4) circle (0.05);
+ \draw (2.3, \y + 4) -- (3, \y + 4);
+
+ \draw[->] (.7, 2 * \y + 1) -- (2.2, \y+4);
+ \draw (2.25, \y) circle (0.05);
+ \draw (2.3, \y) -- (3, \y);
+ }
+
+ \draw (3, -.2) rectangle (6.4, 3.2);
+ \draw (3, 3.8) rectangle (6.4, 7.2);
+ \draw (.7, 8) rectangle (9.7, -1);
+ \draw (4.6, 1.5) node {$N/2$-FFT};
+ \draw (4.6, 5.5) node {$N/2$-FFT};
+\end{tikzpicture}
+\end{document}
diff --git a/src/z80/prototype1.org b/src/z80/prototype1.org
index 23adec1..c9e8b0a 100644
--- a/src/z80/prototype1.org
+++ b/src/z80/prototype1.org
@@ -50,7 +50,7 @@ managed to get all the components and build my first working
prototype. It did not look beautiful, but it was functional.
#+CAPTION: Prototype 1 together with its serial terminal
-[[https://thomaslabs.org/media/prototype1.jpg]]
+[[/img/prototype1.jpg]]
I wasn't satisfied with this prototype though. It was not what I had
envisioned. I wanted to have a pocket computer and this was nothing
diff --git a/src/z80/prototype2.org b/src/z80/prototype2.org
index ba19bd7..549c18e 100644
--- a/src/z80/prototype2.org
+++ b/src/z80/prototype2.org
@@ -9,7 +9,7 @@ m4_define(`_REL_HEADER', `Next: <ahref="/z80/prototype1.html">Prototype 1</a> Up
{{{date_place(Bremen, Germany)}}}
#+CAPTION: Prototype 2
-[[https://thomaslabs.org/media/prototype2_1.jpg]]
+[[/img/prototype2_1.jpg]]
Because when moving to Bremen, I wasn't able to take my old Prototype
with me, I had to build a new one. This time though, I needed
@@ -41,7 +41,7 @@ Prototype 2
- Dual serial ports with complete modem control lines
#+CAPTION: Prototype 2 together with screen
-[[https://thomaslabs.org/media/prototype2_2.jpg]]
+[[/img/prototype2_2.jpg]]
It didn't take long until Prototype 2 became incapable of fulfilling
its task. Once it was clear, which parts would definitely be part of
diff --git a/template.el b/template.el
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/template.el