Michael Zitzmann 5 lat temu
commit
9281b0069e
52 zmienionych plików z 17525 dodań i 0 usunięć
  1. 4 0
      .babelrc
  2. 32 0
      .eslintrc.json
  3. 6 0
      .gitignore
  4. 3 0
      .stylelintrc.json
  5. 214 0
      README.md
  6. 36 0
      assets/css/index.css
  7. BIN
      assets/fonts/Asap-Bold.ttf
  8. BIN
      assets/fonts/Asap-Italic.ttf
  9. BIN
      assets/fonts/Asap-Regular.ttf
  10. BIN
      assets/fonts/AsapCondensed-Regular.ttf
  11. BIN
      assets/fonts/lora/Lora-Regular.ttf
  12. 44 0
      assets/fonts/lora/SIL Open Font License.txt
  13. BIN
      assets/fonts/montserrat/Montserrat-SemiBold.otf
  14. 43 0
      assets/fonts/montserrat/SIL Open Font License.txt
  15. BIN
      assets/img/BMJV_Web_Master_de_WBZ.png
  16. BIN
      assets/img/HardingCenter_Logo_de_RGB.png
  17. BIN
      assets/img/hc.png
  18. BIN
      assets/img/mpib.png
  19. 4684 0
      assets/js/blob-stream.js
  20. 0 0
      assets/js/blob-stream.min.js
  21. 673 0
      assets/js/pdfkit.js
  22. 0 0
      assets/js/pdfkit.min.js
  23. 117 0
      bin/prepareData.js
  24. 120 0
      bin/preprocess.js
  25. 39 0
      build.json
  26. 3275 0
      data/data_de.json
  27. 4732 0
      data/data_en.json
  28. BIN
      data/original/RA_web_demorisiken_3d_Leiter.xls
  29. BIN
      data/original/ra_da_risikostrasse.xlsx
  30. 110 0
      data/risk-ladder.tsv
  31. 50 0
      package.json
  32. 101 0
      rollup.config.js
  33. 209 0
      src/css/main.css
  34. 56 0
      src/html/markdown/index.md
  35. 14 0
      src/html/skeletons/main.html
  36. 78 0
      src/html/skeletons/visualisation.html
  37. 146 0
      src/js/config.json
  38. 552 0
      src/js/controller.js
  39. 6 0
      src/js/d3-custom.js
  40. 313 0
      src/js/environment.js
  41. 245 0
      src/js/infoView.js
  42. 4 0
      src/js/logos/BMJV_logo.js
  43. 88 0
      src/js/logos/RA_logo_1280.js
  44. 221 0
      src/js/logos/hc_logo.js
  45. 65 0
      src/js/main.js
  46. 216 0
      src/js/pdfExport.js
  47. 139 0
      src/js/progressBar.js
  48. 94 0
      src/js/referenceClass.js
  49. 301 0
      src/js/scrollView.js
  50. 294 0
      src/js/selectionList.js
  51. 81 0
      src/js/utilities.js
  52. 120 0
      src/js/zoomButtons.js

+ 4 - 0
.babelrc

@@ -0,0 +1,4 @@
+{
+    presets: ["@babel/preset-env"],
+    exclude: "node_modules/**"
+}

+ 32 - 0
.eslintrc.json

@@ -0,0 +1,32 @@
+{
+    "env": {
+        "browser": true,
+        "es6": true
+    },
+    "globals": {
+        "ENV": true,
+        "process": true
+    },
+    "extends": ["plugin:json/recommended", "eslint:recommended"],
+    "parserOptions": {
+        "sourceType": "module"
+    },
+    "rules": {
+        "indent": [
+            "error", 4,
+            { "SwitchCase": 1 }
+        ],
+        "linebreak-style": [
+            "error",
+            "unix"
+        ],
+        "quotes": [
+            "error",
+            "single"
+        ],
+        "semi": [
+            "error",
+            "always"
+        ]
+    }
+}

+ 6 - 0
.gitignore

@@ -0,0 +1,6 @@
+package-lock.json
+node_modules
+.DS_STORE
+html/*.html
+dist/
+build/

+ 3 - 0
.stylelintrc.json

@@ -0,0 +1,3 @@
+{
+  "extends": "stylelint-config-recommended"
+}

+ 214 - 0
README.md

@@ -0,0 +1,214 @@
+# Visualisierung interaktive Risikoleiter
+
+## Entwicklungsumgebung
+
+Um dieses Projekt zu ändern oder weiterzuentwickeln, werden [`nodejs`][nodejs] und `npm` benötigt. Die Abhängigkeiten werden wie üblich per `npm install` installiert.
+
+Für die Entwicklung wurden Teile von ES6 verwendet und mit [`rollup`][rollup], [`babel`][babel] und [`postcss`][postcss] transpiliert. Die einzelnen Schritte des Build Prozesses sind in einfachen `npm` Scripts definiert.
+
+`npm run watch` beispielsweis startet den Entwicklungsserver, transformiert Javascript und CSS Dateien bei Änderungen für das *Development* Target und lädt die Visualisierung im Browser.
+
+Die folgenden Scripts sind in `package.json` definiert und können mit `npm run …` ausgeführt werden:
+
+```
+- prepare         Wird ausgeführt, nachdem `npm install` aufgerufen wurde. In diesem Schritt werden die statischen Abhängigkeiten erstellt.
+- build           Generiert Javascript und CSS Dateien (einmalig) und kopiert alle generierten Dateien inklusive html-Dateien in das Verzeichnis `dist`.
+- build:data      Transformiert die Rohdaten in eine JSON-Datei für die Visualisierung.
+- build:html      Generiert HTML Dateien für Visualisierung und umgebenden Text.
+- build:static    Generiert die von der Anwendung benötigten JSON- und HTML-Dateien.
+- build:dev       Generiert Javascript und CSS Dateien für einen *Development Build*.
+- build:prod      Generiert Javascript und CSS Dateien für einen *Production Build*.
+- watch           Startet den Entwicklungsserver führt bei Änderungen einen Development Build durch.
+```
+
+In der Datei `rollup.config.js` werden die Konfigurationen für `rollup` und `postcss` dynamisch generiert. Für den *Development Build* werden SourceMaps erstellt, dagegen werden Javascript und CSS Dateien für den *Production Build* mit [`terser`][terser] bzw. [`cssnano`][cssnano] optimiert.
+
+Im *prepare* Schritt werden die HTML-Dateien von einem nodejs Script für das entsprechende *Target* generiert. Die eigentliche Visualisierung wird hier exemplarisch per `iframe` in einer umgebenden Webseite eingebettet.
+
+Der Rahmentext für diese Seite wird aus einem Markdown Dokument in HTML konvertiert. Der darin enthaltene `iframe` *Tag* wird dynamisch konfiguriert und das Ergebnis in einer HTML-Datei gespeichert.
+
+Die Datei `config.json` enthält die Konfigurationen sowohl zum Generieren der HTML-Dateien als auch für die Erstellung der Javascript- und CSS-Dateien.
+
+Nach dem Ausführen eines *Builds* sind alle Dateien, die für die Funktionalität der Website / Web App erforderlich sind im Verzeichnis `dist` zu finden:
+
+```
+├── index.html                            Diese HTML-Seite ist der Einstiegspunkt und wird vom Web-Server ausgeliefert
+├── risk-ladder.html                      Die Visualisierung wird in einem iframe in der index.html eingebunden
+├── css
+│   ├── index.css                         Stylesheet für die umgebende Webseite
+│   └── main[.min].css                    Stylesheet für die Visualisierung
+├── data
+│   ├── data_de.json                      Daten der Visualisierung (deutsch)
+│   └── data_en.json                      Daten der Visualisierung (englisch)
+├── fonts
+│   ├── ASAP                              Fonts für die Visualisierung
+│   ├── montserrat                        Font für Überschriften der umgebenden Seite (wird entfallen)
+│   └── lora                              Font für den Fließtext der umgebenden Seite (wird entfallen)
+├── img
+│   ├── BMJV_Web_Master_de_WBZ.png        BMJV Logo
+│   ├── HardingCenter_Logo_de_RGB.png     Harding Zentrum Logo
+│   └── mpib.png                          Max-Planck Institut fuur Bildungsforschung Logo
+└── js
+    ├── main[.min].js                     Javascript der Visualisierung
+    ├── [main.js.map]                     Javascript Sourcemap (wenn ein Development Build durchgeführt wurde)
+    ├── blob-stream.min.js                Wird von pdfkit benötigt
+    └── pdfkit.min.js                     Fettleibige Bibliothek zum generieren von PDF Dateien im Browser  
+```
+
+Wird ein Webserver konfiguriert, dieses Verzeichnis auszuliefern, sollte die Visualisierung enstsprechend erreichbar und funktional sein.
+
+## Verzeichnisstruktur
+
+```
+├── README.md
+├── assets
+│   ├── css
+│   │   └── index.css                               // Stildefinitionen der umgebenden HTML Seite
+│   ├── fonts
+│   │   ├── Asap-Bold.ttf
+│   │   ├── Asap-Italic.ttf
+│   │   ├── Asap-Regular.ttf
+│   │   ├── AsapCondensed-Regular.ttf
+│   │   ├── lora
+│   │   │   ├── Lora-Regular.ttf
+│   │   │   └── SIL\ Open\ Font\ License.txt
+│   │   └── montserrat
+│   │       ├── Montserrat-SemiBold.otf
+│   │       └── SIL\ Open\ Font\ License.txt
+│   ├── img                                         // Logos für die umgebende HTML Seite
+│   │   ├── BMJV_Web_Master_de_WBZ.png
+│   │   ├── HardingCenter_Logo_de_RGB.png
+│   │   ├── jobloss.png
+│   │   └── mpib.png
+│   └── js                                          // Externe Javascript Bibliotheken
+│       ├── blob-stream.js
+│       ├── blob-stream.min.js
+│       ├── pdfkit.js
+│       └── pdfkit.min.js
+│   ├── prepareData.js                              // Generiert json Datei aus Rohdaten
+│   └── preprocess.js                               // Generiert HTML Dateien für Visualisierung und umgebendes HTML
+├── build.json                                      // Build Konfiguration
+├── data                                            // Rohdaten
+│   ├── data_de.json
+│   ├── data_en.json
+│   ├── data_old.json
+│   ├── original
+│   │   ├── RA_web_demorisiken_3d_Leiter.xls
+│   │   └── ra_da_risikostrasse.xlsx
+│   └── risk-ladder.tsv
+├── package.json
+├── rollup.config.js                                // Build Prozess
+└── src
+    ├── css
+    │   └── main.css                                // Stildefinitionen für Visualisierung
+    │   └── open-iconic -> ../../_resources/open-iconic
+    ├── html
+    │   ├── markdown
+    │   │   └── index.md                            // Markdown für Kontextinformationen des umgebenden HTML
+    │   └── skeletons
+    │       ├── main.html                           // Template für umgebendes HTML
+    │       └── visualisation.html                  // Template für Visualisierung
+    └── js
+        ├── configuration.js                        // Konfiguration der Visualisierung
+        ├── controller.js                           // Controller für die Koordination der Komponenten der Visualisierung
+        ├── d3-custom.js                            // Definition der verwendeten Module von d3
+        ├── environment.js                          // Implementierung der Hintergrundgrafiken
+        ├── infoView.js                             // Darstellung der Informationen zu einzelnen Einträgen
+        ├── logos                                   // Definitionen der Logos als Javascript Objekte für Einbindung als Vektorgrafiken im PDF
+        │   ├── BMJV_logo.js
+        │   ├── RA_logo_1280.js
+        │   └── hc_logo.js
+        ├── main.js                                 // Einstiegspunkt für Implementierung der Visualisierung
+        ├── pdfExport.js                            // Generieren des PDF
+        ├── progressBar.js                          // Darstellung des Fortschrittsbalkens
+        ├── referenceClass.js                       // Label für Referenzklasse
+        ├── scrollView.js                           // Darstellung der Elemente in der Pseudo-3D Ansicht
+        ├── selectionList.js                        // Implementierung der Auswahlliste
+        ├── utilities.js                            // Zeuch halt
+        └── zoomButtons.js                          // Implementierung der Zoom Buttons
+```
+
+## Wie ändere ich Inhalte und Daten?
+
+### Texte und Labels
+
+Texte und Labels können in der Datei `config.json` geändert werden. Dort ist sowohl der Text des Eingabefeldes der Suche, als auch die Texte zu den Detailinformationen und des PDFs definiert.
+
+### Daten
+
+Für diese Visualisierung sind die hierarchischen Rohdaten in der Datei `data/jobloss_[de|en].tsv` definiert. Bevor sie in der Visualisierung verwendet werden können, müssen sie in eine JSON Datei transformiert werden. Dies geschieht im Schrit `build:data` des Build Prozesses. Bei Beibehaltung der Struktur der Daten können diese so beliebig ausgetauscht werden. Alle Bezeichner der interaktiven Visualisierung werden aus diesen Daten gelesen.
+
+## Generelle Architektur
+
+[d3-inspirierte modulare Architektur][d3reusable] mit Abweichungen
+
+Konstanten sind ausgelagert in eine Konfigurationsklasse (muss das überhaupt eine Klasse sein?).
+
+Das grafische Interface wurde in folgende Module aufgeteilt:
+
+**infoView.js**  
+Beim Klick auf einen Eintrag in der Pseudo-3D-Ansicht werden Detailinformationen zum entsprechenden Ereignis in einem Fenster am Horizont dargestellt. Diese Darstellung ist hier definiert.
+
+**selectionList.js**  
+Die Lesezeichenliste enthält initial fünf zufällig ausgewählte Ereignisse. Durch Klick auf ein Ereignis wird zu diesem gefahren. Ereignisse können aus der Liste durch Klick auf den Entfernen-Button gelöscht werden. Wird ein Kategorie-Filter ausgewählt, werden dadurch Einträge für ausgeblendete Ereignisse deaktiviert.
+
+**progressBar.js**  
+Fortschrittsbalken, der anzeigt, wieviel des Wegs noch vor einem liegt.
+
+**referenceClass.js**  
+Dynamisches Label für die jeweilige Referenzklasse
+
+**scrollView.js**  
+Die Implementierung der interaktiven Pseudo-3D Ansicht des Balkendiagramms der Ereigniswahrscheinlichkeiten ist hier definiert. Beim Klick auf den Balken werden Detailinformationen zum Ereignis angezeigt, der Klick auf das Lesezeichen-Symbol fügt eine Referenz auf das Ereignis der Auswahlliste hinzu bzw. entfernt sie aus dieser.
+
+**zoomButtons.js**  
+Zoom-Buttons auf dem Fortschrittsbalken zum Springen zu vorherigen bzw. folgenden Ereignissen.
+
+**environment.js**  
+Hintergrund mit Himmel und Straße mit mitlaufenden Straßenmarkierungen.
+
+Einstiegspunkt der Visualisierung ist die Datei `main.js`, in der die Events der HTML-Formularelemente behandelt werden. Hier wird auch der Controller erzeugt, der die einzelnen (interaktiven) SVG Interface-Elemente erstellt und den Informationsfluss kontolliert.
+
+## PDF Export
+
+Zum PDF export werden für eine zur Visualisierung passende Darstellung binäre Fonts geladen. Zum dynamischen Landen von Resourcen wird der `fetch` *Polyfill* [`whatwg-fetch`][whatwg-fetch] verwendet.
+
+Das PDF wird mit [`pdfkit.js`][pdfkit] erstellt, das außerdem [`blob-stream`][blob-stream] erfordert.
+
+Um eine Ähnlichkeit zur Visualisierung zu gewähren, aber gleichzeitig den üppiger vorhandenen Platz eines A5 Landscape zu nutzen, wird anstatt der ASAP Condensed die ASAP eingesetzt.
+
+Nachdem `pdfkit` sehr gewichtig ist (1.8 MB) und sich die npm Version nicht problemlos kompilieren lässt (Informationen dazu fehlen komplett), werden `pdfkit` und `blob-stream` in der `index.html` per `<script>` *Tag* geladen.
+Das initiale Laden der Visualisierung wird dadurch natürlich verlangsamt. `pdfkit` befindet sich im Umbau und wird auf ES6 portiert, es sieht aber nicht so aus, als ob die Bibliothek dadurch modularer oder kleiner werden würde. Stattdessen sind im Build für Browser 1 MB hinzugekommen. Abhilfe würde die Auslagerung des Generierens des PDFs auf den Server schaffen, oder zumindest das asynchrone Laden der Bibliothek.
+
+## Implementierung der Pseudo 3D-Ansicht
+
+Bei der initialen herausgezoomten Ansicht wird die minimale Skalierung angewendet, so dass der größte Wert am unteren Ende der Straße in maximaler Größe dargestellt wird. Alle anderen Ereignisse befinden sich nach hinten in die Bildebene gestaffelt. Die maximale Skalierung (maximaler *Zoom*) wird so berechnet, dass das unwahrscheinlichste Ereignis am unteren Bildrand maximiert angezeigt wird. Alle anderen Einträge befinden sich dann für den Betrachter hinter sich, jenseits der *Near-Clipping Plane*.
+
+Die pseudo-Perspektive basiert rein grafisch auf dem Dreieck, das die Straße darstellt. Interagiert wird per *natürlichem Scrolling*, das durch einen überdimensionierten HTML `<div>` im Hintergrund erzwungen wird. Die Scrollposition dient als Interpolationsfaktor zwischen den jeweils maximalen bzw. minimalen Skalierungsfaktoren. Ist der Scrollbar am oberen Fensterende, so ist die minimale Skalierung effektiv, wenn er am unteren Ende steht, wird die maximale Skalierung angewendet.
+
+Um diese Werte auf die Straße zu übertragen, werden sie von der Höhe des Scrollbereiches auf die Höhe des Straßendreiecks projiziert.
+
+## Icons
+
+Die verwendeten Icons ("bookmark", "circle-x", "data-transfer-upload", "data-transfer-download") stammen von [OpenIconic][openiconic]. Sie sind im HTML Template der Visualisierung jeweils als SVG `<symbol>` definiert und werden per `#use` Direktive in den entsprechenden d3 Modulen `scrollView.js` und `zoomButtons.js` referenziert.
+
+## Notizen und Bemerkungen
+
+Die Skalierungen wurden größtenteils unter Nichtbeachtung der dafür vorgesehenen *scale*-Funktionen von d3 implementiert. In zukünftige Versionen sollte dies bereinigt werden.
+
+- [computed width and height for arbitrary element][stack:dimensions]
+
+[nodejs]: https://nodejs.org/
+[rollup]: https://rollupjs.org/
+[babel]: https://babeljs.io/
+[postcss]: https://postcss.org
+[terser]: https://terser.org
+[cssnano]: https://cssnano.co
+
+[babel-polyfill]: https://babeljs.io/docs/usage/polyfill/
+[blob-stream]: https://github.com/devongovett/blob-stream
+[d3reusable]: https://bost.ocks.org/mike/chart/
+[openiconic]: https://useiconic.com/open
+[pdfkit]: https://pdfkit.org
+[stack:dimensions]: https://stackoverflow.com/questions/21990857/d3-js-how-to-get-the-computed-width-and-height-for-an-arbitrary-element#21991405
+[whatwg-fetch]: https://github.com/github/fetch

+ 36 - 0
assets/css/index.css

@@ -0,0 +1,36 @@
+@font-face {
+    font-family: "Montserrat";
+    src: url("../fonts/montserrat/Montserrat-SemiBold.otf");
+}
+@font-face {
+    font-family: "Lora";
+    src: url("../fonts/lora/Lora-Regular.ttf");
+}
+body {
+    font-family: "Lora", "Helvetica Neue", Helvetica, Arial, sans-serif;
+    line-height: 1.5;
+}
+
+main {
+    margin: 0 auto;
+    max-width: 64em;
+}
+
+h1, h2 {
+    color: #262525;
+    font-family: "Montserrat", "Helvetica Neue", Helvetica, Arial, sans-serif;
+    font-weight: 700;
+    margin: 35px 0 35px;
+}
+
+iframe {
+    display: block;
+    margin: 0 auto;
+}
+
+.logos {
+    align-items: center;
+    display: flex;
+    justify-content: space-between;
+    margin: 2rem 0;
+}

BIN
assets/fonts/Asap-Bold.ttf


BIN
assets/fonts/Asap-Italic.ttf


BIN
assets/fonts/Asap-Regular.ttf


BIN
assets/fonts/AsapCondensed-Regular.ttf


BIN
assets/fonts/lora/Lora-Regular.ttf


+ 44 - 0
assets/fonts/lora/SIL Open Font License.txt

@@ -0,0 +1,44 @@
+Copyright (c) 2011-2013, Cyreal (www.cyreal.org a@cyreal.org), with
+Reserved Font Name 'Lora'
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
+
+"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
+
+5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.

BIN
assets/fonts/montserrat/Montserrat-SemiBold.otf


+ 43 - 0
assets/fonts/montserrat/SIL Open Font License.txt

@@ -0,0 +1,43 @@
+Copyright 2011 The Montserrat Project Authors (https://github.com/JulietaUla/Montserrat)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
+
+"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
+
+5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.

BIN
assets/img/BMJV_Web_Master_de_WBZ.png


BIN
assets/img/HardingCenter_Logo_de_RGB.png


BIN
assets/img/hc.png


BIN
assets/img/mpib.png


+ 4684 - 0
assets/js/blob-stream.js

@@ -0,0 +1,4684 @@
+!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.blobStream=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+(function (global){
+/**
+ * Create a blob builder even when vendor prefixes exist
+ */
+
+var BlobBuilder = global.BlobBuilder
+  || global.WebKitBlobBuilder
+  || global.MSBlobBuilder
+  || global.MozBlobBuilder;
+
+/**
+ * Check if Blob constructor is supported
+ */
+
+var blobSupported = (function() {
+  try {
+    var a = new Blob(['hi']);
+    return a.size === 2;
+  } catch(e) {
+    return false;
+  }
+})();
+
+/**
+ * Check if Blob constructor supports ArrayBufferViews
+ * Fails in Safari 6, so we need to map to ArrayBuffers there.
+ */
+
+var blobSupportsArrayBufferView = blobSupported && (function() {
+  try {
+    var b = new Blob([new Uint8Array([1,2])]);
+    return b.size === 2;
+  } catch(e) {
+    return false;
+  }
+})();
+
+/**
+ * Check if BlobBuilder is supported
+ */
+
+var blobBuilderSupported = BlobBuilder
+  && BlobBuilder.prototype.append
+  && BlobBuilder.prototype.getBlob;
+
+/**
+ * Helper function that maps ArrayBufferViews to ArrayBuffers
+ * Used by BlobBuilder constructor and old browsers that didn't
+ * support it in the Blob constructor.
+ */
+
+function mapArrayBufferViews(ary) {
+  for (var i = 0; i < ary.length; i++) {
+    var chunk = ary[i];
+    if (chunk.buffer instanceof ArrayBuffer) {
+      var buf = chunk.buffer;
+
+      // if this is a subarray, make a copy so we only
+      // include the subarray region from the underlying buffer
+      if (chunk.byteLength !== buf.byteLength) {
+        var copy = new Uint8Array(chunk.byteLength);
+        copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength));
+        buf = copy.buffer;
+      }
+
+      ary[i] = buf;
+    }
+  }
+}
+
+function BlobBuilderConstructor(ary, options) {
+  options = options || {};
+
+  var bb = new BlobBuilder();
+  mapArrayBufferViews(ary);
+
+  for (var i = 0; i < ary.length; i++) {
+    bb.append(ary[i]);
+  }
+
+  return (options.type) ? bb.getBlob(options.type) : bb.getBlob();
+};
+
+function BlobConstructor(ary, options) {
+  mapArrayBufferViews(ary);
+  return new Blob(ary, options || {});
+};
+
+module.exports = (function() {
+  if (blobSupported) {
+    return blobSupportsArrayBufferView ? global.Blob : BlobConstructor;
+  } else if (blobBuilderSupported) {
+    return BlobBuilderConstructor;
+  } else {
+    return undefined;
+  }
+})();
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],2:[function(require,module,exports){
+(function (global){
+var WritableStream = require('stream').Writable;
+var util = require('util');
+var Blob = require('blob');
+var URL = global.URL || global.webkitURL || global.mozURL;
+
+function BlobStream() {
+  if (!(this instanceof BlobStream))
+    return new BlobStream;
+    
+  WritableStream.call(this);
+  this._chunks = [];
+  this._blob = null;
+  this.length = 0;
+}
+
+util.inherits(BlobStream, WritableStream);
+
+BlobStream.prototype._write = function(chunk, encoding, callback) {
+  // convert chunks to Uint8Arrays (e.g. Buffer when array fallback is being used)
+  if (!(chunk instanceof Uint8Array))
+    chunk = new Uint8Array(chunk);
+    
+  this.length += chunk.length;
+  this._chunks.push(chunk);
+  callback();
+};
+
+BlobStream.prototype.toBlob = function(type) {
+  type = type || 'application/octet-stream';
+  
+  // cache the blob if needed
+  if (!this._blob) {
+    this._blob = new Blob(this._chunks, {
+      type: type
+    });
+    
+    this._chunks = []; // free memory
+  }
+  
+  // if the cached blob's type doesn't match the requested type, make a new blob
+  if (this._blob.type !== type)
+    this._blob = new Blob([this._blob], { type: type });
+  
+  return this._blob;
+};
+
+BlobStream.prototype.toBlobURL = function(type) {
+  return URL.createObjectURL(this.toBlob(type));
+};
+
+module.exports = BlobStream;
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"blob":1,"stream":22,"util":25}],3:[function(require,module,exports){
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @license  MIT
+ */
+
+var base64 = require('base64-js')
+var ieee754 = require('ieee754')
+var isArray = require('is-array')
+
+exports.Buffer = Buffer
+exports.SlowBuffer = Buffer
+exports.INSPECT_MAX_BYTES = 50
+Buffer.poolSize = 8192 // not used by this implementation
+
+var kMaxLength = 0x3fffffff
+
+/**
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
+ *   === true    Use Uint8Array implementation (fastest)
+ *   === false   Use Object implementation (most compatible, even IE6)
+ *
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
+ * Opera 11.6+, iOS 4.2+.
+ *
+ * Note:
+ *
+ * - Implementation must support adding new properties to `Uint8Array` instances.
+ *   Firefox 4-29 lacked support, fixed in Firefox 30+.
+ *   See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
+ *
+ *  - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
+ *
+ *  - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
+ *    incorrect length in some situations.
+ *
+ * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will
+ * get the Object implementation, which is slower but will work correctly.
+ */
+Buffer.TYPED_ARRAY_SUPPORT = (function () {
+  try {
+    var buf = new ArrayBuffer(0)
+    var arr = new Uint8Array(buf)
+    arr.foo = function () { return 42 }
+    return 42 === arr.foo() && // typed array instances can be augmented
+        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
+        new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
+  } catch (e) {
+    return false
+  }
+})()
+
+/**
+ * Class: Buffer
+ * =============
+ *
+ * The Buffer constructor returns instances of `Uint8Array` that are augmented
+ * with function properties for all the node `Buffer` API functions. We use
+ * `Uint8Array` so that square bracket notation works as expected -- it returns
+ * a single octet.
+ *
+ * By augmenting the instances, we can avoid modifying the `Uint8Array`
+ * prototype.
+ */
+function Buffer (subject, encoding, noZero) {
+  if (!(this instanceof Buffer))
+    return new Buffer(subject, encoding, noZero)
+
+  var type = typeof subject
+
+  // Find the length
+  var length
+  if (type === 'number')
+    length = subject > 0 ? subject >>> 0 : 0
+  else if (type === 'string') {
+    if (encoding === 'base64')
+      subject = base64clean(subject)
+    length = Buffer.byteLength(subject, encoding)
+  } else if (type === 'object' && subject !== null) { // assume object is array-like
+    if (subject.type === 'Buffer' && isArray(subject.data))
+      subject = subject.data
+    length = +subject.length > 0 ? Math.floor(+subject.length) : 0
+  } else
+    throw new TypeError('must start with number, buffer, array or string')
+
+  if (this.length > kMaxLength)
+    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
+      'size: 0x' + kMaxLength.toString(16) + ' bytes')
+
+  var buf
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    // Preferred: Return an augmented `Uint8Array` instance for best performance
+    buf = Buffer._augment(new Uint8Array(length))
+  } else {
+    // Fallback: Return THIS instance of Buffer (created by `new`)
+    buf = this
+    buf.length = length
+    buf._isBuffer = true
+  }
+
+  var i
+  if (Buffer.TYPED_ARRAY_SUPPORT && typeof subject.byteLength === 'number') {
+    // Speed optimization -- use set if we're copying from a typed array
+    buf._set(subject)
+  } else if (isArrayish(subject)) {
+    // Treat array-ish objects as a byte array
+    if (Buffer.isBuffer(subject)) {
+      for (i = 0; i < length; i++)
+        buf[i] = subject.readUInt8(i)
+    } else {
+      for (i = 0; i < length; i++)
+        buf[i] = ((subject[i] % 256) + 256) % 256
+    }
+  } else if (type === 'string') {
+    buf.write(subject, 0, encoding)
+  } else if (type === 'number' && !Buffer.TYPED_ARRAY_SUPPORT && !noZero) {
+    for (i = 0; i < length; i++) {
+      buf[i] = 0
+    }
+  }
+
+  return buf
+}
+
+Buffer.isBuffer = function (b) {
+  return !!(b != null && b._isBuffer)
+}
+
+Buffer.compare = function (a, b) {
+  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b))
+    throw new TypeError('Arguments must be Buffers')
+
+  var x = a.length
+  var y = b.length
+  for (var i = 0, len = Math.min(x, y); i < len && a[i] === b[i]; i++) {}
+  if (i !== len) {
+    x = a[i]
+    y = b[i]
+  }
+  if (x < y) return -1
+  if (y < x) return 1
+  return 0
+}
+
+Buffer.isEncoding = function (encoding) {
+  switch (String(encoding).toLowerCase()) {
+    case 'hex':
+    case 'utf8':
+    case 'utf-8':
+    case 'ascii':
+    case 'binary':
+    case 'base64':
+    case 'raw':
+    case 'ucs2':
+    case 'ucs-2':
+    case 'utf16le':
+    case 'utf-16le':
+      return true
+    default:
+      return false
+  }
+}
+
+Buffer.concat = function (list, totalLength) {
+  if (!isArray(list)) throw new TypeError('Usage: Buffer.concat(list[, length])')
+
+  if (list.length === 0) {
+    return new Buffer(0)
+  } else if (list.length === 1) {
+    return list[0]
+  }
+
+  var i
+  if (totalLength === undefined) {
+    totalLength = 0
+    for (i = 0; i < list.length; i++) {
+      totalLength += list[i].length
+    }
+  }
+
+  var buf = new Buffer(totalLength)
+  var pos = 0
+  for (i = 0; i < list.length; i++) {
+    var item = list[i]
+    item.copy(buf, pos)
+    pos += item.length
+  }
+  return buf
+}
+
+Buffer.byteLength = function (str, encoding) {
+  var ret
+  str = str + ''
+  switch (encoding || 'utf8') {
+    case 'ascii':
+    case 'binary':
+    case 'raw':
+      ret = str.length
+      break
+    case 'ucs2':
+    case 'ucs-2':
+    case 'utf16le':
+    case 'utf-16le':
+      ret = str.length * 2
+      break
+    case 'hex':
+      ret = str.length >>> 1
+      break
+    case 'utf8':
+    case 'utf-8':
+      ret = utf8ToBytes(str).length
+      break
+    case 'base64':
+      ret = base64ToBytes(str).length
+      break
+    default:
+      ret = str.length
+  }
+  return ret
+}
+
+// pre-set for values that may exist in the future
+Buffer.prototype.length = undefined
+Buffer.prototype.parent = undefined
+
+// toString(encoding, start=0, end=buffer.length)
+Buffer.prototype.toString = function (encoding, start, end) {
+  var loweredCase = false
+
+  start = start >>> 0
+  end = end === undefined || end === Infinity ? this.length : end >>> 0
+
+  if (!encoding) encoding = 'utf8'
+  if (start < 0) start = 0
+  if (end > this.length) end = this.length
+  if (end <= start) return ''
+
+  while (true) {
+    switch (encoding) {
+      case 'hex':
+        return hexSlice(this, start, end)
+
+      case 'utf8':
+      case 'utf-8':
+        return utf8Slice(this, start, end)
+
+      case 'ascii':
+        return asciiSlice(this, start, end)
+
+      case 'binary':
+        return binarySlice(this, start, end)
+
+      case 'base64':
+        return base64Slice(this, start, end)
+
+      case 'ucs2':
+      case 'ucs-2':
+      case 'utf16le':
+      case 'utf-16le':
+        return utf16leSlice(this, start, end)
+
+      default:
+        if (loweredCase)
+          throw new TypeError('Unknown encoding: ' + encoding)
+        encoding = (encoding + '').toLowerCase()
+        loweredCase = true
+    }
+  }
+}
+
+Buffer.prototype.equals = function (b) {
+  if(!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
+  return Buffer.compare(this, b) === 0
+}
+
+Buffer.prototype.inspect = function () {
+  var str = ''
+  var max = exports.INSPECT_MAX_BYTES
+  if (this.length > 0) {
+    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
+    if (this.length > max)
+      str += ' ... '
+  }
+  return '<Buffer ' + str + '>'
+}
+
+Buffer.prototype.compare = function (b) {
+  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
+  return Buffer.compare(this, b)
+}
+
+// `get` will be removed in Node 0.13+
+Buffer.prototype.get = function (offset) {
+  console.log('.get() is deprecated. Access using array indexes instead.')
+  return this.readUInt8(offset)
+}
+
+// `set` will be removed in Node 0.13+
+Buffer.prototype.set = function (v, offset) {
+  console.log('.set() is deprecated. Access using array indexes instead.')
+  return this.writeUInt8(v, offset)
+}
+
+function hexWrite (buf, string, offset, length) {
+  offset = Number(offset) || 0
+  var remaining = buf.length - offset
+  if (!length) {
+    length = remaining
+  } else {
+    length = Number(length)
+    if (length > remaining) {
+      length = remaining
+    }
+  }
+
+  // must be an even number of digits
+  var strLen = string.length
+  if (strLen % 2 !== 0) throw new Error('Invalid hex string')
+
+  if (length > strLen / 2) {
+    length = strLen / 2
+  }
+  for (var i = 0; i < length; i++) {
+    var byte = parseInt(string.substr(i * 2, 2), 16)
+    if (isNaN(byte)) throw new Error('Invalid hex string')
+    buf[offset + i] = byte
+  }
+  return i
+}
+
+function utf8Write (buf, string, offset, length) {
+  var charsWritten = blitBuffer(utf8ToBytes(string), buf, offset, length)
+  return charsWritten
+}
+
+function asciiWrite (buf, string, offset, length) {
+  var charsWritten = blitBuffer(asciiToBytes(string), buf, offset, length)
+  return charsWritten
+}
+
+function binaryWrite (buf, string, offset, length) {
+  return asciiWrite(buf, string, offset, length)
+}
+
+function base64Write (buf, string, offset, length) {
+  var charsWritten = blitBuffer(base64ToBytes(string), buf, offset, length)
+  return charsWritten
+}
+
+function utf16leWrite (buf, string, offset, length) {
+  var charsWritten = blitBuffer(utf16leToBytes(string), buf, offset, length)
+  return charsWritten
+}
+
+Buffer.prototype.write = function (string, offset, length, encoding) {
+  // Support both (string, offset, length, encoding)
+  // and the legacy (string, encoding, offset, length)
+  if (isFinite(offset)) {
+    if (!isFinite(length)) {
+      encoding = length
+      length = undefined
+    }
+  } else {  // legacy
+    var swap = encoding
+    encoding = offset
+    offset = length
+    length = swap
+  }
+
+  offset = Number(offset) || 0
+  var remaining = this.length - offset
+  if (!length) {
+    length = remaining
+  } else {
+    length = Number(length)
+    if (length > remaining) {
+      length = remaining
+    }
+  }
+  encoding = String(encoding || 'utf8').toLowerCase()
+
+  var ret
+  switch (encoding) {
+    case 'hex':
+      ret = hexWrite(this, string, offset, length)
+      break
+    case 'utf8':
+    case 'utf-8':
+      ret = utf8Write(this, string, offset, length)
+      break
+    case 'ascii':
+      ret = asciiWrite(this, string, offset, length)
+      break
+    case 'binary':
+      ret = binaryWrite(this, string, offset, length)
+      break
+    case 'base64':
+      ret = base64Write(this, string, offset, length)
+      break
+    case 'ucs2':
+    case 'ucs-2':
+    case 'utf16le':
+    case 'utf-16le':
+      ret = utf16leWrite(this, string, offset, length)
+      break
+    default:
+      throw new TypeError('Unknown encoding: ' + encoding)
+  }
+  return ret
+}
+
+Buffer.prototype.toJSON = function () {
+  return {
+    type: 'Buffer',
+    data: Array.prototype.slice.call(this._arr || this, 0)
+  }
+}
+
+function base64Slice (buf, start, end) {
+  if (start === 0 && end === buf.length) {
+    return base64.fromByteArray(buf)
+  } else {
+    return base64.fromByteArray(buf.slice(start, end))
+  }
+}
+
+function utf8Slice (buf, start, end) {
+  var res = ''
+  var tmp = ''
+  end = Math.min(buf.length, end)
+
+  for (var i = start; i < end; i++) {
+    if (buf[i] <= 0x7F) {
+      res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i])
+      tmp = ''
+    } else {
+      tmp += '%' + buf[i].toString(16)
+    }
+  }
+
+  return res + decodeUtf8Char(tmp)
+}
+
+function asciiSlice (buf, start, end) {
+  var ret = ''
+  end = Math.min(buf.length, end)
+
+  for (var i = start; i < end; i++) {
+    ret += String.fromCharCode(buf[i])
+  }
+  return ret
+}
+
+function binarySlice (buf, start, end) {
+  return asciiSlice(buf, start, end)
+}
+
+function hexSlice (buf, start, end) {
+  var len = buf.length
+
+  if (!start || start < 0) start = 0
+  if (!end || end < 0 || end > len) end = len
+
+  var out = ''
+  for (var i = start; i < end; i++) {
+    out += toHex(buf[i])
+  }
+  return out
+}
+
+function utf16leSlice (buf, start, end) {
+  var bytes = buf.slice(start, end)
+  var res = ''
+  for (var i = 0; i < bytes.length; i += 2) {
+    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
+  }
+  return res
+}
+
+Buffer.prototype.slice = function (start, end) {
+  var len = this.length
+  start = ~~start
+  end = end === undefined ? len : ~~end
+
+  if (start < 0) {
+    start += len;
+    if (start < 0)
+      start = 0
+  } else if (start > len) {
+    start = len
+  }
+
+  if (end < 0) {
+    end += len
+    if (end < 0)
+      end = 0
+  } else if (end > len) {
+    end = len
+  }
+
+  if (end < start)
+    end = start
+
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    return Buffer._augment(this.subarray(start, end))
+  } else {
+    var sliceLen = end - start
+    var newBuf = new Buffer(sliceLen, undefined, true)
+    for (var i = 0; i < sliceLen; i++) {
+      newBuf[i] = this[i + start]
+    }
+    return newBuf
+  }
+}
+
+/*
+ * Need to make sure that buffer isn't trying to write out of bounds.
+ */
+function checkOffset (offset, ext, length) {
+  if ((offset % 1) !== 0 || offset < 0)
+    throw new RangeError('offset is not uint')
+  if (offset + ext > length)
+    throw new RangeError('Trying to access beyond buffer length')
+}
+
+Buffer.prototype.readUInt8 = function (offset, noAssert) {
+  if (!noAssert)
+    checkOffset(offset, 1, this.length)
+  return this[offset]
+}
+
+Buffer.prototype.readUInt16LE = function (offset, noAssert) {
+  if (!noAssert)
+    checkOffset(offset, 2, this.length)
+  return this[offset] | (this[offset + 1] << 8)
+}
+
+Buffer.prototype.readUInt16BE = function (offset, noAssert) {
+  if (!noAssert)
+    checkOffset(offset, 2, this.length)
+  return (this[offset] << 8) | this[offset + 1]
+}
+
+Buffer.prototype.readUInt32LE = function (offset, noAssert) {
+  if (!noAssert)
+    checkOffset(offset, 4, this.length)
+
+  return ((this[offset]) |
+      (this[offset + 1] << 8) |
+      (this[offset + 2] << 16)) +
+      (this[offset + 3] * 0x1000000)
+}
+
+Buffer.prototype.readUInt32BE = function (offset, noAssert) {
+  if (!noAssert)
+    checkOffset(offset, 4, this.length)
+
+  return (this[offset] * 0x1000000) +
+      ((this[offset + 1] << 16) |
+      (this[offset + 2] << 8) |
+      this[offset + 3])
+}
+
+Buffer.prototype.readInt8 = function (offset, noAssert) {
+  if (!noAssert)
+    checkOffset(offset, 1, this.length)
+  if (!(this[offset] & 0x80))
+    return (this[offset])
+  return ((0xff - this[offset] + 1) * -1)
+}
+
+Buffer.prototype.readInt16LE = function (offset, noAssert) {
+  if (!noAssert)
+    checkOffset(offset, 2, this.length)
+  var val = this[offset] | (this[offset + 1] << 8)
+  return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+
+Buffer.prototype.readInt16BE = function (offset, noAssert) {
+  if (!noAssert)
+    checkOffset(offset, 2, this.length)
+  var val = this[offset + 1] | (this[offset] << 8)
+  return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+
+Buffer.prototype.readInt32LE = function (offset, noAssert) {
+  if (!noAssert)
+    checkOffset(offset, 4, this.length)
+
+  return (this[offset]) |
+      (this[offset + 1] << 8) |
+      (this[offset + 2] << 16) |
+      (this[offset + 3] << 24)
+}
+
+Buffer.prototype.readInt32BE = function (offset, noAssert) {
+  if (!noAssert)
+    checkOffset(offset, 4, this.length)
+
+  return (this[offset] << 24) |
+      (this[offset + 1] << 16) |
+      (this[offset + 2] << 8) |
+      (this[offset + 3])
+}
+
+Buffer.prototype.readFloatLE = function (offset, noAssert) {
+  if (!noAssert)
+    checkOffset(offset, 4, this.length)
+  return ieee754.read(this, offset, true, 23, 4)
+}
+
+Buffer.prototype.readFloatBE = function (offset, noAssert) {
+  if (!noAssert)
+    checkOffset(offset, 4, this.length)
+  return ieee754.read(this, offset, false, 23, 4)
+}
+
+Buffer.prototype.readDoubleLE = function (offset, noAssert) {
+  if (!noAssert)
+    checkOffset(offset, 8, this.length)
+  return ieee754.read(this, offset, true, 52, 8)
+}
+
+Buffer.prototype.readDoubleBE = function (offset, noAssert) {
+  if (!noAssert)
+    checkOffset(offset, 8, this.length)
+  return ieee754.read(this, offset, false, 52, 8)
+}
+
+function checkInt (buf, value, offset, ext, max, min) {
+  if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
+  if (value > max || value < min) throw new TypeError('value is out of bounds')
+  if (offset + ext > buf.length) throw new TypeError('index out of range')
+}
+
+Buffer.prototype.writeUInt8 = function (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert)
+    checkInt(this, value, offset, 1, 0xff, 0)
+  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
+  this[offset] = value
+  return offset + 1
+}
+
+function objectWriteUInt16 (buf, value, offset, littleEndian) {
+  if (value < 0) value = 0xffff + value + 1
+  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
+    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
+      (littleEndian ? i : 1 - i) * 8
+  }
+}
+
+Buffer.prototype.writeUInt16LE = function (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert)
+    checkInt(this, value, offset, 2, 0xffff, 0)
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset] = value
+    this[offset + 1] = (value >>> 8)
+  } else objectWriteUInt16(this, value, offset, true)
+  return offset + 2
+}
+
+Buffer.prototype.writeUInt16BE = function (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert)
+    checkInt(this, value, offset, 2, 0xffff, 0)
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset] = (value >>> 8)
+    this[offset + 1] = value
+  } else objectWriteUInt16(this, value, offset, false)
+  return offset + 2
+}
+
+function objectWriteUInt32 (buf, value, offset, littleEndian) {
+  if (value < 0) value = 0xffffffff + value + 1
+  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
+    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
+  }
+}
+
+Buffer.prototype.writeUInt32LE = function (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert)
+    checkInt(this, value, offset, 4, 0xffffffff, 0)
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset + 3] = (value >>> 24)
+    this[offset + 2] = (value >>> 16)
+    this[offset + 1] = (value >>> 8)
+    this[offset] = value
+  } else objectWriteUInt32(this, value, offset, true)
+  return offset + 4
+}
+
+Buffer.prototype.writeUInt32BE = function (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert)
+    checkInt(this, value, offset, 4, 0xffffffff, 0)
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset] = (value >>> 24)
+    this[offset + 1] = (value >>> 16)
+    this[offset + 2] = (value >>> 8)
+    this[offset + 3] = value
+  } else objectWriteUInt32(this, value, offset, false)
+  return offset + 4
+}
+
+Buffer.prototype.writeInt8 = function (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert)
+    checkInt(this, value, offset, 1, 0x7f, -0x80)
+  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
+  if (value < 0) value = 0xff + value + 1
+  this[offset] = value
+  return offset + 1
+}
+
+Buffer.prototype.writeInt16LE = function (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert)
+    checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset] = value
+    this[offset + 1] = (value >>> 8)
+  } else objectWriteUInt16(this, value, offset, true)
+  return offset + 2
+}
+
+Buffer.prototype.writeInt16BE = function (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert)
+    checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset] = (value >>> 8)
+    this[offset + 1] = value
+  } else objectWriteUInt16(this, value, offset, false)
+  return offset + 2
+}
+
+Buffer.prototype.writeInt32LE = function (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert)
+    checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset] = value
+    this[offset + 1] = (value >>> 8)
+    this[offset + 2] = (value >>> 16)
+    this[offset + 3] = (value >>> 24)
+  } else objectWriteUInt32(this, value, offset, true)
+  return offset + 4
+}
+
+Buffer.prototype.writeInt32BE = function (value, offset, noAssert) {
+  value = +value
+  offset = offset >>> 0
+  if (!noAssert)
+    checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+  if (value < 0) value = 0xffffffff + value + 1
+  if (Buffer.TYPED_ARRAY_SUPPORT) {
+    this[offset] = (value >>> 24)
+    this[offset + 1] = (value >>> 16)
+    this[offset + 2] = (value >>> 8)
+    this[offset + 3] = value
+  } else objectWriteUInt32(this, value, offset, false)
+  return offset + 4
+}
+
+function checkIEEE754 (buf, value, offset, ext, max, min) {
+  if (value > max || value < min) throw new TypeError('value is out of bounds')
+  if (offset + ext > buf.length) throw new TypeError('index out of range')
+}
+
+function writeFloat (buf, value, offset, littleEndian, noAssert) {
+  if (!noAssert)
+    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
+  ieee754.write(buf, value, offset, littleEndian, 23, 4)
+  return offset + 4
+}
+
+Buffer.prototype.writeFloatLE = function (value, offset, noAssert) {
+  return writeFloat(this, value, offset, true, noAssert)
+}
+
+Buffer.prototype.writeFloatBE = function (value, offset, noAssert) {
+  return writeFloat(this, value, offset, false, noAssert)
+}
+
+function writeDouble (buf, value, offset, littleEndian, noAssert) {
+  if (!noAssert)
+    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
+  ieee754.write(buf, value, offset, littleEndian, 52, 8)
+  return offset + 8
+}
+
+Buffer.prototype.writeDoubleLE = function (value, offset, noAssert) {
+  return writeDouble(this, value, offset, true, noAssert)
+}
+
+Buffer.prototype.writeDoubleBE = function (value, offset, noAssert) {
+  return writeDouble(this, value, offset, false, noAssert)
+}
+
+// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
+Buffer.prototype.copy = function (target, target_start, start, end) {
+  var source = this
+
+  if (!start) start = 0
+  if (!end && end !== 0) end = this.length
+  if (!target_start) target_start = 0
+
+  // Copy 0 bytes; we're done
+  if (end === start) return
+  if (target.length === 0 || source.length === 0) return
+
+  // Fatal error conditions
+  if (end < start) throw new TypeError('sourceEnd < sourceStart')
+  if (target_start < 0 || target_start >= target.length)
+    throw new TypeError('targetStart out of bounds')
+  if (start < 0 || start >= source.length) throw new TypeError('sourceStart out of bounds')
+  if (end < 0 || end > source.length) throw new TypeError('sourceEnd out of bounds')
+
+  // Are we oob?
+  if (end > this.length)
+    end = this.length
+  if (target.length - target_start < end - start)
+    end = target.length - target_start + start
+
+  var len = end - start
+
+  if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
+    for (var i = 0; i < len; i++) {
+      target[i + target_start] = this[i + start]
+    }
+  } else {
+    target._set(this.subarray(start, start + len), target_start)
+  }
+}
+
+// fill(value, start=0, end=buffer.length)
+Buffer.prototype.fill = function (value, start, end) {
+  if (!value) value = 0
+  if (!start) start = 0
+  if (!end) end = this.length
+
+  if (end < start) throw new TypeError('end < start')
+
+  // Fill 0 bytes; we're done
+  if (end === start) return
+  if (this.length === 0) return
+
+  if (start < 0 || start >= this.length) throw new TypeError('start out of bounds')
+  if (end < 0 || end > this.length) throw new TypeError('end out of bounds')
+
+  var i
+  if (typeof value === 'number') {
+    for (i = start; i < end; i++) {
+      this[i] = value
+    }
+  } else {
+    var bytes = utf8ToBytes(value.toString())
+    var len = bytes.length
+    for (i = start; i < end; i++) {
+      this[i] = bytes[i % len]
+    }
+  }
+
+  return this
+}
+
+/**
+ * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
+ * Added in Node 0.12. Only available in browsers that support ArrayBuffer.
+ */
+Buffer.prototype.toArrayBuffer = function () {
+  if (typeof Uint8Array !== 'undefined') {
+    if (Buffer.TYPED_ARRAY_SUPPORT) {
+      return (new Buffer(this)).buffer
+    } else {
+      var buf = new Uint8Array(this.length)
+      for (var i = 0, len = buf.length; i < len; i += 1) {
+        buf[i] = this[i]
+      }
+      return buf.buffer
+    }
+  } else {
+    throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
+  }
+}
+
+// HELPER FUNCTIONS
+// ================
+
+var BP = Buffer.prototype
+
+/**
+ * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
+ */
+Buffer._augment = function (arr) {
+  arr.constructor = Buffer
+  arr._isBuffer = true
+
+  // save reference to original Uint8Array get/set methods before overwriting
+  arr._get = arr.get
+  arr._set = arr.set
+
+  // deprecated, will be removed in node 0.13+
+  arr.get = BP.get
+  arr.set = BP.set
+
+  arr.write = BP.write
+  arr.toString = BP.toString
+  arr.toLocaleString = BP.toString
+  arr.toJSON = BP.toJSON
+  arr.equals = BP.equals
+  arr.compare = BP.compare
+  arr.copy = BP.copy
+  arr.slice = BP.slice
+  arr.readUInt8 = BP.readUInt8
+  arr.readUInt16LE = BP.readUInt16LE
+  arr.readUInt16BE = BP.readUInt16BE
+  arr.readUInt32LE = BP.readUInt32LE
+  arr.readUInt32BE = BP.readUInt32BE
+  arr.readInt8 = BP.readInt8
+  arr.readInt16LE = BP.readInt16LE
+  arr.readInt16BE = BP.readInt16BE
+  arr.readInt32LE = BP.readInt32LE
+  arr.readInt32BE = BP.readInt32BE
+  arr.readFloatLE = BP.readFloatLE
+  arr.readFloatBE = BP.readFloatBE
+  arr.readDoubleLE = BP.readDoubleLE
+  arr.readDoubleBE = BP.readDoubleBE
+  arr.writeUInt8 = BP.writeUInt8
+  arr.writeUInt16LE = BP.writeUInt16LE
+  arr.writeUInt16BE = BP.writeUInt16BE
+  arr.writeUInt32LE = BP.writeUInt32LE
+  arr.writeUInt32BE = BP.writeUInt32BE
+  arr.writeInt8 = BP.writeInt8
+  arr.writeInt16LE = BP.writeInt16LE
+  arr.writeInt16BE = BP.writeInt16BE
+  arr.writeInt32LE = BP.writeInt32LE
+  arr.writeInt32BE = BP.writeInt32BE
+  arr.writeFloatLE = BP.writeFloatLE
+  arr.writeFloatBE = BP.writeFloatBE
+  arr.writeDoubleLE = BP.writeDoubleLE
+  arr.writeDoubleBE = BP.writeDoubleBE
+  arr.fill = BP.fill
+  arr.inspect = BP.inspect
+  arr.toArrayBuffer = BP.toArrayBuffer
+
+  return arr
+}
+
+var INVALID_BASE64_RE = /[^+\/0-9A-z]/g
+
+function base64clean (str) {
+  // Node strips out invalid characters like \n and \t from the string, base64-js does not
+  str = stringtrim(str).replace(INVALID_BASE64_RE, '')
+  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
+  while (str.length % 4 !== 0) {
+    str = str + '='
+  }
+  return str
+}
+
+function stringtrim (str) {
+  if (str.trim) return str.trim()
+  return str.replace(/^\s+|\s+$/g, '')
+}
+
+function isArrayish (subject) {
+  return isArray(subject) || Buffer.isBuffer(subject) ||
+      subject && typeof subject === 'object' &&
+      typeof subject.length === 'number'
+}
+
+function toHex (n) {
+  if (n < 16) return '0' + n.toString(16)
+  return n.toString(16)
+}
+
+function utf8ToBytes (str) {
+  var byteArray = []
+  for (var i = 0; i < str.length; i++) {
+    var b = str.charCodeAt(i)
+    if (b <= 0x7F) {
+      byteArray.push(b)
+    } else {
+      var start = i
+      if (b >= 0xD800 && b <= 0xDFFF) i++
+      var h = encodeURIComponent(str.slice(start, i+1)).substr(1).split('%')
+      for (var j = 0; j < h.length; j++) {
+        byteArray.push(parseInt(h[j], 16))
+      }
+    }
+  }
+  return byteArray
+}
+
+function asciiToBytes (str) {
+  var byteArray = []
+  for (var i = 0; i < str.length; i++) {
+    // Node's code seems to be doing this and not & 0x7F..
+    byteArray.push(str.charCodeAt(i) & 0xFF)
+  }
+  return byteArray
+}
+
+function utf16leToBytes (str) {
+  var c, hi, lo
+  var byteArray = []
+  for (var i = 0; i < str.length; i++) {
+    c = str.charCodeAt(i)
+    hi = c >> 8
+    lo = c % 256
+    byteArray.push(lo)
+    byteArray.push(hi)
+  }
+
+  return byteArray
+}
+
+function base64ToBytes (str) {
+  return base64.toByteArray(str)
+}
+
+function blitBuffer (src, dst, offset, length) {
+  for (var i = 0; i < length; i++) {
+    if ((i + offset >= dst.length) || (i >= src.length))
+      break
+    dst[i + offset] = src[i]
+  }
+  return i
+}
+
+function decodeUtf8Char (str) {
+  try {
+    return decodeURIComponent(str)
+  } catch (err) {
+    return String.fromCharCode(0xFFFD) // UTF 8 invalid char
+  }
+}
+
+},{"base64-js":4,"ieee754":5,"is-array":6}],4:[function(require,module,exports){
+var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+
+;(function (exports) {
+	'use strict';
+
+  var Arr = (typeof Uint8Array !== 'undefined')
+    ? Uint8Array
+    : Array
+
+	var PLUS   = '+'.charCodeAt(0)
+	var SLASH  = '/'.charCodeAt(0)
+	var NUMBER = '0'.charCodeAt(0)
+	var LOWER  = 'a'.charCodeAt(0)
+	var UPPER  = 'A'.charCodeAt(0)
+
+	function decode (elt) {
+		var code = elt.charCodeAt(0)
+		if (code === PLUS)
+			return 62 // '+'
+		if (code === SLASH)
+			return 63 // '/'
+		if (code < NUMBER)
+			return -1 //no match
+		if (code < NUMBER + 10)
+			return code - NUMBER + 26 + 26
+		if (code < UPPER + 26)
+			return code - UPPER
+		if (code < LOWER + 26)
+			return code - LOWER + 26
+	}
+
+	function b64ToByteArray (b64) {
+		var i, j, l, tmp, placeHolders, arr
+
+		if (b64.length % 4 > 0) {
+			throw new Error('Invalid string. Length must be a multiple of 4')
+		}
+
+		// the number of equal signs (place holders)
+		// if there are two placeholders, than the two characters before it
+		// represent one byte
+		// if there is only one, then the three characters before it represent 2 bytes
+		// this is just a cheap hack to not do indexOf twice
+		var len = b64.length
+		placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0
+
+		// base64 is 4/3 + up to two characters of the original data
+		arr = new Arr(b64.length * 3 / 4 - placeHolders)
+
+		// if there are placeholders, only get up to the last complete 4 chars
+		l = placeHolders > 0 ? b64.length - 4 : b64.length
+
+		var L = 0
+
+		function push (v) {
+			arr[L++] = v
+		}
+
+		for (i = 0, j = 0; i < l; i += 4, j += 3) {
+			tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
+			push((tmp & 0xFF0000) >> 16)
+			push((tmp & 0xFF00) >> 8)
+			push(tmp & 0xFF)
+		}
+
+		if (placeHolders === 2) {
+			tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
+			push(tmp & 0xFF)
+		} else if (placeHolders === 1) {
+			tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
+			push((tmp >> 8) & 0xFF)
+			push(tmp & 0xFF)
+		}
+
+		return arr
+	}
+
+	function uint8ToBase64 (uint8) {
+		var i,
+			extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
+			output = "",
+			temp, length
+
+		function encode (num) {
+			return lookup.charAt(num)
+		}
+
+		function tripletToBase64 (num) {
+			return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
+		}
+
+		// go through the array every three bytes, we'll deal with trailing stuff later
+		for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
+			temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
+			output += tripletToBase64(temp)
+		}
+
+		// pad the end with zeros, but make sure to not forget the extra bytes
+		switch (extraBytes) {
+			case 1:
+				temp = uint8[uint8.length - 1]
+				output += encode(temp >> 2)
+				output += encode((temp << 4) & 0x3F)
+				output += '=='
+				break
+			case 2:
+				temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
+				output += encode(temp >> 10)
+				output += encode((temp >> 4) & 0x3F)
+				output += encode((temp << 2) & 0x3F)
+				output += '='
+				break
+		}
+
+		return output
+	}
+
+	exports.toByteArray = b64ToByteArray
+	exports.fromByteArray = uint8ToBase64
+}(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
+
+},{}],5:[function(require,module,exports){
+exports.read = function(buffer, offset, isLE, mLen, nBytes) {
+  var e, m,
+      eLen = nBytes * 8 - mLen - 1,
+      eMax = (1 << eLen) - 1,
+      eBias = eMax >> 1,
+      nBits = -7,
+      i = isLE ? (nBytes - 1) : 0,
+      d = isLE ? -1 : 1,
+      s = buffer[offset + i];
+
+  i += d;
+
+  e = s & ((1 << (-nBits)) - 1);
+  s >>= (-nBits);
+  nBits += eLen;
+  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8);
+
+  m = e & ((1 << (-nBits)) - 1);
+  e >>= (-nBits);
+  nBits += mLen;
+  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8);
+
+  if (e === 0) {
+    e = 1 - eBias;
+  } else if (e === eMax) {
+    return m ? NaN : ((s ? -1 : 1) * Infinity);
+  } else {
+    m = m + Math.pow(2, mLen);
+    e = e - eBias;
+  }
+  return (s ? -1 : 1) * m * Math.pow(2, e - mLen);
+};
+
+exports.write = function(buffer, value, offset, isLE, mLen, nBytes) {
+  var e, m, c,
+      eLen = nBytes * 8 - mLen - 1,
+      eMax = (1 << eLen) - 1,
+      eBias = eMax >> 1,
+      rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0),
+      i = isLE ? 0 : (nBytes - 1),
+      d = isLE ? 1 : -1,
+      s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
+
+  value = Math.abs(value);
+
+  if (isNaN(value) || value === Infinity) {
+    m = isNaN(value) ? 1 : 0;
+    e = eMax;
+  } else {
+    e = Math.floor(Math.log(value) / Math.LN2);
+    if (value * (c = Math.pow(2, -e)) < 1) {
+      e--;
+      c *= 2;
+    }
+    if (e + eBias >= 1) {
+      value += rt / c;
+    } else {
+      value += rt * Math.pow(2, 1 - eBias);
+    }
+    if (value * c >= 2) {
+      e++;
+      c /= 2;
+    }
+
+    if (e + eBias >= eMax) {
+      m = 0;
+      e = eMax;
+    } else if (e + eBias >= 1) {
+      m = (value * c - 1) * Math.pow(2, mLen);
+      e = e + eBias;
+    } else {
+      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
+      e = 0;
+    }
+  }
+
+  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8);
+
+  e = (e << mLen) | m;
+  eLen += mLen;
+  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8);
+
+  buffer[offset + i - d] |= s * 128;
+};
+
+},{}],6:[function(require,module,exports){
+
+/**
+ * isArray
+ */
+
+var isArray = Array.isArray;
+
+/**
+ * toString
+ */
+
+var str = Object.prototype.toString;
+
+/**
+ * Whether or not the given `val`
+ * is an array.
+ *
+ * example:
+ *
+ *        isArray([]);
+ *        // > true
+ *        isArray(arguments);
+ *        // > false
+ *        isArray('');
+ *        // > false
+ *
+ * @param {mixed} val
+ * @return {bool}
+ */
+
+module.exports = isArray || function (val) {
+  return !! val && '[object Array]' == str.call(val);
+};
+
+},{}],7:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+function EventEmitter() {
+  this._events = this._events || {};
+  this._maxListeners = this._maxListeners || undefined;
+}
+module.exports = EventEmitter;
+
+// Backwards-compat with node 0.10.x
+EventEmitter.EventEmitter = EventEmitter;
+
+EventEmitter.prototype._events = undefined;
+EventEmitter.prototype._maxListeners = undefined;
+
+// By default EventEmitters will print a warning if more than 10 listeners are
+// added to it. This is a useful default which helps finding memory leaks.
+EventEmitter.defaultMaxListeners = 10;
+
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+EventEmitter.prototype.setMaxListeners = function(n) {
+  if (!isNumber(n) || n < 0 || isNaN(n))
+    throw TypeError('n must be a positive number');
+  this._maxListeners = n;
+  return this;
+};
+
+EventEmitter.prototype.emit = function(type) {
+  var er, handler, len, args, i, listeners;
+
+  if (!this._events)
+    this._events = {};
+
+  // If there is no 'error' event listener then throw.
+  if (type === 'error') {
+    if (!this._events.error ||
+        (isObject(this._events.error) && !this._events.error.length)) {
+      er = arguments[1];
+      if (er instanceof Error) {
+        throw er; // Unhandled 'error' event
+      }
+      throw TypeError('Uncaught, unspecified "error" event.');
+    }
+  }
+
+  handler = this._events[type];
+
+  if (isUndefined(handler))
+    return false;
+
+  if (isFunction(handler)) {
+    switch (arguments.length) {
+      // fast cases
+      case 1:
+        handler.call(this);
+        break;
+      case 2:
+        handler.call(this, arguments[1]);
+        break;
+      case 3:
+        handler.call(this, arguments[1], arguments[2]);
+        break;
+      // slower
+      default:
+        len = arguments.length;
+        args = new Array(len - 1);
+        for (i = 1; i < len; i++)
+          args[i - 1] = arguments[i];
+        handler.apply(this, args);
+    }
+  } else if (isObject(handler)) {
+    len = arguments.length;
+    args = new Array(len - 1);
+    for (i = 1; i < len; i++)
+      args[i - 1] = arguments[i];
+
+    listeners = handler.slice();
+    len = listeners.length;
+    for (i = 0; i < len; i++)
+      listeners[i].apply(this, args);
+  }
+
+  return true;
+};
+
+EventEmitter.prototype.addListener = function(type, listener) {
+  var m;
+
+  if (!isFunction(listener))
+    throw TypeError('listener must be a function');
+
+  if (!this._events)
+    this._events = {};
+
+  // To avoid recursion in the case that type === "newListener"! Before
+  // adding it to the listeners, first emit "newListener".
+  if (this._events.newListener)
+    this.emit('newListener', type,
+              isFunction(listener.listener) ?
+              listener.listener : listener);
+
+  if (!this._events[type])
+    // Optimize the case of one listener. Don't need the extra array object.
+    this._events[type] = listener;
+  else if (isObject(this._events[type]))
+    // If we've already got an array, just append.
+    this._events[type].push(listener);
+  else
+    // Adding the second element, need to change to array.
+    this._events[type] = [this._events[type], listener];
+
+  // Check for listener leak
+  if (isObject(this._events[type]) && !this._events[type].warned) {
+    var m;
+    if (!isUndefined(this._maxListeners)) {
+      m = this._maxListeners;
+    } else {
+      m = EventEmitter.defaultMaxListeners;
+    }
+
+    if (m && m > 0 && this._events[type].length > m) {
+      this._events[type].warned = true;
+      console.error('(node) warning: possible EventEmitter memory ' +
+                    'leak detected. %d listeners added. ' +
+                    'Use emitter.setMaxListeners() to increase limit.',
+                    this._events[type].length);
+      if (typeof console.trace === 'function') {
+        // not supported in IE 10
+        console.trace();
+      }
+    }
+  }
+
+  return this;
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.once = function(type, listener) {
+  if (!isFunction(listener))
+    throw TypeError('listener must be a function');
+
+  var fired = false;
+
+  function g() {
+    this.removeListener(type, g);
+
+    if (!fired) {
+      fired = true;
+      listener.apply(this, arguments);
+    }
+  }
+
+  g.listener = listener;
+  this.on(type, g);
+
+  return this;
+};
+
+// emits a 'removeListener' event iff the listener was removed
+EventEmitter.prototype.removeListener = function(type, listener) {
+  var list, position, length, i;
+
+  if (!isFunction(listener))
+    throw TypeError('listener must be a function');
+
+  if (!this._events || !this._events[type])
+    return this;
+
+  list = this._events[type];
+  length = list.length;
+  position = -1;
+
+  if (list === listener ||
+      (isFunction(list.listener) && list.listener === listener)) {
+    delete this._events[type];
+    if (this._events.removeListener)
+      this.emit('removeListener', type, listener);
+
+  } else if (isObject(list)) {
+    for (i = length; i-- > 0;) {
+      if (list[i] === listener ||
+          (list[i].listener && list[i].listener === listener)) {
+        position = i;
+        break;
+      }
+    }
+
+    if (position < 0)
+      return this;
+
+    if (list.length === 1) {
+      list.length = 0;
+      delete this._events[type];
+    } else {
+      list.splice(position, 1);
+    }
+
+    if (this._events.removeListener)
+      this.emit('removeListener', type, listener);
+  }
+
+  return this;
+};
+
+EventEmitter.prototype.removeAllListeners = function(type) {
+  var key, listeners;
+
+  if (!this._events)
+    return this;
+
+  // not listening for removeListener, no need to emit
+  if (!this._events.removeListener) {
+    if (arguments.length === 0)
+      this._events = {};
+    else if (this._events[type])
+      delete this._events[type];
+    return this;
+  }
+
+  // emit removeListener for all listeners on all events
+  if (arguments.length === 0) {
+    for (key in this._events) {
+      if (key === 'removeListener') continue;
+      this.removeAllListeners(key);
+    }
+    this.removeAllListeners('removeListener');
+    this._events = {};
+    return this;
+  }
+
+  listeners = this._events[type];
+
+  if (isFunction(listeners)) {
+    this.removeListener(type, listeners);
+  } else {
+    // LIFO order
+    while (listeners.length)
+      this.removeListener(type, listeners[listeners.length - 1]);
+  }
+  delete this._events[type];
+
+  return this;
+};
+
+EventEmitter.prototype.listeners = function(type) {
+  var ret;
+  if (!this._events || !this._events[type])
+    ret = [];
+  else if (isFunction(this._events[type]))
+    ret = [this._events[type]];
+  else
+    ret = this._events[type].slice();
+  return ret;
+};
+
+EventEmitter.listenerCount = function(emitter, type) {
+  var ret;
+  if (!emitter._events || !emitter._events[type])
+    ret = 0;
+  else if (isFunction(emitter._events[type]))
+    ret = 1;
+  else
+    ret = emitter._events[type].length;
+  return ret;
+};
+
+function isFunction(arg) {
+  return typeof arg === 'function';
+}
+
+function isNumber(arg) {
+  return typeof arg === 'number';
+}
+
+function isObject(arg) {
+  return typeof arg === 'object' && arg !== null;
+}
+
+function isUndefined(arg) {
+  return arg === void 0;
+}
+
+},{}],8:[function(require,module,exports){
+if (typeof Object.create === 'function') {
+  // implementation from standard node.js 'util' module
+  module.exports = function inherits(ctor, superCtor) {
+    ctor.super_ = superCtor
+    ctor.prototype = Object.create(superCtor.prototype, {
+      constructor: {
+        value: ctor,
+        enumerable: false,
+        writable: true,
+        configurable: true
+      }
+    });
+  };
+} else {
+  // old school shim for old browsers
+  module.exports = function inherits(ctor, superCtor) {
+    ctor.super_ = superCtor
+    var TempCtor = function () {}
+    TempCtor.prototype = superCtor.prototype
+    ctor.prototype = new TempCtor()
+    ctor.prototype.constructor = ctor
+  }
+}
+
+},{}],9:[function(require,module,exports){
+module.exports = Array.isArray || function (arr) {
+  return Object.prototype.toString.call(arr) == '[object Array]';
+};
+
+},{}],10:[function(require,module,exports){
+// shim for using process in browser
+
+var process = module.exports = {};
+
+process.nextTick = (function () {
+    var canSetImmediate = typeof window !== 'undefined'
+    && window.setImmediate;
+    var canMutationObserver = typeof window !== 'undefined'
+    && window.MutationObserver;
+    var canPost = typeof window !== 'undefined'
+    && window.postMessage && window.addEventListener
+    ;
+
+    if (canSetImmediate) {
+        return function (f) { return window.setImmediate(f) };
+    }
+
+    var queue = [];
+
+    if (canMutationObserver) {
+        var hiddenDiv = document.createElement("div");
+        var observer = new MutationObserver(function () {
+            var queueList = queue.slice();
+            queue.length = 0;
+            queueList.forEach(function (fn) {
+                fn();
+            });
+        });
+
+        observer.observe(hiddenDiv, { attributes: true });
+
+        return function nextTick(fn) {
+            if (!queue.length) {
+                hiddenDiv.setAttribute('yes', 'no');
+            }
+            queue.push(fn);
+        };
+    }
+
+    if (canPost) {
+        window.addEventListener('message', function (ev) {
+            var source = ev.source;
+            if ((source === window || source === null) && ev.data === 'process-tick') {
+                ev.stopPropagation();
+                if (queue.length > 0) {
+                    var fn = queue.shift();
+                    fn();
+                }
+            }
+        }, true);
+
+        return function nextTick(fn) {
+            queue.push(fn);
+            window.postMessage('process-tick', '*');
+        };
+    }
+
+    return function nextTick(fn) {
+        setTimeout(fn, 0);
+    };
+})();
+
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+
+process.binding = function (name) {
+    throw new Error('process.binding is not supported');
+};
+
+// TODO(shtylman)
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+    throw new Error('process.chdir is not supported');
+};
+
+},{}],11:[function(require,module,exports){
+module.exports = require("./lib/_stream_duplex.js")
+
+},{"./lib/_stream_duplex.js":12}],12:[function(require,module,exports){
+(function (process){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// a duplex stream is just a stream that is both readable and writable.
+// Since JS doesn't have multiple prototypal inheritance, this class
+// prototypally inherits from Readable, and then parasitically from
+// Writable.
+
+module.exports = Duplex;
+
+/*<replacement>*/
+var objectKeys = Object.keys || function (obj) {
+  var keys = [];
+  for (var key in obj) keys.push(key);
+  return keys;
+}
+/*</replacement>*/
+
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+var Readable = require('./_stream_readable');
+var Writable = require('./_stream_writable');
+
+util.inherits(Duplex, Readable);
+
+forEach(objectKeys(Writable.prototype), function(method) {
+  if (!Duplex.prototype[method])
+    Duplex.prototype[method] = Writable.prototype[method];
+});
+
+function Duplex(options) {
+  if (!(this instanceof Duplex))
+    return new Duplex(options);
+
+  Readable.call(this, options);
+  Writable.call(this, options);
+
+  if (options && options.readable === false)
+    this.readable = false;
+
+  if (options && options.writable === false)
+    this.writable = false;
+
+  this.allowHalfOpen = true;
+  if (options && options.allowHalfOpen === false)
+    this.allowHalfOpen = false;
+
+  this.once('end', onend);
+}
+
+// the no-half-open enforcer
+function onend() {
+  // if we allow half-open state, or if the writable side ended,
+  // then we're ok.
+  if (this.allowHalfOpen || this._writableState.ended)
+    return;
+
+  // no more data can be written.
+  // But allow more writes to happen in this tick.
+  process.nextTick(this.end.bind(this));
+}
+
+function forEach (xs, f) {
+  for (var i = 0, l = xs.length; i < l; i++) {
+    f(xs[i], i);
+  }
+}
+
+}).call(this,require('_process'))
+},{"./_stream_readable":14,"./_stream_writable":16,"_process":10,"core-util-is":17,"inherits":8}],13:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// a passthrough stream.
+// basically just the most minimal sort of Transform stream.
+// Every written chunk gets output as-is.
+
+module.exports = PassThrough;
+
+var Transform = require('./_stream_transform');
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+util.inherits(PassThrough, Transform);
+
+function PassThrough(options) {
+  if (!(this instanceof PassThrough))
+    return new PassThrough(options);
+
+  Transform.call(this, options);
+}
+
+PassThrough.prototype._transform = function(chunk, encoding, cb) {
+  cb(null, chunk);
+};
+
+},{"./_stream_transform":15,"core-util-is":17,"inherits":8}],14:[function(require,module,exports){
+(function (process){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+module.exports = Readable;
+
+/*<replacement>*/
+var isArray = require('isarray');
+/*</replacement>*/
+
+
+/*<replacement>*/
+var Buffer = require('buffer').Buffer;
+/*</replacement>*/
+
+Readable.ReadableState = ReadableState;
+
+var EE = require('events').EventEmitter;
+
+/*<replacement>*/
+if (!EE.listenerCount) EE.listenerCount = function(emitter, type) {
+  return emitter.listeners(type).length;
+};
+/*</replacement>*/
+
+var Stream = require('stream');
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+var StringDecoder;
+
+util.inherits(Readable, Stream);
+
+function ReadableState(options, stream) {
+  options = options || {};
+
+  // the point at which it stops calling _read() to fill the buffer
+  // Note: 0 is a valid value, means "don't call _read preemptively ever"
+  var hwm = options.highWaterMark;
+  this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024;
+
+  // cast to ints.
+  this.highWaterMark = ~~this.highWaterMark;
+
+  this.buffer = [];
+  this.length = 0;
+  this.pipes = null;
+  this.pipesCount = 0;
+  this.flowing = false;
+  this.ended = false;
+  this.endEmitted = false;
+  this.reading = false;
+
+  // In streams that never have any data, and do push(null) right away,
+  // the consumer can miss the 'end' event if they do some I/O before
+  // consuming the stream.  So, we don't emit('end') until some reading
+  // happens.
+  this.calledRead = false;
+
+  // a flag to be able to tell if the onwrite cb is called immediately,
+  // or on a later tick.  We set this to true at first, becuase any
+  // actions that shouldn't happen until "later" should generally also
+  // not happen before the first write call.
+  this.sync = true;
+
+  // whenever we return null, then we set a flag to say
+  // that we're awaiting a 'readable' event emission.
+  this.needReadable = false;
+  this.emittedReadable = false;
+  this.readableListening = false;
+
+
+  // object stream flag. Used to make read(n) ignore n and to
+  // make all the buffer merging and length checks go away
+  this.objectMode = !!options.objectMode;
+
+  // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+  this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+  // when piping, we only care about 'readable' events that happen
+  // after read()ing all the bytes and not getting any pushback.
+  this.ranOut = false;
+
+  // the number of writers that are awaiting a drain event in .pipe()s
+  this.awaitDrain = 0;
+
+  // if true, a maybeReadMore has been scheduled
+  this.readingMore = false;
+
+  this.decoder = null;
+  this.encoding = null;
+  if (options.encoding) {
+    if (!StringDecoder)
+      StringDecoder = require('string_decoder/').StringDecoder;
+    this.decoder = new StringDecoder(options.encoding);
+    this.encoding = options.encoding;
+  }
+}
+
+function Readable(options) {
+  if (!(this instanceof Readable))
+    return new Readable(options);
+
+  this._readableState = new ReadableState(options, this);
+
+  // legacy
+  this.readable = true;
+
+  Stream.call(this);
+}
+
+// Manually shove something into the read() buffer.
+// This returns true if the highWaterMark has not been hit yet,
+// similar to how Writable.write() returns true if you should
+// write() some more.
+Readable.prototype.push = function(chunk, encoding) {
+  var state = this._readableState;
+
+  if (typeof chunk === 'string' && !state.objectMode) {
+    encoding = encoding || state.defaultEncoding;
+    if (encoding !== state.encoding) {
+      chunk = new Buffer(chunk, encoding);
+      encoding = '';
+    }
+  }
+
+  return readableAddChunk(this, state, chunk, encoding, false);
+};
+
+// Unshift should *always* be something directly out of read()
+Readable.prototype.unshift = function(chunk) {
+  var state = this._readableState;
+  return readableAddChunk(this, state, chunk, '', true);
+};
+
+function readableAddChunk(stream, state, chunk, encoding, addToFront) {
+  var er = chunkInvalid(state, chunk);
+  if (er) {
+    stream.emit('error', er);
+  } else if (chunk === null || chunk === undefined) {
+    state.reading = false;
+    if (!state.ended)
+      onEofChunk(stream, state);
+  } else if (state.objectMode || chunk && chunk.length > 0) {
+    if (state.ended && !addToFront) {
+      var e = new Error('stream.push() after EOF');
+      stream.emit('error', e);
+    } else if (state.endEmitted && addToFront) {
+      var e = new Error('stream.unshift() after end event');
+      stream.emit('error', e);
+    } else {
+      if (state.decoder && !addToFront && !encoding)
+        chunk = state.decoder.write(chunk);
+
+      // update the buffer info.
+      state.length += state.objectMode ? 1 : chunk.length;
+      if (addToFront) {
+        state.buffer.unshift(chunk);
+      } else {
+        state.reading = false;
+        state.buffer.push(chunk);
+      }
+
+      if (state.needReadable)
+        emitReadable(stream);
+
+      maybeReadMore(stream, state);
+    }
+  } else if (!addToFront) {
+    state.reading = false;
+  }
+
+  return needMoreData(state);
+}
+
+
+
+// if it's past the high water mark, we can push in some more.
+// Also, if we have no data yet, we can stand some
+// more bytes.  This is to work around cases where hwm=0,
+// such as the repl.  Also, if the push() triggered a
+// readable event, and the user called read(largeNumber) such that
+// needReadable was set, then we ought to push more, so that another
+// 'readable' event will be triggered.
+function needMoreData(state) {
+  return !state.ended &&
+         (state.needReadable ||
+          state.length < state.highWaterMark ||
+          state.length === 0);
+}
+
+// backwards compatibility.
+Readable.prototype.setEncoding = function(enc) {
+  if (!StringDecoder)
+    StringDecoder = require('string_decoder/').StringDecoder;
+  this._readableState.decoder = new StringDecoder(enc);
+  this._readableState.encoding = enc;
+};
+
+// Don't raise the hwm > 128MB
+var MAX_HWM = 0x800000;
+function roundUpToNextPowerOf2(n) {
+  if (n >= MAX_HWM) {
+    n = MAX_HWM;
+  } else {
+    // Get the next highest power of 2
+    n--;
+    for (var p = 1; p < 32; p <<= 1) n |= n >> p;
+    n++;
+  }
+  return n;
+}
+
+function howMuchToRead(n, state) {
+  if (state.length === 0 && state.ended)
+    return 0;
+
+  if (state.objectMode)
+    return n === 0 ? 0 : 1;
+
+  if (n === null || isNaN(n)) {
+    // only flow one buffer at a time
+    if (state.flowing && state.buffer.length)
+      return state.buffer[0].length;
+    else
+      return state.length;
+  }
+
+  if (n <= 0)
+    return 0;
+
+  // If we're asking for more than the target buffer level,
+  // then raise the water mark.  Bump up to the next highest
+  // power of 2, to prevent increasing it excessively in tiny
+  // amounts.
+  if (n > state.highWaterMark)
+    state.highWaterMark = roundUpToNextPowerOf2(n);
+
+  // don't have that much.  return null, unless we've ended.
+  if (n > state.length) {
+    if (!state.ended) {
+      state.needReadable = true;
+      return 0;
+    } else
+      return state.length;
+  }
+
+  return n;
+}
+
+// you can override either this method, or the async _read(n) below.
+Readable.prototype.read = function(n) {
+  var state = this._readableState;
+  state.calledRead = true;
+  var nOrig = n;
+  var ret;
+
+  if (typeof n !== 'number' || n > 0)
+    state.emittedReadable = false;
+
+  // if we're doing read(0) to trigger a readable event, but we
+  // already have a bunch of data in the buffer, then just trigger
+  // the 'readable' event and move on.
+  if (n === 0 &&
+      state.needReadable &&
+      (state.length >= state.highWaterMark || state.ended)) {
+    emitReadable(this);
+    return null;
+  }
+
+  n = howMuchToRead(n, state);
+
+  // if we've ended, and we're now clear, then finish it up.
+  if (n === 0 && state.ended) {
+    ret = null;
+
+    // In cases where the decoder did not receive enough data
+    // to produce a full chunk, then immediately received an
+    // EOF, state.buffer will contain [<Buffer >, <Buffer 00 ...>].
+    // howMuchToRead will see this and coerce the amount to
+    // read to zero (because it's looking at the length of the
+    // first <Buffer > in state.buffer), and we'll end up here.
+    //
+    // This can only happen via state.decoder -- no other venue
+    // exists for pushing a zero-length chunk into state.buffer
+    // and triggering this behavior. In this case, we return our
+    // remaining data and end the stream, if appropriate.
+    if (state.length > 0 && state.decoder) {
+      ret = fromList(n, state);
+      state.length -= ret.length;
+    }
+
+    if (state.length === 0)
+      endReadable(this);
+
+    return ret;
+  }
+
+  // All the actual chunk generation logic needs to be
+  // *below* the call to _read.  The reason is that in certain
+  // synthetic stream cases, such as passthrough streams, _read
+  // may be a completely synchronous operation which may change
+  // the state of the read buffer, providing enough data when
+  // before there was *not* enough.
+  //
+  // So, the steps are:
+  // 1. Figure out what the state of things will be after we do
+  // a read from the buffer.
+  //
+  // 2. If that resulting state will trigger a _read, then call _read.
+  // Note that this may be asynchronous, or synchronous.  Yes, it is
+  // deeply ugly to write APIs this way, but that still doesn't mean
+  // that the Readable class should behave improperly, as streams are
+  // designed to be sync/async agnostic.
+  // Take note if the _read call is sync or async (ie, if the read call
+  // has returned yet), so that we know whether or not it's safe to emit
+  // 'readable' etc.
+  //
+  // 3. Actually pull the requested chunks out of the buffer and return.
+
+  // if we need a readable event, then we need to do some reading.
+  var doRead = state.needReadable;
+
+  // if we currently have less than the highWaterMark, then also read some
+  if (state.length - n <= state.highWaterMark)
+    doRead = true;
+
+  // however, if we've ended, then there's no point, and if we're already
+  // reading, then it's unnecessary.
+  if (state.ended || state.reading)
+    doRead = false;
+
+  if (doRead) {
+    state.reading = true;
+    state.sync = true;
+    // if the length is currently zero, then we *need* a readable event.
+    if (state.length === 0)
+      state.needReadable = true;
+    // call internal read method
+    this._read(state.highWaterMark);
+    state.sync = false;
+  }
+
+  // If _read called its callback synchronously, then `reading`
+  // will be false, and we need to re-evaluate how much data we
+  // can return to the user.
+  if (doRead && !state.reading)
+    n = howMuchToRead(nOrig, state);
+
+  if (n > 0)
+    ret = fromList(n, state);
+  else
+    ret = null;
+
+  if (ret === null) {
+    state.needReadable = true;
+    n = 0;
+  }
+
+  state.length -= n;
+
+  // If we have nothing in the buffer, then we want to know
+  // as soon as we *do* get something into the buffer.
+  if (state.length === 0 && !state.ended)
+    state.needReadable = true;
+
+  // If we happened to read() exactly the remaining amount in the
+  // buffer, and the EOF has been seen at this point, then make sure
+  // that we emit 'end' on the very next tick.
+  if (state.ended && !state.endEmitted && state.length === 0)
+    endReadable(this);
+
+  return ret;
+};
+
+function chunkInvalid(state, chunk) {
+  var er = null;
+  if (!Buffer.isBuffer(chunk) &&
+      'string' !== typeof chunk &&
+      chunk !== null &&
+      chunk !== undefined &&
+      !state.objectMode) {
+    er = new TypeError('Invalid non-string/buffer chunk');
+  }
+  return er;
+}
+
+
+function onEofChunk(stream, state) {
+  if (state.decoder && !state.ended) {
+    var chunk = state.decoder.end();
+    if (chunk && chunk.length) {
+      state.buffer.push(chunk);
+      state.length += state.objectMode ? 1 : chunk.length;
+    }
+  }
+  state.ended = true;
+
+  // if we've ended and we have some data left, then emit
+  // 'readable' now to make sure it gets picked up.
+  if (state.length > 0)
+    emitReadable(stream);
+  else
+    endReadable(stream);
+}
+
+// Don't emit readable right away in sync mode, because this can trigger
+// another read() call => stack overflow.  This way, it might trigger
+// a nextTick recursion warning, but that's not so bad.
+function emitReadable(stream) {
+  var state = stream._readableState;
+  state.needReadable = false;
+  if (state.emittedReadable)
+    return;
+
+  state.emittedReadable = true;
+  if (state.sync)
+    process.nextTick(function() {
+      emitReadable_(stream);
+    });
+  else
+    emitReadable_(stream);
+}
+
+function emitReadable_(stream) {
+  stream.emit('readable');
+}
+
+
+// at this point, the user has presumably seen the 'readable' event,
+// and called read() to consume some data.  that may have triggered
+// in turn another _read(n) call, in which case reading = true if
+// it's in progress.
+// However, if we're not ended, or reading, and the length < hwm,
+// then go ahead and try to read some more preemptively.
+function maybeReadMore(stream, state) {
+  if (!state.readingMore) {
+    state.readingMore = true;
+    process.nextTick(function() {
+      maybeReadMore_(stream, state);
+    });
+  }
+}
+
+function maybeReadMore_(stream, state) {
+  var len = state.length;
+  while (!state.reading && !state.flowing && !state.ended &&
+         state.length < state.highWaterMark) {
+    stream.read(0);
+    if (len === state.length)
+      // didn't get any data, stop spinning.
+      break;
+    else
+      len = state.length;
+  }
+  state.readingMore = false;
+}
+
+// abstract method.  to be overridden in specific implementation classes.
+// call cb(er, data) where data is <= n in length.
+// for virtual (non-string, non-buffer) streams, "length" is somewhat
+// arbitrary, and perhaps not very meaningful.
+Readable.prototype._read = function(n) {
+  this.emit('error', new Error('not implemented'));
+};
+
+Readable.prototype.pipe = function(dest, pipeOpts) {
+  var src = this;
+  var state = this._readableState;
+
+  switch (state.pipesCount) {
+    case 0:
+      state.pipes = dest;
+      break;
+    case 1:
+      state.pipes = [state.pipes, dest];
+      break;
+    default:
+      state.pipes.push(dest);
+      break;
+  }
+  state.pipesCount += 1;
+
+  var doEnd = (!pipeOpts || pipeOpts.end !== false) &&
+              dest !== process.stdout &&
+              dest !== process.stderr;
+
+  var endFn = doEnd ? onend : cleanup;
+  if (state.endEmitted)
+    process.nextTick(endFn);
+  else
+    src.once('end', endFn);
+
+  dest.on('unpipe', onunpipe);
+  function onunpipe(readable) {
+    if (readable !== src) return;
+    cleanup();
+  }
+
+  function onend() {
+    dest.end();
+  }
+
+  // when the dest drains, it reduces the awaitDrain counter
+  // on the source.  This would be more elegant with a .once()
+  // handler in flow(), but adding and removing repeatedly is
+  // too slow.
+  var ondrain = pipeOnDrain(src);
+  dest.on('drain', ondrain);
+
+  function cleanup() {
+    // cleanup event handlers once the pipe is broken
+    dest.removeListener('close', onclose);
+    dest.removeListener('finish', onfinish);
+    dest.removeListener('drain', ondrain);
+    dest.removeListener('error', onerror);
+    dest.removeListener('unpipe', onunpipe);
+    src.removeListener('end', onend);
+    src.removeListener('end', cleanup);
+
+    // if the reader is waiting for a drain event from this
+    // specific writer, then it would cause it to never start
+    // flowing again.
+    // So, if this is awaiting a drain, then we just call it now.
+    // If we don't know, then assume that we are waiting for one.
+    if (!dest._writableState || dest._writableState.needDrain)
+      ondrain();
+  }
+
+  // if the dest has an error, then stop piping into it.
+  // however, don't suppress the throwing behavior for this.
+  function onerror(er) {
+    unpipe();
+    dest.removeListener('error', onerror);
+    if (EE.listenerCount(dest, 'error') === 0)
+      dest.emit('error', er);
+  }
+  // This is a brutally ugly hack to make sure that our error handler
+  // is attached before any userland ones.  NEVER DO THIS.
+  if (!dest._events || !dest._events.error)
+    dest.on('error', onerror);
+  else if (isArray(dest._events.error))
+    dest._events.error.unshift(onerror);
+  else
+    dest._events.error = [onerror, dest._events.error];
+
+
+
+  // Both close and finish should trigger unpipe, but only once.
+  function onclose() {
+    dest.removeListener('finish', onfinish);
+    unpipe();
+  }
+  dest.once('close', onclose);
+  function onfinish() {
+    dest.removeListener('close', onclose);
+    unpipe();
+  }
+  dest.once('finish', onfinish);
+
+  function unpipe() {
+    src.unpipe(dest);
+  }
+
+  // tell the dest that it's being piped to
+  dest.emit('pipe', src);
+
+  // start the flow if it hasn't been started already.
+  if (!state.flowing) {
+    // the handler that waits for readable events after all
+    // the data gets sucked out in flow.
+    // This would be easier to follow with a .once() handler
+    // in flow(), but that is too slow.
+    this.on('readable', pipeOnReadable);
+
+    state.flowing = true;
+    process.nextTick(function() {
+      flow(src);
+    });
+  }
+
+  return dest;
+};
+
+function pipeOnDrain(src) {
+  return function() {
+    var dest = this;
+    var state = src._readableState;
+    state.awaitDrain--;
+    if (state.awaitDrain === 0)
+      flow(src);
+  };
+}
+
+function flow(src) {
+  var state = src._readableState;
+  var chunk;
+  state.awaitDrain = 0;
+
+  function write(dest, i, list) {
+    var written = dest.write(chunk);
+    if (false === written) {
+      state.awaitDrain++;
+    }
+  }
+
+  while (state.pipesCount && null !== (chunk = src.read())) {
+
+    if (state.pipesCount === 1)
+      write(state.pipes, 0, null);
+    else
+      forEach(state.pipes, write);
+
+    src.emit('data', chunk);
+
+    // if anyone needs a drain, then we have to wait for that.
+    if (state.awaitDrain > 0)
+      return;
+  }
+
+  // if every destination was unpiped, either before entering this
+  // function, or in the while loop, then stop flowing.
+  //
+  // NB: This is a pretty rare edge case.
+  if (state.pipesCount === 0) {
+    state.flowing = false;
+
+    // if there were data event listeners added, then switch to old mode.
+    if (EE.listenerCount(src, 'data') > 0)
+      emitDataEvents(src);
+    return;
+  }
+
+  // at this point, no one needed a drain, so we just ran out of data
+  // on the next readable event, start it over again.
+  state.ranOut = true;
+}
+
+function pipeOnReadable() {
+  if (this._readableState.ranOut) {
+    this._readableState.ranOut = false;
+    flow(this);
+  }
+}
+
+
+Readable.prototype.unpipe = function(dest) {
+  var state = this._readableState;
+
+  // if we're not piping anywhere, then do nothing.
+  if (state.pipesCount === 0)
+    return this;
+
+  // just one destination.  most common case.
+  if (state.pipesCount === 1) {
+    // passed in one, but it's not the right one.
+    if (dest && dest !== state.pipes)
+      return this;
+
+    if (!dest)
+      dest = state.pipes;
+
+    // got a match.
+    state.pipes = null;
+    state.pipesCount = 0;
+    this.removeListener('readable', pipeOnReadable);
+    state.flowing = false;
+    if (dest)
+      dest.emit('unpipe', this);
+    return this;
+  }
+
+  // slow case. multiple pipe destinations.
+
+  if (!dest) {
+    // remove all.
+    var dests = state.pipes;
+    var len = state.pipesCount;
+    state.pipes = null;
+    state.pipesCount = 0;
+    this.removeListener('readable', pipeOnReadable);
+    state.flowing = false;
+
+    for (var i = 0; i < len; i++)
+      dests[i].emit('unpipe', this);
+    return this;
+  }
+
+  // try to find the right one.
+  var i = indexOf(state.pipes, dest);
+  if (i === -1)
+    return this;
+
+  state.pipes.splice(i, 1);
+  state.pipesCount -= 1;
+  if (state.pipesCount === 1)
+    state.pipes = state.pipes[0];
+
+  dest.emit('unpipe', this);
+
+  return this;
+};
+
+// set up data events if they are asked for
+// Ensure readable listeners eventually get something
+Readable.prototype.on = function(ev, fn) {
+  var res = Stream.prototype.on.call(this, ev, fn);
+
+  if (ev === 'data' && !this._readableState.flowing)
+    emitDataEvents(this);
+
+  if (ev === 'readable' && this.readable) {
+    var state = this._readableState;
+    if (!state.readableListening) {
+      state.readableListening = true;
+      state.emittedReadable = false;
+      state.needReadable = true;
+      if (!state.reading) {
+        this.read(0);
+      } else if (state.length) {
+        emitReadable(this, state);
+      }
+    }
+  }
+
+  return res;
+};
+Readable.prototype.addListener = Readable.prototype.on;
+
+// pause() and resume() are remnants of the legacy readable stream API
+// If the user uses them, then switch into old mode.
+Readable.prototype.resume = function() {
+  emitDataEvents(this);
+  this.read(0);
+  this.emit('resume');
+};
+
+Readable.prototype.pause = function() {
+  emitDataEvents(this, true);
+  this.emit('pause');
+};
+
+function emitDataEvents(stream, startPaused) {
+  var state = stream._readableState;
+
+  if (state.flowing) {
+    // https://github.com/isaacs/readable-stream/issues/16
+    throw new Error('Cannot switch to old mode now.');
+  }
+
+  var paused = startPaused || false;
+  var readable = false;
+
+  // convert to an old-style stream.
+  stream.readable = true;
+  stream.pipe = Stream.prototype.pipe;
+  stream.on = stream.addListener = Stream.prototype.on;
+
+  stream.on('readable', function() {
+    readable = true;
+
+    var c;
+    while (!paused && (null !== (c = stream.read())))
+      stream.emit('data', c);
+
+    if (c === null) {
+      readable = false;
+      stream._readableState.needReadable = true;
+    }
+  });
+
+  stream.pause = function() {
+    paused = true;
+    this.emit('pause');
+  };
+
+  stream.resume = function() {
+    paused = false;
+    if (readable)
+      process.nextTick(function() {
+        stream.emit('readable');
+      });
+    else
+      this.read(0);
+    this.emit('resume');
+  };
+
+  // now make it start, just in case it hadn't already.
+  stream.emit('readable');
+}
+
+// wrap an old-style stream as the async data source.
+// This is *not* part of the readable stream interface.
+// It is an ugly unfortunate mess of history.
+Readable.prototype.wrap = function(stream) {
+  var state = this._readableState;
+  var paused = false;
+
+  var self = this;
+  stream.on('end', function() {
+    if (state.decoder && !state.ended) {
+      var chunk = state.decoder.end();
+      if (chunk && chunk.length)
+        self.push(chunk);
+    }
+
+    self.push(null);
+  });
+
+  stream.on('data', function(chunk) {
+    if (state.decoder)
+      chunk = state.decoder.write(chunk);
+
+    // don't skip over falsy values in objectMode
+    //if (state.objectMode && util.isNullOrUndefined(chunk))
+    if (state.objectMode && (chunk === null || chunk === undefined))
+      return;
+    else if (!state.objectMode && (!chunk || !chunk.length))
+      return;
+
+    var ret = self.push(chunk);
+    if (!ret) {
+      paused = true;
+      stream.pause();
+    }
+  });
+
+  // proxy all the other methods.
+  // important when wrapping filters and duplexes.
+  for (var i in stream) {
+    if (typeof stream[i] === 'function' &&
+        typeof this[i] === 'undefined') {
+      this[i] = function(method) { return function() {
+        return stream[method].apply(stream, arguments);
+      }}(i);
+    }
+  }
+
+  // proxy certain important events.
+  var events = ['error', 'close', 'destroy', 'pause', 'resume'];
+  forEach(events, function(ev) {
+    stream.on(ev, self.emit.bind(self, ev));
+  });
+
+  // when we try to consume some more bytes, simply unpause the
+  // underlying stream.
+  self._read = function(n) {
+    if (paused) {
+      paused = false;
+      stream.resume();
+    }
+  };
+
+  return self;
+};
+
+
+
+// exposed for testing purposes only.
+Readable._fromList = fromList;
+
+// Pluck off n bytes from an array of buffers.
+// Length is the combined lengths of all the buffers in the list.
+function fromList(n, state) {
+  var list = state.buffer;
+  var length = state.length;
+  var stringMode = !!state.decoder;
+  var objectMode = !!state.objectMode;
+  var ret;
+
+  // nothing in the list, definitely empty.
+  if (list.length === 0)
+    return null;
+
+  if (length === 0)
+    ret = null;
+  else if (objectMode)
+    ret = list.shift();
+  else if (!n || n >= length) {
+    // read it all, truncate the array.
+    if (stringMode)
+      ret = list.join('');
+    else
+      ret = Buffer.concat(list, length);
+    list.length = 0;
+  } else {
+    // read just some of it.
+    if (n < list[0].length) {
+      // just take a part of the first list item.
+      // slice is the same for buffers and strings.
+      var buf = list[0];
+      ret = buf.slice(0, n);
+      list[0] = buf.slice(n);
+    } else if (n === list[0].length) {
+      // first list is a perfect match
+      ret = list.shift();
+    } else {
+      // complex case.
+      // we have enough to cover it, but it spans past the first buffer.
+      if (stringMode)
+        ret = '';
+      else
+        ret = new Buffer(n);
+
+      var c = 0;
+      for (var i = 0, l = list.length; i < l && c < n; i++) {
+        var buf = list[0];
+        var cpy = Math.min(n - c, buf.length);
+
+        if (stringMode)
+          ret += buf.slice(0, cpy);
+        else
+          buf.copy(ret, c, 0, cpy);
+
+        if (cpy < buf.length)
+          list[0] = buf.slice(cpy);
+        else
+          list.shift();
+
+        c += cpy;
+      }
+    }
+  }
+
+  return ret;
+}
+
+function endReadable(stream) {
+  var state = stream._readableState;
+
+  // If we get here before consuming all the bytes, then that is a
+  // bug in node.  Should never happen.
+  if (state.length > 0)
+    throw new Error('endReadable called on non-empty stream');
+
+  if (!state.endEmitted && state.calledRead) {
+    state.ended = true;
+    process.nextTick(function() {
+      // Check that we didn't get one last unshift.
+      if (!state.endEmitted && state.length === 0) {
+        state.endEmitted = true;
+        stream.readable = false;
+        stream.emit('end');
+      }
+    });
+  }
+}
+
+function forEach (xs, f) {
+  for (var i = 0, l = xs.length; i < l; i++) {
+    f(xs[i], i);
+  }
+}
+
+function indexOf (xs, x) {
+  for (var i = 0, l = xs.length; i < l; i++) {
+    if (xs[i] === x) return i;
+  }
+  return -1;
+}
+
+}).call(this,require('_process'))
+},{"_process":10,"buffer":3,"core-util-is":17,"events":7,"inherits":8,"isarray":9,"stream":22,"string_decoder/":23}],15:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+// a transform stream is a readable/writable stream where you do
+// something with the data.  Sometimes it's called a "filter",
+// but that's not a great name for it, since that implies a thing where
+// some bits pass through, and others are simply ignored.  (That would
+// be a valid example of a transform, of course.)
+//
+// While the output is causally related to the input, it's not a
+// necessarily symmetric or synchronous transformation.  For example,
+// a zlib stream might take multiple plain-text writes(), and then
+// emit a single compressed chunk some time in the future.
+//
+// Here's how this works:
+//
+// The Transform stream has all the aspects of the readable and writable
+// stream classes.  When you write(chunk), that calls _write(chunk,cb)
+// internally, and returns false if there's a lot of pending writes
+// buffered up.  When you call read(), that calls _read(n) until
+// there's enough pending readable data buffered up.
+//
+// In a transform stream, the written data is placed in a buffer.  When
+// _read(n) is called, it transforms the queued up data, calling the
+// buffered _write cb's as it consumes chunks.  If consuming a single
+// written chunk would result in multiple output chunks, then the first
+// outputted bit calls the readcb, and subsequent chunks just go into
+// the read buffer, and will cause it to emit 'readable' if necessary.
+//
+// This way, back-pressure is actually determined by the reading side,
+// since _read has to be called to start processing a new chunk.  However,
+// a pathological inflate type of transform can cause excessive buffering
+// here.  For example, imagine a stream where every byte of input is
+// interpreted as an integer from 0-255, and then results in that many
+// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
+// 1kb of data being output.  In this case, you could write a very small
+// amount of input, and end up with a very large amount of output.  In
+// such a pathological inflating mechanism, there'd be no way to tell
+// the system to stop doing the transform.  A single 4MB write could
+// cause the system to run out of memory.
+//
+// However, even in such a pathological case, only a single written chunk
+// would be consumed, and then the rest would wait (un-transformed) until
+// the results of the previous transformed chunk were consumed.
+
+module.exports = Transform;
+
+var Duplex = require('./_stream_duplex');
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+util.inherits(Transform, Duplex);
+
+
+function TransformState(options, stream) {
+  this.afterTransform = function(er, data) {
+    return afterTransform(stream, er, data);
+  };
+
+  this.needTransform = false;
+  this.transforming = false;
+  this.writecb = null;
+  this.writechunk = null;
+}
+
+function afterTransform(stream, er, data) {
+  var ts = stream._transformState;
+  ts.transforming = false;
+
+  var cb = ts.writecb;
+
+  if (!cb)
+    return stream.emit('error', new Error('no writecb in Transform class'));
+
+  ts.writechunk = null;
+  ts.writecb = null;
+
+  if (data !== null && data !== undefined)
+    stream.push(data);
+
+  if (cb)
+    cb(er);
+
+  var rs = stream._readableState;
+  rs.reading = false;
+  if (rs.needReadable || rs.length < rs.highWaterMark) {
+    stream._read(rs.highWaterMark);
+  }
+}
+
+
+function Transform(options) {
+  if (!(this instanceof Transform))
+    return new Transform(options);
+
+  Duplex.call(this, options);
+
+  var ts = this._transformState = new TransformState(options, this);
+
+  // when the writable side finishes, then flush out anything remaining.
+  var stream = this;
+
+  // start out asking for a readable event once data is transformed.
+  this._readableState.needReadable = true;
+
+  // we have implemented the _read method, and done the other things
+  // that Readable wants before the first _read call, so unset the
+  // sync guard flag.
+  this._readableState.sync = false;
+
+  this.once('finish', function() {
+    if ('function' === typeof this._flush)
+      this._flush(function(er) {
+        done(stream, er);
+      });
+    else
+      done(stream);
+  });
+}
+
+Transform.prototype.push = function(chunk, encoding) {
+  this._transformState.needTransform = false;
+  return Duplex.prototype.push.call(this, chunk, encoding);
+};
+
+// This is the part where you do stuff!
+// override this function in implementation classes.
+// 'chunk' is an input chunk.
+//
+// Call `push(newChunk)` to pass along transformed output
+// to the readable side.  You may call 'push' zero or more times.
+//
+// Call `cb(err)` when you are done with this chunk.  If you pass
+// an error, then that'll put the hurt on the whole operation.  If you
+// never call cb(), then you'll never get another chunk.
+Transform.prototype._transform = function(chunk, encoding, cb) {
+  throw new Error('not implemented');
+};
+
+Transform.prototype._write = function(chunk, encoding, cb) {
+  var ts = this._transformState;
+  ts.writecb = cb;
+  ts.writechunk = chunk;
+  ts.writeencoding = encoding;
+  if (!ts.transforming) {
+    var rs = this._readableState;
+    if (ts.needTransform ||
+        rs.needReadable ||
+        rs.length < rs.highWaterMark)
+      this._read(rs.highWaterMark);
+  }
+};
+
+// Doesn't matter what the args are here.
+// _transform does all the work.
+// That we got here means that the readable side wants more data.
+Transform.prototype._read = function(n) {
+  var ts = this._transformState;
+
+  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
+    ts.transforming = true;
+    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+  } else {
+    // mark that we need a transform, so that any data that comes in
+    // will get processed, now that we've asked for it.
+    ts.needTransform = true;
+  }
+};
+
+
+function done(stream, er) {
+  if (er)
+    return stream.emit('error', er);
+
+  // if there's nothing in the write buffer, then that means
+  // that nothing more will ever be provided
+  var ws = stream._writableState;
+  var rs = stream._readableState;
+  var ts = stream._transformState;
+
+  if (ws.length)
+    throw new Error('calling transform done when ws.length != 0');
+
+  if (ts.transforming)
+    throw new Error('calling transform done when still transforming');
+
+  return stream.push(null);
+}
+
+},{"./_stream_duplex":12,"core-util-is":17,"inherits":8}],16:[function(require,module,exports){
+(function (process){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// A bit simpler than readable streams.
+// Implement an async ._write(chunk, cb), and it'll handle all
+// the drain event emission and buffering.
+
+module.exports = Writable;
+
+/*<replacement>*/
+var Buffer = require('buffer').Buffer;
+/*</replacement>*/
+
+Writable.WritableState = WritableState;
+
+
+/*<replacement>*/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/*</replacement>*/
+
+var Stream = require('stream');
+
+util.inherits(Writable, Stream);
+
+function WriteReq(chunk, encoding, cb) {
+  this.chunk = chunk;
+  this.encoding = encoding;
+  this.callback = cb;
+}
+
+function WritableState(options, stream) {
+  options = options || {};
+
+  // the point at which write() starts returning false
+  // Note: 0 is a valid value, means that we always return false if
+  // the entire buffer is not flushed immediately on write()
+  var hwm = options.highWaterMark;
+  this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024;
+
+  // object stream flag to indicate whether or not this stream
+  // contains buffers or objects.
+  this.objectMode = !!options.objectMode;
+
+  // cast to ints.
+  this.highWaterMark = ~~this.highWaterMark;
+
+  this.needDrain = false;
+  // at the start of calling end()
+  this.ending = false;
+  // when end() has been called, and returned
+  this.ended = false;
+  // when 'finish' is emitted
+  this.finished = false;
+
+  // should we decode strings into buffers before passing to _write?
+  // this is here so that some node-core streams can optimize string
+  // handling at a lower level.
+  var noDecode = options.decodeStrings === false;
+  this.decodeStrings = !noDecode;
+
+  // Crypto is kind of old and crusty.  Historically, its default string
+  // encoding is 'binary' so we have to make this configurable.
+  // Everything else in the universe uses 'utf8', though.
+  this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+  // not an actual buffer we keep track of, but a measurement
+  // of how much we're waiting to get pushed to some underlying
+  // socket or file.
+  this.length = 0;
+
+  // a flag to see when we're in the middle of a write.
+  this.writing = false;
+
+  // a flag to be able to tell if the onwrite cb is called immediately,
+  // or on a later tick.  We set this to true at first, becuase any
+  // actions that shouldn't happen until "later" should generally also
+  // not happen before the first write call.
+  this.sync = true;
+
+  // a flag to know if we're processing previously buffered items, which
+  // may call the _write() callback in the same tick, so that we don't
+  // end up in an overlapped onwrite situation.
+  this.bufferProcessing = false;
+
+  // the callback that's passed to _write(chunk,cb)
+  this.onwrite = function(er) {
+    onwrite(stream, er);
+  };
+
+  // the callback that the user supplies to write(chunk,encoding,cb)
+  this.writecb = null;
+
+  // the amount that is being written when _write is called.
+  this.writelen = 0;
+
+  this.buffer = [];
+
+  // True if the error was already emitted and should not be thrown again
+  this.errorEmitted = false;
+}
+
+function Writable(options) {
+  var Duplex = require('./_stream_duplex');
+
+  // Writable ctor is applied to Duplexes, though they're not
+  // instanceof Writable, they're instanceof Readable.
+  if (!(this instanceof Writable) && !(this instanceof Duplex))
+    return new Writable(options);
+
+  this._writableState = new WritableState(options, this);
+
+  // legacy.
+  this.writable = true;
+
+  Stream.call(this);
+}
+
+// Otherwise people can pipe Writable streams, which is just wrong.
+Writable.prototype.pipe = function() {
+  this.emit('error', new Error('Cannot pipe. Not readable.'));
+};
+
+
+function writeAfterEnd(stream, state, cb) {
+  var er = new Error('write after end');
+  // TODO: defer error events consistently everywhere, not just the cb
+  stream.emit('error', er);
+  process.nextTick(function() {
+    cb(er);
+  });
+}
+
+// If we get something that is not a buffer, string, null, or undefined,
+// and we're not in objectMode, then that's an error.
+// Otherwise stream chunks are all considered to be of length=1, and the
+// watermarks determine how many objects to keep in the buffer, rather than
+// how many bytes or characters.
+function validChunk(stream, state, chunk, cb) {
+  var valid = true;
+  if (!Buffer.isBuffer(chunk) &&
+      'string' !== typeof chunk &&
+      chunk !== null &&
+      chunk !== undefined &&
+      !state.objectMode) {
+    var er = new TypeError('Invalid non-string/buffer chunk');
+    stream.emit('error', er);
+    process.nextTick(function() {
+      cb(er);
+    });
+    valid = false;
+  }
+  return valid;
+}
+
+Writable.prototype.write = function(chunk, encoding, cb) {
+  var state = this._writableState;
+  var ret = false;
+
+  if (typeof encoding === 'function') {
+    cb = encoding;
+    encoding = null;
+  }
+
+  if (Buffer.isBuffer(chunk))
+    encoding = 'buffer';
+  else if (!encoding)
+    encoding = state.defaultEncoding;
+
+  if (typeof cb !== 'function')
+    cb = function() {};
+
+  if (state.ended)
+    writeAfterEnd(this, state, cb);
+  else if (validChunk(this, state, chunk, cb))
+    ret = writeOrBuffer(this, state, chunk, encoding, cb);
+
+  return ret;
+};
+
+function decodeChunk(state, chunk, encoding) {
+  if (!state.objectMode &&
+      state.decodeStrings !== false &&
+      typeof chunk === 'string') {
+    chunk = new Buffer(chunk, encoding);
+  }
+  return chunk;
+}
+
+// if we're already writing something, then just put this
+// in the queue, and wait our turn.  Otherwise, call _write
+// If we return false, then we need a drain event, so set that flag.
+function writeOrBuffer(stream, state, chunk, encoding, cb) {
+  chunk = decodeChunk(state, chunk, encoding);
+  if (Buffer.isBuffer(chunk))
+    encoding = 'buffer';
+  var len = state.objectMode ? 1 : chunk.length;
+
+  state.length += len;
+
+  var ret = state.length < state.highWaterMark;
+  // we must ensure that previous needDrain will not be reset to false.
+  if (!ret)
+    state.needDrain = true;
+
+  if (state.writing)
+    state.buffer.push(new WriteReq(chunk, encoding, cb));
+  else
+    doWrite(stream, state, len, chunk, encoding, cb);
+
+  return ret;
+}
+
+function doWrite(stream, state, len, chunk, encoding, cb) {
+  state.writelen = len;
+  state.writecb = cb;
+  state.writing = true;
+  state.sync = true;
+  stream._write(chunk, encoding, state.onwrite);
+  state.sync = false;
+}
+
+function onwriteError(stream, state, sync, er, cb) {
+  if (sync)
+    process.nextTick(function() {
+      cb(er);
+    });
+  else
+    cb(er);
+
+  stream._writableState.errorEmitted = true;
+  stream.emit('error', er);
+}
+
+function onwriteStateUpdate(state) {
+  state.writing = false;
+  state.writecb = null;
+  state.length -= state.writelen;
+  state.writelen = 0;
+}
+
+function onwrite(stream, er) {
+  var state = stream._writableState;
+  var sync = state.sync;
+  var cb = state.writecb;
+
+  onwriteStateUpdate(state);
+
+  if (er)
+    onwriteError(stream, state, sync, er, cb);
+  else {
+    // Check if we're actually ready to finish, but don't emit yet
+    var finished = needFinish(stream, state);
+
+    if (!finished && !state.bufferProcessing && state.buffer.length)
+      clearBuffer(stream, state);
+
+    if (sync) {
+      process.nextTick(function() {
+        afterWrite(stream, state, finished, cb);
+      });
+    } else {
+      afterWrite(stream, state, finished, cb);
+    }
+  }
+}
+
+function afterWrite(stream, state, finished, cb) {
+  if (!finished)
+    onwriteDrain(stream, state);
+  cb();
+  if (finished)
+    finishMaybe(stream, state);
+}
+
+// Must force callback to be called on nextTick, so that we don't
+// emit 'drain' before the write() consumer gets the 'false' return
+// value, and has a chance to attach a 'drain' listener.
+function onwriteDrain(stream, state) {
+  if (state.length === 0 && state.needDrain) {
+    state.needDrain = false;
+    stream.emit('drain');
+  }
+}
+
+
+// if there's something in the buffer waiting, then process it
+function clearBuffer(stream, state) {
+  state.bufferProcessing = true;
+
+  for (var c = 0; c < state.buffer.length; c++) {
+    var entry = state.buffer[c];
+    var chunk = entry.chunk;
+    var encoding = entry.encoding;
+    var cb = entry.callback;
+    var len = state.objectMode ? 1 : chunk.length;
+
+    doWrite(stream, state, len, chunk, encoding, cb);
+
+    // if we didn't call the onwrite immediately, then
+    // it means that we need to wait until it does.
+    // also, that means that the chunk and cb are currently
+    // being processed, so move the buffer counter past them.
+    if (state.writing) {
+      c++;
+      break;
+    }
+  }
+
+  state.bufferProcessing = false;
+  if (c < state.buffer.length)
+    state.buffer = state.buffer.slice(c);
+  else
+    state.buffer.length = 0;
+}
+
+Writable.prototype._write = function(chunk, encoding, cb) {
+  cb(new Error('not implemented'));
+};
+
+Writable.prototype.end = function(chunk, encoding, cb) {
+  var state = this._writableState;
+
+  if (typeof chunk === 'function') {
+    cb = chunk;
+    chunk = null;
+    encoding = null;
+  } else if (typeof encoding === 'function') {
+    cb = encoding;
+    encoding = null;
+  }
+
+  if (typeof chunk !== 'undefined' && chunk !== null)
+    this.write(chunk, encoding);
+
+  // ignore unnecessary end() calls.
+  if (!state.ending && !state.finished)
+    endWritable(this, state, cb);
+};
+
+
+function needFinish(stream, state) {
+  return (state.ending &&
+          state.length === 0 &&
+          !state.finished &&
+          !state.writing);
+}
+
+function finishMaybe(stream, state) {
+  var need = needFinish(stream, state);
+  if (need) {
+    state.finished = true;
+    stream.emit('finish');
+  }
+  return need;
+}
+
+function endWritable(stream, state, cb) {
+  state.ending = true;
+  finishMaybe(stream, state);
+  if (cb) {
+    if (state.finished)
+      process.nextTick(cb);
+    else
+      stream.once('finish', cb);
+  }
+  state.ended = true;
+}
+
+}).call(this,require('_process'))
+},{"./_stream_duplex":12,"_process":10,"buffer":3,"core-util-is":17,"inherits":8,"stream":22}],17:[function(require,module,exports){
+(function (Buffer){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+function isArray(ar) {
+  return Array.isArray(ar);
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+  return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+  return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+  return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+  return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+  return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+  return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+  return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+  return isObject(re) && objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+  return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+  return isObject(d) && objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+  return isObject(e) &&
+      (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+  return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+  return arg === null ||
+         typeof arg === 'boolean' ||
+         typeof arg === 'number' ||
+         typeof arg === 'string' ||
+         typeof arg === 'symbol' ||  // ES6 symbol
+         typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+function isBuffer(arg) {
+  return Buffer.isBuffer(arg);
+}
+exports.isBuffer = isBuffer;
+
+function objectToString(o) {
+  return Object.prototype.toString.call(o);
+}
+}).call(this,require("buffer").Buffer)
+},{"buffer":3}],18:[function(require,module,exports){
+module.exports = require("./lib/_stream_passthrough.js")
+
+},{"./lib/_stream_passthrough.js":13}],19:[function(require,module,exports){
+var Stream = require('stream'); // hack to fix a circular dependency issue when used with browserify
+exports = module.exports = require('./lib/_stream_readable.js');
+exports.Stream = Stream;
+exports.Readable = exports;
+exports.Writable = require('./lib/_stream_writable.js');
+exports.Duplex = require('./lib/_stream_duplex.js');
+exports.Transform = require('./lib/_stream_transform.js');
+exports.PassThrough = require('./lib/_stream_passthrough.js');
+
+},{"./lib/_stream_duplex.js":12,"./lib/_stream_passthrough.js":13,"./lib/_stream_readable.js":14,"./lib/_stream_transform.js":15,"./lib/_stream_writable.js":16,"stream":22}],20:[function(require,module,exports){
+module.exports = require("./lib/_stream_transform.js")
+
+},{"./lib/_stream_transform.js":15}],21:[function(require,module,exports){
+module.exports = require("./lib/_stream_writable.js")
+
+},{"./lib/_stream_writable.js":16}],22:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+module.exports = Stream;
+
+var EE = require('events').EventEmitter;
+var inherits = require('inherits');
+
+inherits(Stream, EE);
+Stream.Readable = require('readable-stream/readable.js');
+Stream.Writable = require('readable-stream/writable.js');
+Stream.Duplex = require('readable-stream/duplex.js');
+Stream.Transform = require('readable-stream/transform.js');
+Stream.PassThrough = require('readable-stream/passthrough.js');
+
+// Backwards-compat with node 0.4.x
+Stream.Stream = Stream;
+
+
+
+// old-style streams.  Note that the pipe method (the only relevant
+// part of this class) is overridden in the Readable class.
+
+function Stream() {
+  EE.call(this);
+}
+
+Stream.prototype.pipe = function(dest, options) {
+  var source = this;
+
+  function ondata(chunk) {
+    if (dest.writable) {
+      if (false === dest.write(chunk) && source.pause) {
+        source.pause();
+      }
+    }
+  }
+
+  source.on('data', ondata);
+
+  function ondrain() {
+    if (source.readable && source.resume) {
+      source.resume();
+    }
+  }
+
+  dest.on('drain', ondrain);
+
+  // If the 'end' option is not supplied, dest.end() will be called when
+  // source gets the 'end' or 'close' events.  Only dest.end() once.
+  if (!dest._isStdio && (!options || options.end !== false)) {
+    source.on('end', onend);
+    source.on('close', onclose);
+  }
+
+  var didOnEnd = false;
+  function onend() {
+    if (didOnEnd) return;
+    didOnEnd = true;
+
+    dest.end();
+  }
+
+
+  function onclose() {
+    if (didOnEnd) return;
+    didOnEnd = true;
+
+    if (typeof dest.destroy === 'function') dest.destroy();
+  }
+
+  // don't leave dangling pipes when there are errors.
+  function onerror(er) {
+    cleanup();
+    if (EE.listenerCount(this, 'error') === 0) {
+      throw er; // Unhandled stream error in pipe.
+    }
+  }
+
+  source.on('error', onerror);
+  dest.on('error', onerror);
+
+  // remove all the event listeners that were added.
+  function cleanup() {
+    source.removeListener('data', ondata);
+    dest.removeListener('drain', ondrain);
+
+    source.removeListener('end', onend);
+    source.removeListener('close', onclose);
+
+    source.removeListener('error', onerror);
+    dest.removeListener('error', onerror);
+
+    source.removeListener('end', cleanup);
+    source.removeListener('close', cleanup);
+
+    dest.removeListener('close', cleanup);
+  }
+
+  source.on('end', cleanup);
+  source.on('close', cleanup);
+
+  dest.on('close', cleanup);
+
+  dest.emit('pipe', source);
+
+  // Allow for unix-like usage: A.pipe(B).pipe(C)
+  return dest;
+};
+
+},{"events":7,"inherits":8,"readable-stream/duplex.js":11,"readable-stream/passthrough.js":18,"readable-stream/readable.js":19,"readable-stream/transform.js":20,"readable-stream/writable.js":21}],23:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var Buffer = require('buffer').Buffer;
+
+var isBufferEncoding = Buffer.isEncoding
+  || function(encoding) {
+       switch (encoding && encoding.toLowerCase()) {
+         case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;
+         default: return false;
+       }
+     }
+
+
+function assertEncoding(encoding) {
+  if (encoding && !isBufferEncoding(encoding)) {
+    throw new Error('Unknown encoding: ' + encoding);
+  }
+}
+
+// StringDecoder provides an interface for efficiently splitting a series of
+// buffers into a series of JS strings without breaking apart multi-byte
+// characters. CESU-8 is handled as part of the UTF-8 encoding.
+//
+// @TODO Handling all encodings inside a single object makes it very difficult
+// to reason about this code, so it should be split up in the future.
+// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
+// points as used by CESU-8.
+var StringDecoder = exports.StringDecoder = function(encoding) {
+  this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
+  assertEncoding(encoding);
+  switch (this.encoding) {
+    case 'utf8':
+      // CESU-8 represents each of Surrogate Pair by 3-bytes
+      this.surrogateSize = 3;
+      break;
+    case 'ucs2':
+    case 'utf16le':
+      // UTF-16 represents each of Surrogate Pair by 2-bytes
+      this.surrogateSize = 2;
+      this.detectIncompleteChar = utf16DetectIncompleteChar;
+      break;
+    case 'base64':
+      // Base-64 stores 3 bytes in 4 chars, and pads the remainder.
+      this.surrogateSize = 3;
+      this.detectIncompleteChar = base64DetectIncompleteChar;
+      break;
+    default:
+      this.write = passThroughWrite;
+      return;
+  }
+
+  // Enough space to store all bytes of a single character. UTF-8 needs 4
+  // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
+  this.charBuffer = new Buffer(6);
+  // Number of bytes received for the current incomplete multi-byte character.
+  this.charReceived = 0;
+  // Number of bytes expected for the current incomplete multi-byte character.
+  this.charLength = 0;
+};
+
+
+// write decodes the given buffer and returns it as JS string that is
+// guaranteed to not contain any partial multi-byte characters. Any partial
+// character found at the end of the buffer is buffered up, and will be
+// returned when calling write again with the remaining bytes.
+//
+// Note: Converting a Buffer containing an orphan surrogate to a String
+// currently works, but converting a String to a Buffer (via `new Buffer`, or
+// Buffer#write) will replace incomplete surrogates with the unicode
+// replacement character. See https://codereview.chromium.org/121173009/ .
+StringDecoder.prototype.write = function(buffer) {
+  var charStr = '';
+  // if our last write ended with an incomplete multibyte character
+  while (this.charLength) {
+    // determine how many remaining bytes this buffer has to offer for this char
+    var available = (buffer.length >= this.charLength - this.charReceived) ?
+        this.charLength - this.charReceived :
+        buffer.length;
+
+    // add the new bytes to the char buffer
+    buffer.copy(this.charBuffer, this.charReceived, 0, available);
+    this.charReceived += available;
+
+    if (this.charReceived < this.charLength) {
+      // still not enough chars in this buffer? wait for more ...
+      return '';
+    }
+
+    // remove bytes belonging to the current character from the buffer
+    buffer = buffer.slice(available, buffer.length);
+
+    // get the character that was split
+    charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
+
+    // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
+    var charCode = charStr.charCodeAt(charStr.length - 1);
+    if (charCode >= 0xD800 && charCode <= 0xDBFF) {
+      this.charLength += this.surrogateSize;
+      charStr = '';
+      continue;
+    }
+    this.charReceived = this.charLength = 0;
+
+    // if there are no more bytes in this buffer, just emit our char
+    if (buffer.length === 0) {
+      return charStr;
+    }
+    break;
+  }
+
+  // determine and set charLength / charReceived
+  this.detectIncompleteChar(buffer);
+
+  var end = buffer.length;
+  if (this.charLength) {
+    // buffer the incomplete character bytes we got
+    buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
+    end -= this.charReceived;
+  }
+
+  charStr += buffer.toString(this.encoding, 0, end);
+
+  var end = charStr.length - 1;
+  var charCode = charStr.charCodeAt(end);
+  // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
+  if (charCode >= 0xD800 && charCode <= 0xDBFF) {
+    var size = this.surrogateSize;
+    this.charLength += size;
+    this.charReceived += size;
+    this.charBuffer.copy(this.charBuffer, size, 0, size);
+    buffer.copy(this.charBuffer, 0, 0, size);
+    return charStr.substring(0, end);
+  }
+
+  // or just emit the charStr
+  return charStr;
+};
+
+// detectIncompleteChar determines if there is an incomplete UTF-8 character at
+// the end of the given buffer. If so, it sets this.charLength to the byte
+// length that character, and sets this.charReceived to the number of bytes
+// that are available for this character.
+StringDecoder.prototype.detectIncompleteChar = function(buffer) {
+  // determine how many bytes we have to check at the end of this buffer
+  var i = (buffer.length >= 3) ? 3 : buffer.length;
+
+  // Figure out if one of the last i bytes of our buffer announces an
+  // incomplete char.
+  for (; i > 0; i--) {
+    var c = buffer[buffer.length - i];
+
+    // See http://en.wikipedia.org/wiki/UTF-8#Description
+
+    // 110XXXXX
+    if (i == 1 && c >> 5 == 0x06) {
+      this.charLength = 2;
+      break;
+    }
+
+    // 1110XXXX
+    if (i <= 2 && c >> 4 == 0x0E) {
+      this.charLength = 3;
+      break;
+    }
+
+    // 11110XXX
+    if (i <= 3 && c >> 3 == 0x1E) {
+      this.charLength = 4;
+      break;
+    }
+  }
+  this.charReceived = i;
+};
+
+StringDecoder.prototype.end = function(buffer) {
+  var res = '';
+  if (buffer && buffer.length)
+    res = this.write(buffer);
+
+  if (this.charReceived) {
+    var cr = this.charReceived;
+    var buf = this.charBuffer;
+    var enc = this.encoding;
+    res += buf.slice(0, cr).toString(enc);
+  }
+
+  return res;
+};
+
+function passThroughWrite(buffer) {
+  return buffer.toString(this.encoding);
+}
+
+function utf16DetectIncompleteChar(buffer) {
+  this.charReceived = buffer.length % 2;
+  this.charLength = this.charReceived ? 2 : 0;
+}
+
+function base64DetectIncompleteChar(buffer) {
+  this.charReceived = buffer.length % 3;
+  this.charLength = this.charReceived ? 3 : 0;
+}
+
+},{"buffer":3}],24:[function(require,module,exports){
+module.exports = function isBuffer(arg) {
+  return arg && typeof arg === 'object'
+    && typeof arg.copy === 'function'
+    && typeof arg.fill === 'function'
+    && typeof arg.readUInt8 === 'function';
+}
+},{}],25:[function(require,module,exports){
+(function (process,global){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var formatRegExp = /%[sdj%]/g;
+exports.format = function(f) {
+  if (!isString(f)) {
+    var objects = [];
+    for (var i = 0; i < arguments.length; i++) {
+      objects.push(inspect(arguments[i]));
+    }
+    return objects.join(' ');
+  }
+
+  var i = 1;
+  var args = arguments;
+  var len = args.length;
+  var str = String(f).replace(formatRegExp, function(x) {
+    if (x === '%%') return '%';
+    if (i >= len) return x;
+    switch (x) {
+      case '%s': return String(args[i++]);
+      case '%d': return Number(args[i++]);
+      case '%j':
+        try {
+          return JSON.stringify(args[i++]);
+        } catch (_) {
+          return '[Circular]';
+        }
+      default:
+        return x;
+    }
+  });
+  for (var x = args[i]; i < len; x = args[++i]) {
+    if (isNull(x) || !isObject(x)) {
+      str += ' ' + x;
+    } else {
+      str += ' ' + inspect(x);
+    }
+  }
+  return str;
+};
+
+
+// Mark that a method should not be used.
+// Returns a modified function which warns once by default.
+// If --no-deprecation is set, then it is a no-op.
+exports.deprecate = function(fn, msg) {
+  // Allow for deprecating things in the process of starting up.
+  if (isUndefined(global.process)) {
+    return function() {
+      return exports.deprecate(fn, msg).apply(this, arguments);
+    };
+  }
+
+  if (process.noDeprecation === true) {
+    return fn;
+  }
+
+  var warned = false;
+  function deprecated() {
+    if (!warned) {
+      if (process.throwDeprecation) {
+        throw new Error(msg);
+      } else if (process.traceDeprecation) {
+        console.trace(msg);
+      } else {
+        console.error(msg);
+      }
+      warned = true;
+    }
+    return fn.apply(this, arguments);
+  }
+
+  return deprecated;
+};
+
+
+var debugs = {};
+var debugEnviron;
+exports.debuglog = function(set) {
+  if (isUndefined(debugEnviron))
+    debugEnviron = process.env.NODE_DEBUG || '';
+  set = set.toUpperCase();
+  if (!debugs[set]) {
+    if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
+      var pid = process.pid;
+      debugs[set] = function() {
+        var msg = exports.format.apply(exports, arguments);
+        console.error('%s %d: %s', set, pid, msg);
+      };
+    } else {
+      debugs[set] = function() {};
+    }
+  }
+  return debugs[set];
+};
+
+
+/**
+ * Echos the value of a value. Trys to print the value out
+ * in the best way possible given the different types.
+ *
+ * @param {Object} obj The object to print out.
+ * @param {Object} opts Optional options object that alters the output.
+ */
+/* legacy: obj, showHidden, depth, colors*/
+function inspect(obj, opts) {
+  // default options
+  var ctx = {
+    seen: [],
+    stylize: stylizeNoColor
+  };
+  // legacy...
+  if (arguments.length >= 3) ctx.depth = arguments[2];
+  if (arguments.length >= 4) ctx.colors = arguments[3];
+  if (isBoolean(opts)) {
+    // legacy...
+    ctx.showHidden = opts;
+  } else if (opts) {
+    // got an "options" object
+    exports._extend(ctx, opts);
+  }
+  // set default options
+  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
+  if (isUndefined(ctx.depth)) ctx.depth = 2;
+  if (isUndefined(ctx.colors)) ctx.colors = false;
+  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
+  if (ctx.colors) ctx.stylize = stylizeWithColor;
+  return formatValue(ctx, obj, ctx.depth);
+}
+exports.inspect = inspect;
+
+
+// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+inspect.colors = {
+  'bold' : [1, 22],
+  'italic' : [3, 23],
+  'underline' : [4, 24],
+  'inverse' : [7, 27],
+  'white' : [37, 39],
+  'grey' : [90, 39],
+  'black' : [30, 39],
+  'blue' : [34, 39],
+  'cyan' : [36, 39],
+  'green' : [32, 39],
+  'magenta' : [35, 39],
+  'red' : [31, 39],
+  'yellow' : [33, 39]
+};
+
+// Don't use 'blue' not visible on cmd.exe
+inspect.styles = {
+  'special': 'cyan',
+  'number': 'yellow',
+  'boolean': 'yellow',
+  'undefined': 'grey',
+  'null': 'bold',
+  'string': 'green',
+  'date': 'magenta',
+  // "name": intentionally not styling
+  'regexp': 'red'
+};
+
+
+function stylizeWithColor(str, styleType) {
+  var style = inspect.styles[styleType];
+
+  if (style) {
+    return '\u001b[' + inspect.colors[style][0] + 'm' + str +
+           '\u001b[' + inspect.colors[style][1] + 'm';
+  } else {
+    return str;
+  }
+}
+
+
+function stylizeNoColor(str, styleType) {
+  return str;
+}
+
+
+function arrayToHash(array) {
+  var hash = {};
+
+  array.forEach(function(val, idx) {
+    hash[val] = true;
+  });
+
+  return hash;
+}
+
+
+function formatValue(ctx, value, recurseTimes) {
+  // Provide a hook for user-specified inspect functions.
+  // Check that value is an object with an inspect function on it
+  if (ctx.customInspect &&
+      value &&
+      isFunction(value.inspect) &&
+      // Filter out the util module, it's inspect function is special
+      value.inspect !== exports.inspect &&
+      // Also filter out any prototype objects using the circular check.
+      !(value.constructor && value.constructor.prototype === value)) {
+    var ret = value.inspect(recurseTimes, ctx);
+    if (!isString(ret)) {
+      ret = formatValue(ctx, ret, recurseTimes);
+    }
+    return ret;
+  }
+
+  // Primitive types cannot have properties
+  var primitive = formatPrimitive(ctx, value);
+  if (primitive) {
+    return primitive;
+  }
+
+  // Look up the keys of the object.
+  var keys = Object.keys(value);
+  var visibleKeys = arrayToHash(keys);
+
+  if (ctx.showHidden) {
+    keys = Object.getOwnPropertyNames(value);
+  }
+
+  // IE doesn't make error fields non-enumerable
+  // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
+  if (isError(value)
+      && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
+    return formatError(value);
+  }
+
+  // Some type of object without properties can be shortcutted.
+  if (keys.length === 0) {
+    if (isFunction(value)) {
+      var name = value.name ? ': ' + value.name : '';
+      return ctx.stylize('[Function' + name + ']', 'special');
+    }
+    if (isRegExp(value)) {
+      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+    }
+    if (isDate(value)) {
+      return ctx.stylize(Date.prototype.toString.call(value), 'date');
+    }
+    if (isError(value)) {
+      return formatError(value);
+    }
+  }
+
+  var base = '', array = false, braces = ['{', '}'];
+
+  // Make Array say that they are Array
+  if (isArray(value)) {
+    array = true;
+    braces = ['[', ']'];
+  }
+
+  // Make functions say that they are functions
+  if (isFunction(value)) {
+    var n = value.name ? ': ' + value.name : '';
+    base = ' [Function' + n + ']';
+  }
+
+  // Make RegExps say that they are RegExps
+  if (isRegExp(value)) {
+    base = ' ' + RegExp.prototype.toString.call(value);
+  }
+
+  // Make dates with properties first say the date
+  if (isDate(value)) {
+    base = ' ' + Date.prototype.toUTCString.call(value);
+  }
+
+  // Make error with message first say the error
+  if (isError(value)) {
+    base = ' ' + formatError(value);
+  }
+
+  if (keys.length === 0 && (!array || value.length == 0)) {
+    return braces[0] + base + braces[1];
+  }
+
+  if (recurseTimes < 0) {
+    if (isRegExp(value)) {
+      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+    } else {
+      return ctx.stylize('[Object]', 'special');
+    }
+  }
+
+  ctx.seen.push(value);
+
+  var output;
+  if (array) {
+    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+  } else {
+    output = keys.map(function(key) {
+      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+    });
+  }
+
+  ctx.seen.pop();
+
+  return reduceToSingleString(output, base, braces);
+}
+
+
+function formatPrimitive(ctx, value) {
+  if (isUndefined(value))
+    return ctx.stylize('undefined', 'undefined');
+  if (isString(value)) {
+    var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
+                                             .replace(/'/g, "\\'")
+                                             .replace(/\\"/g, '"') + '\'';
+    return ctx.stylize(simple, 'string');
+  }
+  if (isNumber(value))
+    return ctx.stylize('' + value, 'number');
+  if (isBoolean(value))
+    return ctx.stylize('' + value, 'boolean');
+  // For some reason typeof null is "object", so special case here.
+  if (isNull(value))
+    return ctx.stylize('null', 'null');
+}
+
+
+function formatError(value) {
+  return '[' + Error.prototype.toString.call(value) + ']';
+}
+
+
+function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+  var output = [];
+  for (var i = 0, l = value.length; i < l; ++i) {
+    if (hasOwnProperty(value, String(i))) {
+      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+          String(i), true));
+    } else {
+      output.push('');
+    }
+  }
+  keys.forEach(function(key) {
+    if (!key.match(/^\d+$/)) {
+      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+          key, true));
+    }
+  });
+  return output;
+}
+
+
+function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
+  var name, str, desc;
+  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
+  if (desc.get) {
+    if (desc.set) {
+      str = ctx.stylize('[Getter/Setter]', 'special');
+    } else {
+      str = ctx.stylize('[Getter]', 'special');
+    }
+  } else {
+    if (desc.set) {
+      str = ctx.stylize('[Setter]', 'special');
+    }
+  }
+  if (!hasOwnProperty(visibleKeys, key)) {
+    name = '[' + key + ']';
+  }
+  if (!str) {
+    if (ctx.seen.indexOf(desc.value) < 0) {
+      if (isNull(recurseTimes)) {
+        str = formatValue(ctx, desc.value, null);
+      } else {
+        str = formatValue(ctx, desc.value, recurseTimes - 1);
+      }
+      if (str.indexOf('\n') > -1) {
+        if (array) {
+          str = str.split('\n').map(function(line) {
+            return '  ' + line;
+          }).join('\n').substr(2);
+        } else {
+          str = '\n' + str.split('\n').map(function(line) {
+            return '   ' + line;
+          }).join('\n');
+        }
+      }
+    } else {
+      str = ctx.stylize('[Circular]', 'special');
+    }
+  }
+  if (isUndefined(name)) {
+    if (array && key.match(/^\d+$/)) {
+      return str;
+    }
+    name = JSON.stringify('' + key);
+    if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
+      name = name.substr(1, name.length - 2);
+      name = ctx.stylize(name, 'name');
+    } else {
+      name = name.replace(/'/g, "\\'")
+                 .replace(/\\"/g, '"')
+                 .replace(/(^"|"$)/g, "'");
+      name = ctx.stylize(name, 'string');
+    }
+  }
+
+  return name + ': ' + str;
+}
+
+
+function reduceToSingleString(output, base, braces) {
+  var numLinesEst = 0;
+  var length = output.reduce(function(prev, cur) {
+    numLinesEst++;
+    if (cur.indexOf('\n') >= 0) numLinesEst++;
+    return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
+  }, 0);
+
+  if (length > 60) {
+    return braces[0] +
+           (base === '' ? '' : base + '\n ') +
+           ' ' +
+           output.join(',\n  ') +
+           ' ' +
+           braces[1];
+  }
+
+  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
+}
+
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+function isArray(ar) {
+  return Array.isArray(ar);
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+  return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+  return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+  return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+  return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+  return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+  return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+  return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+  return isObject(re) && objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+  return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+  return isObject(d) && objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+  return isObject(e) &&
+      (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+  return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+  return arg === null ||
+         typeof arg === 'boolean' ||
+         typeof arg === 'number' ||
+         typeof arg === 'string' ||
+         typeof arg === 'symbol' ||  // ES6 symbol
+         typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = require('./support/isBuffer');
+
+function objectToString(o) {
+  return Object.prototype.toString.call(o);
+}
+
+
+function pad(n) {
+  return n < 10 ? '0' + n.toString(10) : n.toString(10);
+}
+
+
+var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
+              'Oct', 'Nov', 'Dec'];
+
+// 26 Feb 16:19:34
+function timestamp() {
+  var d = new Date();
+  var time = [pad(d.getHours()),
+              pad(d.getMinutes()),
+              pad(d.getSeconds())].join(':');
+  return [d.getDate(), months[d.getMonth()], time].join(' ');
+}
+
+
+// log is just a thin wrapper to console.log that prepends a timestamp
+exports.log = function() {
+  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
+};
+
+
+/**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * The Function.prototype.inherits from lang.js rewritten as a standalone
+ * function (not on Function.prototype). NOTE: If this file is to be loaded
+ * during bootstrapping this function needs to be rewritten using some native
+ * functions as prototype setup using normal JavaScript does not work as
+ * expected during bootstrapping (see mirror.js in r114903).
+ *
+ * @param {function} ctor Constructor function which needs to inherit the
+ *     prototype.
+ * @param {function} superCtor Constructor function to inherit prototype from.
+ */
+exports.inherits = require('inherits');
+
+exports._extend = function(origin, add) {
+  // Don't do anything if add isn't an object
+  if (!add || !isObject(add)) return origin;
+
+  var keys = Object.keys(add);
+  var i = keys.length;
+  while (i--) {
+    origin[keys[i]] = add[keys[i]];
+  }
+  return origin;
+};
+
+function hasOwnProperty(obj, prop) {
+  return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./support/isBuffer":24,"_process":10,"inherits":8}]},{},[2])(2)
+});

Plik diff jest za duży
+ 0 - 0
assets/js/blob-stream.min.js


Plik diff jest za duży
+ 673 - 0
assets/js/pdfkit.js


Plik diff jest za duży
+ 0 - 0
assets/js/pdfkit.min.js


+ 117 - 0
bin/prepareData.js

@@ -0,0 +1,117 @@
+'use strict';
+
+const fs = require('fs');
+const path = require('path');
+
+const config = require('../build.json');
+
+// Change current directory to script location so that
+// the relative paths of the resources can be resolved
+process.chdir(path.dirname(process.argv[1]));
+
+function createDirectory(dir) {
+    fs.mkdirSync(
+        dir,
+        { recursive: true },
+        (error) => {
+            if (error !== null) {
+                console.error('Error while creating directory', error);
+            }
+        }
+    );
+}
+
+function transformData() {
+    var matrix = fs.readFileSync(path.join('../', config.path.data, 'risk-ladder.tsv'), 'utf8');
+
+    // TSV wird geparst
+    matrix = matrix.split('\n').map(l => l.split('\t'));
+
+    var rowCount = matrix.length - 1;
+    var colCount = matrix[0].length;
+
+    var result = {reasons:[], filters:[]};
+    var filters = new Map();
+    var basisrisiko;
+
+    // Die einzelnen Einträge werden ausgelesen
+    for (var r = 1; r < rowCount; r++) {
+        result.reasons[r-1] = {
+            title: matrix[r][1],
+            info: matrix[r][2],
+            source: matrix[r][23],
+            url: matrix[r][24],
+            year: matrix[r][26],
+            evidence: matrix[r][25],
+            referenceGroup: matrix[r][27],
+            comment: matrix[r][28],
+            cat: matrix[r][0]
+        };
+    }
+
+    // Data expected in tsv
+    var ageGroups = ['', '1-13','14-17','18-20','21-59','60+'];
+    var genders = ['', 'm', 'w'];
+    var offset = 5;
+
+    for (var c = offset; c < colCount; c++) {
+        var alter = undefined, geschlecht = undefined;
+
+        if (c < genders.length * ageGroups.length + offset) {
+
+            // gender order: neutral | male | female
+            switch ((c-offset) % genders.length) {
+                case 0: geschlecht = ''; break;
+                case 1: geschlecht = 'm'; break;
+                case 2: geschlecht = 'w'; break;
+            }
+
+            // age group changes every genders.length column
+            alter = ageGroups[Math.floor((c-offset) / genders.length)];
+        }
+
+        if (alter === undefined && geschlecht === undefined) continue;
+        if (alter === undefined || geschlecht === undefined) throw Error([alter, geschlecht].join('\n'));
+
+        var key = alter + '_' + geschlecht;
+        var filter = {
+            alter:alter,
+            geschlecht:geschlecht,
+            entries:[]
+        };
+        result.filters.push(filter);
+        if (filters.has(key)) throw Error();
+        filters.set(key, true);
+
+        for (var r = 1; r < rowCount; r++) {
+            var val = parseFloat(matrix[r][c].replace(/,/g, '.'));
+            var value;
+            if (isNaN(val)) {
+                value = 1;
+            } else {
+                value = val;
+            }
+            filter.entries[r-1] = value;
+        }
+
+        // // Risiko wird aus Basisrisiko und Faktorisierung berechnet
+        if (key === '_') {
+            basisrisiko = filter.entries;
+        } else {
+            filter.entries = filter.entries.map(function (v,i) {
+                var val = v;
+                if (isNaN(v)) {
+                    val = 1;
+                } else {
+                    val = Math.round(v * basisrisiko[i] * 1e10) / 1e10;
+                }
+                return val;
+            });
+        }
+    }
+
+    fs.writeFileSync(path.join('../', config.path.output, config.path.data, 'data_de.json'), JSON.stringify(result, null, '\t'), 'utf8');
+}
+
+createDirectory(path.join('../', config.path.output, config.path.data));
+transformData();

+ 120 - 0
bin/preprocess.js

@@ -0,0 +1,120 @@
+/**
+ * Generate html files, target-dependent
+ * Context for embedding page is loaded from markdown file
+ */
+const process = require('process');
+const path = require('path');
+const fs = require('fs');
+const posthtml = require('posthtml');
+const expressions = require('posthtml-expressions');
+const marked = require('marked');
+const config = require('../build.json');
+
+
+const target = process.env.NODE_ENV || 'development';
+
+// Change current directory to script location so that
+// the relative paths of the resources can be resolved
+process.chdir(path.dirname(process.argv[1]));
+
+function createDirectory(dir) {
+    fs.mkdirSync(
+        dir,
+        { recursive: true },
+        (error) => {
+            if (error !== null) {
+                console.error('Error while creating directory', error);
+            }
+        }
+    );
+}
+
+function createVisualisationHtml() {
+    const visualisation = fs.readFileSync(
+        path.join(
+            '../',
+            config.path.input,
+            config.path.html,
+            config.path.skeletons,
+            config.html.visualisation.skeleton
+        ), 'utf8'
+    );
+
+    // "D-dis is insanity, Max!"
+    // Generate html file for the visualisation
+    posthtml(
+        expressions({
+            locals: {
+                javascript: path.join(config.path.js, `${config.main}${config[target].infix}.js`),
+                stylesheet: path.join(config.path.css, `${config.main}${config[target].infix}.css`)
+            }
+        })
+    ).process(visualisation)
+        .then((result) => {
+            fs.writeFileSync(
+                path.join(
+                    '../',
+                    config.path.output,
+                    config.html.visualisation.name
+                ), result.html
+            );
+        });
+}
+
+function createContextHtml() {
+    // Load context from markdown file
+    const md = fs.readFileSync(
+        path.join(
+            '../',
+            config.path.input,
+            config.path.html,
+            config.path.markdown,
+            config.context
+        ), 'utf8');
+
+    // Convert markdown to html
+    var converted = marked(md);
+
+    // Load html skeleton
+    const skeleton = fs.readFileSync(
+        path.join(
+            '../',
+            config.path.input,
+            config.path.html,
+            config.path.skeletons,
+            config.html.index.skeleton
+        ), 'utf8');
+
+    // Compile html
+    // 1: Assign variables to iframe in context
+    // 2: Place generated html from (1) into skeleton
+    // write file
+    posthtml(
+        expressions({
+            locals: {
+                d3: config.html.visualisation.name,
+                width: `${config.width}px`,
+                height: `${config.height}px`
+            }
+        })
+    ).process(converted)
+        .then((result) => posthtml(expressions({locals: { content: result.html }}))
+            .process(skeleton)
+            .then((result) => {
+                fs.writeFileSync(
+                    path.join(
+                        '../',
+                        config.path.output,
+                        config.html.index.name
+                    ), result.html
+                );
+            }));
+}
+
+function createHtml() {
+    createVisualisationHtml();
+    createContextHtml();
+}
+
+createDirectory(path.join('../', config.path.output));
+createHtml();

+ 39 - 0
build.json

@@ -0,0 +1,39 @@
+{
+    "context": "index.md",
+    "main": "main",
+    "path": {
+        "assets": "assets",
+        "bin": "bin",
+        "build": "build",
+        "css": "css",
+        "data": "data",
+        "fonts": "fonts",
+        "html": "html",
+        "img": "img",
+        "input": "src",
+        "js": "js",
+        "markdown": "markdown",
+        "output": "dist",
+        "skeletons": "skeletons"
+    },
+    "html": {
+        "index": {
+            "name": "index.html",
+            "skeleton": "main.html"
+        },
+        "visualisation": {
+            "name": "risk-ladder.html",
+            "skeleton": "visualisation.html"
+        }
+    },
+    "development": {
+        "infix": "",
+        "sourcemap": true
+    },
+    "production": {
+        "infix": ".min",
+        "sourcemap": false
+    },
+    "height": 573,
+    "width": 1000
+}

+ 3275 - 0
data/data_de.json

@@ -0,0 +1,3275 @@
+{
+	"reasons": [
+		{
+			"title": "Verluste mit Immobilien",
+			"info": "Innerhalb eines Jahres",
+			"source": "Bach, S., Popien, P., & Thiemann, A. (2014). Renditen von …",
+			"url": "",
+			"year": "2011",
+			"evidence": "Sehr niedrige Qualität der Daten (Alter der Daten)",
+			"referenceGroup": "Immobilieninvestoren",
+			"comment": "",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Verletzung durch Autounfall",
+			"info": "Innerhalb eines Jahres",
+			"source": "Statistisches Bundesamt (2018).",
+			"url": "https://www.destatis.de",
+			"year": "2018",
+			"evidence": "Hohe Qualität der Daten",
+			"referenceGroup": "Verbraucher",
+			"comment": "Debatten im Internet müssen stark moderiert werden, da viele Menschen in der scheinbaren Anonymität sprachlich oft entgleisen oder andere Menschen bedrohen.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Bei Autounfall sterben",
+			"info": "Innerhalb eines Jahres",
+			"source": "Statistisches Bundesamt (2018).",
+			"url": "https://www.destatis.de",
+			"year": "2018",
+			"evidence": "Hohe Qualität der Daten",
+			"referenceGroup": "Verbraucher",
+			"comment": "Verschiedene Formen sowohl in Textform, aber auch mit Bildern oder in Kommunikationsmedien zählen hierzu.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Bei Fußgängerunfall sterben",
+			"info": "Innerhalb eines Jahres",
+			"source": "Statistisches Bundesamt (2018).",
+			"url": "https://www.destatis.de",
+			"year": "2018",
+			"evidence": "Hohe Qualität der Daten",
+			"referenceGroup": "Verbraucher",
+			"comment": "Hierzu zählen alle Formen von Privatsphäreverletzungen, offline und online.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Opfer von Handtaschenraub",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Hierzu zählen alle Formen von digitaler Kriminalität.",
+			"cat": "Recht"
+		},
+		{
+			"title": "Opfer von Totschlag",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Persönliche digitale Daten, die gestohlen werden, umfassen zum Beispiel Anschriftdaten, Kontodaten oder auch Logins.",
+			"cat": "Recht"
+		},
+		{
+			"title": "Auto wird aufgebrochen",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Kraftfahrzeuge",
+			"comment": "Es wird erlebt, dass ein Virus o.ä. das eigene Gerät kompromittiert.",
+			"cat": "Recht"
+		},
+		{
+			"title": "Einer Straftat verdächtigt werden",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Es wird erlebt, dass der eigene Standort ungewollt von einem digitalen Dienst oder Gerät abgefragt wird.",
+			"cat": "Recht"
+		},
+		{
+			"title": "In die Wohnung wird eingebrochen",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Es wird erlebt, dass ein Onlinepasswort geknackt wurde.",
+			"cat": "Recht"
+		},
+		{
+			"title": "Durch Erreger in Lebensmitteln erkranken",
+			"info": "Innerhalb eines Jahres",
+			"source": "BfR (2017). Schutz vor Lebensmittelinfektionen im Privathaushalt.",
+			"url": "https://www.bfr.bund.de/cm/350/verbrauchertipps_schutz_vor_lebensmittelinfektionen_im_privathaushalt.pdf",
+			"year": "2017",
+			"evidence": "Sehr niedrige Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Es wird erlebt, dass Fremde in das eigene W-Lan-Netz eindringen.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Mehr als 3h Verspätung beim Fliegen",
+			"info": "Innerhalb eines Jahres",
+			"source": "Fries, A. (2017, Juli 11). Täglich fallen 69 Flüge aus oder…",
+			"url": "https://www.reisereporter.de/artikel/1947-flugausfaelle-flugverspaetung-taeglich-69-faelle-probleme-mit-fluegen",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Niedrige externe Validität)",
+			"referenceGroup": "Flüge",
+			"comment": "Werden beim Onlineeinkauf betrogen.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Auto wird gestohlen",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Kraftfahrzeuge",
+			"comment": "Es wird erlebt digitalen Kreditkarten- bzw. Kontodatenbetrug.",
+			"cat": "Recht"
+		},
+		{
+			"title": "Hagel- / Sturmschaden am Auto",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Kraftfahrzeuge",
+			"comment": "Es wird erlebt, dass sich jemand zu Emails/sozialen Netzwerken Zugang verschafft.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Wildunfall mit dem Auto",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Kraftfahrzeuge",
+			"comment": "Es wird erlebt, dass Zahlungsdaten vom Telefon kopiert werden.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Marder beschädigt das Auto",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Kraftfahrzeuge",
+			"comment": "Es wird erlebt, dass Zahlungsdaten nach Onlineeinkauf missbraucht werden.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Wohnungsbrand",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherte",
+			"comment": "Es wird erlebt, dass der eigene Computer übernommen wird (ransomware).",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leitungswasserschaden",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherte",
+			"comment": "Opfer von digitalem Identitätsdiebstahl",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall der Rechtsschutzversicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Es wird erlebt unauthorisierten Zugriff auf einem Smarthome-Gerät",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall der Fahrzeugvollversicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Beruflich benachteiligt aufgrund von Texten unter dem eigenen Namen",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall der technischen Versicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Es wird erlebt analogen Kreditkarten- bzw. Kontodatenbetrug",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall der Wohngebäudeversicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Offline verbal angegriffen / schwer beleidigt worden",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall einer Kraftfahrversicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Offline sexuell belästig worden",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall einer Schadens-/Unfallversicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Hierzu wird gezählt, wenn Verbraucher erleben, dass sich Preise ständig ändern würden.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall einer Sachversicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Hierzu wird gezählt, wenn Verbraucher erleben, dass sich Preise ständig ändern würden.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall der privaten Sachversicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Hierbei werden Ihnen persönliche Daten gestohlen und es gibt sich jemand als Sie aus um dann Geschäfte zu tätigen oder Ihre Konten abzuräumen.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall der Kraftfahrzeug-Haftpflichtversicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Hierbei erhalten Sie die Rechnungen für all jene Einkäufe, die Sie selbst nie getätigt haben, aber jemand, der Ihre persönliche Daten durch Identitätsdiebstahl erlangt hat.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall der Fahrzeugteilversicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Die eigene Kreditwürdigkeit schränkt die möglichen Zahlungsweisen beim Onlineeinkauf ein, da der Händler nicht bei jedem Einkäufer das gleiche Risiko eingehen möchte.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall der allgemeinen Haftpflichtversicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Hierbei erhält man eine Abmahnung von Rechtsanwälten, wenn durch einen Identitätsdiebstahl Geschäfte mit Ihrer Identität durchgeführt wurden, aber natürlich niemals bezahlt wurde. Somit landen die Rechnung und dann die Abmahnung bei Ihnen.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall der Schutzbriefversicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Mehr als 3h Verspätung beim Fliegen.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall der Hausratversicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Fluggepäck beschädigt/verloren.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall der privaten Unfallversicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Verlust der Fahrerlaubnis.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Leistungsfall der Kraftfahrtunfallversicherung",
+			"info": "Innerhalb eines Jahres",
+			"source": "gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.",
+			"url": "https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Versicherungsverträge",
+			"comment": "Große Belastung durch Wohnkosten.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Bei Terroranschlag sterben",
+			"info": "Innerhalb eines Jahres",
+			"source": "Global Terrorism Database (2018). ",
+			"url": "",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Schwerwiegende Ereignisse zu unregelmäßig, um pro Jahr sinnvoll quantifiziert zu werden)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Miete oder Nebenkosten nicht leisten können.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Küchenschwamm zu selten austauschen",
+			"info": "Innerhalb eines Jahres",
+			"source": "Hölzl, C., & Aldrian, U., (2011). Lebensmittelsicherheit und Hygiene…",
+			"url": "https://www.ages.at/fileadmin/AGES2015/Themen/Lebensmittel_Dateien/Lebensmittelsicherheit_und_Hygiene_im_Privathaushalt_13_12_2013.pdf",
+			"year": "2013",
+			"evidence": "Sehr niedrige Qualität der Daten (Niedrige externe Validität)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Schulden bzw. Verbindlichkeiten zu haben, sagt nichts darüber aus, wie viel Vermögen oder Einnahmen dem gegenüber stehen.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Verlust des Führerscheins",
+			"info": "Innerhalb eines Jahres",
+			"source": "Kraftfahrt-Bundesamt (2018). Ausgewählte Maßnahmen…",
+			"url": "https://www.kba.de/DE/Statistik/Kraftfahrer/Verkehrsauffaelligkeiten/Massnahmen_und_Sanktionen/2018_mus_dusl.html?nn=1150864",
+			"year": "2018",
+			"evidence": "Hohe Qualität der Daten",
+			"referenceGroup": "Führerscheininhaber",
+			"comment": "Verluste mit Immobilien umfassen sämtliche Arten von Erwerbs- und Anlagegeschäften.",
+			"cat": "Recht"
+		},
+		{
+			"title": "Durch Meteoriteneinschlag sterben",
+			"info": "Innerhalb eines Jahres",
+			"source": "Krämer, W. (2011). Warum wir uns vor den falschen Dingen fürchten…",
+			"url": "",
+			"year": "1996",
+			"evidence": "Niedrige Qualität der Daten (Schwerwiegende Ereignisse zu selten, um pro Jahr sinnvoll quantifiziert zu werden)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Totalverlust bei Crowdfunding (einschließlich Crowdlending und Crowdinvesting).",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Bei einem Flugzeugunglück sterben",
+			"info": "Innerhalb eines Jahres",
+			"source": "Müller-Peters, H. & Gatzert, N. (2016). Todsicher: Die Wahrnehmung…",
+			"url": "",
+			"year": "2015",
+			"evidence": "Niedrige Qualität der Daten (Aufgrund der Opfervielfalt in der Problemlage schwer zu quantifizieren, d.h. Passagiere aus Deutschland, Passagiere von Airlines aus Deutschland, Passagiere von Flugzeugen, die in Deutschland landen, starten oder darüberfliegen.",
+			"referenceGroup": "Verbraucher",
+			"comment": "Keine Ausschüttung durch eine Energiegenossenschaft.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Vom Blitz getroffen werden",
+			"info": "Innerhalb eines Jahres",
+			"source": "Müller-Peters, H. & Gatzert, N. (2016). Todsicher: Die Wahrnehmung…",
+			"url": "",
+			"year": "2015",
+			"evidence": "Niedrige Qualität der Daten (Ereignisse zu unregelmäßig, um pro Jahr sinnvoll quantifiziert zu werden)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Autoaufbruch",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Von einem Hund gebissen werden",
+			"info": "Innerhalb eines Jahres",
+			"source": "Müller-Peters, H. & Gatzert, N. (2016). Todsicher: Die Wahrnehmung…",
+			"url": "",
+			"year": "2015",
+			"evidence": "Niedrige Qualität der Daten (Keine systematische Erfassung)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Autodiebstahl",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Durch einen Geisterfahrer zu Tode kommen",
+			"info": "Innerhalb eines Jahres",
+			"source": "Müller-Peters, H. & Gatzert, N. (2016). Todsicher: Die Wahrnehmung…",
+			"url": "",
+			"year": "2015",
+			"evidence": "Niedrige Qualität der Daten (Keine systematische Erfassung)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Autopanne.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Tod durch Hornissen-, Wespen- oder Bienenstiche",
+			"info": "Innerhalb eines Jahres",
+			"source": "National Safety Council (2017). Lifetime odds of death for selected…",
+			"url": "https://injuryfacts.nsc.org/all-injuries/preventable-death-overview/odds-of-dying/.",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (US-Bevölkerungsdaten)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Auto-Hagel/Sturm-Schaden.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Tod durch einen Hundebiss",
+			"info": "Innerhalb eines Jahres",
+			"source": "National Safety Council (2017). Lifetime odds of death for selected…",
+			"url": "https://injuryfacts.nsc.org/all-injuries/preventable-death-overview/odds-of-dying/.",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (US-Bevölkerungsdaten)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Wildunfall.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Konflikt mit Energieversorger bis zur Schlichtung",
+			"info": "Innerhalb eines Jahres",
+			"source": "Schlichtungsstelle Energie e.V. (2018). Tätigkeitsbericht…",
+			"url": "https://www.schlichtungsstelle-energie.de/presse.html?file=files/sse/content/pdf/presse/Taetigkeitsbericht%20SSE%202018.pdf",
+			"year": "2018",
+			"evidence": "Niedrige Qualität der Daten (Sehr niedrige Validität)",
+			"referenceGroup": "Stromanbieter-Wechsler",
+			"comment": "Maderbiss Auto.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Fluggepäck beschädigt oder verloren",
+			"info": "Innerhalb eines Jahres",
+			"source": "SITA (2017). The Baggage Report 2017. Air Transport Industry Insights.",
+			"url": "http://comms.sita.aero/rs/089-ZSE-857/images/baggage-report-2017.pdf",
+			"year": "2016",
+			"evidence": "Moderate Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Flüge",
+			"comment": "Verkehrsunfall mit Sachschaden.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Problematisch/krankhaft in Casinos spielen",
+			"info": "Innerhalb eines Jahres",
+			"source": "Sperber, P. (2017). Zusammenfassung der BZgA Studie…",
+			"url": "https://lssh.de/wp-content/uploads/2018/07/Zusammenfassung-der-BZgA-Studie-Glücksspielverhalten-und-Glücksspielsucht-in-Deutschland.-Ergebnisse-des-Surveys-2017-und-Trends.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Spieler",
+			"comment": "Glücksspiele unterm Strich ohne Gewinn.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Problematisch/krankhaft an Automaten spielen",
+			"info": "Innerhalb eines Jahres",
+			"source": "Sperber, P. (2017). Zusammenfassung der BZgA Studie…",
+			"url": "https://lssh.de/wp-content/uploads/2018/07/Zusammenfassung-der-BZgA-Studie-Glücksspielverhalten-und-Glücksspielsucht-in-Deutschland.-Ergebnisse-des-Surveys-2017-und-Trends.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Spieler",
+			"comment": "In Spielbanken problematisch/krankhaft spielen.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Problematisch/krankhaft im Sport wetten",
+			"info": "Innerhalb eines Jahres",
+			"source": "Sperber, P. (2017). Zusammenfassung der BZgA Studie…",
+			"url": "https://lssh.de/wp-content/uploads/2018/07/Zusammenfassung-der-BZgA-Studie-Glücksspielverhalten-und-Glücksspielsucht-in-Deutschland.-Ergebnisse-des-Surveys-2017-und-Trends.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Spieler",
+			"comment": "An Geldspielautomaten problematisch/krankhaft spielen.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Problematisch/krankhaft 6 aus 49 spielen",
+			"info": "Innerhalb eines Jahres",
+			"source": "Sperber, P. (2017). Zusammenfassung der BZgA Studie…",
+			"url": "https://lssh.de/wp-content/uploads/2018/07/Zusammenfassung-der-BZgA-Studie-Glücksspielverhalten-und-Glücksspielsucht-in-Deutschland.-Ergebnisse-des-Surveys-2017-und-Trends.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Spieler",
+			"comment": "Online-Sportwetten problematisch/krankhaft spielen.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Problematisch/krankhaft Eurojackpot spielen",
+			"info": "Innerhalb eines Jahres",
+			"source": "Sperber, P. (2017). Zusammenfassung der BZgA Studie…",
+			"url": "https://lssh.de/wp-content/uploads/2018/07/Zusammenfassung-der-BZgA-Studie-Glücksspielverhalten-und-Glücksspielsucht-in-Deutschland.-Ergebnisse-des-Surveys-2017-und-Trends.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Spieler",
+			"comment": "6 aus 49 problematisch/krankhaft spielen.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Süchtig nach Glücksspiel",
+			"info": "Innerhalb eines Jahres",
+			"source": "Sperber, P. (2017). Zusammenfassung der BZgA Studie…",
+			"url": "https://lssh.de/wp-content/uploads/2018/07/Zusammenfassung-der-BZgA-Studie-Glücksspielverhalten-und-Glücksspielsucht-in-Deutschland.-Ergebnisse-des-Surveys-2017-und-Trends.pdf",
+			"year": "2017",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Eurojackpot problematisch/krankhaft spielen.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Staatliche soziale Unterstützungsleistungen erhalten",
+			"info": "Innerhalb eines Jahres",
+			"source": "Statisches Bundesamt (2017). Wirtschaftsrechnungen",
+			"url": "https://www.destatis.de/DE/Themen/Gesellschaft-Umwelt/Einkommen-Konsum-Lebensbedingungen/Lebensbedingungen-Armutsgefaehrdung/Publikationen/Downloads-Lebensbedingungen/einkommen-lebensbedingungen-2150300177004.pdf",
+			"year": "2017",
+			"evidence": "Moderate Qualität der Daten (Individuell stark beinflussbar)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Schlichtungsantrag im Konfliktfall mit dem eigenen Energieversorger.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Grundsicherung erhalten",
+			"info": "Innerhalb eines Jahres",
+			"source": "Statisches Bundesamt (2017). Wirtschaftsrechnungen",
+			"url": "https://www.destatis.de/DE/Themen/Gesellschaft-Umwelt/Einkommen-Konsum-Lebensbedingungen/Lebensbedingungen-Armutsgefaehrdung/Publikationen/Downloads-Lebensbedingungen/einkommen-lebensbedingungen-2150300177004.pdf",
+			"year": "2017",
+			"evidence": "Moderate Qualität der Daten (Individuell stark beinflussbar)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Opfer von Betrug/Untreue bei Kapitalanlage.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Verkehrsunfall mit Sachschaden",
+			"info": "Innerhalb eines Jahres",
+			"source": "Statistisches Bundesamt (2018).",
+			"url": "https://www.destatis.de",
+			"year": "2018",
+			"evidence": "Hohe Qualität der Daten",
+			"referenceGroup": "Kraftfahrzeuge",
+			"comment": "Überschuldet.",
+			"cat": "Versicherung"
+		},
+		{
+			"title": "Ziviler Rechtsstreit",
+			"info": "Innerhalb eines Jahres",
+			"source": "Statistisches Bundesamt (2018).",
+			"url": "https://www.destatis.de",
+			"year": "2018",
+			"evidence": "Hohe Qualität der Daten",
+			"referenceGroup": "Verbraucher",
+			"comment": "Verbraucherinsolvenz.",
+			"cat": "Recht"
+		},
+		{
+			"title": "Scheidung",
+			"info": "Innerhalb eines Jahres",
+			"source": "Statistisches Bundesamt (2019).",
+			"url": "https://www.destatis.de",
+			"year": "2019",
+			"evidence": "Hohe Qualität der Daten",
+			"referenceGroup": "Verbraucher",
+			"comment": "Es wird erlebt EC-Kartendiebstahl mit Betrug (Debitkarten).",
+			"cat": "Recht"
+		},
+		{
+			"title": "Tod durch Leberkrebs nach 40 Löffeln Erdnussbutter",
+			"info": "Innerhalb eines Jahres",
+			"source": "Wilson, R. (1979). Analyzing the daily risks of life. Tech Rev, 81(4), 41-46.",
+			"url": "",
+			"year": "1979",
+			"evidence": "Niedrige Qualität der Daten (Alter der Daten)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Kreditkartenschulden sagen nichts darüber aus, wie viel Vermögen dem gegenüber steht.",
+			"cat": "Gesundheit"
+		},
+		{
+			"title": "Opfer von Betrug bzw. Untreue bei Kapitalanlage",
+			"info": "Innerhalb eines Jahres",
+			"source": "BKA (2018). Bundeslagebild Wirtschaftskriminalität 2017.",
+			"url": "https://www.bka.de/SharedDocs/Downloads/DE/Publikationen/JahresberichteUndLagebilder/Wirtschaftskriminalitaet/wirtschaftskriminalitaetBundeslagebild2017.pdf",
+			"year": "2017",
+			"evidence": "Hohe Qualität der Daten",
+			"referenceGroup": "Verbraucher",
+			"comment": "Kreditwürdigkeit wird von der Schufa mithilfe der Adresse ermittelt, wenn sonst kein anderes Datum zur Verfügung steht.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Überschuldet",
+			"info": "Innerhalb eines Jahres",
+			"source": "Creditreform.de (2018). Analyse SchuldnerAtlas Deutschland…",
+			"url": "https://www.creditreform.de/fileadmin/user_upload/central_files/News/News_Wirtschaftsforschung/2018/Analyse-SchuldnerAtlas-Deutschland-2018.pdf",
+			"year": "2018",
+			"evidence": "Niedrige Qualität der Daten (Individuell stark beinflussbar)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Bestreiten Lebensunterhalt durch eigene Kapitaleinnahmen.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Insolvent als Verbraucher",
+			"info": "Innerhalb eines Jahres",
+			"source": "CRIF Bürgel GmbH. (21. März, 2019). Anzahl der Privatinsolvenzen…",
+			"url": "https://de-statista-com.ezproxy.mpib-berlin.mpg.de/statistik/daten/studie/150565/umfrage/privatinsolvenzen-in-deutschland-seit-2000/",
+			"year": "2017",
+			"evidence": "Hohe Qualität der Daten",
+			"referenceGroup": "Verbraucher",
+			"comment": "Erhalten staatliche soziale Unterstützungsleistungen.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "EC-Kartendiebstahl mit Betrug erlebn",
+			"info": "Innerhalb eines Jahres",
+			"source": "FOCUS Online Group GmbH (2018, Januar 14). Wieder mehr Betrug…",
+			"url": "https://www.focus.de/finanzen/news/2-2-millionen-euro-schaden-wieder-mehr-betrug-mit-bankkarten-branche-ohne-sorge_id_8294582.html",
+			"year": "2017",
+			"evidence": "Moderate Qualität der Daten (Individuell stark beinflussbar)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Grundsicherung erhalten.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Unterm Strich Verluste beim Glücksspiel",
+			"info": "Innerhalb eines Jahres",
+			"source": "Haß, W., & Lang, P. (2016). Glücksspielverhalten und …",
+			"url": "",
+			"year": "2015",
+			"evidence": "Sehr niedrige Qualität der Daten (Alter der Daten)",
+			"referenceGroup": "Spieler",
+			"comment": "Verletzung durch Autounfall.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Totalverlust bei Crowdfunding",
+			"info": "Innerhalb eines Jahres",
+			"source": "Horhuf, L., & Schmitt, M., (2016). Success and Failure in equity crowd…",
+			"url": "https://www.uni-trier.de/fileadmin/fb4/prof/VWL/OAR/Hornuf_Schmitt_-_Success_and_Failure_in_Equity_Crowdfunding.pdf",
+			"year": "2015",
+			"evidence": "Sehr niedrige Qualität der Daten (Alter der Daten)",
+			"referenceGroup": "Investoren",
+			"comment": "Tödlicher Autounfall.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Kreditkartenschulden",
+			"info": "Innerhalb eines Jahres",
+			"source": "ING DiBa. (2015). Kredit- und Dispo-Nutzung in Deutschland...",
+			"url": "https://www.ing.de/binaries/content/assets/pdf/ueber-uns/presse/publikationen/ing-diba-economic-analysis-umfrageergebnisse-dispo-nutzung-2015.pdf",
+			"year": "2014",
+			"evidence": "Sehr niedrige Qualität der Daten (Alter der Daten; potenzieller Interessenkonflikt)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Tödlicher Fußgängerunfall.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Kreditwürdigkeit durch Wohnort bestimmt",
+			"info": "Innerhalb eines Jahres",
+			"source": "Schufa (2018). SCHUFA Kredit-Kompass 2018.",
+			"url": "https://www.schufa.de/media/editorial/ueber_uns/bilder/studien_und_publikationen/kredit_kompass/skk_2018/SCHUFA_Kredit-Kompass-2018.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Verzerrungsrisiko)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Erkrankungen durch Mikroorganismen in Lebensmitteln.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Lebensunterhalt durch eigene Kapitaleinnahmen",
+			"info": "Innerhalb eines Jahres",
+			"source": "Statistisches Bundesamt (2016). 70 % der 18- bis 64-Jährigen…",
+			"url": "https://www.destatis.de/DE/PresseService/Presse/Pressemitteilungen/2016/07/PD16_243_122.html",
+			"year": "2015",
+			"evidence": "Moderate Qualität der Daten (Aufzeichnung ist nur bedingt zuverlässig möglich)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Tödlicher Terroranschlag.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Große Belastung durch Wohnkosten",
+			"info": "Innerhalb eines Jahres",
+			"source": "Statistisches Bundesamt (2017). Wirtschaftsrechnungen.",
+			"url": "https://www.destatis.de/DE/Themen/Gesellschaft-Umwelt/Einkommen-Konsum-Lebensbedingungen/Lebensbedingungen-Armutsgefaehrdung/Publikationen/Downloads-Lebensbedingungen/einkommen-lebensbedingungen-2150300177004.pdf",
+			"year": "2017",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Haushalte",
+			"comment": "Tauschen Küchenschwamm zu selten aus.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Miete oder Nebenkosten nicht leisten können",
+			"info": "Innerhalb eines Jahres",
+			"source": "Statistisches Bundesamt (2017). Wirtschaftsrechnungen.",
+			"url": "https://www.destatis.de/DE/Themen/Gesellschaft-Umwelt/Einkommen-Konsum-Lebensbedingungen/Lebensbedingungen-Armutsgefaehrdung/Publikationen/Downloads-Lebensbedingungen/einkommen-lebensbedingungen-2150300177004.pdf",
+			"year": "2017",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Haushalte",
+			"comment": "Tod durch Meteoriteneinschlag.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Schulden haben",
+			"info": "Innerhalb eines Jahres",
+			"source": "Statistisches Bundesamt (2018). Wirtschaftsrechnungen.",
+			"url": "https://www.destatis.de/DE/Themen/Gesellschaft-Umwelt/Einkommen-Konsum-Lebensbedingungen/Vermoegen-Schulden/Publikationen/Downloads-Vermoegen-Schulden/evs-geld-immobilienvermoegen-schulden-2152602189004.pdf ",
+			"year": "2018",
+			"evidence": "Hohe Qualität der Daten",
+			"referenceGroup": "Haushalte",
+			"comment": "Hundebiss.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Keine Ausschüttung durch eine Energiegenossenschaft",
+			"info": "Innerhalb eines Jahres",
+			"source": "Verbraucherzentrale (2017). Energiegenossenschaften…",
+			"url": "https://www.geld-bewegt.de/wissen/geld-versicherungen/nachhaltige-geldanlage/energiegenossenschaften-gemeinsam-investieren-11295",
+			"year": "2016",
+			"evidence": "Niedrige Qualität der Daten (Alter der Daten; Verzerrungsrisiko)",
+			"referenceGroup": "Investoren",
+			"comment": "Verletzung oder Tod durch Blitz.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Opfer von Stalking",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Tödlicher Geisterfahrerunfall.",
+			"cat": "Recht"
+		},
+		{
+			"title": "Was kann im nächsten Jahr passieren?",
+			"info": "",
+			"source": "",
+			"url": "",
+			"year": "",
+			"evidence": "",
+			"referenceGroup": "Verbraucher",
+			"comment": "Tödlicher Flugzeugunfall.",
+			"cat": ""
+		},
+		{
+			"title": "Opfer eines Raubüberfalls auf eigene Wohnung",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Tod durch Hornissen-, Wespen- oder Bienenstiche.",
+			"cat": "Recht"
+		},
+		{
+			"title": "Durch einen anderen getötet werden",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Tod durch Hundebisse.",
+			"cat": "Recht"
+		},
+		{
+			"title": "Mordopfer",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Süchtig nach Glücksspiel.",
+			"cat": "Recht"
+		},
+		{
+			"title": "Opfer fahrlässiger Körperverletzung",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Tod durch Leberkrebs aufgrund von 40 Löffeln Erdnussbuttern.",
+			"cat": "Recht"
+		},
+		{
+			"title": "Bedroht werden",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Handtaschenraub (versucht und vollendet).",
+			"cat": "Recht"
+		},
+		{
+			"title": "Opfer einer Straftat",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Nachstellung (Stalking) § 238 StGB  (versucht und vollendet).",
+			"cat": "Recht"
+		},
+		{
+			"title": "Opfer leichter Körperverletzung",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Raubüberfälle in Wohnungen (versucht und vollendet).",
+			"cat": "Recht"
+		},
+		{
+			"title": "Opfer von Gewaltkriminalität",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Totschlag § 212 StGB (versucht und vollendet).",
+			"cat": "Recht"
+		},
+		{
+			"title": "Opfer schwerer Körperverletzung in der Öffentlichkeit",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Gefährliche und schwere Körperverletzung auf Straßen, Wegen oder Plätzen (versucht und vollendet).",
+			"cat": "Recht"
+		},
+		{
+			"title": "In der Öffentlichkeit ausgeraubt werden",
+			"info": "Innerhalb eines Jahres",
+			"source": "BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.",
+			"url": "https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html",
+			"year": "2018",
+			"evidence": "Moderate Qualität der Daten (Dunkelziffer)",
+			"referenceGroup": "Verbraucher",
+			"comment": "Gewaltkriminalität (versucht und vollendet).",
+			"cat": "Recht"
+		},
+		{
+			"title": "Kreditkarten- bzw. Kontodatenbetrug offline erleben",
+			"info": "Innerhalb eines Jahres",
+			"source": "Bitkom (2019). Jeder zweite Internetnutzer von Cyberkriminalität…",
+			"url": "https://www.bitkom.org/Presse/Presseinformation/Jeder-zweite-Internetnutzer-von-Cyberkriminalitaet-betroffen",
+			"year": "2018",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Bedrohung § 241 StGB (versucht und vollendet).",
+			"cat": "Recht"
+		},
+		{
+			"title": "Persönliche Daten gegen eigenen Willen an Dritte",
+			"info": "Innerhalb eines Jahres",
+			"source": "Bitkom (2019). Jeder zweite Internetnutzer von Cyberkriminalität…",
+			"url": "https://www.bitkom.org/Presse/Presseinformation/Jeder-zweite-Internetnutzer-von-Cyberkriminalitaet-betroffen",
+			"year": "2017",
+			"evidence": "Sehr niedrige Qualität der Daten (Erfassung durch Selbstbericht)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Mord, Totschlag und Tötung auf Verlangen (versucht und vollendet).",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Online schwer beleidigt / angegriffen werden",
+			"info": "Innerhalb eines Jahres",
+			"source": "Bitkom (2019). Jeder zweite Internetnutzer von Cyberkriminalität…",
+			"url": "https://www.bitkom.org/Presse/Presseinformation/Jeder-zweite-Internetnutzer-von-Cyberkriminalitaet-betroffen",
+			"year": "2018",
+			"evidence": "Sehr niedrige Qualität der Daten (Sehr niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Sonstige Raubüberfälle auf Straßen, Wegen oder Plätzen (versucht und vollendet).",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Online sexuell belästigt werden",
+			"info": "Innerhalb eines Jahres",
+			"source": "Bitkom (2019). Jeder zweite Internetnutzer von Cyberkriminalität…",
+			"url": "https://www.bitkom.org/Presse/Presseinformation/Jeder-zweite-Internetnutzer-von-Cyberkriminalitaet-betroffen",
+			"year": "2018",
+			"evidence": "Sehr niedrige Qualität der Daten (Sehr niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Vorsätzliche einfache Körperverletzung § 223 StGB (versucht und vollendet).",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Offline schwer beleidigt / angegriffen werden",
+			"info": "Innerhalb eines Jahres",
+			"source": "Bitkom (2019). Jeder zweite Internetnutzer von Cyberkriminalität…",
+			"url": "https://www.bitkom.org/Presse/Presseinformation/Jeder-zweite-Internetnutzer-von-Cyberkriminalitaet-betroffen",
+			"year": "2018",
+			"evidence": "Sehr niedrige Qualität der Daten (Sehr niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Mord § 211 StGB (versucht und vollendet).",
+			"cat": "Recht"
+		},
+		{
+			"title": "Offline sexuell belästigt werden",
+			"info": "Innerhalb eines Jahres",
+			"source": "Bitkom (2019). Jeder zweite Internetnutzer von Cyberkriminalität…",
+			"url": "https://www.bitkom.org/Presse/Presseinformation/Jeder-zweite-Internetnutzer-von-Cyberkriminalitaet-betroffen",
+			"year": "2018",
+			"evidence": "Sehr niedrige Qualität der Daten (Sehr niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Straftaten insgesamt (versucht und vollendet).",
+			"cat": "Recht"
+		},
+		{
+			"title": "Preisschwankungen beim Internethändler erleben",
+			"info": "Innerhalb eines Jahres",
+			"source": "Krämer, A., Kalka, R., & Ziehe, N. (2017). Personalisiertes und…",
+			"url": "https://wiwi.hs-duesseldorf.de/personen/nikola.ziehe/Documents/Kraemer%20Kalka%20Ziehe%20-%20Personalisiertes%20und%20dynamisches%20Pricing%20aus%20Einzelhandels-%20und%20Verbrauchersicht%20261110F.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Straftatverdacht",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Preisschwankungen beim lokalen Händler erleben",
+			"info": "Innerhalb eines Jahres",
+			"source": "Krämer, A., Kalka, R., & Ziehe, N. (2017). Personalisiertes und…",
+			"url": "https://wiwi.hs-duesseldorf.de/personen/nikola.ziehe/Documents/Kraemer%20Kalka%20Ziehe%20-%20Personalisiertes%20und%20dynamisches%20Pricing%20aus%20Einzelhandels-%20und%20Verbrauchersicht%20261110F.pdf",
+			"year": "2017",
+			"evidence": "Sehr niedrige Qualität der Daten (Mangel an Evidenz)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Wohnungseinbruch",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Finanzieller Verluste aufgrund Identitätsdiebstahl",
+			"info": "Innerhalb eines Jahres",
+			"source": "pwc. (2016). Identitätsklau - die Gefahr aus dem Netz.",
+			"url": "https://www.pwc.de/de/handel-und-konsumguter/assets/cyber-security-identitaetsdiebstahl-2016.pdf",
+			"year": "2016",
+			"evidence": "Sehr niedrige Qualität der Daten (Niedrige Validität), Alter der Daten",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Ziviler Rechtsstreit.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Rechnungen für Einkäufe eines Identitätsdiebs",
+			"info": "Innerhalb eines Jahres",
+			"source": "pwc. (2016). Identitätsklau - die Gefahr aus dem Netz.",
+			"url": "https://www.pwc.de/de/handel-und-konsumguter/assets/cyber-security-identitaetsdiebstahl-2016.pdf",
+			"year": "2016",
+			"evidence": "Sehr niedrige Qualität der Daten (Niedrige Validität), Alter der Daten",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Scheidung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Abmahnung aufgrund eines Identitätsdiebstahls",
+			"info": "Innerhalb eines Jahres",
+			"source": "pwc. (2016). Identitätsklau - die Gefahr aus dem Netz.",
+			"url": "https://www.pwc.de/de/handel-und-konsumguter/assets/cyber-security-identitaetsdiebstahl-2016.pdf",
+			"year": "2016",
+			"evidence": "Sehr niedrige Qualität der Daten (Niedrige Validität), Alter der Daten",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Fahrlässige Körperverletzung § 229 StGB.",
+			"cat": "Recht"
+		},
+		{
+			"title": "Reduzierte Zahlungsoptionen beim Online-Einkauf",
+			"info": "Innerhalb eines Jahres",
+			"source": "Schufa (2018). SCHUFA Kredit-Kompass 2018.",
+			"url": "https://www.schufa.de/media/editorial/ueber_uns/bilder/studien_und_publikationen/kredit_kompass/skk_2018/SCHUFA_Kredit-Kompass-2018.pdf",
+			"year": "2017",
+			"evidence": "Sehr niedrige Qualität der Daten (Niedrige Validität), Verzerrungsrisiko",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Wohnungsbrand.",
+			"cat": "Finanzen"
+		},
+		{
+			"title": "Privatsphäreverletzung erleben",
+			"info": "Innerhalb eines Jahres",
+			"source": "Statistisches Amt der Europäischen Union (2015).",
+			"url": "https://ec.europa.eu/eurostat/de/home",
+			"year": "2015",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leitungswasserschaden.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Opfer von Cyberkriminalität",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2018",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall der Rechtsschutzversicherung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Persönliche digitale Daten werden gestohlen",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2018",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall der Fahrzeugvollversicherung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Virenbefall auf dem eigenen Computer",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall der technischen Versicherung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Eigener Standort ungewollt abgefragt",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall der Wohngebäudeversicherung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Onlinepasswort wird geknackt",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall einer Kraftfahrversicherung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Fremde Personen im privaten W-Lan",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall einer Schadens-/Unfallversicherung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Betrug beim Online-Einkauf",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2018",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall einer Sachversicherung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Digitaler Kreditkarten- bzw. Kontodatenbetrug",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2018",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall der privaten Sachversicherung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "In E-Mail-Konto bzw. soziales Netzwerk eingedrungen",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall der Kraftfahrzeug-Haftpflichtversicherung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Zahlungsdaten werden vom Telefon kopiert",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall der Fahrzeugteilversicherung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Zahlungsdaten nach Online-Einkauf missbraucht",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall der allgemeinen Haftpflichtversicherung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Computer aus der Ferne sabotiert",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall der Schutzbriefversicherung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Opfer von digitalem Identitätsdiebstahl",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall der Hausratversicherung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Auf Smarthome-Gerät greifen Fremde zu",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall der privaten Unfallversicherung.",
+			"cat": "Digitale Risiken"
+		},
+		{
+			"title": "Berufliche Nachteile durch eigene Texte erleben",
+			"info": "Innerhalb eines Jahres",
+			"source": "Symantec. (2017). Norton Cyber Security Insights Report Global Results.",
+			"url": "http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf",
+			"year": "2017",
+			"evidence": "Niedrige Qualität der Daten (Niedrige Validität)",
+			"referenceGroup": "erwachsene Internetnutzer",
+			"comment": "Leistungsfall der Kraftfahrtunfallversicherung.",
+			"cat": "Digitale Risiken"
+		}
+	],
+	"filters": [
+		{
+			"alter": "",
+			"geschlecht": "",
+			"entries": [
+				11100,
+				256,
+				2,
+				1,
+				1.9711965904,
+				2.1849844559,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				24.4950164539,
+				100000,
+				3.244261055,
+				3.7370602026,
+				1.5303346078,
+				30.7914918372,
+				148.2624886446,
+				1238.3281639146,
+				514.158608686,
+				269.4922867935,
+				94.2864878907,
+				20.6673681727,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "",
+			"geschlecht": "m",
+			"entries": [
+				11100,
+				256,
+				2,
+				1,
+				0.4336632499,
+				3.2774766838,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				9.3081062525,
+				105000,
+				4.1202115399,
+				4.9329194674,
+				1.6527613764,
+				32.0231515107,
+				169.0192370548,
+				1498.3770783367,
+				616.9903304232,
+				382.6790472468,
+				158.4012996564,
+				34.3078311667,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "",
+			"geschlecht": "w",
+			"entries": [
+				11100,
+				256,
+				2,
+				1,
+				3.4495940332,
+				1.1361919171,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				39.1920263262,
+				97000,
+				2.3683105701,
+				2.5785715398,
+				1.4232111853,
+				29.5598321637,
+				128.9883651208,
+				990.6625311317,
+				416.4684730357,
+				159.0004492082,
+				31.1145410039,
+				7.2335788604,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "1-13",
+			"geschlecht": "",
+			"entries": [
+				11100,
+				99.84,
+				0.78,
+				0.39,
+				0.0985598295,
+				0.7647445596,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				3.4293023035,
+				98000,
+				0.4866391583,
+				1.5321946831,
+				0.78047065,
+				35.4102156128,
+				56.3397456849,
+				681.080490153,
+				246.7961321693,
+				99.7121461136,
+				33.9431356407,
+				9.5069893594,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "1-13",
+			"geschlecht": "m",
+			"entries": [
+				11100,
+				99.84,
+				0.78,
+				0.39,
+				0.0788478636,
+				0.939543316,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				1.9596013163,
+				98000,
+				0.5190817688,
+				1.7190476932,
+				0.7957739961,
+				37.257705123,
+				62.2702452307,
+				718.2303350705,
+				318.7783373853,
+				132.0512205288,
+				45.2575141875,
+				15.5005261295,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "1-13",
+			"geschlecht": "w",
+			"entries": [
+				11100,
+				99.84,
+				0.78,
+				0.39,
+				0.1379837613,
+				0.5680959585,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				4.6540531262,
+				98000,
+				0.4541965477,
+				1.3453416729,
+				0.7651673039,
+				33.5627261025,
+				48.9266212527,
+				643.9306452356,
+				169.6723408664,
+				67.3730716984,
+				20.743027336,
+				3.3067789076,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "14-17",
+			"geschlecht": "",
+			"entries": [
+				11100,
+				99.84,
+				0.78,
+				0.39,
+				1.4783974428,
+				2.0975850777,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				25.7197672766,
+				110000,
+				3.6335723816,
+				4.297619233,
+				2.1883784892,
+				46.4951526742,
+				268.3551044467,
+				2699.5553973338,
+				1208.2727304121,
+				735.7139429463,
+				297.9453017346,
+				96.7232830482,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "14-17",
+			"geschlecht": "m",
+			"entries": [
+				11100,
+				99.84,
+				0.78,
+				0.39,
+				0.8081906021,
+				2.97157886,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				4.6540531262,
+				100000,
+				5.0934898564,
+				3.7744308046,
+				0.8110773421,
+				42.184343817,
+				293.5597275163,
+				2959.6043117559,
+				1444.7856904077,
+				967.4773095887,
+				442.2036282074,
+				167.8190295623,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "14-17",
+			"geschlecht": "w",
+			"entries": [
+				11100,
+				99.84,
+				0.78,
+				0.39,
+				2.1880282153,
+				1.1361919171,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				48.2551824142,
+				102000,
+				2.0763270752,
+				4.8581782634,
+				3.6574997126,
+				51.1138764498,
+				241.6678564907,
+				2427.1232012726,
+				951.1934260691,
+				487.7810390962,
+				142.372596715,
+				20.460694491,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "18-20",
+			"geschlecht": "",
+			"entries": [
+				11100,
+				412.16,
+				3.22,
+				1.61,
+				2.877947022,
+				5.6591097408,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				55.6036873504,
+				103000,
+				8.6297344063,
+				9.2305387004,
+				3.5656796362,
+				44.0318333272,
+				306.9033514943,
+				3405.4024507652,
+				1578.466928666,
+				1002.5113068718,
+				443.1464930863,
+				89.9030515512,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "18-20",
+			"geschlecht": "m",
+			"entries": [
+				11100,
+				412.16,
+				3.22,
+				1.61,
+				1.0053102611,
+				8.4995895335,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				11.7576078979,
+				103000,
+				12.620175504,
+				10.6506215774,
+				2.157771797,
+				40.0289393884,
+				333.5905994504,
+				4012.1832510833,
+				1928.0947825725,
+				1425.6141971376,
+				718.4630377271,
+				151.4918087059,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "18-20",
+			"geschlecht": "w",
+			"entries": [
+				11100,
+				412.16,
+				3.22,
+				1.61,
+				4.9871273737,
+				2.4908822797,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				104.3487700936,
+				110000,
+				4.1850967609,
+				7.6236028133,
+				5.1419242822,
+				48.6505571028,
+				275.768228879,
+				2736.7052422513,
+				1192.8479721515,
+				533.5947278511,
+				135.7725425626,
+				21.4940628996,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "21-59",
+			"geschlecht": "",
+			"entries": [
+				11100,
+				412.16,
+				3.22,
+				1.61,
+				1.8135008632,
+				3.0371283937,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				37.722325339,
+				103000,
+				3.9255558766,
+				4.9702900695,
+				1.9129182598,
+				33.8706410209,
+				207.5674841024,
+				1646.9764580064,
+				678.6893634655,
+				347.6450499636,
+				117.8581098634,
+				21.9074102631,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "21-59",
+			"geschlecht": "m",
+			"entries": [
+				11100,
+				412.16,
+				3.22,
+				1.61,
+				0.4533752158,
+				4.6321670465,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				13.7172092142,
+				110000,
+				5.0286046353,
+				6.8761907728,
+				2.2342885274,
+				34.794385776,
+				226.8416076262,
+				1956.5584989851,
+				766.0963269421,
+				485.0861162283,
+				197.0587596916,
+				34.9278522119,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "21-59",
+			"geschlecht": "w",
+			"entries": [
+				11100,
+				412.16,
+				3.22,
+				1.61,
+				3.1933384764,
+				1.3546903627,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				62.707242122,
+				102000,
+				2.7900645073,
+				2.9522775601,
+				1.5915479921,
+				32.3310664291,
+				188.2933605786,
+				1325.0111353886,
+				586.140813902,
+				204.8141379631,
+				36.7717302774,
+				8.4736209508,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "60+",
+			"geschlecht": "",
+			"entries": [
+				11100,
+				99.84,
+				0.78,
+				0.39,
+				3.0947786469,
+				0.8521439378,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				5.3889036199,
+				103000,
+				2.5629662335,
+				1.7190476932,
+				0.8110773421,
+				19.3986398574,
+				42.9961217069,
+				284.8154777004,
+				113.1148939109,
+				51.2035344908,
+				9.4286487891,
+				5.1668420432,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "60+",
+			"geschlecht": "m",
+			"entries": [
+				11100,
+				99.84,
+				0.78,
+				0.39,
+				0.4730871817,
+				0.8958436269,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				4.4091029617,
+				99000,
+				2.8225071179,
+				1.8311594993,
+				0.8875940725,
+				20.6302995309,
+				57.8223705714,
+				359.1151675352,
+				143.9644104321,
+				67.3730716984,
+				16.9715678203,
+				6.6135578153,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		},
+		{
+			"alter": "60+",
+			"geschlecht": "w",
+			"entries": [
+				11100,
+				99.84,
+				0.78,
+				0.39,
+				5.2236709646,
+				0.8302940932,
+				538,
+				2478,
+				118,
+				121.9512195122,
+				1500,
+				39,
+				812,
+				607,
+				472,
+				254,
+				205,
+				18523,
+				14703,
+				13440,
+				11846,
+				8109,
+				7492,
+				7477,
+				6637,
+				6312,
+				5850,
+				5321,
+				3892,
+				3753,
+				3185,
+				51,
+				0.029,
+				39000,
+				1424,
+				0.000006,
+				0.15,
+				1.23,
+				30,
+				0.25,
+				0.0000214767,
+				0.0000086873,
+				12.2391304348,
+				806,
+				12600,
+				7900,
+				3700,
+				2000,
+				1100,
+				310,
+				9500,
+				1322.7848101266,
+				5064,
+				3013,
+				840,
+				0.1,
+				16.6855072464,
+				10040,
+				128.9782608696,
+				15.0043478261,
+				90000,
+				15000,
+				7000,
+				300,
+				800,
+				13300,
+				4400,
+				47748.5466548428,
+				32000,
+				6.1237541135,
+				101000,
+				2.3358679596,
+				1.6443064891,
+				0.7498639578,
+				18.4748951023,
+				32.6177475018,
+				210.5157878655,
+				82.2653773898,
+				37.7289201511,
+				3.7714595156,
+				4.1334736345,
+				1000,
+				23000,
+				10000,
+				8000,
+				25000,
+				14000,
+				34800,
+				33300,
+				1730.575,
+				1611.225,
+				1014.475,
+				9400,
+				3000,
+				44250,
+				21675.8333333333,
+				18142.5,
+				13275,
+				12832.5,
+				12390,
+				12000,
+				11168.3333333333,
+				11062.5,
+				10620,
+				10177.5,
+				7522.5,
+				6858.75,
+				5752.5,
+				5310
+			]
+		}
+	]
+}

+ 4732 - 0
data/data_en.json

@@ -0,0 +1,4732 @@
+{
+	"reasons": [
+		{
+			"title": "Death in the course of a lifetime",
+			"info": "",
+			"source": "",
+			"year": "",
+			"evidence": "",
+			"cat": "kaum"
+		},
+		{
+			"title": "Erklettern des Mount Everests",
+			"info": "innerhalb eines Jahres",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Bypass-Operation",
+			"info": "innerhalb eines Jahres",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "etwas"
+		},
+		{
+			"title": "Krankheit des Kreislaufsystems",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Krebserkrankung",
+			"info": "innerhalb eines Jahres",
+			"source": "Eurostat",
+			"year": "2013",
+			"evidence": "moderate",
+			"cat": "etwas"
+		},
+		{
+			"title": "Herzkrankheit mit Durchblutungsstörung",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Herzkrankheit ohne Durchblutungsstörung",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Krankheit des Atmungssystems",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Blutgefäßerkrankung im Gehirn",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Heart Attack",
+			"info": "Within one year",
+			"source": "Enstatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Bösartige Neubildung in den Atemwegen",
+			"info": "innerhalb eines Jahres",
+			"source": "Eurostat",
+			"year": "2013",
+			"evidence": "moderate",
+			"cat": "etwas"
+		},
+		{
+			"title": "Krankheiten des Verdauungssystems",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Hochdruckkrankheit",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Psychische und Verhaltensstörungen",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "kaum"
+		},
+		{
+			"title": "Chronische Krankheiten der unteren Atemwege",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Trinken von Wein",
+			"info": "innerhalb eines Jahres, jeden Tag 2 Gläser",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Fahren mit dem Motorrad",
+			"info": "innerhalb eines Jahres, jeden Tag 10 Kilometer",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Hormon-, Ernährungs- u. Stoffwechselkrankheiten",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Krankheiten der Nervensysteme und Sinnesorgane",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Unfälle mit Spätfolgen",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "kaum"
+		},
+		{
+			"title": "Diabetes Mellitus",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Krankheiten des Urogenitalsystems",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Zigaretten rauchen",
+			"info": "innerhalb eines Jahres, jeden Tag eine Zigarette",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Infektiöse und parasitäre Krankheiten",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Krankheiten der Blutgefäße",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Krankheiten der Niere",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Schlaganfall",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Lungenentzündung",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Krankheiten der Leber",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Leberschädigungen",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Erkrankungen an Herzklappen und Herzwand",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Stürze",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "kaum"
+		},
+		{
+			"title": "Vorsätzliche Selbstbeschädigung",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "stark"
+		},
+		{
+			"title": "Psychische und Verhaltensstörungen durch Alkohol",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "stark"
+		},
+		{
+			"title": "Alkoholmissbrauch",
+			"info": "innerhalb eines Jahres",
+			"source": "Eurostat",
+			"year": "2013",
+			"evidence": "moderate",
+			"cat": "stark"
+		},
+		{
+			"title": "Transportmittelunfälle",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "stark"
+		},
+		{
+			"title": "Krankheiten des Muskel-Skelett-Systems u. Bindegewebes",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Krankheiten des Blutes und der blutbildenden Organe",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Magengeschwüre",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Kanufahren für zwei Stunden",
+			"info": "innerhalb eines Jahres",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Krankheiten der Haut und der Unterhaut",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Asthma",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Virenbedingte Leberentzündung",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Rheumatoide Arthritis",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Substanzbedingte psychische und Verhaltensstörungen",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "stark"
+		},
+		{
+			"title": "Drogenabhängigkeit",
+			"info": "innerhalb eines Jahres",
+			"source": "Eurostat",
+			"year": "2013",
+			"evidence": "moderate",
+			"cat": "stark"
+		},
+		{
+			"title": "Vergiftung durch schädliche Substanz",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "stark"
+		},
+		{
+			"title": "Fliegen mit einem Flugzeug",
+			"info": "innerhalb eines Jahres 10,000 km",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Ein Fallschirmsprung",
+			"info": "innerhalb eines Jahres",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Leben in Denver",
+			"info": "innerhalb eines Jahres",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Leben mit einem Raucher",
+			"info": "innerhalb eines Jahres",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Ein Tauchgang",
+			"info": "innerhalb eines Jahres",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Totschlag und Totschlag",
+			"info": "innerhalb eines Jahres",
+			"source": "EIGE",
+			"year": "2013",
+			"evidence": "high",
+			"cat": "kaum"
+		},
+		{
+			"title": "Ertrinken und Untergehen",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "stark"
+		},
+		{
+			"title": "HIV-Erkrankung",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Tätlicher Angriff",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "kaum"
+		},
+		{
+			"title": "Rauch, Feuer und Flammen ausgesetzt zu sein",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "kaum"
+		},
+		{
+			"title": "Tuberkulose-Folgen",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Hirnhautentzündung",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "100 kohlegegrillte Steaks essen",
+			"info": "innerhalb eines Jahres",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Eine Röntgenuntersuchung",
+			"info": "innerhalb eines Jahres",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "40 Löffel Erdnussbutter essen",
+			"info": "innerhalb eines Jahres",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Trinken von natürlichem Wasser in Miami",
+			"info": "innerhalb eines Jahres",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Flugzeugabsturz",
+			"info": "innerhalb eines Jahres",
+			"source": "http://www.spiegel.de/reise/aktuell/flugzeugunglueck-bilanz-2014-zahl-der-toten-stieg-ums-vierfache-a-1011414.html  ",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "stark"
+		},
+		{
+			"title": "Besuch einer Kohlengrube für drei Stunden",
+			"info": "innerhalb eines Jahres",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Mit dem Zug fahren",
+			"info": "innerhalb eines Jahres 10,000 km",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Nehmen einer Pille Ecstasy",
+			"info": "innerhalb eines Jahres",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		},
+		{
+			"title": "Grippe",
+			"info": "innerhalb eines Jahres",
+			"source": "Destatis",
+			"year": "2014",
+			"evidence": "high",
+			"cat": "etwas"
+		},
+		{
+			"title": "Exploding like an atomic bomb",
+			"info": "Within one year",
+			"source": "Nostatis",
+			"year": "404",
+			"evidence": "fair",
+			"cat": "etwas"
+		},
+		{
+			"title": "Terroristenangriff",
+			"info": "innerhalb eines Jahres",
+			"source": "http://blog.zeit.de/teilchen/2016/03/23/terror-in-zahlen/ ",
+			"year": "2016",
+			"evidence": "high",
+			"cat": "kaum"
+		},
+		{
+			"title": "Innerhalb von 32 km um ein Atomkraftwerk leben",
+			"info": "innerhalb eines Jahres",
+			"source": "wiki",
+			"year": "2010",
+			"evidence": "low",
+			"cat": "stark"
+		}
+	],
+	"filters": [
+		{
+			"alter": "",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				3500,
+				1600,
+				418.55,
+				256.17,
+				150.02,
+				98.69,
+				72.56,
+				68.38,
+				62.03,
+				55.18,
+				47.71,
+				46.04,
+				44.49,
+				37.14,
+				36.5,
+				36.5,
+				36.24,
+				32.05,
+				28.2,
+				28.03,
+				27.54,
+				25.55,
+				22.27,
+				22.13,
+				20.81,
+				20.74,
+				20.69,
+				18.25,
+				16.75,
+				16.05,
+				14.34,
+				12.64,
+				6.33,
+				6.26,
+				4.61,
+				4.11,
+				3.63,
+				2.79,
+				2,
+				1.75,
+				1.26,
+				1.06,
+				1.03,
+				1.01,
+				0.97,
+				0.81,
+				0.72,
+				0.7,
+				0.6,
+				0.6,
+				0.5,
+				0.49,
+				0.48,
+				0.48,
+				0.46,
+				0.43,
+				0.38,
+				0.15,
+				0.1,
+				0.1,
+				0.1,
+				0.1,
+				0.1,
+				0.1,
+				0.1,
+				0.1,
+				0.1,
+				0.04,
+				0.01,
+				0.01
+			]
+		},
+		{
+			"alter": "",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				3850,
+				1840,
+				477.147,
+				281.787,
+				172.523,
+				112.5066,
+				79.816,
+				78.637,
+				70.7142,
+				60.698,
+				54.8665,
+				52.4856,
+				48.939,
+				40.854,
+				41.61,
+				41.975,
+				41.676,
+				36.537,
+				32.43,
+				30.833,
+				31.671,
+				28.105,
+				25.3878,
+				24.343,
+				23.9315,
+				23.851,
+				23.5866,
+				20.075,
+				19.2625,
+				18.297,
+				16.3476,
+				14.4096,
+				6.963,
+				7.199,
+				5.2554,
+				4.521,
+				4.1745,
+				3.1806,
+				2.3,
+				1.925,
+				1.449,
+				1.2084,
+				1.133,
+				1.1514,
+				1.067,
+				0.9315,
+				0.792,
+				0.805,
+				0.69,
+				0.684,
+				0.57,
+				0.539,
+				0.528,
+				0.552,
+				0.506,
+				0.4945,
+				0.4332,
+				0.165,
+				0.11,
+				0.115,
+				0.114,
+				0.115,
+				0.114,
+				0.11,
+				0.115,
+				0.114,
+				0.115,
+				0.0456,
+				0.0114,
+				0.012
+			]
+		},
+		{
+			"alter": "",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				3325,
+				1568,
+				397.6225,
+				204.936,
+				147.0196,
+				93.7555,
+				71.1088,
+				64.961,
+				49.624,
+				54.0764,
+				45.3245,
+				36.832,
+				42.2655,
+				36.3972,
+				35.77,
+				29.2,
+				34.428,
+				25.64,
+				22.56,
+				27.4694,
+				26.163,
+				24.2725,
+				17.816,
+				21.6874,
+				19.7695,
+				16.592,
+				20.2762,
+				17.3375,
+				13.4,
+				15.729,
+				14.0532,
+				12.3872,
+				6.0135,
+				5.008,
+				4.5178,
+				3.9045,
+				2.904,
+				2.7342,
+				1.6,
+				1.6625,
+				1.008,
+				1.0388,
+				0.9785,
+				0.9898,
+				0.9215,
+				0.648,
+				0.684,
+				0.56,
+				0.48,
+				0.588,
+				0.49,
+				0.4655,
+				0.456,
+				0.384,
+				0.437,
+				0.344,
+				0.3724,
+				0.1425,
+				0.095,
+				0.08,
+				0.098,
+				0.08,
+				0.098,
+				0.095,
+				0.08,
+				0.098,
+				0.08,
+				0.0392,
+				0.0098,
+				0.0095
+			]
+		},
+		{
+			"alter": "0",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				4147.5,
+				851.36,
+				417.671045,
+				323.055987,
+				101.683556,
+				56.608584,
+				57.97544,
+				92.901068,
+				90.12959,
+				55.654548,
+				64.064988,
+				67.301272,
+				60.831177,
+				44.86512,
+				34.49615,
+				29.7767,
+				33.355296,
+				21.96707,
+				31.17792,
+				30.625578,
+				38.052018,
+				22.992445,
+				11.656118,
+				20.122809,
+				23.875313,
+				24.941924,
+				21.279665,
+				13.119925,
+				15.0817,
+				23.43942,
+				8.79042,
+				10.18784,
+				8.682228,
+				8.51673,
+				3.613318,
+				3.577755,
+				4.405731,
+				2.393262,
+				1.1476,
+				2.386125,
+				1.198764,
+				1.044418,
+				1.063063,
+				0.904657,
+				0.540969,
+				0.975402,
+				0.886896,
+				0.56987,
+				0.43122,
+				0.43776,
+				0.2734,
+				0.41258,
+				0.513792,
+				0.706032,
+				0.325496,
+				0.281521,
+				0.551152,
+				0.150435,
+				0.10007,
+				0.079,
+				0.05026,
+				0.11572,
+				0.06187,
+				0.11915,
+				0.10325,
+				0.09508,
+				0.10699,
+				0.045024,
+				0.005341,
+				0.013624
+			]
+		},
+		{
+			"alter": "1-14",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				3417.4,
+				1231.2,
+				288.422805,
+				288.575505,
+				102.418654,
+				80.175756,
+				100.270664,
+				92.429246,
+				82.195953,
+				31.64573,
+				35.262461,
+				48.751756,
+				42.105336,
+				24.386124,
+				41.2231,
+				45.83305,
+				29.575464,
+				18.438365,
+				40.3119,
+				18.749267,
+				35.785476,
+				30.19499,
+				17.212483,
+				19.551855,
+				30.422139,
+				21.438938,
+				14.102304,
+				15.9943,
+				10.051675,
+				20.227815,
+				15.57324,
+				7.458864,
+				8.503089,
+				5.041178,
+				5.964879,
+				2.735616,
+				4.720089,
+				1.987317,
+				2.8248,
+				2.3534,
+				0.747306,
+				0.742742,
+				1.418825,
+				1.164429,
+				0.716345,
+				1.181871,
+				1.034856,
+				0.5684,
+				0.6999,
+				0.7887,
+				0.71975,
+				0.324282,
+				0.455808,
+				0.479328,
+				0.293986,
+				0.363049,
+				0.372894,
+				0.139665,
+				0.13028,
+				0.14019,
+				0.06569,
+				0.14931,
+				0.0827,
+				0.11328,
+				0.06931,
+				0.14217,
+				0.14096,
+				0.02126,
+				0.010484,
+				0.011509
+			]
+		},
+		{
+			"alter": "15-19",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				2571.1,
+				1258.24,
+				482.25331,
+				354.564897,
+				134.897984,
+				146.594126,
+				94.661776,
+				87.984546,
+				65.398229,
+				66.944376,
+				70.090761,
+				66.062796,
+				61.801059,
+				26.543958,
+				28.12325,
+				28.78025,
+				48.626832,
+				21.51837,
+				15.69612,
+				16.03316,
+				30.412422,
+				16.59728,
+				16.061124,
+				30.5394,
+				27.766783,
+				10.811762,
+				12.914698,
+				14.94675,
+				22.342825,
+				16.44162,
+				15.538824,
+				18.65664,
+				7.461171,
+				5.662796,
+				6.260841,
+				3.542409,
+				4.269606,
+				1.715013,
+				1.7476,
+				2.3576,
+				0.882,
+				0.545582,
+				1.539026,
+				0.680134,
+				1.164873,
+				0.931176,
+				0.527112,
+				0.78981,
+				0.74226,
+				0.32508,
+				0.74095,
+				0.467607,
+				0.351408,
+				0.46128,
+				0.3542,
+				0.526406,
+				0.28139,
+				0.076755,
+				0.12945,
+				0.05438,
+				0.1394,
+				0.11283,
+				0.07321,
+				0.11283,
+				0.14819,
+				0.09239,
+				0.11609,
+				0.041488,
+				0.008657,
+				0.007718
+			]
+		},
+		{
+			"alter": "20-24",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				3544.8,
+				1377.12,
+				388.4144,
+				367.040376,
+				95.03767,
+				95.591134,
+				50.57432,
+				71.01263,
+				53.010838,
+				80.8387,
+				60.777769,
+				60.74978,
+				25.617342,
+				46.855824,
+				35.70795,
+				23.94035,
+				25.0962,
+				18.758865,
+				30.95232,
+				41.083571,
+				37.974906,
+				35.716345,
+				27.668248,
+				12.063063,
+				18.785187,
+				18.350752,
+				18.637552,
+				21.931025,
+				12.93435,
+				11.541555,
+				15.865776,
+				10.670688,
+				4.3044,
+				7.874454,
+				6.351197,
+				3.981357,
+				5.349168,
+				2.127933,
+				2.5704,
+				1.19945,
+				1.345554,
+				1.06318,
+				0.963256,
+				1.38976,
+				1.411544,
+				0.451494,
+				0.690768,
+				0.71834,
+				0.38496,
+				0.83352,
+				0.71595,
+				0.66787,
+				0.261792,
+				0.599568,
+				0.402592,
+				0.497166,
+				0.47006,
+				0.105105,
+				0.0759,
+				0.10584,
+				0.05652,
+				0.05795,
+				0.12369,
+				0.14403,
+				0.14732,
+				0.12488,
+				0.11748,
+				0.03434,
+				0.011486,
+				0.014543
+			]
+		},
+		{
+			"alter": "25-29",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				3144.05,
+				890.4,
+				449.94125,
+				205.243404,
+				82.165954,
+				138.195607,
+				60.892352,
+				83.32103,
+				90.824326,
+				68.94741,
+				26.450424,
+				37.743592,
+				47.137155,
+				48.267144,
+				41.76695,
+				37.9162,
+				53.482992,
+				30.546855,
+				17.51784,
+				35.819537,
+				23.28507,
+				23.988895,
+				32.574329,
+				18.930002,
+				30.492893,
+				19.010284,
+				11.532606,
+				20.865225,
+				18.155325,
+				21.418725,
+				15.676488,
+				12.55784,
+				6.668655,
+				8.6075,
+				2.305,
+				4.813221,
+				3.344682,
+				1.573839,
+				1.5816,
+				2.2218,
+				0.893214,
+				1.449126,
+				1.35136,
+				1.408243,
+				1.308239,
+				0.618273,
+				0.645912,
+				0.40852,
+				0.41532,
+				0.55548,
+				0.41615,
+				0.359317,
+				0.304992,
+				0.371568,
+				0.407376,
+				0.457305,
+				0.387182,
+				0.17094,
+				0.14088,
+				0.09456,
+				0.14782,
+				0.09116,
+				0.13513,
+				0.09154,
+				0.14083,
+				0.14316,
+				0.10925,
+				0.039712,
+				0.013843,
+				0.005944
+			]
+		},
+		{
+			"alter": "30-34",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				4734.1,
+				1397.76,
+				538.42272,
+				376.82607,
+				101.143484,
+				91.347464,
+				89.437456,
+				71.792162,
+				76.42096,
+				47.101648,
+				39.93327,
+				48.48012,
+				47.617647,
+				46.469568,
+				25.6303,
+				49.5305,
+				21.787488,
+				43.687355,
+				41.80368,
+				19.820013,
+				23.461326,
+				35.01883,
+				11.509136,
+				20.474676,
+				23.573568,
+				22.09847,
+				23.239008,
+				12.63995,
+				23.816825,
+				23.73153,
+				13.208574,
+				7.984688,
+				7.91883,
+				4.301246,
+				5.21391,
+				5.730984,
+				4.208985,
+				2.050371,
+				1.9958,
+				2.474325,
+				1.84023,
+				1.294048,
+				1.198611,
+				0.862641,
+				1.144891,
+				0.919593,
+				0.71424,
+				0.44604,
+				0.88392,
+				0.52224,
+				0.52805,
+				0.546742,
+				0.639936,
+				0.500112,
+				0.431526,
+				0.311793,
+				0.552406,
+				0.08607,
+				0.10994,
+				0.06345,
+				0.14142,
+				0.0603,
+				0.11422,
+				0.05962,
+				0.10362,
+				0.06238,
+				0.07814,
+				0.052708,
+				0.005687,
+				0.007077
+			]
+		},
+		{
+			"alter": "35-39",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				2391.55,
+				1084.64,
+				329.39885,
+				284.297466,
+				218.924186,
+				59.11531,
+				82.769192,
+				102.050312,
+				38.471006,
+				71.938166,
+				50.176607,
+				43.033588,
+				52.440363,
+				24.794664,
+				35.4488,
+				42.70865,
+				25.320888,
+				19.07616,
+				25.50972,
+				32.091547,
+				40.19463,
+				38.250905,
+				12.976729,
+				27.523081,
+				14.96239,
+				30.931636,
+				30.358437,
+				19.835925,
+				12.5625,
+				12.79827,
+				9.656556,
+				11.3444,
+				6.802218,
+				3.413578,
+				6.682656,
+				2.191863,
+				2.950464,
+				3.417192,
+				1.1296,
+				1.19735,
+				1.75455,
+				0.93863,
+				0.889714,
+				0.798102,
+				1.446658,
+				1.136187,
+				0.574848,
+				1.03131,
+				0.85788,
+				0.53802,
+				0.37585,
+				0.378182,
+				0.418896,
+				0.675072,
+				0.552414,
+				0.494328,
+				0.278198,
+				0.169245,
+				0.11976,
+				0.05255,
+				0.13005,
+				0.07288,
+				0.08124,
+				0.06046,
+				0.14835,
+				0.09773,
+				0.14819,
+				0.05904,
+				0.009239,
+				0.014403
+			]
+		},
+		{
+			"alter": "40-44",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				2902.9,
+				2325.76,
+				390.42344,
+				233.191551,
+				188.2751,
+				83.462133,
+				56.48796,
+				53.056042,
+				66.378303,
+				60.096538,
+				38.88365,
+				39.193852,
+				28.469151,
+				21.834606,
+				44.67965,
+				48.1435,
+				32.547144,
+				24.931695,
+				23.88822,
+				31.371176,
+				16.176996,
+				17.248805,
+				27.619254,
+				21.390858,
+				22.512258,
+				29.946486,
+				16.400963,
+				26.420525,
+				9.22255,
+				20.083365,
+				18.40539,
+				9.704992,
+				8.580315,
+				6.124784,
+				6.306941,
+				4.580595,
+				2.542815,
+				2.662776,
+				2.8312,
+				1.763475,
+				0.755874,
+				0.620418,
+				0.847999,
+				0.795476,
+				0.785991,
+				0.516456,
+				0.378072,
+				1.00702,
+				0.41754,
+				0.88992,
+				0.4062,
+				0.253575,
+				0.422592,
+				0.37224,
+				0.429732,
+				0.313384,
+				0.298262,
+				0.092625,
+				0.0656,
+				0.10824,
+				0.08417,
+				0.10678,
+				0.12521,
+				0.14318,
+				0.05336,
+				0.0771,
+				0.05954,
+				0.046352,
+				0.009508,
+				0.01162
+			]
+		},
+		{
+			"alter": "45-49",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				2173.5,
+				901.6,
+				572.199705,
+				374.315604,
+				124.336576,
+				87.962397,
+				90.7,
+				37.944062,
+				77.996522,
+				68.086602,
+				62.767276,
+				28.82104,
+				57.129609,
+				33.418572,
+				25.5865,
+				22.05695,
+				34.692552,
+				35.41525,
+				19.98252,
+				21.796128,
+				34.807806,
+				36.01017,
+				28.073562,
+				27.666926,
+				20.447906,
+				19.978842,
+				15.457499,
+				14.503275,
+				10.781975,
+				16.95843,
+				18.877176,
+				15.946624,
+				6.373677,
+				9.059472,
+				3.25927,
+				2.948514,
+				4.470708,
+				2.761263,
+				1.1228,
+				1.751225,
+				1.600074,
+				0.573884,
+				0.822249,
+				1.011919,
+				0.494215,
+				0.957744,
+				0.395496,
+				0.73773,
+				0.34152,
+				0.64422,
+				0.2893,
+				0.588931,
+				0.53904,
+				0.402048,
+				0.584522,
+				0.287627,
+				0.23731,
+				0.19554,
+				0.12014,
+				0.09145,
+				0.09572,
+				0.05894,
+				0.12621,
+				0.14874,
+				0.14171,
+				0.13074,
+				0.06483,
+				0.054048,
+				0.009467,
+				0.009341
+			]
+		},
+		{
+			"alter": "50-54",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				4951.1,
+				1988.8,
+				395.990155,
+				168.457392,
+				135.438056,
+				131.385997,
+				77.871392,
+				48.522448,
+				91.624513,
+				55.466936,
+				32.065891,
+				23.15812,
+				51.621747,
+				32.452932,
+				20.0677,
+				35.96345,
+				27.422808,
+				34.892835,
+				29.26596,
+				27.822578,
+				35.848818,
+				16.37755,
+				32.53647,
+				15.444527,
+				26.774146,
+				15.832916,
+				26.944587,
+				14.065275,
+				24.8838,
+				13.79979,
+				20.001432,
+				7.95688,
+				6.603456,
+				3.306532,
+				6.709394,
+				4.218504,
+				2.397252,
+				3.352185,
+				1.051,
+				2.441775,
+				1.736028,
+				0.792138,
+				1.498753,
+				1.283306,
+				0.924022,
+				0.955314,
+				0.67716,
+				1.01717,
+				0.7386,
+				0.35178,
+				0.6259,
+				0.712264,
+				0.558624,
+				0.5256,
+				0.230782,
+				0.627499,
+				0.565896,
+				0.145545,
+				0.06728,
+				0.07849,
+				0.05343,
+				0.10864,
+				0.10189,
+				0.08892,
+				0.05619,
+				0.08127,
+				0.12229,
+				0.048536,
+				0.009115,
+				0.007878
+			]
+		},
+		{
+			"alter": "55-59",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				3058.3,
+				1667.2,
+				590.1555,
+				362.22438,
+				91.332176,
+				84.468771,
+				39.588736,
+				94.938792,
+				71.570214,
+				63.970174,
+				57.686161,
+				60.809632,
+				49.014633,
+				50.755524,
+				41.67935,
+				33.8355,
+				51.562272,
+				36.129965,
+				22.42182,
+				23.256491,
+				15.962184,
+				25.29961,
+				33.126625,
+				26.994174,
+				30.942389,
+				27.492944,
+				24.037642,
+				23.274225,
+				8.594425,
+				17.258565,
+				12.88449,
+				14.742032,
+				4.638624,
+				3.454268,
+				2.794121,
+				4.063146,
+				3.64452,
+				1.93626,
+				1.1724,
+				1.195425,
+				1.347948,
+				1.317474,
+				0.846763,
+				1.037674,
+				1.050704,
+				0.583524,
+				0.726912,
+				0.82558,
+				0.76134,
+				0.76164,
+				0.2927,
+				0.56301,
+				0.318096,
+				0.400704,
+				0.53636,
+				0.624919,
+				0.43358,
+				0.198825,
+				0.08026,
+				0.14735,
+				0.10623,
+				0.13365,
+				0.1079,
+				0.06167,
+				0.09375,
+				0.09071,
+				0.14474,
+				0.021656,
+				0.01014,
+				0.005391
+			]
+		},
+		{
+			"alter": "60-64",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				2604.7,
+				913.12,
+				501.92516,
+				170.583603,
+				127.89205,
+				50.795743,
+				49.696344,
+				54.478346,
+				63.413269,
+				45.269672,
+				54.985775,
+				39.115584,
+				55.83495,
+				32.378652,
+				35.8941,
+				46.3696,
+				35.544192,
+				31.630145,
+				23.66826,
+				24.287995,
+				37.418598,
+				31.091795,
+				24.091686,
+				18.752962,
+				15.432696,
+				25.889742,
+				28.030812,
+				22.27595,
+				20.339525,
+				19.162095,
+				10.266006,
+				16.835216,
+				5.410251,
+				4.139112,
+				5.095894,
+				3.245667,
+				2.560965,
+				1.54566,
+				2.6176,
+				1.440775,
+				1.559124,
+				0.959618,
+				1.464042,
+				0.60701,
+				0.787155,
+				0.869049,
+				1.078704,
+				0.84413,
+				0.63936,
+				0.68382,
+				0.40705,
+				0.414834,
+				0.298896,
+				0.540192,
+				0.592112,
+				0.584413,
+				0.463562,
+				0.14694,
+				0.08295,
+				0.11137,
+				0.12943,
+				0.05875,
+				0.14829,
+				0.14798,
+				0.09145,
+				0.10885,
+				0.06956,
+				0.038788,
+				0.012361,
+				0.014377
+			]
+		},
+		{
+			"alter": "65-69",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				2552.9,
+				946.4,
+				593.58761,
+				357.946341,
+				131.687556,
+				136.202069,
+				66.305328,
+				42.751176,
+				59.741093,
+				33.90811,
+				66.402778,
+				31.23814,
+				50.522844,
+				52.333974,
+				26.6742,
+				53.9908,
+				34.341024,
+				47.815395,
+				31.7391,
+				40.060476,
+				14.530104,
+				28.35539,
+				16.629009,
+				16.66389,
+				27.125835,
+				15.4513,
+				13.330567,
+				21.606175,
+				22.56895,
+				9.429375,
+				20.673978,
+				7.920224,
+				5.132997,
+				4.800168,
+				5.23696,
+				5.206548,
+				4.487406,
+				2.112867,
+				2.3238,
+				2.328025,
+				0.87066,
+				1.129642,
+				1.5244,
+				1.030301,
+				1.197077,
+				0.828549,
+				0.661104,
+				0.49126,
+				0.39642,
+				0.5448,
+				0.74915,
+				0.670369,
+				0.655344,
+				0.677856,
+				0.267996,
+				0.335228,
+				0.265012,
+				0.190425,
+				0.06441,
+				0.13055,
+				0.09211,
+				0.08871,
+				0.09828,
+				0.06889,
+				0.13565,
+				0.08294,
+				0.12686,
+				0.024236,
+				0.013231,
+				0.014927
+			]
+		},
+		{
+			"alter": "70-74",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				3408.3,
+				1563.84,
+				392.68361,
+				130.826019,
+				84.16122,
+				118.309572,
+				84.793616,
+				36.13883,
+				88.138427,
+				42.262362,
+				47.209045,
+				67.140132,
+				57.191895,
+				27.936708,
+				48.7202,
+				38.75935,
+				26.404464,
+				31.12055,
+				34.32504,
+				24.408524,
+				16.843464,
+				22.972005,
+				13.789584,
+				17.876614,
+				23.742129,
+				14.95354,
+				14.106442,
+				22.85265,
+				17.5875,
+				17.701545,
+				7.620276,
+				15.059296,
+				4.95639,
+				8.209364,
+				2.896002,
+				2.683008,
+				2.616504,
+				3.79161,
+				1.5614,
+				2.3723,
+				1.374912,
+				0.903862,
+				0.621708,
+				1.352188,
+				0.656108,
+				1.086858,
+				0.69192,
+				0.57925,
+				0.50724,
+				0.5226,
+				0.5597,
+				0.425908,
+				0.555984,
+				0.30696,
+				0.471178,
+				0.418218,
+				0.487616,
+				0.11907,
+				0.11588,
+				0.07701,
+				0.13558,
+				0.05779,
+				0.11005,
+				0.09486,
+				0.14907,
+				0.12008,
+				0.07737,
+				0.039192,
+				0.005721,
+				0.011674
+			]
+		},
+		{
+			"alter": "75-79",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				2343.6,
+				1156.48,
+				566.674845,
+				261.370251,
+				105.61408,
+				52.315569,
+				38.231864,
+				57.726396,
+				83.821139,
+				29.891006,
+				56.073563,
+				48.54918,
+				49.704228,
+				38.47704,
+				37.39425,
+				41.24135,
+				36.279864,
+				23.55675,
+				16.64928,
+				22.959373,
+				15.865794,
+				19.665835,
+				12.230684,
+				29.023495,
+				13.070761,
+				23.761818,
+				20.416892,
+				26.76545,
+				15.76175,
+				20.21979,
+				18.389616,
+				15.963056,
+				7.939086,
+				8.450374,
+				4.543616,
+				4.390713,
+				4.726623,
+				2.340531,
+				2.0956,
+				1.832425,
+				1.37529,
+				1.516012,
+				0.581126,
+				0.811535,
+				1.213955,
+				0.983988,
+				0.412416,
+				0.8708,
+				0.7554,
+				0.68772,
+				0.45465,
+				0.271313,
+				0.314592,
+				0.39456,
+				0.381662,
+				0.549884,
+				0.518624,
+				0.120465,
+				0.12364,
+				0.13321,
+				0.14467,
+				0.0889,
+				0.08753,
+				0.07595,
+				0.1101,
+				0.05322,
+				0.14124,
+				0.02458,
+				0.011453,
+				0.014429
+			]
+		},
+		{
+			"alter": "80-84",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				2366.35,
+				1615.52,
+				444.66752,
+				184.134996,
+				152.64535,
+				144.205828,
+				105.770712,
+				95.041362,
+				32.305224,
+				63.048668,
+				60.291127,
+				62.711084,
+				53.637144,
+				47.498346,
+				31.03595,
+				28.1853,
+				44.847,
+				38.45359,
+				38.27586,
+				20.666519,
+				39.167388,
+				13.4904,
+				13.809627,
+				13.25587,
+				28.056042,
+				12.514516,
+				12.490553,
+				11.787675,
+				22.339475,
+				12.28146,
+				20.440236,
+				12.019376,
+				7.403568,
+				7.484456,
+				6.198606,
+				2.889741,
+				3.824568,
+				1.85256,
+				2.8914,
+				1.21135,
+				1.516158,
+				0.694724,
+				1.093654,
+				0.90092,
+				1.297472,
+				0.919593,
+				0.53892,
+				0.62118,
+				0.77442,
+				0.67998,
+				0.6638,
+				0.495831,
+				0.379248,
+				0.41592,
+				0.46667,
+				0.610213,
+				0.34732,
+				0.163335,
+				0.06493,
+				0.13109,
+				0.13885,
+				0.12543,
+				0.12726,
+				0.09662,
+				0.06687,
+				0.13696,
+				0.0701,
+				0.031396,
+				0.006247,
+				0.010199
+			]
+		},
+		{
+			"alter": "85+",
+			"geschlecht": "",
+			"entries": [
+				100000,
+				2108.4,
+				1831.84,
+				237.90382,
+				158.8254,
+				124.021534,
+				136.261283,
+				102.628864,
+				81.023462,
+				76.774531,
+				81.96989,
+				59.150858,
+				50.294096,
+				39.19569,
+				38.075928,
+				53.62215,
+				54.33755,
+				49.967712,
+				35.90882,
+				41.42862,
+				21.426132,
+				40.69035,
+				32.170005,
+				12.658268,
+				19.403584,
+				23.459113,
+				25.640862,
+				11.83468,
+				19.4253,
+				14.9946,
+				12.748515,
+				8.820534,
+				18.039808,
+				5.321631,
+				7.160814,
+				3.274483,
+				2.198028,
+				2.890206,
+				4.02597,
+				1.2692,
+				2.505125,
+				1.691172,
+				0.720588,
+				0.774869,
+				1.063934,
+				1.312895,
+				0.654561,
+				0.4752,
+				0.90657,
+				0.79866,
+				0.70398,
+				0.41165,
+				0.463148,
+				0.664224,
+				0.598032,
+				0.538706,
+				0.623242,
+				0.207632,
+				0.16332,
+				0.0793,
+				0.11201,
+				0.09507,
+				0.10024,
+				0.06672,
+				0.13024,
+				0.07008,
+				0.12735,
+				0.07174,
+				0.037492,
+				0.005901,
+				0.012322
+			]
+		},
+		{
+			"alter": "0",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				2625.35,
+				1798.24,
+				282.897945,
+				165.255267,
+				169.74763,
+				138.343642,
+				67.647688,
+				44.727358,
+				84.249146,
+				41.638828,
+				42.170869,
+				57.02054,
+				53.414694,
+				27.268188,
+				34.7845,
+				19.39245,
+				48.09048,
+				18.83899,
+				41.5104,
+				20.635686,
+				34.832592,
+				13.19402,
+				12.520194,
+				31.920312,
+				20.181538,
+				27.42865,
+				22.959693,
+				11.2128,
+				18.6863,
+				9.272085,
+				18.280632,
+				6.842032,
+				8.851872,
+				3.908118,
+				5.08022,
+				2.550666,
+				4.78797,
+				1.502694,
+				1.334,
+				1.428175,
+				1.4175,
+				0.882344,
+				0.789186,
+				0.935361,
+				1.363432,
+				0.704052,
+				0.760968,
+				0.75348,
+				0.82668,
+				0.5055,
+				0.2651,
+				0.634256,
+				0.549504,
+				0.58656,
+				0.35121,
+				0.616104,
+				0.4199,
+				0.089265,
+				0.08994,
+				0.07296,
+				0.08572,
+				0.1434,
+				0.13305,
+				0.12246,
+				0.0972,
+				0.07019,
+				0.12408,
+				0.042368,
+				0.006818,
+				0.008631
+			]
+		},
+		{
+			"alter": "1-14",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				5133.45,
+				2272.48,
+				343.420275,
+				309.402126,
+				114.0152,
+				91.850783,
+				65.73936,
+				56.023734,
+				46.603139,
+				55.51108,
+				34.513414,
+				24.751104,
+				64.207968,
+				21.452064,
+				48.8662,
+				30.13075,
+				39.077592,
+				43.67774,
+				18.62328,
+				32.20647,
+				37.575576,
+				15.628935,
+				19.980644,
+				11.66251,
+				13.668008,
+				14.350006,
+				24.163851,
+				23.42205,
+				19.679575,
+				19.28889,
+				20.57073,
+				10.403984,
+				4.261356,
+				6.439036,
+				4.244427,
+				2.821926,
+				2.368938,
+				3.527118,
+				1.688,
+				1.655675,
+				1.10565,
+				1.436512,
+				1.39256,
+				1.067873,
+				0.647572,
+				0.98172,
+				0.740448,
+				0.48748,
+				0.64338,
+				0.64464,
+				0.3638,
+				0.408709,
+				0.426816,
+				0.596448,
+				0.263396,
+				0.443502,
+				0.542488,
+				0.14517,
+				0.08872,
+				0.10799,
+				0.10212,
+				0.12052,
+				0.0716,
+				0.07229,
+				0.09248,
+				0.06783,
+				0.14675,
+				0.046144,
+				0.006846,
+				0.009038
+			]
+		},
+		{
+			"alter": "15-19",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				4937.1,
+				1064.96,
+				538.59014,
+				208.881018,
+				162.876714,
+				84.932614,
+				78.901744,
+				83.786014,
+				78.263251,
+				66.122194,
+				50.887486,
+				56.058304,
+				51.243582,
+				36.393486,
+				52.79725,
+				31.8134,
+				44.154816,
+				30.700695,
+				25.74942,
+				30.662017,
+				21.49497,
+				27.26185,
+				13.426583,
+				31.196661,
+				25.975042,
+				29.946486,
+				14.443689,
+				13.035975,
+				14.229125,
+				9.70383,
+				12.00975,
+				7.314768,
+				4.008789,
+				7.232178,
+				3.059657,
+				5.061054,
+				2.824866,
+				2.146905,
+				2.7306,
+				1.4931,
+				1.010142,
+				1.224618,
+				0.825442,
+				1.231897,
+				0.929648,
+				1.138212,
+				0.959688,
+				0.89943,
+				0.68256,
+				0.77766,
+				0.64545,
+				0.516068,
+				0.269136,
+				0.711024,
+				0.647128,
+				0.590906,
+				0.259996,
+				0.18495,
+				0.0679,
+				0.11098,
+				0.14555,
+				0.12379,
+				0.09443,
+				0.07905,
+				0.08246,
+				0.11393,
+				0.13458,
+				0.020608,
+				0.009079,
+				0.014627
+			]
+		},
+		{
+			"alter": "20-24",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				5160.05,
+				2120.8,
+				525.573235,
+				224.814792,
+				104.03887,
+				120.589311,
+				38.028696,
+				88.894,
+				82.903095,
+				82.720338,
+				52.09932,
+				54.60344,
+				59.968071,
+				41.199402,
+				50.26415,
+				29.3679,
+				19.359408,
+				24.611195,
+				40.3401,
+				41.90485,
+				18.000144,
+				18.516085,
+				19.97619,
+				20.704828,
+				14.269417,
+				16.484152,
+				20.216199,
+				20.507525,
+				16.651175,
+				14.016465,
+				7.783752,
+				7.94424,
+				9.269019,
+				8.98623,
+				4.679611,
+				5.788524,
+				4.724082,
+				2.023866,
+				2.0524,
+				0.9562,
+				1.254456,
+				0.86867,
+				0.987255,
+				0.786285,
+				0.859905,
+				0.761724,
+				0.592056,
+				0.588,
+				0.57702,
+				0.5928,
+				0.54755,
+				0.440167,
+				0.443472,
+				0.248064,
+				0.465152,
+				0.410994,
+				0.414048,
+				0.17151,
+				0.10129,
+				0.12142,
+				0.06323,
+				0.1353,
+				0.05502,
+				0.13262,
+				0.11741,
+				0.1484,
+				0.13881,
+				0.03628,
+				0.012036,
+				0.013428
+			]
+		},
+		{
+			"alter": "25-29",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				2363.9,
+				1697.12,
+				594.801405,
+				213.287142,
+				190.330374,
+				52.848495,
+				48.339472,
+				40.6861,
+				80.849902,
+				56.923688,
+				35.935172,
+				48.300564,
+				34.599873,
+				31.620996,
+				37.3979,
+				51.6986,
+				41.835456,
+				46.950045,
+				20.7693,
+				39.441013,
+				35.67807,
+				32.22877,
+				16.780445,
+				22.831521,
+				25.669135,
+				31.09963,
+				20.437582,
+				22.106225,
+				18.835375,
+				12.437145,
+				11.566644,
+				16.69744,
+				5.541282,
+				4.146624,
+				3.922188,
+				2.785347,
+				3.606405,
+				3.851874,
+				1.6554,
+				2.38945,
+				1.363572,
+				0.75896,
+				1.111679,
+				1.458238,
+				1.048085,
+				0.483894,
+				0.536688,
+				0.49203,
+				0.71892,
+				0.50976,
+				0.3154,
+				0.44345,
+				0.325152,
+				0.68952,
+				0.272458,
+				0.277909,
+				0.504374,
+				0.2145,
+				0.13326,
+				0.10366,
+				0.13218,
+				0.13757,
+				0.14011,
+				0.08323,
+				0.07289,
+				0.05102,
+				0.08504,
+				0.040204,
+				0.005061,
+				0.013571
+			]
+		},
+		{
+			"alter": "30-34",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				2019.5,
+				1851.04,
+				319.228085,
+				249.76575,
+				157.400984,
+				73.020731,
+				55.00048,
+				59.538466,
+				47.955393,
+				52.134064,
+				32.495281,
+				38.81172,
+				29.456829,
+				50.725812,
+				20.9948,
+				33.28435,
+				25.382496,
+				27.88991,
+				25.02186,
+				33.204338,
+				21.585852,
+				31.173555,
+				17.179078,
+				17.133046,
+				13.382911,
+				23.859296,
+				30.929481,
+				26.449725,
+				16.446825,
+				12.177135,
+				7.9587,
+				16.904736,
+				3.683427,
+				9.115186,
+				5.822891,
+				4.780341,
+				2.642277,
+				2.627622,
+				1.7864,
+				1.90015,
+				1.752786,
+				0.902802,
+				0.854591,
+				1.081104,
+				1.022477,
+				0.590166,
+				0.893592,
+				0.99932,
+				0.43608,
+				0.35226,
+				0.49935,
+				0.417921,
+				0.486672,
+				0.415008,
+				0.474628,
+				0.576071,
+				0.515204,
+				0.12642,
+				0.14657,
+				0.13794,
+				0.14443,
+				0.13845,
+				0.11777,
+				0.08238,
+				0.05613,
+				0.10201,
+				0.0878,
+				0.043972,
+				0.010597,
+				0.012038
+			]
+		},
+		{
+			"alter": "35-39",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				3432.8,
+				1695.04,
+				370.207475,
+				241.414608,
+				152.150284,
+				66.191383,
+				86.099696,
+				75.197486,
+				86.196888,
+				76.275314,
+				67.089802,
+				37.089824,
+				40.957494,
+				26.614524,
+				43.22695,
+				28.13785,
+				27.890304,
+				18.931935,
+				27.51756,
+				35.948475,
+				31.566348,
+				37.688805,
+				12.139377,
+				25.996111,
+				16.142317,
+				11.63514,
+				12.885732,
+				12.156325,
+				22.557225,
+				22.843965,
+				11.556606,
+				13.395872,
+				5.557107,
+				4.764486,
+				5.00646,
+				3.359103,
+				2.93667,
+				1.957185,
+				2.0326,
+				2.371425,
+				1.422918,
+				0.753448,
+				1.193976,
+				1.281286,
+				0.959815,
+				0.982125,
+				0.829584,
+				0.51268,
+				0.64422,
+				0.7857,
+				0.4017,
+				0.403662,
+				0.473904,
+				0.655632,
+				0.359306,
+				0.605483,
+				0.406676,
+				0.145155,
+				0.09236,
+				0.07473,
+				0.1467,
+				0.13824,
+				0.08929,
+				0.06088,
+				0.11948,
+				0.06916,
+				0.09971,
+				0.025348,
+				0.008433,
+				0.009558
+			]
+		},
+		{
+			"alter": "40-44",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				4793.95,
+				2147.52,
+				568.097915,
+				245.436477,
+				118.095744,
+				142.755085,
+				65.405584,
+				66.130298,
+				69.678299,
+				60.968382,
+				58.897995,
+				44.281272,
+				46.923603,
+				50.428692,
+				32.5653,
+				50.1802,
+				43.36116,
+				19.438325,
+				30.9495,
+				17.594431,
+				19.958238,
+				16.92943,
+				32.077708,
+				19.40801,
+				29.165215,
+				30.67446,
+				24.838345,
+				10.12145,
+				10.1907,
+				12.65703,
+				18.02538,
+				8.788592,
+				5.10831,
+				8.77339,
+				5.148448,
+				3.28389,
+				3.62274,
+				2.822364,
+				2.0092,
+				2.38245,
+				0.928746,
+				0.735746,
+				0.871895,
+				1.318353,
+				1.391077,
+				1.154088,
+				0.39816,
+				0.73346,
+				0.72432,
+				0.642,
+				0.55515,
+				0.454867,
+				0.430944,
+				0.242592,
+				0.440818,
+				0.335916,
+				0.503614,
+				0.16551,
+				0.08716,
+				0.11045,
+				0.10502,
+				0.09775,
+				0.11643,
+				0.14305,
+				0.06801,
+				0.08978,
+				0.10624,
+				0.042124,
+				0.005013,
+				0.009029
+			]
+		},
+		{
+			"alter": "45-49",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				4439.75,
+				944.32,
+				312.447575,
+				163.564545,
+				188.42512,
+				83.185801,
+				105.632848,
+				81.74829,
+				50.752946,
+				80.182058,
+				57.690932,
+				31.970176,
+				50.553987,
+				51.275484,
+				20.3378,
+				37.9162,
+				21.97956,
+				22.49269,
+				23.18322,
+				22.132488,
+				26.848746,
+				19.32091,
+				20.363688,
+				17.985051,
+				11.041786,
+				20.399864,
+				11.116737,
+				17.777325,
+				12.118625,
+				12.59283,
+				8.645586,
+				18.6756,
+				7.585872,
+				8.875428,
+				6.587229,
+				4.349202,
+				3.803514,
+				1.76049,
+				1.5092,
+				0.99715,
+				1.476216,
+				1.49513,
+				0.559908,
+				0.692557,
+				0.572397,
+				1.035504,
+				1.039896,
+				0.90692,
+				0.3474,
+				0.69444,
+				0.70205,
+				0.676396,
+				0.314352,
+				0.520656,
+				0.498088,
+				0.290293,
+				0.407132,
+				0.133275,
+				0.07178,
+				0.06671,
+				0.0845,
+				0.13774,
+				0.05302,
+				0.05789,
+				0.05708,
+				0.14224,
+				0.06213,
+				0.0326,
+				0.010786,
+				0.009269
+			]
+		},
+		{
+			"alter": "50-54",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				3630.9,
+				1188.48,
+				619.328435,
+				132.875379,
+				86.801572,
+				88.436109,
+				47.991184,
+				69.925388,
+				57.669291,
+				47.796916,
+				71.216717,
+				61.518648,
+				41.994111,
+				30.91905,
+				38.59145,
+				25.65585,
+				18.978888,
+				36.24214,
+				15.36054,
+				26.793877,
+				19.834308,
+				24.53311,
+				30.634612,
+				31.488777,
+				24.95119,
+				16.023724,
+				20.269993,
+				26.179625,
+				16.5624,
+				21.588855,
+				9.83724,
+				10.392608,
+				6.160989,
+				3.210128,
+				5.116639,
+				2.998656,
+				2.574396,
+				2.02275,
+				1.5132,
+				1.480675,
+				0.650286,
+				1.410012,
+				0.92597,
+				1.094335,
+				1.444427,
+				0.918135,
+				0.729648,
+				0.72695,
+				0.68322,
+				0.63726,
+				0.2551,
+				0.672035,
+				0.634704,
+				0.273072,
+				0.406502,
+				0.605354,
+				0.567454,
+				0.167385,
+				0.06507,
+				0.08416,
+				0.09814,
+				0.14412,
+				0.1192,
+				0.09937,
+				0.11801,
+				0.14297,
+				0.08896,
+				0.035072,
+				0.013668,
+				0.011533
+			]
+		},
+		{
+			"alter": "55-59",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				2187.5,
+				1994.4,
+				248.995395,
+				282.04317,
+				151.985262,
+				68.184921,
+				90.620184,
+				93.427594,
+				82.164938,
+				61.316016,
+				34.222383,
+				43.843892,
+				32.628966,
+				50.424978,
+				49.9977,
+				49.45385,
+				22.146264,
+				45.475745,
+				30.90156,
+				29.944449,
+				18.743724,
+				17.959095,
+				15.909688,
+				11.465553,
+				24.543314,
+				23.216356,
+				10.934665,
+				17.759075,
+				19.4635,
+				23.45547,
+				16.729044,
+				6.638528,
+				6.07047,
+				7.968354,
+				2.660431,
+				5.777016,
+				2.729034,
+				2.932569,
+				1.3158,
+				2.403975,
+				1.401876,
+				1.202146,
+				0.681654,
+				0.645592,
+				0.95739,
+				0.461781,
+				0.797832,
+				0.39172,
+				0.56748,
+				0.84006,
+				0.34435,
+				0.318696,
+				0.659952,
+				0.358608,
+				0.362526,
+				0.277565,
+				0.372096,
+				0.125145,
+				0.10599,
+				0.11751,
+				0.12472,
+				0.08328,
+				0.09676,
+				0.12272,
+				0.1362,
+				0.14031,
+				0.10287,
+				0.055612,
+				0.012056,
+				0.009254
+			]
+		},
+		{
+			"alter": "60-64",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				1886.85,
+				1418.56,
+				569.228,
+				159.721995,
+				111.479862,
+				86.758379,
+				102.077408,
+				65.343928,
+				33.179847,
+				70.49245,
+				37.199487,
+				31.855076,
+				25.457178,
+				33.567132,
+				20.5422,
+				51.9833,
+				27.027792,
+				24.412485,
+				29.99352,
+				25.588587,
+				25.700328,
+				28.521465,
+				21.080782,
+				32.059731,
+				22.610065,
+				19.016506,
+				20.08999,
+				20.390725,
+				13.6814,
+				13.753245,
+				9.07722,
+				8.660928,
+				8.4189,
+				4.593588,
+				4.018537,
+				2.831379,
+				3.698607,
+				3.789378,
+				2.3208,
+				1.596525,
+				1.455552,
+				0.90365,
+				1.451064,
+				0.872438,
+				1.022283,
+				0.741555,
+				0.721224,
+				0.53984,
+				0.41874,
+				0.34368,
+				0.72815,
+				0.327222,
+				0.451248,
+				0.317664,
+				0.32913,
+				0.552335,
+				0.450414,
+				0.204045,
+				0.05231,
+				0.0584,
+				0.14886,
+				0.14026,
+				0.11408,
+				0.06262,
+				0.0717,
+				0.11262,
+				0.14764,
+				0.040908,
+				0.012124,
+				0.005938
+			]
+		},
+		{
+			"alter": "65-69",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				3660.3,
+				1676.96,
+				585.46774,
+				233.473338,
+				170.002664,
+				89.521699,
+				80.03368,
+				100.026264,
+				50.635089,
+				78.901882,
+				64.918997,
+				51.366828,
+				45.388698,
+				22.56255,
+				45.8878,
+				49.3918,
+				52.098624,
+				26.74252,
+				18.17772,
+				35.903627,
+				33.342678,
+				21.357245,
+				21.187678,
+				15.80082,
+				21.159608,
+				28.519574,
+				22.547962,
+				18.416075,
+				21.6075,
+				20.789565,
+				17.461818,
+				16.21712,
+				9.162042,
+				4.502818,
+				6.778083,
+				4.735542,
+				4.944786,
+				1.590858,
+				2.158,
+				1.511475,
+				1.258614,
+				0.664832,
+				0.847999,
+				0.641653,
+				0.65087,
+				1.189485,
+				0.931608,
+				0.95193,
+				0.45516,
+				0.43032,
+				0.664,
+				0.377839,
+				0.510576,
+				0.666096,
+				0.555726,
+				0.560849,
+				0.456076,
+				0.14799,
+				0.12968,
+				0.10196,
+				0.10393,
+				0.1408,
+				0.14297,
+				0.07468,
+				0.11752,
+				0.08181,
+				0.14281,
+				0.028264,
+				0.011515,
+				0.006409
+			]
+		},
+		{
+			"alter": "70-74",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				5022.85,
+				1839.04,
+				405.57495,
+				196.636092,
+				204.32724,
+				87.488685,
+				101.141384,
+				41.47247,
+				49.233211,
+				77.423058,
+				49.28443,
+				29.728028,
+				64.372581,
+				19.260804,
+				41.9458,
+				40.8362,
+				53.178576,
+				23.688155,
+				34.65498,
+				34.939395,
+				26.691768,
+				19.231485,
+				26.294189,
+				23.066099,
+				19.66545,
+				20.115726,
+				11.302947,
+				13.411925,
+				17.06825,
+				17.030655,
+				20.52771,
+				17.151216,
+				6.424317,
+				3.848648,
+				3.708745,
+				2.968653,
+				4.188657,
+				2.494539,
+				1.0214,
+				0.927675,
+				1.355634,
+				1.16812,
+				1.288324,
+				1.453188,
+				0.688894,
+				0.6561,
+				0.705024,
+				0.63616,
+				0.85266,
+				0.36894,
+				0.56555,
+				0.378378,
+				0.3096,
+				0.26568,
+				0.362756,
+				0.334024,
+				0.33193,
+				0.10881,
+				0.09261,
+				0.10215,
+				0.09113,
+				0.05168,
+				0.13075,
+				0.10541,
+				0.11114,
+				0.14107,
+				0.05937,
+				0.051472,
+				0.006888,
+				0.006277
+			]
+		},
+		{
+			"alter": "75-79",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				2307.55,
+				1244.16,
+				567.679365,
+				279.660789,
+				109.769634,
+				118.605642,
+				85.751408,
+				93.037828,
+				36.678339,
+				31.86645,
+				68.425682,
+				50.192808,
+				29.826096,
+				31.739844,
+				53.75355,
+				25.03535,
+				47.398296,
+				35.174875,
+				37.79646,
+				32.985704,
+				36.066384,
+				36.176245,
+				28.30517,
+				25.562363,
+				29.82073,
+				30.489874,
+				21.738983,
+				10.389725,
+				9.8155,
+				10.950915,
+				20.31261,
+				6.374352,
+				4.669008,
+				3.83425,
+				5.656931,
+				5.233674,
+				5.262048,
+				3.868893,
+				1.5808,
+				1.89735,
+				1.66635,
+				1.420718,
+				1.148553,
+				0.64741,
+				1.168656,
+				0.933444,
+				0.458856,
+				0.69615,
+				0.67992,
+				0.42186,
+				0.517,
+				0.466088,
+				0.61704,
+				0.699264,
+				0.672934,
+				0.58523,
+				0.24643,
+				0.159855,
+				0.0549,
+				0.14874,
+				0.12986,
+				0.13918,
+				0.14557,
+				0.05075,
+				0.13346,
+				0.12528,
+				0.0756,
+				0.028684,
+				0.009253,
+				0.012679
+			]
+		},
+		{
+			"alter": "80-84",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				4522,
+				1925.12,
+				450.19238,
+				188.336184,
+				191.185488,
+				111.085464,
+				89.655136,
+				64.024194,
+				57.483201,
+				65.614538,
+				56.827381,
+				37.006952,
+				25.768608,
+				45.749052,
+				52.9688,
+				42.0699,
+				27.893928,
+				44.277075,
+				14.97984,
+				40.410851,
+				27.303156,
+				31.90173,
+				22.922511,
+				22.302614,
+				28.786473,
+				21.046952,
+				22.225198,
+				17.74995,
+				23.1485,
+				23.60634,
+				8.9625,
+				11.03472,
+				8.767683,
+				9.227866,
+				2.744794,
+				4.347969,
+				3.889182,
+				3.803607,
+				2.5618,
+				2.05415,
+				0.766332,
+				1.182112,
+				1.237545,
+				0.537623,
+				1.237332,
+				0.764478,
+				0.537768,
+				0.78925,
+				0.60186,
+				0.5517,
+				0.43045,
+				0.349762,
+				0.40296,
+				0.443616,
+				0.615572,
+				0.405232,
+				0.300694,
+				0.160005,
+				0.14119,
+				0.07623,
+				0.12043,
+				0.12911,
+				0.05374,
+				0.05376,
+				0.13669,
+				0.07654,
+				0.12979,
+				0.05156,
+				0.010445,
+				0.009158
+			]
+		},
+		{
+			"alter": "85+",
+			"geschlecht": "m",
+			"entries": [
+				100000,
+				4837,
+				1569.92,
+				392.68361,
+				220.05003,
+				213.388448,
+				125.938309,
+				52.772888,
+				79.266096,
+				55.386587,
+				65.973208,
+				35.124102,
+				34.82926,
+				43.524567,
+				48.879954,
+				51.55625,
+				28.0028,
+				26.302992,
+				45.99175,
+				37.12248,
+				22.132488,
+				31.621428,
+				28.57001,
+				31.60113,
+				22.059184,
+				14.036345,
+				25.947814,
+				30.283953,
+				23.39285,
+				18.894,
+				12.722835,
+				9.92328,
+				13.759904,
+				6.654096,
+				7.545178,
+				5.99761,
+				3.485691,
+				1.951851,
+				2.848032,
+				2.5342,
+				1.148875,
+				1.655892,
+				1.176812,
+				0.556406,
+				1.269873,
+				1.00395,
+				0.655371,
+				0.469584,
+				0.70189,
+				0.30624,
+				0.64122,
+				0.46955,
+				0.274498,
+				0.26904,
+				0.588576,
+				0.263488,
+				0.490372,
+				0.451668,
+				0.09885,
+				0.05712,
+				0.14113,
+				0.06472,
+				0.06421,
+				0.08077,
+				0.14964,
+				0.12686,
+				0.10589,
+				0.078,
+				0.02246,
+				0.01426,
+				0.012298
+			]
+		},
+		{
+			"alter": "0",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				3245.9,
+				840.32,
+				313.535805,
+				383.614575,
+				159.861312,
+				137.613336,
+				66.878552,
+				50.881558,
+				83.945199,
+				49.68959,
+				28.707107,
+				60.229528,
+				57.65904,
+				40.542024,
+				33.4997,
+				30.5943,
+				38.606472,
+				32.50511,
+				33.68208,
+				29.638922,
+				37.170738,
+				34.07348,
+				20.481719,
+				13.758221,
+				29.427421,
+				16.27053,
+				26.936311,
+				14.46495,
+				12.76015,
+				18.54417,
+				14.740086,
+				10.113264,
+				3.289701,
+				9.125828,
+				2.312376,
+				5.175723,
+				2.173281,
+				3.802212,
+				2.0036,
+				2.5144,
+				1.3923,
+				0.84588,
+				1.210044,
+				1.419656,
+				1.344129,
+				1.175715,
+				0.851688,
+				0.39431,
+				0.35376,
+				0.33912,
+				0.4764,
+				0.671741,
+				0.685248,
+				0.58896,
+				0.511566,
+				0.283241,
+				0.340822,
+				0.177615,
+				0.1101,
+				0.07554,
+				0.0528,
+				0.06127,
+				0.09348,
+				0.07109,
+				0.07665,
+				0.09257,
+				0.07264,
+				0.053484,
+				0.014934,
+				0.008772
+			]
+		},
+		{
+			"alter": "1-14",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				4571,
+				2378.08,
+				579.901025,
+				333.815127,
+				221.294502,
+				133.014382,
+				105.53852,
+				56.502394,
+				63.940524,
+				74.123294,
+				41.106936,
+				40.114652,
+				63.006738,
+				48.753678,
+				53.73165,
+				28.20355,
+				48.699312,
+				24.85157,
+				28.9191,
+				22.468848,
+				17.633862,
+				34.26766,
+				29.614646,
+				13.85338,
+				18.175454,
+				30.014928,
+				14.925766,
+				14.26785,
+				14.078375,
+				16.561995,
+				19.650102,
+				10.982896,
+				9.455754,
+				6.31947,
+				6.356268,
+				4.822263,
+				4.764375,
+				2.660544,
+				2.7302,
+				1.823325,
+				0.974232,
+				1.236066,
+				1.305113,
+				0.575801,
+				0.512936,
+				0.554526,
+				1.029456,
+				0.49609,
+				0.5403,
+				0.63648,
+				0.57335,
+				0.307083,
+				0.607824,
+				0.462288,
+				0.345,
+				0.251335,
+				0.300048,
+				0.199545,
+				0.14434,
+				0.14031,
+				0.14343,
+				0.06399,
+				0.07688,
+				0.05779,
+				0.07386,
+				0.09238,
+				0.0706,
+				0.056236,
+				0.008941,
+				0.007192
+			]
+		},
+		{
+			"alter": "15-19",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				3339.7,
+				1463.52,
+				493.0519,
+				279.507087,
+				123.54147,
+				85.218815,
+				66.044112,
+				38.299638,
+				64.294095,
+				65.460034,
+				39.446628,
+				24.272288,
+				52.315791,
+				39.862362,
+				48.86255,
+				42.06625,
+				36.577032,
+				42.142545,
+				20.6847,
+				33.933118,
+				23.648598,
+				16.185925,
+				25.641678,
+				29.67633,
+				12.937577,
+				22.291352,
+				13.818851,
+				9.550225,
+				18.1436,
+				20.423625,
+				11.841972,
+				7.142864,
+				7.782735,
+				6.36329,
+				4.1951,
+				4.827195,
+				4.502289,
+				4.096557,
+				1.232,
+				2.211475,
+				1.72116,
+				0.576746,
+				0.520459,
+				1.26654,
+				0.962919,
+				0.714096,
+				0.75996,
+				0.96747,
+				0.78192,
+				0.85374,
+				0.3212,
+				0.39592,
+				0.429648,
+				0.480816,
+				0.403236,
+				0.421787,
+				0.207632,
+				0.147135,
+				0.14273,
+				0.12041,
+				0.07419,
+				0.0987,
+				0.07775,
+				0.05362,
+				0.0952,
+				0.06617,
+				0.07544,
+				0.057376,
+				0.01266,
+				0.010903
+			]
+		},
+		{
+			"alter": "20-24",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				4212.6,
+				2054.4,
+				328.101345,
+				292.366821,
+				210.10301,
+				130.162241,
+				93.834592,
+				84.100562,
+				31.362368,
+				81.412572,
+				51.493403,
+				54.999384,
+				34.501995,
+				39.9255,
+				32.91935,
+				48.51215,
+				32.717472,
+				40.26762,
+				18.33282,
+				17.667309,
+				34.939998,
+				33.43984,
+				31.178,
+				32.026536,
+				10.6131,
+				18.788366,
+				28.274954,
+				24.690425,
+				14.956075,
+				13.09038,
+				18.03972,
+				16.000976,
+				3.439089,
+				7.550812,
+				5.285365,
+				5.109552,
+				3.874662,
+				1.667025,
+				1.4556,
+				2.55955,
+				1.714986,
+				0.884464,
+				0.986431,
+				1.313404,
+				1.391368,
+				1.070901,
+				0.702072,
+				0.679,
+				0.41418,
+				0.55608,
+				0.35305,
+				0.278222,
+				0.37968,
+				0.441792,
+				0.311742,
+				0.286982,
+				0.216562,
+				0.184755,
+				0.09728,
+				0.11591,
+				0.12614,
+				0.11651,
+				0.05239,
+				0.07671,
+				0.08082,
+				0.12508,
+				0.13017,
+				0.031448,
+				0.010651,
+				0.012959
+			]
+		},
+		{
+			"alter": "25-29",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				4994.15,
+				2125.12,
+				535.07432,
+				209.905698,
+				75.370048,
+				86.25506,
+				88.138632,
+				78.73957,
+				84.974897,
+				64.483348,
+				36.440898,
+				24.171,
+				23.637537,
+				21.489204,
+				21.67005,
+				29.77305,
+				45.126048,
+				44.815515,
+				19.70334,
+				41.246145,
+				20.040858,
+				16.850225,
+				24.984713,
+				28.638433,
+				23.044994,
+				28.511278,
+				25.868707,
+				22.76505,
+				23.94245,
+				19.511985,
+				15.58041,
+				15.982016,
+				8.708181,
+				4.316896,
+				5.37987,
+				5.779893,
+				2.182356,
+				3.968217,
+				2.9354,
+				1.4203,
+				0.934416,
+				1.515376,
+				1.343738,
+				1.231594,
+				0.725269,
+				0.655452,
+				0.400968,
+				0.74018,
+				0.33588,
+				0.67608,
+				0.7266,
+				0.548653,
+				0.511056,
+				0.617808,
+				0.433734,
+				0.40592,
+				0.495026,
+				0.101265,
+				0.13488,
+				0.06867,
+				0.0798,
+				0.0699,
+				0.08013,
+				0.08615,
+				0.14233,
+				0.05369,
+				0.13208,
+				0.032612,
+				0.008547,
+				0.005715
+			]
+		},
+		{
+			"alter": "30-34",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				4183.9,
+				996.64,
+				347.06166,
+				275.843856,
+				147.69469,
+				140.001634,
+				106.26412,
+				91.574496,
+				41.417431,
+				43.89569,
+				37.776778,
+				34.89832,
+				60.742197,
+				26.974782,
+				32.32805,
+				25.6814,
+				50.127168,
+				26.47971,
+				32.16774,
+				14.539161,
+				33.532704,
+				17.69593,
+				26.360999,
+				30.546039,
+				24.780548,
+				20.02447,
+				29.667391,
+				21.8489,
+				17.431725,
+				9.756795,
+				17.48763,
+				11.82472,
+				3.985368,
+				6.363916,
+				6.584924,
+				2.72082,
+				3.377352,
+				2.27106,
+				2.3442,
+				2.52385,
+				0.805518,
+				0.831782,
+				0.64581,
+				0.914151,
+				1.265365,
+				1.061667,
+				0.96012,
+				0.65037,
+				0.39714,
+				0.58716,
+				0.7034,
+				0.677817,
+				0.267504,
+				0.435408,
+				0.289708,
+				0.423249,
+				0.348992,
+				0.154095,
+				0.0652,
+				0.1256,
+				0.08156,
+				0.09748,
+				0.07945,
+				0.0622,
+				0.14247,
+				0.14376,
+				0.08531,
+				0.02568,
+				0.007757,
+				0.008446
+			]
+		},
+		{
+			"alter": "35-39",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				3126.55,
+				1787.36,
+				474.21715,
+				174.041898,
+				205.392382,
+				60.79304,
+				47.85332,
+				66.718366,
+				50.951442,
+				53.077642,
+				51.350273,
+				48.162444,
+				42.674808,
+				22.644258,
+				31.70025,
+				38.45275,
+				35.884848,
+				24.540685,
+				21.82962,
+				28.655069,
+				39.42351,
+				29.241975,
+				18.835966,
+				19.649227,
+				17.457509,
+				19.497674,
+				17.290633,
+				24.493325,
+				13.535675,
+				15.512325,
+				13.783608,
+				7.582736,
+				5.295045,
+				4.063992,
+				4.799932,
+				5.834556,
+				1.968549,
+				2.519649,
+				2.8802,
+				1.7416,
+				1.05084,
+				0.595614,
+				1.444987,
+				0.873852,
+				0.507989,
+				1.190943,
+				0.537912,
+				0.94577,
+				0.36984,
+				0.55938,
+				0.3127,
+				0.603827,
+				0.571344,
+				0.419808,
+				0.320988,
+				0.488007,
+				0.438596,
+				0.21006,
+				0.05842,
+				0.13394,
+				0.13588,
+				0.05723,
+				0.11775,
+				0.06249,
+				0.08126,
+				0.11035,
+				0.0743,
+				0.051496,
+				0.009371,
+				0.01023
+			]
+		},
+		{
+			"alter": "40-44",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				2277.45,
+				2050.4,
+				238.029385,
+				267.467097,
+				175.703424,
+				72.458198,
+				98.1374,
+				79.300286,
+				45.59205,
+				61.073224,
+				50.33405,
+				67.545284,
+				41.10876,
+				54.796356,
+				26.3457,
+				39.1207,
+				42.92628,
+				40.68427,
+				32.75994,
+				18.805327,
+				26.303454,
+				37.622375,
+				22.864609,
+				29.749359,
+				15.006091,
+				10.963164,
+				20.665172,
+				15.006975,
+				11.4637,
+				13.480395,
+				14.401662,
+				11.659136,
+				3.446052,
+				3.826112,
+				5.93307,
+				4.851855,
+				3.358113,
+				4.005045,
+				1.9566,
+				0.9457,
+				1.395072,
+				0.537632,
+				1.452094,
+				1.23725,
+				0.937408,
+				0.521964,
+				0.69372,
+				0.47614,
+				0.3,
+				0.81426,
+				0.6093,
+				0.604268,
+				0.31512,
+				0.404496,
+				0.68172,
+				0.345118,
+				0.569544,
+				0.15351,
+				0.09932,
+				0.13784,
+				0.0639,
+				0.08914,
+				0.14071,
+				0.11112,
+				0.11767,
+				0.0865,
+				0.14093,
+				0.036012,
+				0.011378,
+				0.014813
+			]
+		},
+		{
+			"alter": "45-49",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				4467.05,
+				2294.72,
+				434.78974,
+				286.167507,
+				224.894982,
+				96.7162,
+				88.428872,
+				60.769306,
+				78.40592,
+				47.15131,
+				59.131774,
+				35.860556,
+				50.251455,
+				30.822486,
+				35.62765,
+				28.8423,
+				51.75072,
+				38.584995,
+				26.8746,
+				22.090443,
+				34.692138,
+				22.62197,
+				18.058743,
+				15.862784,
+				11.125026,
+				25.875224,
+				30.294298,
+				9.316625,
+				21.535475,
+				19.139625,
+				12.315192,
+				13.12664,
+				8.410038,
+				6.40085,
+				5.076532,
+				4.018758,
+				2.58093,
+				2.550339,
+				2.14,
+				1.19175,
+				0.694764,
+				0.580244,
+				1.443957,
+				0.70397,
+				0.844482,
+				0.914652,
+				0.468288,
+				0.42882,
+				0.35238,
+				0.66042,
+				0.39085,
+				0.402339,
+				0.357792,
+				0.286368,
+				0.472788,
+				0.352213,
+				0.243922,
+				0.10749,
+				0.14696,
+				0.13307,
+				0.12059,
+				0.06027,
+				0.10218,
+				0.08621,
+				0.06206,
+				0.11195,
+				0.10337,
+				0.032564,
+				0.01399,
+				0.011964
+			]
+		},
+		{
+			"alter": "50-54",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				2417.45,
+				1466.88,
+				502.84597,
+				166.638585,
+				86.231496,
+				69.77383,
+				67.6622,
+				68.496246,
+				68.530744,
+				64.069498,
+				66.450488,
+				55.3631,
+				46.665561,
+				48.39342,
+				39.43095,
+				31.28415,
+				30.336504,
+				45.91483,
+				29.50566,
+				34.877729,
+				14.882616,
+				35.49406,
+				29.153657,
+				29.154062,
+				24.131276,
+				23.106434,
+				17.857539,
+				22.452975,
+				12.02985,
+				13.063095,
+				18.5703,
+				10.966464,
+				3.761919,
+				3.948182,
+				4.590638,
+				3.434316,
+				4.430415,
+				1.482048,
+				2.9188,
+				2.3765,
+				0.651798,
+				1.34885,
+				1.525018,
+				0.529745,
+				0.494603,
+				1.148094,
+				0.47196,
+				0.97279,
+				0.61278,
+				0.69048,
+				0.6662,
+				0.612941,
+				0.333792,
+				0.424272,
+				0.569434,
+				0.309557,
+				0.325812,
+				0.091365,
+				0.06294,
+				0.10593,
+				0.10587,
+				0.14064,
+				0.1321,
+				0.11976,
+				0.13086,
+				0.09311,
+				0.12018,
+				0.05578,
+				0.010574,
+				0.008897
+			]
+		},
+		{
+			"alter": "55-59",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				3192.35,
+				1547.04,
+				299.59809,
+				289.830738,
+				192.10061,
+				146.860589,
+				96.802296,
+				37.991928,
+				69.324728,
+				69.532318,
+				52.805428,
+				55.353892,
+				27.401391,
+				50.447262,
+				28.83135,
+				40.0697,
+				42.737832,
+				27.31942,
+				21.85218,
+				34.661898,
+				17.26758,
+				14.57372,
+				22.967051,
+				30.835942,
+				30.457516,
+				23.641526,
+				18.664449,
+				26.9151,
+				15.2358,
+				11.111415,
+				13.889724,
+				8.774688,
+				8.927199,
+				5.876888,
+				4.836351,
+				3.502131,
+				2.716692,
+				1.787553,
+				2.9324,
+				1.231125,
+				1.618974,
+				1.052686,
+				0.612232,
+				1.157258,
+				1.435697,
+				0.90396,
+				0.748584,
+				0.9422,
+				0.83748,
+				0.88602,
+				0.26095,
+				0.363482,
+				0.65064,
+				0.242976,
+				0.566398,
+				0.514796,
+				0.56677,
+				0.089295,
+				0.06527,
+				0.05909,
+				0.12742,
+				0.09418,
+				0.14084,
+				0.07411,
+				0.05826,
+				0.06707,
+				0.06706,
+				0.059532,
+				0.006924,
+				0.011072
+			]
+		},
+		{
+			"alter": "60-64",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				2051.7,
+				2320.8,
+				236.522605,
+				364.222506,
+				91.782236,
+				103.535679,
+				93.319416,
+				36.131992,
+				60.10707,
+				69.22331,
+				58.955247,
+				32.522656,
+				52.14228,
+				40.746294,
+				53.2754,
+				42.97875,
+				27.672864,
+				44.680905,
+				18.22848,
+				22.894904,
+				34.981308,
+				25.240845,
+				23.178616,
+				17.179519,
+				19.673774,
+				13.1699,
+				16.129924,
+				11.930025,
+				9.06845,
+				8.623665,
+				18.872874,
+				16.515424,
+				7.789698,
+				5.097518,
+				4.82206,
+				5.035983,
+				5.159319,
+				3.278808,
+				2.0572,
+				1.092875,
+				0.80514,
+				0.648084,
+				0.967273,
+				0.965964,
+				0.953316,
+				0.454572,
+				0.894672,
+				0.9317,
+				0.53202,
+				0.77574,
+				0.3669,
+				0.605199,
+				0.449088,
+				0.644112,
+				0.432078,
+				0.310417,
+				0.466906,
+				0.187725,
+				0.10048,
+				0.07265,
+				0.13425,
+				0.09873,
+				0.07054,
+				0.08995,
+				0.10133,
+				0.14372,
+				0.09225,
+				0.057104,
+				0.006924,
+				0.008097
+			]
+		},
+		{
+			"alter": "65-69",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				3522.05,
+				2003.52,
+				435.417565,
+				205.986297,
+				132.032602,
+				103.091574,
+				57.772272,
+				84.250998,
+				58.171734,
+				51.311882,
+				31.751005,
+				40.786836,
+				61.881141,
+				41.886492,
+				31.77325,
+				23.1702,
+				20.43936,
+				20.37739,
+				24.07434,
+				15.551044,
+				26.471448,
+				21.20139,
+				24.378969,
+				29.837879,
+				15.613743,
+				25.939518,
+				10.775352,
+				20.788575,
+				24.135075,
+				19.63236,
+				12.23202,
+				10.38376,
+				5.072862,
+				4.253044,
+				4.935005,
+				3.23046,
+				4.697946,
+				1.560168,
+				1.9824,
+				0.922075,
+				1.025892,
+				1.026292,
+				1.263913,
+				0.999496,
+				0.588499,
+				0.496044,
+				0.414432,
+				0.9135,
+				0.52158,
+				0.5019,
+				0.5161,
+				0.271705,
+				0.272064,
+				0.476544,
+				0.58512,
+				0.598474,
+				0.341012,
+				0.16689,
+				0.14367,
+				0.13556,
+				0.06739,
+				0.11395,
+				0.07983,
+				0.14117,
+				0.075,
+				0.12946,
+				0.10452,
+				0.040948,
+				0.011439,
+				0.014237
+			]
+		},
+		{
+			"alter": "70-74",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				2737.7,
+				1730.88,
+				310.31297,
+				215.490204,
+				113.775168,
+				74.629378,
+				55.515656,
+				82.712448,
+				59.759702,
+				29.637178,
+				52.638443,
+				64.055452,
+				58.290798,
+				33.40743,
+				44.46065,
+				49.1071,
+				41.560032,
+				43.879655,
+				27.1848,
+				17.871928,
+				17.812872,
+				16.650935,
+				11.330976,
+				25.653096,
+				30.596943,
+				19.53708,
+				27.019071,
+				23.69215,
+				13.5273,
+				19.277655,
+				19.928298,
+				15.748176,
+				6.41862,
+				4.363846,
+				4.331095,
+				2.61396,
+				2.812887,
+				4.060845,
+				2.3348,
+				2.442475,
+				1.320102,
+				0.770196,
+				0.580817,
+				0.998991,
+				1.264395,
+				0.656586,
+				0.60264,
+				0.87031,
+				0.56148,
+				0.37314,
+				0.71105,
+				0.460012,
+				0.431808,
+				0.555216,
+				0.568054,
+				0.386957,
+				0.524932,
+				0.167505,
+				0.11627,
+				0.11864,
+				0.09027,
+				0.05587,
+				0.07805,
+				0.12819,
+				0.11358,
+				0.05823,
+				0.07757,
+				0.029272,
+				0.005136,
+				0.009146
+			]
+		},
+		{
+			"alter": "75-79",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				2338.35,
+				2103.68,
+				228.02604,
+				339.040995,
+				183.0244,
+				132.274207,
+				57.24984,
+				70.280964,
+				85.91155,
+				29.68684,
+				47.466679,
+				45.022516,
+				23.989008,
+				28.538376,
+				46.8295,
+				23.9221,
+				53.559096,
+				29.68471,
+				35.25846,
+				38.824353,
+				22.401036,
+				29.098895,
+				27.184989,
+				31.037325,
+				28.130958,
+				15.714698,
+				30.077053,
+				26.358475,
+				17.93255,
+				16.88139,
+				16.645872,
+				16.129904,
+				8.938593,
+				6.688184,
+				3.502217,
+				5.962788,
+				3.363195,
+				3.977424,
+				1.9232,
+				1.7332,
+				1.048572,
+				0.959724,
+				0.972938,
+				1.137159,
+				0.690155,
+				0.667278,
+				0.447048,
+				0.98077,
+				0.51228,
+				0.75912,
+				0.58115,
+				0.26656,
+				0.608016,
+				0.308688,
+				0.285706,
+				0.641044,
+				0.52041,
+				0.20139,
+				0.06401,
+				0.05259,
+				0.11146,
+				0.08988,
+				0.13427,
+				0.08677,
+				0.06694,
+				0.13959,
+				0.1296,
+				0.026204,
+				0.00918,
+				0.014921
+			]
+		},
+		{
+			"alter": "80-84",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				2716.35,
+				1579.04,
+				390.50715,
+				199.55643,
+				167.092276,
+				141.185914,
+				58.708296,
+				98.720206,
+				53.606326,
+				64.803392,
+				68.296865,
+				56.224048,
+				46.93695,
+				36.642324,
+				37.57675,
+				28.16705,
+				24.773664,
+				25.886785,
+				17.80548,
+				32.001851,
+				15.72534,
+				26.620545,
+				13.647056,
+				24.274397,
+				11.634871,
+				30.80927,
+				16.353376,
+				23.4038,
+				13.07505,
+				16.809165,
+				13.1211,
+				12.827072,
+				9.267753,
+				5.352926,
+				4.497977,
+				2.738493,
+				2.359137,
+				4.053312,
+				1.6714,
+				1.6604,
+				1.862028,
+				0.967674,
+				1.253098,
+				0.982528,
+				0.867374,
+				0.413667,
+				1.008936,
+				0.77567,
+				0.41076,
+				0.70146,
+				0.2922,
+				0.527975,
+				0.536208,
+				0.472656,
+				0.330004,
+				0.446512,
+				0.52953,
+				0.215475,
+				0.08908,
+				0.14935,
+				0.08235,
+				0.06726,
+				0.10821,
+				0.05746,
+				0.12879,
+				0.07307,
+				0.05009,
+				0.032736,
+				0.007979,
+				0.005503
+			]
+		},
+		{
+			"alter": "85+",
+			"geschlecht": "w",
+			"entries": [
+				100000,
+				4417.35,
+				932.96,
+				317.2609,
+				203.65515,
+				116.850578,
+				130.744512,
+				96.700712,
+				96.51837,
+				43.470624,
+				53.728766,
+				33.812077,
+				39.424052,
+				47.875689,
+				28.360104,
+				49.3918,
+				53.8594,
+				33.35892,
+				26.76175,
+				33.7977,
+				21.684008,
+				16.127424,
+				36.85332,
+				11.829824,
+				29.534698,
+				27.508739,
+				14.19653,
+				11.950544,
+				20.182675,
+				8.85405,
+				13.583115,
+				17.334192,
+				17.596144,
+				4.061328,
+				9.204704,
+				4.294215,
+				3.352938,
+				5.219214,
+				2.270502,
+				1.368,
+				1.221675,
+				1.538964,
+				1.02237,
+				0.753548,
+				0.85143,
+				0.566674,
+				1.073979,
+				0.523224,
+				0.97916,
+				0.32802,
+				0.48198,
+				0.6557,
+				0.279055,
+				0.295872,
+				0.541104,
+				0.557612,
+				0.620619,
+				0.499738,
+				0.20379,
+				0.1263,
+				0.09334,
+				0.11526,
+				0.09108,
+				0.08315,
+				0.08293,
+				0.05959,
+				0.05024,
+				0.13375,
+				0.049692,
+				0.008119,
+				0.00705
+			]
+		}
+	]
+}

BIN
data/original/RA_web_demorisiken_3d_Leiter.xls


BIN
data/original/ra_da_risikostrasse.xlsx


+ 110 - 0
data/risk-ladder.tsv

@@ -0,0 +1,110 @@
+Kategorie	Risikolabel	Zeitraum	Outputrisiko		Basisrisiko je 100.000	männlich	weiblich	Kinder bis unter 14	Junge bis unter 14	Mädchen bis unter 14	Jugendliche von 14 bis unter 18	Jugendlicher von 14 bis unter 18 	Jugendliche von 14 bis unter 18  	Heranwachsende von 18 bis unter 21	Heranwachsender von 18 bis unter 21  	Heranwachsende von 18 bis unter 21 	Erwachsene von 21 bis unter 60	Erwachsener von 21 bis unter 60 	Erwachsene von 21 bis unter 60  	Erwachsene 60 und älter	Erwachsener 60 und älter  	Erwachsene 60 und älter   	Herkunft der Zahlen	Verlinkung	Evidenz (Unsicherheit in den Daten	Referenzjahr	Referenzgruppe	Was sagt Ihnen diese Zahl? [Definition und warum wichtig für Sie?]	unique
+Finanzen	Verluste mit Immobilien	Innerhalb eines Jahres	0,1110		11100,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Bach, S., Popien, P., & Thiemann, A. (2014). Renditen von …		Sehr niedrige Qualität der Daten (Alter der Daten)	2011	Immobilieninvestoren		
+Gesundheit	Verletzung durch Autounfall	Innerhalb eines Jahres	0,0026		256,0000000000	1	1	0,39	0,39	0,39	0,39	0,39	0,39	1,61	1,61	1,61	1,61	1,61	1,61	0,39	0,39	0,39	Statistisches Bundesamt (2018).	https://www.destatis.de	Hohe Qualität der Daten	2018	Verbraucher	Debatten im Internet müssen stark moderiert werden, da viele Menschen in der scheinbaren Anonymität sprachlich oft entgleisen oder andere Menschen bedrohen.	51
+Gesundheit	Bei Autounfall sterben	Innerhalb eines Jahres	0,0000		2,0000000000	1	1	0,39	0,39	0,39	0,39	0,39	0,39	1,61	1,61	1,61	1,61	1,61	1,61	0,39	0,39	0,39	Statistisches Bundesamt (2018).	https://www.destatis.de	Hohe Qualität der Daten	2018	Verbraucher	Verschiedene Formen sowohl in Textform, aber auch mit Bildern oder in Kommunikationsmedien zählen hierzu.	52
+Gesundheit	Bei Fußgängerunfall sterben	Innerhalb eines Jahres	0,0000		1,0000000000	1	1	0,39	0,39	0,39	0,39	0,39	0,39	1,61	1,61	1,61	1,61	1,61	1,61	0,39	0,39	0,39	Statistisches Bundesamt (2018).	https://www.destatis.de	Hohe Qualität der Daten	2018	Verbraucher	Hierzu zählen alle Formen von Privatsphäreverletzungen, offline und online.	16
+Recht	Opfer von Handtaschenraub	Innerhalb eines Jahres	0,0000		1,9711965904	0,22	1,75	0,05	0,04	0,07	0,75	0,41	1,11	1,46	0,51	2,53	0,92	0,23	1,62	1,57	0,24	2,65	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Hierzu zählen alle Formen von digitaler Kriminalität.	19
+Recht	Opfer von Totschlag	Innerhalb eines Jahres	0,0000		2,1849844559	1,5	0,52	0,35	0,43	0,26	0,96	1,36	0,52	2,59	3,89	1,14	1,39	2,12	0,62	0,39	0,41	0,38	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Persönliche digitale Daten, die gestohlen werden, umfassen zum Beispiel Anschriftdaten, Kontodaten oder auch Logins.	20
+Recht	Auto wird aufgebrochen	Innerhalb eines Jahres	0,0054		538,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Kraftfahrzeuge	Es wird erlebt, dass ein Virus o.ä. das eigene Gerät kompromittiert.	21
+Recht	Einer Straftat verdächtigt werden	Innerhalb eines Jahres	0,0248		2478,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Es wird erlebt, dass der eigene Standort ungewollt von einem digitalen Dienst oder Gerät abgefragt wird.	22
+Recht	In die Wohnung wird eingebrochen	Innerhalb eines Jahres	0,0012		118,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Es wird erlebt, dass ein Onlinepasswort geknackt wurde.	23
+Gesundheit	Durch Erreger in Lebensmitteln erkranken	Innerhalb eines Jahres	0,0012		121,9512195122	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	BfR (2017). Schutz vor Lebensmittelinfektionen im Privathaushalt.	https://www.bfr.bund.de/cm/350/verbrauchertipps_schutz_vor_lebensmittelinfektionen_im_privathaushalt.pdf	Sehr niedrige Qualität der Daten (Dunkelziffer)	2017	Verbraucher	Es wird erlebt, dass Fremde in das eigene W-Lan-Netz eindringen.	24
+Versicherung	Mehr als 3h Verspätung beim Fliegen	Innerhalb eines Jahres	0,0150		1500,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Fries, A. (2017, Juli 11). Täglich fallen 69 Flüge aus oder…	https://www.reisereporter.de/artikel/1947-flugausfaelle-flugverspaetung-taeglich-69-faelle-probleme-mit-fluegen	Niedrige Qualität der Daten (Niedrige externe Validität)	2017	Flüge	Werden beim Onlineeinkauf betrogen.	25
+Recht	Auto wird gestohlen	Innerhalb eines Jahres	0,0004		39,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Kraftfahrzeuge	Es wird erlebt digitalen Kreditkarten- bzw. Kontodatenbetrug.	26
+Versicherung	Hagel- / Sturmschaden am Auto	Innerhalb eines Jahres	0,0081		812,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Kraftfahrzeuge	Es wird erlebt, dass sich jemand zu Emails/sozialen Netzwerken Zugang verschafft.	27
+Versicherung	Wildunfall mit dem Auto	Innerhalb eines Jahres	0,0061		607,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Kraftfahrzeuge	Es wird erlebt, dass Zahlungsdaten vom Telefon kopiert werden.	28
+Versicherung	Marder beschädigt das Auto	Innerhalb eines Jahres	0,0047		472,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Kraftfahrzeuge	Es wird erlebt, dass Zahlungsdaten nach Onlineeinkauf missbraucht werden.	29
+Versicherung	Wohnungsbrand	Innerhalb eines Jahres	0,0025		254,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherte	Es wird erlebt, dass der eigene Computer übernommen wird (ransomware).	30
+Versicherung	Leitungswasserschaden	Innerhalb eines Jahres	0,0021		205,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherte	Opfer von digitalem Identitätsdiebstahl	31
+Versicherung	Leistungsfall der Rechtsschutzversicherung	Innerhalb eines Jahres	0,1852		18523,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Es wird erlebt unauthorisierten Zugriff auf einem Smarthome-Gerät	33
+Versicherung	Leistungsfall der Fahrzeugvollversicherung	Innerhalb eines Jahres	0,1470		14703,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Beruflich benachteiligt aufgrund von Texten unter dem eigenen Namen	34
+Versicherung	Leistungsfall der technischen Versicherung	Innerhalb eines Jahres	0,1344		13440,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Es wird erlebt analogen Kreditkarten- bzw. Kontodatenbetrug	53
+Versicherung	Leistungsfall der Wohngebäudeversicherung	Innerhalb eines Jahres	0,1185		11846,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Offline verbal angegriffen / schwer beleidigt worden	49
+Versicherung	Leistungsfall einer Kraftfahrversicherung	Innerhalb eines Jahres	0,0811		8109,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Offline sexuell belästig worden	50
+Versicherung	Leistungsfall einer Schadens-/Unfallversicherung	Innerhalb eines Jahres	0,0749		7492,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Hierzu wird gezählt, wenn Verbraucher erleben, dass sich Preise ständig ändern würden.	43
+Versicherung	Leistungsfall einer Sachversicherung	Innerhalb eines Jahres	0,0748		7477,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Hierzu wird gezählt, wenn Verbraucher erleben, dass sich Preise ständig ändern würden.	44
+Versicherung	Leistungsfall der privaten Sachversicherung	Innerhalb eines Jahres	0,0664		6637,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Hierbei werden Ihnen persönliche Daten gestohlen und es gibt sich jemand als Sie aus um dann Geschäfte zu tätigen oder Ihre Konten abzuräumen.	63
+Versicherung	Leistungsfall der Kraftfahrzeug-Haftpflichtversicherung	Innerhalb eines Jahres	0,0631		6312,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Hierbei erhalten Sie die Rechnungen für all jene Einkäufe, die Sie selbst nie getätigt haben, aber jemand, der Ihre persönliche Daten durch Identitätsdiebstahl erlangt hat.	64
+Versicherung	Leistungsfall der Fahrzeugteilversicherung	Innerhalb eines Jahres	0,0585		5850,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Die eigene Kreditwürdigkeit schränkt die möglichen Zahlungsweisen beim Onlineeinkauf ein, da der Händler nicht bei jedem Einkäufer das gleiche Risiko eingehen möchte.	76
+Versicherung	Leistungsfall der allgemeinen Haftpflichtversicherung	Innerhalb eines Jahres	0,0532		5321,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Hierbei erhält man eine Abmahnung von Rechtsanwälten, wenn durch einen Identitätsdiebstahl Geschäfte mit Ihrer Identität durchgeführt wurden, aber natürlich niemals bezahlt wurde. Somit landen die Rechnung und dann die Abmahnung bei Ihnen.	65
+Versicherung	Leistungsfall der Schutzbriefversicherung	Innerhalb eines Jahres	0,0389		3892,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Mehr als 3h Verspätung beim Fliegen.	66
+Versicherung	Leistungsfall der Hausratversicherung	Innerhalb eines Jahres	0,0375		3753,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Fluggepäck beschädigt/verloren.	18
+Versicherung	Leistungsfall der privaten Unfallversicherung	Innerhalb eines Jahres	0,0319		3185,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Verlust der Fahrerlaubnis.	214
+Versicherung	Leistungsfall der Kraftfahrtunfallversicherung	Innerhalb eines Jahres	0,0005		51,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	gdv (2018). Statistisches Taschenbuch der Versicherungswirtschaft.	https://www.gdv.de/resource/blob/34962/935b53a18990cf9a613b6df765971d9f/download-statistisches-taschenbuch-2018-data.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2018	Versicherungsverträge	Große Belastung durch Wohnkosten.	59
+Gesundheit	Bei Terroranschlag sterben	Innerhalb eines Jahres	0,0000		0,0290000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Global Terrorism Database (2018). 		Niedrige Qualität der Daten (Schwerwiegende Ereignisse zu unregelmäßig, um pro Jahr sinnvoll quantifiziert zu werden)	2017	Verbraucher	Miete oder Nebenkosten nicht leisten können.	58
+Gesundheit	Küchenschwamm zu selten austauschen	Innerhalb eines Jahres	0,3900		39000,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Hölzl, C., & Aldrian, U., (2011). Lebensmittelsicherheit und Hygiene…	https://www.ages.at/fileadmin/AGES2015/Themen/Lebensmittel_Dateien/Lebensmittelsicherheit_und_Hygiene_im_Privathaushalt_13_12_2013.pdf	Sehr niedrige Qualität der Daten (Niedrige externe Validität)	2013	Verbraucher	Schulden bzw. Verbindlichkeiten zu haben, sagt nichts darüber aus, wie viel Vermögen oder Einnahmen dem gegenüber stehen.	57
+Recht	Verlust des Führerscheins	Innerhalb eines Jahres	0,0142		1424,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Kraftfahrt-Bundesamt (2018). Ausgewählte Maßnahmen…	https://www.kba.de/DE/Statistik/Kraftfahrer/Verkehrsauffaelligkeiten/Massnahmen_und_Sanktionen/2018_mus_dusl.html?nn=1150864	Hohe Qualität der Daten	2018	Führerscheininhaber	Verluste mit Immobilien umfassen sämtliche Arten von Erwerbs- und Anlagegeschäften.	2
+Gesundheit	Durch Meteoriteneinschlag sterben	Innerhalb eines Jahres	0,0000		0,0000060000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Krämer, W. (2011). Warum wir uns vor den falschen Dingen fürchten…		Niedrige Qualität der Daten (Schwerwiegende Ereignisse zu selten, um pro Jahr sinnvoll quantifiziert zu werden)	1996	Verbraucher	Totalverlust bei Crowdfunding (einschließlich Crowdlending und Crowdinvesting).	68
+Gesundheit	Bei einem Flugzeugunglück sterben	Innerhalb eines Jahres	0,0000		0,1500000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Müller-Peters, H. & Gatzert, N. (2016). Todsicher: Die Wahrnehmung…		Niedrige Qualität der Daten (Aufgrund der Opfervielfalt in der Problemlage schwer zu quantifizieren, d.h. Passagiere aus Deutschland, Passagiere von Airlines aus Deutschland, Passagiere von Flugzeugen, die in Deutschland landen, starten oder darüberfliegen.	2015	Verbraucher	Keine Ausschüttung durch eine Energiegenossenschaft.	301
+Gesundheit	Vom Blitz getroffen werden	Innerhalb eines Jahres	0,0000		1,2300000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Müller-Peters, H. & Gatzert, N. (2016). Todsicher: Die Wahrnehmung…		Niedrige Qualität der Daten (Ereignisse zu unregelmäßig, um pro Jahr sinnvoll quantifiziert zu werden)	2015	Verbraucher	Autoaufbruch	208
+Gesundheit	Von einem Hund gebissen werden	Innerhalb eines Jahres	0,0003		30,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Müller-Peters, H. & Gatzert, N. (2016). Todsicher: Die Wahrnehmung…		Niedrige Qualität der Daten (Keine systematische Erfassung)	2015	Verbraucher	Autodiebstahl	209
+Gesundheit	Durch einen Geisterfahrer zu Tode kommen	Innerhalb eines Jahres	0,0000		0,2500000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Müller-Peters, H. & Gatzert, N. (2016). Todsicher: Die Wahrnehmung…		Niedrige Qualität der Daten (Keine systematische Erfassung)	2015	Verbraucher	Autopanne.	213
+Gesundheit	Tod durch Hornissen-, Wespen- oder Bienenstiche	Innerhalb eines Jahres	0,0000		0,0000214767	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	National Safety Council (2017). Lifetime odds of death for selected…	https://injuryfacts.nsc.org/all-injuries/preventable-death-overview/odds-of-dying/.	Niedrige Qualität der Daten (US-Bevölkerungsdaten)	2017	Verbraucher	Auto-Hagel/Sturm-Schaden.	210
+Gesundheit	Tod durch einen Hundebiss	Innerhalb eines Jahres	0,0000		0,0000086873	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	National Safety Council (2017). Lifetime odds of death for selected…	https://injuryfacts.nsc.org/all-injuries/preventable-death-overview/odds-of-dying/.	Niedrige Qualität der Daten (US-Bevölkerungsdaten)	2017	Verbraucher	Wildunfall.	211
+Versicherung	Konflikt mit Energieversorger bis zur Schlichtung	Innerhalb eines Jahres	0,0001		12,2391304348	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Schlichtungsstelle Energie e.V. (2018). Tätigkeitsbericht…	https://www.schlichtungsstelle-energie.de/presse.html?file=files/sse/content/pdf/presse/Taetigkeitsbericht%20SSE%202018.pdf	Niedrige Qualität der Daten (Sehr niedrige Validität)	2018	Stromanbieter-Wechsler	Maderbiss Auto.	215
+Versicherung	Fluggepäck beschädigt oder verloren	Innerhalb eines Jahres	0,0081		806,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	SITA (2017). The Baggage Report 2017. Air Transport Industry Insights.	http://comms.sita.aero/rs/089-ZSE-857/images/baggage-report-2017.pdf	Moderate Qualität der Daten (Verzerrungsrisiko)	2016	Flüge	Verkehrsunfall mit Sachschaden.	212
+Gesundheit	Problematisch/krankhaft in Casinos spielen	Innerhalb eines Jahres	0,1260		12600,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Sperber, P. (2017). Zusammenfassung der BZgA Studie…	https://lssh.de/wp-content/uploads/2018/07/Zusammenfassung-der-BZgA-Studie-Glücksspielverhalten-und-Glücksspielsucht-in-Deutschland.-Ergebnisse-des-Surveys-2017-und-Trends.pdf	Niedrige Qualität der Daten (Dunkelziffer)	2017	Spieler	Glücksspiele unterm Strich ohne Gewinn.	46
+Gesundheit	Problematisch/krankhaft an Automaten spielen	Innerhalb eines Jahres	0,0790		7900,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Sperber, P. (2017). Zusammenfassung der BZgA Studie…	https://lssh.de/wp-content/uploads/2018/07/Zusammenfassung-der-BZgA-Studie-Glücksspielverhalten-und-Glücksspielsucht-in-Deutschland.-Ergebnisse-des-Surveys-2017-und-Trends.pdf	Niedrige Qualität der Daten (Dunkelziffer)	2017	Spieler	In Spielbanken problematisch/krankhaft spielen.	103
+Gesundheit	Problematisch/krankhaft im Sport wetten	Innerhalb eines Jahres	0,0370		3700,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Sperber, P. (2017). Zusammenfassung der BZgA Studie…	https://lssh.de/wp-content/uploads/2018/07/Zusammenfassung-der-BZgA-Studie-Glücksspielverhalten-und-Glücksspielsucht-in-Deutschland.-Ergebnisse-des-Surveys-2017-und-Trends.pdf	Niedrige Qualität der Daten (Dunkelziffer)	2017	Spieler	An Geldspielautomaten problematisch/krankhaft spielen.	104
+Gesundheit	Problematisch/krankhaft 6 aus 49 spielen	Innerhalb eines Jahres	0,0200		2000,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Sperber, P. (2017). Zusammenfassung der BZgA Studie…	https://lssh.de/wp-content/uploads/2018/07/Zusammenfassung-der-BZgA-Studie-Glücksspielverhalten-und-Glücksspielsucht-in-Deutschland.-Ergebnisse-des-Surveys-2017-und-Trends.pdf	Niedrige Qualität der Daten (Dunkelziffer)	2017	Spieler	Online-Sportwetten problematisch/krankhaft spielen.	106
+Gesundheit	Problematisch/krankhaft Eurojackpot spielen	Innerhalb eines Jahres	0,0110		1100,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Sperber, P. (2017). Zusammenfassung der BZgA Studie…	https://lssh.de/wp-content/uploads/2018/07/Zusammenfassung-der-BZgA-Studie-Glücksspielverhalten-und-Glücksspielsucht-in-Deutschland.-Ergebnisse-des-Surveys-2017-und-Trends.pdf	Niedrige Qualität der Daten (Dunkelziffer)	2017	Spieler	6 aus 49 problematisch/krankhaft spielen.	107
+Gesundheit	Süchtig nach Glücksspiel	Innerhalb eines Jahres	0,0031		310,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Sperber, P. (2017). Zusammenfassung der BZgA Studie…	https://lssh.de/wp-content/uploads/2018/07/Zusammenfassung-der-BZgA-Studie-Glücksspielverhalten-und-Glücksspielsucht-in-Deutschland.-Ergebnisse-des-Surveys-2017-und-Trends.pdf	Moderate Qualität der Daten (Dunkelziffer)	2017	Verbraucher	Eurojackpot problematisch/krankhaft spielen.	108
+Finanzen	Staatliche soziale Unterstützungsleistungen erhalten	Innerhalb eines Jahres	0,0950		9500,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Statisches Bundesamt (2017). Wirtschaftsrechnungen	https://www.destatis.de/DE/Themen/Gesellschaft-Umwelt/Einkommen-Konsum-Lebensbedingungen/Lebensbedingungen-Armutsgefaehrdung/Publikationen/Downloads-Lebensbedingungen/einkommen-lebensbedingungen-2150300177004.pdf	Moderate Qualität der Daten (Individuell stark beinflussbar)	2017	Verbraucher	Schlichtungsantrag im Konfliktfall mit dem eigenen Energieversorger.	67
+Finanzen	Grundsicherung erhalten	Innerhalb eines Jahres	0,0132		1322,7848101266	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Statisches Bundesamt (2017). Wirtschaftsrechnungen	https://www.destatis.de/DE/Themen/Gesellschaft-Umwelt/Einkommen-Konsum-Lebensbedingungen/Lebensbedingungen-Armutsgefaehrdung/Publikationen/Downloads-Lebensbedingungen/einkommen-lebensbedingungen-2150300177004.pdf	Moderate Qualität der Daten (Individuell stark beinflussbar)	2017	Verbraucher	Opfer von Betrug/Untreue bei Kapitalanlage.	3
+Versicherung	Verkehrsunfall mit Sachschaden	Innerhalb eines Jahres	0,0506		5064,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Statistisches Bundesamt (2018).	https://www.destatis.de	Hohe Qualität der Daten	2018	Kraftfahrzeuge	Überschuldet.	55
+Recht	Ziviler Rechtsstreit	Innerhalb eines Jahres	0,0301		3013,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Statistisches Bundesamt (2018).	https://www.destatis.de	Hohe Qualität der Daten	2018	Verbraucher	Verbraucherinsolvenz.	36
+Recht	Scheidung	Innerhalb eines Jahres	0,0084		840,0000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Statistisches Bundesamt (2019).	https://www.destatis.de	Hohe Qualität der Daten	2019	Verbraucher	Es wird erlebt EC-Kartendiebstahl mit Betrug (Debitkarten).	60
+Gesundheit	Tod durch Leberkrebs nach 40 Löffeln Erdnussbutter	Innerhalb eines Jahres	0,0000		0,1000000000	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	1	Wilson, R. (1979). Analyzing the daily risks of life. Tech Rev, 81(4), 41-46.		Niedrige Qualität der Daten (Alter der Daten)	1979	Verbraucher	Kreditkartenschulden sagen nichts darüber aus, wie viel Vermögen dem gegenüber steht.	61
+Finanzen	Opfer von Betrug bzw. Untreue bei Kapitalanlage	Innerhalb eines Jahres	0,0002		16,6855072464	1	1				1	1	1	1	1	1	1	1	1	1	1	1	BKA (2018). Bundeslagebild Wirtschaftskriminalität 2017.	https://www.bka.de/SharedDocs/Downloads/DE/Publikationen/JahresberichteUndLagebilder/Wirtschaftskriminalitaet/wirtschaftskriminalitaetBundeslagebild2017.pdf	Hohe Qualität der Daten	2017	Verbraucher	Kreditwürdigkeit wird von der Schufa mithilfe der Adresse ermittelt, wenn sonst kein anderes Datum zur Verfügung steht.	77
+Finanzen	Überschuldet	Innerhalb eines Jahres	0,1004		10040,0000000000	1	1				1	1	1	1	1	1	1	1	1	1	1	1	Creditreform.de (2018). Analyse SchuldnerAtlas Deutschland…	https://www.creditreform.de/fileadmin/user_upload/central_files/News/News_Wirtschaftsforschung/2018/Analyse-SchuldnerAtlas-Deutschland-2018.pdf	Niedrige Qualität der Daten (Individuell stark beinflussbar)	2018	Verbraucher	Bestreiten Lebensunterhalt durch eigene Kapitaleinnahmen.	56
+Finanzen	Insolvent als Verbraucher	Innerhalb eines Jahres	0,0013		128,9782608696	1	1				1	1	1	1	1	1	1	1	1	1	1	1	CRIF Bürgel GmbH. (21. März, 2019). Anzahl der Privatinsolvenzen…	https://de-statista-com.ezproxy.mpib-berlin.mpg.de/statistik/daten/studie/150565/umfrage/privatinsolvenzen-in-deutschland-seit-2000/	Hohe Qualität der Daten	2017	Verbraucher	Erhalten staatliche soziale Unterstützungsleistungen.	41
+Finanzen	EC-Kartendiebstahl mit Betrug erlebn	Innerhalb eines Jahres	0,0002		15,0043478261	1	1				1	1	1	1	1	1	1	1	1	1	1	1	FOCUS Online Group GmbH (2018, Januar 14). Wieder mehr Betrug…	https://www.focus.de/finanzen/news/2-2-millionen-euro-schaden-wieder-mehr-betrug-mit-bankkarten-branche-ohne-sorge_id_8294582.html	Moderate Qualität der Daten (Individuell stark beinflussbar)	2017	Verbraucher	Grundsicherung erhalten.	42
+Finanzen	Unterm Strich Verluste beim Glücksspiel	Innerhalb eines Jahres	0,9000		90000,0000000000	1	1				1	1	1	1	1	1	1	1	1	1	1	1	Haß, W., & Lang, P. (2016). Glücksspielverhalten und …		Sehr niedrige Qualität der Daten (Alter der Daten)	2015	Spieler	Verletzung durch Autounfall.	202
+Finanzen	Totalverlust bei Crowdfunding	Innerhalb eines Jahres	0,1500		15000,0000000000	1	1				1	1	1	1	1	1	1	1	1	1	1	1	Horhuf, L., & Schmitt, M., (2016). Success and Failure in equity crowd…	https://www.uni-trier.de/fileadmin/fb4/prof/VWL/OAR/Hornuf_Schmitt_-_Success_and_Failure_in_Equity_Crowdfunding.pdf	Sehr niedrige Qualität der Daten (Alter der Daten)	2015	Investoren	Tödlicher Autounfall.	203
+Finanzen	Kreditkartenschulden	Innerhalb eines Jahres	0,0700		7000,0000000000	1	1				1	1	1	1	1	1	1	1	1	1	1	1	ING DiBa. (2015). Kredit- und Dispo-Nutzung in Deutschland...	https://www.ing.de/binaries/content/assets/pdf/ueber-uns/presse/publikationen/ing-diba-economic-analysis-umfrageergebnisse-dispo-nutzung-2015.pdf	Sehr niedrige Qualität der Daten (Alter der Daten; potenzieller Interessenkonflikt)	2014	Verbraucher	Tödlicher Fußgängerunfall.	204
+Finanzen	Kreditwürdigkeit durch Wohnort bestimmt	Innerhalb eines Jahres	0,0030		300,0000000000	1	1				1	1	1	1	1	1	1	1	1	1	1	1	Schufa (2018). SCHUFA Kredit-Kompass 2018.	https://www.schufa.de/media/editorial/ueber_uns/bilder/studien_und_publikationen/kredit_kompass/skk_2018/SCHUFA_Kredit-Kompass-2018.pdf	Niedrige Qualität der Daten (Verzerrungsrisiko)	2017	Verbraucher	Erkrankungen durch Mikroorganismen in Lebensmitteln.	48
+Finanzen	Lebensunterhalt durch eigene Kapitaleinnahmen	Innerhalb eines Jahres	0,0080		800,0000000000	1	1				1	1	1	1	1	1	1	1	1	1	1	1	Statistisches Bundesamt (2016). 70 % der 18- bis 64-Jährigen…	https://www.destatis.de/DE/PresseService/Presse/Pressemitteilungen/2016/07/PD16_243_122.html	Moderate Qualität der Daten (Aufzeichnung ist nur bedingt zuverlässig möglich)	2015	Verbraucher	Tödlicher Terroranschlag.	225
+Finanzen	Große Belastung durch Wohnkosten	Innerhalb eines Jahres	0,1330		13300,0000000000	1	1				1	1	1	1	1	1	1	1	1	1	1	1	Statistisches Bundesamt (2017). Wirtschaftsrechnungen.	https://www.destatis.de/DE/Themen/Gesellschaft-Umwelt/Einkommen-Konsum-Lebensbedingungen/Lebensbedingungen-Armutsgefaehrdung/Publikationen/Downloads-Lebensbedingungen/einkommen-lebensbedingungen-2150300177004.pdf	Moderate Qualität der Daten (Dunkelziffer)	2017	Haushalte	Tauschen Küchenschwamm zu selten aus.	45
+Finanzen	Miete oder Nebenkosten nicht leisten können	Innerhalb eines Jahres	0,0440		4400,0000000000	1	1				1	1	1	1	1	1	1	1	1	1	1	1	Statistisches Bundesamt (2017). Wirtschaftsrechnungen.	https://www.destatis.de/DE/Themen/Gesellschaft-Umwelt/Einkommen-Konsum-Lebensbedingungen/Lebensbedingungen-Armutsgefaehrdung/Publikationen/Downloads-Lebensbedingungen/einkommen-lebensbedingungen-2150300177004.pdf	Moderate Qualität der Daten (Dunkelziffer)	2017	Haushalte	Tod durch Meteoriteneinschlag.	71
+Finanzen	Schulden haben	Innerhalb eines Jahres	0,4775		47748,5466548428	1	1				1	1	1	1	1	1	1	1	1	1	1	1	Statistisches Bundesamt (2018). Wirtschaftsrechnungen.	https://www.destatis.de/DE/Themen/Gesellschaft-Umwelt/Einkommen-Konsum-Lebensbedingungen/Vermoegen-Schulden/Publikationen/Downloads-Vermoegen-Schulden/evs-geld-immobilienvermoegen-schulden-2152602189004.pdf 	Hohe Qualität der Daten	2018	Haushalte	Hundebiss.	228
+Finanzen	Keine Ausschüttung durch eine Energiegenossenschaft	Innerhalb eines Jahres	0,3200		32000,0000000000	1	1				1	1	1	1	1	1	1	1	1	1	1	1	Verbraucherzentrale (2017). Energiegenossenschaften…	https://www.geld-bewegt.de/wissen/geld-versicherungen/nachhaltige-geldanlage/energiegenossenschaften-gemeinsam-investieren-11295	Niedrige Qualität der Daten (Alter der Daten; Verzerrungsrisiko)	2016	Investoren	Verletzung oder Tod durch Blitz.	227
+Recht	Opfer von Stalking	Innerhalb eines Jahres	0,0002		24,4950164539	0,38	1,6	0,14	0,08	0,19	1,05	0,19	1,97	2,27	0,48	4,26	1,54	0,56	2,56	0,22	0,18	0,25	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Tödlicher Geisterfahrerunfall.	207
+	Was kann im nächsten Jahr passieren?		1,0000000000		100000,0000000000	1,05	0,97	0,98	0,98	0,98	1,10	1,00	1,02	1,03	1,03	1,10	1,03	1,10	1,02	1,03	0,99	1,01					Verbraucher	Tödlicher Flugzeugunfall.	205
+Recht	Opfer eines Raubüberfalls auf eigene Wohnung	Innerhalb eines Jahres	0,0000		3,2442610550	1,27	0,73	0,15	0,16	0,14	1,12	1,57	0,64	2,66	3,89	1,29	1,21	1,55	0,86	0,79	0,87	0,72	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Tod durch Hornissen-, Wespen- oder Bienenstiche.	202
+Recht	Durch einen anderen getötet werden	Innerhalb eines Jahres	0,0000		3,7370602026	1,32	0,69	0,41	0,46	0,36	1,15	1,01	1,3	2,47	2,85	2,04	1,33	1,84	0,79	0,46	0,49	0,44	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Tod durch Hundebisse.	72
+Recht	Mordopfer	Innerhalb eines Jahres	0,0000		1,5303346078	1,08	0,93	0,51	0,52	0,5	1,43	0,53	2,39	2,33	1,41	3,36	1,25	1,46	1,04	0,53	0,58	0,49	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Süchtig nach Glücksspiel.	38
+Recht	Opfer fahrlässiger Körperverletzung	Innerhalb eines Jahres	0,0003		30,7914918372	1,04	0,96	1,15	1,21	1,09	1,51	1,37	1,66	1,43	1,3	1,58	1,1	1,13	1,05	0,63	0,67	0,6	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Tod durch Leberkrebs aufgrund von 40 Löffeln Erdnussbuttern.	100
+Recht	Bedroht werden	Innerhalb eines Jahres	0,0015		148,2624886446	1,14	0,87	0,38	0,42	0,33	1,81	1,98	1,63	2,07	2,25	1,86	1,4	1,53	1,27	0,29	0,39	0,22	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Handtaschenraub (versucht und vollendet).	405
+Recht	Opfer einer Straftat	Innerhalb eines Jahres	0,0124		1238,3281639146	1,21	0,8	0,55	0,58	0,52	2,18	2,39	1,96	2,75	3,24	2,21	1,33	1,58	1,07	0,23	0,29	0,17	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Nachstellung (Stalking) § 238 StGB  (versucht und vollendet).	412
+Recht	Opfer leichter Körperverletzung	Innerhalb eines Jahres	0,0051		514,1586086860	1,2	0,81	0,48	0,62	0,33	2,35	2,81	1,85	3,07	3,75	2,32	1,32	1,49	1,14	0,22	0,28	0,16	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Raubüberfälle in Wohnungen (versucht und vollendet).	407
+Recht	Opfer von Gewaltkriminalität	Innerhalb eines Jahres	0,0027		269,4922867935	1,42	0,59	0,37	0,49	0,25	2,73	3,59	1,81	3,72	5,29	1,98	1,29	1,8	0,76	0,19	0,25	0,14	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Totschlag § 212 StGB (versucht und vollendet).	403
+Recht	Opfer schwerer Körperverletzung in der Öffentlichkeit	Innerhalb eines Jahres	0,0009		94,2864878907	1,68	0,33	0,36	0,48	0,22	3,16	4,69	1,51	4,7	7,62	1,44	1,25	2,09	0,39	0,1	0,18	0,04	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Gefährliche und schwere Körperverletzung auf Straßen, Wegen oder Plätzen (versucht und vollendet).	408
+Recht	In der Öffentlichkeit ausgeraubt werden	Innerhalb eines Jahres	0,0002		20,6673681727	1,66	0,35	0,46	0,75	0,16	4,68	8,12	0,99	4,35	7,33	1,04	1,06	1,69	0,41	0,25	0,32	0,2	BMI (2018). Polizeiliche Kriminalstatistik (PKS) 2018.	https://www.bka.de/DE/AktuelleInformationen/StatistikenLagebilder/PolizeilicheKriminalstatistik/PKS2018/pks2018_node.html	Moderate Qualität der Daten (Dunkelziffer)	2018	Verbraucher	Gewaltkriminalität (versucht und vollendet).	413
+Recht	Kreditkarten- bzw. Kontodatenbetrug offline erleben	Innerhalb eines Jahres	0,0100		1000,0000000000	1	1							1	1	1	1	1	1	1	1	1	Bitkom (2019). Jeder zweite Internetnutzer von Cyberkriminalität…	https://www.bitkom.org/Presse/Presseinformation/Jeder-zweite-Internetnutzer-von-Cyberkriminalitaet-betroffen	Niedrige Qualität der Daten (Niedrige Validität)	2018	erwachsene Internetnutzer	Bedrohung § 241 StGB (versucht und vollendet).	411
+Digitale Risiken	Persönliche Daten gegen eigenen Willen an Dritte	Innerhalb eines Jahres	0,2300		23000,0000000000	1	1							1	1	1	1	1	1	1	1	1	Bitkom (2019). Jeder zweite Internetnutzer von Cyberkriminalität…	https://www.bitkom.org/Presse/Presseinformation/Jeder-zweite-Internetnutzer-von-Cyberkriminalitaet-betroffen	Sehr niedrige Qualität der Daten (Erfassung durch Selbstbericht)	2017	erwachsene Internetnutzer	Mord, Totschlag und Tötung auf Verlangen (versucht und vollendet).	414
+Digitale Risiken	Online schwer beleidigt / angegriffen werden	Innerhalb eines Jahres	0,1000		10000,0000000000	1	1							1	1	1	1	1	1	1	1	1	Bitkom (2019). Jeder zweite Internetnutzer von Cyberkriminalität…	https://www.bitkom.org/Presse/Presseinformation/Jeder-zweite-Internetnutzer-von-Cyberkriminalitaet-betroffen	Sehr niedrige Qualität der Daten (Sehr niedrige Validität)	2018	erwachsene Internetnutzer	Sonstige Raubüberfälle auf Straßen, Wegen oder Plätzen (versucht und vollendet).	406
+Digitale Risiken	Online sexuell belästigt werden	Innerhalb eines Jahres	0,0800		8000,0000000000	1	1							1	1	1	1	1	1	1	1	1	Bitkom (2019). Jeder zweite Internetnutzer von Cyberkriminalität…	https://www.bitkom.org/Presse/Presseinformation/Jeder-zweite-Internetnutzer-von-Cyberkriminalitaet-betroffen	Sehr niedrige Qualität der Daten (Sehr niedrige Validität)	2018	erwachsene Internetnutzer	Vorsätzliche einfache Körperverletzung § 223 StGB (versucht und vollendet).	409
+Recht	Offline schwer beleidigt / angegriffen werden	Innerhalb eines Jahres	0,2500		25000,0000000000	1	1							1	1	1	1	1	1	1	1	1	Bitkom (2019). Jeder zweite Internetnutzer von Cyberkriminalität…	https://www.bitkom.org/Presse/Presseinformation/Jeder-zweite-Internetnutzer-von-Cyberkriminalitaet-betroffen	Sehr niedrige Qualität der Daten (Sehr niedrige Validität)	2018	erwachsene Internetnutzer	Mord § 211 StGB (versucht und vollendet).	402
+Recht	Offline sexuell belästigt werden	Innerhalb eines Jahres	0,1400		14000,0000000000	1	1							1	1	1	1	1	1	1	1	1	Bitkom (2019). Jeder zweite Internetnutzer von Cyberkriminalität…	https://www.bitkom.org/Presse/Presseinformation/Jeder-zweite-Internetnutzer-von-Cyberkriminalitaet-betroffen	Sehr niedrige Qualität der Daten (Sehr niedrige Validität)	2018	erwachsene Internetnutzer	Straftaten insgesamt (versucht und vollendet).	401
+Digitale Risiken	Preisschwankungen beim Internethändler erleben	Innerhalb eines Jahres	0,3480		34800,0000000000	1	1							1	1	1	1	1	1	1	1	1	Krämer, A., Kalka, R., & Ziehe, N. (2017). Personalisiertes und…	https://wiwi.hs-duesseldorf.de/personen/nikola.ziehe/Documents/Kraemer%20Kalka%20Ziehe%20-%20Personalisiertes%20und%20dynamisches%20Pricing%20aus%20Einzelhandels-%20und%20Verbrauchersicht%20261110F.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2017	erwachsene Internetnutzer	Straftatverdacht	220
+Digitale Risiken	Preisschwankungen beim lokalen Händler erleben	Innerhalb eines Jahres	0,3330		33300,0000000000	1	1							1	1	1	1	1	1	1	1	1	Krämer, A., Kalka, R., & Ziehe, N. (2017). Personalisiertes und…	https://wiwi.hs-duesseldorf.de/personen/nikola.ziehe/Documents/Kraemer%20Kalka%20Ziehe%20-%20Personalisiertes%20und%20dynamisches%20Pricing%20aus%20Einzelhandels-%20und%20Verbrauchersicht%20261110F.pdf	Sehr niedrige Qualität der Daten (Mangel an Evidenz)	2017	erwachsene Internetnutzer	Wohnungseinbruch	218
+Digitale Risiken	Finanzieller Verluste aufgrund Identitätsdiebstahl	Innerhalb eines Jahres	0,0173		1730,5750000000	1	1							1	1	1	1	1	1	1	1	1	pwc. (2016). Identitätsklau - die Gefahr aus dem Netz.	https://www.pwc.de/de/handel-und-konsumguter/assets/cyber-security-identitaetsdiebstahl-2016.pdf	Sehr niedrige Qualität der Daten (Niedrige Validität), Alter der Daten	2016	erwachsene Internetnutzer	Ziviler Rechtsstreit.	221
+Digitale Risiken	Rechnungen für Einkäufe eines Identitätsdiebs	Innerhalb eines Jahres	0,0161		1611,2250000000	1	1							1	1	1	1	1	1	1	1	1	pwc. (2016). Identitätsklau - die Gefahr aus dem Netz.	https://www.pwc.de/de/handel-und-konsumguter/assets/cyber-security-identitaetsdiebstahl-2016.pdf	Sehr niedrige Qualität der Daten (Niedrige Validität), Alter der Daten	2016	erwachsene Internetnutzer	Scheidung.	222
+Recht	Abmahnung aufgrund eines Identitätsdiebstahls	Innerhalb eines Jahres	0,0101		1014,4750000000	1	1							1	1	1	1	1	1	1	1	1	pwc. (2016). Identitätsklau - die Gefahr aus dem Netz.	https://www.pwc.de/de/handel-und-konsumguter/assets/cyber-security-identitaetsdiebstahl-2016.pdf	Sehr niedrige Qualität der Daten (Niedrige Validität), Alter der Daten	2016	erwachsene Internetnutzer	Fahrlässige Körperverletzung § 229 StGB.	410
+Finanzen	Reduzierte Zahlungsoptionen beim Online-Einkauf	Innerhalb eines Jahres	0,0940		9400,0000000000	1	1							1	1	1	1	1	1	1	1	1	Schufa (2018). SCHUFA Kredit-Kompass 2018.	https://www.schufa.de/media/editorial/ueber_uns/bilder/studien_und_publikationen/kredit_kompass/skk_2018/SCHUFA_Kredit-Kompass-2018.pdf	Sehr niedrige Qualität der Daten (Niedrige Validität), Verzerrungsrisiko	2017	erwachsene Internetnutzer	Wohnungsbrand.	216
+Digitale Risiken	Privatsphäreverletzung erleben	Innerhalb eines Jahres	0,0300		3000,0000000000	1	1							1	1	1	1	1	1	1	1	1	Statistisches Amt der Europäischen Union (2015).	https://ec.europa.eu/eurostat/de/home	Niedrige Qualität der Daten (Niedrige Validität)	2015	erwachsene Internetnutzer	Leitungswasserschaden.	217
+Digitale Risiken	Opfer von Cyberkriminalität	Innerhalb eines Jahres	0,4425		44250,0000000000	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2018	erwachsene Internetnutzer	Leistungsfall der Rechtsschutzversicherung.	78
+Digitale Risiken	Persönliche digitale Daten werden gestohlen	Innerhalb eines Jahres	0,2168		21675,8333333333	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2018	erwachsene Internetnutzer	Leistungsfall der Fahrzeugvollversicherung.	79
+Digitale Risiken	Virenbefall auf dem eigenen Computer	Innerhalb eines Jahres	0,1814		18142,5000000000	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2017	erwachsene Internetnutzer	Leistungsfall der technischen Versicherung.	80
+Digitale Risiken	Eigener Standort ungewollt abgefragt	Innerhalb eines Jahres	0,1328		13275,0000000000	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2017	erwachsene Internetnutzer	Leistungsfall der Wohngebäudeversicherung.	81
+Digitale Risiken	Onlinepasswort wird geknackt	Innerhalb eines Jahres	0,1283		12832,5000000000	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2017	erwachsene Internetnutzer	Leistungsfall einer Kraftfahrversicherung.	82
+Digitale Risiken	Fremde Personen im privaten W-Lan	Innerhalb eines Jahres	0,1239		12390,0000000000	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2017	erwachsene Internetnutzer	Leistungsfall einer Schadens-/Unfallversicherung.	83
+Digitale Risiken	Betrug beim Online-Einkauf	Innerhalb eines Jahres	0,1200		12000,0000000000	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2018	erwachsene Internetnutzer	Leistungsfall einer Sachversicherung.	84
+Digitale Risiken	Digitaler Kreditkarten- bzw. Kontodatenbetrug	Innerhalb eines Jahres	0,1117		11168,3333333333	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2018	erwachsene Internetnutzer	Leistungsfall der privaten Sachversicherung.	85
+Digitale Risiken	In E-Mail-Konto bzw. soziales Netzwerk eingedrungen	Innerhalb eines Jahres	0,1106		11062,5000000000	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2017	erwachsene Internetnutzer	Leistungsfall der Kraftfahrzeug-Haftpflichtversicherung.	86
+Digitale Risiken	Zahlungsdaten werden vom Telefon kopiert	Innerhalb eines Jahres	0,1062		10620,0000000000	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2017	erwachsene Internetnutzer	Leistungsfall der Fahrzeugteilversicherung.	87
+Digitale Risiken	Zahlungsdaten nach Online-Einkauf missbraucht	Innerhalb eines Jahres	0,1018		10177,5000000000	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2017	erwachsene Internetnutzer	Leistungsfall der allgemeinen Haftpflichtversicherung.	88
+Digitale Risiken	Computer aus der Ferne sabotiert	Innerhalb eines Jahres	0,0752		7522,5000000000	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2017	erwachsene Internetnutzer	Leistungsfall der Schutzbriefversicherung.	89
+Digitale Risiken	Opfer von digitalem Identitätsdiebstahl	Innerhalb eines Jahres	0,0686		6858,7500000000	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2017	erwachsene Internetnutzer	Leistungsfall der Hausratversicherung.	90
+Digitale Risiken	Auf Smarthome-Gerät greifen Fremde zu	Innerhalb eines Jahres	0,0575		5752,5000000000	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2017	erwachsene Internetnutzer	Leistungsfall der privaten Unfallversicherung.	91
+Digitale Risiken	Berufliche Nachteile durch eigene Texte erleben	Innerhalb eines Jahres	0,0531		5310,0000000000	1	1							1	1	1	1	1	1	1	1	1	Symantec. (2017). Norton Cyber Security Insights Report Global Results.	http://now.symassets.com/content/dam/norton/global/pdfs/norton_cybersecurity_insights/DE_NCSIR_2017.pdf	Niedrige Qualität der Daten (Niedrige Validität)	2017	erwachsene Internetnutzer	Leistungsfall der Kraftfahrtunfallversicherung.	92

+ 50 - 0
package.json

@@ -0,0 +1,50 @@
+{
+  "name": "risiko-strasse",
+  "version": "1.0.0",
+  "scripts": {
+    "prepare": "npm run build:static",
+    "build": "rollup -c",
+    "build:data": "node bin/prepareData.js",
+    "build:html": "node bin/preprocess.js",
+    "build:dev": "NODE_ENV=development npm run build",
+    "build:prod": "NODE_ENV=production npm run build",
+    "build:static": "npm run build:data && npm run build:html",
+    "watch": "NODE_ENV=development npm run build:static && NODE_OPT=serve rollup -c --watch"
+  },
+  "devDependencies": {
+    "@babel/core": "^7.11.6",
+    "@babel/preset-env": "^7.11.5",
+    "@rollup/plugin-babel": "^5.2.1",
+    "@rollup/plugin-commonjs": "^15.0.0",
+    "@rollup/plugin-node-resolve": "^9.0.0",
+    "autoprefixer": "^9.8.6",
+    "babel-preset-env": "^1.7.0",
+    "cssnano": "^4.1.10",
+    "eslint": "^7.9.0",
+    "eslint-plugin-json": "^2.1.2",
+    "marked": "^1.1.1",
+    "postcss": "^7.0.32",
+    "posthtml": "^0.13.3",
+    "posthtml-expressions": "^1.4.7",
+    "rollup": "^2.27.1",
+    "rollup-plugin-browsersync": "^1.1.0",
+    "rollup-plugin-copy": "^3.3.0",
+    "rollup-plugin-delete": "^2.0.0",
+    "rollup-plugin-eslint": "^7.0.0",
+    "rollup-plugin-json": "^4.0.0",
+    "rollup-plugin-postcss": "^3.1.8",
+    "rollup-plugin-sourcemaps": "^0.6.2",
+    "rollup-plugin-terser": "^7.0.2",
+    "stylelint": "^13.7.1",
+    "stylelint-config-recommended": "^3.0.0"
+  },
+  "dependencies": {
+    "d3-array": "^2.7.1",
+    "d3-color": "^2.0.0",
+    "d3-interpolate": "^2.0.1",
+    "d3-request": "^1.0.6",
+    "d3-selection": "^2.0.0",
+    "d3-transition": "^2.0.0",
+    "whatwg-fetch": "^3.4.1"
+  }
+}

+ 101 - 0
rollup.config.js

@@ -0,0 +1,101 @@
+import autoprefixer from 'autoprefixer';
+import babel from '@rollup/plugin-babel';
+import browsersync from 'rollup-plugin-browsersync';
+import commonjs from '@rollup/plugin-commonjs';
+import copy from 'rollup-plugin-copy';
+import cssnano from 'cssnano';
+import del from 'rollup-plugin-delete';
+import { eslint } from 'rollup-plugin-eslint';
+import json from 'rollup-plugin-json';
+import path from 'path';
+import postcss from 'rollup-plugin-postcss';
+import resolve from '@rollup/plugin-node-resolve';
+import sourcemaps from 'rollup-plugin-sourcemaps';
+import stylelint from 'stylelint';
+import { terser } from 'rollup-plugin-terser';
+
+import config from './build.json';
+
+const printWarning = (message) => {
+    if (message.code === 'CIRCULAR_DEPENDENCY') {
+        return;
+    }
+    console.error(message);  // eslint-disable-line
+};
+
+
+const generateConfiguration = (target, option) => {
+
+    target = target === undefined ? 'development' : target;
+
+    // Common postcs configruation for development and production build.
+    let postcssconf = {
+        extract: true,
+        plugins: [
+            autoprefixer(),
+            stylelint(),
+            (target === 'production' && cssnano())
+        ],
+    };
+
+    // Browsersync configruation
+    let browsersyncconf = {
+        server: {
+            baseDir: config.path.output,
+            index: config.html.index.name,  // first html file in array is served as index
+        },
+        watch: true,
+    };
+
+    // Default rollup plugins
+    const plugins = {
+        development: [sourcemaps()],
+        production: [terser()],
+        prepare: [
+            (option !== 'serve' && del({ targets: [path.join(config.path.output, '/*'), path.join(config.path.build, '/*')] })),
+            resolve({browser: true}),
+            commonjs(),
+            json(),
+            eslint({
+                extends: ['plugin:json/recommended', 'eslint:recommended'],
+                exclude: [path.join(config.path.input, config.path.css, '/**'), 'html/**']
+            }),
+            babel({ babelHelpers: 'bundled' }),
+        ],
+        postProcess: [
+            postcss(postcssconf),
+            copy({
+                targets: [
+                    { src: path.join(config.path.build, '/*.css'), dest: path.join(config.path.output, config.path.css) },
+                    { src: path.join(config.path.build, '/*.js*'), dest: path.join(config.path.output, config.path.js) },
+                    { src: path.join(config.path.assets, config.path.js), dest: config.path.output },
+                    { src: path.join(config.path.assets, config.path.css), dest: config.path.output },
+                    { src: path.join(config.path.assets, config.path.img), dest: config.path.output },
+                    { src: path.join(config.path.assets, config.path.fonts), dest: config.path.output },
+                ],
+                hook: 'writeBundle',
+                verbose: true
+            }),
+            (option === 'serve' && browsersync(browsersyncconf))
+        ]
+    };
+
+    let rconf = {
+        onwarn: printWarning,
+        input: path.join(config.path.input, config.path.js, `${config.main}.js`),
+        plugins: plugins.prepare.concat(plugins[target], plugins.postProcess),  // Concatenate plugin arrays
+        output: {
+            file: path.join(
+                config.path.build,
+                `${config.main}${config[target].infix}.js`
+            ),
+            format: 'iife',
+            sourcemap: config[target].sourcemap
+        }
+    };
+    return rconf;
+};
+
+const rollup_config = generateConfiguration(process.env.NODE_ENV, process.env.NODE_OPT);
+
+export default rollup_config;

+ 209 - 0
src/css/main.css

@@ -0,0 +1,209 @@
+/* modular scale ratios: 2.369, 1.333, 1, 0.75*/
+@font-face {
+    font-family: "ASAP Regular";
+    src: url("../fonts/Asap-Regular.ttf");
+}
+
+@font-face {
+    font-family: "ASAP Condensed";
+    src: url("../fonts/AsapCondensed-Regular.ttf");
+}
+
+html, body, main {
+    height: 100%;
+    margin: 0;
+    padding: 0;
+}
+
+body {
+    background: #ccc;
+    font-family: "ASAP Regular", Helvetica, sans-serif;
+    font-size: 14px;
+}
+
+.hidden {
+    visibility: hidden;
+}
+
+.controls {
+    background: #7c7872;
+    border-bottom: 1px solid #fff;
+    color: #ffffff;
+    height: 36px;
+    left: 0;
+    margin: 0;
+    position: relative;
+    right: 0;
+    text-align: left;
+    top: 0;
+    width: 100%;
+}
+
+.controls .form-inline {
+    float: left;
+    margin: 0 0.4em;
+    padding-top: 3px;
+}
+
+[list].form-item {
+    line-height: 1rem;
+    width: 24rem;
+}
+
+form p {
+    float: left;
+    margin: 0;
+    padding: 0 0.25em;
+}
+
+.form-inline .form-control {
+    display: inline-block;
+    height: 2.2em;
+    vertical-align: middle;
+    width: auto;
+}
+
+.form-item {
+    border-radius: 2px;
+    line-height: 1.4;
+    float: left;
+    font-size: 13px;
+    font-weight: normal;
+    margin: 0;
+    padding: 0.4em 0.8em;
+}
+
+select ~ label {
+    display: none;
+}
+
+input[type=radio] {
+    height: 0;
+    width: 0;
+    opacity: 0;
+}
+
+.export > label {
+    border: 1px solid #fff;
+    opacity: 0.8;
+}
+
+input[type=radio] ~ label {
+    border: 1px solid #fff;
+    box-sizing: border-box;
+    cursor: pointer;
+    display: block;
+    height: 100%;
+    opacity: 0.6;
+}
+
+.export:hover > label {
+    cursor: pointer;
+    opacity: 1;
+}
+
+.export:active > label {
+    background: #f2bf1a;
+    border: 1px solid #f2bf1a;
+}
+
+input[type=radio]:hover ~ label {
+    border: 1px solid #fff;
+    opacity: 1;
+}
+
+input[type=radio]:active ~ label {
+    border: 1px solid #b15d4b;
+    color: #b15d4b;
+    opacity: 1;
+}
+
+input[type=radio]:checked ~ label {
+    border: 1px solid #fff;
+    opacity: 1;
+}
+
+.export {
+    color: #fff;
+    opacity: 0.8;
+}
+
+.export:hover {
+    opacity: 1;
+}
+
+.export:active {
+    color: #5b564e;
+}
+
+.wrapper {
+    position: fixed;
+    left: 0;
+    right: 0;
+}
+
+@media only screen and
+(min-device-width: 1024px) and
+(max-device-width: 1366px) and
+(orientation: landscape) and
+(-webkit-min-device-pixel-ratio: 2) {
+    .wrapper {
+        width: 1280px;
+        /* height: 960px; */
+        left: 50%;
+        top: 50%;
+        transform: translate(-50%, -50%);
+    }
+}
+
+.chart {
+    background: #fff;
+    position: relative;
+}
+/* <<< HTML elements <<< */
+
+/* >>> SVG elements >>> */
+svg text {
+    font-family: 'ASAP Condensed', Verdana, sans-serif;
+    pointer-events: none;
+    text-rendering: geometricPrecision;
+}
+
+.entry text,
+.static text,
+svg text.static {
+    font-size: 2.369em;
+}
+
+.info text,
+#ititle,
+.indicator text {
+    font-size: 1.333em;
+}
+
+svg.icons {
+    display: none;
+}
+
+.button {
+    cursor: pointer;
+    margin: 0;
+}
+
+.clickable {
+    cursor: pointer;
+}
+
+.selected .clickable:hover {
+    opacity: 1;
+}
+
+.close,
+.delete {
+    opacity: 0.5;
+}
+
+.close:hover,
+.delete:hover {
+    opacity: 0.8;
+}

+ 56 - 0
src/html/markdown/index.md

@@ -0,0 +1,56 @@
+## Fragestellungen zur Risikokommunikation für Verbraucher
+
+Liegt ein Problem des Risikos vor, d.h. sind belastbare numerische Schätzer vom Eintreffen spezifischer Ereignisse oder Entscheidungenkonsequenzen verfügbar, ist eine Hauptfragestellung, wie Risikokommunikation hier transparent, ausgewogen und verständlich für die Verbraucher sein kann?
+Fünf Herausforderungen sind hierbei:
+
+1.	Wie können Einzelfallwahrscheinlichkeiten trotz aleatorischer Unsicherheit über den konkreten Ausgang im Einzelfall vermittelt werden?
+2.	Wie können extrem seltene Ereignisse als solche auch besser erkannt werden?
+3.	Wie können Lebensrisiken mit einer großen Bandbreite von Wahrscheinlichkeiten vergleichend dargestellt werden?
+4.	Wie lassen sich die ersten beiden Herausforderungen nicht nur nach dem letzten Stand der Forschung, sondern zudem auch ansprechend adressieren, da das Hervorrufen von Aufmerksamkeit und Bindung des Verbrauchers an das Informationsangebot für dessen Exploration notwendig ist.
+
+## Lösungsansatz
+3D-Risikostraße
+
+1.	Einzelfallwahrscheinlichkeiten lassen sich entweder mit einfachen Häufigkeiten (sofern nur Wahrscheinlichkeitswerte > 1% auch als Prozentformat) in tabellarischer Form (Schwartz et al., 2009) oder, zur Unterstützung von Verbrauchern mit niedriger Numeracy (Cokely et al., 2012), durch den Einsatz von empirisch validierten Grafikformaten (Garcia-Retamero & Galesic, 2010), Barcharts oder IconArrays kommunizieren.
+2.	Einzelfallwahrscheinlichkeiten seltener Ereignisse lassen sich durch Vergleiche verschiedener Ereignisse verständlich kommunizieren. Statisch abgebildete Risikoleitern mit logarithmischen Skalen wurden zur Kontextualisierung von seltenen Ereignissen untersucht (Keller et al., 2009). Zugleich sind jedoch lineare Darstellungen logarithmischen im Sinne verzerrungsfreier Interpretationen überlegen.
+3.	Risiken mit einer großen Bandbreite von Wahrscheinlichkeiten lassen sich mithilfe von perspektivischem Design und Interaktivität innerhalb einer Darstellung vereinen. 
+4.	Dynamische Informationsvisualisierungen können ansprechend sein, wenn Sie auf verschiedenen Explorationstiefen, mit einem leichten Einstieg, begleitet mit Erklärtext und einem durchziehenden Narrativ versehen sind. 
+
+## Verbraucherrisiken innerhalb eines Jahres
+
+<iframe src="{{ d3 }}" width="{{ width }}" height="{{ height }}" frameborder="0"></iframe>
+
+<div class="logos">
+    <img src="img/HardingCenter_Logo_de_RGB.png" width="200" height="34" alt="Harding Center Logo"/>
+    <img src="img/mpib.png" width="500" height="40" alt="Max-Planck-Institut für Bildungsforschung Logo"/>
+    <img src="img/BMJV_Web_Master_de_WBZ.png" width="200" height="165" alt="Bundesministerium für Justiz und Verbraucherschutz Logo"/>
+</div>
+
+## Was zeigt die Grafik?
+Die Risikostraße ordnet verschiedene Verbraucherrisiken nach ihrer Eintrittswahrscheinlichkeit binnen eines Jahres. Um häufigere wie seltenere Ereignisse gleichermaßen gut zu verstehen, werden die Zahlen grafisch zueinander ins Verhältnis gesetzt. Hierbei ist die Bandbreite von fast sicheren Ereignissen bis zu extrem seltenen Ereignissen dargestellt, die aufgrund ebenjener Bandbreite linear kaum zu durchmessen sind: einerseits werden die Ereignisse logarithmisch angelegt, andererseits jedoch durch die Perspektive Konsistenz mit menschlicher Perzeption hergestellt, denn statische logarithmische Risikoleitern in 2 Dimensionen sind für viele Verbraucher missverständlich. Die Interaktion mit diesem digitalen Werkzeug erlaubt dann die Exploration aller Bereiche dieser „Straße“ -  als Weiterentwicklung von Risikoleitern.
+Um die Orientierung im linearen Spektrum zwischen den Wahrscheinlichkeiten von 100% (sicheres Ereignis) bis 0% (kein Ereignis) zu erleichtern, ist eine Navigationskarte in den rechten Bildrand eingearbeitet.
+Um den Vergleich von verschiedenen Risiken, die nicht ähnlich wahrscheinlich sind, zu ermöglichen, lassen sich Risiken mit einem Lesezeichen versehen und formen so eine sortierte Liste, die wiederrum als PDF exportierbar ist. Details zu den einzelnen Risiken werden durch Klick auf die Darstellung abgerufen.
+Das Häufigkeitsformat mit je 100.000 Referenzgruppe soll die Verwendung von kleineren Prozentzahlen, von denen bekannt ist, dass Sie für einen großen Anteil von Verbrauchern missverständlich sind, erleichtern.
+Zusätzliche Stratifizierungen nach Alter, Geschlecht und Beeinflussbarkeit sind möglich (Top-Navigation), wenn die Datenlage es zulässt.
+
+
+## Woher stammen die Zahlen? 
+Die Zahlen stammen aus verschiedenen Quellen: Häufigkeitsbeobachtungen öffentlicher Verzeichnisse, Befragungen, Bevölkerungsstudien, Modellierungen. Die Quellen sind für jedes einzelne Ereignis angegeben.
+
+## Wie hoch ist die Qualität der Daten? 
+Die meisten Risikoschätzungen zeichnen sich durch relativ niedrige Evidenzqualität aus. Zum einen fehlt es an systematischen Erfassungen von Prävalenzen bei Verbraucherereignissen, da zu wenig Bevölkerungsstudien, sondern Betroffenenerfassungen zugrunde liegen. Zum anderen sind mögliche Interessenskonflikte kaum auszuschließen.
+
+## Quellen.
+Cokely, E. T., Galesic, M., Schulz, E., Ghazal, S., & Garcia-Retamero, R. (2012). Measuring Risk Literacy: The Berlin Numeracy Test. Judgment and Decision Making, 7(1), 25-47.  
+Garcia-Retamero, R., & Galesic, M. (2010). Who proficts from visual aids: Overcoming challenges in people's understanding of risks. Social Science & Medicine, 70(7), 1019-1025.  
+Keller, C., Siegrist, M., & Visschers, V. (2009). Effect of risk ladder format on risk perception in high‐and low‐numerate individuals. Risk Analysis: An International Journal, 29(9), 1255-1264.  
+McDowell, M., Gigerenzer, G., Wegwarth, O., & Rebitschek, F. G. (2019). Effect of Tabular and Icon Fact Box Formats on Comprehension of Benefits and Harms of Prostate Cancer Screening: A Randomized Trial. Medical Decision Making, 39(1), 41-56.  
+McDowell, M., Rebitschek, F. G., Gigerenzer, G., & Wegwarth, O. (2016). A simple tool for communicating the benefits and harms of health interventions: a guide for creating a fact box. MDM Policy & Practice, 1(1), 2381468316665365.  
+Schwartz, L. M., Woloshin, S., & Welch, H. G. (2009). Using a drug facts box to communicate drug benefits and harms: two randomized trials. Annals of Internal Medicine, 150(8), 516-527.
+
+
+## Letztes Update
+7. Februar 2019
+
+## Erstellung
+Felix G. Rebitschek, Michael Zitzmann in Zusammenarbeit mit Data Science and Stories

+ 14 - 0
src/html/skeletons/main.html

@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <title>Verbraucherrisiken</title>
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+        <link href="css/index.css" rel="stylesheet">
+    </head>
+    <body>
+        <main>
+            {{{ content }}}
+        </main>
+    </body>
+</html>

+ 78 - 0
src/html/skeletons/visualisation.html

@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <title></title>
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+        <meta name="apple-mobile-web-app-capable" content="yes">
+        <script type="text/javascript" src="js/pdfkit.js"></script>
+        <script type="text/javascript" src="js/blob-stream.js"></script>
+        <link rel="stylesheet" type="text/css" href="{{ stylesheet }}">
+    </head>
+    <body>
+        <div class="wrapper">
+            <div id="form" class="controls row">
+                <div class="form-inline control-category">
+                    <select class="form-control form-item" id="category">
+                        <option id="category-option" value="">Kategorie</option>
+                        <option disabled>────</option>
+                        <option value="Digitale Risiken">Digitale Risiken</option>
+                        <option value="Gesundheit">Gesundheit</option>
+                        <option value="Finanzen">Finanzen</option>
+                        <option value="Recht">Recht</option>
+                        <option value="Versicherung">Versicherung</option>
+                    </select>
+                </div>
+                <div class="form-inline control-gender">
+                    <select class="form-control form-item" id="geschlecht">
+                        <option id="gender-option" value="">alle</option>
+                        <option disabled>────</option>
+                        <option id="gender-female" value="w">weiblich</option>
+                        <option id="gender-male" value="m">männlich</option>
+                    </select>
+                    <label for="geschlecht" class="form-item" id="gender-label">Geschlecht</label>
+                </div>
+                <div class="form-inline control-age">
+                    <select class="form-control form-item" id="alter">
+                        <option id="age-option" value="">alle</option>
+                        <option disabled>────</option>
+                        <option value="0-13">0-13</option>
+                        <option value="14-17">14-17</option>
+                        <option value="18-20">18-20</option>
+                        <option value="21-59">21-59</option>
+                        <option value="60+">60+</option>
+                    </select>
+                    <label for="alter" class="form-item" id="age-label">Alter</label>
+                </div>
+                <div class="form-inline">
+                    <input class="form-item" list="result-list" placeholder="Suche" inputmode="search" id="search">
+                    <datalist class="form-item" id="result-list"></datalist>
+                </div>
+                <div id="export" class="form-inline hidden">
+                    <a href="#" id="exportPDF" class="export button" download="pdfilename.pdf">
+                        <label id="export-factbox-pdf" class="form-item">pdf Export</label>
+                    </a>
+                </div>
+            </div>
+            <div class="chart">
+                <svg xmlns="http://www.w3.org/2000/svg">
+                    <defs>
+                        <symbol viewBox="0 0 8 8" id="circle-x">
+                            <path d="M4 0c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm-1.5 1.781l1.5 1.5 1.5-1.5.719.719-1.5 1.5 1.5 1.5-.719.719-1.5-1.5-1.5 1.5-.719-.719 1.5-1.5-1.5-1.5.719-.719z"></path>
+                        </symbol>
+                        <symbol viewBox="0 0 8 8" id="bookmark">
+                            <path d="M0 0v8l2-2 2 2v-8h-4z" transform="translate(2)" />
+                        </symbol>
+                        <symbol viewBox="0 0 8 8" id="data-transfer-upload">
+                            <path d="M3 0v3h-2l3 3 3-3h-2v-3h-2zm-3 7v1h8v-1h-8z" />
+                        </symbol>
+                        <symbol viewBox="0 0 8 8" id="data-transfer-download">
+                            <path d="M0 0v1h8v-1h-8zm4 2l-3 3h2v3h2v-3h2l-3-3z" />
+                        </symbol>
+                    </defs>
+                </svg>
+            </div>
+            <script type="text/javascript" src="{{ javascript }}"></script>
+        </div>
+    </body>
+</html>

+ 146 - 0
src/js/config.json

@@ -0,0 +1,146 @@
+{
+    "width": 1136,
+    "height": 640,
+
+    "font": {
+        "baseSize": 16,
+        "ratio": {
+            "small": 1,
+            "medium": 1.333,
+            "large": 2.369
+        }
+    },
+
+    "scrollHeight": 1e+5,
+    "controlBarHeight": 35,
+    "borderWidth": 0,
+    "interpolationMethod": "logarithmic",
+    "digits": 3,
+    "maxSelectionSize": 10,
+    "spaceFormat": 8200,
+    "durations": {
+        "listUpdate": 500,
+        "autoScroll": 1000
+    },
+
+    "components": {
+        "selectionList": {
+            "maxEntries": 10,
+            "width": "30em",
+            "height": "1.4em"
+        }
+    },
+
+    "colours": {
+        "text": "#5b564e",
+        "background": "rgba(20,20,20,0.2)",
+        "bright": "#fff",
+        "highlight": "#b15d4b",
+        "translucent": "rgba(255,255,255,0.5)",
+        "weak": "#C9B180",
+        "neutral": "#7A907C",
+        "strong": "#3B4058",
+        "categories": [
+            "#cab080",
+            "#4c9fb3",
+            "#62966a",
+            "#866952",
+            "#888888"
+            ]
+    },
+
+    "lang": "de",
+    "uri": {
+        "de": "data/data_de.json",
+        "en": "data/data_en.json"
+    },
+
+    "labels": {
+        "controls": {
+            "gender": {
+                "all": {
+                    "de": "Geschlecht",
+                    "en": "Gender"
+                },
+                "female": {
+                    "de": "weiblich",
+                    "en": "female"
+                },
+                "male": {
+                    "de": "männlich",
+                    "en": "male"
+                }
+            },
+            "age": {
+                "de": "Alter",
+                "en": "Age"
+            }
+        },
+        "info": {
+            "timescale": {
+                "de": "Zeitraum",
+                "en": "Period of time"
+            },
+            "evidence": {
+                "de": "Evidenz",
+                "en": "Evidence"
+            },
+            "influence": {
+                "de": "Einfluss",
+                "en": "Influence"
+            },
+            "source": {
+                "de": "Quelle",
+                "en": "Source"
+            },
+            "referenceGroup": {
+                "name": {
+                    "de": "Referenzgruppe",
+                    "en": "Reference group"
+                },
+                "size": "100 000"
+            },
+            "selection": {
+                "de": "Auswahl",
+                "en": "Selection"
+            },
+            "selected": {
+                "de": "ausgewählt",
+                "en": "selected"
+            },
+            "of": {
+                "de": "von",
+                "en": "of"
+            },
+            "title": {
+                "de": "Verbraucherrisiken",
+                "en": "Comsumer Risks"
+            },
+            "mainGroup": {
+                "de": "Verbrauchern",
+                "en": "Consumers"
+            },
+            "pdfAuthor": "HC RA",
+            "per": {
+                "de": "je",
+                "en": "per"
+            }
+        },
+        "categories": {
+            "de": [
+                "Digitale Risiken",
+                "Gesundheit",
+                "Finanzen",
+                "Recht",
+                "Versicherung"
+            ],
+            "en": [
+                "Digital Risks",
+                "Health",
+                "Finances",
+                "Law",
+                "Insurance"
+            ]
+        }
+    }
+}

+ 552 - 0
src/js/controller.js

@@ -0,0 +1,552 @@
+import * as d3 from './d3-custom';
+
+// views and interactive elements
+import { createScrollView } from './scrollView';
+import { createEnvironment } from './environment';
+import { createInfoView } from './infoView';
+import { createSelectionList } from './selectionList';
+import { createProgressBar } from './progressBar';
+import { createReferenceClass } from './referenceClass';
+import { createZoomButtons } from './zoomButtons';
+
+// configuration and utilities
+import { interpolate } from './utilities';
+import { PDFExport } from './pdfExport';
+import config from './config.json';
+
+export class Controller {
+
+    constructor() {
+
+        this.cMaxVal = undefined;           // maximum value of currently selected data set
+        this.cMinVal = undefined;           // minimum value of currently selected data set
+        this.cMaxScale = undefined;         // zoomed in
+        this.cMinScale = undefined;         // zoomed out
+        this.cScale = undefined;            // interpolated scale corresponding to current scroll height
+
+        this.nScrollRatio = 0;              // normalised scroll ratio [0..1]
+        this.scrollY = 0;                   // absolute scroll position
+        this.eTotalHeight = 0;              // effective height for scrolling (scroll container height - viewport height)
+
+        this.newData = false;               // true if data has changed recently
+        this.currentEntries = [];           // entries filtered by gender and age drop down menus
+        this.visibleEntries = [];           // entries inside the view frustum (potentially visible)
+        this.hiddenEntries = [];            // entries outside of the view frustum (technically and conceptually invisible)
+        this.selectedEntries = [];
+        this.initialised = false;
+
+        this.commonOptions;                      // Common options for components
+    }
+
+    init() {
+
+        for (let key in config) {
+            this[key] = config[key];
+        }
+
+        this.commonOptions = {
+            colours: this.colours,
+            controller: this,
+            font: this.font,
+            labels: this.labels.info,
+            lang: this.lang,
+            spaceFormat: this.spaceFormat,
+            durations: this.durations
+        };
+
+        this.margin = {
+            top: this.borderWidth,
+            right: this.borderWidth,
+            bottom: this.borderWidth,
+            left: this.borderWidth,
+        };
+
+        this.labelOffset = this.font.ratio.medium * this.font.baseSize;      // 1em corresponding to large font size
+        this.entryBarHeight = 3 * this.font.ratio.small * this.font.baseSize;   // maximum height of bar (when displayed at bottom of triangle)
+
+        let option = window.location.search.substr(1,4);
+        if(option === 'lang') {
+            this.lang = window.location.search.substr(6, window.location.search.length - 1);
+        }
+
+        this.labels.info.path = location.pathname.substr(0, location.pathname.lastIndexOf('/') + 1);
+
+        document.title = this.labels.info.title[this.lang];
+
+        this.loadData(this, this.uri[this.lang]);
+
+        this.pdfx = new PDFExport(this, this.labels.info, this.lang);
+        this.iform = d3.select('#iform');
+
+        d3.select('#gender-label').text(this.labels.controls.gender.all[this.lang]);
+        d3.select('#gender-option').text(this.labels.controls.gender.all[this.lang]);
+        d3.select('#gender-female').text(this.labels.controls.gender.female[this.lang]);
+        d3.select('#gender-male').text(this.labels.controls.gender.male[this.lang]);
+        d3.select('#age-label').text(this.labels.controls.age[this.lang]);
+        d3.select('#age-option').text(this.labels.controls.age[this.lang]);
+
+        d3.select('body').append('div')
+            .attr('id', 'fake');
+
+        this.svg = d3.select('.chart svg');
+        this.svg.attr('class', 'interactive');
+
+        this.initLayout();
+
+        this.createSVGElements();
+    }
+
+    createSVGElements() {
+
+        this.createBackground();
+
+        this.sView = createScrollView({
+            common: this.commonOptions,
+            boundingBox: this.streetBBox,
+            barHeight: this.entryBarHeight,
+            offset: { x: this.labelOffset, y: this.offset.y }
+        });
+        this.svg.call(this.sView);
+
+        this.createForeground();
+    }
+
+    initLayout() {
+
+        let visibleHeight = window.innerHeight;
+
+        this.svgWidth = this.width - this.margin.left - this.margin.right;
+        this.svgHeight = this.height - this.controlBarHeight - this.margin.top - this.margin.bottom;
+
+        d3.select('#fake').style('height', this.scrollHeight + 'px');  // set height of scroll container
+        this.eTotalHeight = this.scrollHeight - visibleHeight;  // subtract visible height
+
+        // 'Responsive' layout: scale to full width, preserve aspect ratio
+        this.svg.attr('preserveAspectRatio', 'xMidYMid meet');
+
+        this.svg.attr('viewBox', '0 0 ' + this.svgWidth + ' ' + this.svgHeight)
+            .attr('preserveAspectRatio', 'xMidYMid meet');
+
+        this.farClippingY = 0.3 * this.svgHeight;
+        this.progressBarHeight = this.svgHeight - 4 * this.font.ratio.large * this.font.baseSize;
+        this.offset = {
+            x: 0,
+            y: 0.3 * this.font.ratio.large * this.font.baseSize
+        };
+
+        // bottom left, top right
+        this.streetBBox = {
+            min: { x: this.offset.x, y: this.farClippingY + this.offset.y },
+            max: { x: this.svgWidth * 0.66, y: this.svgHeight }
+        };
+
+        this.streetBBox.width = this.streetBBox.max.x - this.streetBBox.min.x;
+        this.streetBBox.height = this.streetBBox.max.y - this.streetBBox.min.y;
+        this.vanishingPoint = { x: 0.66 * this.streetBBox.width, y: this.streetBBox.min.y };
+    }
+
+    loadData(self, uri) {
+        d3.json(uri, function (_data) {
+
+            self.data = _data;
+
+            self.data.reasons.forEach(function (reason) {
+                let color = d3.color('#000000');
+                switch (reason.cat) {
+                    case self.labels.categories[self.lang][0]: color = d3.color(self.colours.categories[0]); break;
+                    case self.labels.categories[self.lang][1]: color = d3.color(self.colours.categories[1]); break;
+                    case self.labels.categories[self.lang][2]: color = d3.color(self.colours.categories[2]); break;
+                    case self.labels.categories[self.lang][3]: color = d3.color(self.colours.categories[3]); break;
+                    case self.labels.categories[self.lang][4]: color = d3.color(self.colours.categories[4]); break;
+                    default: color = d3.color('#888'); console.error('unknown reason "'+reason.cat+'"');
+                }
+                reason.colorFill = color;
+                reason.colorText = color;
+            });
+
+            self.data.filters.forEach(function (filter) {
+                filter.entries = filter.entries.map(function (value, index) {
+                    return {
+                        value: value,
+                        reason: self.data.reasons[index]
+                    };
+                });
+                filter.entries.sort(function (a,b) {
+                    // return b.value - a.value;
+                    return a.value - b.value;
+                });
+            });
+
+            self.updateData();
+        });
+    }
+
+    updateData() { // called every time when data (selection) changes
+        if (!this.data) {
+            console.error('no data!');
+            return;
+        } // selected values for age, gender
+        let alter = d3.select('#alter').node().value;
+        let geschlecht = d3.select('#geschlecht').node().value;
+
+        // Hole die entsprechenden Daten aus dem JSON
+        let entry = this.data.filters.filter(function (entry) {
+            if (entry.alter !== alter) return false;
+            if (entry.geschlecht !== geschlecht) return false;
+            return true;
+        });
+        if (entry.length !== 1) return console.error(entry);
+        entry = entry[0];
+
+        let previousValues = [];
+
+        if(this.initialised === true) {
+            previousValues = this.currentEntries;
+        }
+        this.currentEntries = entry.entries.slice(0);
+
+        this.currentEntries.sort(function (a,b) {
+            // return b.value - a.value;  // large -> small
+            return a.value - b.value;  // small -> large
+        });
+
+
+        this.cMaxVal = d3.max(this.currentEntries, function(d) { return d.value; });
+        // Element with highest value placed at bottom of window ("zoomed out")  // scrollTop(0)
+        this.cMinScale = (this.streetBBox.height - this.entryBarHeight) / this.cMaxVal;
+        this.cMinVal = d3.min(this.currentEntries, function(d) { return d.value; });
+        // Element with lowest value placed at bottom of window ("zoomed in")  // scrollTop(this.eTotalHeight)
+        this.cMaxScale = (this.streetBBox.height - this.entryBarHeight) / this.cMinVal;
+
+        this.currentEntries.forEach(function(entry, i){
+            entry.id = i;
+            entry.previousValue = previousValues[i] ? previousValues[i].value : undefined;
+            //  scale to display as foremost entry
+            entry.scaleMax = (this.streetBBox.height - this.entryBarHeight) / entry.value;
+            entry.selected = entry.selected ? true : false;
+        }, this);
+
+        // search / datalist
+        let rlist = d3.select('#result-list');
+        rlist.selectAll('*').remove();
+        let self = this;
+
+        this.currentEntries.forEach(function(entry) {
+            rlist.append('option')
+                .attr('value', entry.reason.title)
+                .attr('id', entry.id)
+                .html(entry.reason.title);
+        });
+
+        d3.select('#search')
+            .on('input', function() {
+                self.currentEntries.forEach(function(e) {
+                    if (e.reason.title === this.value) {
+                        self.scrollToEntry(e);
+                    }
+                }, this);
+            });
+
+        this.updateLayout();
+    }
+
+    // called every time the presentation changes due to user interaction
+    updateLayout() {
+
+        // scale corresponding to current scroll position
+        this.cScale = interpolate(this.cMaxScale, this.cMinScale, this.nScrollRatio, this.interpolationMethod);
+        this.visibleEntries = [];
+        this.hiddenEntries = [];
+        this.currentEntries.forEach(function(entry){
+
+            // y position of entry for current scale (relative to entries group)
+            entry.y = entry.value * this.cScale;
+            // linear interpolation for e.g. scaling of bars
+            entry.ratio = (entry.y / (this.streetBBox.height - this.entryBarHeight));
+            // linear interpolation of x coordinate of bar
+            entry.x =  (1 - entry.ratio) * this.vanishingPoint.x + entry.ratio * this.streetBBox.min.x;
+            if (this.cScale <= entry.scaleMax) {
+                entry.visibility = 'visible';
+                this.visibleEntries.push(entry);
+            } else {
+                this.hiddenEntries.push(entry);
+                entry.visibility = 'hidden';
+            }
+        }, this);
+
+        // let ttime = ((this.ptime - this.stime) / 1000);
+        this.visibleEntries.sort(function(a, b) {  // update the drawing order of the svg elements
+            // return a.y - b.y;
+            return b.y - a.y;
+        });
+
+        this.pBar.max(this.cMaxVal);
+        // this.environment.minVal(this.cMinVal);
+        this.sView.entries(this.currentEntries);
+
+        if(this.initialised === false) {
+            this.createRandomSelection();
+            this.updateSelectedEntries();
+            this.initialised = true;
+        }
+
+        this.listSelectedEntries();
+
+        this.draw();
+    }
+
+    // draw all dynamic elements
+    // environment (street markings)
+    // progress bar (no transition on data change so far...)
+    // scroll view (main view with all entries)
+    draw() {
+        this.environment.draw(this.cScale, this.newData);
+        this.pBar.draw(interpolate(this.cMinScale / this.cMaxScale, 1.0, this.nScrollRatio, this.interpolationMethod));
+        this.sView.update(this.newData);
+    }
+
+    createBackground() {  // draw only once and then fagetaboutit
+
+        this.background = this.svg.append('g')                    // background group
+            .attr('class', 'background');
+
+        this.environment = createEnvironment();
+        this.environment
+            .markingUnit(this.entryBarHeight)
+            .streetBBox(this.streetBBox)
+            .streetLength(this.scrollHeight)
+            .vanishingPoint(this.vanishingPoint)
+            .markingColour(this.colours.translucent)
+            .skyWidth(this.svgWidth)
+            .skyHeight(this.svgHeight);
+
+        this.background.call(this.environment);
+
+    }
+
+    createForeground() {
+
+        this.foreground = this.svg.append('g')
+            .attr('class', 'foreground');
+
+        // fog of uncertainty
+        this.foreground.append('rect')
+            .attr('class', 'fog')
+            .attr('x', 0)
+            .attr('y', this.vanishingPoint.y)
+            .attr('width', this.svgWidth)
+            .attr('height', this.svgHeight)
+            .attr('pointer-events', 'none')
+            .attr('fill', 'url(#fog-gradient)');
+
+        this.iview = createInfoView({
+            common: this.commonOptions,
+            width: this.vanishingPoint.x,
+            height: this.vanishingPoint.y
+        });
+        this.foreground.call(this.iview);
+
+        this.sList = createSelectionList({
+            common: this.commonOptions,
+            maxEntries: this.components.selectionList.maxEntries,
+            x: this.streetBBox.width - this.labelOffset - 2 * this.font.ratio.medium * this.font.baseSize,
+            y: 0.75 * this.entryBarHeight,
+            width: this.components.selectionList.width,
+            height: this.components.selectionList.height
+        });
+        this.foreground.call(this.sList);
+
+        this.pBar = createProgressBar({
+            common: this.commonOptions,
+            max: this.cMaxVal,
+            x: this.svgWidth - this.entryBarHeight * 1.25,
+            y: 0.82 * this.entryBarHeight,
+            width: this.entryBarHeight,
+            height: this.progressBarHeight
+        });
+        this.foreground.call(this.pBar);
+
+        this.refClass = createReferenceClass({
+            common: this.commonOptions,
+            x: this.svgWidth - 6.5 * this.font.ratio.medium * this.font.baseSize,
+            y: this.streetBBox.max.y - this.entryBarHeight / 2 + this.labelOffset / 2
+        });
+        this.foreground.call(this.refClass);
+
+        this.zoomBtns = createZoomButtons({
+            common: this.commonOptions,
+            x: this.svgWidth - this.font.ratio.large * this.font.baseSize * 1.3,
+            y: this.streetBBox.max.y - this.font.ratio.large * this.font.baseSize * 2
+        });
+        this.foreground.call(this.zoomBtns);
+    }
+
+    scrollPosition() { // cross-browser, check on more browsers, OS
+        return (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop;
+    }
+
+    scrollTopTween(st) { // natural scrolling. Test this!!! (IE)
+        let self = this;
+        return function() {
+            let i = d3.interpolateNumber(self.scrollPosition(), st);
+            let scrollElement = document.scrollingElement || document.documentElement;
+            return function(t) {
+                scrollElement.scrollTop = i(t);
+            };
+        };
+    }
+
+    scrolled() {
+        this.scrollY = this.scrollPosition();
+        this.nScrollRatio = this.scrollY / this.eTotalHeight;
+        this.updateLayout();
+    }
+
+
+    // scroll to entry
+    nextEntry() {
+        // adapt distance measure to scale to compensate for numerical errors in small value ranges
+        const dist = this.visibleEntries[0].scaleMax / this.cScale - 1;
+        return dist <= 0.001 ? this.visibleEntries[1] : this.visibleEntries[0];  // account for numerical errors
+    }
+
+    previousEntry() {
+        return this.hiddenEntries.length > 0 ? this.hiddenEntries[0] : undefined;
+    }
+
+    /**
+     * Calculates the corresponding scroll position for the provided target
+     * and scrolls to that position, so that target is displayed at the bottom
+     * of the *street* in maximum scale
+     * @param target: d3 style data entry
+     */
+    scrollToEntry(target) {
+
+        if(target === undefined) {
+            return;
+        }
+        let quotient = 0;
+        // solve interpolation equation for scroll position 't'
+        if(this.interpolationMethod === 'linear') {
+            quotient = (target.scaleMax - this.cMinScale) / (this.cMaxScale - this.cMinScale);
+        } else if (this.interpolationMethod === 'logarithmic') {
+            quotient = (Math.log(target.scaleMax) - Math.log(this.cMinScale)) / (Math.log(this.cMaxScale) - Math.log(this.cMinScale));
+        }
+
+        d3.select('body')
+            .transition()
+            .duration(this.durations.autoScroll)
+            .tween('autoscroll', this.scrollTopTween(this.eTotalHeight * quotient));
+    }
+
+    zoomIn() {
+        if(this.scrollPosition() === this.eTotalHeight) {
+            return;
+        }
+
+        this.scrollToEntry(this.nextEntry());
+    }
+
+    zoomOut() {
+        if(this.scrollPosition() === 0) {
+            return;
+        }
+
+        this.scrollToEntry(this.previousEntry());
+    }
+
+    showInfo(target) {
+        this.iview.showInfo(target);
+    }
+
+    deleteEntryFromSelection(target) {
+        target.selected = false;
+        this.updateSelectedEntries();
+    }
+
+    isEntrySelected(entry) {
+        return this.getSelectedEntries().indexOf(entry) !== -1 ? true : false;
+    }
+
+    createRandomSelection() {
+        let selectedEntries = [];
+        let ra = 5;
+
+        while (selectedEntries.length < ra) {
+            let prob = 1.0 / this.currentEntries.length;
+            let rnd = Math.random();
+
+            let cumulatedPval = 0.0;
+
+            let idx = 0;
+            for (; idx < this.currentEntries.length; ++idx) {
+                cumulatedPval += prob;
+
+                if (rnd < cumulatedPval) {
+                    break;
+                }
+            }
+            let ce = this.currentEntries[idx];
+            ce.selected = true;
+            if (selectedEntries.indexOf(ce) === -1) {
+                selectedEntries.push(this.currentEntries[idx]);
+            }
+        }
+        return selectedEntries;
+    }
+
+    toggleSelection(target) {
+        let selectedEntries = this.getSelectedEntries();
+
+        if(selectedEntries.length === this.maxSelectionSize && target.selected === false) {  // limit selection list length
+            return;
+        }
+
+        target.selected = !target.selected;
+        this.updateSelectedEntries();
+    }
+
+    hideDownloadButton(visibility) {
+        d3.select('#export')
+            .classed('hidden', visibility);
+    }
+
+    getSelectedEntries() {
+        let selectedEntries = this.currentEntries.filter(function(entry) {
+            if (entry.selected === true) return true;
+            return false;
+        });
+        return selectedEntries;
+    }
+
+    updateSelectedEntries() {
+        this.selectedEntries = this.getSelectedEntries();
+        this.pdfx.entriesListUpdated(this.selectedEntries);
+        this.listSelectedEntries();
+    }
+
+    listSelectedEntries() {
+
+        let selectedOption = d3.select('#category').node().selectedOptions[0].innerHTML;
+        let categories = this.labels.categories[this.lang];
+        let filter = categories.indexOf(selectedOption) !== -1 ? selectedOption : '';
+        this.sList.update(this.selectedEntries, filter);
+        this.draw();
+    }
+
+    setCategory(cat) {
+        this.category = cat;
+        this.sView.category(cat);
+        this.listSelectedEntries();
+        this.draw();
+    }
+
+    filterSelectionChanged() {
+        this.newData = true;
+        this.updateData();
+    }
+
+    dataProcessed() {
+        this.newData = false;
+    }
+}

+ 6 - 0
src/js/d3-custom.js

@@ -0,0 +1,6 @@
+export { selection, select, selectAll } from 'd3-selection';
+export { transition } from 'd3-transition';
+export { json } from 'd3-request';
+export { interpolateNumber } from 'd3-interpolate';
+export { color } from 'd3-color';
+export { min, max } from 'd3-array';

+ 313 - 0
src/js/environment.js

@@ -0,0 +1,313 @@
+import * as d3 from './d3-custom';
+
+export function createEnvironment() {
+
+    let skyWidth = 100;
+    let skyHeight = 100;
+
+    let streetLength = 100;
+    let streetBBox = {
+        min: { x: 0, y: 0 },
+        max: { x: 100, y: 100 }
+    };
+
+    let vanishingPoint = { x: 100, y: 100 };
+
+    let x = 0;
+    let y = 0;
+
+    let bgStartColour = '#ccccd8';
+    let bgStopColour = '#ccc';
+    let markingColour = '#f84';
+
+    let minVal = 0.000001;
+
+    let opacity = 0.6;
+
+    let streetGroup = undefined;
+    let defs = undefined;
+
+    let markings = [];
+    let markingUnit = 20;   // base of markings dimensions
+    let markingFactor = 2;  // marking unit * factor = height
+
+
+    function environment(selection) {
+
+        defs = selection.append('defs');
+
+        let gradient = defs.append('linearGradient')
+            .attr('id', 'sky-gradient')
+            .attr('x1', '0')
+            .attr('x2', '0')
+            .attr('y1', '0')
+            .attr('y2', '1');
+        gradient.append('stop')
+            .attr('offset', '0%')
+            .attr('stop-color', 'skyblue')
+            .attr('stop-opacity', '1');
+        gradient.append('stop')
+            .attr('offset', '100%')
+            .attr('stop-opacity', '0.25')
+            .attr('stop-color', 'skyblue');
+
+        gradient = defs.append('linearGradient')
+            .attr('id', 'fog-gradient')
+            .attr('x1', '0')
+            .attr('x2', '0')
+            .attr('y1', '0')
+            .attr('y2', '1');
+        gradient.append('stop')
+            .attr('offset', '0%')
+            .attr('stop-opacity', '0.9')
+            .attr('stop-color', '#fff');
+        gradient.append('stop')
+            .attr('offset', '20%')
+            .attr('stop-opacity', '0.1')
+            .attr('stop-color', '#fff');
+        gradient.append('stop')
+            .attr('offset', '100%')
+            .attr('stop-opacity', '0')
+            .attr('stop-color', '#fff');
+
+        // sky
+        selection.append('rect')
+            .attr('class', 'sky')
+            .attr('x', 0)
+            .attr('y', 0)
+            .attr('width', skyWidth)
+            .attr('height', skyHeight)
+            .attr('fill', 'url(#sky-gradient)');
+
+        d3.selectAll('.sky')
+            .attr('width', skyWidth)
+            .attr('height', vanishingPoint.y);
+
+        // street surface gradient
+        gradient = defs.append('linearGradient')
+            .attr('id', 'surface-gradient')
+            .attr('x1', '0')
+            .attr('x2', '0')
+            .attr('y1', '0')
+            .attr('y2', '1');
+        gradient.append('stop')
+            .attr('offset', '0%')
+            .attr('stop-opacity', '0.5')
+            .attr('stop-color', bgStartColour);
+        gradient.append('stop')
+            .attr('offset', '100%')
+            .attr('stop-color', bgStopColour);
+
+        // calculate scale factor for positioning street markings
+        let s = markingUnit * markingFactor / (streetBBox.max.y - vanishingPoint.y) *
+            (streetBBox.min.x - vanishingPoint.x);
+        let t = markingUnit * markingFactor / (streetBBox.max.y - vanishingPoint.y) *
+            (streetBBox.max.x - vanishingPoint.x);
+        let nw = streetBBox.width - Math.abs(s) - t;
+        let ns = nw / streetBBox.width;
+
+        // create elements for whole scroll area
+        while (streetLength > minVal) {
+            markings.push(streetLength);
+            streetLength = streetLength * Math.pow(ns, markingFactor);  // gap length equals marking length
+        }
+
+        // street
+        streetGroup = selection.append('g')
+            .attr('class', 'street');
+
+        streetGroup.append('path')
+            .attr('class', 'surface')
+            .attr('fill', 'url(#surface-gradient)');
+
+        // street marking clipping triangle
+        streetGroup
+            .append('path')
+            .attr('class', 'mmarking')
+            .attr('fill', markingColour)
+            .attr('opacity', opacity)
+            .attr('clip-path', 'url(#marking-clip)');
+
+        // street marking elements
+        defs.append('clipPath')
+            .attr('id', 'marking-clip');
+
+        // street surface triangle
+        d3.selectAll('.surface').attr('d'
+            , 'M' + streetBBox.min.x + ',' + streetBBox.max.y
+            + 'L' + streetBBox.max.x + ',' + streetBBox.max.y
+            + 'L' + vanishingPoint.x + ',' + vanishingPoint.y
+            + 'Z'
+        );
+
+        let streetCentre = (streetBBox.max.x - streetBBox.min.x) / 2.0;
+        let mleft = streetCentre - markingUnit / 3;
+        let mright = streetCentre + markingUnit / 3;
+        d3.selectAll('.mmarking').attr('d'
+            , 'M' + mleft + ',' + streetBBox.max.y
+            + 'L' + mright + ',' + streetBBox.max.y
+            + 'L' + vanishingPoint.x + ',' + vanishingPoint.y
+            + 'L' + mleft + ',' + streetBBox.max.y
+        );
+    }
+
+    environment.markings = function(elements) {
+        if (!arguments.length) {
+            return markings;
+        }
+
+        markings = elements;
+        return environment;
+    };
+
+    environment.draw = function(cScale, newData) {
+
+        var clippath = defs.select('clipPath#marking-clip');
+        let gmarkings = clippath.selectAll('rect.marking')
+            .data(markings);
+
+        // UPDATE
+        if(newData) {
+            clippath.selectAll('rect.marking')
+                .transition()
+                .duration(1000)
+                .attr('transform', function(d) {
+                    let my = d * cScale;
+                    let mr = (my / (streetBBox.height - markingUnit));  // marking unit = entry bar height
+                    let mx = (1 - mr) * vanishingPoint.x + mr * streetBBox.min.x;
+                    return 'translate(' + mx + ',' +
+                        (my + vanishingPoint.y) + ') scale(' + mr + ',' + mr + ')';
+                });
+        } else {
+            clippath.selectAll('rect.marking')
+                .attr('transform', function(d) {
+                    let my = d * cScale;
+                    let mr = (my / (streetBBox.height - markingUnit));  // marking unit = entry bar height
+                    let mx = (1 - mr) * vanishingPoint.x + mr * streetBBox.min.x;
+                    return 'translate(' + mx + ',' +
+                        (my + vanishingPoint.y) + ') scale(' + mr + ',' + mr + ')';
+                });
+        }
+
+        // ENTER
+        gmarkings.enter()
+            .append('rect')
+            .attr('class', 'marking')
+            .attr('fill', '#333')
+            .attr('height', markingUnit * markingFactor)
+            .attr('width', streetBBox.width)
+            .attr('transform', function(d) {
+                let my = d * cScale;
+                let mr = (my / (streetBBox.max.y - streetBBox.min.y - markingUnit));
+                let mx = (1 - mr) * vanishingPoint.x + mr * streetBBox.min.x;
+                return 'translate(' + mx + ',' +
+                    (my + vanishingPoint.y) + ') scale(' + mr + ',' + mr + ')';
+            });
+    };
+
+    environment.streetLength = function(val) {
+        if(!arguments.length) {
+            return streetLength;
+        }
+        streetLength = val;
+        return environment;
+    };
+
+    environment.streetBBox = function(val) {
+        if(!arguments.length) {
+            return streetBBox;
+        }
+        streetBBox = val;
+        return environment;
+    };
+
+    environment.vanishingPoint = function(val) {
+        if(!arguments.length) {
+            return vanishingPoint;
+        }
+        vanishingPoint = val;
+        return environment;
+    };
+
+    environment.markingFactor = function(val) {
+        if(!arguments.length) {
+            return markingFactor;
+        }
+        markingFactor = val;
+        return environment;
+    };
+
+    environment.markingUnit = function(val) {
+        if(!arguments.length) {
+            return markingUnit;
+        }
+        markingUnit = val;
+        return environment;
+    };
+
+    environment.markingColour = function(val) {
+        if(!arguments.length) {
+            return markingColour;
+        }
+        markingColour = val;
+        return environment;
+    };
+
+    environment.minVal = function(val) {
+        if(!arguments.length) {
+            return minVal;
+        }
+        minVal = val;
+        return environment;
+    };
+
+    environment.bgStartColour = function(val) {
+        if(!arguments.length) {
+            return bgStartColour;
+        }
+        bgStartColour = val;
+        return environment;
+    };
+
+    environment.bgStopColour = function(val) {
+        if(!arguments.length) {
+            return bgStopColour;
+        }
+        bgStopColour = val;
+        return environment;
+    };
+
+    environment.x = function(val) {
+        if(!arguments.length) {
+            return x;
+        }
+        x = val;
+        return environment;
+    };
+
+    environment.y = function(val) {
+        if(!arguments.length) {
+            return y;
+        }
+        y = val;
+        return environment;
+    };
+
+    environment.skyWidth = function(val) {
+        if(!arguments.length) {
+            return skyWidth;
+        }
+        skyWidth = val;
+        return environment;
+    };
+
+    environment.skyHeight = function(val) {
+        if(!arguments.length) {
+            return skyHeight;
+        }
+        skyHeight = val;
+        return environment;
+    };
+
+    return environment;
+}

+ 245 - 0
src/js/infoView.js

@@ -0,0 +1,245 @@
+export function createInfoView(options) {
+
+    let width = 300;
+    let height = 400;
+
+    // let font.baseSize = 16;
+    // let font.ratio.large = 2.369;
+    // let font.ratio.medium = 1.333;
+
+    // let font = {
+    //     baseSize: 16,
+    //     ratio: {
+    //         large: 2.369,
+    //         medium: 1.333,
+    //         small: 1
+    //     }
+    // };
+
+    // let highlightColour = '#f84';
+    // let textColour = '#48f';
+    // let bgColour = 'rgba(20,20,20,0.2)';
+    let colours;
+    let font;
+
+    let infoGroup = undefined;
+    let labels = undefined;
+    let lang = undefined;
+
+
+    function infoView(selection) {
+
+        infoGroup = selection.append('g')
+            .attr('class', 'info-view')
+            .classed('hidden', true);
+
+        infoGroup.append('rect')
+            .attr('class', 'info-frame')
+            .attr('fill', colours.translucent)
+            .attr('width', width)
+            .attr('height', height);
+
+        let ilink = infoGroup.append('svg:a')
+            .attr('id', 'ilink')
+            .attr('target', '_blank');
+
+        ilink.append('svg:rect')
+            .attr('height', 0)
+            .attr('width', 0)
+            .attr('fill', 'rgba(255,255,255,0.0)');
+
+        let itext = ilink.append('text')
+            .attr('transform', 'translate(' +
+                (font.ratio.large * font.baseSize) + ',' +
+                (font.ratio.large * font.baseSize) + ')')
+            .attr('fill', colours.text);
+
+        itext.append('tspan')
+            .attr('id', 'ititle');
+
+        itext.append('tspan')
+            .attr('x', 0)
+            .attr('dy', font.ratio.large + 'em')
+            .attr('id', 'iinfo');
+
+        itext.append('tspan')
+            .attr('x', 0)
+            .attr('dy', font.ratio.medium + 'em')
+            .attr('id', 'ievidence');
+
+        itext.append('tspan')
+            .attr('x', 0)
+            .attr('dy', font.ratio.medium + 'em')
+            .attr('id', 'iinfluence');
+
+        itext.append('tspan')
+            .attr('x', 0)
+            .attr('id', 'isource')
+            .attr('dy', font.ratio.medium + 'em');
+
+        itext.append('tspan')
+            .attr('x', 0)
+            .attr('id', 'ireference')
+            .attr('dy', font.ratio.medium + 'em');
+
+        let closeButton = infoGroup.append('g')
+            .attr('transform', 'translate(' +
+                (width - font.ratio.large * font.baseSize) + ', ' +
+                (font.ratio.medium * font.baseSize) + ') scale(0.8,0.8)')
+            .attr('id', 'close-button')
+            .attr('class', 'button close')
+            .on('click', infoView.hideInfo);
+
+        closeButton.append('circle')
+            .attr('r', font.ratio.medium * font.baseSize * 0.6)
+            .attr('cx', font.ratio.medium * font.baseSize * 0.5)
+            .attr('cy', font.ratio.medium * font.baseSize * 0.5)
+            .attr('fill', colours.text);
+
+        closeButton.append('use')
+            .attr('xlink:href', '#circle-x')
+            .attr('fill', colours.translucent)
+            .attr('width', font.ratio.medium * font.baseSize)
+            .attr('height', font.ratio.medium * font.baseSize);
+    }
+
+
+    infoView.showInfo = function(d) {
+
+        console.log(d);
+        if(d.reason.info) {
+            infoGroup.classed('hidden', false);
+            infoGroup.select('#ititle')
+                .text(d.reason.title);
+            infoGroup.select('#iinfo')
+                // .text('Zeitraum: ' + d.reason.info);
+                .text(labels.timescale[lang] + ': ' + d.reason.info);
+            infoGroup.select('#iinfluence')
+                .text(labels.influence[lang] + ': ' + d.reason.cat);
+            infoGroup.select('#ievidence')
+                .text(labels.evidence[lang] + ': ' + d.reason.evidence);
+
+            if(d.reason.source.indexOf('http') !== -1) {
+                let ilink = infoGroup.select('#ilink')
+                    .attr('xlink:href', d.reason.source);
+
+                ilink.select('rect')
+                    .attr('height', height)
+                    .attr('width', width)
+                    .attr('stroke-width', 2)
+                    .attr('stroke', colours.highlight);
+
+                let ustart = d.reason.source.indexOf('//') + 2;
+                let uend = d.reason.source.indexOf('/', ustart);
+                let url = d.reason.source.substr(0, uend);
+                infoGroup.select('#isource').text(labels.source[lang] + ': ' + url + ', ' + d.reason.year);
+            } else {
+                infoGroup.select('#isource').text(labels.source[lang] + ': ' + d.reason.source + ', ' + d.reason.year);
+                let ilink = infoGroup.select('#ilink')
+                    .attr('xlink:href', '#');
+                ilink.select('rect')
+                    .attr('stroke', 'none')
+                    .attr('height', 0)
+                    .attr('width', 0);
+            }
+
+            infoGroup.select('#ireference')
+                .text(labels.referenceGroup.name[lang] + ': ' + d.reason.referenceGroup);
+        }
+    };
+
+    infoView.hideInfo = function() {
+        infoGroup.classed('hidden', true);
+        infoGroup.select('#ititle')
+            .text('');
+        infoGroup.select('#iinfo')
+            .text('');
+        infoGroup.select('#iinfluence')
+            .text('');
+        infoGroup.select('#ievidence')
+            .text('');
+        infoGroup.select('#isource')
+            .text('');
+        infoGroup.select('#ireference')
+            .text('');
+    };
+
+    infoView.lang = function(val) {
+        if(!arguments.length) {
+            return lang;
+        }
+        lang = val;
+        return infoView;
+    };
+
+    infoView.labels = function(val) {
+        if(!arguments.length) {
+            return labels;
+        }
+        labels = val;
+        return infoView;
+    };
+
+    infoView.width = function(val) {
+        if(!arguments.length) {
+            return width;
+        }
+        width = val;
+        return infoView;
+    };
+
+    infoView.height = function(val) {
+        if(!arguments.length) {
+            return height;
+        }
+        height = val;
+        return infoView;
+    };
+
+    infoView.colours = function(val) {
+        if(!arguments.length) {
+            return colours;
+        }
+        colours = val;
+        return infoView;
+    };
+
+    infoView.font = function(val) {
+        if(!arguments.length) {
+            return font;
+        }
+        font = val;
+        return infoView;
+    };
+    // infoView.textColour = function(val) {
+    //     if(!arguments.length) {
+    //         return textColour;
+    //     }
+    //     textColour = val;
+    //     return infoView;
+    // };
+
+    // infoView.bgColour = function(val) {
+    //     if(!arguments.length) {
+    //         return bgColour;
+    //     }
+    //     bgColour = val;
+    //     return infoView;
+    // };
+
+    // infoView.highlightColour = function(val) {
+    //     if (!arguments.length) {
+    //         return highlightColour;
+    //     }
+    //     highlightColour = val;
+    //     return infoView;
+    // };
+
+    infoView.colours(options.common.colours);
+    infoView.font(options.common.font);
+    infoView.lang(options.common.lang);
+    infoView.labels(options.common.labels);
+    infoView.width(options.width);
+    infoView.height(options.height);
+    return infoView;
+}

Plik diff jest za duży
+ 4 - 0
src/js/logos/BMJV_logo.js


+ 88 - 0
src/js/logos/RA_logo_1280.js

@@ -0,0 +1,88 @@
+export default {
+    'elements': [
+        {
+            'desc': 'R',
+            'data': 'M84.1,192.8L60.4,157c-3.3,0.2-5.9,0.3-7.7,0.3H22.6v35.5H11.7V83.1h41c13.7,0,24.3,3.2,31.8,9.5 c7.5,6.3,11.2,15.3,11.2,26.9c0,9.1-2.2,16.7-6.6,22.8c-4.4,6.1-10.7,10.3-18.8,12.7l26.4,37.8H84.1z M52.7,147.6 c10.5,0,18.5-2.4,24.2-7.1c5.6-4.8,8.5-11.6,8.5-20.6c0-8.8-2.8-15.5-8.5-20.1c-5.7-4.6-13.7-6.9-24.2-6.9H22.6v54.8H52.7z',
+            'fill': '#4a4a4a',
+            'fillRule': 'non-zero'
+        }, {
+            'desc': 'I',
+            'data': 'M125.2,83.1H136v109.7h-10.8V83.1z',
+            'fill': '#4a4a4a',
+            'fillRule': 'non-zero'
+        },{
+            'desc': 'S',
+            'data': 'M216.7,94.5c-5.3-1.5-10.4-2.3-15.1-2.3c-7.5,0-13.6,1.5-18.1,4.5c-4.5,3-6.8,7-6.8,12.2c0,4.5,1.3,8.2,3.8,11 c2.5,2.8,5.6,5,9.3,6.7c3.7,1.6,8.7,3.4,15.1,5.4c7.4,2.2,13.4,4.4,18,6.5c4.5,2.2,8.4,5.3,11.6,9.3c3.2,4.1,4.8,9.5,4.8,16.2 c0,5.9-1.6,11-4.9,15.5c-3.3,4.5-7.9,8-13.9,10.4c-6,2.5-12.8,3.7-20.6,3.7c-7.6,0-15.1-1.5-22.4-4.5c-7.3-3-13.5-7-18.8-12.1 l5-8.9c4.9,4.8,10.6,8.6,17.1,11.3c6.5,2.7,12.9,4.1,19.1,4.1c8.4,0,15-1.7,19.9-5.1c4.9-3.4,7.4-8,7.4-13.7 c0-4.6-1.3-8.4-3.8-11.3c-2.5-2.9-5.6-5.2-9.3-6.8c-3.7-1.6-8.8-3.4-15.4-5.5c-7.4-2.3-13.4-4.5-17.9-6.5c-4.5-2-8.3-5.1-11.5-9.1 c-3.1-4-4.7-9.3-4.7-15.8c0-5.5,1.6-10.4,4.7-14.6c3.1-4.2,7.5-7.4,13.2-9.7c5.7-2.3,12.2-3.4,19.6-3.4c6,0,12,0.9,18,2.7 c6,1.8,11.3,4.1,15.9,7.1l-4.7,9.3C226.9,98.2,222,96,216.7,94.5z',
+            'fill': '#4a4a4a',
+            'fillRule': 'non-zero'
+        }, {
+            'desc': 'I',
+            'data': 'M265.9,83.1h10.8v109.7h-10.8V83.1z',
+            'fill': '#4a4a4a',
+            'fillRule': 'non-zero'
+        }, {
+            'desc': 'K',
+            'data': 'M399.3,192.8H386l-41.6-53.4l-22.3,24.2v29.2h-10.8V82.9h10.8v66.8L383,82.9h13.2l-44.1,48L399.3,192.8z',
+            'fill': '#4a4a4a',
+            'fillRule': 'non-zero'
+        }, {
+            'desc': 'O',
+            'data': 'M491.7,89.6c8.7,5,15.7,11.7,20.8,20.2c5.1,8.5,7.7,17.8,7.7,27.9c0,10.1-2.6,19.5-7.7,28.1 c-5.1,8.6-12.1,15.4-20.8,20.4c-8.7,5-18.3,7.5-28.8,7.5c-10.5,0-20.1-2.5-28.8-7.5c-8.7-5-15.7-11.8-20.8-20.4 c-5.1-8.6-7.7-17.9-7.7-28.1c0-10.1,2.6-19.4,7.7-27.9c5.1-8.5,12.1-15.2,20.8-20.2c8.7-5,18.3-7.4,28.8-7.4 C473.3,82.2,482.9,84.6,491.7,89.6z M439.8,98c-7.1,4.1-12.8,9.6-16.9,16.6c-4.2,7-6.3,14.7-6.3,23.1c0,8.4,2.1,16.1,6.3,23.2 c4.2,7.1,9.8,12.7,16.9,16.9c7.1,4.1,14.8,6.2,23.2,6.2c8.3,0,15.9-2.1,23-6.2c7.1-4.1,12.7-9.8,16.9-16.9 c4.2-7.1,6.3-14.9,6.3-23.2c0-8.4-2.1-16.1-6.3-23.1c-4.2-7-9.8-12.6-16.9-16.6c-7.1-4.1-14.7-6.1-23-6.1 C454.7,91.9,446.9,93.9,439.8,98z',
+            'fill': '#4a4a4a',
+            'fillRule': 'non-zero'
+        }, {
+            'desc': 'A',
+            'data': 'M618.2,192.8l-7.5-19.4h-47.5l-7.7,19.4H526l47.2-110h29.5l46.1,110H618.2z M571.8,151.4h30.4l-15.1-39.2 L571.8,151.4z',
+            'fill': '#4a4a4a',
+            'fillRule': 'non-zero'
+        }, {
+            'desc': 'T',
+            'data': 'M637.4,82.8h94.3v23.7h-33v86.3H670v-86.3h-32.6V82.8z',
+            'fill': '#4a4a4a',
+            'fillRule': 'non-zero'
+        }, {
+            'desc': 'L',
+            'data': 'M743.3,82.8H772v85.5h46.6v24.5h-75.3V82.8z',
+            'fill': '#4a4a4a',
+            'fillRule': 'non-zero'
+        }, {
+            'desc': 'A',
+            'data': 'M912.9,192.8l-7.5-19.4h-47.5l-7.7,19.4h-29.5l47.2-110h29.5l46.1,110H912.9z M866.5,151.4h30.4l-15.1-39.2 L866.5,151.4z',
+            'fill': '#4a4a4a',
+            'fillRule': 'non-zero'
+        }, {
+            'desc': 'S',
+            'data': 'M1010,107.4c-6.6-2.2-12.2-3.3-16.7-3.3c-3.6,0-6.4,0.6-8.4,2c-2,1.3-3.1,3.2-3.1,5.7c0,2.4,0.9,4.4,2.7,6 c1.8,1.6,4,2.9,6.6,3.9c2.6,1,6.5,2.3,11.6,3.9c7.6,2.2,13.9,4.4,18.9,6.6c5,2.2,9.2,5.6,12.8,10.1c3.6,4.6,5.3,10.5,5.3,17.8 c0,7.3-1.9,13.6-5.8,18.8c-3.9,5.2-9.2,9.1-15.9,11.7c-6.7,2.6-14.3,3.9-22.5,3.9c-9.1,0-18.2-1.6-27.2-4.8 c-9.1-3.2-16.9-7.6-23.5-13.1l11.1-22.4c5.5,4.9,12.1,8.9,19.7,12.1c7.6,3.2,14.3,4.7,20.2,4.7c4.3,0,7.7-0.8,10.1-2.4 c2.5-1.6,3.7-3.9,3.7-6.9c0-2.5-0.9-4.6-2.7-6.3c-1.8-1.7-4.1-3-6.9-4c-2.8-1-6.7-2.2-11.7-3.5c-7.5-2.1-13.8-4.2-18.7-6.4 c-4.9-2.1-9.1-5.4-12.6-9.7c-3.5-4.3-5.3-10.1-5.3-17.3c0-6.8,1.8-12.8,5.4-17.9c3.6-5.1,8.7-9.1,15.4-11.9 c6.6-2.8,14.4-4.1,23.1-4.1c8,0,15.8,1.1,23.5,3.4c7.7,2.3,14.5,5.2,20.4,9l-10.8,22.9C1022.9,112.4,1016.6,109.6,1010,107.4z',
+            'fill': '#4a4a4a',
+            'fillRule': 'non-zero'
+        }, {
+            'desc': 'dot',
+            'data': 'M1201.4,136.9c0,32.6-26.4,59-59,59c-32.6,0-59-26.4-59-59c0-32.6,26.4-59,59-59 C1175,77.9,1201.4,104.3,1201.4,136.9z',
+            'fill': '#9e1d20',
+            'fillRule': 'non-zero'
+        }, {
+            'desc': '^',
+            'data': 'M1086.8,62.9c-0.4,0.1-0.5-0.1-0.2-0.3l55.5-55.4c0.3-0.3,0.7-0.3,1,0l55.5,55.4c0.3,0.3,0.2,0.4-0.2,0.3 l-55.1-13.2c-0.4-0.1-1-0.1-1.4,0L1086.8,62.9z',
+            'fill': '#4a4a4a',
+            'fillRule': 'non-zero'
+        }, {
+            'desc': 'v',
+            'data': 'M1086.8,210.8c-0.4-0.1-0.5,0.1-0.2,0.3l55.5,55.4c0.3,0.3,0.7,0.3,1,0l55.5-55.4c0.3-0.3,0.2-0.4-0.2-0.3 l-55.1,13.2c-0.4,0.1-1,0.1-1.4,0L1086.8,210.8z',
+            'fill': '#4a4a4a',
+            'fillRule': 'non-zero'
+        }, {
+            'desc': '>',
+            'data': 'M1216.4,192.5c-0.1,0.4,0.1,0.5,0.3,0.2l55.4-55.5c0.3-0.3,0.3-0.7,0-1l-55.4-55.5c-0.3-0.3-0.4-0.2-0.3,0.2 l13.2,55.1c0.1,0.4,0.1,1,0,1.4L1216.4,192.5z',
+            'fill': '#4a4a4a',
+            'fillRule': 'non-zero'
+        }
+    ],
+    'transform': {
+        'a11': 0.1,
+        'a21': 0,
+        'a12': 0,
+        'a22': 0.1,
+        'a13': 240,
+        'a23': 355
+    }
+};

+ 221 - 0
src/js/logos/hc_logo.js

@@ -0,0 +1,221 @@
+export default {
+
+    'white': '#fff',
+    'black': '#262728',
+    'grey': '#161616',
+    'red': '#A82429',
+
+    'versions': {
+        'de': {
+            'paths': [
+                'M 408.328,56.6992 C 408.328,28.1445 385.188,5 356.641,5 c -28.555,0 -51.7,23.1445 -51.7,51.6992 0,28.5352 23.145,51.6798 51.7,51.6798 28.547,0 51.687,-23.1446 51.687,-51.6798',
+                'm 408.328,56.6992 -5,0 C 403.324,43.7891 398.109,32.1484 389.652,23.6797 381.188,15.2148 369.547,10 356.641,10 c -12.914,0 -24.555,5.2148 -33.024,13.6797 -8.457,8.4687 -13.676,20.1094 -13.676,33.0195 0,12.8985 5.219,24.5391 13.676,33.0078 8.469,8.4571 20.11,13.672 33.024,13.672 12.906,0 24.55,-5.2149 33.011,-13.672 8.457,-8.4687 13.672,-20.1093 13.676,-33.0078 l 10,0 c -0.004,31.2969 -25.379,56.6798 -56.687,56.6798 -31.321,0 -56.696,-25.3829 -56.7,-56.6798 C 299.945,25.3828 325.32,0 356.641,0 c 31.308,0 56.683,25.3828 56.687,56.6992 l -5,0',
+                'M 259.812,56.6992 C 259.812,28.1445 236.672,5 208.125,5 179.57,5 156.438,28.1445 156.438,56.6992 c 0,28.5352 23.132,51.6798 51.687,51.6798 28.547,0 51.687,-23.1446 51.687,-51.6798',
+                'm 259.812,56.6992 -5,0 C 254.809,43.7891 249.594,32.1484 241.137,23.6797 232.672,15.2148 221.031,10 208.125,10 c -12.914,0 -24.551,5.2148 -33.02,13.6719 -8.457,8.4648 -13.667,20.1172 -13.667,33.0273 0,12.8985 5.21,24.5391 13.667,33.0078 8.469,8.4571 20.106,13.672 33.02,13.672 12.906,0 24.551,-5.2149 33.012,-13.672 8.457,-8.4687 13.672,-20.1093 13.675,-33.0078 l 10,0 c -0.003,31.2969 -25.378,56.6798 -56.687,56.6798 -31.316,0 -56.684,-25.3829 -56.687,-56.6798 C 151.438,25.3828 176.809,0 208.125,0 c 31.309,0 56.684,25.3828 56.687,56.6992 l -5,0',
+                'M 108.391,56.6992 C 108.391,28.1445 85.2344,5 56.6992,5 28.1445,5 5,28.1445 5,56.6992 c 0,28.5352 23.1445,51.6798 51.6992,51.6798 28.5352,0 51.6918,-23.1446 51.6918,-51.6798',
+                'm 108.391,56.6992 -5,0 C 103.383,43.7891 98.168,32.1484 89.707,23.6797 81.2383,15.2148 69.5977,10 56.6992,10 43.7852,10 32.1445,15.2148 23.6758,23.6797 15.2188,32.1484 10,43.7891 10,56.6992 c 0,12.8985 5.2188,24.5391 13.6758,33.0078 8.4687,8.4571 20.1094,13.672 33.0234,13.672 12.8985,0 24.5391,-5.2149 33.0078,-13.672 8.461,-8.4687 13.684,-20.1093 13.684,-33.0078 l 10,0 C 113.383,87.9961 87.9961,113.379 56.6992,113.379 25.3828,113.379 0.00390625,87.9961 0,56.6992 0.00390625,25.3828 25.3828,0 56.6992,0 87.9961,0 113.383,25.3828 113.391,56.6992 l -5,0',
+                'm 259.812,189.16 c 0,-28.555 -23.14,-51.699 -51.687,-51.699 -28.555,0 -51.687,23.144 -51.687,51.699 0,28.535 23.132,51.68 51.687,51.68 28.547,0 51.687,-23.145 51.687,-51.68',
+                'm 259.812,189.16 -5,0 c -0.003,-12.91 -5.218,-24.551 -13.675,-33.019 -8.465,-8.465 -20.106,-13.68 -33.012,-13.68 -12.914,0 -24.551,5.215 -33.02,13.672 -8.457,8.465 -13.667,20.117 -13.667,33.027 0,12.899 5.21,24.539 13.667,33.008 8.469,8.457 20.106,13.672 33.02,13.672 12.906,0 24.551,-5.215 33.012,-13.672 8.457,-8.469 13.672,-20.109 13.675,-33.008 l 10,0 c -0.003,31.301 -25.378,56.68 -56.687,56.68 -31.316,0 -56.684,-25.379 -56.687,-56.68 0,-31.316 25.371,-56.699 56.687,-56.699 31.309,0 56.684,25.383 56.687,56.699 l -5,0',
+                'm 408.328,189.16 c 0,-28.555 -23.14,-51.699 -51.687,-51.699 -28.555,0 -51.7,23.144 -51.7,51.699 0,28.535 23.145,51.68 51.7,51.68 28.547,0 51.687,-23.145 51.687,-51.68',
+                'm 408.328,189.16 -5,0 c -0.004,-12.91 -5.219,-24.551 -13.676,-33.019 -8.464,-8.465 -20.105,-13.68 -33.011,-13.68 -12.914,0 -24.555,5.215 -33.024,13.68 -8.457,8.468 -13.676,20.109 -13.676,33.019 0,12.899 5.219,24.539 13.676,33.008 8.469,8.457 20.11,13.672 33.024,13.672 12.906,0 24.55,-5.215 33.011,-13.672 8.457,-8.469 13.672,-20.109 13.676,-33.008 l 10,0 c -0.004,31.301 -25.379,56.68 -56.687,56.68 -31.321,0 -56.696,-25.379 -56.7,-56.68 0.004,-31.316 25.379,-56.699 56.7,-56.699 31.308,0 56.683,25.383 56.687,56.699 l -5,0',
+                'm 108.391,189.16 c 0,-28.555 -23.1566,-51.699 -51.6918,-51.699 C 28.1445,137.461 5,160.605 5,189.16 c 0,28.535 23.1445,51.68 51.6992,51.68 28.5352,0 51.6918,-23.145 51.6918,-51.68',
+                'm 108.391,189.16 -5,0 c -0.008,-12.91 -5.223,-24.551 -13.684,-33.019 -8.4687,-8.465 -20.1093,-13.68 -33.0078,-13.68 -12.914,0 -24.5547,5.215 -33.0234,13.68 C 15.2188,164.609 10,176.25 10,189.16 c 0,12.899 5.2188,24.539 13.6758,33.008 8.4687,8.457 20.1094,13.672 33.0234,13.672 12.8985,0 24.5391,-5.215 33.0078,-13.672 8.461,-8.469 13.684,-20.109 13.684,-33.008 l 10,0 C 113.383,220.461 87.9961,245.84 56.6992,245.84 25.3828,245.84 0.00390625,220.461 0,189.16 c 0.00390625,-31.316 25.3828,-56.699 56.6992,-56.699 31.2969,0 56.6838,25.383 56.6918,56.699 l -5,0',
+                'm 259.812,319.812 c 0,-28.55 -23.14,-51.699 -51.687,-51.699 -28.555,0 -51.687,23.149 -51.687,51.699 0,28.536 23.132,51.68 51.687,51.68 28.547,0 51.687,-23.144 51.687,-51.68',
+                'm 259.812,319.812 -5,0 c -0.003,-12.91 -5.218,-24.558 -13.675,-33.015 -8.465,-8.469 -20.106,-13.684 -33.012,-13.684 -12.914,0 -24.551,5.215 -33.02,13.684 -8.457,8.457 -13.667,20.105 -13.667,33.015 0,12.903 5.21,24.543 13.667,33.004 8.469,8.457 20.106,13.676 33.02,13.676 12.906,0 24.551,-5.219 33.012,-13.676 8.457,-8.461 13.672,-20.101 13.675,-33.004 l 10,0 c -0.003,31.301 -25.378,56.676 -56.687,56.68 -31.316,-0.004 -56.684,-25.379 -56.687,-56.68 0,-31.316 25.371,-56.699 56.687,-56.699 31.309,0 56.684,25.383 56.687,56.699 l -5,0',
+                'm 408.328,319.812 c 0,-28.55 -23.14,-51.699 -51.687,-51.699 -28.555,0 -51.7,23.149 -51.7,51.699 0,28.536 23.145,51.68 51.7,51.68 28.547,0 51.687,-23.144 51.687,-51.68',
+                'm 408.328,319.812 -5,0 c -0.004,-12.91 -5.219,-24.558 -13.676,-33.015 -8.464,-8.469 -20.105,-13.684 -33.011,-13.684 -12.914,0 -24.555,5.215 -33.024,13.684 -8.457,8.457 -13.676,20.105 -13.676,33.015 0,12.903 5.219,24.543 13.676,33.004 8.469,8.457 20.11,13.676 33.024,13.676 12.906,0 24.55,-5.219 33.011,-13.676 8.457,-8.461 13.672,-20.101 13.676,-33.004 l 10,0 c -0.004,31.301 -25.379,56.676 -56.687,56.68 -31.321,-0.004 -56.696,-25.379 -56.7,-56.68 0.004,-31.316 25.379,-56.699 56.7,-56.699 31.308,0 56.683,25.383 56.687,56.699 l -5,0',
+                'm 108.391,319.812 c 0,-28.55 -23.1566,-51.699 -51.6918,-51.699 C 28.1445,268.113 5,291.262 5,319.812 c 0,28.536 23.1445,51.68 51.6992,51.68 28.5352,0 51.6918,-23.144 51.6918,-51.68',
+                'm 108.391,319.812 -5,0 c -0.008,-12.91 -5.223,-24.55 -13.684,-33.015 -8.4687,-8.469 -20.1093,-13.684 -33.0078,-13.684 -12.914,0 -24.5547,5.215 -33.0234,13.684 C 15.2188,295.254 10,306.902 10,319.812 c 0,12.903 5.2188,24.543 13.6758,33.004 8.4687,8.457 20.1094,13.676 33.0234,13.676 12.8985,0 24.5391,-5.219 33.0078,-13.676 8.461,-8.461 13.684,-20.101 13.684,-33.004 l 10,0 c -0.008,31.301 -25.3949,56.676 -56.6918,56.68 C 25.3828,376.488 0.00390625,351.113 0,319.812 c 0.00390625,-31.316 25.3828,-56.699 56.6992,-56.699 31.2969,0 56.6838,25.383 56.6918,56.699 l -5,0',
+                // red
+                'm 523.32,126.824 c 16.895,0 28.328,10.988 28.328,33.274 0,25.105 -10.437,31.394 -28.328,31.394 l -12.922,0 0,-64.668 12.922,0 z m -44.726,95.434 54.172,0 c 30.808,0 51.687,-17.59 51.687,-57.766 0,-28.562 -14.172,-47.707 -33.555,-51.476 l 0,-0.946 c 6.465,-1.261 13.672,-5.031 19.141,-25.4216 l 22.617,-83.50387 -33.808,0 -17.149,71.25777 c -4.219,17.2696 -12.414,22.9102 -24.101,22.9102 l -7.2,0 0,-94.16797 -31.804,0 0,219.11347',
+                'm 612.793,3.14453 31.8164,0 0,219.113 -31.8164,0 0,-219.113 z',
+                'm 673.691,45.5273 c 6.211,-5.0312 19.883,-13.5078 36.778,-13.5078 13.918,0 26.328,9.7461 26.328,31.7188 0,15.6875 -7.195,22.6015 -22.598,33.2656 l -16.152,11.3051 c -17.149,11.925 -28.34,29.191 -28.34,57.445 0,39.234 25.605,59.637 54.68,59.637 18.386,0 31.297,-5.965 36.277,-7.84 l -1.492,-33.598 c -7.707,3.77 -17.895,9.414 -32.551,9.414 -15.898,0 -24.109,-10.664 -24.109,-25.738 0,-16.32 8.699,-22.602 18.386,-29.504 l 18.645,-13.184 c 20.379,-14.445 30.066,-28.2535 30.066,-59.0113 0,-44.5742 -25.097,-65.9179812 -58.144,-65.9179812 -17.403,0 -30.82,3.1328112 -39.512,9.7226612 l 1.738,35.79292',
+                'm 794.473,3.14453 31.8047,0 0,219.113 -31.8047,0 0,-219.113 z',
+                'm 857.598,222.258 31.816,0 0,-92.934 0.742,0 49.453,92.934 36.524,0 -58.887,-103.285 63.613,-115.82847 -38.515,0 -52.188,102.95747 -0.742,0 0,-102.95747 -31.816,0 0,219.11347',
+                'm 1038.03,30.7695 c 20.11,0 36.27,21.6602 36.27,81.9255 0,60.274 -16.16,81.934 -36.27,81.934 -20.14,0 -36.29,-21.66 -36.29,-81.934 0,-60.2653 16.15,-81.9255 36.29,-81.9255 z m 0,194.6215 c 36.02,0 69.08,-33.899 69.08,-112.696 0,-78.777 -33.06,-112.6832812 -69.08,-112.6832812 -36.04,0 -69.092,33.9062812 -69.092,112.6832812 0,78.797 33.052,112.696 69.092,112.696',
+                'm 1130.98,222.258 31.81,0 0,-92.934 0.75,0 49.45,92.934 36.52,0 -58.88,-103.285 63.61,-115.82847 -38.52,0 -52.18,102.95747 -0.75,0 0,-102.95747 -31.81,0 0,219.11347',
+                'm 1311.41,30.7695 c 20.12,0 36.27,21.6602 36.27,81.9255 0,60.274 -16.15,81.934 -36.27,81.934 -20.14,0 -36.29,-21.66 -36.29,-81.934 0,-60.2653 16.15,-81.9255 36.29,-81.9255 z m 0,194.6215 c 36.02,0 69.08,-33.899 69.08,-112.696 0,-78.777 -33.06,-112.6832812 -69.08,-112.6832812 -36.04,0 -69.09,33.9062812 -69.09,112.6832812 0,78.797 33.05,112.696 69.09,112.696',
+                'm 1541.78,185.84 -0.49,0 -43.5,-182.69547 -22.61,0 -41.49,182.69547 -0.51,0 0,-182.69547 -28.81,0 0,219.11347 47.46,0 35.79,-163.5471 0.49,0 36.53,163.5471 45.97,0 0,-219.11347 -28.83,0 0,182.69547',
+                'm 1643.69,119.598 c 19.88,0 28.58,12.246 28.58,36.117 0,23.844 -8.7,35.777 -28.58,35.777 l -11.93,0 0,-71.894 11.93,0 z m -43.73,102.66 49.69,0 c 35.78,0 54.42,-25.121 54.42,-66.543 0,-41.449 -18.64,-66.8752 -54.42,-66.8752 l -17.89,0 0,-85.69527 -31.8,0 0,219.11347',
+                'm 1724.47,222.258 91.19,0 0,-32.024 -59.39,0 0,-58.39 56.17,0 0,-32.0081 -56.17,0 0,-64.6679 61.87,0 0,-32.02347 -93.67,0 0,219.11347',
+                'm 1868.61,190.234 -38.77,0 0,32.024 109.11,0 0,-32.024 -38.53,0 0,-187.08947 -31.81,0 0,187.08947',
+                'm 1956.84,222.258 91.2,0 0,-32.024 -59.39,0 0,-58.39 56.15,0 0,-32.0081 -56.15,0 0,-64.6679 61.88,0 0,-32.02347 -93.69,0 0,219.11347',
+                'm 2074.89,222.258 37.78,0 57.64,-172.0236 0.51,0 0,172.0236 28.82,0 0,-219.11347 -38.02,0 -57.4,170.76947 -0.5,0 0,-170.76947 -28.83,0 0,219.11347',
+                'm 2221.03,38.3008 68.35,151.9332 -66.36,0 0,32.024 103.37,0 0,-33.285 -69.09,-153.805 70.08,0 0,-32.02347 -106.35,0 0,35.15627',
+                // grey
+                'm 479.414,375.027 11.27,0 0,-35.254 37.636,0 0,35.254 11.282,0 0,-84.273 -11.282,0 0,38.394 -37.636,0 0,-38.394 -11.27,0 0,84.273',
+                'm 620.84,363.68 -15.664,-41.778 31.34,0 -15.676,41.778 z m -5.52,11.347 11.836,0 33.254,-84.273 -12.285,0 -8.008,21.246 -38.535,0 -8.008,-21.246 -11.836,0 33.582,84.273',
+                'm 712.578,338.816 9.578,0 c 10.715,0 17.016,5.071 17.016,13.157 0,7.605 -5.402,12.441 -15.774,12.441 l -10.82,0 0,-25.598 z m -11.269,36.211 19.277,0 c 15.547,0 30.535,-2.644 30.535,-22.812 0,-10.262 -7.098,-17.5 -16.238,-19.199 l 0,-0.243 c 3.496,-1.445 5.195,-3.261 7.676,-8.449 l 14.875,-33.57 -12.844,0 -12.07,29.215 c -3.489,8.215 -7.208,8.215 -13.184,8.215 l -6.758,0 0,-37.43 -11.269,0 0,84.273',
+                'm 811.523,301.375 11.836,0 c 19.375,0 30.098,10.02 30.098,31.758 0,19.687 -12.519,31.281 -28.75,31.281 l -13.184,0 0,-63.039 z m -11.269,73.652 23.223,0 c 23.32,0 41.914,-15.449 41.914,-41.406 0,-28.262 -15.996,-42.867 -41.914,-42.867 l -23.223,0 0,84.273',
+                'm 912.5,290.754 11.2695,0 0,84.2734 -11.2695,0 0,-84.2734 z',
+                'm 973.918,375.027 15.32,0 34.712,-67.851 0.23,0 0,67.851 11.27,0 0,-84.273 -14.43,0 -35.61,69.312 -0.222,0 0,-69.312 -11.27,0 0,84.273',
+                'm 1145.32,360.066 c -5.52,3.868 -11.49,5.793 -21.63,5.793 -18.14,0 -30.2,-14.132 -30.2,-32.961 0,-19.804 13.29,-32.968 29.64,-32.968 7.77,0 9.8,0.84 12.61,1.445 l 0,25.605 -16.56,0 0,9.903 27.83,0 0,-43.836 c -4.28,-1.574 -11.72,-3.742 -24,-3.742 -24.9,0 -41.47,17.148 -41.47,43.945 0,25.969 17.58,43.242 41.59,43.242 11.48,0 16.56,-1.816 23.09,-4.238 l -0.9,-12.188',
+                'm 1191.41,318.641 28.9609,0 0,9.17969 -28.9609,0 0,-9.17969 z',
+                'm 1258.35,301.621 40.79,62.793 -39.43,0 0,10.613 52.4,0 0,-10.859 -40.68,-62.793 41.35,0 0,-10.621 -54.43,0 0,10.867',
+                'm 1358.09,375.027 44.06,0 0,-10.613 -32.79,0 0,-24.641 29.86,0 0,-10.625 -29.86,0 0,-27.773 32.79,0 0,-10.621 -44.06,0 0,84.273',
+                'm 1450.16,375.027 15.33,0 34.71,-67.851 0.21,0 0,67.851 11.27,0 0,-84.273 -14.41,0 -35.62,69.312 -0.22,0 0,-69.312 -11.27,0 0,84.273',
+                'm 1577.5,364.414 -24.45,0 0,10.613 60.17,0 0,-10.613 -24.45,0 0,-73.66 -11.27,0 0,73.66',
+                'm 1665.18,338.816 9.58,0 c 10.71,0 17.02,5.071 17.02,13.157 0,7.605 -5.41,12.441 -15.78,12.441 l -10.82,0 0,-25.598 z m -11.27,36.211 19.27,0 c 15.55,0 30.54,-2.644 30.54,-22.812 0,-10.262 -7.1,-17.5 -16.24,-19.199 l 0,-0.243 c 3.51,-1.445 5.2,-3.261 7.68,-8.449 l 14.87,-33.57 -12.84,0 -12.07,29.215 c -3.49,8.215 -7.21,8.215 -13.18,8.215 l -6.76,0 0,-37.43 -11.27,0 0,84.273',
+                'm 1814.73,325.652 c 0,-23.672 -11.17,-36.347 -30.55,-36.347 -19.38,0 -30.54,12.675 -30.54,36.347 l 0,49.375 11.26,0 0,-47.812 c 0,-16.172 4.75,-27.285 19.28,-27.285 14.54,0 19.28,11.113 19.28,27.285 l 0,47.812 11.27,0 0,-49.375',
+                'm 1865.21,375.027 18.6,0 24.67,-70.027 24.23,70.027 18.6,0 0,-84.273 -11.27,0 0,72.926 -0.23,0 -26.03,-72.926 -11.05,0 -26.03,72.926 -0.23,0 0,-72.926 -11.26,0 0,84.273',
+                'm 2062.42,375.027 41.81,0 0,-10.613 -30.54,0 0,-24.641 29.18,0 0,-10.625 -29.18,0 0,-38.394 -11.27,0 0,84.273',
+                'm 2184.13,393.656 10.6,0 0,-12.078 -10.6,0 0,12.078 z m -18.49,0 10.6,0 0,-12.078 -10.6,0 0,12.078 z m 45.08,-68.004 c 0,-23.672 -11.15,-36.347 -30.53,-36.347 -19.39,0 -30.54,12.675 -30.54,36.347 l 0,49.375 11.27,0 0,-47.812 c 0,-16.172 4.72,-27.285 19.27,-27.285 14.54,0 19.26,11.113 19.26,27.285 l 0,47.812 11.27,0 0,-49.375',
+                'm 2271.69,338.816 9.58,0 c 10.7,0 17.02,5.071 17.02,13.157 0,7.605 -5.42,12.441 -15.78,12.441 l -10.82,0 0,-25.598 z m -11.27,36.211 19.27,0 c 15.55,0 30.54,-2.644 30.54,-22.812 0,-10.262 -7.1,-17.5 -16.23,-19.199 l 0,-0.243 c 3.5,-1.445 5.19,-3.261 7.67,-8.449 l 14.87,-33.57 -12.85,0 -12.05,29.215 c -3.5,8.215 -7.21,8.215 -13.18,8.215 l -6.77,0 0,-37.43 -11.27,0 0,84.273',
+            ],
+
+            'fills': [
+                '#A82429',
+                '#A82429',
+                '#FFFFFF',
+                '#262728',
+                '#FFFFFF',
+                '#262728',
+                '#FFFFFF',
+                '#262728',
+                '#FFFFFF',
+                '#262728',
+                '#FFFFFF',
+                '#262728',
+                '#FFFFFF',
+                '#262728',
+                '#FFFFFF',
+                '#262728',
+                '#FFFFFF',
+                '#262728',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#161616'
+            ],
+            'transform': {  // homogeneous transformation matrix stripped off its last row
+                'a11': 0.05,
+                'a21': 0,
+                'a12': 0,
+                'a22': -0.05,
+                'a13': 65,
+                'a23': 375
+            }
+        },
+        'en': {
+            /* extracted paths from svg file, converted colours to hex, converted 'I'-rects to paths */
+            'paths': [
+                'M40.833,32.331C40.833,35.186 38.518,37.5 35.664,37.5C32.808,37.5 30.494,35.186 30.494,32.331C30.494,29.477 32.808,27.163 35.664,27.163C38.518,27.163 40.833,29.477 40.833,32.331Z',
+                'M40.833,32.331L40.333,32.331C40.332,33.622 39.811,34.786 38.965,35.632C38.118,36.479 36.954,37 35.664,37C34.372,37 33.208,36.479 32.361,35.632C31.516,34.786 30.994,33.622 30.994,32.331C30.994,31.041 31.516,29.877 32.361,29.03C33.208,28.184 34.372,27.663 35.664,27.663C36.954,27.663 38.119,28.184 38.965,29.03C39.811,29.877 40.332,31.041 40.333,32.331L41.333,32.331C41.332,29.201 38.794,26.663 35.664,26.663C32.532,26.663 29.994,29.201 29.994,32.331C29.994,35.462 32.532,38 35.664,38C38.794,38 41.332,35.462 41.333,32.331L40.833,32.331Z',
+                'M25.981,32.331C25.981,35.186 23.667,37.5 20.812,37.5C17.957,37.5 15.643,35.186 15.643,32.331C15.643,29.477 17.957,27.163 20.812,27.163C23.667,27.163 25.981,29.477 25.981,32.331Z',
+                'M25.981,32.331L25.481,32.331C25.481,33.622 24.959,34.786 24.113,35.632C23.267,36.479 22.103,37 20.812,37C19.521,37 18.357,36.479 17.51,35.633C16.665,34.787 16.143,33.622 16.143,32.331C16.143,31.041 16.665,29.877 17.51,29.03C18.357,28.184 19.521,27.663 20.812,27.663C22.103,27.663 23.267,28.184 24.113,29.03C24.959,29.877 25.481,31.041 25.481,32.331L26.481,32.331C26.481,29.201 23.943,26.663 20.812,26.663C17.68,26.663 15.144,29.201 15.143,32.331C15.143,35.462 17.68,38 20.812,38C23.943,38 26.481,35.462 26.481,32.331L25.981,32.331Z',
+                'M10.838,32.331C10.838,35.186 8.523,37.5 5.669,37.5C2.814,37.5 0.5,35.186 0.5,32.331C0.5,29.477 2.814,27.163 5.669,27.163C8.523,27.163 10.838,29.477 10.838,32.331Z',
+                'M10.838,32.331L10.338,32.331C10.338,33.622 9.816,34.786 8.97,35.632C8.124,36.479 6.959,37 5.669,37C4.378,37 3.214,36.479 2.367,35.632C1.521,34.786 1,33.622 1,32.331C1,31.041 1.521,29.877 2.367,29.03C3.214,28.184 4.378,27.663 5.669,27.663C6.959,27.663 8.124,28.184 8.97,29.03C9.816,29.877 10.338,31.041 10.338,32.331L11.338,32.331C11.338,29.201 8.799,26.663 5.669,26.663C2.538,26.663 0,29.201 0,32.331C0,35.462 2.538,38 5.669,38C8.799,38 11.338,35.462 11.338,32.331L10.838,32.331Z',
+                'M25.981,19.085C25.981,21.94 23.667,24.254 20.812,24.254C17.957,24.254 15.643,21.94 15.643,19.085C15.643,16.231 17.957,13.917 20.812,13.917C23.667,13.917 25.981,16.231 25.981,19.085Z',
+                'M25.981,19.085L25.481,19.085C25.481,20.376 24.959,21.54 24.113,22.386C23.267,23.233 22.103,23.754 20.812,23.754C19.521,23.754 18.357,23.233 17.51,22.387C16.665,21.541 16.143,20.376 16.143,19.085C16.143,17.795 16.665,16.63 17.51,15.784C18.357,14.938 19.521,14.417 20.812,14.417C22.103,14.417 23.267,14.938 24.113,15.784C24.959,16.63 25.481,17.795 25.481,19.085L26.481,19.085C26.481,15.955 23.943,13.417 20.812,13.417C17.68,13.417 15.144,15.955 15.143,19.085C15.143,22.216 17.68,24.754 20.812,24.754C23.943,24.754 26.481,22.216 26.481,19.085L25.981,19.085Z',
+                'M40.833,19.085C40.833,21.94 38.518,24.254 35.664,24.254C32.808,24.254 30.494,21.94 30.494,19.085C30.494,16.231 32.808,13.917 35.664,13.917C38.518,13.917 40.833,16.231 40.833,19.085Z',
+                'M40.833,19.085L40.333,19.085C40.332,20.376 39.811,21.54 38.965,22.386C38.118,23.233 36.954,23.754 35.664,23.754C34.372,23.754 33.208,23.233 32.361,22.386C31.516,21.54 30.994,20.376 30.994,19.085C30.994,17.795 31.516,16.63 32.361,15.784C33.208,14.938 34.372,14.417 35.664,14.417C36.954,14.417 38.119,14.938 38.965,15.784C39.811,16.63 40.332,17.795 40.333,19.085L41.333,19.085C41.332,15.955 38.794,13.417 35.664,13.417C32.532,13.417 29.994,15.955 29.994,19.085C29.994,22.216 32.532,24.754 35.664,24.754C38.794,24.754 41.332,22.216 41.333,19.085L40.833,19.085Z',
+                'M10.838,19.085C10.838,21.94 8.523,24.254 5.669,24.254C2.814,24.254 0.5,21.94 0.5,19.085C0.5,16.231 2.814,13.917 5.669,13.917C8.523,13.917 10.838,16.231 10.838,19.085Z',
+                'M10.838,19.085L10.338,19.085C10.338,20.376 9.816,21.54 8.97,22.386C8.124,23.233 6.959,23.754 5.669,23.754C4.378,23.754 3.214,23.233 2.367,22.386C1.521,21.54 1,20.376 1,19.085C1,17.795 1.521,16.63 2.367,15.784C3.214,14.938 4.378,14.417 5.669,14.417C6.959,14.417 8.124,14.938 8.97,15.784C9.816,16.63 10.338,17.795 10.338,19.085L11.338,19.085C11.338,15.955 8.799,13.417 5.669,13.417C2.538,13.417 0,15.955 0,19.085C0,22.216 2.538,24.754 5.669,24.754C8.799,24.754 11.338,22.216 11.338,19.085L10.838,19.085Z',
+                'M25.981,6.019C25.981,8.875 23.667,11.189 20.812,11.189C17.957,11.189 15.643,8.875 15.643,6.019C15.643,3.166 17.957,0.851 20.812,0.851C23.667,0.851 25.981,3.166 25.981,6.019Z',
+                'M25.981,6.019L25.481,6.019C25.481,7.31 24.959,8.475 24.113,9.321C23.267,10.168 22.103,10.689 20.812,10.689C19.521,10.689 18.357,10.168 17.51,9.321C16.665,8.475 16.143,7.31 16.143,6.019C16.143,4.729 16.665,3.565 17.51,2.719C18.357,1.873 19.521,1.351 20.812,1.351C22.103,1.351 23.267,1.873 24.113,2.719C24.959,3.565 25.481,4.729 25.481,6.019L26.481,6.019C26.481,2.889 23.943,0.352 20.812,0.351C17.68,0.352 15.144,2.889 15.143,6.019C15.143,9.151 17.68,11.689 20.812,11.689C23.943,11.689 26.481,9.151 26.481,6.019L25.981,6.019Z',
+                'M40.833,6.019C40.833,8.875 38.518,11.189 35.664,11.189C32.808,11.189 30.494,8.875 30.494,6.019C30.494,3.166 32.808,0.851 35.664,0.851C38.518,0.851 40.833,3.166 40.833,6.019Z',
+                'M40.833,6.019L40.333,6.019C40.332,7.31 39.811,8.475 38.965,9.321C38.118,10.168 36.954,10.689 35.664,10.689C34.372,10.689 33.208,10.168 32.361,9.321C31.516,8.475 30.994,7.31 30.994,6.019C30.994,4.729 31.516,3.565 32.361,2.719C33.208,1.873 34.372,1.351 35.664,1.351C36.954,1.351 38.119,1.873 38.965,2.719C39.811,3.565 40.332,4.729 40.333,6.019L41.333,6.019C41.332,2.889 38.794,0.352 35.664,0.351C32.532,0.352 29.994,2.889 29.994,6.019C29.994,9.151 32.532,11.689 35.664,11.689C38.794,11.689 41.332,9.151 41.333,6.019L40.833,6.019Z',
+                'M10.838,6.019C10.838,8.875 8.523,11.189 5.669,11.189C2.814,11.189 0.5,8.875 0.5,6.019C0.5,3.166 2.814,0.851 5.669,0.851C8.523,0.851 10.838,3.166 10.838,6.019Z',
+                'M10.838,6.019L10.338,6.019C10.338,7.31 9.816,8.474 8.97,9.321C8.124,10.168 6.959,10.689 5.669,10.689C4.378,10.689 3.214,10.168 2.367,9.321C1.521,8.475 1,7.31 1,6.019C1,4.729 1.521,3.565 2.367,2.719C3.214,1.873 4.378,1.351 5.669,1.351C6.959,1.351 8.124,1.873 8.97,2.719C9.816,3.565 10.338,4.729 10.338,6.019L11.338,6.019C11.338,2.889 8.799,0.352 5.669,0.351C2.538,0.352 0,2.889 0,6.019C0,9.151 2.538,11.689 5.669,11.689C8.799,11.689 11.338,9.151 11.338,6.019L10.838,6.019Z',
+                'M49.931,1.276L49.931,4.761L53.97,4.761L53.97,1.276L55.061,1.276L55.061,9.606L53.97,9.606L53.97,5.7L49.931,5.7L49.931,9.606L48.84,9.606L48.84,1.276L49.931,1.276Z',
+                'M63.88,6.145L63.05,3.748C62.864,3.204 62.741,2.709 62.616,2.227L62.592,2.227C62.467,2.709 62.344,3.229 62.17,3.735L61.352,6.145L63.88,6.145ZM61.129,6.986L60.262,9.606L59.147,9.606L61.997,1.276L63.286,1.276L66.135,9.606L64.983,9.606L64.09,6.986L61.129,6.986Z',
+                'M71.288,5.181L72.39,5.181C73.543,5.181 74.274,4.551 74.274,3.599C74.274,2.524 73.493,2.054 72.353,2.054C71.833,2.054 71.473,2.091 71.288,2.141L71.288,5.181ZM70.21,1.387C70.754,1.288 71.547,1.213 72.279,1.213C73.431,1.213 74.187,1.436 74.695,1.893C75.104,2.264 75.352,2.833 75.352,3.488C75.352,4.576 74.658,5.305 73.791,5.602L73.791,5.639C74.422,5.861 74.806,6.455 75.004,7.32C75.277,8.481 75.475,9.285 75.649,9.606L74.534,9.606C74.398,9.359 74.211,8.654 73.989,7.616C73.741,6.466 73.283,6.034 72.303,5.997L71.288,5.997L71.288,9.606L70.21,9.606L70.21,1.387Z',
+                // harding center for
+                'M80.801,8.765C81.074,8.802 81.47,8.815 81.892,8.815C84.209,8.815 85.448,7.53 85.448,5.28C85.46,3.315 84.345,2.067 82.065,2.067C81.507,2.067 81.086,2.116 80.801,2.178L80.801,8.765ZM79.723,1.399C80.38,1.288 81.161,1.213 82.015,1.213C83.564,1.213 84.668,1.584 85.398,2.252C86.154,2.932 86.587,3.896 86.587,5.243C86.587,6.603 86.154,7.715 85.385,8.481C84.592,9.26 83.304,9.68 81.681,9.68C80.901,9.68 80.268,9.643 79.723,9.582L79.723,1.399Z',
+                // <rect x='90.81' y='1.276' width='1.09' height='8.33' style='fill:rgb(40,44,46);fill-rule:nonzero;'/>
+                'M90.81,1.276L90.81,9.606L91.90,9.606L91.90,1.276Z',
+                'M96.632,9.606L96.632,1.276L97.822,1.276L100.486,5.491C101.094,6.466 101.589,7.344 101.974,8.197L102.011,8.185C101.911,7.072 101.887,6.059 101.887,4.761L101.887,1.276L102.902,1.276L102.902,9.606L101.813,9.606L99.161,5.379C98.578,4.452 98.02,3.501 97.612,2.598L97.575,2.61C97.636,3.661 97.649,4.663 97.649,6.046L97.649,9.606L96.632,9.606Z',
+                'M114.002,9.235C113.519,9.42 112.552,9.693 111.425,9.693C110.161,9.693 109.12,9.372 108.302,8.592C107.583,7.9 107.138,6.788 107.138,5.491C107.138,3.006 108.859,1.189 111.66,1.189C112.626,1.189 113.395,1.399 113.754,1.573L113.481,2.45C113.035,2.24 112.478,2.091 111.635,2.091C109.604,2.091 108.277,3.352 108.277,5.441C108.277,7.554 109.541,8.802 111.499,8.802C112.205,8.802 112.688,8.704 112.937,8.581L112.937,6.096L111.251,6.096L111.251,5.231L114.002,5.231L114.002,9.235Z',
+                'M129.782,9.346C129.397,9.544 128.593,9.742 127.577,9.742C125.223,9.742 123.464,8.258 123.464,5.515C123.464,2.895 125.235,1.139 127.825,1.139C128.854,1.139 129.522,1.362 129.808,1.51L129.535,2.388C129.139,2.19 128.556,2.042 127.862,2.042C125.904,2.042 124.604,3.29 124.604,5.478C124.604,7.53 125.78,8.828 127.8,8.828C128.47,8.828 129.139,8.691 129.572,8.481L129.782,9.346Z',
+                'M138.306,5.7L135.071,5.7L135.071,8.704L138.689,8.704L138.689,9.606L133.981,9.606L133.981,1.276L138.503,1.276L138.503,2.178L135.071,2.178L135.071,4.811L138.306,4.811L138.306,5.7Z',
+                'M142.937,9.606L142.937,1.276L144.126,1.276L146.79,5.491C147.397,6.466 147.893,7.344 148.277,8.197L148.314,8.185C148.215,7.072 148.19,6.059 148.19,4.761L148.19,1.276L149.206,1.276L149.206,9.606L148.116,9.606L145.464,5.379C144.882,4.452 144.324,3.501 143.916,2.598L143.878,2.61C143.94,3.661 143.953,4.663 143.953,6.046L143.953,9.606L142.937,9.606Z',
+                'M155.523,2.19L152.983,2.19L152.983,1.276L159.166,1.276L159.166,2.19L156.614,2.19L156.614,9.606L155.523,9.606L155.523,2.19Z',
+                'M167.255,5.7L164.021,5.7L164.021,8.704L167.639,8.704L167.639,9.606L162.931,9.606L162.931,1.276L167.452,1.276L167.452,2.178L164.021,2.178L164.021,4.811L167.255,4.811L167.255,5.7Z',
+                'M172.965,5.181L174.067,5.181C175.22,5.181 175.951,4.551 175.951,3.599C175.951,2.524 175.17,2.054 174.03,2.054C173.51,2.054 173.15,2.091 172.965,2.141L172.965,5.181ZM171.887,1.387C172.433,1.288 173.226,1.213 173.956,1.213C175.108,1.213 175.864,1.436 176.372,1.893C176.781,2.264 177.029,2.833 177.029,3.488C177.029,4.576 176.335,5.305 175.468,5.602L175.468,5.639C176.1,5.861 176.483,6.455 176.682,7.32C176.954,8.481 177.152,9.285 177.326,9.606L176.211,9.606C176.075,9.359 175.889,8.654 175.666,7.616C175.418,6.466 174.96,6.034 173.98,5.997L172.965,5.997L172.965,9.606L171.887,9.606L171.887,1.387Z',
+                'M186.863,1.276L191.36,1.276L191.36,2.178L187.953,2.178L187.953,4.946L191.101,4.946L191.101,5.836L187.953,5.836L187.953,9.606L186.863,9.606L186.863,1.276Z',
+                'M196.402,5.478C196.402,7.27 197.369,8.865 199.079,8.865C200.788,8.865 201.755,7.294 201.755,5.404C201.755,3.735 200.888,2.004 199.091,2.004C197.294,2.004 196.402,3.661 196.402,5.478ZM202.895,5.354C202.895,8.21 201.147,9.742 199.017,9.742C196.799,9.742 195.263,8.024 195.263,5.502C195.263,2.858 196.897,1.127 199.128,1.127C201.42,1.127 202.895,2.87 202.895,5.354Z',
+                'M208.22,5.181L209.322,5.181C210.475,5.181 211.206,4.551 211.206,3.599C211.206,2.524 210.425,2.054 209.285,2.054C208.765,2.054 208.405,2.091 208.22,2.141L208.22,5.181ZM207.142,1.387C207.687,1.288 208.479,1.213 209.211,1.213C210.363,1.213 211.119,1.436 211.627,1.893C212.036,2.264 212.284,2.833 212.284,3.488C212.284,4.576 211.59,5.305 210.723,5.602L210.723,5.639C211.354,5.861 211.738,6.455 211.937,7.32C212.209,8.481 212.407,9.285 212.581,9.606L211.466,9.606C211.33,9.359 211.144,8.654 210.921,7.616C210.673,6.466 210.215,6.034 209.235,5.997L208.22,5.997L208.22,9.606L207.142,9.606L207.142,1.387Z',
+                // risk literacy
+                'M51.545,24.78L53.01,24.78C54.866,24.78 55.964,23.481 55.964,21.464C55.964,19.379 54.939,18.286 53.23,18.286C52.327,18.286 51.814,18.354 51.545,18.457L51.545,24.78ZM47.859,14.868C49.055,14.594 50.813,14.389 52.815,14.389C55.256,14.389 56.965,14.902 58.137,16.201C59.138,17.295 59.675,18.935 59.675,21.054C59.675,23.96 58.186,25.976 56.77,26.694L56.77,26.796C57.918,27.446 58.552,28.95 58.967,31.069C59.48,33.701 59.968,36.708 60.286,37.597L56.477,37.597C56.233,36.914 55.818,35.068 55.354,32.231C54.89,29.326 54.182,28.574 52.644,28.54L51.545,28.54L51.545,37.597L47.859,37.597L47.859,14.868Z',
+                // <rect x='62.967' y='14.56' width='3.711' height='23.037' style='fill:rgb(188,29,34);fill-rule:nonzero;'/>
+                'M62.967,14.56L62.976,37.597L66.678,37.597L66.678,14.56Z',  // converted
+                'M70.63,32.231C71.607,32.949 73.169,33.666 74.756,33.666C76.465,33.666 77.369,32.675 77.369,31.171C77.369,29.736 76.587,28.916 74.61,27.959C71.876,26.591 70.069,24.472 70.069,21.123C70.069,17.192 72.437,14.218 76.294,14.218C78.174,14.218 79.517,14.731 80.494,15.38L79.664,19.55C79.029,19.106 77.833,18.457 76.246,18.457C74.634,18.457 73.853,19.516 73.853,20.678C73.853,22.148 74.756,22.797 76.905,23.925C79.81,25.429 81.153,27.548 81.153,30.795C81.153,34.658 79.053,37.939 74.537,37.939C72.657,37.939 70.801,37.221 69.874,36.503L70.63,32.231Z',
+                'M84.298,14.56L87.985,14.56L87.985,24.746L88.034,24.746C88.4,23.857 88.791,23.037 89.181,22.216L92.892,14.56L97.482,14.56L92.038,24.37L97.751,37.597L93.429,37.597L89.377,27.651L87.985,30.078L87.985,37.597L84.298,37.597L84.298,14.56Z',
+                'M105.46,14.56L109.171,14.56L109.171,33.222L115.714,33.222L115.714,37.597L105.46,37.597L105.46,14.56Z',
+                // <rect x='118.542' y='14.56' width='3.711' height='23.037' style='fill:rgb(188,29,34);fill-rule:nonzero;'/>
+                'M118.542,14.56L118.542,37.597L122.253,37.597L122.253,14.56Z',
+                'M129.282,18.935L124.839,18.935L124.839,14.56L137.485,14.56L137.485,18.935L132.993,18.935L132.993,37.597L129.282,37.597L129.282,18.935Z',
+                'M149.858,27.856L143.804,27.856L143.804,33.325L150.566,33.325L150.566,37.597L140.093,37.597L140.093,14.56L150.225,14.56L150.225,18.833L143.804,18.833L143.804,23.618L149.858,23.618L149.858,27.856Z',
+                'M157.398,24.78L158.863,24.78C160.719,24.78 161.817,23.481 161.817,21.464C161.817,19.379 160.792,18.286 159.083,18.286C158.18,18.286 157.667,18.354 157.398,18.457L157.398,24.78ZM153.712,14.868C154.908,14.594 156.666,14.389 158.668,14.389C161.109,14.389 162.818,14.902 163.99,16.201C164.991,17.295 165.528,18.935 165.528,21.054C165.528,23.96 164.039,25.976 162.623,26.694L162.623,26.796C163.771,27.446 164.405,28.95 164.82,31.069C165.333,33.701 165.821,36.708 166.139,37.597L162.33,37.597C162.086,36.914 161.671,35.068 161.207,32.231C160.743,29.326 160.035,28.574 158.497,28.54L157.398,28.54L157.398,37.597L153.712,37.597L153.712,14.868Z',
+                'M177.022,27.788L175.997,22.9C175.704,21.533 175.411,19.824 175.167,18.457L175.118,18.457C174.874,19.824 174.63,21.567 174.361,22.9L173.385,27.788L177.022,27.788ZM172.848,31.684L171.676,37.597L167.843,37.597L172.848,14.56L177.73,14.56L182.857,37.597L178.829,37.597L177.56,31.684L172.848,31.684Z',
+                'M197.087,36.982C196.428,37.426 194.865,37.973 192.888,37.973C187.199,37.973 184.27,32.983 184.27,26.42C184.27,18.559 188.273,14.218 193.254,14.218C195.183,14.218 196.647,14.731 197.307,15.244L196.525,19.345C195.793,18.901 194.743,18.491 193.4,18.491C190.471,18.491 188.176,20.986 188.176,26.113C188.176,30.727 190.129,33.632 193.425,33.632C194.572,33.632 195.793,33.325 196.55,32.88L197.087,36.982Z',
+                'M204.138,37.597L204.138,28.164L198.938,14.56L203.21,14.56L204.87,20.097C205.383,21.772 205.749,23.003 206.14,24.506L206.188,24.506C206.555,23.071 206.945,21.738 207.434,20.097L209.094,14.56L213.269,14.56L207.849,27.993L207.849,37.597L204.138,37.597Z',
+            ],
+
+            'fills': [
+                '#A82429',
+                '#A82429',
+                '#FFFFFF',
+                '#262728',
+                '#FFFFFF',
+                '#262728',
+                '#FFFFFF',
+                '#262728',
+                '#FFFFFF',
+                '#262728',
+                '#FFFFFF',
+                '#262728',
+                '#FFFFFF',
+                '#262728',
+                '#FFFFFF',
+                '#262728',
+                '#FFFFFF',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#262728',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+                '#A82429',
+            ],
+            'transform': {
+                'a11': 0.64,
+                'a21': 0,
+                'a12': 0,
+                'a22': 0.64,
+                'a13': 25,
+                'a23': 26
+            }
+        },
+    }
+};
+// export { paths, fills };

+ 65 - 0
src/js/main.js

@@ -0,0 +1,65 @@
+import * as d3 from './d3-custom';
+import { Controller } from './controller';
+
+// Using postcss, see rollup.config.js for configuration
+import '../css/main.css';
+
+function riskLadder() {
+
+    let controller = undefined;
+    let catSelector = undefined;
+
+    init();
+
+    function init() {
+
+        controller = new Controller();
+        controller.init();
+
+        catSelector = d3.select('#category');
+
+        catSelector.on('change', filterByCategory);
+
+        function filterByCategory() {
+            controller.setCategory(this.value);
+        }
+
+        d3.select('body').on('keydown', scrollNavigation);
+
+        d3.select(window).on('scroll', scrolled);
+
+        d3.selectAll('select#geschlecht, select#alter').on('change', function() {
+            controller.filterSelectionChanged();
+        });
+
+        d3.select('#search').on('focus', function() {
+            d3.select('body').on('keydown', null);
+        });
+
+        d3.select('#search').on('blur', function() {
+            d3.select('body').on('keydown', scrollNavigation);
+        });
+    }
+
+    function scrollNavigation(event) {
+        if(event.keyCode === 38 || event.keyCode === 40) {  // scroll to previous / next entry
+
+            switch(event.keyCode) {
+                case 38:
+                    controller.scrollToEntry(controller.previousEntry());
+                    break;
+                case 40:
+                    controller.scrollToEntry(controller.nextEntry());
+                    break;
+            }
+
+            event.preventDefault();
+        }
+    }
+
+    function scrolled() {
+        controller.scrolled();
+    }
+}
+
+riskLadder();

+ 216 - 0
src/js/pdfExport.js

@@ -0,0 +1,216 @@
+import 'whatwg-fetch';
+
+import * as d3 from './d3-custom';
+import { round, typeset } from './utilities';
+
+import * as RA_LOGO from './logos/RA_logo_1280.js';
+import * as HC_LOGO from './logos/hc_logo.js';
+import * as BMJV_LOGO from './logos/BMJV_logo.js';
+
+export class PDFExport {
+
+    constructor(controller, labels, lang) {
+
+        this.controller = controller;
+        this.labels = labels;
+        this.lang = lang;
+        this.entries = undefined;
+        this.raLogo = RA_LOGO.default;
+        this.hcLogo = HC_LOGO.default;
+        this.bmjvLogo = BMJV_LOGO.default;
+
+        this.fontcounter = 0;
+        this.fontsloaded = 0;
+        this.fontData = {
+            'roman': { 'name': 'AsapCondensed', 'url': this.labels.path + 'fonts/Asap-Regular.ttf', 'data': undefined },
+            'bold': { 'name': 'AsapCondensed Bold', 'url': this.labels.path + 'fonts/Asap-Bold.ttf', 'data': undefined },
+            'italic': { 'name': 'AsapCondensed Italic', 'url': this.labels.path + 'fonts/Asap-Italic.ttf', 'data': undefined },
+        };
+
+        this.lineSpacing = 1.5;
+        this.baseFontSize = 11;
+
+        this.offset = {
+            x: 4 * this.baseFontSize,
+            y: 8 * this.baseFontSize
+        };
+
+        this.fontcounter = Object.keys(this.fontData).length;
+
+        for (let md in this.fontData) {
+            let cfd = this.fontData[md];
+
+            window.fetch(cfd.url)
+                .then(response => response.arrayBuffer())
+                .then(data => {
+                    cfd.data = data;
+                    this.fontsloaded += 1;
+                    if (this.fontsloaded === Object.keys(this.fontData).length) {
+                        if (this.entries !== undefined) {
+                            this.drawPDF();
+                        }
+                    }
+                });
+        }
+    }
+
+    entriesListUpdated(entries) {
+        this.entries = entries;
+        if(this.fontsloaded < Object.keys(this.fontData).length) {  // only draw after all fonts are loaded
+            return;
+        }
+        this.drawPDF();
+    }
+
+    hideDownloadButton(visibility) {
+        this.controller.hideDownloadButton(visibility);
+    }
+
+    drawPDF() {
+
+        if(this.entries.length < 1) {
+            this.hideDownloadButton(true);
+        } else {
+            this.hideDownloadButton(false);
+        }
+
+        let doc = new PDFDocument(  // eslint-disable-line no-undef
+            {
+                size: 'A5',
+                layout: 'landscape',
+                margin: 0
+            }
+        );
+
+        // RA LOGO
+        doc.save();
+        doc.transform(
+            this.raLogo.transform.a11,
+            this.raLogo.transform.a21,
+            this.raLogo.transform.a12,
+            this.raLogo.transform.a22,
+            this.raLogo.transform.a13,
+            this.raLogo.transform.a23
+        );
+
+        for (let i = 0; i < this.raLogo.elements.length; i += 1) {
+            let el = this.raLogo.elements[i];
+            doc.fillColor(el.fill);
+            doc.path(el.data);
+            doc.fill(el.fillRule);
+        }
+        doc.restore();
+
+        // HC LOGO
+        let logo = this.hcLogo.versions[this.lang];
+        doc.save()
+            .transform(
+                logo.transform.a11,
+                logo.transform.a21,
+                logo.transform.a12,
+                logo.transform.a22,
+                logo.transform.a13,
+                logo.transform.a23
+            );
+
+        for (let i = 0; i < logo.paths.length; ++i) {
+            doc
+                .fillColor(logo.fills[i])
+                .path(logo.paths[i])
+                .fill('nonzero');
+        }
+        doc.restore();
+
+        // BMJV LOGO
+        doc.save();
+        doc.transform(
+            this.bmjvLogo.transform.a11,
+            this.bmjvLogo.transform.a21,
+            this.bmjvLogo.transform.a12,
+            this.bmjvLogo.transform.a22,
+            this.bmjvLogo.transform.a13,
+            this.bmjvLogo.transform.a23
+        );
+
+        for (let i = 0; i < this.bmjvLogo.elements.length; i += 1) {
+            let el = this.bmjvLogo.elements[i];
+            doc.fillColor(el.fill);
+            doc.path(el.data);
+            doc.fill(el.fillRule);
+        }
+        doc.restore();
+
+        // <<< LOGOS
+
+        for(let fd in this.fontData) {
+            let cfd = this.fontData[fd];
+            doc.registerFont(cfd.name, cfd.data);
+        }
+
+        this.stream = doc.pipe(blobStream());  // eslint-disable-line no-undef
+
+        let mainGroup = this.labels.mainGroup[this.lang];
+        // meta data
+        let title = this.labels.title[this.lang];
+        doc.info.Title = this.labels.title[this.lang];
+        doc.info.Author = this.labels.pdfAuthor;
+        doc.info.Subject = this.labels.title[this.lang];
+
+        // static text
+        doc
+            .fillColor('#333333')
+            .font(this.fontData.bold.name)
+            .fontSize(this.baseFontSize * 1.563)  // major third
+            .text(this.labels.title[this.lang], this.offset.x * 3, this.offset.y, { width: 410, continued: true })
+            .font(this.fontData.italic.name)
+            .fillColor('#888888')
+            .fontSize(this.baseFontSize)
+            .moveDown(0.45)
+            .text('  –  binnen eines Jahres');
+
+        doc.fontSize(this.baseFontSize * 1)
+            .fillColor('#888888')
+            .font(this.fontData.italic.name)
+            .text(this.labels.of[this.lang] + ' 100 000', this.offset.x, this.offset.y + 3 * this.baseFontSize, { width: 80, align: 'right' })
+            .text(mainGroup, this.offset.x * 3, this.offset.y + 3 * this.baseFontSize, { width: 100, align: 'left' });
+
+        doc.fillColor('#333333')
+            .font(this.fontData.roman.name);
+
+        // dynamic text: entries
+        this.entries.forEach(function(entry, i) {
+            // entry value
+            doc.font(this.fontData.roman.name)
+                .text(
+                    typeset(round(entry.value), this.lang),
+                    this.offset.x,
+                    (i + 3) * this.baseFontSize * this.lineSpacing + this.offset.y,
+                    { width: 80, align: 'right', lineBreak: false }
+                );
+            // entry reference group
+            doc.font(this.fontData.italic.name)
+                .text(
+                    entry.reason.referenceGroup + ': ',
+                    this.offset.x * 3,
+                    (i + 3) * this.baseFontSize * this.lineSpacing + this.offset.y,
+                    { width: 400, align: 'left', continued: true }
+                );
+            // entry title
+            doc.font(this.fontData.roman.name)
+                .text(
+                    entry.reason.title,
+                    this.offset.x * 3,
+                    (i + 3) * this.baseFontSize * this.lineSpacing + this.offset.y
+                );
+        }, this);
+
+        doc.end();
+
+        this.stream.on('finish', function() {
+            let link = d3.select('#exportPDF').node();
+            let url = this.toBlobURL('application/pdf');
+            link.href = url;
+            link.download = title + '.pdf';
+        });
+    }
+}

+ 139 - 0
src/js/progressBar.js

@@ -0,0 +1,139 @@
+import { round, typeset } from './utilities';
+
+export function createProgressBar(options) {
+
+    // dimensions
+    let width, height;
+    let x, y;
+    // common options
+    let colours;
+    let lang;  // needed for number formatting
+    let controller;
+
+    let max;
+
+    // svg element
+    let progressGroup;
+
+    function progressBar(selection) {
+        progressGroup = selection.append('g')
+            .attr('class', 'progress');
+
+        progressGroup.append('rect')
+            .attr('class', 'pbbg')
+            .attr('fill', colours.background);
+
+        progressGroup.append('rect')
+            .attr('class', 'pbindirect')
+            .attr('opacity', 0.8)
+            .attr('fill', colours.text);
+
+        let indi = progressGroup.append('g')
+            .attr('class', 'indicator');
+
+        indi.append('path')
+            .attr('stroke', colours.text);
+
+        indi.append('text')
+            .attr('x', (-width * 0.125))
+            .attr('fill', colours.text)
+            .attr('text-anchor', 'end');
+
+        progressGroup.attr('transform', 'translate(' + x + ',' + y + ')');
+
+        progressGroup.select('rect.pbbg')
+            .attr('height', height)
+            .attr('width', width);
+
+        progressGroup.select('rect.pbindirect')
+            .attr('width', width);
+
+        progressGroup.select('.indicator path')
+            .attr('d', 'M ' + (-width * 0.125) + ' 0 L 0 0');  // line progress indicator
+    }
+
+    progressBar.draw = function(cProgress) {
+        let indi = progressGroup.select('.indicator');
+        indi.attr('transform', 'translate(0,' + height * cProgress + ')');
+
+        progressGroup.select('.pbindirect')
+            .attr('height', height * cProgress);
+
+        indi.select('text')
+            .text(typeset(round(max * cProgress), lang));
+    };
+
+    progressBar.lang = function(val) {
+        if(!arguments.length) {
+            return lang;
+        }
+        lang = val;
+        return progressBar;
+    };
+
+    progressBar.max = function(val) {
+        if(!arguments.length) {
+            return max;
+        }
+        max = val;
+        return progressBar;
+    };
+
+    progressBar.controller = function(val) {
+        if(!arguments.length) {
+            return controller;
+        }
+        controller = val;
+        return progressBar;
+    };
+
+    progressBar.width = function(val) {
+        if(!arguments.length) {
+            return width;
+        }
+        width = val;
+        return progressBar;
+    };
+
+    progressBar.height = function(val) {
+        if(!arguments.length) {
+            return height;
+        }
+        height = val;
+        return progressBar;
+    };
+
+    progressBar.x = function(val) {
+        if(!arguments.length) {
+            return x;
+        }
+        x = val;
+        return progressBar;
+    };
+
+    progressBar.y = function(val) {
+        if(!arguments.length) {
+            return y;
+        }
+        y = val;
+        return progressBar;
+    };
+
+    progressBar.colours = function(val) {
+        if(!arguments.length) {
+            return colours;
+        }
+        colours = val;
+        return progressBar;
+    };
+
+    progressBar.controller(options.common.controller);
+    progressBar.lang(options.common.lang);
+    progressBar.width(options.width);
+    progressBar.height(options.height);
+    progressBar.x(options.x);
+    progressBar.y(options.y);
+    progressBar.colours(options.common.colours);
+    progressBar.max(options.max);
+    return progressBar;
+}

+ 94 - 0
src/js/referenceClass.js

@@ -0,0 +1,94 @@
+export function createReferenceClass(options) {
+
+    let x, y;
+    let referenceClassGroup;
+    let textGroup;
+
+    let labels;
+    let lang;
+    let colours;
+    let font;
+
+    function referenceClass(selection) {
+
+        referenceClassGroup = selection
+            .append('g')
+            .attr('transform', 'translate(' + x + ',' + y + ')')
+            .attr('class', 'reference-class');
+
+        referenceClassGroup
+            .append('rect')
+            .attr('class', 'reference-class-background')
+            .attr('transform', 'translate(' + (-5 * font.ratio.large) + ', ' + (-15 * font.ratio.large) + ')')
+            .attr('width', font.ratio.large * 10.5 + 'em')
+            .attr('height', 2 * font.ratio.large + 'em')
+            .attr('fill', colours.bright);
+
+        textGroup = referenceClassGroup.append('text');
+
+        // referenceClassGroup
+        textGroup
+            .attr('fill', colours.text);
+
+        textGroup.append('tspan')
+            .attr('attr', 'reference-class-size')
+            .attr('font-size', font.ratio.large + 'em')
+            .text(labels.per[lang] + String.fromCharCode(options.common.spaceFormat) + labels.referenceGroup.size);
+    }
+
+    referenceClass.x = function(val) {
+        if(!arguments.length) {
+            return x;
+        }
+        x = val;
+        return referenceClass;
+    };
+
+    referenceClass.font = function(val) {
+        if(!arguments.length) {
+            return font;
+        }
+        font = val;
+        return referenceClass;
+    };
+
+    referenceClass.y = function(val) {
+        if(!arguments.length) {
+            return y;
+        }
+        y = val;
+        return referenceClass;
+    };
+
+    referenceClass.labels = function(val) {
+        if(!arguments.length) {
+            return labels;
+        }
+        labels = val;
+        return referenceClass;
+    };
+
+    referenceClass.lang = function(val) {
+        if(!arguments.length) {
+            return lang;
+        }
+        lang = val;
+        return referenceClass;
+    };
+
+    referenceClass.colours = function(val) {
+        if(!arguments.length) {
+            return colours;
+        }
+        colours = val;
+        return referenceClass;
+    };
+
+    referenceClass.colours(options.common.colours);
+    referenceClass.labels(options.common.labels);
+    referenceClass.lang(options.common.lang);
+    referenceClass.font(options.common.font);
+    referenceClass.x(options.x);
+    referenceClass.y(options.y);
+    return referenceClass;
+}

+ 301 - 0
src/js/scrollView.js

@@ -0,0 +1,301 @@
+import * as d3 from './d3-custom';
+import { round, typeset } from './utilities';
+
+export function createScrollView(options) {
+
+    // dimensions
+    let offset;
+    let boundingBox;
+    let barHeight;   // height of bar in maximum (visible) scale
+
+    let colours;
+    let font;
+    let lang;
+
+    let transitionDuration;
+    let category = '';
+    let entries;
+    let digits = 2;
+
+    // svg element
+    let entriesGroup;
+
+    let controller;
+
+
+    function scrollView(selection) {
+
+        entriesGroup = selection.append('g')
+            .attr('class', 'entries');
+    }
+
+    scrollView.update = function(newData) {
+
+        // >>> UPDATE >>>
+        var urow = entriesGroup.selectAll('g.entry');
+        urow.exit().remove();
+
+        if(newData) {  // only when selection changed... update with transitions
+            urow.each(function() {  // tween text: animate numbers
+                d3.select(this).select('text.vtxt')
+                    .transition().duration(transitionDuration)
+                    .tween('text', function(d) {
+                        var node = this;
+                        var i = d3.interpolateNumber(d.previousValue, d.value);
+
+                        return function(t) {
+                            node.textContent = typeset(round(i(t))) + ' ' + d.reason.referenceGroup;
+                        };
+                    });
+                d3.select(this).select('.selectable')
+                    .on('click', function(e, d) { 
+                        controller.toggleSelection(d);
+                        let col = d.selected ? colours.highlight : colours.translucent;
+                        d3.select(this).attr('fill',col);
+                    })
+                    .on('mouseover', function() { d3.select(this).attr('fill', colours.highlight); })
+                    .on('mouseout', function(e, d) {
+                        let col = d.selected ? colours.highlight : colours.translucent;
+                        d3.select(this).attr('fill',col);
+                    });
+            });
+
+            urow.transition()  // (chained is problematic) transition: fade in / out, then translate
+                .duration(100)
+                .attr('opacity', function(d) {  // fade entries in / out
+                    if(d.y > boundingBox.height - barHeight) {
+                        return 0.0;
+                    }
+                    if(category !== '' && category !== d.reason.cat) {
+                        return 0.0;
+                    }
+                    return 1.0;
+                })
+                .transition()
+                .duration(transitionDuration)
+                .attr('transform', function(d) {
+                    console.log(d, boundingBox);
+                    return 'translate(' + (d.x + boundingBox.min.x) + ',' + (d.y + boundingBox.min.y) + ') scale(' + d.ratio + ',' + d.ratio + ')';
+                })
+                .on('end', function() {
+                    controller.dataProcessed();  // this should be the last transition to finish!
+                });
+
+            urow.sort(function(a, b) {  // update the drawing order of the svg elements
+                return a.y - b.y;
+            });
+
+        } else {  // adjustments on scroll (transitions only take place when elements leave / enter the 'view frustum')
+            urow.attr('transform', function(d) {
+                return 'translate(' + (d.x + boundingBox.min.x) + ',' + (d.y + boundingBox.min.y) + ') scale(' + d.ratio + ',' + d.ratio + ')'; 
+            });
+            urow.each(function() {  // adjust on scroll
+                d3.select(this).select('rect.clickable')
+                    .attr('width', boundingBox.width)
+                    .attr('height', barHeight);
+                d3.select(this).select('rect.value-bar')
+                    .attr('width', function(d) { return boundingBox.width * d.value / 100000; })
+                    .attr('height', barHeight)
+                    .attr('stroke-dasharray', function(d) {  // only draw top, bottom, and left sides of rect
+                        let wdth = boundingBox.width * d.value / 100000;
+                        return wdth + ' ' + barHeight + ' ' + (wdth + barHeight);
+                    });
+                d3.select(this).select('.vlabel')
+                    .attr('transform', 'translate(' + boundingBox.width + ',0)');
+
+                d3.select(this).select('.selectable')
+                    .attr('fill', function(d) { return d.selected ? colours.highlight : colours.translucent; });
+                d3.select(this).select('rect.vbg')
+                    .attr('height', barHeight)
+                    .attr('fill', colours.translucent)
+                    .attr('width', 14 * font.ratio.large * font.baseSize);
+            });
+            urow
+                .attr('visibility', function(d) {
+                    if(d.y > boundingBox.height - barHeight) {
+                        return 'hidden';
+                    }
+                    if(category !== '' && category !== d.reason.cat) {
+                        return 'hidden';
+                    }
+                    return 'visible';
+                });
+        }
+        // <<< UPDATE <<<
+
+        // >>> CREATE new entries >>>
+        var row = entriesGroup.selectAll('g.entry')
+            .data(entries, function(d) {
+                return d.reason.title; });  // use title as key
+
+        var entry = row.enter()
+            .append('g')                                                    // entry group
+            .attr('class', 'entry')
+            .attr('id', function(d, i) { return 'entry-' + i; })
+            .attr('transform', function(d) {
+                return 'translate(' + d.x + ',' + (d.y + boundingBox.min.y) + ') scale(' + d.ratio + ',' + d.ratio + ')';
+            });
+
+        entry.append('rect')                                                // clickable rect
+            .attr('class', 'clickable')
+            .attr('fill', '#ccc')
+            .attr('stroke', function (d) { return d.reason.colorFill; })
+            .on('click', function(event, d) { controller.showInfo(d); });
+
+        entry.append('rect')                                                // value bar
+            .attr('class', 'value-bar clickable')
+            .attr('id', function(d, i){ return 'node' + i; })
+            .attr('fill', function(d) { return d.reason.colorFill; })
+            .attr('stroke', function (d) { return d.reason.colorFill.brighter(); })
+            .on('click', function(event, d) { controller.showInfo(d); });
+
+        entry.append('clipPath')                                            // clip path for on-bar text
+            .attr('id', function(d, i) { return 'clip-node' + i; })
+            .append('use')
+            .attr('xlink:href', function(d, i) { return '#node' + i; });
+
+        entry.append('text')                                                // title label
+            .attr('class', 'title')
+            .attr('x', offset.x)
+            .attr('y', barHeight / 2 + offset.y)
+            .attr('fill', colours.text)
+            .text(function(d) { return d.reason.title; });
+
+        entry.append('text')                                                // title label
+            .attr('class', 'title')
+            .attr('x', offset.x)
+            .attr('y', barHeight / 2 + offset.y)
+            .attr('fill', colours.bright)
+            .attr('clip-path', function(d, i) { return 'url(#clip-node' + i + ')'; })
+            .text(function(d) { return d.reason.title; });
+
+        entry.append('use')                                                 // bookmark icon
+            .attr('xlink:href', '#bookmark')
+            .attr('transform', 'translate(' + (boundingBox.width - font.ratio.large * font.baseSize) + ',-0.5)')
+            .attr('width', font.ratio.medium * font.baseSize)
+            .attr('height', font.ratio.medium * font.baseSize)
+            .attr('stroke', colours.bright)
+            .attr('stroke-width', 0.4)
+            .attr('fill', function(d) { return d.selected ? colours.highlight : colours.translucent; })
+            .attr('class', 'bookmark clickable selectable')
+            .on('click', function(e, d) { controller.toggleSelection(d); })
+            .on('mouseover', function() {
+                d3.select(this).attr('fill', colours.highlight);
+            })
+            .on('mouseout', function(e, d) {
+                let col = d.selected ? colours.highlight : colours.translucent;
+                d3.select(this).attr('fill',col);
+            });
+
+        var vlabel = entry.append('g')                                      // value label group
+            .attr('class', 'vlabel');
+
+        vlabel.append('rect')                                                // value background
+            .attr('class', 'vbg');
+
+        vlabel.append('text')                                                // value label
+            .attr('class', 'vtxt')
+            .attr('x', offset.x)
+            .attr('y', barHeight / 2 + offset.y)
+            .attr('fill', colours.text)
+            .text(function(d) { return typeset(round(d.value), lang) + ' ' + d.reason.referenceGroup; });
+        // <<< CREATE <<<
+    };
+
+    scrollView.controller = function(val) {
+        if(!arguments.length) {
+            return controller;
+        }
+        controller = val;
+        return scrollView;
+    };
+
+    scrollView.offset = function(val) {
+        if(!arguments.length) {
+            return offset;
+        }
+        offset = val;
+        return scrollView;
+    };
+
+    scrollView.entries = function(val) {
+        if(!arguments.length) {
+            return entries;
+        }
+        entries = val;
+        return scrollView;
+    };
+
+    // colours >>>
+    scrollView.colours = function(obj) {
+        if(!arguments.length) {
+            return colours;
+        }
+        colours = obj;
+        return scrollView;
+    };
+
+    scrollView.category = function(val) {
+        if(!arguments.length) {
+            return category;
+        }
+        category = val;
+        return scrollView;
+    };
+
+    scrollView.lang = function(val) {
+        if(!arguments.length) {
+            return lang;
+        }
+        lang = val;
+        return scrollView;
+    };
+
+    scrollView.boundingBox = function(val) {
+        if(!arguments.length) {
+            return boundingBox;
+        }
+        boundingBox = val;
+        return scrollView;
+    };
+
+    scrollView.barHeight = function(val) {
+        if(!arguments.length) {
+            return barHeight;
+        }
+        barHeight = val;
+        return scrollView;
+    };
+
+    scrollView.transitionDuration = function(val) {
+        if(!arguments.length) {
+            return transitionDuration;
+        }
+        transitionDuration = val;
+        return scrollView;
+    };
+
+    scrollView.font = function(val) {
+        if(!arguments.length) {
+            return font;
+        }
+        font = val;
+        return scrollView;
+    };
+
+    scrollView.digits = function(val) {
+        if(!arguments.length) {
+            return digits;
+        }
+        digits = val;
+        return scrollView;
+    };
+
+    scrollView.controller(options.common.controller);
+    scrollView.colours(options.common.colours);
+    scrollView.font(options.common.font);
+    scrollView.barHeight(options.barHeight);
+    scrollView.boundingBox(options.boundingBox);
+    scrollView.offset(options.offset);
+    return scrollView;
+}

+ 294 - 0
src/js/selectionList.js

@@ -0,0 +1,294 @@
+import * as d3 from './d3-custom';
+import { round, typeset } from './utilities';
+
+export function createSelectionList(options) {
+
+    //dimensions
+    let width, height;
+    let x, y;
+    // common
+    let font;
+    let colours;
+    let controller;
+    let lang;
+    let labels;
+
+    //svg element
+    let selectedGroup;
+
+    let transitionDuration;
+    let maxEntries;
+
+    // hand picked magic numbers for alignment to comma position for ASAP Condensed
+    let trailingSpace = {
+        small: '-6.8',
+        large: '-15.4'
+    };
+
+    function selectionList(selection) {
+
+        selectedGroup = selection.append('g')
+            .attr('class', 'selection')
+            .style('font-size', font.ratio.small + 'em')
+            .attr('transform', 'translate(' + x + ',' + y + ')');
+
+        let listheading = selectedGroup.append('g')
+            .attr('fill', colours.text)
+            .attr('class', 'list-heading');
+        listheading.append('rect')
+            .attr('fill', colours.translucent)
+            .attr('stroke', colours.text)
+            .attr('x', '-6em')
+            .attr('y', '-1em')
+            .attr('width', width)
+            .attr('height', height);
+
+        listheading.append('text')
+            .attr('text-anchor', 'end')
+            .attr('transform', 'translate(' + trailingSpace.large + ',0)')
+            .text(labels.per[lang] + ' ' + labels.referenceGroup.size);
+        listheading.append('text')
+            .attr('text-anchor', 'start')
+            .attr('dx', '1.5em')
+            .attr('class', 'counter');
+    }
+
+
+    selectionList.update = function (selectedEntries, ifilter) {
+
+        if(selectedEntries.length === 0) {  // show / hide list heading
+            selectedGroup.classed('hidden', true);
+        } else {
+            selectedGroup.classed('hidden', false);
+        }
+
+        selectedGroup.select('.counter')
+            .text(selectedEntries.length + ' ' + labels.of[lang] + ' ' + maxEntries + ' ' + labels.selected[lang]);
+
+        let eselected = selectedGroup.selectAll('g.selected')
+            .data(selectedEntries, function(d) { return d.reason.title; });  // title as key
+
+        // EXIT
+        eselected.exit()
+            .transition()
+            .duration(transitionDuration)
+            .attr('opacity', 0)
+            .remove();
+
+        // UPDATE
+        eselected
+            .attr('opacity', function(d) {
+                if(ifilter && ifilter !== d.reason.cat) {
+                    return 0.8;
+                } else {
+                    return 1;
+                }
+            })
+            .transition()
+            .duration(transitionDuration)
+            .attr('transform', function(d,i) { return 'translate(0,' + ((i + 1) * font.ratio.medium * font.baseSize) + ')'; });
+
+        eselected.each(function(d){
+            d3.select(this).select('text.list-value')
+                .text(function(d) { return typeset(round(d.value), lang); });
+
+            let rect = d3.select(this).select('rect');
+            rect.classed('clickable', function(d) {
+                if(ifilter && ifilter !== d.reason.cat) {
+                    return false;
+                } else {
+                    return true;
+                }
+            });
+            if(!ifilter || ifilter === d.reason.cat) {  // remove click event listener when corresponding entry is not visible
+                rect.on('click', function(e, d) { controller.scrollToEntry(d); });
+            } else {
+                rect.on('click', null);
+            }
+        });
+
+        eselected.each(function(){
+            d3.select(this).select('.delete')
+                .on('click', function(e, d) { controller.deleteEntryFromSelection(d); });
+        });
+
+        // ENTER
+        let egroup = eselected.enter()
+            .append('g')
+            .attr('class', 'selected')
+            .attr('transform', function(d,i) { return 'translate(0,' + ((i + 1) * font.ratio.medium * font.baseSize) + ')'; })
+            .attr('fill', colours.bright);
+
+        let rect = egroup.append('rect');
+
+        egroup.append('text')
+            .attr('text-anchor', 'end')
+            .attr('class', 'list-value')
+            .attr('transform', function(d) {
+                let cssval = 'translate(';
+                let p = Math.log(d.value) / Math.log(10);
+                if(p < 0) { 
+                    cssval += '0';
+                } else if (p < 1) {
+                    cssval += trailingSpace.small;
+                } else {
+                    cssval += trailingSpace.large;
+                }
+                return cssval += ', 0)';
+            })
+            .text(function(d) { return typeset(round(d.value), lang); });
+
+        egroup.append('text')
+            .attr('text-anchor', 'start')
+            .attr('class', 'list-title')
+            .attr('dx', '1.5em')
+            .text(function(d) { return d.reason.title; });
+
+        rect.attr('fill', colours.text)
+            .attr('class', 'clickable')
+            .attr('opacity', 0.9)
+            .attr('x', '-6em')
+            .attr('y', '-1em')
+            .attr('width', width)
+            .attr('height', height)
+            .on('mouseover', function () {
+                let el = d3.select(this);
+                if (el.classed('clickable')) {
+                    el.attr('fill', colours.highlight);
+                }
+            })
+            .on('mouseout', function () { d3.select(this).attr('fill', colours.text); })
+            .on('click', function(e, d) { controller.scrollToEntry(d); });
+
+        let deleteButton = egroup.append('g')
+            .attr('transform', 'translate(' +
+                (0.25 * font.ratio.medium * font.baseSize) + ',' +
+                (- 0.45 * font.ratio.medium * font.baseSize) + ') scale(0.5,0.5)')
+            .attr('class', 'delete button')
+            .attr('opacity', 0.5)
+            .on('mouseover', function () { 
+                let t = d3.select(this);
+                t.select('circle').attr('fill', colours.bright);
+                t.select('use').attr('fill', colours.highlight);
+            })
+            .on('mouseout', function () {
+                let t = d3.select(this);
+                t.select('circle').attr('fill', colours.text);
+                t.select('use').attr('fill', colours.bright);
+            })
+            .on('click', function(e, d) { controller.deleteEntryFromSelection(d); });
+
+        deleteButton.append('circle')
+            .attr('r', font.ratio.medium * font.baseSize * 0.6)
+            .attr('cx', font.ratio.medium * font.baseSize * 0.5)
+            .attr('cy', font.ratio.medium * font.baseSize * 0.5)
+            .attr('fill', colours.text);
+
+        deleteButton.append('use')
+            .attr('xlink:href', '#circle-x')
+            .attr('fill', colours.bright)
+            .attr('width', font.ratio.medium * font.baseSize)
+            .attr('height', font.ratio.medium * font.baseSize);
+    };
+
+    selectionList.controller = function(val) {
+        if(!arguments.length) {
+            return controller;
+        }
+        controller = val;
+        return selectionList;
+    };
+
+    selectionList.labels = function(val) {
+        if(!arguments.length) {
+            return labels;
+        }
+        labels = val;
+        return selectionList;
+    };
+
+    selectionList.lang = function(val) {
+        if(!arguments.length) {
+            return lang;
+        }
+        lang = val;
+        return selectionList;
+    };
+
+    selectionList.x = function(val) {
+        if(!arguments.length) {
+            return x;
+        }
+        x = val;
+        return selectionList;
+    };
+
+    selectionList.y = function(val) {
+        if(!arguments.length) {
+            return y;
+        }
+        y = val;
+        return selectionList;
+    };
+
+    selectionList.font = function(obj) {
+        if(!arguments.length) {
+            return font;
+        }
+        font = obj;
+        return selectionList;
+    };
+
+    selectionList.colours = function(obj) {
+        if(!arguments.length) {
+            return colours;
+        }
+        colours = obj;
+        return selectionList;
+    };
+
+    selectionList.maxEntries = function(val) {
+        if (!arguments.length) {
+            return maxEntries;
+        }
+        maxEntries = val;
+        return selectionList;
+    };
+
+    selectionList.width = function(val) {
+        if (!arguments.length) {
+            return width;
+        }
+        width = val;
+        return selectionList;
+    };
+
+    selectionList.height = function(val) {
+        if (!arguments.length) {
+            return height;
+        }
+        height = val;
+        return selectionList;
+    };
+
+    selectionList.transitionDuration = function(val) {
+        if (!arguments.length) {
+            return transitionDuration;
+        }
+        transitionDuration = val;
+        return selectionList;
+    };
+
+    selectionList.controller(options.common.controller);
+    selectionList.colours(options.common.colours);
+    selectionList.font(options.common.font);
+    selectionList.labels(options.common.labels);
+    selectionList.lang(options.common.lang);
+    selectionList.maxEntries(options.maxEntries);
+    selectionList.x(options.x);
+    selectionList.y(options.y);
+    selectionList.width(options.width);
+    selectionList.height(options.height);
+    selectionList.transitionDuration(options.common.durations.listUpdate);
+    return selectionList;
+}

+ 81 - 0
src/js/utilities.js

@@ -0,0 +1,81 @@
+// round to <digits> significant places
+function round(value, d=3) {
+    let digits = d;
+    let prec = Math.pow(10, Math.floor(Math.log(value) / Math.log(10)) - digits + 1);
+    return Math.round(value / prec) * prec;
+}
+
+function typeset(value, lang) {  // number typesetting
+
+    let digits = Math.log(value) / Math.log(10);
+
+    let val = 0;
+    if (digits < 0) {
+        val = value.toFixed(2);
+        if(val < 0.01) {
+            return '< 0,01';
+        }
+        if(lang === 'de') {
+            val = val.replace(/\./, ',');
+        }
+        return val;
+    }
+    if (digits < 1) {
+        val = value.toFixed(1);
+        if(lang === 'de') {
+            val = val.replace(/\./, ',');
+        }
+        return val;
+    }
+
+    let factor = Math.pow(10, digits-1);
+    val = Math.round(value / factor) * factor;
+    val = val.toFixed(0);
+
+    let s = '';
+    while (val.length > 3) {  // 'layout' number in thousands groups
+        s = ' ' + val.substr(-3) + s;
+        val = val.substr(0, val.length-3);
+    }
+
+    return val + s;
+}
+
+function interpolate(min, max, t, mode) {
+
+    switch (mode) {
+        case 'inverseLinear':
+            t = 1 - t;
+            break;
+        case 'quadratic':
+            t = t * t;
+            break;
+        case 'inverseQuadratic':
+            t = 1 - (1 - t) * (1 - t);
+            break;
+        case 'cubic':
+            t = t * t * t;
+            break;
+        case 'inverseCubic':
+            t = 1 - (1 - t ) * (1 - t) * (1 - t);
+            break;
+        case 'logarithmic':
+            return Math.pow(min, t) * Math.pow(max, (1 - t));
+        case 'inverseLogarithmic':
+            return Math.pow(max, t) * Math.pow(min, (1 - t));
+        case 'sine':
+            return Math.sin(t * Math.PI / 2);
+        case 'inverseSine':
+            return 1 - Math.sin(t * Math.PI / 2);
+        default:
+            break;
+    }
+
+    return (1 - t) * min + t * max;
+}
+
+export {
+    round,
+    typeset,
+    interpolate
+};

+ 120 - 0
src/js/zoomButtons.js

@@ -0,0 +1,120 @@
+import * as d3 from './d3-custom';
+
+export function createZoomButtons(options) {
+
+    let controller;
+    let colours;
+    let font;
+
+    let x, y;
+    let radius = 25;
+
+    function zoomButtons(selection) {
+        let btnGroup = selection.append('g')
+            .attr('class', 'zoom-buttons')
+            .attr('transform', 'translate(' + x + ',' + (y / 2) + ')');
+
+        let zoomInBtn = btnGroup.append('g')
+            .attr('id', 'zoom-in-button')
+            .attr('class', 'zoom button')
+            .on('mouseover', function () {
+                d3.select(this).select('use')
+                    .attr('fill', colours.highlight)
+                    .attr('stroke', colours.bright);
+            })
+            .on('mouseout', function () {
+                d3.select(this).select('use')
+                    .attr('fill', colours.bright)
+                    .attr('stroke', 'none');
+            })
+            .on('click', controller.zoomIn.bind(controller));
+
+        zoomInBtn.append('use')
+            .attr('xlink:href', '#data-transfer-download')
+            .attr('fill', colours.bright)
+            .attr('stroke-width', 0.5)
+            .attr('width', radius)
+            .attr('height', radius);
+
+        zoomInBtn.attr('transform', 'matrix(1, 0, 0, 1, 0,' + (radius + font.baseSize) + ')');
+
+        let zoomOutBtn = btnGroup.append('g')
+            .attr('id', 'zoom-out-button')
+            .attr('class', 'zoom button')
+            .on('mouseover', function () {
+                d3.select(this).select('use')
+                    .attr('fill', colours.highlight)
+                    .attr('stroke', colours.bright);
+            })
+            .on('mouseout', function () {
+                d3.select(this).select('use')
+                    .attr('fill', colours.bright)
+                    .attr('stroke', 'none');
+            })
+            .on('click', controller.zoomOut.bind(controller));
+
+        zoomOutBtn.append('use')
+            .attr('xlink:href', '#data-transfer-upload')
+            .attr('fill', colours.bright)
+            .attr('stroke-width', 0.5)
+            .attr('width', radius)
+            .attr('height', radius);
+
+        zoomInBtn.attr('transform', 'matrix(1, 0, 0, 1, 0,' + (-radius - font.baseSize) + ')');
+    }
+
+    zoomButtons.x = function(val) {
+        if (!arguments.length) {
+            return x;
+        }
+        x = val;
+        return zoomButtons;
+    };
+
+    zoomButtons.y = function(val) {
+        if (!arguments.length) {
+            return y;
+        }
+        y = val;
+        return zoomButtons;
+    };
+
+    zoomButtons.radius = function(val) {
+        if (!arguments.length) {
+            return radius;
+        }
+        radius = val;
+        return zoomButtons;
+    };
+
+    zoomButtons.colours = function(val) {
+        if (!arguments.length) {
+            return colours;
+        }
+        colours = val;
+        return zoomButtons;
+    };
+
+    zoomButtons.controller = function(val) {
+        if (!arguments.length) {
+            return controller;
+        }
+        controller = val;
+        return zoomButtons;
+    };
+
+    zoomButtons.font = function(val) {
+        if (!arguments.length) {
+            return font;
+        }
+        font = val;
+        return zoomButtons;
+    };
+
+    zoomButtons.controller(options.common.controller);
+    zoomButtons.font(options.common.font);
+    zoomButtons.colours(options.common.colours);
+    zoomButtons.x(options.x);
+    zoomButtons.y(options.y);
+    return zoomButtons;
+}

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików