burningTyger 6 anni fa
parent
commit
14cd8d2737
58 ha cambiato i file con 8201 aggiunte e 28 eliminazioni
  1. 5 7
      Asz.html
  2. 448 0
      brief.html
  3. 1 2
      daten/main.css
  4. 132 0
      editor.html
  5. 0 1
      helfer.js
  6. 103 0
      hjz.html
  7. 5 5
      jz.html
  8. 33 0
      keinzeugnis.html
  9. 1 0
      node_modules/.bin/marked
  10. 1 0
      node_modules/.bin/svelte
  11. 11 0
      node_modules/escape-string-regexp/index.js
  12. 21 0
      node_modules/escape-string-regexp/license
  13. 81 0
      node_modules/escape-string-regexp/package.json
  14. 27 0
      node_modules/escape-string-regexp/readme.md
  15. 12 10
      node_modules/lodash-es/package.json
  16. 16 0
      node_modules/marked/.editorconfig
  17. 1 0
      node_modules/marked/.eslintignore
  18. 28 0
      node_modules/marked/.eslintrc.json
  19. 44 0
      node_modules/marked/.travis.yml
  20. 43 0
      node_modules/marked/LICENSE.md
  21. 15 0
      node_modules/marked/Makefile
  22. 67 0
      node_modules/marked/README.md
  23. 199 0
      node_modules/marked/bin/marked
  24. 23 0
      node_modules/marked/bower.json
  25. 10 0
      node_modules/marked/component.json
  26. 1 0
      node_modules/marked/index.js
  27. 11 0
      node_modules/marked/jasmine.json
  28. 1514 0
      node_modules/marked/lib/marked.js
  29. 91 0
      node_modules/marked/man/marked.1
  30. 96 0
      node_modules/marked/man/marked.1.txt
  31. 5 0
      node_modules/marked/marked.min.js
  32. 96 0
      node_modules/marked/package.json
  33. 1188 0
      node_modules/svelte/CHANGELOG.md
  34. 7 0
      node_modules/svelte/LICENSE
  35. 146 0
      node_modules/svelte/README.md
  36. 2 0
      node_modules/svelte/cli/chunk-5ab72169.js
  37. 200 0
      node_modules/svelte/cli/compile.ts.js
  38. 556 0
      node_modules/svelte/cli/index.ts.js
  39. 59 0
      node_modules/svelte/compiler/svelte.js
  40. 0 0
      node_modules/svelte/compiler/svelte.js.map
  41. 129 0
      node_modules/svelte/package.json
  42. 1020 0
      node_modules/svelte/shared.js
  43. 51 0
      node_modules/svelte/ssr/register.js
  44. 0 0
      node_modules/svelte/ssr/register.js.map
  45. 169 0
      node_modules/svelte/store.js
  46. 218 0
      node_modules/svelte/store.umd.js
  47. 2 0
      node_modules/svelte/svelte
  48. 21 0
      node_modules/textarea-editor/LICENSE
  49. 476 0
      node_modules/textarea-editor/build/editor.js
  50. 265 0
      node_modules/textarea-editor/build/formats.js
  51. 91 0
      node_modules/textarea-editor/package.json
  52. 362 0
      node_modules/textarea-editor/readme.md
  53. 23 0
      package-lock.json
  54. 4 1
      package.json
  55. 2 2
      partials/NotenE.html
  56. BIN
      partials/lodash-es-4.17.10.tgz
  57. BIN
      partials/mark.js-8.11.1.tgz
  58. 69 0
      stats.html

+ 5 - 7
Asz.html

@@ -1,17 +1,17 @@
     <div class="page grid" orientation="landscape" size="A3" style="font-size: 12.5px">
       <div class="seitenlogo">
-        <Traegerlogo />
+        <img src="daten/traeger_logo.svg" height="160px" alt="traeger_logo" />
       </div>
       <div class="header">
-				<Aszlogo/>
+        <img src="daten/asz_logo_ohne_linie_breiter_text_breit.svg" width="100%" alt="zeugnis_logo" />
         <hr class="hr-rot" />
       </div>
       <div class="main">
         <div class="main-grid">
           <div class="main-left">
-            <b>Frau   ,</b><br />geboren am xzr in Halle/Westf.,<br />war vom 01.08.xx bis zur Aushändigung des Zeugnisses Studierende des Bildungsgangs<br /><b>Fachschule des Sozialwesens in der Fachrichtung Sozialpädagogik</b>
+            <b>Frau Maja Maruko,</b><br />geboren am 12. Mai 2002 in Halle/Westf.,<br />war vom 01.08.79 bis zur Aushändigung des Zeugnisses Studierende des Bildungsgangs<br /><b>Fachschule des Sozialwesens in der Fachrichtung Sozialpädagogik</b>
             <div class="voffset-halb"></div>
-            Der allgemeine Prüfungsausschuss stellte in seiner Abschlusskonferenz am 27.6.x fest:
+            Der allgemeine Prüfungsausschuss stellte in seiner Abschlusskonferenz am 27.6.2019 fest:
             <div class="voffset-halb"></div>
             <b>Leistungen</b>
             <div style="font-size: 90%">
@@ -151,11 +151,9 @@
   
 <script>
 	import NotenE from './partials/NotenE.html'
-	import Aszlogo from './partials/Aszlogo.html'
-	import Traegerlogo from './partials/Traegerlogo.html'
 
 	export default {
-		components: { NotenE, Aszlogo, Traegerlogo },
+		components: { NotenE },
    	setup(Component) { Component.bez = 'Ein ASZ!' }
 	}
 </script>

+ 448 - 0
brief.html

@@ -0,0 +1,448 @@
+    <div class="page grid" orientation="portrait" size="A4">
+      <span class="falzmarke-oben">––</span>
+      <span class="falzmarke-unten">––</span>
+      <div class="seitenlogo">
+        <img src="daten/traeger_logo.svg" height="160px" alt="traeger_logo" />
+      </div>
+      <div class="header">
+        <img class="logo" src="daten/bk_logo.svg" alt="Briefkopf" />
+        <hr class="hr-rot hr" />
+      </div>
+      <div class="main">
+        <div class="sidebar">
+          <div class="sidebar-oben">
+            Am Zionswald 12<br />33617 Bielefeld
+            <div class="voffset-1"></div>
+            Telefon 0521 144-2467<br />Telefax 0521 144-2470<br />berufskolleg@fvbschulen.de<br />www.berufskolleg-bethel.de
+            <div class="voffset-1"></div>
+            Bürozeiten:<br />Mo. und Do.<br />07:15 – 12:30 Uhr<br />13:30 – 15:30 Uhr<br />Di., Mi. und Fr.<br />07:15 – 13:30 Uhr
+            <div class="voffset-1"></div>
+            {(new Date().toLocaleDateString('de', {day: '2-digit', month: '2-digit', year: 'numeric'}))}<br />
+            <slot name="kuerzel"></slot>
+          </div>
+          <div class="sidebar-unten">
+            Unsere Bildungsgänge:
+            <div class="voffset-1"></div>
+            <b>Berufliches Gymnasium</b><br />Erziehung und Soziales<br />(Erzieher_in / AHR)
+            <div class="voffset-1"></div>
+            <b>Fachschulen</b><br />Sozialpädagogik<br />Heilerziehungspflege<br />Heilpädagogik<br />Heilpädagogische Förderung<br />mit dem Pferd
+            <div class="voffset-1"></div>
+            <b>Fachoberschule</b><br />Gesundheit und Soziales
+            <div class="voffset-1"></div>
+            <b>Berufsfachschulen</b><br />Sozialassistenz/<br />Heilerziehung
+            <div class="voffset-1"></div>
+            <b>Weitere Informationen:</b><br />www.berufskolleg-bethel.de
+          </div>
+        </div>
+        <div class="links">
+          <div class="absender">
+            v.Bodelschwinghsche Stiftungen Bethel<br /><b>Berufskolleg Bethel </b>· Postfach 130 160 · 33544 Bielefeld
+          </div>
+          <div class="anschrift">
+            <slot name="anschrift"></slot>
+          </div>
+          <div class="anschreiben">
+            <slot></slot>
+          </div>
+        </div>
+      </div>
+    </div>
+
+<style>
+.page {
+  font-size: 1.2em;
+  line-height: 1.5;
+  font-weight: normal;
+  font-family: "Tex Gyre Heros";
+  color: #333;
+  position: relative;
+  padding: 0;
+  display: block;
+}
+.grid {
+  display: grid;
+  align-content: stretch;
+  grid-template-rows: 35mm auto;
+  grid-template-areas:
+    "header"
+    "main";
+}
+
+.header {
+  display: grid;
+  grid-area: header;
+  align-self: start;
+  margin-left: 24.1mm;
+  margin-right: 8.1mm;
+  grid-template-columns: auto;
+  grid-template-rows: auto;
+  grid-template-areas:
+    "logo"
+    "hr";
+}
+
+.logo {
+  justify-content: end;
+  margin-top: 10mm;
+  grid-area: logo;
+  margin-left: auto;
+}
+
+.hr {
+  grid-area: hr;
+  align-self: end;
+}
+
+.main {
+  grid-area: main;
+  align-content: stretch;
+  display: grid;
+  grid-template-columns: 2fr 1fr;
+  height: 100%;
+  grid-template-areas:
+    "links sidebar";
+}
+
+.links {
+  display: grid;
+  grid-area: links;
+  grid-template-rows: 10mm 40mm auto;
+  margin-bottom: 10mm;
+  grid-template-areas:
+    "absender"
+    "anschrift"
+    "anschreiben";
+}
+
+.absender {
+  grid-area: absender;
+  font-size: 7.5pt;
+  margin-left: 20mm;
+}
+
+.anschrift {
+  grid-area: anschrift;
+  font-size: 11pt;
+  margin-left: 25mm;
+}
+
+.anschreiben {
+  grid-area: anschreiben;
+  font-size: 11pt;
+  margin-left: 25mm;
+  width: 115mm;
+}
+
+.sidebar {
+  display: grid;
+  margin-right: 8.1mm;
+  justify-self: end;
+  grid-area: sidebar;
+  margin-bottom: 10mm;
+  grid-template-rows: auto;
+  grid-template-areas:
+    "sidebar-oben"
+    "sidebar-unten";
+}
+
+.sidebar-oben {
+  grid-area: sidebar-oben;
+  align-self: start;
+}
+
+.sidebar-unten {
+  grid-area: sidebar-unten;
+  align-self: end;
+}
+
+.flex-grid {
+  display: flex;
+}
+
+.col {
+  flex: 1;
+}
+
+.col-2 {
+  flex: 2;
+}
+
+@import url(normalize.css);
+@font-face {
+  font-family: 'TeX Gyre Heros';
+  src: url("texgyreheros-regular-webfont.woff") format("woff");
+  font-style: normal;
+}
+@font-face {
+  font-family: 'TeX Gyre Heros';
+  src: url("texgyreheros-bold-webfont.woff") format("woff");
+  font-style: normal;
+  font-weight: bold;
+}
+@font-face {
+  font-family: 'TeX Gyre Heros';
+  src: url("texgyreheros-italic-webfont.woff") format("woff");
+  font-style: italic;
+}
+@font-face {
+  font-family: 'TeX Gyre Heros';
+  src: url("texgyreheros-bolditalic-webfont.woff") format("woff");
+  font-style: italic;
+  font-weight: bold;
+}
+
+@media print {
+  * {
+    -webkit-print-color-adjust: exact;
+  }
+
+  .page {
+    page-break-after: always;
+    page-break-inside: avoid;
+    margin: 0;
+  }
+}
+
+/*
+Da *named pages*, also z.B. @page a3landscape noch nicht von Chrome
+unterstützt werden, gilt vorerst die Standard-Einstellung von A4 Portrait.
+Um andere Formate zu erzeugen, muss die Größe in den svelte-Koponenten
+als setup-Einstellung hinterlegt werden. Oder man verwendet ein besonderes CSS
+mit der anderen Einstellung.
+Dazu bitte ein @import 'nicht_a4_portrait.css' verwenden. Svelte ignoriert sonst
+die in den <style> tags hinterlegten @... Anweisungen.
+Link: https://www.w3.org/TR/css3-page/#using-named-pages
+*/
+
+.page[size="A4"][orientation="portrait"] {
+  page: a4portrait;
+  width: 210mm;
+  height: 296.8mm;
+}
+@page a4portrait {
+  margin: 0;
+  size: A4 portrait;
+}
+
+.page[size="A4"][orientation="landscape"] {
+  page: a4landscape;
+  width: 296.8mm;
+  height: 210mm;
+}
+@page a4landscape {
+  margin: 0;
+  size: A4 landscape;
+}
+
+.page[size="A3"][orientation="portrait"] {
+  page: a3portrait;
+  width: 296.8mm;
+  height: 420mm;
+}
+@page a3portrait {
+  margin: 0;
+  size: A3 portrait;
+}
+
+.page[size="A3"][orientation="landscape"] {
+  page: a3landscape;
+  width: 420mm;
+  height: 296.8mm;
+}
+@page a3landscape {
+  margin: 0;
+  size: A3 landscape;
+}
+
+.page[size="A5"][orientation="portrait"] {
+  page: a5portrait;
+  width: 148mm;
+  height: 210mm;
+}
+@page a5portrait {
+  margin: 0;
+  size: A5 portrait;
+}
+
+.page[size="A5"][orientation="landscape"] {
+  page: a5landscape;
+  width: 210mm;
+  height: 148mm;
+}
+@page a5landscape {
+  margin: 0;
+  size: A5 landscape;
+}
+
+@media screen {
+  .page {
+    border: 1px solid black;
+    box-shadow: 5px 5px 4px 0 silver;
+  }
+}
+
+svelte {
+  font-size: 62.5%;
+}
+
+
+/* Typography */
+h1, h2, h3, h4, h5, h6 {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-weight: 400;
+}
+
+h1 {
+  font-size: 4.0em;
+  line-height: 1.2;
+  letter-spacing: -.1em;
+}
+
+h2 {
+  font-size: 3.6em;
+  line-height: 1.25;
+  letter-spacing: -.1em;
+}
+
+h3 {
+  font-size: 3.0em;
+  line-height: 1.3;
+  letter-spacing: -.1em;
+}
+
+h4 {
+  font-size: 2.4em;
+  line-height: 1.35;
+  letter-spacing: -.08em;
+}
+
+h5 {
+  font-size: 1.8em;
+  line-height: 1.5;
+  letter-spacing: -.05em;
+}
+
+h6 {
+  font-size: 1.5em;
+  line-height: 1.6;
+  letter-spacing: 0;
+}
+
+p {
+  margin-top: 0;
+}
+.voffset-halb {
+  margin-top: 0.5em;
+}
+
+.voffset-1 {
+  margin-top: 1em;
+}
+
+.voffset-2 {
+  margin-top: 2em;
+}
+
+.voffset-3 {
+  margin-top: 3em;
+}
+
+.voffset-4 {
+  margin-top: 4em;
+}
+
+.voffset-5 {
+  margin-top: 5em;
+}
+
+.voffset-6 {
+  margin-top: 6em;
+}
+
+.voffset-7 {
+  margin-top: 7em;
+}
+
+.voffset-8 {
+  margin-top: 8em;
+}
+
+.voffset-9 {
+  margin-top: 9em;
+}
+
+.voffset-10 {
+  margin-top: 10em;
+}
+
+.voffset-11 {
+  margin-top: 11em;
+}
+
+.voffset-12 {
+  margin-top: 12em;
+}
+
+.voffset-13 {
+  margin-top: 13em;
+}
+
+.voffset-14 {
+  margin-top: 14em;
+}
+
+.voffset-15 {
+  margin-top: 15em;
+}
+
+.voffset-16 {
+  margin-top: 16em;
+}
+
+.voffset-17 {
+  margin-top: 17em;
+}
+
+.voffset-18 {
+  margin-top: 18em;
+}
+
+.voffset-19 {
+  margin-top: 19em;
+}
+
+.voffset-20 {
+  margin-top: 20em;
+}
+
+.text-center {
+  text-align: center !important;
+}
+
+hr {
+  border: 0;
+  border-top: 1px solid #eee;
+  border-color: #000;
+  height: 1px;
+  margin: 3px 0;
+}
+.hr-rot {
+  border-color: #ff2700;
+  margin: 8px 0;
+}
+.hr-grau {
+  border-color: #646464 !important;
+}
+
+.falzmarke-oben {
+  position: absolute;
+  top: 105mm;
+  left: 10mm;
+}
+.falzmarke-unten {
+  position: absolute;
+  top: 210mm;
+  left: 10mm;
+}
+</style>

+ 1 - 2
daten/main.css

@@ -31,7 +31,6 @@
   .page {
     page-break-after: always;
     page-break-inside: avoid;
-    outline: red solid 1px;
     margin: 0;
   }
 }
@@ -180,7 +179,7 @@ p {
   display: grid;
   grid-gap: 0;
   gap: 0;
-  /* align-content: start; */
+  align-content: start;
   grid-template-columns: auto;
   grid-template-rows: auto 1fr auto;
   grid-template-areas: "header" "main" "footer";

+ 132 - 0
editor.html

@@ -0,0 +1,132 @@
+<section class="container">
+  <div class="left-half noprint">
+    <div class="editor">
+      <ul class="toolbar">
+        <li><button type="button" data-command="bold">Fett</button></li>
+        <li><button type="button" data-command="italic">Kursiv</button></li>
+        <!-- <li><button type="button" data-command="link">Link</button></li>
+        <li><button type="button" data-command="image">Bild</button></li> -->
+        <li><button type="button" data-command="header1">Groß</button></li>
+        <li><button type="button" data-command="header2">Bisschen Groß</button></li>
+        <li><button type="button" data-command="unorderedList">Liste</button></li>
+        <li><button type="button" data-command="orderedList">Aufzählung</button></li>
+        <!-- <li><button type="button" data-command="code"></button></li> -->
+      </ul>
+      <textarea bind:value=text type=text>{text}</textarea>
+    </div>
+  </div>
+  <div class="right-half">
+    {#each schueler as s (s.ID)}
+      <Brief schueler={schueler}><span slot="kuerzel">{s.Lehrer}</span><span slot="anschrift">{s.Vorname} {s.Name}<br>{s.Strasse}<br>{s.PLZ} {s.OrtAbk}</span><svelte:component this={Component} s={s} /></Brief>
+    {/each}
+  </div>
+</section>
+
+<script>
+import svelte from 'svelte'
+import TextareaEditor from 'textarea-editor'
+import marked from 'marked'
+
+export default {
+  oncreate () {
+    const textarea = document.querySelector('textarea')
+    const toolbar = document.querySelector('.toolbar')
+    const editor = new TextareaEditor(textarea)
+    toolbar.addEventListener('mousedown', e => e.preventDefault());
+
+    toolbar.addEventListener('click', e => {
+      const command = e.target.getAttribute('data-command');
+      if (!command) return;
+      let url;
+      if (/image|link/.test(command) && !editor.hasFormat(command)) {
+        url = prompt('URL:');
+      }
+      editor.toggle(command, url);
+    })
+    textarea.addEventListener('keydown', (e) => {
+      const key = e.which;
+      const cmd = e.metaKey || e.ctrlKey;
+      if (!cmd) return;
+      switch (key) {
+        case 66:
+          editor.toggle('bold');
+          break;
+        case 73:
+          editor.toggle('italic');
+          break;
+        default: return;
+      }
+      e.preventDefault();
+    })
+  },
+  data () {return {
+    text: 'Hallo {s.Vorname}'
+    }},
+  computed: {
+    Component: ({text}) => svelte.create(marked(text, { sanitize: false }))
+  },
+  components: {Brief: './brief.html'}
+}
+</script>
+
+<style>
+@import 'daten/main.css';
+/* Pattern styles */
+.container {
+  display: grid;
+  grid-gap: 10px;
+  grid-template-columns: 1fr 2fr;
+  margin-top: 10px;
+}
+
+.left-half {
+  grid-column: 1;
+}
+
+.right-half {
+  grid-column: 2;
+}
+
+.editor {
+  position: sticky;
+  top: 60px;
+  height: 90%;
+  margin-left: 10px;
+}
+
+textarea {
+  width: 100%;
+  height: 100%;
+  padding: 20px;
+  border-color: #ccc;
+  resize: none;
+  font-size: 1.6em;
+}
+
+textarea:focus {
+  outline: none;
+  border-color: #3498db;
+}
+
+.toolbar {
+  background: #ddd;
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  overflow: hidden;
+  width: 100%;
+}
+
+.toolbar button {
+  float: left;
+  font-weight: bold;
+  background: #ddd;
+  color: #333;
+  border: none;
+  padding: 15px;
+}
+
+.toolbar button:hover {
+  background: #ccc;
+}
+</style>

+ 0 - 1
helfer.js

@@ -21,7 +21,6 @@ export const bemerkungen = (hj) => {
 }
 export const volljaehrigBei = (s, datum) => {
   // gibt an, ob der Schüler *s* zu einem Zeitpunkt *datum* volljährig war
-  if (!s || !datum) return
   const g = new Date(s.Geburtsdatum)
   const d = new Date(datum)
   const volljaehrig = d.getFullYear() - g.getFullYear() - ((d.getMonth() > g.getMonth() || (d.getMonth() == g.getMonth() && d.getDay() >= g.getDay()) ? 0 : 1)) >= 18

+ 103 - 0
hjz.html

@@ -0,0 +1,103 @@
+{#each schueler as s}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj}
+    <div class="page grid" orientation="portrait" size="A4">
+      <div class="seitenlogo">
+        <img src="daten/traeger_logo.svg" height="160px" alt="traeger_logo" />
+      </div>
+      <div class="header">
+        <img src="daten/zeugnis_logo.svg" width="100%" alt="zeugnis_logo" />
+        <hr class="hr-rot" />
+      </div>
+      <div class="main">
+        <div style="font-size: 15pt; line-height: 1.5em">
+          {(fkl[s.fachklasse.Kennung] || fkl.default).Schulform}
+        </div>
+        <div style="font-size: 12pt; line-height: 1.2em">
+          {(fkl[s.fachklasse.Kennung] || fkl.default).Bereich}<br />{s.Geschlecht === '3' ? s.fachklasse.Bezeichnung : s.fachklasse.Beschreibung_W}
+        </div>
+        <div class="voffset-1"></div>
+        <b>{s.anrede} {s.Vorname} {_.toString(s.Zusatz)} {s.Name},</b>
+        <br />geboren am {datum(s.Geburtsdatum)} in {s.Geburtsort},<br />
+          besuchte im {hj.Abschnitt}. Halbjahr des Schuljahres {hj.schuljahr} die Klasse {hj.Klasse}
+        <div class="voffset-2"></div>
+        Leistungen laut Konferenzbeschluss vom {datum(hj.Konferenzdatum)}:
+        <Noten bind:data="hj.noten"></Noten>
+        <hr />
+        {#if hj.SumFehlStdU > 0}
+          , davon unentschuldigt: {hj.SumFehlStdU}
+          <div class="voffset-1"></div>
+        {/if}
+        <div class="voffset-1"></div>
+        <b>{versetzungsvermerk(s,hj)}</b>
+        <div class="voffset-1"></div>
+        <b>Bemerkungen</b><br />{bemerkungen(hj)}
+      </div>
+      <div class="footer">
+        <div class="flex-grid">
+          <div class="col-2">
+            {schule.Ort}, den {datum(hj.ZeugnisDatum)}
+          </div>
+          <div class="col text-center klein voffset-3">
+            <hr />
+            {schule.SchulleiterVorname} {schule.SchulleiterName} <br />{schule.schulleiter_in}
+          </div>
+          <div class="col text-center klein voffset-3">
+            Siegel
+          </div>
+          <div class="col text-center klein voffset-3">
+            <hr />
+            {hj.v_name_klassenlehrer}<br />{hj.klassenlehrer_in}
+          </div>
+        </div>
+        <div class="flex-grid">
+          {#if !s.ASDSchulform.startsWith('E')}
+            <div class="col-2"></div>
+            <div class="col-2 voffset-1">
+              Die Kenntnisnahme wird bestätigt:
+            </div>
+            <div class="col voffset-3">
+              <hr />
+              <div class="klein text-center">
+                {volljaehrigBei(s, hj.ZeugnisDatum) ? s.schueler_in : 'Erziehungsberechtigte'}
+              </div>
+            </div>
+          {/if}
+        </div>
+        <div class="klein grau voffset-2">
+          <div class="schulnummer">
+            Schulnummer: {schule.SchulNr}
+          </div>
+          <hr class="hr-grau" />
+          <div class="grau" style="font-size: 1em">
+            Notenstufen gemäß § 48 SchulG: 1 = sehr gut, 2 = gut, 3 = befriedigend, 4 = ausreichend, 5 = mangelhaft, 6 = ungenügend
+            <div class="voffset-halb"></div>
+            Dem Zeugnis liegen zugrunde: Die Verordnung über die Ausbildung und Prüfung in den Bildungsgängen des Berufskollegs (Ausbildungs- und Prüfungsordnung Berufskolleg, APO-BK) vom 26. Mai 1999 (SGV. NRW. 223/BASS 13 – 33 Nr. 1.1).
+            <div class="voffset-halb"></div>
+            Rechtsbehelfsbelehrung: Gegen dieses Zeugnis kann innerhalb eines Monats nach Bekanntgabe des Zeugnisses Widerspruch eingelegt werden. Der Widerspruch ist beim Berufskolleg Bethel, Am Zionswald 12, 33617, Bielefeld, schriftlich oder zur Niederschrift zu erheben. <br>Falls die Frist durch das Verschulden einer/eines Bevollmächtigten versäumt wird, wird dies Verschulden der Widerspruchsführerin/dem Widerspruchsführer zugerechnet.
+          </div>
+        </div>
+      </div>
+    </div>
+  {/each}
+{/each}
+
+<script>
+  import { datum, versetzungsvermerk, volljaehrigBei, bemerkungen }  from './helfer'
+  import _ from 'lodash'
+  import fkl from './fachklassen.json'
+
+	export default {
+    setup(Component) {Component.bez = 'Halbjahreszeugnis einseitig'},
+    components: {Noten: './partials/NotenE.html'},
+    data () { return {fkl: fkl} },
+    helpers: { datum, versetzungsvermerk, volljaehrigBei, bemerkungen, Mark, _ },
+    computed: {
+      aktHalbjahr: ({jahr, abschnitt}) => { return a => a.Jahr === jahr && a.Abschnitt === abschnitt }
+    }
+  }
+</script>
+
+<style>
+  @import 'daten/main.css';
+</style>
+

+ 5 - 5
jz.html

@@ -1,5 +1,5 @@
-{#each schueler as s}
-  {#each s.abschnitte.filter(aktHalbjahr) as hj}
+{#each schueler as s (s.ID)}
+  {#each s.abschnitte.filter(aktHalbjahr) as hj (hj.ID)}
     <div class="page grid" orientation="portrait" size="A4">
       <div class="seitenlogo">
         <img src="daten/traeger_logo.svg" height="160px" alt="traeger_logo" />
@@ -10,10 +10,10 @@
       </div>
       <div class="main">
         <div style="font-size: 15pt; line-height: 1.5em">
-          {fkl[s.fachklasse.Kennung].Schulform}
+          {(fkl[s.fachklasse.Kennung] || fkl.default).Schulform}
         </div>
         <div style="font-size: 12pt; line-height: 1.2em">
-          {fkl[s.fachklasse.Kennung].Bereich}<br />{s.Geschlecht === '3' ? s.fachklasse.Bezeichnung : s.fachklasse.Beschreibung_W}
+          {(fkl[s.fachklasse.Kennung] || fkl.default).Bereich}<br />{s.Geschlecht === '3' ? s.fachklasse.Bezeichnung : s.fachklasse.Beschreibung_W}
         </div>
         <div class="voffset-1"></div>
         <b>{s.anrede} {s.Vorname} {_.toString(s.Zusatz)} {s.Name},</b>
@@ -90,7 +90,7 @@
 
 <script>
   import { datum, versetzungsvermerk, volljaehrigBei, bemerkungen }  from './helfer'
-  import _ from './node_modules/lodash-es/lodash'
+  import _ from 'lodash'
   import fkl from './fachklassen.json'
 
 	export default {

+ 33 - 0
keinzeugnis.html

@@ -0,0 +1,33 @@
+<div class="page grid" orientation="portrait" size="A4">
+  <div class="seitenlogo">
+    <img src="daten/traeger_logo.svg" height="160px" alt="traeger_logo" />
+  </div>
+  <div class="header">
+    <img src="daten/zeugnis_logo.svg" width="100%" alt="zeugnis_logo" />
+    <hr class="hr-rot" />
+  </div>
+  <div class="main">
+    <div style="font-size: 15pt; line-height: 1.5em">
+      {schueler[0].Klasse}
+    </div>
+    <div class="voffset-1"></div>
+    {#each schueler as s}
+      <b>{s.anrede} {s.Vorname} {s.Name},</b>
+      {datum(s.Geburtsdatum)} in {s.Geburtsort}<br>
+    {/each}
+  </div>
+</div>
+
+<script>
+  import {datum}  from './helfer'
+
+	export default {
+    setup(Component) {Component.bez = 'Eine Liste'},
+    helpers: { datum },
+  }
+</script>
+
+<style>
+  @import 'daten/main.css';
+</style>
+

+ 1 - 0
node_modules/.bin/marked

@@ -0,0 +1 @@
+../marked/bin/marked

+ 1 - 0
node_modules/.bin/svelte

@@ -0,0 +1 @@
+../svelte/svelte

+ 11 - 0
node_modules/escape-string-regexp/index.js

@@ -0,0 +1,11 @@
+'use strict';
+
+var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
+
+module.exports = function (str) {
+	if (typeof str !== 'string') {
+		throw new TypeError('Expected a string');
+	}
+
+	return str.replace(matchOperatorsRe, '\\$&');
+};

+ 21 - 0
node_modules/escape-string-regexp/license

@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+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.

+ 81 - 0
node_modules/escape-string-regexp/package.json

@@ -0,0 +1,81 @@
+{
+  "_from": "escape-string-regexp@^1.0.5",
+  "_id": "escape-string-regexp@1.0.5",
+  "_inBundle": false,
+  "_integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+  "_location": "/escape-string-regexp",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "escape-string-regexp@^1.0.5",
+    "name": "escape-string-regexp",
+    "escapedName": "escape-string-regexp",
+    "rawSpec": "^1.0.5",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.5"
+  },
+  "_requiredBy": [
+    "/textarea-editor"
+  ],
+  "_resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+  "_shasum": "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4",
+  "_spec": "escape-string-regexp@^1.0.5",
+  "_where": "/home/zorro/Documents/Sahib/zweiachtzehn/node_modules/textarea-editor",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "bugs": {
+    "url": "https://github.com/sindresorhus/escape-string-regexp/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Escape RegExp special characters",
+  "devDependencies": {
+    "ava": "*",
+    "xo": "*"
+  },
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/sindresorhus/escape-string-regexp#readme",
+  "keywords": [
+    "escape",
+    "regex",
+    "regexp",
+    "re",
+    "regular",
+    "expression",
+    "string",
+    "str",
+    "special",
+    "characters"
+  ],
+  "license": "MIT",
+  "maintainers": [
+    {
+      "name": "Sindre Sorhus",
+      "email": "sindresorhus@gmail.com",
+      "url": "sindresorhus.com"
+    },
+    {
+      "name": "Joshua Boy Nicolai Appelman",
+      "email": "joshua@jbna.nl",
+      "url": "jbna.nl"
+    }
+  ],
+  "name": "escape-string-regexp",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/sindresorhus/escape-string-regexp.git"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "version": "1.0.5"
+}

+ 27 - 0
node_modules/escape-string-regexp/readme.md

@@ -0,0 +1,27 @@
+# escape-string-regexp [![Build Status](https://travis-ci.org/sindresorhus/escape-string-regexp.svg?branch=master)](https://travis-ci.org/sindresorhus/escape-string-regexp)
+
+> Escape RegExp special characters
+
+
+## Install
+
+```
+$ npm install --save escape-string-regexp
+```
+
+
+## Usage
+
+```js
+const escapeStringRegexp = require('escape-string-regexp');
+
+const escapedString = escapeStringRegexp('how much $ for a unicorn?');
+//=> 'how much \$ for a unicorn\?'
+
+new RegExp(escapedString);
+```
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)

+ 12 - 10
node_modules/lodash-es/package.json

@@ -1,27 +1,31 @@
 {
-  "_from": "lodash-es",
+  "_args": [
+    [
+      "lodash-es@4.17.10",
+      "/home/zorro/Documents/Sahib/zweiachtzehn"
+    ]
+  ],
+  "_from": "lodash-es@4.17.10",
   "_id": "lodash-es@4.17.10",
   "_inBundle": false,
   "_integrity": "sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg==",
   "_location": "/lodash-es",
   "_phantomChildren": {},
   "_requested": {
-    "type": "tag",
+    "type": "version",
     "registry": true,
-    "raw": "lodash-es",
+    "raw": "lodash-es@4.17.10",
     "name": "lodash-es",
     "escapedName": "lodash-es",
-    "rawSpec": "",
+    "rawSpec": "4.17.10",
     "saveSpec": null,
-    "fetchSpec": "latest"
+    "fetchSpec": "4.17.10"
   },
   "_requiredBy": [
-    "#USER",
     "/"
   ],
   "_resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.10.tgz",
-  "_shasum": "62cd7104cdf5dd87f235a837f0ede0e8e5117e05",
-  "_spec": "lodash-es",
+  "_spec": "4.17.10",
   "_where": "/home/zorro/Documents/Sahib/zweiachtzehn",
   "author": {
     "name": "John-David Dalton",
@@ -31,7 +35,6 @@
   "bugs": {
     "url": "https://github.com/lodash/lodash-cli/issues"
   },
-  "bundleDependencies": false,
   "contributors": [
     {
       "name": "John-David Dalton",
@@ -44,7 +47,6 @@
       "url": "https://mathiasbynens.be/"
     }
   ],
-  "deprecated": false,
   "description": "Lodash exported as ES modules.",
   "homepage": "https://lodash.com/custom-builds",
   "jsnext:main": "lodash.js",

+ 16 - 0
node_modules/marked/.editorconfig

@@ -0,0 +1,16 @@
+root = true
+
+[*.{json,js}]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+indent_style = space
+indent_size = 2
+
+[*.md, !test/*.md]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+indent_style = tab
+indent_size = 4

+ 1 - 0
node_modules/marked/.eslintignore

@@ -0,0 +1 @@
+*.min.js

+ 28 - 0
node_modules/marked/.eslintrc.json

@@ -0,0 +1,28 @@
+{
+  "extends": "standard",
+  "plugins": [
+    "standard"
+  ],
+  "parserOptions": { "ecmaVersion": 5 },
+  "rules": {
+    "semi": "off",
+    "indent": ["warn", 2, {
+      "VariableDeclarator": { "var": 2 },
+      "SwitchCase": 1,
+      "outerIIFEBody": 0
+    }],
+    "space-before-function-paren": "off",
+    "operator-linebreak": ["error", "before", { "overrides": { "=": "after" } }],
+    "no-cond-assign": "off",
+    "no-useless-escape": "off",
+    "no-return-assign": "off",
+    "one-var": "off",
+    "no-control-regex": "off"
+  },
+  "env": {
+    "node": true,
+    "browser": true,
+    "amd": true,
+    "jasmine": true
+  }
+}

+ 44 - 0
node_modules/marked/.travis.yml

@@ -0,0 +1,44 @@
+language: node_js
+
+jobs:
+  fast_finish: true
+  allow_failures:
+    - stage: security scan 🔐
+
+  include:
+    - stage: unit tests 👩🏽‍💻
+      script: npm run test:unit
+      node_js: lts/*
+
+    - stage: spec tests 👩🏽‍💻
+      script: npm run test:specs
+      node_js: v0.10
+    - node_js: v4
+    - node_js: lts/*
+    - node_js: node
+
+    - stage: lint ✨
+      script: npm run test:lint
+      node_js: lts/*
+
+    - stage: minify 🗜️
+      script: |
+        npm run build
+        if ! git diff --quiet; then
+          git config --global user.email "travis@travis-ci.org"
+          git config --global user.name "Travis-CI"
+          git config credential.helper "store --file=.git/credentials"
+          echo "https://${GITHUB_TOKEN}:@github.com" > .git/credentials
+          git commit -am '🗜️ minify [skip ci]'
+          git push origin HEAD:${TRAVIS_BRANCH}
+        fi
+      node_js: lts/*
+      if: branch = master AND type = push
+
+    - stage: security scan 🔐
+      script: npm run test:redos
+      node_js: lts/*
+
+cache:
+  directories:
+    - node_modules

+ 43 - 0
node_modules/marked/LICENSE.md

@@ -0,0 +1,43 @@
+# License information
+
+## Contribution License Agreement
+
+If you contribute code to this project, you are implicitly allowing your code
+to be distributed under the MIT license. You are also implicitly verifying that
+all code is your original work. `</legalese>`
+
+## Marked
+
+Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/)
+
+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.
+
+## Markdown
+
+Copyright © 2004, John Gruber 
+http://daringfireball.net/ 
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+* Neither the name “Markdown” nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+This software is provided by the copyright holders and contributors “as is” and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the copyright owner or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.

+ 15 - 0
node_modules/marked/Makefile

@@ -0,0 +1,15 @@
+all:
+	@cp lib/marked.js marked.js
+	@uglifyjs --comments '/\*[^\0]+?Copyright[^\0]+?\*/' -o marked.min.js lib/marked.js
+
+clean:
+	@rm marked.js
+	@rm marked.min.js
+
+bench:
+	@node test --bench
+
+man/marked.1.txt:
+	groff -man -Tascii man/marked.1 | col -b > man/marked.1.txt
+
+.PHONY: clean all

+ 67 - 0
node_modules/marked/README.md

@@ -0,0 +1,67 @@
+<a href="https://marked.js.org">
+  <img width="60px" height="60px" src="https://marked.js.org/img/logo-black.svg" align="right" />
+</a>
+
+# Marked
+
+[![npm](https://img.shields.io/npm/v/marked.svg)](https://www.npmjs.com/package/marked)
+[![gzip size](http://img.badgesize.io/https://cdn.jsdelivr.net/npm/marked@0.3.19/marked.min.js?compression=gzip)](https://cdn.jsdelivr.net/npm/marked@0.3.19/marked.min.js)
+[![install size](https://packagephobia.now.sh/badge?p=marked@0.3.19)](https://packagephobia.now.sh/result?p=marked@0.3.19)
+[![downloads](https://img.shields.io/npm/dt/marked.svg)](https://www.npmjs.com/package/marked)
+[![travis](https://travis-ci.org/markedjs/marked.svg?branch=master)](https://travis-ci.org/markedjs/marked)
+
+- ⚡ built for speed
+- ⬇️ low-level compiler for parsing markdown without caching or blocking for long periods of time
+- ⚖️ light-weight while implementing all markdown features from the supported flavors & specifications
+- 🌐 works in a browser, on a server, or from a command line interface (CLI)
+
+## Demo
+
+Checkout the [demo page](https://marked.js.org/demo/) to see marked in action ⛹️
+
+## Docs
+
+Our [documentation pages](https://marked.js.org) are also rendered using marked 💯
+
+## Installation
+
+**CLI:** `npm install -g marked`
+
+**In-browser:** `npm install marked --save`
+
+## Usage 
+
+**CLI**
+
+``` bash
+$ marked -o hello.html
+hello world
+^D
+$ cat hello.html
+<p>hello world</p>
+```
+
+**Browser**
+
+```html
+<!doctype html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>Marked in the browser</title>
+</head>
+<body>
+  <div id="content"></div>
+  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
+  <script>
+    document.getElementById('content').innerHTML =
+      marked('# Marked in the browser\n\nRendered by **marked**.');
+  </script>
+</body>
+</html>
+```
+
+## License
+
+Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)
+

+ 199 - 0
node_modules/marked/bin/marked

@@ -0,0 +1,199 @@
+#!/usr/bin/env node
+
+/**
+ * Marked CLI
+ * Copyright (c) 2011-2013, Christopher Jeffrey (MIT License)
+ */
+
+var fs = require('fs'),
+    path = require('path'),
+    marked = require('../');
+
+/**
+ * Man Page
+ */
+
+function help() {
+  var spawn = require('child_process').spawn;
+
+  var options = {
+    cwd: process.cwd(),
+    env: process.env,
+    setsid: false,
+    stdio: 'inherit'
+  };
+
+  spawn('man', [path.resolve(__dirname, '/../man/marked.1')], options)
+    .on('error', function() {
+      fs.readFile(path.resolve(__dirname, '/../man/marked.1.txt'), 'utf8', function(err, data) {
+        if (err) throw err;
+        console.log(data);
+      });
+    });
+}
+
+/**
+ * Main
+ */
+
+function main(argv, callback) {
+  var files = [],
+      options = {},
+      input,
+      output,
+      string,
+      arg,
+      tokens,
+      opt;
+
+  function getarg() {
+    var arg = argv.shift();
+
+    if (arg.indexOf('--') === 0) {
+      // e.g. --opt
+      arg = arg.split('=');
+      if (arg.length > 1) {
+        // e.g. --opt=val
+        argv.unshift(arg.slice(1).join('='));
+      }
+      arg = arg[0];
+    } else if (arg[0] === '-') {
+      if (arg.length > 2) {
+        // e.g. -abc
+        argv = arg.substring(1).split('').map(function(ch) {
+          return '-' + ch;
+        }).concat(argv);
+        arg = argv.shift();
+      } else {
+        // e.g. -a
+      }
+    } else {
+      // e.g. foo
+    }
+
+    return arg;
+  }
+
+  while (argv.length) {
+    arg = getarg();
+    switch (arg) {
+      case '--test':
+        return require('../test').main(process.argv.slice());
+      case '-o':
+      case '--output':
+        output = argv.shift();
+        break;
+      case '-i':
+      case '--input':
+        input = argv.shift();
+        break;
+      case '-s':
+      case '--string':
+        string = argv.shift();
+        break;
+      case '-t':
+      case '--tokens':
+        tokens = true;
+        break;
+      case '-h':
+      case '--help':
+        return help();
+      default:
+        if (arg.indexOf('--') === 0) {
+          opt = camelize(arg.replace(/^--(no-)?/, ''));
+          if (!marked.defaults.hasOwnProperty(opt)) {
+            continue;
+          }
+          if (arg.indexOf('--no-') === 0) {
+            options[opt] = typeof marked.defaults[opt] !== 'boolean'
+              ? null
+              : false;
+          } else {
+            options[opt] = typeof marked.defaults[opt] !== 'boolean'
+              ? argv.shift()
+              : true;
+          }
+        } else {
+          files.push(arg);
+        }
+        break;
+    }
+  }
+
+  function getData(callback) {
+    if (!input) {
+      if (files.length <= 2) {
+        if (string) {
+          return callback(null, string);
+        }
+        return getStdin(callback);
+      }
+      input = files.pop();
+    }
+    return fs.readFile(input, 'utf8', callback);
+  }
+
+  return getData(function(err, data) {
+    if (err) return callback(err);
+
+    data = tokens
+      ? JSON.stringify(marked.lexer(data, options), null, 2)
+      : marked(data, options);
+
+    if (!output) {
+      process.stdout.write(data + '\n');
+      return callback();
+    }
+
+    return fs.writeFile(output, data, callback);
+  });
+}
+
+/**
+ * Helpers
+ */
+
+function getStdin(callback) {
+  var stdin = process.stdin,
+      buff = '';
+
+  stdin.setEncoding('utf8');
+
+  stdin.on('data', function(data) {
+    buff += data;
+  });
+
+  stdin.on('error', function(err) {
+    return callback(err);
+  });
+
+  stdin.on('end', function() {
+    return callback(null, buff);
+  });
+
+  try {
+    stdin.resume();
+  } catch (e) {
+    callback(e);
+  }
+}
+
+function camelize(text) {
+  return text.replace(/(\w)-(\w)/g, function(_, a, b) {
+    return a + b.toUpperCase();
+  });
+}
+
+/**
+ * Expose / Entry Point
+ */
+
+if (!module.parent) {
+  process.title = 'marked';
+  main(process.argv.slice(), function(err, code) {
+    if (err) throw err;
+    return process.exit(code || 0);
+  });
+} else {
+  module.exports = main;
+}

+ 23 - 0
node_modules/marked/bower.json

@@ -0,0 +1,23 @@
+{
+  "name": "marked",
+  "homepage": "https://github.com/markedjs/marked",
+  "authors": [
+    "Christopher Jeffrey <chjjeffrey@gmail.com>"
+  ],
+  "description": "A markdown parser built for speed",
+  "keywords": [
+    "markdown",
+    "markup",
+    "html"
+  ],
+  "main": "lib/marked.js",
+  "license": "MIT",
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "app/bower_components",
+    "test",
+    "tests"
+  ]
+}

+ 10 - 0
node_modules/marked/component.json

@@ -0,0 +1,10 @@
+{
+  "name": "marked",
+  "version": "0.3.4",
+  "repo": "markedjs/marked",
+  "description": "A markdown parser built for speed",
+  "keywords": ["markdown", "markup", "html"],
+  "scripts": ["lib/marked.js"],
+  "main": "lib/marked.js",
+  "license": "MIT"
+}

+ 1 - 0
node_modules/marked/index.js

@@ -0,0 +1 @@
+module.exports = require('./lib/marked');

+ 11 - 0
node_modules/marked/jasmine.json

@@ -0,0 +1,11 @@
+{
+  "spec_dir": "test",
+  "spec_files": [
+    "**/*-spec.js"
+  ],
+  "helpers": [
+    "helpers/**/*.js"
+  ],
+  "stopSpecOnExpectationFailure": false,
+  "random": true
+}

+ 1514 - 0
node_modules/marked/lib/marked.js

@@ -0,0 +1,1514 @@
+/**
+ * marked - a markdown parser
+ * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
+ * https://github.com/markedjs/marked
+ */
+
+;(function(root) {
+'use strict';
+
+/**
+ * Block-Level Grammar
+ */
+
+var block = {
+  newline: /^\n+/,
+  code: /^( {4}[^\n]+\n*)+/,
+  fences: noop,
+  hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
+  heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
+  nptable: noop,
+  blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
+  list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
+  html: '^ {0,3}(?:' // optional indentation
+    + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
+    + '|comment[^\\n]*(\\n+|$)' // (2)
+    + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
+    + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
+    + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
+    + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
+    + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
+    + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
+    + ')',
+  def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
+  table: noop,
+  lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
+  paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
+  text: /^[^\n]+/
+};
+
+block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
+block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
+block.def = edit(block.def)
+  .replace('label', block._label)
+  .replace('title', block._title)
+  .getRegex();
+
+block.bullet = /(?:[*+-]|\d+\.)/;
+block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
+block.item = edit(block.item, 'gm')
+  .replace(/bull/g, block.bullet)
+  .getRegex();
+
+block.list = edit(block.list)
+  .replace(/bull/g, block.bullet)
+  .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
+  .replace('def', '\\n+(?=' + block.def.source + ')')
+  .getRegex();
+
+block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
+  + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
+  + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
+  + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
+  + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
+  + '|track|ul';
+block._comment = /<!--(?!-?>)[\s\S]*?-->/;
+block.html = edit(block.html, 'i')
+  .replace('comment', block._comment)
+  .replace('tag', block._tag)
+  .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
+  .getRegex();
+
+block.paragraph = edit(block.paragraph)
+  .replace('hr', block.hr)
+  .replace('heading', block.heading)
+  .replace('lheading', block.lheading)
+  .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
+  .getRegex();
+
+block.blockquote = edit(block.blockquote)
+  .replace('paragraph', block.paragraph)
+  .getRegex();
+
+/**
+ * Normal Block Grammar
+ */
+
+block.normal = merge({}, block);
+
+/**
+ * GFM Block Grammar
+ */
+
+block.gfm = merge({}, block.normal, {
+  fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
+  paragraph: /^/,
+  heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
+});
+
+block.gfm.paragraph = edit(block.paragraph)
+  .replace('(?!', '(?!'
+    + block.gfm.fences.source.replace('\\1', '\\2') + '|'
+    + block.list.source.replace('\\1', '\\3') + '|')
+  .getRegex();
+
+/**
+ * GFM + Tables Block Grammar
+ */
+
+block.tables = merge({}, block.gfm, {
+  nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
+  table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
+});
+
+/**
+ * Pedantic grammar
+ */
+
+block.pedantic = merge({}, block.normal, {
+  html: edit(
+    '^ *(?:comment *(?:\\n|\\s*$)'
+    + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
+    + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
+    .replace('comment', block._comment)
+    .replace(/tag/g, '(?!(?:'
+      + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
+      + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
+      + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
+    .getRegex(),
+  def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
+});
+
+/**
+ * Block Lexer
+ */
+
+function Lexer(options) {
+  this.tokens = [];
+  this.tokens.links = {};
+  this.options = options || marked.defaults;
+  this.rules = block.normal;
+
+  if (this.options.pedantic) {
+    this.rules = block.pedantic;
+  } else if (this.options.gfm) {
+    if (this.options.tables) {
+      this.rules = block.tables;
+    } else {
+      this.rules = block.gfm;
+    }
+  }
+}
+
+/**
+ * Expose Block Rules
+ */
+
+Lexer.rules = block;
+
+/**
+ * Static Lex Method
+ */
+
+Lexer.lex = function(src, options) {
+  var lexer = new Lexer(options);
+  return lexer.lex(src);
+};
+
+/**
+ * Preprocessing
+ */
+
+Lexer.prototype.lex = function(src) {
+  src = src
+    .replace(/\r\n|\r/g, '\n')
+    .replace(/\t/g, '    ')
+    .replace(/\u00a0/g, ' ')
+    .replace(/\u2424/g, '\n');
+
+  return this.token(src, true);
+};
+
+/**
+ * Lexing
+ */
+
+Lexer.prototype.token = function(src, top) {
+  src = src.replace(/^ +$/gm, '');
+  var next,
+      loose,
+      cap,
+      bull,
+      b,
+      item,
+      space,
+      i,
+      tag,
+      l,
+      isordered,
+      istask,
+      ischecked;
+
+  while (src) {
+    // newline
+    if (cap = this.rules.newline.exec(src)) {
+      src = src.substring(cap[0].length);
+      if (cap[0].length > 1) {
+        this.tokens.push({
+          type: 'space'
+        });
+      }
+    }
+
+    // code
+    if (cap = this.rules.code.exec(src)) {
+      src = src.substring(cap[0].length);
+      cap = cap[0].replace(/^ {4}/gm, '');
+      this.tokens.push({
+        type: 'code',
+        text: !this.options.pedantic
+          ? cap.replace(/\n+$/, '')
+          : cap
+      });
+      continue;
+    }
+
+    // fences (gfm)
+    if (cap = this.rules.fences.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'code',
+        lang: cap[2],
+        text: cap[3] || ''
+      });
+      continue;
+    }
+
+    // heading
+    if (cap = this.rules.heading.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'heading',
+        depth: cap[1].length,
+        text: cap[2]
+      });
+      continue;
+    }
+
+    // table no leading pipe (gfm)
+    if (top && (cap = this.rules.nptable.exec(src))) {
+      item = {
+        type: 'table',
+        header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+        align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+        cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
+      };
+
+      if (item.header.length === item.align.length) {
+        src = src.substring(cap[0].length);
+
+        for (i = 0; i < item.align.length; i++) {
+          if (/^ *-+: *$/.test(item.align[i])) {
+            item.align[i] = 'right';
+          } else if (/^ *:-+: *$/.test(item.align[i])) {
+            item.align[i] = 'center';
+          } else if (/^ *:-+ *$/.test(item.align[i])) {
+            item.align[i] = 'left';
+          } else {
+            item.align[i] = null;
+          }
+        }
+
+        for (i = 0; i < item.cells.length; i++) {
+          item.cells[i] = splitCells(item.cells[i], item.header.length);
+        }
+
+        this.tokens.push(item);
+
+        continue;
+      }
+    }
+
+    // hr
+    if (cap = this.rules.hr.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'hr'
+      });
+      continue;
+    }
+
+    // blockquote
+    if (cap = this.rules.blockquote.exec(src)) {
+      src = src.substring(cap[0].length);
+
+      this.tokens.push({
+        type: 'blockquote_start'
+      });
+
+      cap = cap[0].replace(/^ *> ?/gm, '');
+
+      // Pass `top` to keep the current
+      // "toplevel" state. This is exactly
+      // how markdown.pl works.
+      this.token(cap, top);
+
+      this.tokens.push({
+        type: 'blockquote_end'
+      });
+
+      continue;
+    }
+
+    // list
+    if (cap = this.rules.list.exec(src)) {
+      src = src.substring(cap[0].length);
+      bull = cap[2];
+      isordered = bull.length > 1;
+
+      this.tokens.push({
+        type: 'list_start',
+        ordered: isordered,
+        start: isordered ? +bull : ''
+      });
+
+      // Get each top-level item.
+      cap = cap[0].match(this.rules.item);
+
+      next = false;
+      l = cap.length;
+      i = 0;
+
+      for (; i < l; i++) {
+        item = cap[i];
+
+        // Remove the list item's bullet
+        // so it is seen as the next token.
+        space = item.length;
+        item = item.replace(/^ *([*+-]|\d+\.) +/, '');
+
+        // Outdent whatever the
+        // list item contains. Hacky.
+        if (~item.indexOf('\n ')) {
+          space -= item.length;
+          item = !this.options.pedantic
+            ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
+            : item.replace(/^ {1,4}/gm, '');
+        }
+
+        // Determine whether the next list item belongs here.
+        // Backpedal if it does not belong in this list.
+        if (this.options.smartLists && i !== l - 1) {
+          b = block.bullet.exec(cap[i + 1])[0];
+          if (bull !== b && !(bull.length > 1 && b.length > 1)) {
+            src = cap.slice(i + 1).join('\n') + src;
+            i = l - 1;
+          }
+        }
+
+        // Determine whether item is loose or not.
+        // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
+        // for discount behavior.
+        loose = next || /\n\n(?!\s*$)/.test(item);
+        if (i !== l - 1) {
+          next = item.charAt(item.length - 1) === '\n';
+          if (!loose) loose = next;
+        }
+
+        // Check for task list items
+        istask = /^\[[ xX]\] /.test(item);
+        ischecked = undefined;
+        if (istask) {
+          ischecked = item[1] !== ' ';
+          item = item.replace(/^\[[ xX]\] +/, '');
+        }
+
+        this.tokens.push({
+          type: loose
+            ? 'loose_item_start'
+            : 'list_item_start',
+          task: istask,
+          checked: ischecked
+        });
+
+        // Recurse.
+        this.token(item, false);
+
+        this.tokens.push({
+          type: 'list_item_end'
+        });
+      }
+
+      this.tokens.push({
+        type: 'list_end'
+      });
+
+      continue;
+    }
+
+    // html
+    if (cap = this.rules.html.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: this.options.sanitize
+          ? 'paragraph'
+          : 'html',
+        pre: !this.options.sanitizer
+          && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
+        text: cap[0]
+      });
+      continue;
+    }
+
+    // def
+    if (top && (cap = this.rules.def.exec(src))) {
+      src = src.substring(cap[0].length);
+      if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
+      tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
+      if (!this.tokens.links[tag]) {
+        this.tokens.links[tag] = {
+          href: cap[2],
+          title: cap[3]
+        };
+      }
+      continue;
+    }
+
+    // table (gfm)
+    if (top && (cap = this.rules.table.exec(src))) {
+      item = {
+        type: 'table',
+        header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
+        align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
+        cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
+      };
+
+      if (item.header.length === item.align.length) {
+        src = src.substring(cap[0].length);
+
+        for (i = 0; i < item.align.length; i++) {
+          if (/^ *-+: *$/.test(item.align[i])) {
+            item.align[i] = 'right';
+          } else if (/^ *:-+: *$/.test(item.align[i])) {
+            item.align[i] = 'center';
+          } else if (/^ *:-+ *$/.test(item.align[i])) {
+            item.align[i] = 'left';
+          } else {
+            item.align[i] = null;
+          }
+        }
+
+        for (i = 0; i < item.cells.length; i++) {
+          item.cells[i] = splitCells(
+            item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
+            item.header.length);
+        }
+
+        this.tokens.push(item);
+
+        continue;
+      }
+    }
+
+    // lheading
+    if (cap = this.rules.lheading.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'heading',
+        depth: cap[2] === '=' ? 1 : 2,
+        text: cap[1]
+      });
+      continue;
+    }
+
+    // top-level paragraph
+    if (top && (cap = this.rules.paragraph.exec(src))) {
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'paragraph',
+        text: cap[1].charAt(cap[1].length - 1) === '\n'
+          ? cap[1].slice(0, -1)
+          : cap[1]
+      });
+      continue;
+    }
+
+    // text
+    if (cap = this.rules.text.exec(src)) {
+      // Top-level should never reach here.
+      src = src.substring(cap[0].length);
+      this.tokens.push({
+        type: 'text',
+        text: cap[0]
+      });
+      continue;
+    }
+
+    if (src) {
+      throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
+    }
+  }
+
+  return this.tokens;
+};
+
+/**
+ * Inline-Level Grammar
+ */
+
+var inline = {
+  escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
+  autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
+  url: noop,
+  tag: '^comment'
+    + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
+    + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
+    + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
+    + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
+    + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
+  link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
+  reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
+  nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
+  strong: /^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)|^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)/,
+  em: /^_([^\s][\s\S]*?[^\s_])_(?!_)|^_([^\s_][\s\S]*?[^\s])_(?!_)|^\*([^\s][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*][\s\S]*?[^\s])\*(?!\*)|^_([^\s_])_(?!_)|^\*([^\s*])\*(?!\*)/,
+  code: /^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,
+  br: /^ {2,}\n(?!\s*$)/,
+  del: noop,
+  text: /^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
+};
+
+inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
+
+inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
+inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
+inline.autolink = edit(inline.autolink)
+  .replace('scheme', inline._scheme)
+  .replace('email', inline._email)
+  .getRegex();
+
+inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
+
+inline.tag = edit(inline.tag)
+  .replace('comment', block._comment)
+  .replace('attribute', inline._attribute)
+  .getRegex();
+
+inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
+inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f()\\]*\)|[^\s\x00-\x1f()\\])*?)/;
+inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
+
+inline.link = edit(inline.link)
+  .replace('label', inline._label)
+  .replace('href', inline._href)
+  .replace('title', inline._title)
+  .getRegex();
+
+inline.reflink = edit(inline.reflink)
+  .replace('label', inline._label)
+  .getRegex();
+
+/**
+ * Normal Inline Grammar
+ */
+
+inline.normal = merge({}, inline);
+
+/**
+ * Pedantic Inline Grammar
+ */
+
+inline.pedantic = merge({}, inline.normal, {
+  strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
+  em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
+  link: edit(/^!?\[(label)\]\((.*?)\)/)
+    .replace('label', inline._label)
+    .getRegex(),
+  reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
+    .replace('label', inline._label)
+    .getRegex()
+});
+
+/**
+ * GFM Inline Grammar
+ */
+
+inline.gfm = merge({}, inline.normal, {
+  escape: edit(inline.escape).replace('])', '~|])').getRegex(),
+  url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/)
+    .replace('email', inline._email)
+    .getRegex(),
+  _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
+  del: /^~~(?=\S)([\s\S]*?\S)~~/,
+  text: edit(inline.text)
+    .replace(']|', '~]|')
+    .replace('|', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|')
+    .getRegex()
+});
+
+/**
+ * GFM + Line Breaks Inline Grammar
+ */
+
+inline.breaks = merge({}, inline.gfm, {
+  br: edit(inline.br).replace('{2,}', '*').getRegex(),
+  text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
+});
+
+/**
+ * Inline Lexer & Compiler
+ */
+
+function InlineLexer(links, options) {
+  this.options = options || marked.defaults;
+  this.links = links;
+  this.rules = inline.normal;
+  this.renderer = this.options.renderer || new Renderer();
+  this.renderer.options = this.options;
+
+  if (!this.links) {
+    throw new Error('Tokens array requires a `links` property.');
+  }
+
+  if (this.options.pedantic) {
+    this.rules = inline.pedantic;
+  } else if (this.options.gfm) {
+    if (this.options.breaks) {
+      this.rules = inline.breaks;
+    } else {
+      this.rules = inline.gfm;
+    }
+  }
+}
+
+/**
+ * Expose Inline Rules
+ */
+
+InlineLexer.rules = inline;
+
+/**
+ * Static Lexing/Compiling Method
+ */
+
+InlineLexer.output = function(src, links, options) {
+  var inline = new InlineLexer(links, options);
+  return inline.output(src);
+};
+
+/**
+ * Lexing/Compiling
+ */
+
+InlineLexer.prototype.output = function(src) {
+  var out = '',
+      link,
+      text,
+      href,
+      title,
+      cap;
+
+  while (src) {
+    // escape
+    if (cap = this.rules.escape.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += cap[1];
+      continue;
+    }
+
+    // autolink
+    if (cap = this.rules.autolink.exec(src)) {
+      src = src.substring(cap[0].length);
+      if (cap[2] === '@') {
+        text = escape(this.mangle(cap[1]));
+        href = 'mailto:' + text;
+      } else {
+        text = escape(cap[1]);
+        href = text;
+      }
+      out += this.renderer.link(href, null, text);
+      continue;
+    }
+
+    // url (gfm)
+    if (!this.inLink && (cap = this.rules.url.exec(src))) {
+      cap[0] = this.rules._backpedal.exec(cap[0])[0];
+      src = src.substring(cap[0].length);
+      if (cap[2] === '@') {
+        text = escape(cap[0]);
+        href = 'mailto:' + text;
+      } else {
+        text = escape(cap[0]);
+        if (cap[1] === 'www.') {
+          href = 'http://' + text;
+        } else {
+          href = text;
+        }
+      }
+      out += this.renderer.link(href, null, text);
+      continue;
+    }
+
+    // tag
+    if (cap = this.rules.tag.exec(src)) {
+      if (!this.inLink && /^<a /i.test(cap[0])) {
+        this.inLink = true;
+      } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
+        this.inLink = false;
+      }
+      src = src.substring(cap[0].length);
+      out += this.options.sanitize
+        ? this.options.sanitizer
+          ? this.options.sanitizer(cap[0])
+          : escape(cap[0])
+        : cap[0]
+      continue;
+    }
+
+    // link
+    if (cap = this.rules.link.exec(src)) {
+      src = src.substring(cap[0].length);
+      this.inLink = true;
+      href = cap[2];
+      if (this.options.pedantic) {
+        link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
+
+        if (link) {
+          href = link[1];
+          title = link[3];
+        } else {
+          title = '';
+        }
+      } else {
+        title = cap[3] ? cap[3].slice(1, -1) : '';
+      }
+      href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
+      out += this.outputLink(cap, {
+        href: InlineLexer.escapes(href),
+        title: InlineLexer.escapes(title)
+      });
+      this.inLink = false;
+      continue;
+    }
+
+    // reflink, nolink
+    if ((cap = this.rules.reflink.exec(src))
+        || (cap = this.rules.nolink.exec(src))) {
+      src = src.substring(cap[0].length);
+      link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
+      link = this.links[link.toLowerCase()];
+      if (!link || !link.href) {
+        out += cap[0].charAt(0);
+        src = cap[0].substring(1) + src;
+        continue;
+      }
+      this.inLink = true;
+      out += this.outputLink(cap, link);
+      this.inLink = false;
+      continue;
+    }
+
+    // strong
+    if (cap = this.rules.strong.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
+      continue;
+    }
+
+    // em
+    if (cap = this.rules.em.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
+      continue;
+    }
+
+    // code
+    if (cap = this.rules.code.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.codespan(escape(cap[2].trim(), true));
+      continue;
+    }
+
+    // br
+    if (cap = this.rules.br.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.br();
+      continue;
+    }
+
+    // del (gfm)
+    if (cap = this.rules.del.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.del(this.output(cap[1]));
+      continue;
+    }
+
+    // text
+    if (cap = this.rules.text.exec(src)) {
+      src = src.substring(cap[0].length);
+      out += this.renderer.text(escape(this.smartypants(cap[0])));
+      continue;
+    }
+
+    if (src) {
+      throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
+    }
+  }
+
+  return out;
+};
+
+InlineLexer.escapes = function(text) {
+  return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
+}
+
+/**
+ * Compile Link
+ */
+
+InlineLexer.prototype.outputLink = function(cap, link) {
+  var href = link.href,
+      title = link.title ? escape(link.title) : null;
+
+  return cap[0].charAt(0) !== '!'
+    ? this.renderer.link(href, title, this.output(cap[1]))
+    : this.renderer.image(href, title, escape(cap[1]));
+};
+
+/**
+ * Smartypants Transformations
+ */
+
+InlineLexer.prototype.smartypants = function(text) {
+  if (!this.options.smartypants) return text;
+  return text
+    // em-dashes
+    .replace(/---/g, '\u2014')
+    // en-dashes
+    .replace(/--/g, '\u2013')
+    // opening singles
+    .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
+    // closing singles & apostrophes
+    .replace(/'/g, '\u2019')
+    // opening doubles
+    .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
+    // closing doubles
+    .replace(/"/g, '\u201d')
+    // ellipses
+    .replace(/\.{3}/g, '\u2026');
+};
+
+/**
+ * Mangle Links
+ */
+
+InlineLexer.prototype.mangle = function(text) {
+  if (!this.options.mangle) return text;
+  var out = '',
+      l = text.length,
+      i = 0,
+      ch;
+
+  for (; i < l; i++) {
+    ch = text.charCodeAt(i);
+    if (Math.random() > 0.5) {
+      ch = 'x' + ch.toString(16);
+    }
+    out += '&#' + ch + ';';
+  }
+
+  return out;
+};
+
+/**
+ * Renderer
+ */
+
+function Renderer(options) {
+  this.options = options || marked.defaults;
+}
+
+Renderer.prototype.code = function(code, lang, escaped) {
+  if (this.options.highlight) {
+    var out = this.options.highlight(code, lang);
+    if (out != null && out !== code) {
+      escaped = true;
+      code = out;
+    }
+  }
+
+  if (!lang) {
+    return '<pre><code>'
+      + (escaped ? code : escape(code, true))
+      + '</code></pre>';
+  }
+
+  return '<pre><code class="'
+    + this.options.langPrefix
+    + escape(lang, true)
+    + '">'
+    + (escaped ? code : escape(code, true))
+    + '</code></pre>\n';
+};
+
+Renderer.prototype.blockquote = function(quote) {
+  return '<blockquote>\n' + quote + '</blockquote>\n';
+};
+
+Renderer.prototype.html = function(html) {
+  return html;
+};
+
+Renderer.prototype.heading = function(text, level, raw) {
+  if (this.options.headerIds) {
+    return '<h'
+      + level
+      + ' id="'
+      + this.options.headerPrefix
+      + raw.toLowerCase().replace(/[^\w]+/g, '-')
+      + '">'
+      + text
+      + '</h'
+      + level
+      + '>\n';
+  }
+  // ignore IDs
+  return '<h' + level + '>' + text + '</h' + level + '>\n';
+};
+
+Renderer.prototype.hr = function() {
+  return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
+};
+
+Renderer.prototype.list = function(body, ordered, start) {
+  var type = ordered ? 'ol' : 'ul',
+      startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
+  return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
+};
+
+Renderer.prototype.listitem = function(text) {
+  return '<li>' + text + '</li>\n';
+};
+
+Renderer.prototype.checkbox = function(checked) {
+  return '<input '
+    + (checked ? 'checked="" ' : '')
+    + 'disabled="" type="checkbox"'
+    + (this.options.xhtml ? ' /' : '')
+    + '> ';
+}
+
+Renderer.prototype.paragraph = function(text) {
+  return '<p>' + text + '</p>\n';
+};
+
+Renderer.prototype.table = function(header, body) {
+  if (body) body = '<tbody>' + body + '</tbody>';
+
+  return '<table>\n'
+    + '<thead>\n'
+    + header
+    + '</thead>\n'
+    + body
+    + '</table>\n';
+};
+
+Renderer.prototype.tablerow = function(content) {
+  return '<tr>\n' + content + '</tr>\n';
+};
+
+Renderer.prototype.tablecell = function(content, flags) {
+  var type = flags.header ? 'th' : 'td';
+  var tag = flags.align
+    ? '<' + type + ' align="' + flags.align + '">'
+    : '<' + type + '>';
+  return tag + content + '</' + type + '>\n';
+};
+
+// span level renderer
+Renderer.prototype.strong = function(text) {
+  return '<strong>' + text + '</strong>';
+};
+
+Renderer.prototype.em = function(text) {
+  return '<em>' + text + '</em>';
+};
+
+Renderer.prototype.codespan = function(text) {
+  return '<code>' + text + '</code>';
+};
+
+Renderer.prototype.br = function() {
+  return this.options.xhtml ? '<br/>' : '<br>';
+};
+
+Renderer.prototype.del = function(text) {
+  return '<del>' + text + '</del>';
+};
+
+Renderer.prototype.link = function(href, title, text) {
+  if (this.options.sanitize) {
+    try {
+      var prot = decodeURIComponent(unescape(href))
+        .replace(/[^\w:]/g, '')
+        .toLowerCase();
+    } catch (e) {
+      return text;
+    }
+    if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
+      return text;
+    }
+  }
+  if (this.options.baseUrl && !originIndependentUrl.test(href)) {
+    href = resolveUrl(this.options.baseUrl, href);
+  }
+  try {
+    href = encodeURI(href).replace(/%25/g, '%');
+  } catch (e) {
+    return text;
+  }
+  var out = '<a href="' + escape(href) + '"';
+  if (title) {
+    out += ' title="' + title + '"';
+  }
+  out += '>' + text + '</a>';
+  return out;
+};
+
+Renderer.prototype.image = function(href, title, text) {
+  if (this.options.baseUrl && !originIndependentUrl.test(href)) {
+    href = resolveUrl(this.options.baseUrl, href);
+  }
+  var out = '<img src="' + href + '" alt="' + text + '"';
+  if (title) {
+    out += ' title="' + title + '"';
+  }
+  out += this.options.xhtml ? '/>' : '>';
+  return out;
+};
+
+Renderer.prototype.text = function(text) {
+  return text;
+};
+
+/**
+ * TextRenderer
+ * returns only the textual part of the token
+ */
+
+function TextRenderer() {}
+
+// no need for block level renderers
+
+TextRenderer.prototype.strong =
+TextRenderer.prototype.em =
+TextRenderer.prototype.codespan =
+TextRenderer.prototype.del =
+TextRenderer.prototype.text = function (text) {
+  return text;
+}
+
+TextRenderer.prototype.link =
+TextRenderer.prototype.image = function(href, title, text) {
+  return '' + text;
+}
+
+TextRenderer.prototype.br = function() {
+  return '';
+}
+
+/**
+ * Parsing & Compiling
+ */
+
+function Parser(options) {
+  this.tokens = [];
+  this.token = null;
+  this.options = options || marked.defaults;
+  this.options.renderer = this.options.renderer || new Renderer();
+  this.renderer = this.options.renderer;
+  this.renderer.options = this.options;
+}
+
+/**
+ * Static Parse Method
+ */
+
+Parser.parse = function(src, options) {
+  var parser = new Parser(options);
+  return parser.parse(src);
+};
+
+/**
+ * Parse Loop
+ */
+
+Parser.prototype.parse = function(src) {
+  this.inline = new InlineLexer(src.links, this.options);
+  // use an InlineLexer with a TextRenderer to extract pure text
+  this.inlineText = new InlineLexer(
+    src.links,
+    merge({}, this.options, {renderer: new TextRenderer()})
+  );
+  this.tokens = src.reverse();
+
+  var out = '';
+  while (this.next()) {
+    out += this.tok();
+  }
+
+  return out;
+};
+
+/**
+ * Next Token
+ */
+
+Parser.prototype.next = function() {
+  return this.token = this.tokens.pop();
+};
+
+/**
+ * Preview Next Token
+ */
+
+Parser.prototype.peek = function() {
+  return this.tokens[this.tokens.length - 1] || 0;
+};
+
+/**
+ * Parse Text Tokens
+ */
+
+Parser.prototype.parseText = function() {
+  var body = this.token.text;
+
+  while (this.peek().type === 'text') {
+    body += '\n' + this.next().text;
+  }
+
+  return this.inline.output(body);
+};
+
+/**
+ * Parse Current Token
+ */
+
+Parser.prototype.tok = function() {
+  switch (this.token.type) {
+    case 'space': {
+      return '';
+    }
+    case 'hr': {
+      return this.renderer.hr();
+    }
+    case 'heading': {
+      return this.renderer.heading(
+        this.inline.output(this.token.text),
+        this.token.depth,
+        unescape(this.inlineText.output(this.token.text)));
+    }
+    case 'code': {
+      return this.renderer.code(this.token.text,
+        this.token.lang,
+        this.token.escaped);
+    }
+    case 'table': {
+      var header = '',
+          body = '',
+          i,
+          row,
+          cell,
+          j;
+
+      // header
+      cell = '';
+      for (i = 0; i < this.token.header.length; i++) {
+        cell += this.renderer.tablecell(
+          this.inline.output(this.token.header[i]),
+          { header: true, align: this.token.align[i] }
+        );
+      }
+      header += this.renderer.tablerow(cell);
+
+      for (i = 0; i < this.token.cells.length; i++) {
+        row = this.token.cells[i];
+
+        cell = '';
+        for (j = 0; j < row.length; j++) {
+          cell += this.renderer.tablecell(
+            this.inline.output(row[j]),
+            { header: false, align: this.token.align[j] }
+          );
+        }
+
+        body += this.renderer.tablerow(cell);
+      }
+      return this.renderer.table(header, body);
+    }
+    case 'blockquote_start': {
+      body = '';
+
+      while (this.next().type !== 'blockquote_end') {
+        body += this.tok();
+      }
+
+      return this.renderer.blockquote(body);
+    }
+    case 'list_start': {
+      body = '';
+      var ordered = this.token.ordered,
+          start = this.token.start;
+
+      while (this.next().type !== 'list_end') {
+        body += this.tok();
+      }
+
+      return this.renderer.list(body, ordered, start);
+    }
+    case 'list_item_start': {
+      body = '';
+
+      if (this.token.task) {
+        body += this.renderer.checkbox(this.token.checked);
+      }
+
+      while (this.next().type !== 'list_item_end') {
+        body += this.token.type === 'text'
+          ? this.parseText()
+          : this.tok();
+      }
+
+      return this.renderer.listitem(body);
+    }
+    case 'loose_item_start': {
+      body = '';
+
+      while (this.next().type !== 'list_item_end') {
+        body += this.tok();
+      }
+
+      return this.renderer.listitem(body);
+    }
+    case 'html': {
+      // TODO parse inline content if parameter markdown=1
+      return this.renderer.html(this.token.text);
+    }
+    case 'paragraph': {
+      return this.renderer.paragraph(this.inline.output(this.token.text));
+    }
+    case 'text': {
+      return this.renderer.paragraph(this.parseText());
+    }
+  }
+};
+
+/**
+ * Helpers
+ */
+
+function escape(html, encode) {
+  return html
+    .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&amp;')
+    .replace(/</g, '&lt;')
+    .replace(/>/g, '&gt;')
+    .replace(/"/g, '&quot;')
+    .replace(/'/g, '&#39;');
+}
+
+function unescape(html) {
+  // explicitly match decimal, hex, and named HTML entities
+  return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
+    n = n.toLowerCase();
+    if (n === 'colon') return ':';
+    if (n.charAt(0) === '#') {
+      return n.charAt(1) === 'x'
+        ? String.fromCharCode(parseInt(n.substring(2), 16))
+        : String.fromCharCode(+n.substring(1));
+    }
+    return '';
+  });
+}
+
+function edit(regex, opt) {
+  regex = regex.source || regex;
+  opt = opt || '';
+  return {
+    replace: function(name, val) {
+      val = val.source || val;
+      val = val.replace(/(^|[^\[])\^/g, '$1');
+      regex = regex.replace(name, val);
+      return this;
+    },
+    getRegex: function() {
+      return new RegExp(regex, opt);
+    }
+  };
+}
+
+function resolveUrl(base, href) {
+  if (!baseUrls[' ' + base]) {
+    // we can ignore everything in base after the last slash of its path component,
+    // but we might need to add _that_
+    // https://tools.ietf.org/html/rfc3986#section-3
+    if (/^[^:]+:\/*[^/]*$/.test(base)) {
+      baseUrls[' ' + base] = base + '/';
+    } else {
+      baseUrls[' ' + base] = base.replace(/[^/]*$/, '');
+    }
+  }
+  base = baseUrls[' ' + base];
+
+  if (href.slice(0, 2) === '//') {
+    return base.replace(/:[\s\S]*/, ':') + href;
+  } else if (href.charAt(0) === '/') {
+    return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
+  } else {
+    return base + href;
+  }
+}
+var baseUrls = {};
+var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
+
+function noop() {}
+noop.exec = noop;
+
+function merge(obj) {
+  var i = 1,
+      target,
+      key;
+
+  for (; i < arguments.length; i++) {
+    target = arguments[i];
+    for (key in target) {
+      if (Object.prototype.hasOwnProperty.call(target, key)) {
+        obj[key] = target[key];
+      }
+    }
+  }
+
+  return obj;
+}
+
+function splitCells(tableRow, count) {
+  var cells = tableRow.replace(/([^\\])\|/g, '$1 |').split(/ +\| */),
+      i = 0;
+
+  if (cells.length > count) {
+    cells.splice(count);
+  } else {
+    while (cells.length < count) cells.push('');
+  }
+
+  for (; i < cells.length; i++) {
+    cells[i] = cells[i].replace(/\\\|/g, '|');
+  }
+  return cells;
+}
+
+/**
+ * Marked
+ */
+
+function marked(src, opt, callback) {
+  // throw error in case of non string input
+  if (typeof src === 'undefined' || src === null) {
+    throw new Error('marked(): input parameter is undefined or null');
+  }
+  if (typeof src !== 'string') {
+    throw new Error('marked(): input parameter is of type '
+      + Object.prototype.toString.call(src) + ', string expected');
+  }
+
+  if (callback || typeof opt === 'function') {
+    if (!callback) {
+      callback = opt;
+      opt = null;
+    }
+
+    opt = merge({}, marked.defaults, opt || {});
+
+    var highlight = opt.highlight,
+        tokens,
+        pending,
+        i = 0;
+
+    try {
+      tokens = Lexer.lex(src, opt)
+    } catch (e) {
+      return callback(e);
+    }
+
+    pending = tokens.length;
+
+    var done = function(err) {
+      if (err) {
+        opt.highlight = highlight;
+        return callback(err);
+      }
+
+      var out;
+
+      try {
+        out = Parser.parse(tokens, opt);
+      } catch (e) {
+        err = e;
+      }
+
+      opt.highlight = highlight;
+
+      return err
+        ? callback(err)
+        : callback(null, out);
+    };
+
+    if (!highlight || highlight.length < 3) {
+      return done();
+    }
+
+    delete opt.highlight;
+
+    if (!pending) return done();
+
+    for (; i < tokens.length; i++) {
+      (function(token) {
+        if (token.type !== 'code') {
+          return --pending || done();
+        }
+        return highlight(token.text, token.lang, function(err, code) {
+          if (err) return done(err);
+          if (code == null || code === token.text) {
+            return --pending || done();
+          }
+          token.text = code;
+          token.escaped = true;
+          --pending || done();
+        });
+      })(tokens[i]);
+    }
+
+    return;
+  }
+  try {
+    if (opt) opt = merge({}, marked.defaults, opt);
+    return Parser.parse(Lexer.lex(src, opt), opt);
+  } catch (e) {
+    e.message += '\nPlease report this to https://github.com/markedjs/marked.';
+    if ((opt || marked.defaults).silent) {
+      return '<p>An error occurred:</p><pre>'
+        + escape(e.message + '', true)
+        + '</pre>';
+    }
+    throw e;
+  }
+}
+
+/**
+ * Options
+ */
+
+marked.options =
+marked.setOptions = function(opt) {
+  merge(marked.defaults, opt);
+  return marked;
+};
+
+marked.getDefaults = function () {
+  return {
+    baseUrl: null,
+    breaks: false,
+    gfm: true,
+    headerIds: true,
+    headerPrefix: '',
+    highlight: null,
+    langPrefix: 'language-',
+    mangle: true,
+    pedantic: false,
+    renderer: new Renderer(),
+    sanitize: false,
+    sanitizer: null,
+    silent: false,
+    smartLists: false,
+    smartypants: false,
+    tables: true,
+    xhtml: false
+  };
+}
+
+marked.defaults = marked.getDefaults();
+
+/**
+ * Expose
+ */
+
+marked.Parser = Parser;
+marked.parser = Parser.parse;
+
+marked.Renderer = Renderer;
+marked.TextRenderer = TextRenderer;
+
+marked.Lexer = Lexer;
+marked.lexer = Lexer.lex;
+
+marked.InlineLexer = InlineLexer;
+marked.inlineLexer = InlineLexer.output;
+
+marked.parse = marked;
+
+if (typeof module !== 'undefined' && typeof exports === 'object') {
+  module.exports = marked;
+} else if (typeof define === 'function' && define.amd) {
+  define(function() { return marked; });
+} else {
+  root.marked = marked;
+}
+})(this || (typeof window !== 'undefined' ? window : global));

+ 91 - 0
node_modules/marked/man/marked.1

@@ -0,0 +1,91 @@
+.ds q \N'34'
+.TH marked 1 "2014-01-31" "v0.3.1" "marked.js"
+
+.SH NAME
+marked \- a javascript markdown parser
+
+.SH SYNOPSIS
+.B marked
+[\-o \fI<output>\fP] [\-i \fI<input>\fP] [\-\-help]
+[\-\-tokens] [\-\-pedantic] [\-\-gfm]
+[\-\-breaks] [\-\-tables] [\-\-sanitize]
+[\-\-smart\-lists] [\-\-lang\-prefix \fI<prefix>\fP]
+[\-\-no\-etc...] [\-\-silent] [\fIfilename\fP]
+
+.SH DESCRIPTION
+.B marked
+is a full-featured javascript markdown parser, built for speed. It also includes
+multiple GFM features.
+
+.SH EXAMPLES
+.TP
+cat in.md | marked > out.html
+.TP
+echo "hello *world*" | marked
+.TP
+marked \-o out.html \-i in.md \-\-gfm
+.TP
+marked \-\-output="hello world.html" \-i in.md \-\-no-breaks
+
+.SH OPTIONS
+.TP
+.BI \-o,\ \-\-output\ [\fIoutput\fP]
+Specify file output. If none is specified, write to stdout.
+.TP
+.BI \-i,\ \-\-input\ [\fIinput\fP]
+Specify file input, otherwise use last argument as input file. If no input file
+is specified, read from stdin.
+.TP
+.BI \-t,\ \-\-tokens
+Output a token stream instead of html.
+.TP
+.BI \-\-pedantic
+Conform to obscure parts of markdown.pl as much as possible. Don't fix original
+markdown bugs.
+.TP
+.BI \-\-gfm
+Enable github flavored markdown.
+.TP
+.BI \-\-breaks
+Enable GFM line breaks. Only works with the gfm option.
+.TP
+.BI \-\-tables
+Enable GFM tables. Only works with the gfm option.
+.TP
+.BI \-\-sanitize
+Sanitize output. Ignore any HTML input.
+.TP
+.BI \-\-smart\-lists
+Use smarter list behavior than the original markdown.
+.TP
+.BI \-\-lang\-prefix\ [\fIprefix\fP]
+Set the prefix for code block classes.
+.TP
+.BI \-\-mangle
+Mangle email addresses.
+.TP
+.BI \-\-no\-sanitize,\ \-no-etc...
+The inverse of any of the marked options above.
+.TP
+.BI \-\-silent
+Silence error output.
+.TP
+.BI \-h,\ \-\-help
+Display help information.
+
+.SH CONFIGURATION
+For configuring and running programmatically.
+
+.B Example
+
+    require('marked')('*foo*', { gfm: true });
+
+.SH BUGS
+Please report any bugs to https://github.com/markedjs/marked.
+
+.SH LICENSE
+Copyright (c) 2011-2014, Christopher Jeffrey (MIT License).
+
+.SH "SEE ALSO"
+.BR markdown(1),
+.BR node.js(1)

+ 96 - 0
node_modules/marked/man/marked.1.txt

@@ -0,0 +1,96 @@
+marked(1)			   marked.js			     marked(1)
+
+
+
+NAME
+       marked - a javascript markdown parser
+
+
+SYNOPSIS
+       marked  [-o  <output>]  [-i  <input>]  [--help] [--tokens] [--pedantic]
+       [--gfm] [--breaks] [--tables] [--sanitize] [--smart-lists] [--lang-pre‐
+       fix <prefix>] [--no-etc...] [--silent] [filename]
+
+
+DESCRIPTION
+       marked  is a full-featured javascript markdown parser, built for speed.
+       It also includes multiple GFM features.
+
+
+EXAMPLES
+       cat in.md | marked > out.html
+
+       echo "hello *world*" | marked
+
+       marked -o out.html -i in.md --gfm
+
+       marked --output="hello world.html" -i in.md --no-breaks
+
+
+OPTIONS
+       -o, --output [output]
+	      Specify file output. If none is specified, write to stdout.
+
+       -i, --input [input]
+	      Specify file input, otherwise use last argument as  input  file.
+	      If no input file is specified, read from stdin.
+
+       -t, --tokens
+	      Output a token stream instead of html.
+
+       --pedantic
+	      Conform  to  obscure  parts  of markdown.pl as much as possible.
+	      Don't fix original markdown bugs.
+
+       --gfm  Enable github flavored markdown.
+
+       --breaks
+	      Enable GFM line breaks. Only works with the gfm option.
+
+       --tables
+	      Enable GFM tables. Only works with the gfm option.
+
+       --sanitize
+	      Sanitize output. Ignore any HTML input.
+
+       --smart-lists
+	      Use smarter list behavior than the original markdown.
+
+       --lang-prefix [prefix]
+	      Set the prefix for code block classes.
+
+       --mangle
+	      Mangle email addresses.
+
+       --no-sanitize, -no-etc...
+	      The inverse of any of the marked options above.
+
+       --silent
+	      Silence error output.
+
+       -h, --help
+	      Display help information.
+
+
+CONFIGURATION
+       For configuring and running programmatically.
+
+       Example
+
+	   require('marked')('*foo*', { gfm: true });
+
+
+BUGS
+       Please report any bugs to https://github.com/chjj/marked.
+
+
+LICENSE
+       Copyright (c) 2011-2014, Christopher Jeffrey (MIT License).
+
+
+SEE ALSO
+       markdown(1), node.js(1)
+
+
+
+v0.3.1				  2014-01-31			     marked(1)

File diff suppressed because it is too large
+ 5 - 0
node_modules/marked/marked.min.js


+ 96 - 0
node_modules/marked/package.json

@@ -0,0 +1,96 @@
+{
+  "_from": "marked",
+  "_id": "marked@0.4.0",
+  "_inBundle": false,
+  "_integrity": "sha512-tMsdNBgOsrUophCAFQl0XPe6Zqk/uy9gnue+jIIKhykO51hxyu6uNx7zBPy0+y/WKYVZZMspV9YeXLNdKk+iYw==",
+  "_location": "/marked",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "marked",
+    "name": "marked",
+    "escapedName": "marked",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/marked/-/marked-0.4.0.tgz",
+  "_shasum": "9ad2c2a7a1791f10a852e0112f77b571dce10c66",
+  "_spec": "marked",
+  "_where": "/home/zorro/Documents/Sahib/zweiachtzehn",
+  "author": {
+    "name": "Christopher Jeffrey"
+  },
+  "bin": {
+    "marked": "./bin/marked"
+  },
+  "bugs": {
+    "url": "http://github.com/markedjs/marked/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "A markdown parser built for speed",
+  "devDependencies": {
+    "eslint": "^4.15.0",
+    "eslint-config-standard": "^11.0.0-beta.0",
+    "eslint-plugin-import": "^2.8.0",
+    "eslint-plugin-node": "^5.2.1",
+    "eslint-plugin-promise": "^3.6.0",
+    "eslint-plugin-standard": "^3.0.1",
+    "eslint-plugin-vuln-regex-detector": "^1.0.4",
+    "front-matter": "^2.3.0",
+    "glob-to-regexp": "0.3.0",
+    "html-differ": "^1.3.4",
+    "jasmine": "^3.1.0",
+    "jasmine2-custom-message": "^0.9.0",
+    "markdown": "*",
+    "markdown-it": "*",
+    "showdown": "*",
+    "uglify-js": "^3.3.10"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "homepage": "https://marked.js.org",
+  "keywords": [
+    "markdown",
+    "markup",
+    "html"
+  ],
+  "license": "MIT",
+  "main": "./lib/marked.js",
+  "man": [
+    "./man/marked.1"
+  ],
+  "name": "marked",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/markedjs/marked.git"
+  },
+  "scripts": {
+    "bench": "node test --bench",
+    "build": "uglifyjs lib/marked.js -cm  --comments /Copyright/ -o marked.min.js",
+    "lint": "eslint --fix bin/marked .",
+    "preversion": "npm run build && (git diff --quiet || git commit -am 'minify')",
+    "test": "jasmine --config=jasmine.json",
+    "test:cm": "npm test -- test/specs/commonmark/**/*-spec.js",
+    "test:gfm": "npm test -- test/specs/gfm/**/*-spec.js",
+    "test:lint": "eslint bin/marked .",
+    "test:marked": "npm test -- test/specs/marked/**/*-spec.js",
+    "test:old": "node test",
+    "test:redos": "eslint --plugin vuln-regex-detector --rule '\"vuln-regex-detector/no-vuln-regex\": 2' lib/marked.js",
+    "test:specs": "npm test -- test/specs/**/*-spec.js",
+    "test:unit": "npm test -- test/unit/**/*-spec.js"
+  },
+  "tags": [
+    "markdown",
+    "markup",
+    "html"
+  ],
+  "version": "0.4.0"
+}

+ 1188 - 0
node_modules/svelte/CHANGELOG.md

@@ -0,0 +1,1188 @@
+# Svelte changelog
+
+## 2.6.5
+
+* Handle cases where only some `if` block branches have outros ([#1492](https://github.com/sveltejs/svelte/issues/1492))
+
+## 2.6.4
+
+* Web worker support ([#1487](https://github.com/sveltejs/svelte/issues/1487))
+* Update dynamic component bindings when component changes ([#1489](https://github.com/sveltejs/svelte/issues/1489))
+
+## 2.6.3
+
+* Nested transitions respect `skipIntroByDefault` ([#1460](https://github.com/sveltejs/svelte/issues/1460))
+* Always create outro for top-level block ([#1470](https://github.com/sveltejs/svelte/issues/1470))
+
+## 2.6.2
+
+* Fix spread+bindings on dynamic components ([#1433](https://github.com/sveltejs/svelte/issues/1433))
+* Abort in-progress animations, if a new one starts ([#1458](https://github.com/sveltejs/svelte/issues/1458))
+* Allow animations to be parameterised ([#1462](https://github.com/sveltejs/svelte/issues/1462))
+
+## 2.6.1
+
+* Absolutely position outroing animated nodes ([#1457](https://github.com/sveltejs/svelte/pull/1457))
+
+## 2.6.0
+
+* Add `animate` directive ([#1454](https://github.com/sveltejs/svelte/pull/1454))
+* Add `skipIntroByDefault` compiler option and `intro: true` init option ([#1448](https://github.com/sveltejs/svelte/pull/1448))
+* Add `nestedTransitions` compiler option ([#1451](https://github.com/sveltejs/svelte/pull/1451))
+* Component outros, if `nestedTransitions` is true ([#1211](https://github.com/sveltejs/svelte/issues/1211))
+* Allow transition functions to return a function, for inter-transition coordination ([#1453](https://github.com/sveltejs/svelte/pull/1453))
+* Pass `1 - t` as second argument to transition functions ([#1452](https://github.com/sveltejs/svelte/pull/1452))
+
+## 2.5.1
+
+* Add new ARIA attributes ([#1436](https://github.com/sveltejs/svelte/pull/1436))
+* Add `Promise` to whitelisted globals ([#1441](https://github.com/sveltejs/svelte/issues/1441))
+* Allow spaces around reserved keyword attributes ([#1445](https://github.com/sveltejs/svelte/issues/1445))
+
+## 2.5.0
+
+* Support transitions in `await` blocks ([#956](https://github.com/sveltejs/svelte/issues/956))
+* Abort outros if block is recreated ([#1425](https://github.com/sveltejs/svelte/issues/1425))
+* Wait until transitions have completed before removing styles ([#648](https://github.com/sveltejs/svelte/issues/648))
+* Support event shorthand on dynamic components ([#1427](https://github.com/sveltejs/svelte/pull/1427))
+* Various codegen improvements ([#1419](https://github.com/sveltejs/svelte/pull/1419), [#1421](https://github.com/sveltejs/svelte/pull/1421), [#1422](https://github.com/sveltejs/svelte/pull/1422), [#1424](https://github.com/sveltejs/svelte/pull/1424))
+* Correctly handle `await` blocks with no dynamic content ([#1417](https://github.com/sveltejs/svelte/issues/1417))
+* Allow spread props on elements with static attribute tests ([#1429](https://github.com/sveltejs/svelte/pull/1429))
+
+
+## 2.4.4
+
+* Declare missing variable in Store ([#1415](https://github.com/sveltejs/svelte/issues/1415))
+* ALways declare spread levels ([#1413](https://github.com/sveltejs/svelte/issues/1413))
+
+## 2.4.3
+
+* `ref` directives prevent HTMLified content ([#1407](https://github.com/sveltejs/svelte/issues/1407))
+* Store computed properties update components immediately upon declaration ([#1327](https://github.com/sveltejs/svelte/issues/1327))
+
+## 2.4.2
+
+* Evaluate `each` key in child scope ([#1397](https://github.com/sveltejs/svelte/issues/1397))
+* Prevent false negatives and positives when detecting cyclical computed store properties ([#1399](https://github.com/sveltejs/svelte/issues/1399))
+* Only update dynamic component props ([#1394](https://github.com/sveltejs/svelte/issues/1394))
+
+## 2.4.1
+
+* Fix DOM event context ([#1390](https://github.com/sveltejs/svelte/issues/1390))
+
+## 2.4.0
+
+* Integrate CLI ([#1360](https://github.com/sveltejs/svelte/issues/1360))
+* Allow arbitrary destructuring for each block items, with binding ([#1385](https://github.com/sveltejs/svelte/pull/1385))
+* Each block keys can use arbitrary expressions ([#703](https://github.com/sveltejs/svelte/issues/703))
+* `bind:offsetWidth`, `bind:offsetHeight`, `bind:clientWidth` and `bind:clientHeight` ([#984](https://github.com/sveltejs/svelte/issues/984))
+* Leaner generated code for `each` blocks ([#1287](https://github.com/sveltejs/svelte/issues/1287))
+
+
+## 2.3.0
+
+* Allow computed properties to have entire state object as dependency ([#1303](https://github.com/sveltejs/svelte/issues/1303))
+* Fix `stats` when `options.generate` is `false` ([#1368](https://github.com/sveltejs/svelte/issues/1368))
+* Assign custom methods to custom elements ([#1369](https://github.com/sveltejs/svelte/issues/1369))
+* Fix `this` value in custom event handlers ([#1297](https://github.com/sveltejs/svelte/issues/1297))
+* Re-evaluate `each` values lazily ([#1286](https://github.com/sveltejs/svelte/issues/1286))
+* Preserve outer context in `await` blocks ([#1251](https://github.com/sveltejs/svelte/issues/1251))
+
+## 2.2.0
+
+* Internal refactoring ([#1367](https://github.com/sveltejs/svelte/pull/1367))
+
+## 2.1.1
+
+* Report initial `changed` based on state, not expected props ([#1356](https://github.com/sveltejs/svelte/issues/1356))
+* Set state to empty object, not null, on destroy ([#1354](https://github.com/sveltejs/svelte/issues/1354))
+* Prevent stale state in component event handlers ([#1353](https://github.com/sveltejs/svelte/issues/1353))
+
+## 2.1.0
+
+* Allow shorthand imports ([#1038](https://github.com/sveltejs/svelte/issues/1038))
+* Update spread props inside each blocks ([#1337](https://github.com/sveltejs/svelte/issues/1337))
+
+## 2.0.0
+
+*See [the blog post](https://svelte.technology/blog/version-2) for information on how to upgrade your apps*
+
+* New template syntax ([#1318](https://github.com/sveltejs/svelte/issues/1318))
+* Emit ES2015 code, not ES5 ([#1348](https://github.com/sveltejs/svelte/pull/1348))
+* Add `onstate` and `onupdate` hooks, remove `component.observe` method ([#1197](https://github.com/sveltejs/svelte/issues/1197))
+* Use destructuring syntax for computed properties ([#1069](https://github.com/sveltejs/svelte/issues/1069)
+* Change signature of `svelte.compile` ([#1298](https://github.com/sveltejs/svelte/pull/1298))
+* Remove `validate` and `Stylesheet` from public API ([#1348](https://github.com/sveltejs/svelte/pull/1348))
+* Don't typecast numeric attributes ([#657](https://github.com/sveltejs/svelte/issues/657))
+* Always compile with `Store` support, and cascading disabled ([#1348](https://github.com/sveltejs/svelte/pull/1348))
+* Remove unused `hash` property from AST ([#1348](https://github.com/sveltejs/svelte/pull/1348))
+* Rename `loc` property to `start` in warnings and errors ([#1348](https://github.com/sveltejs/svelte/pull/1348))
+
+## 1.64.1
+
+* Fix computed properties in SSR renderer ([#1349](https://github.com/sveltejs/svelte/issues/1349))
+
+## 1.64.0
+
+* Deprecate passing a string argument to `component.get` ([#1347](https://github.com/sveltejs/svelte/pull/1347))
+
+## 1.63.1
+
+* Allow `observe` method to be overwritten
+
+## 1.63.0
+
+* Add `onstate` and `onupdate` lifecycle hooks and deprecate `component.observe` ([#1197](https://github.com/sveltejs/svelte/issues/1197))
+* Add `on` and `fire` to `Store`, deprecate `onchange` and `observe` ([#1344](https://github.com/sveltejs/svelte/pull/1344))
+* Require computed properties to have destructured argument in v2 mode ([#1069](https://github.com/sveltejs/svelte/issues/1069))
+
+## 1.62.0
+
+* Add a `code` field to errors and warnings ([#474](https://github.com/sveltejs/svelte/issues/474))
+* When using v2 syntax, do not use interpolation in non-root `<style>` tags ([#1339](https://github.com/sveltejs/svelte/issues/1339))
+
+## 1.61.0
+
+* Support v2 syntax with `parser: 'v2'` option ([#1318](https://github.com/sveltejs/svelte/issues/1318))
+
+## 1.60.3
+
+* Fix validation of `multiple` attributes on bound `<select>` elements ([#1331](https://github.com/sveltejs/svelte/issues/1331))
+
+## 1.60.2
+
+* Fix order of insertions for keyed each blocks with siblings ([#1306](https://github.com/sveltejs/svelte/issues/1306))
+* Bail out of CSS DCE if element has spread attribute ([#1300](https://github.com/sveltejs/svelte/issues/1300))
+* Allow `console` etc in component events ([#1278](https://github.com/sveltejs/svelte/issues/1278))
+* Deconflict against inherited contexts ([#1275](https://github.com/sveltejs/svelte/issues/1275))
+* Make CSS DCE case insensitive ([#1269](https://github.com/sveltejs/svelte/issues/1269))
+* Error on dynamic `multiple` attribute for bound select ([#1270](https://github.com/sveltejs/svelte/issues/1270))
+* Allow custom events on `<:Window>` ([#1268](https://github.com/sveltejs/svelte/issues/1268))
+
+## 1.60.1
+
+* Fix spread updates on dynamic components ([#1307](https://github.com/sveltejs/svelte/issues/1307))
+
+## 1.60.0
+
+* Spread properties ([#195](https://github.com/sveltejs/svelte/issues/195))
+* `svelte.compile` returns an object with `{ js, css, ast }` properties, where `js` and `css` are `{ code, map }` objects ([#1298](https://github.com/sveltejs/svelte/pull/1298))
+* Fixed broken compile errors when using Rollup ([#1296](https://github.com/sveltejs/svelte/pull/1296))
+
+## 1.59.0
+
+* Deprecate `teardown` in custom event handlers ([#531](https://github.com/sveltejs/svelte/issues/531))
+* Allow static content in keyed `each` block ([#1291](https://github.com/sveltejs/svelte/issues/1291))
+* Allow empty content in keyed `each` block ([#1295](https://github.com/sveltejs/svelte/issues/1295))
+* Only delete applicable transitions ([#1290](https://github.com/sveltejs/svelte/issues/1290))
+
+## 1.58.5
+
+* Allow backtick string literals for `svg`, `tag`, and `props` properties ([#1284](https://github.com/sveltejs/svelte/issues/1284))
+* Fix removal of transition styles under Firefox ([#1288](https://github.com/sveltejs/svelte/pull/1288))
+
+## 1.58.4
+
+* Fix initial state regression ([#1283](https://github.com/sveltejs/svelte/pull/1283))
+
+## 1.58.3
+
+* Actions run in the context of the component ([#1279](https://github.com/sveltejs/svelte/pull/1279))
+* Set refs when mounting dynamic components ([#1280](https://github.com/sveltejs/svelte/pull/1280))
+
+## 1.58.2
+
+* (1.58.1 failed to publish)
+
+## 1.58.1
+
+* Actions ([#1247](https://github.com/sveltejs/svelte/pull/1247))
+* Support `preserveComments` option in SSR mode ([#1265](https://github.com/sveltejs/svelte/issues/1265))
+* Fix performance regression ([#1274](https://github.com/sveltejs/svelte/pull/1274))
+
+## 1.58.0
+
+* Fast row swapping ([#588](https://github.com/sveltejs/svelte/issues/588))
+* Better error messages for invalid directives ([#1242](https://github.com/sveltejs/svelte/pull/1242))
+* Fix local context variable bugs ([#1240](https://github.com/sveltejs/svelte/pull/1243), [#1254](https://github.com/sveltejs/svelte/pull/1254))
+* Skip missing property warnings for computed/global properties in dev mode ([#1246](https://github.com/sveltejs/svelte/pull/1246))
+* Add end position to warnings ([#1250](https://github.com/sveltejs/svelte/pull/1250))
+
+## 1.57.4
+
+* Deconflict context names ([#1229](https://github.com/sveltejs/svelte/issues/1229))
+* Use `setAttribute` to set input types ([#1209](https://github.com/sveltejs/svelte/issues/1209))
+* Scale transition duration correctly ([#1221](https://github.com/sveltejs/svelte/issues/1221))
+
+## 1.57.3
+
+* Fix scoped CSS on static child elements ([#1223](https://github.com/sveltejs/svelte/issues/1223))
+
+## 1.57.2
+
+* Fix scoped CSS on SVG elements ([#1224](https://github.com/sveltejs/svelte/issues/1224))
+
+## 1.57.1
+
+* Add each_value to contextProps ([#1206](https://github.com/sveltejs/svelte/issues/1206))
+
+## 1.57.0
+
+* Use classes (not attributes) for style encapsulation, and base36-encode hashes ([#1118](https://github.com/sveltejs/svelte/issues/1118))
+
+## 1.56.4
+
+* Allow `component` and `state` to be context names ([#1213](https://github.com/sveltejs/svelte/issues/1213))
+* Don't remove `@supports` rules when `cascade: false` ([#1215](https://github.com/sveltejs/svelte/issues/1215))
+
+## 1.56.3
+
+* Top-level transitions work inside nested components ([#1188](https://github.com/sveltejs/svelte/issues/1188))
+* Always use internal `_mount` method ([#1201](https://github.com/sveltejs/svelte/issues/1201))
+
+## 1.56.2
+
+* Null out `key` for children of keyed each blocks ([#1202](https://github.com/sveltejs/svelte/issues/1202))
+
+## 1.56.1
+
+* Fix if-in-each bug ([#1195](https://github.com/sveltejs/svelte/issues/1195))
+* Cross-browser `scrollX`/`scrollY` support ([#1175](https://github.com/sveltejs/svelte/issues/1175))
+
+## 1.56.0
+
+* Internal refactor ([#1122](https://github.com/sveltejs/svelte/issues/1122))
+* Use correct context for component events ([#1184](https://github.com/sveltejs/svelte/issues/1184))
+* Allow observing `$foo` in dev mode ([#1181](https://github.com/sveltejs/svelte/issues/1181))
+* Handle dynamic data in default slot ([#1144](https://github.com/sveltejs/svelte/issues/1144))
+
+## 1.55.1
+
+* Fix cancellation of store `onchange` handlers ([#1177](https://github.com/sveltejs/svelte/issues/1177))
+* Write `["default"]` instead of `.default` in legacy mode ([#1166](https://github.com/sveltejs/svelte/issues/1166))
+* Upgrade Acorn ([#1182](https://github.com/sveltejs/svelte/pull/1182))
+* Don't warn about capitalisation if `options.name` begins with non-alphabetical character ([#1179](https://github.com/sveltejs/svelte/pull/1179))
+
+## 1.55.0
+
+* Add `immutable` compiler option for Svelte and runtime option for `Store` ([#1146](https://github.com/sveltejs/svelte/issues/1146))
+* Fix component store bindings ([#1100](https://github.com/sveltejs/svelte/issues/1100))
+* Fire `oncreate` when custom element is attached ([#1117](https://github.com/sveltejs/svelte/issues/1117))
+* Downgrade empty blocks to a warning ([#1156](https://github.com/sveltejs/svelte/pull/1156))
+* Error on unclosed comment ([#1156](https://github.com/sveltejs/svelte/pull/1156))
+
+## 1.54.2
+
+* Prevent `await` blocks using stale state ([#1131](https://github.com/sveltejs/svelte/issues/1131))
+* Prevent erroneous missing data warnings for custom elements ([#1065](https://github.com/sveltejs/svelte/issues/1065))
+* Remove empty selectors in prod mode ([#1138](https://github.com/sveltejs/svelte/issues/1138))
+* Escape attribute values in SSR mode ([#1155](https://github.com/sveltejs/svelte/pull/1155))
+* Remove `<noscript>` elements in DOM mode ([#1108](https://github.com/sveltejs/svelte/issues/1108))
+* Allow hydration of non-root `<script>`/`<style>` tags ([#1163](https://github.com/sveltejs/svelte/pull/1163))
+* Allow interpolation in non-root `<style>` tags ([#1163](https://github.com/sveltejs/svelte/pull/1163))
+
+## 1.54.1
+
+* Hoist destructured references ([#1139](https://github.com/sveltejs/svelte/issues/1139))
+* Add `bind:volume` for media elements ([#1143](https://github.com/sveltejs/svelte/issues/1143))
+
+## 1.54.0
+
+* Run `oncreate` hooks depth-first, top-to-bottom ([#1135](https://github.com/sveltejs/svelte/issues/1135))
+* Render boolean attributes correctly in SSR mode ([#1109](https://github.com/sveltejs/svelte/issues/1109))
+* Add `feed` aria role to expected roles when doing a11y checks ([#1124](https://github.com/sveltejs/svelte/pull/1124))
+* More complete fix for case sensitive attributes ([#1062](https://github.com/sveltejs/svelte/issues/1062))
+* Handle CLRF line endings in await block comments ([#1132](https://github.com/sveltejs/svelte/issues/1132))
+
+## 1.53.0
+
+* Base scoping selectors on `<style>` contents alone ([#1091](https://github.com/sveltejs/svelte/issues/1091))
+
+## 1.52.0
+
+* Deconflict referenced globals ([#1079](https://github.com/sveltejs/svelte/issues/1079))
+* Validate contents of `await` blocks ([#1061](https://github.com/sveltejs/svelte/issues/1061))
+* Fire `oncreate` for components in `await` blocks ([#1061](https://github.com/sveltejs/svelte/issues/1061))
+* Automatically fix attribute casing ([#1062](https://github.com/sveltejs/svelte/issues/1062))
+* Fix escaping in `<script>` and `<style>` ([#1082](https://github.com/sveltejs/svelte/issues/1082))
+* Error if invalid characters are used in computed properties, and allow any valid identifier in props ([#1083](https://github.com/sveltejs/svelte/issues/1083))
+* Don't run a11y tests on components ([#1110](https://github.com/sveltejs/svelte/issues/1110))
+* Respect `store` option in SSR mode ([#1107](https://github.com/sveltejs/svelte/issues/1107))
+
+## 1.51.1
+
+* Only escape <, > and & characters ([#1082](https://github.com/sveltejs/svelte/issues/1082))
+
+## 1.51.0
+
+* Lock `scroll` bindings ([#1071](https://github.com/sveltejs/svelte/issues/1071))
+* Escape HTML entities when compiling to static HTML ([#1066](https://github.com/sveltejs/svelte/issues/1066))
+* Apply a11y warnings to SVG `<a>` attributes with `xlink:href` ([#1008](https://github.com/sveltejs/svelte/issues/1008))
+
+## 1.50.1
+
+* Prevent main fragment being created twice in custom elements ([#1064](https://github.com/sveltejs/svelte/pull/1064))
+
+## 1.50.0
+
+* Detect unused/misplaced components ([#1039](https://github.com/sveltejs/svelte/issues/1039))
+* Warn on unused event definitions/transitions ([#1051](https://github.com/sveltejs/svelte/issues/1051))
+* Remove whitespace inside `<:Head>` ([#1026](https://github.com/sveltejs/svelte/issues/1026))
+* Optimise `<title>` ([#1027](https://github.com/sveltejs/svelte/issues/1027))
+* Add `bind: false` option to disable two-way binding ([#54](https://github.com/sveltejs/svelte/issues/54))
+
+## 1.49.3
+
+* Return `html` from SSR compiler `render().toString()` methods ([#1044](https://github.com/sveltejs/svelte/issues/1044))
+* Correctly reinitialise dynamic components ([#1040](https://github.com/sveltejs/svelte/issues/1040))
+* Allow `<option>` outside `<select>` ([#1022](https://github.com/sveltejs/svelte/issues/1022))
+* Fix data references in await-block event handlers ([#1032](https://github.com/sveltejs/svelte/issues/1032))
+
+## 1.49.2
+
+* Add `store.umd.js` ([#967](https://github.com/sveltejs/svelte/issues/967))
+* Warn on use of `this` inside computed properties ([#1033](https://github.com/sveltejs/svelte/pull/1033))
+
+## 1.49.1
+
+* Pass `store` to children in SSR mode ([#1029](https://github.com/sveltejs/svelte/pull/1029))
+
+## 1.49.0
+
+* Support `store` as a component property ([#1028](https://github.com/sveltejs/svelte/pull/1028))
+
+## 1.48.0
+
+* Added `<:Head>` component for injecting contents into document head ([#1013](https://github.com/sveltejs/svelte/issues/1013)))
+* SSR `render(...)` method now returns a `{ html, css: { code, map }, head }` object ([#1013](https://github.com/sveltejs/svelte/issues/1013))
+* SSR `renderCss(...)` method is deprecated ([#1013](https://github.com/sveltejs/svelte/issues/1013))
+* Add a `preload` function to components ([#1015](https://github.com/sveltejs/svelte/issues/1015))
+* Expose `this.root` on nested components ([#1023](https://github.com/sveltejs/svelte/pull/1023))
+
+## 1.47.2
+
+* Deconflict computed properties against arguments to `_recompute` ([#1012](https://github.com/sveltejs/svelte/issues/1012))
+* Allow `await` blocks in slots ([#1018](https://github.com/sveltejs/svelte/issues/1018))
+* Allow components without slots to have whitespace as only child ([#1007](https://github.com/sveltejs/svelte/issues/1007))
+* Correctly set `toString` on `CompileError` ([#1016](https://github.com/sveltejs/svelte/pull/1016))
+
+## 1.47.1
+
+* Sanitize filenames in SSR mode ([#1005](https://github.com/sveltejs/svelte/issues/1005))
+
+## 1.47.0
+
+* Support dynamic `import(...)` inside `<script>` tags ([#1003](https://github.com/sveltejs/svelte/issues/1003))
+
+## 1.46.1
+
+* `await...then` shorthand ([#957](https://github.com/sveltejs/svelte/issues/957))
+* Allow dynamic components inside elements ([#993](https://github.com/sveltejs/svelte/issues/993))
+* Don't use `dataset` on SVG nodes ([#982](https://github.com/sveltejs/svelte/issues/982))
+* Fix erroneous `<figcaption>` a11y warning ([#991](https://github.com/sveltejs/svelte/issues/991))
+* Handle empty classes when pruning unused selectors ([#978](https://github.com/sveltejs/svelte/issues/978))
+* Better trimming of SSR'd output ([#976](https://github.com/sveltejs/svelte/issues/976))
+* Don't add `event` to `expectedProperties` ([#972](https://github.com/sveltejs/svelte/issues/972))
+* Emit error on bad `set` arguments in dev mode ([#990](https://github.com/sveltejs/svelte/issues/990))
+
+## 1.46.0
+
+* Pass `filename` through to preprocessors ([#983](https://github.com/sveltejs/svelte/issues/983))
+
+## 1.45.0
+
+* Dynamic components ([#971](https://github.com/sveltejs/svelte/pull/971))
+
+## 1.44.2
+
+* Fix `await` blocks with siblings ([#974](https://github.com/sveltejs/svelte/issues/974))
+* Fix `await` blocks inside `if` blocks ([#975](https://github.com/sveltejs/svelte/issues/975))
+
+## 1.44.1
+
+* Fix bidirectional transitions that reference state ([#962](https://github.com/sveltejs/svelte/issues/962))
+
+## 1.44.0
+
+* Add `svelte.preprocess` ([#181](https://github.com/sveltejs/svelte/issues/181), [#876](https://github.com/sveltejs/svelte/issues/876))
+* Add `{{#await ...}}` blocks ([#654](https://github.com/sveltejs/svelte/issues/654))
+
+## 1.43.1
+
+* Fix parameterised transitions ([#962](https://github.com/sveltejs/svelte/issues/962))
+* Prevent boolean attributes breaking estree-walker expectations ([#961](https://github.com/sveltejs/svelte/issues/961))
+* Throw error on cyclical store computations ([#964](https://github.com/sveltejs/svelte/pull/964))
+
+## 1.43.0
+
+* Export `Store` class to manage global state ([#930](https://github.com/sveltejs/svelte/issues/930))
+* Recognise `aria-current` ([#953](https://github.com/sveltejs/svelte/pull/953))
+* Support SSR register options including `extensions` ([#939](https://github.com/sveltejs/svelte/issues/939))
+* Friendlier error for illegal contexts ([#934](https://github.com/sveltejs/svelte/issues/934))
+* Remove whitespace around `<:Window>` components ([#943](https://github.com/sveltejs/svelte/issues/943))
+
+## 1.42.1
+
+* Correctly append items inside a slotted `each` block ([#932](https://github.com/sveltejs/svelte/pull/932))
+* Fix `<:Window bind:online/>` ([#936](https://github.com/sveltejs/svelte/issues/936))
+* Attach globals to state upon initialisation ([#908](https://github.com/sveltejs/svelte/issues/908))
+
+## 1.42.0
+
+* Implement `indeterminate` binding for checkbox inputs ([#910](https://github.com/sveltejs/svelte/issues/910))
+* Use `<option>` children as `value` attribute if none exists ([#928](https://github.com/sveltejs/svelte/issues/928))
+* Allow quoted property names in default export and sub-properties ([#914](https://github.com/sveltejs/svelte/issues/914))
+* Various improvements to generated code for bindings
+
+## 1.41.4
+
+* Handle self-destructive bindings ([#917](https://github.com/sveltejs/svelte/issues/917))
+* Prevent `innerHTML` with `<option>` elements ([#915](https://github.com/sveltejs/svelte/issues/915))
+* Use `dataset` unless `legacy` is true ([#858](https://github.com/sveltejs/svelte/issues/858))
+* Add `prepare` script to facilitate installing from git ([#923](https://github.com/sveltejs/svelte/pull/923))
+
+## 1.41.3
+
+* Prevent argument name clashes ([#911](https://github.com/sveltejs/svelte/issues/911))
+* Fix UMD factory arguments ([#918](https://github.com/sveltejs/svelte/pull/918))
+* Don't attempt to set computed values ([#893](https://github.com/sveltejs/svelte/issues/893))
+* Fix TypeScript build error ([#919](https://github.com/sveltejs/svelte/issues/919))
+
+## 1.41.2
+
+* Handle attribute selectors with no value ([#905](https://github.com/sveltejs/svelte/issues/905))
+* Retain `async` keyword when extracting functions ([#904](https://github.com/sveltejs/svelte/issues/904))
+* Shallow clone `data` on initialisation ([#891](https://github.com/sveltejs/svelte/pull/891))
+
+## 1.41.1
+
+* Fix updates of destructured each blocks ([#897](https://github.com/sveltejs/svelte/pull/897))
+* Don't warn on `options.*` event handler callee ([#900](https://github.com/sveltejs/svelte/pull/900))
+
+## 1.41.0
+
+* `onwarn` and `onerror` receive default handlers as second arguments ([#883](https://github.com/sveltejs/svelte/pull/883))
+* Recognise `muted` as boolean property on `<audio>` elements ([#886](https://github.com/sveltejs/svelte/pull/886))
+* Array destructuring for `each` block contexts ([#889](https://github.com/sveltejs/svelte/pull/889))
+
+## 1.40.2
+
+* Ignore `@apply` and similar in CSS ([#871](https://github.com/sveltejs/svelte/issues/871))
+* Properly escape CSS in custom elements ([#872](https://github.com/sveltejs/svelte/issues/872))
+
+## 1.40.1
+
+* Always use explicit closing tags with `innerHTML` ([#866](https://github.com/sveltejs/svelte/issues/866))
+* Escape text in `textContent` and `innerHTML` expressions ([#868](https://github.com/sveltejs/svelte/issues/868))
+
+## 1.40.0
+
+* Short fragment method names ([#863](https://github.com/sveltejs/svelte/pull/863))
+* Extract declarations out of default export ([#756](https://github.com/sveltejs/svelte/issues/756))
+
+## 1.39.4
+
+* Extract shared init logic ([#855](https://github.com/sveltejs/svelte/pull/855))
+* Allow `console.*` calls in event handlers ([#782](https://github.com/sveltejs/svelte/issues/782))
+* Marker comments in output ([#823](https://github.com/sveltejs/svelte/issues/823))
+* Use `textContent` and `innerHTML` where appropriate ([#23](https://github.com/sveltejs/svelte/issues/23))
+* Various improvements to generated code
+
+## 1.39.3
+
+* Allow `slot='...'` inside custom elements ([#827](https://github.com/sveltejs/svelte/issues/827))
+* Disallow `slot='...'` inside if/each blocks ([#849](https://github.com/sveltejs/svelte/issues/849))
+* Use correct parent node for slotted if blocks ([#850](https://github.com/sveltejs/svelte/issues/850))
+
+## 1.39.2
+
+* Escape CSS in shadow DOM ([#840](https://github.com/sveltejs/svelte/issues/840))
+* Fix missing anchor bug inside SVG elements ([#843](https://github.com/sveltejs/svelte/issues/843))
+
+## 1.39.1
+
+* Always use anchors for slotted content ([#822](https://github.com/sveltejs/svelte/issues/822))
+* Prevent ES6 in helpers ([#838](https://github.com/sveltejs/svelte/issues/838))
+* Correctly determine whether to use `timeRangesToArray` ([#837](https://github.com/sveltejs/svelte/pull/837))
+
+## 1.39.0
+
+* Always attach fragment to shadow root ([#821](https://github.com/sveltejs/svelte/issues/821))
+* Add `buffered`, `seekable`, `played` bindings to media elements ([#819](https://github.com/sveltejs/svelte/pull/819))
+* Quote `class` properties in legacy mode ([#830](https://github.com/sveltejs/svelte/issues/830))
+* Warn on missing `lang` attribute on `<html>` ([#828](https://github.com/sveltejs/svelte/pull/828))
+
+## 1.38.0
+
+* Compile-time a11y warnings ([#815](https://github.com/sveltejs/svelte/pull/815))
+* Remove redundant input blowback guards ([#645](https://github.com/sveltejs/svelte/issues/645))
+* Use component name in debugging messages ([#781](https://github.com/sveltejs/svelte/issues/781))
+
+## 1.37.0
+
+* Experimental support for compiling to custom elements ([#797](https://github.com/sveltejs/svelte/issues/797))
+
+## 1.36.0
+
+* Optimize `style` attributes where possible ([#455](https://github.com/sveltejs/svelte/issues/455))
+
+## 1.35.0
+
+* `set` and `get` continue to work until `destroy` is complete ([#788](https://github.com/sveltejs/svelte/issues/788))
+* Observers of unchanged bound values don't fire incorrectly ([#804](https://github.com/sveltejs/svelte/issues/804))
+* Nested components with slotted content render correctly in SSR mode ([#801](https://github.com/sveltejs/svelte/issues/801))
+* More efficient rendering of raw and slotted content ([#637](https://github.com/sveltejs/svelte/issues/637))
+* Handle unquoted attributes in attribute selectors ([#798](https://github.com/sveltejs/svelte/issues/798))
+
+## 1.34.0
+
+* Support nested `<slot>` elements ([#790](https://github.com/sveltejs/svelte/issues/790))
+* Attach `options` to instance ([#550](https://github.com/sveltejs/svelte/issues/550), [#777](https://github.com/sveltejs/svelte/issues/777))
+* Error if transitions are applied to component ([#791](https://github.com/sveltejs/svelte/issues/791))
+* Handle CSS variables in `<style>` tag ([#757](https://github.com/sveltejs/svelte/issues/757))
+
+## 1.33.0
+
+* Replace `{{yield}}` with `<slot>` — adds fallback content named slots, and `options.slots` ([#763](https://github.com/sveltejs/svelte/issues/763))
+
+## 1.32.0
+
+* Allow `anchor` initialisation option, alongside `target` ([#784](https://github.com/sveltejs/svelte/issues/784))
+* Remove leading CSS selectors safely ([#783](https://github.com/sveltejs/svelte/issues/783))
+
+## 1.31.0
+
+* Add `legacy` compile option, which adds IE9 compatibility ([#773](https://github.com/sveltejs/svelte/issues/773))
+
+## 1.30.0
+
+* Update all component bindings simultaneously ([#760](https://github.com/sveltejs/svelte/issues/760))
+* Fix `@keyframes` atrules with `from` and `to` selectors ([#774](https://github.com/sveltejs/svelte/issues/774))
+
+## 1.29.3
+
+* Only recompute tag and attribute values if they could have changed ([#768](https://github.com/sveltejs/svelte/issues/768))
+* Fix CSS scoping with multiple levels of descendant selectors ([#767](https://github.com/sveltejs/svelte/issues/767))
+
+## 1.29.2
+
+* Preserve space before non-parenthesized media query expression ([#759](https://github.com/sveltejs/svelte/issues/759))
+* Call `create()` on new iterations of static each blocks ([#762](https://github.com/sveltejs/svelte/issues/762))
+* Use `change` events as well as `input` events to bind range inputs ([#740](https://github.com/sveltejs/svelte/issues/740))
+
+## 1.29.1
+
+* Replace `set` and `destroy` with `noop` when component is destroyed ([#744](https://github.com/sveltejs/svelte/issues/744))
+
+## 1.29.0
+
+* Add static `setup` method ([#578](https://github.com/sveltejs/svelte/issues/578))
+* Hoist if block selectors ([#751](https://github.com/sveltejs/svelte/pull/751))
+* More sigil escaping fixes ([#750](https://github.com/sveltejs/svelte/pull/750))
+
+## 1.28.1
+
+* Fix unescaping of special words in SSR mode ([#741](https://github.com/sveltejs/svelte/issues/741))
+
+## 1.28.0
+
+* Support `ref:foo` as a CSS selector ([#693](https://github.com/sveltejs/svelte/issues/693))
+* Prevent magic-string bugs by only minifying CSS combinators if `cascade: false` ([#743](https://github.com/sveltejs/svelte/issues/743))
+* Don't throw an error if component is destroyed twice ([#643](https://github.com/sveltejs/svelte/issues/643))
+
+## 1.27.0
+
+* Minify CSS and remove unused styles ([#697](https://github.com/sveltejs/svelte/issues/697))
+* Optimize ternary expressions when excluding unused CSS ([#696](https://github.com/sveltejs/svelte/issues/696))
+* Clear refs after `ondestroy` callbacks fire ([#706](https://github.com/sveltejs/svelte/issues/706))
+* Prevent certain forms of component binding blowback ([#721](https://github.com/sveltejs/svelte/issues/721))
+* Use helper to encapsulate styles ([#375](https://github.com/sveltejs/svelte/issues/375))
+* Event propagation shorthand — `on:foo` equals `on:foo='fire("foo", event)` ([#638](https://github.com/sveltejs/svelte/issues/638))
+* Allow `refs.*` in event handlers, and validate them ([#686](https://github.com/sveltejs/svelte/issues/686))
+
+## 1.26.2
+
+* Unescape `#` characters ([#722](https://github.com/sveltejs/svelte/issues/722))
+
+## 1.26.1
+
+* Fix select binding regression  ([#724](https://github.com/sveltejs/svelte/issues/724))
+
+## 1.26.0
+
+* Enforce correct order of operations when initialising ([#708](https://github.com/sveltejs/svelte/issues/708) and [#714](https://github.com/sveltejs/svelte/issues/714))
+* Ensure data is up-to-date when re-rendering yield block ([#711](https://github.com/sveltejs/svelte/issues/711))
+* Fix unescaping of strings, preserve at-rules in CSS ([#712](https://github.com/sveltejs/svelte/issues/712))
+* Preserve whitespace at end of each blocks ([#713](https://github.com/sveltejs/svelte/issues/713))
+
+## 1.25.1
+
+* Better CSS sourcemaps ([#716](https://github.com/sveltejs/svelte/pull/716))
+
+## 1.25.0
+
+* Fix hoisted event handlers ([#699](https://github.com/sveltejs/svelte/issues/699))
+* Fire `intro.start` and `outro.start` events ([#702](https://github.com/sveltejs/svelte/issues/702))
+* Preserve order of components in keyed each blocks ([#700](https://github.com/sveltejs/svelte/issues/700))
+* Add `cssMap` property to compiler output ([#698](https://github.com/sveltejs/svelte/pull/698/))
+
+## 1.24.0
+
+* Deconflict names with imports in SSR compiler ([#655](https://github.com/sveltejs/svelte/issues/655))
+* Improved transition performance ([#670](https://github.com/sveltejs/svelte/pull/670))
+* Run transitions on initial render ([#651](https://github.com/sveltejs/svelte/issues/651))
+* Add dev mode warning if `hydrate` is true but `hydratable` was false ([#664](https://github.com/sveltejs/svelte/issues/664))
+* Manipulate sourcemap to make missing loop values obvious ([#683](https://github.com/sveltejs/svelte/pull/683))
+* Only add CSS scoping attributes where necessary ([#679](https://github.com/sveltejs/svelte/issues/679))
+* Warn on unused CSS selectors ([#678](https://github.com/sveltejs/svelte/issues/678))
+* Fix `<select>` binding in loop ([#685](https://github.com/sveltejs/svelte/issues/685))
+* Prevent bindings from calling `oncreate` functions prematurely ([#694](https://github.com/sveltejs/svelte/pull/694))
+* Simpler codegen ([#673](https://github.com/sveltejs/svelte/pull/673))
+
+## 1.23.4
+
+* Don't recreate if blocks incorrectly ([#669](https://github.com/sveltejs/svelte/pull/669))
+
+## 1.23.3
+
+* Pass parameters to `get_block` ([#667](https://github.com/sveltejs/svelte/issues/667))
+
+## 1.23.2
+
+* Fix if blocks being recreated on update ([#665](https://github.com/sveltejs/svelte/issues/665))
+
+## 1.23.1
+
+* Fix each-else blocks that are empty on initial render ([#662](https://github.com/sveltejs/svelte/issues/662))
+
+## 1.23.0
+
+* Hydration ([#649](https://github.com/sveltejs/svelte/pull/649))
+* Correctly transform CSS selectors with pseudo-elements ([#658](https://github.com/sveltejs/svelte/issues/658))
+
+## 1.22.5
+
+* Fix nested component unmounting bug ([#643](https://github.com/sveltejs/svelte/issues/643))
+
+## 1.22.4
+
+* Include `ast` in `svelte.compile` return value ([#632](https://github.com/sveltejs/svelte/issues/632))
+* Set initial value of `<select>` binding, if unspecified ([#639](https://github.com/sveltejs/svelte/issues/639))
+* Mark indirect dependencies of `<select>` bindings (i.e. the dependencies of their `<option>` values) ([#639](https://github.com/sveltejs/svelte/issues/639))
+
+## 1.22.3
+
+* Fix nested component unmounting bug ([#625](https://github.com/sveltejs/svelte/issues/625))
+* Allow components to have computed member expression bindings ([#624](https://github.com/sveltejs/svelte/issues/624))
+* Handle empty `<style>` tags ([#634](https://github.com/sveltejs/svelte/issues/634))
+* Warn on missing component ([#623](https://github.com/sveltejs/svelte/issues/623))
+* Allow dynamic `type` attribute for unbound inputs ([#620](https://github.com/sveltejs/svelte/issues/620))
+* Rename `addEventListener` and `removeEventListener` directives ([#621](https://github.com/sveltejs/svelte/issues/621))
+
+## 1.22.2
+
+* Escape template strings correctly in SSR output ([#616](https://github.com/sveltejs/svelte/issues/616))
+* Prevent magic-string deprecation warning ([#617](https://github.com/sveltejs/svelte/pull/617))
+
+## 1.22.1
+
+* Sanitise event handler names ([#612](https://github.com/sveltejs/svelte/issues/612))
+
+## 1.22.0
+
+* Symmetry between `mount` and `unmount`. This is potentially a breaking change if your components import other components that were precompiled with an earlier version of Svelte ([#592](https://github.com/sveltejs/svelte/issues/592))
+* Add `cascade` option, which prevents styles affecting child components if `false`, unless selectors are wrapped in `:global(...)` and keyframe declaration IDs are prefixed with `-global-`. This will become the default behaviour in v2 ([#583](https://github.com/sveltejs/svelte/issues/583))
+* Support binding to computed member expressions ([#602](https://github.com/sveltejs/svelte/issues/602))
+* Coerce empty string in `number`/`range` inputs to `undefined`, not `0` ([#584](https://github.com/sveltejs/svelte/issues/584))
+* Fix insert location of DOM elements in each/if/nested component edge cases ([#610](https://github.com/sveltejs/svelte/issues/610))
+
+## 1.21.0
+
+* Always use `helpers` if referenced, not just for call expressions ([#575](https://github.com/sveltejs/svelte/issues/575))
+* Fix parsing of `<textarea>` children ([#599](https://github.com/sveltejs/svelte/pull/599))
+* Treat `<textarea>` value attributes and children as equivalent, and fail validation if both are present ([#599](https://github.com/sveltejs/svelte/pull/599))
+* Fix `<textarea>` SSR ([#599](https://github.com/sveltejs/svelte/pull/599))
+* Apply CSS transition styles immediately if transition has delay ([#574](https://github.com/sveltejs/svelte/issues/574))
+* Ensure `transitionManager` is treeshakeable ([#593](https://github.com/sveltejs/svelte/issues/593))
+* Fix for environments where `node.style.animation` is undefined ([#587](https://github.com/sveltejs/svelte/issues/587))
+* Fix order of operations when dealing with `<select>` elements ([#590](https://github.com/sveltejs/svelte/issues/590))
+* Downgrade 'invalid callee' to a warning ([#579](https://github.com/sveltejs/svelte/issues/579))
+* Convert to TypeScript ([#573](https://github.com/sveltejs/svelte/pull/573))
+
+## 1.20.2
+
+* Fix destruction of compound if-blocks with outros ([#572](https://github.com/sveltejs/svelte/pull/572))
+
+## 1.20.1
+
+* Fix insertion order of `if` blocks and their anchors ([#569](https://github.com/sveltejs/svelte/issues/569))
+
+## 1.20.0
+
+* Faster, better updates of keyed each blocks ([#373](https://github.com/sveltejs/svelte/issues/373), [#543](https://github.com/sveltejs/svelte/issues/543))
+* Use element IDs to robustly track dynamically injected `<style>` tags ([#554](https://github.com/sveltejs/svelte/issues/554))
+* Abort outros before corresponding intros ([#546](https://github.com/sveltejs/svelte/issues/546))
+* Generate less code for `if` blocks with `else` blocks ([#540](https://github.com/sveltejs/svelte/issues/540))
+* Ensure `{{yield}}` block content is injected into the right place ([#561](https://github.com/sveltejs/svelte/issues/561))
+* Simpler, more readable codegen code ([#559](https://github.com/sveltejs/svelte/pull/559))
+* Validate transition directives ([#564](https://github.com/sveltejs/svelte/issues/564))
+* Apply delays to bidirectional transitions ([#562](https://github.com/sveltejs/svelte/issues/562))
+* Handle all valid HTML entities ([#565](https://github.com/sveltejs/svelte/pull/565))
+* Fix outros on compound `if` blocks ([#565](https://github.com/sveltejs/svelte/pull/565))
+* Validation for `<:Window>` tags ([#565](https://github.com/sveltejs/svelte/pull/565))
+* Increased test coverage ([#565](https://github.com/sveltejs/svelte/pull/565))
+
+## 1.19.1
+
+* Export `generateKeyframes`, so that CSS transitions work
+
+## 1.19.0
+
+* Experimental support for transitions ([#7](https://github.com/sveltejs/svelte/issues/7))
+* Use `querySelector(':checked')` instead of `selectedOptions` ([#539](https://github.com/sveltejs/svelte/issues/539))
+* Stringify helpers before bundling them, to avoid renaming errors ([#538](https://github.com/sveltejs/svelte/issues/538))
+
+## 1.18.2
+
+* Parenthesize if-block conditions ([#532](https://github.com/sveltejs/svelte/issues/532))
+* Fix parsing of parenthesized expressions ([#534](https://github.com/sveltejs/svelte/issues/534))
+* Fix error on `bind:checked` that doesn't belong to a checkbox input ([#529](https://github.com/sveltejs/svelte/pull/529))
+
+## 1.18.1
+
+* Allow `destroy()` in event handlers ([#523](https://github.com/sveltejs/svelte/issues/523))
+* Fix bug with `{{yield}}` blocks following elements ([#524](https://github.com/sveltejs/svelte/issues/524))
+
+## 1.18.0
+
+* Visit `<select>` attributes after children, to ensure options are in the right state ([#521](https://github.com/sveltejs/svelte/pull/521))
+* Use sibling elements as anchors rather than creating comment nodes wherever possible ([#3](https://github.com/sveltejs/svelte/issues/3))
+
+## 1.17.2
+
+* Replace bad characters when creating variable names based on element names ([#516](https://github.com/sveltejs/svelte/issues/516))
+
+## 1.17.1
+
+* Fixes for static each-else and yield blocks ([#509](https://github.com/sveltejs/svelte/issues/509)), ([#514](https://github.com/sveltejs/svelte/issues/514))
+* Code generation tweaks ([#504](https://github.com/sveltejs/svelte/issues/504)), ([#507](https://github.com/sveltejs/svelte/issues/507))
+
+## 1.17.0
+
+* Add `currentTime`, `duration` and `paused` bindings for media elements ([#406](https://github.com/sveltejs/svelte/issues/406))
+* Don't treat helpers as dependencies ([#492](https://github.com/sveltejs/svelte/issues/492))
+* Allow `<:Window>` event handlers to access component state ([#497](https://github.com/sveltejs/svelte/pull/497))
+* Allow two-way binding to properties named 'component' ([#495](https://github.com/sveltejs/svelte/issues/495))
+* Group checkbox bindings correctly, to avoid erroneously unchecking siblings ([#498](https://github.com/sveltejs/svelte/issues/498))
+* Validate two-way bindings ([#494](https://github.com/sveltejs/svelte/pull/494))
+* Allow dynamic each-block to have static else-block ([#501](https://github.com/sveltejs/svelte/pull/501))
+* Initialise `<select>` value correctly ([#502](https://github.com/sveltejs/svelte/pull/502))
+
+## 1.16.0
+
+* Better code generation ([#489](https://github.com/sveltejs/svelte/pull/489)), ([#490](https://github.com/sveltejs/svelte/pull/490)), ([#491](https://github.com/sveltejs/svelte/pull/491))
+* Prevent binding blowback on initial render ([#488](https://github.com/sveltejs/svelte/pull/488))
+
+## 1.15.1
+
+* Clone data before merging it with state ([#479](https://github.com/sveltejs/svelte/issues/479))
+* Apply binding event handlers before user event handlers ([#486](https://github.com/sveltejs/svelte/issues/486))
+
+## 1.15.0
+
+* Dev mode — downgrade 'missing data' to a warning, and ignore whitelisted globals ([#475](https://github.com/sveltejs/svelte/issues/475))
+* Fix `<select>` value binding when options are updated late ([#476](https://github.com/sveltejs/svelte/issues/476))
+* Throw at compile time if event handler references invalid callee ([#473](https://github.com/sveltejs/svelte/pull/473))
+* Check for helper function purity ([#473](https://github.com/sveltejs/svelte/pull/473))
+* Validate `namespace` option ([#473](https://github.com/sveltejs/svelte/pull/473))
+
+## 1.14.1
+
+* Replace bad characters when creating variable names based on attributes ([#470](https://github.com/sveltejs/svelte/issues/470))
+
+## 1.14.0
+
+* Better guard against naming conflicts ([#465](https://github.com/sveltejs/svelte/issues/465))
+* Better error if getters and setters are used with `methods` ([#425](https://github.com/sveltejs/svelte/issues/425))
+* Don't create whitespace nodes inside elements that can't use them ([#189](https://github.com/sveltejs/svelte/issues/189))
+* Collapse consecutive `if` statements with the same condition ([#450](https://github.com/sveltejs/svelte/issues/450))
+* Window `scroll` bindings are bidirectional ([#404](https://github.com/sveltejs/svelte/issues/404))
+* Add `bind:online` to window ([#404](https://github.com/sveltejs/svelte/issues/404))
+* In dev mode, throw if read-only properties are set ([#404](https://github.com/sveltejs/svelte/issues/404))
+* Prevent conflicts with component name ([#464](https://github.com/sveltejs/svelte/pull/464))
+* Ensure event handler names are deconflicted ([#466](https://github.com/sveltejs/svelte/issues/466))
+
+## 1.13.7
+
+* Fix observers — `defer: true` now triggers callback after DOM is updated ([#441](https://github.com/sveltejs/svelte/issues/441))
+* Handle empty `computed` property ([#452](https://github.com/sveltejs/svelte/issues/452))
+* Correctly bind one-way `<select>` value attributes with objects ([#423](https://github.com/sveltejs/svelte/issues/423))
+* Hoist event handlers inside each blocks, where possible ([#456](https://github.com/sveltejs/svelte/pull/456))
+* Don't bind event handler callbacks ([#433](https://github.com/sveltejs/svelte/issues/433))
+* Internal refactoring and neater code generation ([#453](https://github.com/sveltejs/svelte/pull/453))
+
+## 1.13.6
+
+* Use `assign` helper instead of `Object.assign` for better performance and legacy compatibility ([#431](https://github.com/sveltejs/svelte/issues/431))
+* Improved code generation ([#419](https://github.com/sveltejs/svelte/issues/419)), ([#440](https://github.com/sveltejs/svelte/issues/440)), ([#442](https://github.com/sveltejs/svelte/issues/442))
+
+## 1.13.5
+
+* Read `range` and `number` input values as numbers ([#436](https://github.com/sveltejs/svelte/issues/436))
+* Better error for `bind:value='{{foo}}'` ([#437](https://github.com/sveltejs/svelte/issues/437))
+
+## 1.13.4
+
+* Prevent unclosed `<script>` tag causing infinite loop ([#435](https://github.com/sveltejs/svelte/pull/435))
+
+## 1.13.3
+
+* Correctly handle `{{true}}`, `{{false}}` and `{{null}}` ([#424](https://github.com/sveltejs/svelte/issues/424))
+* Update `<select>` value attributes correctly ([#423](https://github.com/sveltejs/svelte/issues/423))
+* Bind custom event handler callbacks ([#428](https://github.com/sveltejs/svelte/issues/428))
+* Disallow `import root` ([#430](https://github.com/sveltejs/svelte/pull/430))
+* Prevent component bindings mutating the wrong object ([#432](https://github.com/sveltejs/svelte/pull/432))
+
+## 1.13.2
+
+* Fix deep component bindings ([#420](https://github.com/sveltejs/svelte/issues/420))
+* Include `css` property in compiler output ([#409](https://github.com/sveltejs/svelte/issues/409))
+* Treat functions as mutable objects when recomputing ([#413](https://github.com/sveltejs/svelte/issues/413)
+* Include magic-string in bundle ([#410](https://github.com/sveltejs/svelte/issues/410))
+* Disable unneeded Bublé transformations for slimmer output ([#411](https://github.com/sveltejs/svelte/pull/411))
+
+## 1.13.1
+
+* Prevent infinite loops with pathological component bindings ([#398](https://github.com/sveltejs/svelte/issues/398))
+* More robust deconflicting ([#401](https://github.com/sveltejs/svelte/pull/401))
+
+## 1.13.0
+
+* Add `<:Window>` meta tag with event listeners, and a handful of bindings ([#371](https://github.com/sveltejs/svelte/issues/371))
+* Don't uncheck radios incorrectly ([#399](https://github.com/sveltejs/svelte/issues/399))
+
+## 1.12.1
+
+* Deconflict non-helper functions (`addCss` etc) ([#388](https://github.com/sveltejs/svelte/issues/388))
+* Allow reserved words in tags, e.g. `{{class}}` ([#383](https://github.com/sveltejs/svelte/issues/383))
+
+## 1.12.0
+
+* Shorthand attributes — `<Widget :foo/>` is equivalent to `<Widget foo='{{foo}}'/>` ([#384](https://github.com/sveltejs/svelte/pull/384))
+* Support `bind:group` for radio and checkbox inputs ([#311](https://github.com/sveltejs/svelte/issues/311), [#312](https://github.com/sveltejs/svelte/issues/312))
+* Better sourcemap support for two-way bindings
+
+## 1.11.4
+
+* Dev mode warning for bad `component.observe` arguments ([#369](https://github.com/sveltejs/svelte/issues/369))
+* Translate `component.on('teardown', ...)` to `component.on('destroy', ...)` and add dev warning ([#365](https://github.com/sveltejs/svelte/issues/365))
+* Use shared prototype to save bytes ([#378](https://github.com/sveltejs/svelte/pull/378))
+
+## 1.11.3
+
+* Undo CSS behaviour change in 1.11.2 ([#372](https://github.com/sveltejs/svelte/issues/372))
+* Pin version of css-tree ([#370](https://github.com/sveltejs/svelte/pull/370))
+
+## 1.11.2
+
+* Add component CSS to each document a component is rendered to ([#331](https://github.com/sveltejs/svelte/issues/331))
+
+## 1.11.1
+
+* Fix two-way binding for components inside `each` blocks ([#356](https://github.com/sveltejs/svelte/issues/356))
+
+## 1.11.0
+
+* Add `format: 'eval'` and `svelte.create`, to create components directly from source code ([#345](https://github.com/sveltejs/svelte/issues/345))
+* Node 4 compatibility ([#109](https://github.com/sveltejs/svelte/issues/109))
+
+## 1.10.3
+
+* Prevent `'</script>'` string occurence breaking pages ([#349](https://github.com/sveltejs/svelte/pull/349))
+* Allow reference to whitelisted globals without properties ([#333](https://github.com/sveltejs/svelte/pull/333))
+* Don't remove `&nbsp;` incorrectly ([#348](https://github.com/sveltejs/svelte/issues/348))
+* `let` -> `var` in `addCss` block ([#351](https://github.com/sveltejs/svelte/pull/351))
+
+## 1.10.2
+
+* Accept any case for doctype declarations ([#336](https://github.com/sveltejs/svelte/issues/336))
+* Allow non-top-level `<script>` and `<style>` tags to pass through without processing ([#335](https://github.com/sveltejs/svelte/issues/335))
+
+## 1.10.1
+
+* typecheck argument in _set when in dev mode ([#342](https://github.com/sveltejs/svelte/issues/342))
+* Prevent duplicate helpers in non-shared mode ([#337](https://github.com/sveltejs/svelte/issues/337))
+
+## 1.10.0
+
+* Component self-references with `<:Self/>` ([#51](https://github.com/sveltejs/svelte/issues/51))
+* Two-way binding with `<select multiple>` ([#313](https://github.com/sveltejs/svelte/issues/313))
+
+## 1.9.1
+
+* Better error for malformed event handlers ([#220](https://github.com/sveltejs/svelte/issues/220))
+* Allow function expressions in tags ([#269](https://github.com/sveltejs/svelte/issues/269))
+
+## 1.9.0
+
+* Add development warnings ([#13](https://github.com/sveltejs/svelte/issues/13)), ([#320](https://github.com/sveltejs/svelte/pull/320)), ([#177](https://github.com/sveltejs/svelte/issues/177)), ([#249](https://github.com/sveltejs/svelte/issues/249))
+* Better error if parser encounters an unmatched closing tag ([#321](https://github.com/sveltejs/svelte/issues/321))
+
+## 1.8.1
+
+* Allow implicitly closed elements ([#318](https://github.com/sveltejs/svelte/pull/318))
+* More informative error messages for unclosed elements/blocks ([#258](https://github.com/sveltejs/svelte/issues/258))
+* Deprecate `onrender` and `onteardown` in favour of `oncreate` and `ondestroy` ([#40](https://github.com/sveltejs/svelte/issues/40))
+
+## 1.8.0
+
+* Prevent duplicate imports ([#308](https://github.com/sveltejs/svelte/issues/308))
+* Use `input` events (not `change`) for all input elements other than `checkbox` and `radio`, and textareas ([#309](https://github.com/sveltejs/svelte/pull/309))
+* Encapsulate keyframe declarations ([#245](https://github.com/sveltejs/svelte/issues/245))
+
+## 1.7.1
+
+* Deconflict imports and shared helpers ([#222](https://github.com/sveltejs/svelte/issues/222))
+* Deconflict each-block contexts and reserved words ([#222](https://github.com/sveltejs/svelte/issues/222))
+* Allow shorthand properties in expressions ([#296](https://github.com/sveltejs/svelte/issues/296))
+
+## 1.7.0
+
+* Include CSS AST in `svelte.parse` output ([#302](https://github.com/sveltejs/svelte/pull/302))
+* Better handling of CSS parse errors ([#302](https://github.com/sveltejs/svelte/pull/302))
+* Initialise `<select>` elements with two-way binding correctly ([#301](https://github.com/sveltejs/svelte/issues/301))
+* Allow local context in component event handlers inside `each` blocks ([#290](https://github.com/sveltejs/svelte/issues/290))
+* Fix two-way binding for components inside `each` blocks ([#290](https://github.com/sveltejs/svelte/issues/290))
+
+## 1.6.11
+
+* Initialise dynamic `<option>` value correctly ([#291](https://github.com/sveltejs/svelte/issues/291))
+
+## 1.6.10
+
+* Ensure `sources` and `sourcesContent` are populated in sourcemaps, even if none of the original code is used ([#295](https://github.com/sveltejs/svelte/pull/295))
+* Add `outputFilename` option to populate `file` and `sources` sourcemap properties correctly ([#295](https://github.com/sveltejs/svelte/pull/295))
+
+## 1.6.9
+
+* Don't trigger bindings for torn-down components ([#277](https://github.com/sveltejs/svelte/issues/277))
+* SSR: Handle two-way bindings ([#275](https://github.com/sveltejs/svelte/issues/275))
+* Improve performance by checking data has changed before updates ([#279](https://github.com/sveltejs/svelte/pull/279))
+* Parse CSS with css-tree to prevent transformation errors with unconventional styles ([#288](https://github.com/sveltejs/svelte/issues/288))
+
+## 1.6.8
+
+* Always trigger `onrender`, including when change initiator is a nested component ([#263](https://github.com/sveltejs/svelte/issues/263))
+* Handle default function parameters in computations ([#274](https://github.com/sveltejs/svelte/issues/274))
+
+## 1.6.7
+
+* SSR: Fix apostrophes ([#267](https://github.com/sveltejs/svelte/issues/267))
+* Add `xmlns` attributes to SVGs ([#262](https://github.com/sveltejs/svelte/pull/262))
+
+## 1.6.6
+
+* Omit text from comment anchors ([#247](https://github.com/sveltejs/svelte/issues/247))
+* Handle `xlink` attributes ([#264](https://github.com/sveltejs/svelte/issues/264))
+
+## 1.6.5
+
+* Handle `<!doctype>` declarations ([#255](https://github.com/sveltejs/svelte/pull/255))
+
+## 1.6.4
+
+* Fix updates of yields inside each blocks ([20e1b05](https://github.com/sveltejs/svelte/commit/20e1b05c45dc9fcddfe2e7c5c9fc3109f0d45fa9))
+* SSR: Handle attributes with values that begin with a number ([#248](https://github.com/sveltejs/svelte/issues/248))
+* Handle multiline comments in CSS ([#252](https://github.com/sveltejs/svelte/issues/252))
+
+## 1.6.3
+
+* Fix `{{yield}}` bugs for components inside `if` and `each` blocks ([#230](https://github.com/sveltejs/svelte/issues/230), [#231](https://github.com/sveltejs/svelte/issues/231))
+* Set attributes on `<svg>` elements correctly ([#233](https://github.com/sveltejs/svelte/issues/233))
+* Add `svelte.VERSION` property to compiler
+
+## 1.6.2
+
+* Use helpers for `addEventListener`, `removeEventListener`, `setAttribute` ([#227](https://github.com/sveltejs/svelte/pull/227))
+* Escape `sharedPath` ([#229](https://github.com/sveltejs/svelte/pull/229))
+* Handle attributes with values that begin with a number ([#234](https://github.com/sveltejs/svelte/issues/234))
+* Update dependencies
+
+## 1.6.1
+
+* SSR: Handle component directives at arbitrary positions ([#221](https://github.com/sveltejs/svelte/issues/221))
+* Provide useful feedback on invalid void closing tag ([#224](https://github.com/sveltejs/svelte/issues/224))
+
+## 1.6.0
+
+* Replace `standalone: false` with `shared: true`, or `shared: 'custom/path/to/shared.js'` ([#218](https://github.com/sveltejs/svelte/issues/218))
+* Include `shared.js` in package
+
+## 1.5.0
+
+* Implement `standalone: false` ([#9](https://github.com/sveltejs/svelte/issues/9))
+* SSR: Handle component directives ([216](https://github.com/sveltejs/svelte/issues/216))
+
+## 1.4.0
+
+* Keyed `each` blocks ([#81](https://github.com/sveltejs/svelte/issues/81))
+
+## 1.3.1
+
+* Remove file extensions from AMD dependencies ([#144](https://github.com/sveltejs/svelte/issues/144))
+* Throw if `options.name` is illegal ([#102](https://github.com/sveltejs/svelte/issues/102))
+
+## 1.3.0
+
+* SSR compiler: Support `format` option ([#196](https://github.com/sveltejs/svelte/issues/196))
+* SSR compiler: Don't self-close 'normal' elements ([#200](https://github.com/sveltejs/svelte/issues/200))
+* Remove leading spaces from scoped CSS ([#140](https://github.com/sveltejs/svelte/issues/140))
+* Internal refactoring
+
+## 1.2.5
+
+* Allow whitelisted globals in templates ([#185](https://github.com/sveltejs/svelte/issues/185))
+* Intercept parse errors with `options.onerror`
+
+## 1.2.4
+
+* SSR compiler: Implement `{{{triples}}}` ([#197](https://github.com/sveltejs/svelte/issues/197))
+* SSR compiler: Escape HTML in tags ([#197](https://github.com/sveltejs/svelte/issues/197))
+
+## 1.2.3
+
+* Add support for `namespace` declaration for SVG (etc) components ([#147](https://github.com/sveltejs/svelte/issues/147))
+* Throw error if methods or lifecycle hooks are arrow functions that use `this` or `arguments` ([#179](https://github.com/sveltejs/svelte/issues/179))
+* Use `setAttribute()` for `list` attributes, to preserve link to `<datalist>` ([#178](https://github.com/sveltejs/svelte/issues/178))
+* Throw error if default export is not an object literal ([#190](https://github.com/sveltejs/svelte/pull/190))
+* Internal refactoring
+
+## 1.2.2
+
+* Omit directives in server-side rendering ([#163](https://github.com/sveltejs/svelte/issues/167))
+* Handle comments in SSR ([#165](https://github.com/sveltejs/svelte/issues/165))
+* Support calling methods of `event`/`this` in event handlers ([#162](https://github.com/sveltejs/svelte/issues/162))
+* Remove `mount` from public API ([#150](https://github.com/sveltejs/svelte/issues/150))
+
+## 1.2.1
+
+* Server-side rendering is available as a compiler option (`generate: 'ssr'`) ([#159](https://github.com/sveltejs/svelte/pull/159))
+* Allow call expressions where function is not in `helpers` ([#163](https://github.com/sveltejs/svelte/issues/163))
+
+## 1.2.0
+
+* Server-side rendering of HTML ([#148](https://github.com/sveltejs/svelte/pull/148)) and CSS ([#154](https://github.com/sveltejs/svelte/pull/154))
+
+## 1.1.3
+
+* Handle `xmlns` attributes correctly ([#142](https://github.com/sveltejs/svelte/issues/142))
+* Error on duplicate `<style>`/`<script>` tags rather than failing silently ([#142](https://github.com/sveltejs/svelte/issues/142))
+* Don't create whitespace text nodes inside SVG elements ([#142](https://github.com/sveltejs/svelte/issues/142))
+* Require void elements to be lowercase, to eliminate confusion with components ([#137](https://github.com/sveltejs/svelte/issues/137))
+
+## 1.1.2
+
+* Deconflict variable names ([#88](https://github.com/sveltejs/svelte/issues/88), [#126](https://github.com/sveltejs/svelte/issues/126))
+
+## 1.1.1
+
+* Support multiple SVG elements in a component ([#130](https://github.com/sveltejs/svelte/issues/130))
+
+## 1.1.0
+
+* Separate fragment creation from `mount` ([#91](https://github.com/sveltejs/svelte/pull/91))
+* Trigger `onrender` hook at correct time for nested components ([#103](https://github.com/sveltejs/svelte/pull/103))
+* Fix keypath dynamic attributes in components ([#46](https://github.com/sveltejs/svelte/issues/46))
+* Implement `{{yield}}` ([#112](https://github.com/sveltejs/svelte/pull/112))
+* Optimise teardown ([#99](https://github.com/sveltejs/svelte/issues/99))
+* Require computed properties to have at least one dependency ([#115](https://github.com/sveltejs/svelte/pull/115))
+* Support `{{#each ...}}...{{else}}...{{/each}}` ([#90](https://github.com/sveltejs/svelte/issues/90))
+* Triple mustaches ([#35](https://github.com/sveltejs/svelte/issues/35))
+
+## 1.0.7
+
+* Correctly escape HTML entities ([#85](https://github.com/sveltejs/svelte/issues/85))
+
+## 1.0.6
+
+* Generate useful sourcemaps ([#60](https://github.com/sveltejs/svelte/issues/60))
+
+## 1.0.5
+
+* Ensure compiler only generates ES5 code ([#75](https://github.com/sveltejs/svelte/issues/75))
+* `get()` without arguments returns entire state object ([#73](https://github.com/sveltejs/svelte/issues/73))
+
+## 1.0.4
+
+* Handle empty attributes in elements and components ([#63](https://github.com/sveltejs/svelte/issues/63))
+* Detach top-level text nodes inside departing each blocks ([#62](https://github.com/sveltejs/svelte/issues/62))
+
+## 1.0.3
+
+* Better generated code for `if` blocks, especially with `else`/`elseif` chains ([#28](https://github.com/sveltejs/svelte/pull/28))
+* Trim unnecessary whitespace from `else`/`elseif` blocks ([#49](https://github.com/sveltejs/svelte/pull/49))
+* Handle trailing comments in script tags ([#64](https://github.com/sveltejs/svelte/issues/64))
+
+## 1.0.2
+
+Set `style.cssText` rather than `style` ([#44](https://github.com/sveltejs/svelte/issues/44))
+
+## 1.0.1
+
+* Preserve SVG namespace inside each blocks
+* Always use `setAttribute` with SVG elements
+
+## 1.0.0
+
+* Generate AMD, CJS, IIFE and UMD builds
+* Correctly insert text nodes before anchors ([#31](https://github.com/sveltejs/svelte/pull/31))
+
+## 0.3.0
+
+* Fix bug where departing element would unset `ref` incorrectly ([#24](https://github.com/sveltejs/svelte/issues/24))
+* Basic template validation ([#6](https://github.com/sveltejs/svelte/issues/6))
+* Fire `onrender` hooks once component is in DOM ([#18](https://github.com/sveltejs/svelte/issues/18))
+* Only detach nodes when necessary to do so ([#26](https://github.com/sveltejs/svelte/issues/26))
+
+## 0.2.2
+
+* On second thoughts, don't transpile build. Was only really for Uglify's benefit, which is daft
+
+## 0.2.1
+
+* Transpile build
+
+## 0.2.0
+
+* Only generate UMD build, for now
+* Include dependencies in the build, treat as `devDependencies`
+* Faster initial render
+* Parent data overrides child defaults
+* Remove top-level text nodes on teardown
+* Handle `readUntil` errors in parser
+* Basic `<select>` binding
+* Handle missing data
+* Prevent infinite set/observe loops
+* Add `bind:foo` shorthand
+* `else` and `elseif` blocks
+* Hoist imports
+
+## 0.1.1
+
+* Support unquoted attributes
+* Handle entities in attributes
+* Inline nested components
+* `fire` and `on` methods
+
+## 0.1.0
+
+* Breaking change – Svelte compiler now generates constructor functions rather than factories ([#2](https://github.com/sveltejs/svelte/issues/2))
+* SVG support
+
+## 0.0.2
+
+* First release capable of building TodoMVC
+
+## 0.0.1
+
+* Just squatting on the package name

+ 7 - 0
node_modules/svelte/LICENSE

@@ -0,0 +1,7 @@
+Copyright (c) 2016 [these people](https://github.com/sveltejs/svelte/graphs/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.

+ 146 - 0
node_modules/svelte/README.md

@@ -0,0 +1,146 @@
+# Svelte
+
+The magical disappearing UI framework.
+
+* [Read the introductory blog post](https://svelte.technology/blog/frameworks-without-the-framework)
+* [Read the guide](https://svelte.technology/guide)
+* [Try it out](https://svelte.technology/repl)
+* [Chat on Gitter](https://gitter.im/sveltejs/svelte)
+
+---
+
+## Tooling
+
+This is the Svelte compiler, which is primarily intended for authors of tooling that integrates Svelte with different build systems. If you just want to write Svelte components and use them in your app, you probably want one of those tools:
+
+### Build Systems
+
+* [gulp-svelte](https://github.com/shinnn/gulp-svelte) - gulp plugin
+* [metalsmith-svelte](https://github.com/shinnn/metalsmith-svelte) - Metalsmith plugin
+* [system-svelte](https://github.com/CanopyTax/system-svelte) – System.js loader
+* [svelte-loader](https://github.com/sveltejs/svelte-loader) – Webpack loader
+* [meteor-svelte](https://github.com/klaussner/meteor-svelte) – Meteor build plugin
+* [sveltejs-brunch](https://github.com/StarpTech/sveltejs-brunch) – Brunch build plugin
+* [rollup-plugin-svelte](https://github.com/rollup/rollup-plugin-svelte) – Rollup plugin
+* [parcel-plugin-svelte](https://github.com/DeMoorJasper/parcel-plugin-svelte) - Parcel build plugin
+* [sveltify](https://github.com/tehshrike/sveltify) - Browserify transform
+
+### Additional tools
+
+* [svelte-dev-store](https://github.com/GarethOates/svelte-dev-store) - Use Redux tools to visualise Svelte store
+* More to come!
+
+## Example usage
+
+```js
+import * as svelte from 'svelte';
+
+const { js, css, ast } = svelte.compile(source, {
+	// the target module format – defaults to 'es' (ES2015 modules), can
+	// also be 'amd', 'cjs', 'umd', 'iife' or 'eval'
+	format: 'umd',
+
+	// the filename of the source file, used in e.g. generating sourcemaps
+	filename: 'MyComponent.html',
+
+	// the name of the constructor. Required for 'iife' and 'umd' output,
+	// but otherwise mostly useful for debugging. Defaults to 'SvelteComponent'
+	name: 'MyComponent',
+
+	// for 'amd' and 'umd' output, you can optionally specify an AMD module ID
+	amd: {
+		id: 'my-component'
+	},
+
+	// custom error/warning handlers. By default, errors will throw, and
+	// warnings will be printed to the console. Where applicable, the
+	// error/warning object will have `pos`, `loc` and `frame` properties
+	onerror: err => {
+		console.error( err.message );
+	},
+
+	onwarn: warning => {
+		console.warn( warning.message );
+	}
+});
+```
+
+
+## API
+
+The Svelte compiler exposes the following API:
+
+* `compile(source [, options]) => { js, css, ast }` - Compile the component with the given options (see below). Returns an object containing the compiled JavaScript, a sourcemap, an AST and transformed CSS.
+* `create(source [, options]) => function` - Compile the component and return the component itself.
+* `preprocess(source, options) => Promise` — Preprocess a source file, e.g. to use PostCSS or CoffeeScript
+* `VERSION` - The version of this copy of the Svelte compiler as a string, `'x.x.x'`.
+
+### Compiler options
+
+The Svelte compiler optionally takes a second argument, an object of configuration options:
+
+| | **Values** | **Description** | **Default** |
+|---|---|---|---|
+| `generate` | `'dom'`, `'ssr'`, `false` | Whether to generate JavaScript code intended for use on the client (`'dom'`), or for use in server-side rendering (`'ssr'`). If `false`, component will be parsed and validated but no code will be emitted | `'dom'` |
+| `dev` | `true`, `false` | Whether to enable run-time checks in the compiled component. These are helpful during development, but slow your component down. | `false` |
+| `css` | `true`, `false` | Whether to include code to inject your component's styles into the DOM. | `true` |
+| `hydratable` | `true`, `false` | Whether to support hydration on the compiled component. | `false` |
+| `customElement` | `true`, `false`, `{ tag, props }` | Whether to compile this component to a custom element. If `tag`/`props` are passed, compiles to a custom element and overrides the values exported by the component. | `false` |
+| `bind` | `boolean` | If `false`, disallows `bind:` directives | `true` |
+| | | |
+| `shared` | `true`, `false`, `string` | Whether to import various helpers from a shared external library. When you have a project with multiple components, this reduces the overall size of your JavaScript bundle, at the expense of having immediately-usable component. You can pass a string of the module path to use, or `true` will import from `'svelte/shared.js'`. | `false` |
+| `legacy` | `true`, `false` | Ensures compatibility with very old browsers, at the cost of some extra code. | `false` |
+| | | |
+| `format` | `'es'`, `'amd'`, `'cjs'`, `'umd'`, `'iife'`, `'eval'` | The format to output in the compiled component.<br>`'es'` - ES6/ES2015 module, suitable for consumption by a bundler<br>`'amd'` - AMD module<br>`'cjs'` - CommonJS module<br>`'umd'` - UMD module<br>`'iife'` - IIFE-wrapped function defining a global variable, suitable for use directly in browser<br>`'eval'` - standalone function, suitable for passing to `eval()` | `'es'` for `generate: 'dom'`<br>`'cjs'` for `generate: 'ssr'` |
+| `name` | `string` | The name of the constructor in the compiled component. | `'SvelteComponent'` |
+| `filename` | `string` | The filename to use in sourcemaps and compiler error and warning messages. | `'SvelteComponent.html'` |
+| `amd`.`id` | `string` | The AMD module ID to use for the `'amd'` and `'umd'` output formats. | `undefined` |
+| `globals` | `object`, `function` | When outputting to the `'umd'`, `'iife'` or `'eval'` formats, an object or function mapping the names of imported dependencies to the names of global variables. | `{}` |
+| `preserveComments` | `boolean` | Include comments in rendering. Currently, only applies to SSR rendering | `false` |
+| | | |
+| `onerror` | `function` | Specify a callback for when Svelte encounters an error while compiling the component. Passed two arguments: the error object, and another function that is Svelte's default onerror handling. | (exception is thrown) |
+| `onwarn` | `function` | Specify a callback for when Svelte encounters a non-fatal warning while compiling the component. Passed two arguments: the warning object, and another function that is Svelte's default onwarn handling. | (warning is logged to console) |
+
+### Preprocessor options
+
+`svelte.preprocess` returns a Promise that resolves to an object with a `toString` method (other properties will be added in future). It takes an options object with `markup`, `style` or `script` properties:
+
+```js
+const processed = await svelte.preprocess(source, {
+	markup: ({ content }) => {
+		// `content` is the entire component string
+		return { code: '...', map: {...} };
+	},
+
+	style: ({ content, attributes }) => {
+		// `content` is what's inside the <style> element, if present
+		// `attributes` is a map of attributes on the element
+		if (attributes.type !== 'text/scss') return;
+		return { code: '...', map: {...} };
+	},
+
+	script: ({ content, attributes }) => {
+		// `content` is what's inside the <script> element, if present
+		// `attributes` is a map of attributes on the element
+		if (attributes.type !== 'text/coffeescript') return;
+		return { code: '...', map: {...} };
+	}
+});
+```
+
+The `style` and `script` preprocessors will run *after* the `markup` preprocessor. Each preprocessor can return a) nothing (in which case no transformation takes place), b) a `{ code, map }` object, or c) a Promise that resolves to a) or b). Note that sourcemaps are currently discarded, but will be used in future versions of Svelte.
+
+## Example/starter repos
+
+* [charpeni/svelte-example](https://github.com/charpeni/svelte-example) - Some Svelte examples with configured Rollup, Babel, ESLint, directives, Two-Way binding, and nested components
+* [EmilTholin/svelte-test](https://github.com/EmilTholin/svelte-test)
+* [lukechinworth/codenames](https://github.com/lukechinworth/codenames/tree/svelte) – example integration with Redux
+* [khtdr/svelte-redux-shopping-cart](https://github.com/khtdr/svelte-redux-shopping-cart) – Redux Shopping Cart example (with devtools and hot-reloading)
+
+## BrowserStack
+<img src="https://cdn.worldvectorlogo.com/logos/browserstack.svg" height="80" width="80" align="left">
+<p>To keep Svelte's performance in check, we use BrowserStack to quickly run benchmarks for each PR that immediately give feedback to the contributor. You can see how we use BrowserStack in the <a href="https://github.com/sveltejs/svelte-bench">svelte-bench</a> project and check out BrowserStack's services on their <a href="https://www.browserstack.com/">website</a>.</p>
+
+## License
+
+[MIT](LICENSE)

+ 2 - 0
node_modules/svelte/cli/chunk-5ab72169.js

@@ -0,0 +1,2 @@
+'use strict';
+

+ 200 - 0
node_modules/svelte/cli/compile.ts.js

@@ -0,0 +1,200 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+require('./chunk-5ab72169.js');
+var path = require('path');
+var fs = require('fs');
+var svelte = require('../compiler/svelte.js');
+
+var ansi = (strip => ({
+  reset: strip(["\x1b[0m"]),
+  newLine: ["\n", ""],
+  tab: ["\t", ""],
+
+  black: strip(["\x1b[30m", "\x1b[39m"]),
+  red: strip(["\x1b[31m", "\x1b[39m"]),
+  green: strip(["\x1b[32m", "\x1b[39m"]),
+  yellow: strip(["\x1b[33m", "\x1b[39m"]),
+  blue: strip(["\x1b[34m", "\x1b[39m"]),
+  magenta: strip(["\x1b[35m", "\x1b[39m"]),
+  cyan: strip(["\x1b[36m", "\x1b[39m"]),
+  white: strip(["\x1b[37m", "\x1b[39m"]),
+  gray: strip(["\x1B[90m", "\x1b[39m"]),
+
+  bgBlack: strip(["\x1b[40m", "\x1b[49m"]),
+  bgRed: strip(["\x1b[41m", "\x1b[49m"]),
+  bgGreen: strip(["\x1b[42m", "\x1b[49m"]),
+  bgYellow: strip(["\x1b[43m", "\x1b[49m"]),
+  bgBlue: strip(["\x1b[44m", "\x1b[49m"]),
+  bgMagenta: strip(["\x1b[45m", "\x1b[49m"]),
+  bgCyan: strip(["\x1b[46m", "\x1b[49m"]),
+  bgWhite: strip(["\x1b[47m", "\x1b[49m"]),
+
+  dim: strip(["\x1b[2m", "\x1b[22m"]),
+  bold: strip(["\x1b[1m", "\x1b[22m"]),
+  hidden: strip(["\x1b[8m", "\x1b[28m"]),
+  italic: strip(["\x1b[3m", "\x1b[23m"]),
+  underline: strip(["\x1b[4m", "\x1b[24m"]),
+  inverse: strip(["\x1b[7m", "\x1b[27m"]),
+  strikethrough: strip(["\x1b[9m", "\x1b[29m"])
+}))(
+  ansi =>
+    process.env.FORCE_COLOR ||
+    process.platform === "win32" ||
+    (process.stdout.isTTY && process.env.TERM && process.env.TERM !== "dumb")
+      ? ansi
+      : ["", ""]
+);
+
+var ansi$1 = /*#__PURE__*/Object.freeze({
+  default: ansi,
+  __moduleExports: ansi
+});
+
+var ansi$2 = ( ansi$1 && ansi ) || ansi$1;
+
+var clorox = (function Clorox(old, close) {
+  const clorox = s => Clorox(clorox.toString(s));
+
+  clorox.toString = s => old + (s || "") + (close || ansi$2.reset[0]);
+
+  Object.keys(ansi$2).map(name => {
+    Object.defineProperty(clorox, name, {
+      get: () => Clorox(old + ansi$2[name][0], (close || "") + ansi$2[name][1])
+    });
+  });
+
+  return clorox
+})("");
+
+function stderr(msg) {
+    console.error(msg); // eslint-disable-line no-console
+}
+function error(err) {
+    stderr(`${clorox.red(err.message || err)}`);
+    if (err.frame) {
+        stderr(err.frame); // eslint-disable-line no-console
+    }
+    else if (err.stack) {
+        stderr(`${clorox.grey(err.stack)}`);
+    }
+    process.exit(1);
+}
+
+function mkdirp(dir) {
+    const parent = path.dirname(dir);
+    if (dir === parent)
+        return;
+    mkdirp(parent);
+    if (!fs.existsSync(dir))
+        fs.mkdirSync(dir);
+}
+function compile(input, opts) {
+    if (opts._.length > 0) {
+        error(`Can only compile a single file or directory`);
+    }
+    const output = opts.output;
+    const stats = fs.statSync(input);
+    const isDir = stats.isDirectory();
+    if (isDir) {
+        if (!output) {
+            error(`You must specify an --output (-o) option when compiling a directory of files`);
+        }
+        if (opts.name || opts.amdId) {
+            error(`Cannot specify --${opts.name ? 'name' : 'amdId'} when compiling a directory`);
+        }
+    }
+    const globals = {};
+    if (opts.globals) {
+        opts.globals.split(',').forEach(pair => {
+            const [key, value] = pair.split(':');
+            globals[key] = value;
+        });
+    }
+    const options = {
+        name: opts.name,
+        format: opts.format,
+        sourceMap: opts.sourcemap,
+        globals,
+        css: opts.css !== false,
+        dev: opts.dev,
+        immutable: opts.immutable,
+        generate: opts.generate || 'dom',
+        customElement: opts.customElement,
+        store: opts.store
+    };
+    if (isDir) {
+        mkdirp(output);
+        compileDirectory(input, output, options);
+    }
+    else {
+        compileFile(input, output, options);
+    }
+}
+function compileDirectory(input, output, options) {
+    fs.readdirSync(input).forEach(file => {
+        const src = path.resolve(input, file);
+        const dest = path.resolve(output, file);
+        if (path.extname(file) === '.html') {
+            compileFile(src, dest.substring(0, dest.lastIndexOf('.html')) + '.js', options);
+        }
+        else {
+            const stats = fs.statSync(src);
+            if (stats.isDirectory()) {
+                compileDirectory(src, dest, options);
+            }
+        }
+    });
+}
+let SOURCEMAPPING_URL = 'sourceMa';
+SOURCEMAPPING_URL += 'ppingURL';
+function compileFile(input, output, options) {
+    console.error(`compiling ${path.relative(process.cwd(), input)}...`); // eslint-disable-line no-console
+    options = Object.assign({}, options);
+    if (!options.name)
+        options.name = getName(input);
+    options.filename = input;
+    options.outputFilename = output;
+    const { sourceMap } = options;
+    const inline = sourceMap === 'inline';
+    let source = fs.readFileSync(input, 'utf-8');
+    if (source[0] === 0xfeff)
+        source = source.slice(1);
+    let compiled;
+    try {
+        compiled = svelte.compile(source, options);
+    }
+    catch (err) {
+        error(err);
+    }
+    const { js } = compiled;
+    if (sourceMap) {
+        js.code += `\n//# ${SOURCEMAPPING_URL}=${inline || !output
+            ? js.map.toUrl()
+            : `${path.basename(output)}.map`}\n`;
+    }
+    if (output) {
+        const outputDir = path.dirname(output);
+        mkdirp(outputDir);
+        fs.writeFileSync(output, js.code);
+        console.error(`wrote ${path.relative(process.cwd(), output)}`); // eslint-disable-line no-console
+        if (sourceMap && !inline) {
+            fs.writeFileSync(`${output}.map`, js.map);
+            console.error(`wrote ${path.relative(process.cwd(), `${output}.map`)}`); // eslint-disable-line no-console
+        }
+    }
+    else {
+        process.stdout.write(js.code);
+    }
+}
+function getName(input) {
+    return path.basename(input)
+        .replace(path.extname(input), '')
+        .replace(/[^a-zA-Z_$0-9]+/g, '_')
+        .replace(/^_/, '')
+        .replace(/_$/, '')
+        .replace(/^(\d)/, '_$1');
+}
+
+exports.compile = compile;

+ 556 - 0
node_modules/svelte/cli/index.ts.js

@@ -0,0 +1,556 @@
+'use strict';
+
+require('./chunk-5ab72169.js');
+
+const EQQ = /\s|=/;
+const FLAG = /^-{1,2}/;
+const PREFIX = /^--no-/i;
+
+function isBool(any) {
+	return typeof any === 'boolean';
+}
+
+function toArr(any) {
+	return Array.isArray(any) ? any : any == null ? [] : [any];
+}
+
+function toString(any) {
+	return any == null || any === true ? '' : String(any);
+}
+
+function toBool(any) {
+	return any === 'false' ? false : Boolean(any);
+}
+
+function toNum(any) {
+	return (!isBool(any) && Number(any)) || any;
+}
+
+function getAlibi(names, arr) {
+	if (arr.length === 0) return arr;
+	let k, i = 0, len = arr.length, vals = [];
+	for (; i < len; i++) {
+		k = arr[i];
+		vals.push(k);
+		if (names[k] !== void 0) {
+			vals = vals.concat(names[k]);
+		}
+	}
+	return vals;
+}
+
+function typecast(key, val, strings, booleans) {
+	if (strings.indexOf(key) !== -1) return toString(val);
+	if (booleans.indexOf(key) !== -1) return toBool(val);
+	return toNum(val);
+}
+
+var lib = function(args, opts) {
+	args = args || [];
+	opts = opts || {};
+
+	opts.string = toArr(opts.string);
+	opts.boolean = toArr(opts.boolean);
+
+	const aliases = {};
+	let k, i, j, x, y, len, type;
+
+	if (opts.alias !== void 0) {
+		for (k in opts.alias) {
+			aliases[k] = toArr(opts.alias[k]);
+			len = aliases[k].length; // save length
+			for (i = 0; i < len; i++) {
+				x = aliases[k][i]; // alias's key name
+				aliases[x] = [k]; // set initial array
+				for (j = 0; j < len; j++) {
+					if (x !== aliases[k][j]) {
+						aliases[x].push(aliases[k][j]);
+					}
+				}
+			}
+		}
+	}
+
+	if (opts.default !== void 0) {
+		for (k in opts.default) {
+			type = typeof opts.default[k];
+			opts[type] = (opts[type] || []).concat(k);
+		}
+	}
+
+	// apply to all aliases
+	opts.string = getAlibi(aliases, opts.string);
+	opts.boolean = getAlibi(aliases, opts.boolean);
+
+	let idx = 0;
+	const out = { _: [] };
+
+	while (args[idx] !== void 0) {
+		let incr = 1;
+		const val = args[idx];
+
+		if (val === '--') {
+			out._ = out._.concat(args.slice(idx + 1));
+			break;
+		} else if (!FLAG.test(val)) {
+			out._.push(val);
+		} else if (PREFIX.test(val)) {
+			out[val.replace(PREFIX, '')] = false;
+		} else {
+			let tmp;
+			const segs = val.split(EQQ);
+			const isGroup = segs[0].charCodeAt(1) !== 45; // '-'
+
+			const flag = segs[0].substr(isGroup ? 1 : 2);
+			len = flag.length;
+			const key = isGroup ? flag[len - 1] : flag;
+
+			if (opts.unknown !== void 0 && aliases[key] === void 0) {
+				return opts.unknown(segs[0]);
+			}
+
+			if (segs.length > 1) {
+				tmp = segs[1];
+			} else {
+				tmp = args[idx + 1] || true;
+				FLAG.test(tmp) ? (tmp = true) : (incr = 2);
+			}
+
+			if (isGroup && len > 1) {
+				for (i = len - 1; i--; ) {
+					k = flag[i]; // all but last key
+					out[k] = typecast(k, true, opts.string, opts.boolean);
+				}
+			}
+
+			const value = typecast(key, tmp, opts.string, opts.boolean);
+			out[key] = out[key] !== void 0 ? toArr(out[key]).concat(value) : value;
+
+			// handle discarded args when dealing with booleans
+			if (isBool(value) && !isBool(tmp) && tmp !== 'true' && tmp !== 'false') {
+				out._.push(tmp);
+			}
+		}
+
+		idx += incr;
+	}
+
+	if (opts.default !== void 0) {
+		for (k in opts.default) {
+			if (out[k] === void 0) {
+				out[k] = opts.default[k];
+			}
+		}
+	}
+
+	for (k in out) {
+		if (aliases[k] === void 0) continue;
+		y = out[k];
+		len = aliases[k].length;
+		for (i = 0; i < len; i++) {
+			out[aliases[k][i]] = y; // assign value
+		}
+	}
+
+	return out;
+};
+
+var lib$1 = /*#__PURE__*/Object.freeze({
+	default: lib,
+	__moduleExports: lib
+});
+
+/*!
+ * repeat-string <https://github.com/jonschlinkert/repeat-string>
+ *
+ * Copyright (c) 2014-2015, Jon Schlinkert.
+ * Licensed under the MIT License.
+ */
+
+/**
+ * Results cache
+ */
+
+var res = '';
+var cache;
+
+/**
+ * Expose `repeat`
+ */
+
+var repeatString = repeat;
+
+/**
+ * Repeat the given `string` the specified `number`
+ * of times.
+ *
+ * **Example:**
+ *
+ * ```js
+ * var repeat = require('repeat-string');
+ * repeat('A', 5);
+ * //=> AAAAA
+ * ```
+ *
+ * @param {String} `string` The string to repeat
+ * @param {Number} `number` The number of times to repeat the string
+ * @return {String} Repeated string
+ * @api public
+ */
+
+function repeat(str, num) {
+  if (typeof str !== 'string') {
+    throw new TypeError('expected a string');
+  }
+
+  // cover common, quick use cases
+  if (num === 1) return str;
+  if (num === 2) return str + str;
+
+  var max = str.length * num;
+  if (cache !== str || typeof cache === 'undefined') {
+    cache = str;
+    res = '';
+  } else if (res.length >= max) {
+    return res.substr(0, max);
+  }
+
+  while (max > res.length && num > 1) {
+    if (num & 1) {
+      res += str;
+    }
+
+    num >>= 1;
+    str += str;
+  }
+
+  res += str;
+  res = res.substr(0, max);
+  return res;
+}
+
+var repeatString$1 = /*#__PURE__*/Object.freeze({
+	default: repeatString,
+	__moduleExports: repeatString
+});
+
+var repeat$1 = ( repeatString$1 && repeatString ) || repeatString$1;
+
+var padRight = function padLeft(val, num, str) {
+  var padding = '';
+  var diff = num - val.length;
+
+  // Breakpoints based on benchmarks to use the fastest approach
+  // for the given number of zeros
+  if (diff <= 5 && !str) {
+    padding = '00000';
+  } else if (diff <= 25 && !str) {
+    padding = '000000000000000000000000000';
+  } else {
+    return val + repeat$1(str || '0', diff);
+  }
+
+  return val + padding.slice(0, diff);
+};
+
+var padRight$1 = /*#__PURE__*/Object.freeze({
+	default: padRight,
+	__moduleExports: padRight
+});
+
+var rpad = ( padRight$1 && padRight ) || padRight$1;
+
+const GAP = 4;
+const __ = '  ';
+const ALL = '__all__';
+const DEF = '__default__';
+const NL = '\n';
+
+function format(arr) {
+	if (!arr.length) return '';
+	let len = maxLen( arr.map(x => x[0]) ) + GAP;
+	let join = a => rpad(a[0], len, ' ') + a[1] + (a[2] == null ? '' : `  (default ${a[2]})`);
+	return arr.map(join);
+}
+
+function maxLen(arr) {
+  let c=0, d=0, l=0, i=arr.length;
+  if (i) while (i--) {
+    d = arr[i].length;
+    if (d > c) {
+      l = i; c = d;
+    }
+  }
+  return arr[l].length;
+}
+
+function noop(s) {
+	return s;
+}
+
+function section(str, arr, fn) {
+	if (!arr || !arr.length) return '';
+	let i=0, out='';
+	out += (NL + __ + str);
+	for (; i < arr.length; i++) {
+		out += (NL + __ + __ + fn(arr[i]));
+	}
+	return out + NL;
+}
+
+var help = function (bin, tree, key) {
+	let out='', cmd=tree[key], pfx=`$ ${bin}`, all=tree[ALL];
+	let prefix = s => `${pfx} ${s}`;
+
+	// update ALL & CMD options
+	all.options.push(['-h, --help', 'Displays this message']);
+	cmd.options = (cmd.options || []).concat(all.options);
+
+	// write options placeholder
+	(cmd.options.length > 0) && (cmd.usage += ' [options]');
+
+	// description ~> text only; usage ~> prefixed
+	out += section('Description', cmd.describe, noop);
+	out += section('Usage', [cmd.usage], prefix);
+
+	if (key === DEF) {
+		// General help :: print all non-internal commands & their 1st line of text
+		let cmds = Object.keys(tree).filter(k => !/__/.test(k));
+		let text = cmds.map(k => [k, (tree[k].describe || [''])[0]]);
+		out += section('Available Commands', format(text), noop);
+
+		out += (NL + __ + 'For more info, run any command with the `--help` flag');
+		cmds.slice(0, 2).forEach(k => {
+			out += (NL + __ + __ + `${pfx} ${k} --help`);
+		});
+		out += NL;
+	}
+
+	out += section('Options', format(cmd.options), noop);
+	out += section('Examples', cmd.examples.map(prefix), noop);
+
+	return out;
+};
+
+var error = function (bin, str, num=1) {
+	let out = section('ERROR', [str], noop);
+	out += (NL + __ + `Run \`$ ${bin} --help\` for more info.` + NL);
+	console.error(out);
+	process.exit(num);
+};
+
+// Strips leading `-|--` & extra space(s)
+var parse = function (str) {
+	return (str || '').split(/^-{1,2}|,|\s+-{1,2}|\s+/).filter(Boolean);
+};
+
+// @see https://stackoverflow.com/a/18914855/3577474
+var sentences = function (str) {
+	return (str || '').replace(/([.?!])\s*(?=[A-Z])/g, '$1|').split('|');
+};
+
+var utils = {
+	help: help,
+	error: error,
+	parse: parse,
+	sentences: sentences
+};
+
+var utils$1 = /*#__PURE__*/Object.freeze({
+	default: utils,
+	__moduleExports: utils,
+	help: help,
+	error: error,
+	parse: parse,
+	sentences: sentences
+});
+
+var mri = ( lib$1 && lib ) || lib$1;
+
+var $ = ( utils$1 && utils ) || utils$1;
+
+const ALL$1 = '__all__';
+const DEF$1 = '__default__';
+
+class Sade {
+	constructor(name) {
+		this.tree = {};
+		this.name = name;
+		this.ver = '0.0.0';
+		this.default = '';
+		// set internal shapes;
+		this.command(ALL$1);
+		this.command(`${DEF$1} <command>`)
+			.option('-v, --version', 'Displays current version');
+		this.curr = ''; // reset
+	}
+
+	command(str, desc, opts) {
+		let cmd=[], usage=[], rgx=/(\[|<)/;
+		// All non-([|<) are commands
+		str.split(/\s+/).forEach(x => {
+			(rgx.test(x.charAt(0)) ? usage : cmd).push(x);
+		});
+
+		// Back to string~!
+		cmd = cmd.join(' ');
+
+		if (cmd in this.tree) {
+			throw new Error(`Command already exists: ${cmd}`);
+		}
+
+		this.curr = cmd;
+		(opts && opts.default) && (this.default=cmd);
+
+		!~cmd.indexOf('__') && usage.unshift(cmd); // re-include `cmd`
+		usage = usage.join(' '); // to string
+
+		this.tree[cmd] = { usage, options:[], alias:{}, default:{}, examples:[] };
+		desc && this.describe(desc);
+
+		return this;
+	}
+
+	describe(str) {
+		this.tree[this.curr || DEF$1].describe = Array.isArray(str) ? str : $.sentences(str);
+		return this;
+	}
+
+	option(str, desc, val) {
+		let cmd = this.tree[ this.curr || ALL$1 ];
+
+		let [flag, alias] = $.parse(str);
+		(alias && alias.length > 1) && ([flag, alias]=[alias, flag]);
+
+		str = `--${flag}`;
+		if (alias && alias.length > 0) {
+			str = `-${alias}, ${str}`;
+			let old = cmd.alias[alias];
+			cmd.alias[alias] = (old || []).concat(flag);
+		}
+
+		let arr = [str, desc || ''];
+
+		if (val !== void 0) {
+			arr.push(val);
+			cmd.default[flag] = val;
+		}
+
+		cmd.options.push(arr);
+		return this;
+	}
+
+	action(handler) {
+		this.tree[ this.curr || DEF$1 ].handler = handler;
+		return this;
+	}
+
+	example(str) {
+		this.tree[ this.curr || DEF$1 ].examples.push(str);
+		return this;
+	}
+
+	version(str) {
+		this.ver = str;
+		return this;
+	}
+
+	parse(arr, opts={}) {
+		let offset = 2; // argv slicer
+		let alias = { h:'help', v:'version' };
+		let argv = mri(arr.slice(offset), { alias });
+		let bin = this.name;
+
+		// Loop thru possible command(s)
+		let tmp, name='';
+		let i=1, len=argv._.length + 1;
+		for (; i < len; i++) {
+			tmp = argv._.slice(0, i).join(' ');
+			if (this.tree[tmp] !== void 0) {
+				name=tmp; offset=(i + 2); // argv slicer
+			}
+		}
+
+		let cmd = this.tree[name];
+		let isVoid = (cmd === void 0);
+
+		if (isVoid) {
+			if (this.default) {
+				name = this.default;
+				cmd = this.tree[name];
+				arr.unshift(name);
+				offset++;
+			} else if (name) {
+				return $.error(bin, `Invalid command: ${name}`);
+			} //=> else: cmd not specified, wait for now...
+		}
+
+		if (argv.version) {
+			return console.log(`${bin}, ${this.ver}`);
+		}
+
+		if (argv.help) {
+			return this.help(!isVoid && name);
+		}
+
+		if (cmd === void 0) {
+			return $.error(bin, 'No command specified.');
+		}
+
+		let all = this.tree[ALL$1];
+		// merge all objects :: params > command > all
+		opts.alias = Object.assign(all.alias, cmd.alias, opts.alias);
+		opts.default = Object.assign(all.default, cmd.default, opts.default);
+
+		let vals = mri(arr.slice(offset), opts);
+		let segs = cmd.usage.split(/\s+/);
+		let reqs = segs.filter(x => x.charAt(0)==='<');
+		let args = vals._.splice(0, reqs.length);
+
+		if (args.length < reqs.length) {
+			name && (bin += ` ${name}`); // for help text
+			return $.error(bin, 'Insufficient arguments!');
+		}
+
+		segs.filter(x => x.charAt(0)==='[').forEach(_ => {
+			args.push(vals._.pop()); // adds `undefined` per [slot] if no more
+		});
+
+		args.push(vals); // flags & co are last
+		let handler = cmd.handler;
+		return opts.lazy ? { args, name, handler } : handler.apply(null, args);
+	}
+
+	help(str) {
+		console.log(
+			$.help(this.name, this.tree, str || DEF$1)
+		);
+	}
+}
+
+var lib$2 = str => new Sade(str);
+
+var version = "2.6.5";
+
+const prog = lib$2('svelte').version(version);
+prog
+    .command('compile <input>')
+    .option('-o, --output', 'Output (if absent, prints to stdout)')
+    .option('-f, --format', 'Type of output (amd, cjs, es, iife, umd)')
+    .option('-g, --globals', 'Comma-separate list of `module ID:Global` pairs')
+    .option('-n, --name', 'Name for IIFE/UMD export (inferred from filename by default)')
+    .option('-m, --sourcemap', 'Generate sourcemap (`-m inline` for inline map)')
+    .option('-d, --dev', 'Add dev mode warnings and errors')
+    .option('--amdId', 'ID for AMD module (default is anonymous)')
+    .option('--generate', 'Change generate format between `dom` and `ssr`')
+    .option('--no-css', `Don't include CSS (useful with SSR)`)
+    .option('--immutable', 'Support immutable data structures')
+    .example('compile App.html > App.js')
+    .example('compile src -o dest')
+    .example('compile -f umd MyComponent.html > MyComponent.js')
+    .action((input, opts) => {
+    Promise.resolve(require("./compile.ts.js")).then(({ compile }) => {
+        compile(input, opts);
+    });
+})
+    .parse(process.argv);

File diff suppressed because it is too large
+ 59 - 0
node_modules/svelte/compiler/svelte.js


File diff suppressed because it is too large
+ 0 - 0
node_modules/svelte/compiler/svelte.js.map


+ 129 - 0
node_modules/svelte/package.json

@@ -0,0 +1,129 @@
+{
+  "_from": "svelte",
+  "_id": "svelte@2.6.5",
+  "_inBundle": false,
+  "_integrity": "sha512-cyicFnfgSe3SQr2hPdLkQHz4nj1rwa9oqc1SBzrgFdQ1Y8AOoaad0S0zhW6oBZE5YAm75YqoL9l+BZd3CmtPLw==",
+  "_location": "/svelte",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "svelte",
+    "name": "svelte",
+    "escapedName": "svelte",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/svelte/-/svelte-2.6.5.tgz",
+  "_shasum": "561a8199e2fa7bdbfadcdf500c01a39bb752ec0f",
+  "_spec": "svelte",
+  "_where": "/home/zorro/Documents/Sahib/zweiachtzehn",
+  "author": {
+    "name": "Rich Harris"
+  },
+  "bin": {
+    "svelte": "svelte"
+  },
+  "bugs": {
+    "url": "https://github.com/sveltejs/svelte/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "The magical disappearing UI framework",
+  "devDependencies": {
+    "@types/mocha": "^5.2.0",
+    "@types/node": "^9.6.6",
+    "acorn": "^5.4.1",
+    "acorn-dynamic-import": "^3.0.0",
+    "chalk": "^2.4.0",
+    "clorox": "^1.0.3",
+    "codecov": "^3.0.0",
+    "console-group": "^0.3.2",
+    "css-tree": "1.0.0-alpha22",
+    "eslint": "^4.19.1",
+    "eslint-plugin-html": "^4.0.3",
+    "eslint-plugin-import": "^2.11.0",
+    "estree-walker": "^0.5.1",
+    "is-reference": "^1.1.0",
+    "jsdom": "^11.8.0",
+    "locate-character": "^2.0.5",
+    "magic-string": "^0.24.0",
+    "mocha": "3",
+    "nightmare": "^3.0.1",
+    "node-resolve": "^1.3.3",
+    "nyc": "^11.7.1",
+    "prettier": "^1.12.1",
+    "reify": "^0.15.1",
+    "rollup": "^0.58.1",
+    "rollup-plugin-buble": "^0.19.2",
+    "rollup-plugin-commonjs": "^9.1.0",
+    "rollup-plugin-json": "^2.1.0",
+    "rollup-plugin-node-resolve": "^3.3.0",
+    "rollup-plugin-replace": "^2.0.0",
+    "rollup-plugin-typescript": "^0.8.1",
+    "rollup-plugin-virtual": "^1.0.1",
+    "rollup-watch": "^4.3.1",
+    "sade": "^1.4.0",
+    "sander": "^0.6.0",
+    "shelljs": "^0.8.2",
+    "source-map": "0.6",
+    "source-map-support": "^0.5.4",
+    "tiny-glob": "^0.2.1",
+    "ts-node": "^6.0.0",
+    "tslib": "^1.8.0",
+    "typescript": "^2.8.3"
+  },
+  "files": [
+    "cli",
+    "compiler",
+    "ssr",
+    "shared.js",
+    "store.js",
+    "store.umd.js",
+    "svelte",
+    "README.md"
+  ],
+  "homepage": "https://github.com/sveltejs/svelte#README",
+  "keywords": [
+    "UI",
+    "framework",
+    "templates",
+    "templating"
+  ],
+  "license": "MIT",
+  "main": "compiler/svelte.js",
+  "name": "svelte",
+  "nyc": {
+    "include": [
+      "compiler/svelte.js",
+      "shared.js"
+    ],
+    "sourceMap": true,
+    "instrument": true
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/sveltejs/svelte.git"
+  },
+  "scripts": {
+    "build": "node src/shared/_build.js && rollup -c && rollup -c rollup.store.config.js",
+    "codecov": "codecov",
+    "coverage": "nyc report --reporter=text-lcov > coverage.lcov",
+    "dev": "node src/shared/_build.js && rollup -c -w",
+    "lint": "eslint src test/*.js",
+    "precodecov": "npm run coverage",
+    "precoverage": "export COVERAGE=true && nyc mocha --opts mocha.coverage.opts",
+    "prepare": "npm run build",
+    "prepublishOnly": "npm run lint && npm test",
+    "pretest": "npm run build",
+    "prettier": "prettier --write \"src/**/*.ts\"",
+    "quicktest": "mocha --opts mocha.opts",
+    "test": "mocha --opts mocha.opts"
+  },
+  "version": "2.6.5"
+}

+ 1020 - 0
node_modules/svelte/shared.js

@@ -0,0 +1,1020 @@
+function noop() {}
+
+function assign(tar, src) {
+	for (var k in src) tar[k] = src[k];
+	return tar;
+}
+
+function assignTrue(tar, src) {
+	for (var k in src) tar[k] = 1;
+	return tar;
+}
+
+function isPromise(value) {
+	return value && typeof value.then === 'function';
+}
+
+function callAfter(fn, i) {
+	return () => {
+		if (!--i) fn();
+	};
+}
+
+function appendNode(node, target) {
+	target.appendChild(node);
+}
+
+function insertNode(node, target, anchor) {
+	target.insertBefore(node, anchor);
+}
+
+function detachNode(node) {
+	node.parentNode.removeChild(node);
+}
+
+function detachBetween(before, after) {
+	while (before.nextSibling && before.nextSibling !== after) {
+		before.parentNode.removeChild(before.nextSibling);
+	}
+}
+
+function detachBefore(after) {
+	while (after.previousSibling) {
+		after.parentNode.removeChild(after.previousSibling);
+	}
+}
+
+function detachAfter(before) {
+	while (before.nextSibling) {
+		before.parentNode.removeChild(before.nextSibling);
+	}
+}
+
+function reinsertBetween(before, after, target) {
+	while (before.nextSibling && before.nextSibling !== after) {
+		target.appendChild(before.parentNode.removeChild(before.nextSibling));
+	}
+}
+
+function reinsertChildren(parent, target) {
+	while (parent.firstChild) target.appendChild(parent.firstChild);
+}
+
+function reinsertAfter(before, target) {
+	while (before.nextSibling) target.appendChild(before.nextSibling);
+}
+
+function reinsertBefore(after, target) {
+	var parent = after.parentNode;
+	while (parent.firstChild !== after) target.appendChild(parent.firstChild);
+}
+
+function destroyEach(iterations, detach) {
+	for (var i = 0; i < iterations.length; i += 1) {
+		if (iterations[i]) iterations[i].d(detach);
+	}
+}
+
+function createFragment() {
+	return document.createDocumentFragment();
+}
+
+function createElement(name) {
+	return document.createElement(name);
+}
+
+function createSvgElement(name) {
+	return document.createElementNS('http://www.w3.org/2000/svg', name);
+}
+
+function createText(data) {
+	return document.createTextNode(data);
+}
+
+function createComment() {
+	return document.createComment('');
+}
+
+function addListener(node, event, handler) {
+	node.addEventListener(event, handler, false);
+}
+
+function removeListener(node, event, handler) {
+	node.removeEventListener(event, handler, false);
+}
+
+function setAttribute(node, attribute, value) {
+	node.setAttribute(attribute, value);
+}
+
+function setAttributes(node, attributes) {
+	for (var key in attributes) {
+		if (key in node) {
+			node[key] = attributes[key];
+		} else {
+			if (attributes[key] === undefined) removeAttribute(node, key);
+			else setAttribute(node, key, attributes[key]);
+		}
+	}
+}
+
+function removeAttribute(node, attribute) {
+	node.removeAttribute(attribute);
+}
+
+function setXlinkAttribute(node, attribute, value) {
+	node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);
+}
+
+function getBindingGroupValue(group) {
+	var value = [];
+	for (var i = 0; i < group.length; i += 1) {
+		if (group[i].checked) value.push(group[i].__value);
+	}
+	return value;
+}
+
+function toNumber(value) {
+	return value === '' ? undefined : +value;
+}
+
+function timeRangesToArray(ranges) {
+	var array = [];
+	for (var i = 0; i < ranges.length; i += 1) {
+		array.push({ start: ranges.start(i), end: ranges.end(i) });
+	}
+	return array;
+}
+
+function children (element) {
+	return Array.from(element.childNodes);
+}
+
+function claimElement (nodes, name, attributes, svg) {
+	for (var i = 0; i < nodes.length; i += 1) {
+		var node = nodes[i];
+		if (node.nodeName === name) {
+			for (var j = 0; j < node.attributes.length; j += 1) {
+				var attribute = node.attributes[j];
+				if (!attributes[attribute.name]) node.removeAttribute(attribute.name);
+			}
+			return nodes.splice(i, 1)[0]; // TODO strip unwanted attributes
+		}
+	}
+
+	return svg ? createSvgElement(name) : createElement(name);
+}
+
+function claimText (nodes, data) {
+	for (var i = 0; i < nodes.length; i += 1) {
+		var node = nodes[i];
+		if (node.nodeType === 3) {
+			node.data = data;
+			return nodes.splice(i, 1)[0];
+		}
+	}
+
+	return createText(data);
+}
+
+function setInputType(input, type) {
+	try {
+		input.type = type;
+	} catch (e) {}
+}
+
+function setStyle(node, key, value) {
+	node.style.setProperty(key, value);
+}
+
+function selectOption(select, value) {
+	for (var i = 0; i < select.options.length; i += 1) {
+		var option = select.options[i];
+
+		if (option.__value === value) {
+			option.selected = true;
+			return;
+		}
+	}
+}
+
+function selectOptions(select, value) {
+	for (var i = 0; i < select.options.length; i += 1) {
+		var option = select.options[i];
+		option.selected = ~value.indexOf(option.__value);
+	}
+}
+
+function selectValue(select) {
+	var selectedOption = select.querySelector(':checked') || select.options[0];
+	return selectedOption && selectedOption.__value;
+}
+
+function selectMultipleValue(select) {
+	return [].map.call(select.querySelectorAll(':checked'), function(option) {
+		return option.__value;
+	});
+}
+
+function addResizeListener(element, fn) {
+	if (getComputedStyle(element).position === 'static') {
+		element.style.position = 'relative';
+	}
+
+	const object = document.createElement('object');
+	object.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; pointer-events: none; z-index: -1;');
+	object.type = 'text/html';
+
+	let win;
+
+	object.onload = () => {
+		win = object.contentDocument.defaultView;
+		win.addEventListener('resize', fn);
+	};
+
+	if (/Trident/.test(navigator.userAgent)) {
+		element.appendChild(object);
+		object.data = 'about:blank';
+	} else {
+		object.data = 'about:blank';
+		element.appendChild(object);
+	}
+
+	return {
+		cancel: () => {
+			win.removeEventListener('resize', fn);
+			element.removeChild(object);
+		}
+	};
+}
+
+function linear(t) {
+	return t;
+}
+
+function generateRule({ a, b, delta, duration }, ease, fn) {
+	const step = 16.666 / duration;
+	let keyframes = '{\n';
+
+	for (let p = 0; p <= 1; p += step) {
+		const t = a + delta * ease(p);
+		keyframes += p * 100 + `%{${fn(t, 1 - t)}}\n`;
+	}
+
+	return keyframes + `100% {${fn(b, 1 - b)}}\n}`;
+}
+
+// https://github.com/darkskyapp/string-hash/blob/master/index.js
+function hash(str) {
+	let hash = 5381;
+	let i = str.length;
+
+	while (i--) hash = ((hash << 5) - hash) ^ str.charCodeAt(i);
+	return hash >>> 0;
+}
+
+function wrapTransition(component, node, fn, params, intro) {
+	let obj = fn(node, params);
+	let duration;
+	let ease;
+	let cssText;
+
+	let initialised = false;
+
+	return {
+		t: intro ? 0 : 1,
+		running: false,
+		program: null,
+		pending: null,
+
+		run(b, callback) {
+			if (typeof obj === 'function') {
+				transitionManager.wait().then(() => {
+					obj = obj();
+					this._run(b, callback);
+				});
+			} else {
+				this._run(b, callback);
+			}
+		},
+
+		_run(b, callback) {
+			duration = obj.duration || 300;
+			ease = obj.easing || linear;
+
+			const program = {
+				start: window.performance.now() + (obj.delay || 0),
+				b,
+				callback: callback || noop
+			};
+
+			if (intro && !initialised) {
+				if (obj.css && obj.delay) {
+					cssText = node.style.cssText;
+					node.style.cssText += obj.css(0, 1);
+				}
+
+				if (obj.tick) obj.tick(0, 1);
+				initialised = true;
+			}
+
+			if (!b) {
+				program.group = transitionManager.outros;
+				transitionManager.outros.remaining += 1;
+			}
+
+			if (obj.delay) {
+				this.pending = program;
+			} else {
+				this.start(program);
+			}
+
+			if (!this.running) {
+				this.running = true;
+				transitionManager.add(this);
+			}
+		},
+
+		start(program) {
+			component.fire(`${program.b ? 'intro' : 'outro'}.start`, { node });
+
+			program.a = this.t;
+			program.delta = program.b - program.a;
+			program.duration = duration * Math.abs(program.b - program.a);
+			program.end = program.start + program.duration;
+
+			if (obj.css) {
+				if (obj.delay) node.style.cssText = cssText;
+
+				const rule = generateRule(program, ease, obj.css);
+				transitionManager.addRule(rule, program.name = '__svelte_' + hash(rule));
+
+				node.style.animation = (node.style.animation || '')
+					.split(', ')
+					.filter(anim => anim && (program.delta < 0 || !/__svelte/.test(anim)))
+					.concat(`${program.name} ${program.duration}ms linear 1 forwards`)
+					.join(', ');
+			}
+
+			this.program = program;
+			this.pending = null;
+		},
+
+		update(now) {
+			const program = this.program;
+			if (!program) return;
+
+			const p = now - program.start;
+			this.t = program.a + program.delta * ease(p / program.duration);
+			if (obj.tick) obj.tick(this.t, 1 - this.t);
+		},
+
+		done() {
+			const program = this.program;
+			this.t = program.b;
+
+			if (obj.tick) obj.tick(this.t, 1 - this.t);
+
+			component.fire(`${program.b ? 'intro' : 'outro'}.end`, { node });
+
+			if (!program.b && !program.invalidated) {
+				program.group.callbacks.push(() => {
+					program.callback();
+					if (obj.css) transitionManager.deleteRule(node, program.name);
+				});
+
+				if (--program.group.remaining === 0) {
+					program.group.callbacks.forEach(fn => {
+						fn();
+					});
+				}
+			} else {
+				if (obj.css) transitionManager.deleteRule(node, program.name);
+			}
+
+			this.running = !!this.pending;
+		},
+
+		abort() {
+			if (this.program) {
+				if (obj.tick) obj.tick(1, 0);
+				if (obj.css) transitionManager.deleteRule(node, this.program.name);
+				this.program = this.pending = null;
+				this.running = false;
+			}
+		},
+
+		invalidate() {
+			if (this.program) {
+				this.program.invalidated = true;
+			}
+		}
+	};
+}
+
+var transitionManager = {
+	running: false,
+	transitions: [],
+	bound: null,
+	stylesheet: null,
+	activeRules: {},
+	promise: null,
+
+	add(transition) {
+		this.transitions.push(transition);
+
+		if (!this.running) {
+			this.running = true;
+			requestAnimationFrame(this.bound || (this.bound = this.next.bind(this)));
+		}
+	},
+
+	addRule(rule, name) {
+		if (!this.stylesheet) {
+			const style = createElement('style');
+			document.head.appendChild(style);
+			transitionManager.stylesheet = style.sheet;
+		}
+
+		if (!this.activeRules[name]) {
+			this.activeRules[name] = true;
+			this.stylesheet.insertRule(`@keyframes ${name} ${rule}`, this.stylesheet.cssRules.length);
+		}
+	},
+
+	next() {
+		this.running = false;
+
+		const now = window.performance.now();
+		let i = this.transitions.length;
+
+		while (i--) {
+			const transition = this.transitions[i];
+
+			if (transition.program && now >= transition.program.end) {
+				transition.done();
+			}
+
+			if (transition.pending && now >= transition.pending.start) {
+				transition.start(transition.pending);
+			}
+
+			if (transition.running) {
+				transition.update(now);
+				this.running = true;
+			} else if (!transition.pending) {
+				this.transitions.splice(i, 1);
+			}
+		}
+
+		if (this.running) {
+			requestAnimationFrame(this.bound);
+		} else if (this.stylesheet) {
+			let i = this.stylesheet.cssRules.length;
+			while (i--) this.stylesheet.deleteRule(i);
+			this.activeRules = {};
+		}
+	},
+
+	deleteRule(node, name) {
+		node.style.animation = node.style.animation
+			.split(', ')
+			.filter(anim => anim && anim.indexOf(name) === -1)
+			.join(', ');
+	},
+
+	groupOutros() {
+		this.outros = {
+			remaining: 0,
+			callbacks: []
+		};
+	},
+
+	wait() {
+		if (!transitionManager.promise) {
+			transitionManager.promise = Promise.resolve();
+			transitionManager.promise.then(() => {
+				transitionManager.promise = null;
+			});
+		}
+
+		return transitionManager.promise;
+	}
+};
+
+function wrapAnimation(node, from, fn, params) {
+	if (!from) return;
+
+	const to = node.getBoundingClientRect();
+	if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom) return;
+
+	const info = fn(node, { from, to }, params);
+
+	const duration = 'duration' in info ? info.duration : 300;
+	const delay = 'delay' in info ? info.delay : 0;
+	const ease = info.easing || linear;
+	const start = window.performance.now() + delay;
+	const end = start + duration;
+
+	const program = {
+		a: 0,
+		t: 0,
+		b: 1,
+		delta: 1,
+		duration,
+		start,
+		end
+	};
+
+	const cssText = node.style.cssText;
+
+	const animation = {
+		pending: delay ? program : null,
+		program: delay ? null : program,
+		running: true,
+
+		start() {
+			if (info.css) {
+				if (delay) node.style.cssText = cssText;
+
+				const rule = generateRule(program, ease, info.css);
+				program.name = `__svelte_${hash(rule)}`;
+
+				transitionManager.addRule(rule, program.name);
+
+				node.style.animation = (node.style.animation || '')
+					.split(', ')
+					.filter(anim => anim && (program.delta < 0 || !/__svelte/.test(anim)))
+					.concat(`${program.name} ${program.duration}ms linear 1 forwards`)
+					.join(', ');
+			}
+
+			animation.program = program;
+			animation.pending = null;
+		},
+
+		update: now => {
+			const p = now - program.start;
+			const t = program.a + program.delta * ease(p / program.duration);
+			if (info.tick) info.tick(t, 1 - t);
+		},
+
+		done() {
+			if (info.tick) info.tick(1, 0);
+			animation.stop();
+		},
+
+		stop() {
+			if (info.css) transitionManager.deleteRule(node, program.name);
+			animation.running = false;
+		}
+	};
+
+	transitionManager.add(animation);
+
+	if (info.tick) info.tick(0, 1);
+
+	if (delay) {
+		if (info.css) node.style.cssText += info.css(0, 1);
+	} else {
+		animation.start();
+	}
+
+	return animation;
+}
+
+function fixPosition(node) {
+	const style = getComputedStyle(node);
+
+	if (style.position !== 'absolute' && style.position !== 'fixed') {
+		const { width, height } = style;
+		const a = node.getBoundingClientRect();
+		node.style.position = 'absolute';
+		node.style.width = width;
+		node.style.height = height;
+		const b = node.getBoundingClientRect();
+
+		if (a.left !== b.left || a.top !== b.top) {
+			const style = getComputedStyle(node);
+			const transform = style.transform === 'none' ? '' : style.transform;
+
+			node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;
+		}
+	}
+}
+
+function handlePromise(promise, info) {
+	var token = info.token = {};
+
+	function update(type, index, key, value) {
+		if (info.token !== token) return;
+
+		info.resolved = key && { [key]: value };
+
+		const child_ctx = assign(assign({}, info.ctx), info.resolved);
+		const block = type && (info.current = type)(info.component, child_ctx);
+
+		if (info.block) {
+			if (info.blocks) {
+				info.blocks.forEach((block, i) => {
+					if (i !== index && block) {
+						transitionManager.groupOutros();
+						block.o(() => {
+							block.d(1);
+							info.blocks[i] = null;
+						});
+					}
+				});
+			} else {
+				info.block.d(1);
+			}
+
+			block.c();
+			block[block.i ? 'i' : 'm'](info.mount(), info.anchor);
+
+			info.component.root.set({}); // flush any handlers that were created
+		}
+
+		info.block = block;
+		if (info.blocks) info.blocks[index] = block;
+	}
+
+	if (isPromise(promise)) {
+		promise.then(value => {
+			update(info.then, 1, info.value, value);
+		}, error => {
+			update(info.catch, 2, info.error, error);
+		});
+
+		// if we previously had a then/catch block, destroy it
+		if (info.current !== info.pending) {
+			update(info.pending, 0);
+			return true;
+		}
+	} else {
+		if (info.current !== info.then) {
+			update(info.then, 1, info.value, promise);
+			return true;
+		}
+
+		info.resolved = { [info.value]: promise };
+	}
+}
+
+function destroyBlock(block, lookup) {
+	block.d(1);
+	lookup[block.key] = null;
+}
+
+function outroAndDestroyBlock(block, lookup) {
+	block.o(function() {
+		destroyBlock(block, lookup);
+	});
+}
+
+function fixAndOutroAndDestroyBlock(block, lookup) {
+	block.f();
+	outroAndDestroyBlock(block, lookup);
+}
+
+function updateKeyedEach(old_blocks, component, changed, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, intro_method, next, get_context) {
+	var o = old_blocks.length;
+	var n = list.length;
+
+	var i = o;
+	var old_indexes = {};
+	while (i--) old_indexes[old_blocks[i].key] = i;
+
+	var new_blocks = [];
+	var new_lookup = {};
+	var deltas = {};
+
+	var i = n;
+	while (i--) {
+		var child_ctx = get_context(ctx, list, i);
+		var key = get_key(child_ctx);
+		var block = lookup[key];
+
+		if (!block) {
+			block = create_each_block(component, key, child_ctx);
+			block.c();
+		} else if (dynamic) {
+			block.p(changed, child_ctx);
+		}
+
+		new_blocks[i] = new_lookup[key] = block;
+
+		if (key in old_indexes) deltas[key] = Math.abs(i - old_indexes[key]);
+	}
+
+	var will_move = {};
+	var did_move = {};
+
+	function insert(block) {
+		block[intro_method](node, next);
+		lookup[block.key] = block;
+		next = block.first;
+		n--;
+	}
+
+	while (o && n) {
+		var new_block = new_blocks[n - 1];
+		var old_block = old_blocks[o - 1];
+		var new_key = new_block.key;
+		var old_key = old_block.key;
+
+		if (new_block === old_block) {
+			// do nothing
+			next = new_block.first;
+			o--;
+			n--;
+		}
+
+		else if (!new_lookup[old_key]) {
+			// remove old block
+			destroy(old_block, lookup);
+			o--;
+		}
+
+		else if (!lookup[new_key] || will_move[new_key]) {
+			insert(new_block);
+		}
+
+		else if (did_move[old_key]) {
+			o--;
+
+		} else if (deltas[new_key] > deltas[old_key]) {
+			did_move[new_key] = true;
+			insert(new_block);
+
+		} else {
+			will_move[old_key] = true;
+			o--;
+		}
+	}
+
+	while (o--) {
+		var old_block = old_blocks[o];
+		if (!new_lookup[old_block.key]) destroy(old_block, lookup);
+	}
+
+	while (n) insert(new_blocks[n - 1]);
+
+	return new_blocks;
+}
+
+function measure(blocks) {
+	const rects = {};
+	let i = blocks.length;
+	while (i--) rects[blocks[i].key] = blocks[i].node.getBoundingClientRect();
+	return rects;
+}
+
+function animate(blocks, rects, fn, params) {
+	let i = blocks.length;
+	while (i--) {
+		const block = blocks[i];
+		const from = rects[block.key];
+
+		if (!from) continue;
+		const to = block.node.getBoundingClientRect();
+
+		if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom) continue;
+
+
+	}
+}
+
+function getSpreadUpdate(levels, updates) {
+	var update = {};
+
+	var to_null_out = {};
+	var accounted_for = {};
+
+	var i = levels.length;
+	while (i--) {
+		var o = levels[i];
+		var n = updates[i];
+
+		if (n) {
+			for (var key in o) {
+				if (!(key in n)) to_null_out[key] = 1;
+			}
+
+			for (var key in n) {
+				if (!accounted_for[key]) {
+					update[key] = n[key];
+					accounted_for[key] = 1;
+				}
+			}
+
+			levels[i] = n;
+		} else {
+			for (var key in o) {
+				accounted_for[key] = 1;
+			}
+		}
+	}
+
+	for (var key in to_null_out) {
+		if (!(key in update)) update[key] = undefined;
+	}
+
+	return update;
+}
+
+function spread(args) {
+	const attributes = Object.assign({}, ...args);
+	let str = '';
+
+	Object.keys(attributes).forEach(name => {
+		const value = attributes[name];
+		if (value === undefined) return;
+		if (value === true) str += " " + name;
+		str += " " + name + "=" + JSON.stringify(value);
+	});
+
+	return str;
+}
+
+const escaped = {
+	'"': '&quot;',
+	"'": '&#39;',
+	'&': '&amp;',
+	'<': '&lt;',
+	'>': '&gt;'
+};
+
+function escape(html) {
+	return String(html).replace(/["'&<>]/g, match => escaped[match]);
+}
+
+function each(items, assign, fn) {
+	let str = '';
+	for (let i = 0; i < items.length; i += 1) {
+		str += fn(assign(items[i], i));
+	}
+	return str;
+}
+
+const missingComponent = {
+	_render: () => ''
+};
+
+function blankObject() {
+	return Object.create(null);
+}
+
+function destroy(detach) {
+	this.destroy = noop;
+	this.fire('destroy');
+	this.set = noop;
+
+	this._fragment.d(detach !== false);
+	this._fragment = null;
+	this._state = {};
+}
+
+function destroyDev(detach) {
+	destroy.call(this, detach);
+	this.destroy = function() {
+		console.warn('Component was already destroyed');
+	};
+}
+
+function _differs(a, b) {
+	return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');
+}
+
+function _differsImmutable(a, b) {
+	return a != a ? b == b : a !== b;
+}
+
+function fire(eventName, data) {
+	var handlers =
+		eventName in this._handlers && this._handlers[eventName].slice();
+	if (!handlers) return;
+
+	for (var i = 0; i < handlers.length; i += 1) {
+		var handler = handlers[i];
+
+		if (!handler.__calling) {
+			handler.__calling = true;
+			handler.call(this, data);
+			handler.__calling = false;
+		}
+	}
+}
+
+function get() {
+	return this._state;
+}
+
+function init(component, options) {
+	component._handlers = blankObject();
+	component._bind = options._bind;
+
+	component.options = options;
+	component.root = options.root || component;
+	component.store = component.root.store || options.store;
+}
+
+function on(eventName, handler) {
+	var handlers = this._handlers[eventName] || (this._handlers[eventName] = []);
+	handlers.push(handler);
+
+	return {
+		cancel: function() {
+			var index = handlers.indexOf(handler);
+			if (~index) handlers.splice(index, 1);
+		}
+	};
+}
+
+function run(fn) {
+	fn();
+}
+
+function set(newState) {
+	this._set(assign({}, newState));
+	if (this.root._lock) return;
+	this.root._lock = true;
+	callAll(this.root._beforecreate);
+	callAll(this.root._oncreate);
+	callAll(this.root._aftercreate);
+	this.root._lock = false;
+}
+
+function _set(newState) {
+	var oldState = this._state,
+		changed = {},
+		dirty = false;
+
+	for (var key in newState) {
+		if (this._differs(newState[key], oldState[key])) changed[key] = dirty = true;
+	}
+	if (!dirty) return;
+
+	this._state = assign(assign({}, oldState), newState);
+	this._recompute(changed, this._state);
+	if (this._bind) this._bind(changed, this._state);
+
+	if (this._fragment) {
+		this.fire("state", { changed: changed, current: this._state, previous: oldState });
+		this._fragment.p(changed, this._state);
+		this.fire("update", { changed: changed, current: this._state, previous: oldState });
+	}
+}
+
+function setDev(newState) {
+	if (typeof newState !== 'object') {
+		throw new Error(
+			this._debugName + '.set was called without an object of data key-values to update.'
+		);
+	}
+
+	this._checkReadOnly(newState);
+	set.call(this, newState);
+}
+
+function callAll(fns) {
+	while (fns && fns.length) fns.shift()();
+}
+
+function _mount(target, anchor) {
+	this._fragment[this._fragment.i ? 'i' : 'm'](target, anchor || null);
+}
+
+var PENDING = {};
+var SUCCESS = {};
+var FAILURE = {};
+
+function removeFromStore() {
+	this.store._remove(this);
+}
+
+var proto = {
+	destroy,
+	get,
+	fire,
+	on,
+	set,
+	_recompute: noop,
+	_set,
+	_mount,
+	_differs
+};
+
+var protoDev = {
+	destroy: destroyDev,
+	get,
+	fire,
+	on,
+	set: setDev,
+	_recompute: noop,
+	_set,
+	_mount,
+	_differs
+};
+
+export { blankObject, destroy, destroyDev, _differs, _differsImmutable, fire, get, init, on, run, set, _set, setDev, callAll, _mount, PENDING, SUCCESS, FAILURE, removeFromStore, proto, protoDev, wrapAnimation, fixPosition, handlePromise, appendNode, insertNode, detachNode, detachBetween, detachBefore, detachAfter, reinsertBetween, reinsertChildren, reinsertAfter, reinsertBefore, destroyEach, createFragment, createElement, createSvgElement, createText, createComment, addListener, removeListener, setAttribute, setAttributes, removeAttribute, setXlinkAttribute, getBindingGroupValue, toNumber, timeRangesToArray, children, claimElement, claimText, setInputType, setStyle, selectOption, selectOptions, selectValue, selectMultipleValue, addResizeListener, destroyBlock, outroAndDestroyBlock, fixAndOutroAndDestroyBlock, updateKeyedEach, measure, animate, getSpreadUpdate, spread, escaped, escape, each, missingComponent, linear, generateRule, hash, wrapTransition, transitionManager, noop, assign, assignTrue, isPromise, callAfter };

+ 51 - 0
node_modules/svelte/ssr/register.js

@@ -0,0 +1,51 @@
+'use strict';
+
+var fs = require('fs');
+var path = require('path');
+var index_ts = require('../compiler/svelte.js');
+
+var compileOptions = {
+	extensions: ['.html']
+};
+
+function capitalise(name) {
+	return name[0].toUpperCase() + name.slice(1);
+}
+
+function register(options) {
+	if (options.extensions) {
+		compileOptions.extensions.forEach(deregisterExtension);
+		options.extensions.forEach(registerExtension);
+	}
+
+	compileOptions = options;
+}
+
+function deregisterExtension(extension) {
+	delete require.extensions[extension];
+}
+
+function registerExtension(extension) {
+	require.extensions[extension] = function(module, filename) {
+		var name = path.basename(filename)
+			.slice(0, -path.extname(filename).length)
+			.replace(/^\d/, '_$&')
+			.replace(/[^a-zA-Z0-9_$]/g, '');
+
+		var options = Object.assign({}, compileOptions, {
+			filename,
+			name: capitalise(name),
+			generate: 'ssr'
+		});
+
+		var ref = index_ts.compile(fs.readFileSync(filename, 'utf-8'), options);
+		var js = ref.js;
+
+		return module._compile(js.code, filename);
+	};
+}
+
+registerExtension('.html');
+
+module.exports = register;
+//# sourceMappingURL=register.js.map

File diff suppressed because it is too large
+ 0 - 0
node_modules/svelte/ssr/register.js.map


+ 169 - 0
node_modules/svelte/store.js

@@ -0,0 +1,169 @@
+import {
+	assign,
+	blankObject,
+	_differs,
+	_differsImmutable,
+	get,
+	on,
+	fire
+} from './shared.js';
+
+function Store(state, options) {
+	this._handlers = {};
+	this._dependents = [];
+
+	this._computed = blankObject();
+	this._sortedComputedProperties = [];
+
+	this._state = assign({}, state);
+	this._differs = options && options.immutable ? _differsImmutable : _differs;
+}
+
+assign(Store.prototype, {
+	_add(component, props) {
+		this._dependents.push({
+			component: component,
+			props: props
+		});
+	},
+
+	_init(props) {
+		const state = {};
+		for (let i = 0; i < props.length; i += 1) {
+			const prop = props[i];
+			state['$' + prop] = this._state[prop];
+		}
+		return state;
+	},
+
+	_remove(component) {
+		let i = this._dependents.length;
+		while (i--) {
+			if (this._dependents[i].component === component) {
+				this._dependents.splice(i, 1);
+				return;
+			}
+		}
+	},
+
+	_set(newState, changed) {
+		const previous = this._state;
+		this._state = assign(assign({}, previous), newState);
+
+		for (let i = 0; i < this._sortedComputedProperties.length; i += 1) {
+			this._sortedComputedProperties[i].update(this._state, changed);
+		}
+
+		this.fire('state', {
+			changed,
+			previous,
+			current: this._state
+		});
+
+		const dependents = this._dependents.slice(); // guard against mutations
+		for (let i = 0; i < dependents.length; i += 1) {
+			const dependent = dependents[i];
+			const componentState = {};
+			let dirty = false;
+
+			for (let j = 0; j < dependent.props.length; j += 1) {
+				const prop = dependent.props[j];
+				if (prop in changed) {
+					componentState['$' + prop] = this._state[prop];
+					dirty = true;
+				}
+			}
+
+			if (dirty) dependent.component.set(componentState);
+		}
+
+		this.fire('update', {
+			changed,
+			previous,
+			current: this._state
+		});
+	},
+
+	_sortComputedProperties() {
+		const computed = this._computed;
+		const sorted = this._sortedComputedProperties = [];
+		const visited = blankObject();
+		let currentKey;
+
+		function visit(key) {
+			const c = computed[key];
+
+			if (c) {
+				c.deps.forEach(dep => {
+					if (dep === currentKey) {
+						throw new Error(`Cyclical dependency detected between ${dep} <-> ${key}`);
+					}
+
+					visit(dep);
+				});
+
+				if (!visited[key]) {
+					visited[key] = true;
+					sorted.push(c);
+				}
+			}
+		}
+
+		for (const key in this._computed) {
+			visit(currentKey = key);
+		}
+	},
+
+	compute(key, deps, fn) {
+		let value;
+
+		const c = {
+			deps,
+			update: (state, changed, dirty) => {
+				const values = deps.map(dep => {
+					if (dep in changed) dirty = true;
+					return state[dep];
+				});
+
+				if (dirty) {
+					const newValue = fn.apply(null, values);
+					if (this._differs(newValue, value)) {
+						value = newValue;
+						changed[key] = true;
+						state[key] = value;
+					}
+				}
+			}
+		};
+
+		this._computed[key] = c;
+		this._sortComputedProperties();
+
+		const state = assign({}, this._state);
+		const changed = {};
+		c.update(state, changed, true);
+		this._set(state, changed);
+	},
+
+	fire,
+
+	get,
+
+	on,
+
+	set(newState) {
+		const oldState = this._state;
+		const changed = this._changed = {};
+		let dirty = false;
+
+		for (const key in newState) {
+			if (this._computed[key]) throw new Error(`'${key}' is a read-only property`);
+			if (this._differs(newState[key], oldState[key])) changed[key] = dirty = true;
+		}
+		if (!dirty) return;
+
+		this._set(newState, changed);
+	}
+});
+
+export { Store };

+ 218 - 0
node_modules/svelte/store.umd.js

@@ -0,0 +1,218 @@
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+	typeof define === 'function' && define.amd ? define(['exports'], factory) :
+	(factory((global.svelte = global.svelte || {})));
+}(this, (function (exports) { 'use strict';
+
+	function assign(tar, src) {
+		for (var k in src) tar[k] = src[k];
+		return tar;
+	}
+
+	function blankObject() {
+		return Object.create(null);
+	}
+
+	function _differs(a, b) {
+		return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');
+	}
+
+	function _differsImmutable(a, b) {
+		return a != a ? b == b : a !== b;
+	}
+
+	function fire(eventName, data) {
+		var handlers =
+			eventName in this._handlers && this._handlers[eventName].slice();
+		if (!handlers) return;
+
+		for (var i = 0; i < handlers.length; i += 1) {
+			var handler = handlers[i];
+
+			if (!handler.__calling) {
+				handler.__calling = true;
+				handler.call(this, data);
+				handler.__calling = false;
+			}
+		}
+	}
+
+	function get() {
+		return this._state;
+	}
+
+	function on(eventName, handler) {
+		var handlers = this._handlers[eventName] || (this._handlers[eventName] = []);
+		handlers.push(handler);
+
+		return {
+			cancel: function() {
+				var index = handlers.indexOf(handler);
+				if (~index) handlers.splice(index, 1);
+			}
+		};
+	}
+
+	function Store(state, options) {
+		this._handlers = {};
+		this._dependents = [];
+
+		this._computed = blankObject();
+		this._sortedComputedProperties = [];
+
+		this._state = assign({}, state);
+		this._differs = options && options.immutable ? _differsImmutable : _differs;
+	}
+
+	assign(Store.prototype, {
+		_add(component, props) {
+			this._dependents.push({
+				component: component,
+				props: props
+			});
+		},
+
+		_init(props) {
+			const state = {};
+			for (let i = 0; i < props.length; i += 1) {
+				const prop = props[i];
+				state['$' + prop] = this._state[prop];
+			}
+			return state;
+		},
+
+		_remove(component) {
+			let i = this._dependents.length;
+			while (i--) {
+				if (this._dependents[i].component === component) {
+					this._dependents.splice(i, 1);
+					return;
+				}
+			}
+		},
+
+		_set(newState, changed) {
+			const previous = this._state;
+			this._state = assign(assign({}, previous), newState);
+
+			for (let i = 0; i < this._sortedComputedProperties.length; i += 1) {
+				this._sortedComputedProperties[i].update(this._state, changed);
+			}
+
+			this.fire('state', {
+				changed,
+				previous,
+				current: this._state
+			});
+
+			const dependents = this._dependents.slice(); // guard against mutations
+			for (let i = 0; i < dependents.length; i += 1) {
+				const dependent = dependents[i];
+				const componentState = {};
+				let dirty = false;
+
+				for (let j = 0; j < dependent.props.length; j += 1) {
+					const prop = dependent.props[j];
+					if (prop in changed) {
+						componentState['$' + prop] = this._state[prop];
+						dirty = true;
+					}
+				}
+
+				if (dirty) dependent.component.set(componentState);
+			}
+
+			this.fire('update', {
+				changed,
+				previous,
+				current: this._state
+			});
+		},
+
+		_sortComputedProperties() {
+			const computed = this._computed;
+			const sorted = this._sortedComputedProperties = [];
+			const visited = blankObject();
+			let currentKey;
+
+			function visit(key) {
+				const c = computed[key];
+
+				if (c) {
+					c.deps.forEach(dep => {
+						if (dep === currentKey) {
+							throw new Error(`Cyclical dependency detected between ${dep} <-> ${key}`);
+						}
+
+						visit(dep);
+					});
+
+					if (!visited[key]) {
+						visited[key] = true;
+						sorted.push(c);
+					}
+				}
+			}
+
+			for (const key in this._computed) {
+				visit(currentKey = key);
+			}
+		},
+
+		compute(key, deps, fn) {
+			let value;
+
+			const c = {
+				deps,
+				update: (state, changed, dirty) => {
+					const values = deps.map(dep => {
+						if (dep in changed) dirty = true;
+						return state[dep];
+					});
+
+					if (dirty) {
+						const newValue = fn.apply(null, values);
+						if (this._differs(newValue, value)) {
+							value = newValue;
+							changed[key] = true;
+							state[key] = value;
+						}
+					}
+				}
+			};
+
+			this._computed[key] = c;
+			this._sortComputedProperties();
+
+			const state = assign({}, this._state);
+			const changed = {};
+			c.update(state, changed, true);
+			this._set(state, changed);
+		},
+
+		fire,
+
+		get,
+
+		on,
+
+		set(newState) {
+			const oldState = this._state;
+			const changed = this._changed = {};
+			let dirty = false;
+
+			for (const key in newState) {
+				if (this._computed[key]) throw new Error(`'${key}' is a read-only property`);
+				if (this._differs(newState[key], oldState[key])) changed[key] = dirty = true;
+			}
+			if (!dirty) return;
+
+			this._set(newState, changed);
+		}
+	});
+
+	exports.Store = Store;
+
+	Object.defineProperty(exports, '__esModule', { value: true });
+
+})));

+ 2 - 0
node_modules/svelte/svelte

@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+require('./cli/index.ts.js');

+ 21 - 0
node_modules/textarea-editor/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Eivind Fjeldstad
+
+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.

+ 476 - 0
node_modules/textarea-editor/build/editor.js

@@ -0,0 +1,476 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.Formats = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _escapeStringRegexp = require('escape-string-regexp');
+
+var _escapeStringRegexp2 = _interopRequireDefault(_escapeStringRegexp);
+
+var _formats = require('./formats');
+
+var _formats2 = _interopRequireDefault(_formats);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * TextareaEditor class.
+ *
+ * @param {HTMLElement} el - the textarea element to wrap around
+ */
+
+var TextareaEditor = function () {
+  function TextareaEditor(el) {
+    _classCallCheck(this, TextareaEditor);
+
+    this.el = el;
+  }
+
+  /**
+   * Set or get selection range.
+   *
+   * @param {Array} [range]
+   * @return {Array|TextareaEditor}
+   */
+
+  _createClass(TextareaEditor, [{
+    key: 'range',
+    value: function range(_range) {
+      var el = this.el;
+
+      if (_range == null) {
+        return [el.selectionStart || 0, el.selectionEnd || 0];
+      }
+
+      this.focus();
+
+      var _range2 = _slicedToArray(_range, 2);
+
+      el.selectionStart = _range2[0];
+      el.selectionEnd = _range2[1];
+
+      return this;
+    }
+
+    /**
+     * Insert given text at the current cursor position.
+     *
+     * @param {String} text - text to insert
+     * @return {TextareaEditor}
+     */
+
+  }, {
+    key: 'insert',
+    value: function insert(text) {
+      var inserted = true;
+      this.el.contentEditable = true;
+      this.focus();
+
+      try {
+        document.execCommand('insertText', false, text);
+      } catch (e) {
+        inserted = false;
+      }
+
+      this.el.contentEditable = false;
+
+      if (inserted) return this;
+
+      try {
+        document.execCommand('ms-beginUndoUnit');
+      } catch (e) {}
+
+      var _selection = this.selection(),
+          before = _selection.before,
+          after = _selection.after;
+
+      this.el.value = before + text + after;
+
+      try {
+        document.execCommand('ms-endUndoUnit');
+      } catch (e) {}
+
+      var event = document.createEvent('Event');
+      event.initEvent('input', true, true);
+      this.el.dispatchEvent(event);
+      return this;
+    }
+
+    /**
+     * Set foucs on the TextareaEditor's element.
+     *
+     * @return {TextareaEditor}
+     */
+
+  }, {
+    key: 'focus',
+    value: function focus() {
+      if (document.activeElement !== this.el) this.el.focus();
+      return this;
+    }
+
+    /**
+     * Get selected text.
+     *
+     * @return {Object}
+     * @private
+     */
+
+  }, {
+    key: 'selection',
+    value: function selection() {
+      var _range3 = this.range(),
+          _range4 = _slicedToArray(_range3, 2),
+          start = _range4[0],
+          end = _range4[1];
+
+      var value = normalizeNewlines(this.el.value);
+      return {
+        before: value.slice(0, start),
+        content: value.slice(start, end),
+        after: value.slice(end)
+      };
+    }
+
+    /**
+     * Get format by name.
+     *
+     * @param {String|Object} format
+     * @return {Object}
+     * @private
+     */
+
+  }, {
+    key: 'getFormat',
+    value: function getFormat(format) {
+      if ((typeof format === 'undefined' ? 'undefined' : _typeof(format)) == 'object') {
+        return normalizeFormat(format);
+      }
+
+      if (!_formats2.default.hasOwnProperty(format)) {
+        throw new Error('Invalid format ' + format);
+      }
+
+      return normalizeFormat(_formats2.default[format]);
+    }
+
+    /**
+     * Toggle given `format` on current selection.
+     * Any additional arguments are passed on to `.format()`.
+     *
+     * @param {String|Object} format - name of format or an object
+     * @return {TextareaEditor}
+     */
+
+  }, {
+    key: 'toggle',
+    value: function toggle(format) {
+      if (this.hasFormat(format)) return this.unformat(format);
+
+      for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+        args[_key - 1] = arguments[_key];
+      }
+
+      return this.format.apply(this, [format].concat(args));
+    }
+
+    /**
+     * Format current selcetion with given `format`.
+     *
+     * @param {String|Object} name - name of format or an object
+     * @return {TextareaEditor}
+     */
+
+  }, {
+    key: 'format',
+    value: function format(name) {
+      for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+        args[_key2 - 1] = arguments[_key2];
+      }
+
+      var format = this.getFormat(name);
+      var prefix = format.prefix,
+          suffix = format.suffix,
+          multiline = format.multiline;
+
+      var _selection2 = this.selection(),
+          before = _selection2.before,
+          content = _selection2.content,
+          after = _selection2.after;
+
+      var lines = multiline ? content.split('\n') : [content];
+
+      var _range5 = this.range(),
+          _range6 = _slicedToArray(_range5, 2),
+          start = _range6[0],
+          end = _range6[1];
+
+      // format lines
+
+
+      lines = lines.map(function (line, i) {
+        var pval = maybeCall.apply(undefined, [prefix.value, line, i + 1].concat(args));
+        var sval = maybeCall.apply(undefined, [suffix.value, line, i + 1].concat(args));
+
+        if (!multiline || !content.length) {
+          start += pval.length;
+          end += pval.length;
+        } else {
+          end += pval.length + sval.length;
+        }
+
+        return pval + line + sval;
+      });
+
+      var insert = lines.join('\n');
+
+      // newlines before and after block
+      if (format.block) {
+        var nlb = matchLength(before, /\n+$/);
+        var nla = matchLength(after, /^\n+/);
+
+        if (before) {
+          while (nlb < 2) {
+            insert = '\n' + insert;
+            start++;
+            end++;
+            nlb++;
+          }
+        }
+
+        if (after) {
+          while (nla < 2) {
+            insert = insert + '\n';
+            nla++;
+          }
+        }
+      }
+
+      this.insert(insert);
+      this.range([start, end]);
+      return this;
+    }
+
+    /**
+     * Remove given `format` from current selection.
+     *
+     * @param {String|Object} name - name of format or an object
+     * @return {TextareaEditor}
+     */
+
+  }, {
+    key: 'unformat',
+    value: function unformat(name) {
+      if (!this.hasFormat(name)) return this;
+
+      var format = this.getFormat(name);
+
+      var prefix = format.prefix,
+          suffix = format.suffix,
+          multiline = format.multiline;
+
+      var _selection3 = this.selection(),
+          before = _selection3.before,
+          content = _selection3.content,
+          after = _selection3.after;
+
+      var lines = multiline ? content.split('\n') : [content];
+
+      var _range7 = this.range(),
+          _range8 = _slicedToArray(_range7, 2),
+          start = _range8[0],
+          end = _range8[1];
+
+      // If this is not a multiline format, include prefixes and suffixes just
+      // outside the selection.
+
+
+      if ((!multiline || lines.length == 1) && hasSuffix(before, prefix) && hasPrefix(after, suffix)) {
+        start -= suffixLength(before, prefix);
+        end += prefixLength(after, suffix);
+        this.range([start, end]);
+        lines = [this.selection().content];
+      }
+
+      // remove formatting from lines
+      lines = lines.map(function (line) {
+        var plen = prefixLength(line, prefix);
+        var slen = suffixLength(line, suffix);
+        return line.slice(plen, line.length - slen);
+      });
+
+      // insert and set selection
+      var insert = lines.join('\n');
+      this.insert(insert);
+      this.range([start, start + insert.length]);
+
+      return this;
+    }
+
+    /**
+     * Check if current seletion has given format.
+     *
+     * @param {String|Object} name - name of format or an object
+     * @return {Boolean}
+     */
+
+  }, {
+    key: 'hasFormat',
+    value: function hasFormat(name) {
+      var format = this.getFormat(name);
+      var prefix = format.prefix,
+          suffix = format.suffix,
+          multiline = format.multiline;
+
+      var _selection4 = this.selection(),
+          before = _selection4.before,
+          content = _selection4.content,
+          after = _selection4.after;
+
+      var lines = content.split('\n');
+
+      // prefix and suffix outside selection
+      if (!multiline || lines.length == 1) {
+        return hasSuffix(before, prefix) && hasPrefix(after, suffix) || hasPrefix(content, prefix) && hasSuffix(content, suffix);
+      }
+
+      // check which line(s) are formatted
+      var formatted = lines.filter(function (line) {
+        return hasPrefix(line, prefix) && hasSuffix(line, suffix);
+      });
+
+      return formatted.length === lines.length;
+    }
+  }]);
+
+  return TextareaEditor;
+}();
+
+// Expose formats
+
+
+exports.default = TextareaEditor;
+exports.Formats = _formats2.default;
+
+/**
+ * Check if given prefix is present.
+ * @private
+ */
+
+function hasPrefix(text, prefix) {
+  var exp = new RegExp('^' + prefix.pattern);
+  var result = exp.test(text);
+
+  if (prefix.antipattern) {
+    var _exp = new RegExp('^' + prefix.antipattern);
+    result = result && !_exp.test(text);
+  }
+
+  return result;
+}
+
+/**
+ * Check if given suffix is present.
+ * @private
+ */
+
+function hasSuffix(text, suffix) {
+  var exp = new RegExp(suffix.pattern + '$');
+  var result = exp.test(text);
+
+  if (suffix.antipattern) {
+    var _exp2 = new RegExp(suffix.antipattern + '$');
+    result = result && !_exp2.test(text);
+  }
+
+  return result;
+}
+
+/**
+ * Get length of match.
+ * @private
+ */
+
+function matchLength(text, exp) {
+  var match = text.match(exp);
+  return match ? match[0].length : 0;
+}
+
+/**
+ * Get prefix length.
+ * @private
+ */
+
+function prefixLength(text, prefix) {
+  var exp = new RegExp('^' + prefix.pattern);
+  return matchLength(text, exp);
+}
+
+/**
+ * Get suffix length.
+ * @private
+ */
+
+function suffixLength(text, suffix) {
+  var exp = new RegExp(suffix.pattern + '$');
+  return matchLength(text, exp);
+}
+
+/**
+ * Normalize newlines.
+ * @private
+ */
+
+function normalizeNewlines(str) {
+  return str.replace('\r\n', '\n');
+}
+
+/**
+ * Normalize format.
+ * @private
+ */
+
+function normalizeFormat(format) {
+  var clone = Object.assign({}, format);
+  clone.prefix = normalizePrefixSuffix(format.prefix);
+  clone.suffix = normalizePrefixSuffix(format.suffix);
+  return clone;
+}
+
+/**
+ * Normalize prefixes and suffixes.
+ * @private
+ */
+
+function normalizePrefixSuffix() {
+  var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
+
+  if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) == 'object') return value;
+  return {
+    value: value,
+    pattern: (0, _escapeStringRegexp2.default)(value)
+  };
+}
+
+/**
+ * Call if function.
+ * @private
+ */
+
+function maybeCall(value) {
+  for (var _len3 = arguments.length, args = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
+    args[_key3 - 1] = arguments[_key3];
+  }
+
+  return typeof value == 'function' ? value.apply(undefined, args) : value;
+}

+ 265 - 0
node_modules/textarea-editor/build/formats.js

@@ -0,0 +1,265 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+/**
+ * Default formats.
+ */
+
+var Formats = {
+  /**
+   * Bold text.
+   *
+   * @example
+   * editor.format('bold');
+   * assert(textarea.value == '**Hello World**')
+   */
+
+  bold: {
+    prefix: '**',
+    suffix: '**'
+  },
+
+  /**
+   * Italic text.
+   *
+   * @example
+   * editor.format('italic');
+   * assert(textarea.value == '_Hello World_')
+   */
+
+  italic: {
+    prefix: '_',
+    suffix: '_'
+  },
+
+  /**
+   * Strikethrough text.
+   *
+   * @example
+   * editor.format('strikethrough');
+   * assert(textarea.value == '~~Hello World~~')
+   */
+
+  strikethrough: {
+    prefix: '~~',
+    suffix: '~~'
+  },
+
+  /**
+   * Insert link.
+   *
+   * @example
+   * editor.format('link', '/example');
+   * assert(textarea.value == '[Hello World](/example)')
+   */
+
+  link: {
+    prefix: {
+      value: '[',
+      pattern: '\\[',
+      antipattern: '\\!\\['
+    },
+    suffix: {
+      value: function value(text, n, url) {
+        return '](' + url + ')';
+      },
+      pattern: '\\]\\([^()]*?\\)'
+    }
+  },
+
+  /**
+   * Insert image.
+   *
+   * @example
+   * editor.format('image', '/example.png');
+   * assert(textarea.value == '![Hello World](/example.png)')
+   */
+
+  image: {
+    prefix: '![',
+    suffix: {
+      value: function value(text, n, url) {
+        return '](' + url + ')';
+      },
+      pattern: '\\]\\([^()]*?\\)'
+    }
+  },
+
+  /**
+   * Header 1.
+   *
+   * @example
+   * editor.format('header1');
+   * assert(textarea.value == '# Hello World')
+   */
+
+  header1: {
+    prefix: {
+      value: '# ',
+      pattern: '# ',
+      antipattern: '[#]{2,} '
+    }
+  },
+
+  /**
+   * Header 2.
+   *
+   * @example
+   * editor.format('header2');
+   * assert(textarea.value == '## Hello World')
+   */
+
+  header2: {
+    prefix: {
+      value: '## ',
+      pattern: '## ',
+      antipattern: '[#]{3,} '
+    }
+  },
+
+  /**
+   * Header 3.
+   *
+   * @example
+   * editor.format('header3');
+   * assert(textarea.value == '### Hello World')
+   */
+
+  header3: {
+    prefix: {
+      value: '### ',
+      pattern: '### ',
+      antipattern: '[#]{4,} '
+    }
+  },
+
+  /**
+   * Header 4.
+   *
+   * @example
+   * editor.format('header4');
+   * assert(textarea.value == '#### Hello World')
+   */
+
+  header4: {
+    prefix: {
+      value: '#### ',
+      pattern: '#### ',
+      antipattern: '[#]{5,} '
+    }
+  },
+
+  /**
+   * Header 5.
+   *
+   * @example
+   * editor.format('header5');
+   * assert(textarea.value == '##### Hello World')
+   */
+
+  header5: {
+    prefix: {
+      value: '##### ',
+      pattern: '##### ',
+      antipattern: '[#]{6,} '
+    }
+  },
+
+  /**
+   * Header 6.
+   *
+   * @example
+   * editor.format('header6');
+   * assert(textarea.value == '###### Hello World')
+   */
+
+  header6: {
+    prefix: {
+      value: '###### ',
+      pattern: '###### ',
+      antipattern: '[#]{7,} '
+    }
+  },
+
+  /**
+   * Insert code block.
+   *
+   * @example
+   * editor.format('code');
+   * assert(textarea.value == '```\nHello World\n```')
+   */
+
+  code: {
+    block: true,
+    prefix: '```\n',
+    suffix: '\n```'
+  },
+
+  /**
+   * Ordered list.
+   *
+   * @example
+   * editor.format('orderedList');
+   * assert(textarea.value == '1. Hello World')
+   */
+
+  orderedList: {
+    block: true,
+    multiline: true,
+    prefix: {
+      value: function value(line, n) {
+        return n + '. ';
+      },
+      pattern: '[0-9]+\\. '
+    }
+  },
+
+  /**
+   * Unordered list.
+   *
+   * @example
+   * editor.format('unorderedList');
+   * assert(textarea.value == '- Hello World')
+   */
+
+  unorderedList: {
+    block: true,
+    multiline: true,
+    prefix: '- '
+  },
+
+  /**
+   * Task list.
+   *
+   * @example
+   * editor.format('taskList');
+   * assert(textarea.value == '- [ ] Hello World')
+   */
+
+  taskList: {
+    block: true,
+    multiline: true,
+    prefix: {
+      value: '- [ ] ',
+      pattern: '- \\[[x ]{1}\\] '
+    }
+  },
+
+  /**
+   * Blockquote.
+   *
+   * @example
+   * editor.format('blockquote');
+   * assert(textarea.value == '> Hello World')
+   */
+
+  blockquote: {
+    block: true,
+    multiline: true,
+    prefix: '> '
+  }
+};
+
+exports.default = Formats;

+ 91 - 0
node_modules/textarea-editor/package.json

@@ -0,0 +1,91 @@
+{
+  "_from": "textarea-editor",
+  "_id": "textarea-editor@2.1.1",
+  "_inBundle": false,
+  "_integrity": "sha512-k+hhOXPlH0TwXr8fuYtu+tq8JgfRcqxFghf9QGVI7zXcW5OzCH6x5SKXQMk5GOE0vym9t1e7WxnNwJjJE/Rn+A==",
+  "_location": "/textarea-editor",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "textarea-editor",
+    "name": "textarea-editor",
+    "escapedName": "textarea-editor",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/textarea-editor/-/textarea-editor-2.1.1.tgz",
+  "_shasum": "57c8ad3ebae8d8589cb8a71572d201a942fb11db",
+  "_spec": "textarea-editor",
+  "_where": "/home/zorro/Documents/Sahib/zweiachtzehn",
+  "author": {
+    "name": "Eivind Fjeldstad",
+    "email": "eivind.fjeldstad@gmail.com"
+  },
+  "bugs": {
+    "url": "https://github.com/eivindfjeldstad/textarea-editor/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "escape-string-regexp": "^1.0.5"
+  },
+  "deprecated": false,
+  "description": "Simple markdown editor for textareas",
+  "devDependencies": {
+    "babel-cli": "^6.26.0",
+    "babel-core": "^6.26.0",
+    "babel-jest": "^22.4.3",
+    "babel-preset-env": "^1.6.1",
+    "documentation": "^6.2.0",
+    "eslint": "^4.19.1",
+    "eslint-config-standard": "^11.0.0",
+    "eslint-plugin-import": "^2.11.0",
+    "eslint-plugin-node": "^6.0.1",
+    "eslint-plugin-promise": "^3.7.0",
+    "eslint-plugin-standard": "^3.0.1",
+    "jest": "^22.4.3",
+    "parcel-bundler": "^1.7.1"
+  },
+  "files": [
+    "build"
+  ],
+  "homepage": "https://github.com/eivindfjeldstad/textarea-editor#readme",
+  "jest": {
+    "testMatch": [
+      "**/test/**/*.js"
+    ],
+    "coverageReporters": [
+      "text-summary",
+      "lcov"
+    ],
+    "bail": true,
+    "testEnvironment": "jsdom"
+  },
+  "keywords": [
+    "textarea",
+    "markdown",
+    "editor"
+  ],
+  "license": "MIT",
+  "main": "build/editor.js",
+  "name": "textarea-editor",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/eivindfjeldstad/textarea-editor.git"
+  },
+  "scripts": {
+    "build": "babel -d build src",
+    "docs": "documentation readme ./src/*.js --section=API",
+    "lint": "eslint src test",
+    "prepublish": "yarn run build",
+    "start": "parcel example/index.html -p 3000 -d example/build --open --no-cache",
+    "test": "jest",
+    "test-cov": "jest --coverage --runInBand --forceExit"
+  },
+  "version": "2.1.1"
+}

+ 362 - 0
node_modules/textarea-editor/readme.md

@@ -0,0 +1,362 @@
+# textarea-editor
+
+Simple markdown editor for textareas, without a UI. Inspired by Github's comment editor.
+
+[![npm version](http://img.shields.io/npm/v/textarea-editor.svg?style=flat-square)](https://npmjs.org/package/textarea-editor)
+[![Build Status](http://img.shields.io/travis/eivindfjeldstad/textarea-editor.svg?style=flat-square)](https://travis-ci.org/eivindfjeldstad/textarea-editor)
+[![Codecov](https://img.shields.io/codecov/c/github/eivindfjeldstad/validate.svg?style=flat-square)](https://codecov.io/gh/eivindfjeldstad/textarea-editor)
+
+## Usage
+
+```js
+import TextareaEditor from 'textarea-editor';
+const textarea = document.querySelector('textarea');
+const editor = new TextareaEditor(textarea);
+
+editor.insert('Hello world!');
+editor.range([0, 5]);
+editor.format('bold');
+assert(textarea.value == '**Hello** world!');
+
+editor.unformat('bold');
+editor.format('italic');
+assert(textarea.value == '_Hello_ world!');
+```
+
+For an example with a UI, see the `example` folder or run `yarn start`.
+
+All default formats are exposed, and can easily be modified or extended.
+
+### Custom formats
+
+A format should be an object with the following properties:
+
+-   `block` - (Optional) A boolean indicating whether or not this is a block, and should be newline separated from the rest of the text (e.g. code block).
+-   `multiline` - (Optional) A boolean indicating whether or not this is a multiline format (e.g. ordered list).
+-   `prefix`
+    -   `value` - A string or a function that generates a value (useful for prefixes that change based on line number, such as ordered lists). The function gets called for each line in the current selection (unless `.multiline` is `false`, in which case the entire selected text is passed), and is given the line, the line number, and any additional arguments passed to `.format()`.
+    -   `pattern` - A string containing a pattern that identifies the prefix when used in a regular expression (double escape special chars).
+    -   `antipattern` - (Optional) A string containing a pattern that identifies prefixes that would be found by `.pattern`, but should be ignored because they are part of other prefixes (e.g `##` would match parts of `###`). This is a very ugly hack, should find a better way to solve this in the future.
+-   `suffix`
+    -   Same properties as `.prefix`, but gets inserted after the current selection.
+
+#### Example
+
+```js
+textarea.value = 'Hello\nWorld';
+
+const orderedList = {
+  block: true,
+  multiline: true,
+  prefix: {
+    value: (line, no) => `${no}. `,
+    pattern: '[0-9]+\\. '
+  }
+};
+
+editor.range([0, textarea.value.length])
+editor.format(orderedList);
+assert(textarea.value == '1. Hello\n2. World');
+```
+
+Simple formats can be defined by giving `.prefix` and `.suffix` a string value.
+
+```js
+textarea.value = 'Hello World';
+editor.range([0, textarea.value.length]);
+editor.format({ prefix: '#{', suffix: '}' });
+assert(textarea.value == '#{Hello World}');
+```
+
+## API
+
+<!-- Generated by documentation.js. Update this documentation by updating the source code. -->
+
+#### Table of Contents
+
+-   [TextareaEditor](#textareaeditor)
+    -   [range](#range)
+    -   [insert](#insert)
+    -   [focus](#focus)
+    -   [toggle](#toggle)
+    -   [format](#format)
+    -   [unformat](#unformat)
+    -   [hasFormat](#hasformat)
+-   [Formats](#formats)
+    -   [bold](#bold)
+    -   [italic](#italic)
+    -   [strikethrough](#strikethrough)
+    -   [link](#link)
+    -   [image](#image)
+    -   [header1](#header1)
+    -   [header2](#header2)
+    -   [header3](#header3)
+    -   [header4](#header4)
+    -   [header5](#header5)
+    -   [header6](#header6)
+    -   [code](#code)
+    -   [orderedList](#orderedlist)
+    -   [unorderedList](#unorderedlist)
+    -   [taskList](#tasklist)
+    -   [blockquote](#blockquote)
+
+### TextareaEditor
+
+TextareaEditor class.
+
+**Parameters**
+
+-   `el` **[HTMLElement](https://developer.mozilla.org/docs/Web/HTML/Element)** the textarea element to wrap around
+
+#### range
+
+Set or get selection range.
+
+**Parameters**
+
+-   `range` **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)?**
+
+Returns **([Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array) \| [TextareaEditor](#textareaeditor))**
+
+#### insert
+
+Insert given text at the current cursor position.
+
+**Parameters**
+
+-   `text` **[String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)** text to insert
+
+Returns **[TextareaEditor](#textareaeditor)**
+
+#### focus
+
+Set foucs on the TextareaEditor's element.
+
+Returns **[TextareaEditor](#textareaeditor)**
+
+#### toggle
+
+Toggle given `format` on current selection.
+Any additional arguments are passed on to `.format()`.
+
+**Parameters**
+
+-   `format` **([String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) \| [Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object))** name of format or an object
+-   `args` **...any**
+
+Returns **[TextareaEditor](#textareaeditor)**
+
+#### format
+
+Format current selcetion with given `format`.
+
+**Parameters**
+
+-   `name` **([String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) \| [Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object))** name of format or an object
+-   `args` **...any**
+
+Returns **[TextareaEditor](#textareaeditor)**
+
+#### unformat
+
+Remove given `format` from current selection.
+
+**Parameters**
+
+-   `name` **([String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) \| [Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object))** name of format or an object
+
+Returns **[TextareaEditor](#textareaeditor)**
+
+#### hasFormat
+
+Check if current seletion has given format.
+
+**Parameters**
+
+-   `name` **([String](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) \| [Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object))** name of format or an object
+
+Returns **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)**
+
+### Formats
+
+Default formats.
+
+#### bold
+
+Bold text.
+
+**Examples**
+
+```javascript
+editor.format('bold');
+assert(textarea.value == '**Hello World**')
+```
+
+#### italic
+
+Italic text.
+
+**Examples**
+
+```javascript
+editor.format('italic');
+assert(textarea.value == '_Hello World_')
+```
+
+#### strikethrough
+
+Strikethrough text.
+
+**Examples**
+
+```javascript
+editor.format('strikethrough');
+assert(textarea.value == '~~Hello World~~')
+```
+
+#### link
+
+Insert link.
+
+**Examples**
+
+```javascript
+editor.format('link', '/example');
+assert(textarea.value == '[Hello World](/example)')
+```
+
+#### image
+
+Insert image.
+
+**Examples**
+
+```javascript
+editor.format('image', '/example.png');
+assert(textarea.value == '![Hello World](/example.png)')
+```
+
+#### header1
+
+Header 1.
+
+**Examples**
+
+```javascript
+editor.format('header1');
+assert(textarea.value == '# Hello World')
+```
+
+#### header2
+
+Header 2.
+
+**Examples**
+
+```javascript
+editor.format('header2');
+assert(textarea.value == '## Hello World')
+```
+
+#### header3
+
+Header 3.
+
+**Examples**
+
+```javascript
+editor.format('header3');
+assert(textarea.value == '### Hello World')
+```
+
+#### header4
+
+Header 4.
+
+**Examples**
+
+```javascript
+editor.format('header4');
+assert(textarea.value == '#### Hello World')
+```
+
+#### header5
+
+Header 5.
+
+**Examples**
+
+```javascript
+editor.format('header5');
+assert(textarea.value == '##### Hello World')
+```
+
+#### header6
+
+Header 6.
+
+**Examples**
+
+```javascript
+editor.format('header6');
+assert(textarea.value == '###### Hello World')
+```
+
+#### code
+
+Insert code block.
+
+**Examples**
+
+````javascript
+editor.format('code');
+assert(textarea.value == '```\nHello World\n```')
+````
+
+#### orderedList
+
+Ordered list.
+
+**Examples**
+
+```javascript
+editor.format('orderedList');
+assert(textarea.value == '1. Hello World')
+```
+
+#### unorderedList
+
+Unordered list.
+
+**Examples**
+
+```javascript
+editor.format('unorderedList');
+assert(textarea.value == '- Hello World')
+```
+
+#### taskList
+
+Task list.
+
+**Examples**
+
+```javascript
+editor.format('taskList');
+assert(textarea.value == '- [ ] Hello World')
+```
+
+#### blockquote
+
+Blockquote.
+
+**Examples**
+
+```javascript
+editor.format('blockquote');
+assert(textarea.value == '> Hello World')
+```
+
+## License
+
+MIT

+ 23 - 0
package-lock.json

@@ -4,10 +4,33 @@
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+    },
     "lodash-es": {
       "version": "4.17.10",
       "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.10.tgz",
       "integrity": "sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg=="
+    },
+    "marked": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-0.4.0.tgz",
+      "integrity": "sha512-tMsdNBgOsrUophCAFQl0XPe6Zqk/uy9gnue+jIIKhykO51hxyu6uNx7zBPy0+y/WKYVZZMspV9YeXLNdKk+iYw=="
+    },
+    "svelte": {
+      "version": "2.6.5",
+      "resolved": "https://registry.npmjs.org/svelte/-/svelte-2.6.5.tgz",
+      "integrity": "sha512-cyicFnfgSe3SQr2hPdLkQHz4nj1rwa9oqc1SBzrgFdQ1Y8AOoaad0S0zhW6oBZE5YAm75YqoL9l+BZd3CmtPLw=="
+    },
+    "textarea-editor": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/textarea-editor/-/textarea-editor-2.1.1.tgz",
+      "integrity": "sha512-k+hhOXPlH0TwXr8fuYtu+tq8JgfRcqxFghf9QGVI7zXcW5OzCH6x5SKXQMk5GOE0vym9t1e7WxnNwJjJE/Rn+A==",
+      "requires": {
+        "escape-string-regexp": "^1.0.5"
+      }
     }
   }
 }

+ 4 - 1
package.json

@@ -9,6 +9,9 @@
   "author": "",
   "license": "ISC",
   "dependencies": {
-    "lodash-es": "^4.17.10"
+    "lodash-es": "^4.17.10",
+    "marked": "^0.4.0",
+    "svelte": "^2.6.5",
+    "textarea-editor": "^2.1.1"
   }
 }

+ 2 - 2
partials/NotenE.html

@@ -9,7 +9,7 @@
 			{#if lernbereich != faecher[0].fach.Zeugnisbez}
 				<tr><td colspan="2">{lernbereich}</td></tr>
 			{/if}
-			{#each faecher as f}
+			{#each faecher as f (f.ID)}
 				<tr>
 					<td class="fach-bezeichnung {lernbereich != faecher[0].fach.Zeugnisbez ? 'lernfeld-lernbereich' : ''}">
 						{#if f.fach.Zeugnisbez.includes("Projekt")}
@@ -28,7 +28,7 @@
 </table>
 
 <script>
-  import _ from './../node_modules/lodash-es/lodash'
+  import _ from 'lodash'
 
   export default {
 		helpers: {

BIN
partials/lodash-es-4.17.10.tgz


BIN
partials/mark.js-8.11.1.tgz


+ 69 - 0
stats.html

@@ -0,0 +1,69 @@
+<h1>Statistik sortiert nach Klassen</h1>
+<h3>Durchschnittsnoten FHR, d.h. nur Absolventen werden berücksichtigt</h3>
+Legende: Schulnummer, Anzahl der Schule von abgehender Schule, Schnitt, davon gültige Einträge
+<br>
+<button on:click="getSchueler('A')">A-Klassen</button>
+<button on:click="getSchueler('B')">B-Klassen</button>
+<button on:click="getSchueler('C')">C-Klassen</button>
+<button on:click="getSchueler('D')">D-Klassen</button>
+<button on:click="getSchueler('E')">E-Klassen</button>
+<button on:click="getSchueler('F')">F-Klassen</button>
+<button on:click="getSchueler('G')">G-Klassen</button>
+<button on:click="getSchueler('H')">H-Klassen</button>
+{#each Object.entries(schulen) as [schule, values]}
+  <br>{schule}: {values.length} -> Durchschnittsnote: {dsn(values).join(': ')}
+{/each}
+
+<script>
+const {Schueler} = require('schild/models/Models')
+const { Model } = require('objection')
+const Knex = require('knex')
+const _ = require('lodash')
+
+export default {
+  setup(Component) {Component.bez = 'Statistik'},
+  oncreate () {
+    const { knex } = this.get()
+    Model.knex(Knex({
+      client: 'mysql',
+      useNullAsDefault: true,
+      connection: {
+        host: knex.host,
+        database: knex.name,
+        user: knex.user,
+        password: knex.password,
+        charset: 'utf8'
+      }
+    }))
+  },
+  helpers: {
+    dsn (arr) {
+      let ln = arr.length
+      const r = arr.reduce((total, value) => {
+        const float = parseFloat(value.DurchschnittsnoteFHR.replace(',', '.'))
+        if (float) return total + float
+        else ln += -1
+        return total
+      }, 0)
+      return [(r / ln).toFixed(1), ln, arr.length]
+    },
+  },
+  methods: {
+    async getSchueler (pattern) {
+      const schueler = await Schueler.query()
+        .where('Klasse', 'like', pattern + '%')
+        .havingNotNull('DurchschnittsnoteFHR')
+      
+      this.set({schulen: _.groupBy(schueler, 'LSSchulNr')})
+      // console.log(schueler)
+    }
+  },
+  data () {
+    return {
+      schuelerx: [],
+      schulen: {}
+    }
+  }
+}
+
+</script>

Some files were not shown because too many files changed in this diff