diff --git a/doc/Notes.md b/doc/Notes.md index 5397ec9..9b40588 100644 --- a/doc/Notes.md +++ b/doc/Notes.md @@ -1,3 +1,11 @@ +# ### Achtung! \### +Diese Datei ist nicht mehr aktuell.
+Bitte nutze die neue Wiki unter [https://git.gaminggeneration.de/tobiash/itender/wiki](https://git.gaminggeneration.de/tobiash/itender/wiki) (Wiki des iTender Projekts) + +











+ + + # Notes und kleine Dokumentation Was haben wir bereits am iTender Projekt gemacht? @@ -53,66 +61,35 @@ Was haben wir bereits am iTender Projekt gemacht? - Nach jedem mischen und alle 5 minuten werden die Füllstände der Behälter erfasst - Danach werden auch die verfügbaren Cocktails berechnet, diese werden dann im Webinterface angezeigt -#### Code fakten - -- Inzwischen hat der Programmiercode 14492 Zeilen -- In Stunden wurde das Projekt (Stand 29.11) ~80 Stunden programmiert - -#### Fotos des Webinterfaces (Stand 21.11) - -Main -
-Die Main Pane ist der Hauptteil und direkt die Einstiegsseite des iTenders
-Hier können Getränke ausgewählt werden, welche dann "gemacht" werden - - -

-Menu
-Das Menü ist das Navigationsherz, von hier aus können alle anderen Panels erreicht werden
- -

-Containers
-Hier können die Behälter inhalte aktualisiert werden
-Man wählt die "Zutat" aus und danach wie voll der Behälter nun ist
-In der Regel kann das auch automatisch eingemessen werden, wenn alle Sensoren eingestellt sind
- - - -

-Fill
-Einfach ein "Popup" welches anzeigt dass das Getränk gefüllt wird - - - -

-Setup
-Das Setup ist das erste menü was nach dem ersten einrichten erscheint
-es dient zur Grundkonfiguration - - - -

- - -
- -

### Erklärung der Dateien und Modulen -| Context | Datei | Beschreibung | -|-----------|---------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| -| iTender | main | Die Hauptdatei, sie ist der Einstiegspunkt des Programms, von hier aus wird die Datenbank verbunden und der Webserver gestartet | -| iTender | MyGPIO | Die eigene GPIO Library von Tobias Hopp. Sie dient zum Steuern von GPIO-Pins am Raspberry Pi | -| iTender | Utils | Hier befinden sich einige schnelle Funktionen, welche des öfteren von mehreren Methoden im Programm genutzt werden | -| iTender | RejectReason, SensorType, RequestType | Ein paar Klassen welche Enums (sogenannte feste Platzhalter für Variablen) bereitstellen | -| iTender | SensorType | Die Art des Sensors, aktuell sind Ultraschallsensoren und Wäge sensoren unterstützt | -| Webserver | App | Die App ist die Instanz des Webservers, welcher für die Oberfläche genutzt wird, dieser wird vom iTender selbst, sowie etwaigen anderen Geräten aufgerufen | -| Webserver | WebsocketApp | Ähnlich wie die normale App, nur spezifisch für die Direktverbindung zwischen Oberfläche und Server | -| iTender | LEDHandler | Übernimmt die Steuerung der WS2812b LEDs | -| iTender | Category | Kategorie des Getränks | -| iTender | Settings | Die Einstellungen des iTenders, werden gespeichert in der config.json | -| Webseite | error.pug, index.pug, layout.pug | Die statische Webseite für den iTender, diese Oberfläche liest die JavaScript Dateien ein und verbindet sich dann mit dem WebSocket (mit dem iTender) | -| Compiler | dist/ Ordner | Hier sind alle kompilierten Dateien zu finden | -| Webserver | web/main | Der Einstiegspunkt für die Weboberfläche, von hier aus wird mit dem WebSocket verbunden | -| | | | +| Context | Datei | Beschreibung | +|--------------------------|---------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| iTender | main | Die Hauptdatei, sie ist der Einstiegspunkt des Programms, von hier aus wird die Datenbank verbunden und der Webserver gestartet | +| iTender | MyGPIO | Die eigene GPIO Library von Tobias Hopp. Sie dient zum Steuern von GPIO-Pins am Raspberry Pi | +| iTender | Utils | Hier befinden sich einige schnelle Funktionen, welche des öfteren von mehreren Methoden im Programm genutzt werden | +| iTender | RejectReason, SensorType, RequestType | Ein paar Klassen welche Enums (sogenannte feste Platzhalter für Variablen) bereitstellen | +| iTender | SensorType | Die Art des Sensors, aktuell sind Ultraschallsensoren und Wäge sensoren unterstützt | +| Webserver | App | Die App ist die Instanz des Webservers, welcher für die Oberfläche genutzt wird, dieser wird vom iTender selbst, sowie etwaigen anderen Geräten aufgerufen | +| Webserver | WebsocketApp | Ähnlich wie die normale App, nur spezifisch für die Direktverbindung zwischen Oberfläche und Server | +| Webserver | WebSocketHandler | Die Server-Seitige WebSocket-Verbindung. Hier werden die Nachrichten an die Oberfläche gesendet und verarbeitet | +| iTender | LEDHandler | Übernimmt die Steuerung der WS2812b LEDs | +| iTender | Category | Kategorie des Getränks | +| iTender | Settings | Die Einstellungen des iTenders, werden gespeichert in der config.json | +| Weboberfläche | error.pug, index.pug, layout.pug | Die statische Webseite für den iTender, diese Oberfläche liest die JavaScript Dateien ein und verbindet sich dann mit dem WebSocket (mit dem iTender) | +| Compiler | dist/ Ordner | Hier sind alle kompilierten Dateien zu finden | +| Webserver | web/main | Der Einstiegspunkt für die Weboberfläche, von hier aus wird mit dem WebSocket verbunden | +| iTender | HX711 | Die Klasse um den HX711 Wäge sensor abzufragen | +| Webserver, Weboberfläche | WebsocketPayload | Das ist die Payload (zu Deutsch Datenpaket), welche sowohl vom Webserver als auch von der Weboberfläche zum kommunizieren genutzt wird | +| Datenbank | database/Container | Hier werden die jeweiligen Container (wo die Inhalte für den Cocktail rein gefüllt werden) gespeichert | +| Datenbank | database/Database | Die Hauptklasse der Datenbank im iTender, sie sorgt für eine statische Verbindung mit der Datenbank und ermöglicht die Abfragen / Speicherungen von Getränken, Behältern und Zutaten | +| Datenbank | database/Drink | Hier werden die Getränke gespeichert, welche vom Server heruntergeladen werden | +| Datenbank | database/Job | Diese Klasse stellt den aktuellen Job des iTenders da, er wird erstellt wenn der Benutzer einen Drink haben möchte. In diesem Job-Objekt sind dann Werte wie die Kalkulation der Dauer, die Zutaten und Mengen, die jeweiligen Pumpen sowie ein Start und Endzeitpunkt festgelegt | +| Datenbank | database/Ingredient | Hier sind die Zutaten für die jeweiligen Drinks gespeichert. Es werden zu allen Drinks referenzen zu diesen Objekten erstellt | +| Weboberfläche | web/Fill | In dieser Klasse werden die Fill-Events erwartet. Sollte der Benutzer ein Getränk haben wollen, wechselt der iTender auf den Status FILLING. Diese Klasse greift das Event auf und zeigt dementsprechend dem Benutzer den aktuellen Status seines Auftrags an | +| Weboberfläche | web/Modal | Diese Klasse ist eine Art Herzstück geworden. Sie ermöglicht das schnelle und einfache Darstellen von Popups für den Benutzer. Beispiele sind Fehler oder Bestätigungsfenster. | +| Weboberfläche | web/Setup | Das Setup erwartet wie die Fill-Klasse ein Event. Hierbei das SETUP-Event. Sollte es "gefeuert" werden, werden hier die nötigen Maßnahmen getroffen um dem Benutzer das Setup anzuzeigen.
| +| Weboberfläche | web/WebHandler | Der WebHandler übernimmt das öffnen von Panels (welches Menü gerade offen ist) sowie dem korrekten Anzeigen aller Drinks welche vom iTender bereitgestellt werden | +| Weboberfläche | web/WebWebSocketHandler | Das Gegenstück zum WebSocketHandler, nur auf Web-Seite. Daher auch das doppelte Web im Namen. Es übernimmt das Verbinden mit dem WebSocket, welcher die Kommunikation zwischen iTender und Oberfläche ermöglicht | +| Weboberfläche | | | diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-300.woff b/public/fonts/Chakra Petch/chakra-petch-v9-latin-300.woff new file mode 100644 index 0000000..a657e18 Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-300.woff differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-300.woff2 b/public/fonts/Chakra Petch/chakra-petch-v9-latin-300.woff2 new file mode 100644 index 0000000..eec3efd Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-300.woff2 differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-300italic.woff b/public/fonts/Chakra Petch/chakra-petch-v9-latin-300italic.woff new file mode 100644 index 0000000..b6e20b4 Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-300italic.woff differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-300italic.woff2 b/public/fonts/Chakra Petch/chakra-petch-v9-latin-300italic.woff2 new file mode 100644 index 0000000..4ddd813 Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-300italic.woff2 differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-500.woff b/public/fonts/Chakra Petch/chakra-petch-v9-latin-500.woff new file mode 100644 index 0000000..17b0032 Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-500.woff differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-500.woff2 b/public/fonts/Chakra Petch/chakra-petch-v9-latin-500.woff2 new file mode 100644 index 0000000..6b77a07 Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-500.woff2 differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-500italic.woff b/public/fonts/Chakra Petch/chakra-petch-v9-latin-500italic.woff new file mode 100644 index 0000000..7a6fc3d Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-500italic.woff differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-500italic.woff2 b/public/fonts/Chakra Petch/chakra-petch-v9-latin-500italic.woff2 new file mode 100644 index 0000000..4dffeda Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-500italic.woff2 differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-600.woff b/public/fonts/Chakra Petch/chakra-petch-v9-latin-600.woff new file mode 100644 index 0000000..7d588a7 Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-600.woff differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-600.woff2 b/public/fonts/Chakra Petch/chakra-petch-v9-latin-600.woff2 new file mode 100644 index 0000000..7cd8fb3 Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-600.woff2 differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-600italic.woff b/public/fonts/Chakra Petch/chakra-petch-v9-latin-600italic.woff new file mode 100644 index 0000000..d7bdd0b Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-600italic.woff differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-600italic.woff2 b/public/fonts/Chakra Petch/chakra-petch-v9-latin-600italic.woff2 new file mode 100644 index 0000000..ac1e786 Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-600italic.woff2 differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-700.woff b/public/fonts/Chakra Petch/chakra-petch-v9-latin-700.woff new file mode 100644 index 0000000..88974a3 Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-700.woff differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-700.woff2 b/public/fonts/Chakra Petch/chakra-petch-v9-latin-700.woff2 new file mode 100644 index 0000000..4402786 Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-700.woff2 differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-700italic.woff b/public/fonts/Chakra Petch/chakra-petch-v9-latin-700italic.woff new file mode 100644 index 0000000..5ea73c3 Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-700italic.woff differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-700italic.woff2 b/public/fonts/Chakra Petch/chakra-petch-v9-latin-700italic.woff2 new file mode 100644 index 0000000..0213a40 Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-700italic.woff2 differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-italic.woff b/public/fonts/Chakra Petch/chakra-petch-v9-latin-italic.woff new file mode 100644 index 0000000..b163a61 Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-italic.woff differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-italic.woff2 b/public/fonts/Chakra Petch/chakra-petch-v9-latin-italic.woff2 new file mode 100644 index 0000000..fe1e88d Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-italic.woff2 differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-regular.woff b/public/fonts/Chakra Petch/chakra-petch-v9-latin-regular.woff new file mode 100644 index 0000000..3da494a Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-regular.woff differ diff --git a/public/fonts/Chakra Petch/chakra-petch-v9-latin-regular.woff2 b/public/fonts/Chakra Petch/chakra-petch-v9-latin-regular.woff2 new file mode 100644 index 0000000..98470dc Binary files /dev/null and b/public/fonts/Chakra Petch/chakra-petch-v9-latin-regular.woff2 differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-200.woff b/public/fonts/Inconsolata/inconsolata-v31-latin-200.woff new file mode 100644 index 0000000..6636bf9 Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-200.woff differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-200.woff2 b/public/fonts/Inconsolata/inconsolata-v31-latin-200.woff2 new file mode 100644 index 0000000..ef3bf06 Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-200.woff2 differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-300.woff b/public/fonts/Inconsolata/inconsolata-v31-latin-300.woff new file mode 100644 index 0000000..08d4834 Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-300.woff differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-300.woff2 b/public/fonts/Inconsolata/inconsolata-v31-latin-300.woff2 new file mode 100644 index 0000000..a837d31 Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-300.woff2 differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-500.woff b/public/fonts/Inconsolata/inconsolata-v31-latin-500.woff new file mode 100644 index 0000000..3221f5f Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-500.woff differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-500.woff2 b/public/fonts/Inconsolata/inconsolata-v31-latin-500.woff2 new file mode 100644 index 0000000..26b61e9 Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-500.woff2 differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-600.woff b/public/fonts/Inconsolata/inconsolata-v31-latin-600.woff new file mode 100644 index 0000000..0ff280a Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-600.woff differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-600.woff2 b/public/fonts/Inconsolata/inconsolata-v31-latin-600.woff2 new file mode 100644 index 0000000..7e7f927 Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-600.woff2 differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-700.woff b/public/fonts/Inconsolata/inconsolata-v31-latin-700.woff new file mode 100644 index 0000000..d24d1a1 Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-700.woff differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-700.woff2 b/public/fonts/Inconsolata/inconsolata-v31-latin-700.woff2 new file mode 100644 index 0000000..010da61 Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-700.woff2 differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-800.woff b/public/fonts/Inconsolata/inconsolata-v31-latin-800.woff new file mode 100644 index 0000000..dd7d59d Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-800.woff differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-800.woff2 b/public/fonts/Inconsolata/inconsolata-v31-latin-800.woff2 new file mode 100644 index 0000000..14a7c1c Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-800.woff2 differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-900.woff b/public/fonts/Inconsolata/inconsolata-v31-latin-900.woff new file mode 100644 index 0000000..db22480 Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-900.woff differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-900.woff2 b/public/fonts/Inconsolata/inconsolata-v31-latin-900.woff2 new file mode 100644 index 0000000..fd349e5 Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-900.woff2 differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-regular.woff b/public/fonts/Inconsolata/inconsolata-v31-latin-regular.woff new file mode 100644 index 0000000..891d79e Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-regular.woff differ diff --git a/public/fonts/Inconsolata/inconsolata-v31-latin-regular.woff2 b/public/fonts/Inconsolata/inconsolata-v31-latin-regular.woff2 new file mode 100644 index 0000000..6119e59 Binary files /dev/null and b/public/fonts/Inconsolata/inconsolata-v31-latin-regular.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-200.woff b/public/fonts/Nunito/nunito-v25-latin-200.woff new file mode 100644 index 0000000..4d444eb Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-200.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-200.woff2 b/public/fonts/Nunito/nunito-v25-latin-200.woff2 new file mode 100644 index 0000000..af85fe6 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-200.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-200italic.woff b/public/fonts/Nunito/nunito-v25-latin-200italic.woff new file mode 100644 index 0000000..41f444c Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-200italic.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-200italic.woff2 b/public/fonts/Nunito/nunito-v25-latin-200italic.woff2 new file mode 100644 index 0000000..0647a00 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-200italic.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-300.woff b/public/fonts/Nunito/nunito-v25-latin-300.woff new file mode 100644 index 0000000..ddb18a9 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-300.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-300.woff2 b/public/fonts/Nunito/nunito-v25-latin-300.woff2 new file mode 100644 index 0000000..04548e2 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-300.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-300italic.woff b/public/fonts/Nunito/nunito-v25-latin-300italic.woff new file mode 100644 index 0000000..d98cec9 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-300italic.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-300italic.woff2 b/public/fonts/Nunito/nunito-v25-latin-300italic.woff2 new file mode 100644 index 0000000..0b43eef Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-300italic.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-500.woff b/public/fonts/Nunito/nunito-v25-latin-500.woff new file mode 100644 index 0000000..ea98a9c Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-500.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-500.woff2 b/public/fonts/Nunito/nunito-v25-latin-500.woff2 new file mode 100644 index 0000000..96f3121 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-500.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-500italic.woff b/public/fonts/Nunito/nunito-v25-latin-500italic.woff new file mode 100644 index 0000000..c5dbc30 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-500italic.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-500italic.woff2 b/public/fonts/Nunito/nunito-v25-latin-500italic.woff2 new file mode 100644 index 0000000..16ec315 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-500italic.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-600.woff b/public/fonts/Nunito/nunito-v25-latin-600.woff new file mode 100644 index 0000000..aa4b811 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-600.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-600.woff2 b/public/fonts/Nunito/nunito-v25-latin-600.woff2 new file mode 100644 index 0000000..5ed5e51 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-600.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-600italic.woff b/public/fonts/Nunito/nunito-v25-latin-600italic.woff new file mode 100644 index 0000000..930a141 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-600italic.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-600italic.woff2 b/public/fonts/Nunito/nunito-v25-latin-600italic.woff2 new file mode 100644 index 0000000..2cf160d Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-600italic.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-700.woff b/public/fonts/Nunito/nunito-v25-latin-700.woff new file mode 100644 index 0000000..6048b67 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-700.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-700.woff2 b/public/fonts/Nunito/nunito-v25-latin-700.woff2 new file mode 100644 index 0000000..d0a5677 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-700.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-700italic.woff b/public/fonts/Nunito/nunito-v25-latin-700italic.woff new file mode 100644 index 0000000..036fa0b Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-700italic.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-700italic.woff2 b/public/fonts/Nunito/nunito-v25-latin-700italic.woff2 new file mode 100644 index 0000000..d8bce57 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-700italic.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-800.woff b/public/fonts/Nunito/nunito-v25-latin-800.woff new file mode 100644 index 0000000..e82ecc7 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-800.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-800.woff2 b/public/fonts/Nunito/nunito-v25-latin-800.woff2 new file mode 100644 index 0000000..63fe567 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-800.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-800italic.woff b/public/fonts/Nunito/nunito-v25-latin-800italic.woff new file mode 100644 index 0000000..5116260 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-800italic.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-800italic.woff2 b/public/fonts/Nunito/nunito-v25-latin-800italic.woff2 new file mode 100644 index 0000000..4ce205d Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-800italic.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-900.woff b/public/fonts/Nunito/nunito-v25-latin-900.woff new file mode 100644 index 0000000..20724ad Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-900.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-900.woff2 b/public/fonts/Nunito/nunito-v25-latin-900.woff2 new file mode 100644 index 0000000..0fbfe77 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-900.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-900italic.woff b/public/fonts/Nunito/nunito-v25-latin-900italic.woff new file mode 100644 index 0000000..3977342 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-900italic.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-900italic.woff2 b/public/fonts/Nunito/nunito-v25-latin-900italic.woff2 new file mode 100644 index 0000000..33edc2f Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-900italic.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-italic.woff b/public/fonts/Nunito/nunito-v25-latin-italic.woff new file mode 100644 index 0000000..e3d10e3 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-italic.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-italic.woff2 b/public/fonts/Nunito/nunito-v25-latin-italic.woff2 new file mode 100644 index 0000000..0017722 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-italic.woff2 differ diff --git a/public/fonts/Nunito/nunito-v25-latin-regular.woff b/public/fonts/Nunito/nunito-v25-latin-regular.woff new file mode 100644 index 0000000..2df129c Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-regular.woff differ diff --git a/public/fonts/Nunito/nunito-v25-latin-regular.woff2 b/public/fonts/Nunito/nunito-v25-latin-regular.woff2 new file mode 100644 index 0000000..8b85e17 Binary files /dev/null and b/public/fonts/Nunito/nunito-v25-latin-regular.woff2 differ diff --git a/public/fonts/Roboto/roboto-v30-latin-100.woff b/public/fonts/Roboto/roboto-v30-latin-100.woff new file mode 100644 index 0000000..a815cf8 Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-100.woff differ diff --git a/public/fonts/Roboto/roboto-v30-latin-100.woff2 b/public/fonts/Roboto/roboto-v30-latin-100.woff2 new file mode 100644 index 0000000..71c9bb7 Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-100.woff2 differ diff --git a/public/fonts/Roboto/roboto-v30-latin-100italic.woff b/public/fonts/Roboto/roboto-v30-latin-100italic.woff new file mode 100644 index 0000000..5c0c285 Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-100italic.woff differ diff --git a/public/fonts/Roboto/roboto-v30-latin-100italic.woff2 b/public/fonts/Roboto/roboto-v30-latin-100italic.woff2 new file mode 100644 index 0000000..4ccadd1 Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-100italic.woff2 differ diff --git a/public/fonts/Roboto/roboto-v30-latin-300.woff b/public/fonts/Roboto/roboto-v30-latin-300.woff new file mode 100644 index 0000000..36979ae Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-300.woff differ diff --git a/public/fonts/Roboto/roboto-v30-latin-300.woff2 b/public/fonts/Roboto/roboto-v30-latin-300.woff2 new file mode 100644 index 0000000..6068138 Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-300.woff2 differ diff --git a/public/fonts/Roboto/roboto-v30-latin-300italic.woff b/public/fonts/Roboto/roboto-v30-latin-300italic.woff new file mode 100644 index 0000000..f52f767 Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-300italic.woff differ diff --git a/public/fonts/Roboto/roboto-v30-latin-300italic.woff2 b/public/fonts/Roboto/roboto-v30-latin-300italic.woff2 new file mode 100644 index 0000000..22c57b0 Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-300italic.woff2 differ diff --git a/public/fonts/Roboto/roboto-v30-latin-500.woff b/public/fonts/Roboto/roboto-v30-latin-500.woff new file mode 100644 index 0000000..d39bb52 Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-500.woff differ diff --git a/public/fonts/Roboto/roboto-v30-latin-500.woff2 b/public/fonts/Roboto/roboto-v30-latin-500.woff2 new file mode 100644 index 0000000..29342a8 Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-500.woff2 differ diff --git a/public/fonts/Roboto/roboto-v30-latin-500italic.woff b/public/fonts/Roboto/roboto-v30-latin-500italic.woff new file mode 100644 index 0000000..b6ad1c5 Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-500italic.woff differ diff --git a/public/fonts/Roboto/roboto-v30-latin-500italic.woff2 b/public/fonts/Roboto/roboto-v30-latin-500italic.woff2 new file mode 100644 index 0000000..ae1933f Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-500italic.woff2 differ diff --git a/public/fonts/Roboto/roboto-v30-latin-700.woff b/public/fonts/Roboto/roboto-v30-latin-700.woff new file mode 100644 index 0000000..db0012d Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-700.woff differ diff --git a/public/fonts/Roboto/roboto-v30-latin-700.woff2 b/public/fonts/Roboto/roboto-v30-latin-700.woff2 new file mode 100644 index 0000000..771fbec Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-700.woff2 differ diff --git a/public/fonts/Roboto/roboto-v30-latin-700italic.woff b/public/fonts/Roboto/roboto-v30-latin-700italic.woff new file mode 100644 index 0000000..17efecc Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-700italic.woff differ diff --git a/public/fonts/Roboto/roboto-v30-latin-700italic.woff2 b/public/fonts/Roboto/roboto-v30-latin-700italic.woff2 new file mode 100644 index 0000000..a56a6ed Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-700italic.woff2 differ diff --git a/public/fonts/Roboto/roboto-v30-latin-900.woff b/public/fonts/Roboto/roboto-v30-latin-900.woff new file mode 100644 index 0000000..04cbe94 Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-900.woff differ diff --git a/public/fonts/Roboto/roboto-v30-latin-900.woff2 b/public/fonts/Roboto/roboto-v30-latin-900.woff2 new file mode 100644 index 0000000..067cb32 Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-900.woff2 differ diff --git a/public/fonts/Roboto/roboto-v30-latin-900italic.woff b/public/fonts/Roboto/roboto-v30-latin-900italic.woff new file mode 100644 index 0000000..4d7794b Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-900italic.woff differ diff --git a/public/fonts/Roboto/roboto-v30-latin-900italic.woff2 b/public/fonts/Roboto/roboto-v30-latin-900italic.woff2 new file mode 100644 index 0000000..59cab0f Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-900italic.woff2 differ diff --git a/public/fonts/Roboto/roboto-v30-latin-italic.woff b/public/fonts/Roboto/roboto-v30-latin-italic.woff new file mode 100644 index 0000000..ebee16b Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-italic.woff differ diff --git a/public/fonts/Roboto/roboto-v30-latin-italic.woff2 b/public/fonts/Roboto/roboto-v30-latin-italic.woff2 new file mode 100644 index 0000000..e1b7a79 Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-italic.woff2 differ diff --git a/public/fonts/Roboto/roboto-v30-latin-regular.woff b/public/fonts/Roboto/roboto-v30-latin-regular.woff new file mode 100644 index 0000000..9eaa94f Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-regular.woff differ diff --git a/public/fonts/Roboto/roboto-v30-latin-regular.woff2 b/public/fonts/Roboto/roboto-v30-latin-regular.woff2 new file mode 100644 index 0000000..020729e Binary files /dev/null and b/public/fonts/Roboto/roboto-v30-latin-regular.woff2 differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-300.woff b/public/fonts/Ubuntu/ubuntu-v20-latin-300.woff new file mode 100644 index 0000000..5bbeb9d Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-300.woff differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-300.woff2 b/public/fonts/Ubuntu/ubuntu-v20-latin-300.woff2 new file mode 100644 index 0000000..b6ecd3a Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-300.woff2 differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-300italic.woff b/public/fonts/Ubuntu/ubuntu-v20-latin-300italic.woff new file mode 100644 index 0000000..a17a40e Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-300italic.woff differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-300italic.woff2 b/public/fonts/Ubuntu/ubuntu-v20-latin-300italic.woff2 new file mode 100644 index 0000000..d6fdf85 Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-300italic.woff2 differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-500.woff b/public/fonts/Ubuntu/ubuntu-v20-latin-500.woff new file mode 100644 index 0000000..2456b4b Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-500.woff differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-500.woff2 b/public/fonts/Ubuntu/ubuntu-v20-latin-500.woff2 new file mode 100644 index 0000000..47657f1 Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-500.woff2 differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-500italic.woff b/public/fonts/Ubuntu/ubuntu-v20-latin-500italic.woff new file mode 100644 index 0000000..a7323d3 Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-500italic.woff differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-500italic.woff2 b/public/fonts/Ubuntu/ubuntu-v20-latin-500italic.woff2 new file mode 100644 index 0000000..744a1b7 Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-500italic.woff2 differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-700.woff b/public/fonts/Ubuntu/ubuntu-v20-latin-700.woff new file mode 100644 index 0000000..e58e9da Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-700.woff differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-700.woff2 b/public/fonts/Ubuntu/ubuntu-v20-latin-700.woff2 new file mode 100644 index 0000000..2c08bc6 Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-700.woff2 differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-700italic.woff b/public/fonts/Ubuntu/ubuntu-v20-latin-700italic.woff new file mode 100644 index 0000000..fb1da8c Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-700italic.woff differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-700italic.woff2 b/public/fonts/Ubuntu/ubuntu-v20-latin-700italic.woff2 new file mode 100644 index 0000000..bd08e15 Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-700italic.woff2 differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-italic.woff b/public/fonts/Ubuntu/ubuntu-v20-latin-italic.woff new file mode 100644 index 0000000..a5cbfea Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-italic.woff differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-italic.woff2 b/public/fonts/Ubuntu/ubuntu-v20-latin-italic.woff2 new file mode 100644 index 0000000..70755ed Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-italic.woff2 differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-regular.woff b/public/fonts/Ubuntu/ubuntu-v20-latin-regular.woff new file mode 100644 index 0000000..24cf9ae Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-regular.woff differ diff --git a/public/fonts/Ubuntu/ubuntu-v20-latin-regular.woff2 b/public/fonts/Ubuntu/ubuntu-v20-latin-regular.woff2 new file mode 100644 index 0000000..8070e4f Binary files /dev/null and b/public/fonts/Ubuntu/ubuntu-v20-latin-regular.woff2 differ diff --git a/public/stylesheets/fonts.css b/public/stylesheets/fonts.css index 9b44389..b5ef1bf 100644 --- a/public/stylesheets/fonts.css +++ b/public/stylesheets/fonts.css @@ -4,8 +4,8 @@ font-style: normal; font-weight: 100; src: local(''), - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-100.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-100.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + url('/fonts/Roboto/roboto-v30-latin-100.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('/fonts/Roboto/roboto-v30-latin-100.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* roboto-100italic - latin */ @@ -14,8 +14,8 @@ font-style: italic; font-weight: 100; src: local(''), - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-100italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-100italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + url('/fonts/Roboto/roboto-v30-latin-100italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('/fonts/Roboto/roboto-v30-latin-100italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* roboto-300 - latin */ @@ -24,8 +24,8 @@ font-style: normal; font-weight: 300; src: local(''), - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-300.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-300.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + url('/fonts/Roboto/roboto-v30-latin-300.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('/fonts/Roboto/roboto-v30-latin-300.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* roboto-300italic - latin */ @@ -34,8 +34,8 @@ font-style: italic; font-weight: 300; src: local(''), - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-300italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-300italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + url('/fonts/Roboto/roboto-v30-latin-300italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('/fonts/Roboto/roboto-v30-latin-300italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* roboto-regular - latin */ @@ -44,8 +44,8 @@ font-style: normal; font-weight: 400; src: local(''), - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + url('/fonts/Roboto/roboto-v30-latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('/fonts/Roboto/roboto-v30-latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* roboto-italic - latin */ @@ -54,8 +54,8 @@ font-style: italic; font-weight: 400; src: local(''), - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + url('/fonts/Roboto/roboto-v30-latin-italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('/fonts/Roboto/roboto-v30-latin-italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* roboto-500 - latin */ @@ -64,8 +64,8 @@ font-style: normal; font-weight: 500; src: local(''), - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-500.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-500.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + url('/fonts/Roboto/roboto-v30-latin-500.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('/fonts/Roboto/roboto-v30-latin-500.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* roboto-500italic - latin */ @@ -74,8 +74,8 @@ font-style: italic; font-weight: 500; src: local(''), - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-500italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-500italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + url('/fonts/Roboto/roboto-v30-latin-500italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('/fonts/Roboto/roboto-v30-latin-500italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* roboto-700 - latin */ @@ -84,8 +84,8 @@ font-style: normal; font-weight: 700; src: local(''), - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + url('/fonts/Roboto/roboto-v30-latin-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('/fonts/Roboto/roboto-v30-latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* roboto-700italic - latin */ @@ -94,8 +94,8 @@ font-style: italic; font-weight: 700; src: local(''), - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-700italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-700italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + url('/fonts/Roboto/roboto-v30-latin-700italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('/fonts/Roboto/roboto-v30-latin-700italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* roboto-900 - latin */ @@ -104,8 +104,8 @@ font-style: normal; font-weight: 900; src: local(''), - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-900.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-900.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + url('/fonts/Roboto/roboto-v30-latin-900.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('/fonts/Roboto/roboto-v30-latin-900.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } /* roboto-900italic - latin */ @@ -114,6 +114,6 @@ font-style: italic; font-weight: 900; src: local(''), - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-900italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('https://fonts.gaminggeneration.de/Roboto/roboto-v30-latin-900italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ + url('/fonts/Roboto/roboto-v30-latin-900italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('/fonts/Roboto/roboto-v30-latin-900italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ } diff --git a/src/test.ts b/src/test.ts deleted file mode 100644 index e69de29..0000000 diff --git a/staticWeb/index.html b/staticWeb/index.html deleted file mode 100644 index 1bfe91e..0000000 --- a/staticWeb/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - -iTender - - - - - - -
-
Status: iTenderVerbinden...
-
- -
-
-
- -
-
-
- - - \ No newline at end of file diff --git a/staticWeb/web.bundle.js b/staticWeb/web.bundle.js deleted file mode 100644 index 21e3fef..0000000 --- a/staticWeb/web.bundle.js +++ /dev/null @@ -1,346 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./src/WebSocketEvent.ts": -/*!*******************************!*\ - !*** ./src/WebSocketEvent.ts ***! - \*******************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.WebSocketEvent = void 0; -var WebSocketEvent; -(function (WebSocketEvent) { - WebSocketEvent["STATUS"] = "STATUS"; -})(WebSocketEvent = exports.WebSocketEvent || (exports.WebSocketEvent = {})); - - -/***/ }), - -/***/ "./src/WebSocketPayload.ts": -/*!*********************************!*\ - !*** ./src/WebSocketPayload.ts ***! - \*********************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.WebSocketPayload = void 0; -const WebSocketEvent_1 = __webpack_require__(/*! ./WebSocketEvent */ "./src/WebSocketEvent.ts"); -class WebSocketPayload { - constructor(event, error = false, data) { - this._event = event; - this._error = error; - this._data = data; - } - set event(value) { - this._event = value; - } - set error(value) { - this._error = value; - } - set data(value) { - this._data = value; - } - get event() { - return this._event; - } - get error() { - return this._error; - } - get data() { - return this._data; - } - static parseFromBase64Json(json) { - json = (typeof window != 'undefined') ? atob(json) : Buffer.from(json, "base64").toString(); - let rawPayload; - try { - rawPayload = JSON.parse(json); - } - catch (e) { - return null; - } - let wsEvent = WebSocketEvent_1.WebSocketEvent[rawPayload.event]; - return new WebSocketPayload(wsEvent, rawPayload.error, rawPayload.data); - } - toString() { - let json = JSON.stringify({ "event": this._event, status: this._error, data: this._data }); - json = ((typeof window != 'undefined') ? btoa(json) : Buffer.from(json).toString("base64")); - return json; - } -} -exports.WebSocketPayload = WebSocketPayload; - - -/***/ }), - -/***/ "./src/web/ButtonType.ts": -/*!*******************************!*\ - !*** ./src/web/ButtonType.ts ***! - \*******************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ButtonType = void 0; -var ButtonType; -(function (ButtonType) { - ButtonType["SUCCESS"] = "success"; - ButtonType["ERROR"] = "error"; -})(ButtonType = exports.ButtonType || (exports.ButtonType = {})); - - -/***/ }), - -/***/ "./src/web/Modal.ts": -/*!**************************!*\ - !*** ./src/web/Modal.ts ***! - \**************************/ -/***/ ((__unused_webpack_module, exports) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Modal = void 0; -class Modal { - constructor(id, title, content) { - this._title = "iTender"; - this._content = ""; - this._id = ""; - this._loader = false; - this._buttons = []; - this._id = id; - this._title = title; - this._content = content; - } - set title(value) { - this._title = value; - } - set content(value) { - this._content = value; - } - set id(value) { - this._id = value; - } - set loader(value) { - this._loader = value; - } - addButton(type, content, onclick) { - this._buttons.push({ type: type, content: content, onclick: onclick }); - } - open() { - if (!this._content) - this._content = ""; - if (this._loader) - this._content += "
\n" + - "
\n" + - "
"; - for (let btn of this._buttons) { - this._content += ``; - } - Modal.open(this._title, this._content, this._id); - } - static open(title, content, id) { - const modal = document.getElementById("modal"); - const modalContent = document.getElementById("modalInnerContent"); - if (!modal || !modalContent) - return; - modalContent.classList.add("modalBlendIn"); - modal.classList.add("modalBlendIn"); - setTimeout(() => { - modalContent.classList.remove("modalBlendIn"); - modal.classList.remove("modalBlendIn"); - }, 800); - modalContent.innerHTML = `

${title}

${content}`; - modal.style.display = "block"; - this.currentModalId = id ? id : "null"; - } - static close(id) { - if (this.currentModalId != id) - return; - const modal = document.getElementById("modal"); - const modalContent = document.getElementById("modal-content"); - const modalInnerContent = document.getElementById("modalInnerContent"); - if (!modal || !modalContent || !modalInnerContent) - return; - modalContent.classList.add("modalBlendOut"); - modal.classList.add("modalBlendOut"); - setTimeout(() => { - modal.style.display = "none"; - modalInnerContent.innerHTML = ""; - modalContent.classList.remove("modalBlendOut"); - modal.classList.remove("modalBlendOut"); - }, 800); - } -} -exports.Modal = Modal; -Modal.currentModalId = ""; - - -/***/ }), - -/***/ "./src/web/WebWebSocketHandler.ts": -/*!****************************************!*\ - !*** ./src/web/WebWebSocketHandler.ts ***! - \****************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.WebWebSocketHandler = void 0; -const Modal_1 = __webpack_require__(/*! ./Modal */ "./src/web/Modal.ts"); -const WebSocketEvent_1 = __webpack_require__(/*! ../WebSocketEvent */ "./src/WebSocketEvent.ts"); -const WebSocketPayload_1 = __webpack_require__(/*! ../WebSocketPayload */ "./src/WebSocketPayload.ts"); -const ButtonType_1 = __webpack_require__(/*! ./ButtonType */ "./src/web/ButtonType.ts"); -class WebWebSocketHandler { - constructor() { - this.socket = new WebSocket(WebWebSocketHandler.url); - this.socket.onopen = this.onOpen; - this.socket.onclose = this.onClose; - this.socket.onerror = this.onError; - this.socket.onmessage = this.onMessage; - } - onMessage(msgEvent) { - console.log("[WS] Incoming message", msgEvent); - let payload = WebSocketPayload_1.WebSocketPayload.parseFromBase64Json(msgEvent.data); - if (!payload) { - console.log("[WS] Could not parse message: ", msgEvent); - return; - } - console.debug(payload); - console.debug(payload.event); - console.log("[WS] Received " + payload.event + " Event"); - switch (payload.event) { - case WebSocketEvent_1.WebSocketEvent.STATUS: { - let statusElement = document.getElementById("status"); - if (statusElement) - statusElement.innerText = payload.data.status; - } - } - } - onOpen(event) { - console.log("[WS] Connected", event); - Modal_1.Modal.close("start"); - let connectionElement = document.getElementById("right"); - if (connectionElement) - connectionElement.innerText = "Verbunden"; - } - onClose(event) { - console.error("[WS] Closed!", event); - if (event.wasClean) { - let modal = new Modal_1.Modal("socketClosed", "Sitzung beendet!"); - modal.content = `Diese Sitzung wurde beendet, da der iTender nun an einem anderen Gerät bzw. an dem Hauptgerät gesteuert wird.

`; - modal.addButton(ButtonType_1.ButtonType.SUCCESS, "Sitzung wiederherstellen", () => { - window.location.reload(); - }); - modal.open(); - } - else { - let modal = new Modal_1.Modal("socketClosed", "Verbindungsproblem!"); - modal.content = `Die Benutzeroberfläche hat die Verbindung mit dem Gerät verloren.
Die Verbindung wird wiederhergestellt...
`; - modal.loader = true; - modal.open(); - setInterval(() => { - window.location.reload(); - }, 5000); - } - let connectionElement = document.getElementById("right"); - if (connectionElement) - connectionElement.innerText = "Keine Verbindung"; - } - onError(event) { - console.error("[WS] Error", event); - let connectionElement = document.getElementById("right"); - if (connectionElement) - connectionElement.innerText = "Fehler"; - } -} -exports.WebWebSocketHandler = WebWebSocketHandler; -WebWebSocketHandler.url = (window.location.protocol == "http:" ? "ws://" : "wss://") + window.location.hostname + ":3005"; - - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -(() => { -var exports = __webpack_exports__; -/*!*************************!*\ - !*** ./src/web/main.ts ***! - \*************************/ - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const WebWebSocketHandler_1 = __webpack_require__(/*! ./WebWebSocketHandler */ "./src/web/WebWebSocketHandler.ts"); -const Modal_1 = __webpack_require__(/*! ./Modal */ "./src/web/Modal.ts"); -const main = document.getElementById("main"); -const time = document.getElementById("title"); -document.addEventListener("DOMContentLoaded", () => { - console.log("DOM Loaded"); - let modal = new Modal_1.Modal("start", "iTender"); - modal.content = "Willkommen"; - modal.loader = true; - modal.open(); - connect(); - setTimeout(load, 1000); -}); -function load() { - if (!main || !time) - return; - setInterval(() => { - let currentDate = new Date(); - time.innerText = "" + (currentDate.getHours() < 10 ? "0" + currentDate.getHours() : currentDate.getHours()) + ":" + (currentDate.getMinutes() < 10 ? "0" + currentDate.getMinutes() : currentDate.getMinutes()); - }, 1000); - let maxI = 20; - main.style.gridTemplateRows = `repeat(${Math.round(maxI / 3)}, calc(90%/2))`; - for (let i = 0; i < maxI; i++) { - let testDrink = document.createElement("div"); - testDrink.classList.add("drink"); - let img = document.createElement("img"); - img.classList.add("thumbnail"); - testDrink.append(img); - let name = document.createElement("p"); - name.classList.add("name"); - testDrink.append(name); - img.alt = "Thumbnail"; - name.innerText = "Mixery"; - main.append(testDrink); - } -} -let wsHandler; -function connect() { - wsHandler = new WebWebSocketHandler_1.WebWebSocketHandler(); -} - -})(); - -/******/ })() -; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV0QixJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkIsR0FBRyxDQUFDLEdBQUcsR0FBQyxXQUFXLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRO1FBRXpCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDekI7QUFDSixDQUFDO0FBRUQsSUFBSSxTQUFTLENBQUM7QUFDZCxTQUFTLE9BQU87SUFFYixTQUFTLEdBQUcsSUFBSSx5Q0FBbUIsRUFBRSxDQUFDO0FBRXpDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pdGVuZGVyLy4vc3JjL1dlYlNvY2tldEV2ZW50LnRzIiwid2VicGFjazovL2l0ZW5kZXIvLi9zcmMvV2ViU29ja2V0UGF5bG9hZC50cyIsIndlYnBhY2s6Ly9pdGVuZGVyLy4vc3JjL3dlYi9CdXR0b25UeXBlLnRzIiwid2VicGFjazovL2l0ZW5kZXIvLi9zcmMvd2ViL01vZGFsLnRzIiwid2VicGFjazovL2l0ZW5kZXIvLi9zcmMvd2ViL1dlYldlYlNvY2tldEhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vaXRlbmRlci93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9pdGVuZGVyLy4vc3JjL3dlYi9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIFdlYlNvY2tldEV2ZW50IHtcbiAgICBTVEFUVVM9IFwiU1RBVFVTXCJcbn0iLCJpbXBvcnQge1dlYlNvY2tldEV2ZW50fSBmcm9tIFwiLi9XZWJTb2NrZXRFdmVudFwiO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0UGF5bG9hZCB7XG4gICAgc2V0IGV2ZW50KHZhbHVlOiBXZWJTb2NrZXRFdmVudCkge1xuICAgICAgICB0aGlzLl9ldmVudCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHNldCBlcnJvcih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9lcnJvciA9IHZhbHVlO1xuICAgIH1cblxuICAgIHNldCBkYXRhKHZhbHVlOiBhbnkgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2V2ZW50OiBXZWJTb2NrZXRFdmVudDtcbiAgICBwcml2YXRlIF9lcnJvcjogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9kYXRhOiBhbnkgfCB1bmRlZmluZWQ7XG5cblxuICAgIGdldCBldmVudCgpOiBXZWJTb2NrZXRFdmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG5cbiAgICBnZXQgZXJyb3IoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihldmVudDogV2ViU29ja2V0RXZlbnQsIGVycm9yOiBib29sZWFuID0gZmFsc2UsIGRhdGE/OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fZXZlbnQgPSBldmVudDtcbiAgICAgICAgdGhpcy5fZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZUZyb21CYXNlNjRKc29uKGpzb246IHN0cmluZyk6IFdlYlNvY2tldFBheWxvYWQgfCBudWxsIHtcbiAgICAgICAganNvbiA9ICh0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnKSA/IGF0b2IoanNvbikgOiBCdWZmZXIuZnJvbShqc29uLCBcImJhc2U2NFwiKS50b1N0cmluZygpO1xuICAgICAgICBsZXQgcmF3UGF5bG9hZDogeyBldmVudDogc3RyaW5nLCBlcnJvcjogYm9vbGVhbiwgZGF0YTogYW55IH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByYXdQYXlsb2FkID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgd3NFdmVudCA9IFdlYlNvY2tldEV2ZW50WzxrZXlvZiB0eXBlb2YgV2ViU29ja2V0RXZlbnQ+cmF3UGF5bG9hZC5ldmVudF07XG5cbiAgICAgICAgcmV0dXJuIG5ldyBXZWJTb2NrZXRQYXlsb2FkKHdzRXZlbnQsIHJhd1BheWxvYWQuZXJyb3IsIHJhd1BheWxvYWQuZGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcGF5bG9hZCBhcyBiYXNlNjQgZW5jb2RlZCBqc29uIHN0cmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBsZXQganNvbiA9IEpTT04uc3RyaW5naWZ5KHtcImV2ZW50XCI6IHRoaXMuX2V2ZW50LCBzdGF0dXM6IHRoaXMuX2Vycm9yLCBkYXRhOiB0aGlzLl9kYXRhfSk7XG4gICAgICAgIGpzb24gPSAoKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcpID8gYnRvYShqc29uKSA6IEJ1ZmZlci5mcm9tKGpzb24pLnRvU3RyaW5nKFwiYmFzZTY0XCIpKTtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxufSIsImV4cG9ydCBlbnVtIEJ1dHRvblR5cGUge1xuICAgIFNVQ0NFU1MgPSBcInN1Y2Nlc3NcIixcbiAgICBFUlJPUiA9IFwiZXJyb3JcIixcblxufSIsImltcG9ydCB7QnV0dG9uVHlwZX0gZnJvbSBcIi4vQnV0dG9uVHlwZVwiO1xuXG5leHBvcnQgY2xhc3MgTW9kYWwge1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY3VycmVudE1vZGFsSWQgPSBcIlwiO1xuXG4gICAgcHJpdmF0ZSBfdGl0bGU6IHN0cmluZyA9IFwiaVRlbmRlclwiO1xuICAgIHByaXZhdGUgX2NvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IFwiXCI7XG4gICAgcHJpdmF0ZSBfaWQ6IHN0cmluZyA9IFwiXCI7XG4gICAgcHJpdmF0ZSBfbG9hZGVyOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfYnV0dG9uczogeyB0eXBlOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZywgb25jbGljazogRnVuY3Rpb24gfVtdID0gW107XG5cblxuICAgIGNvbnN0cnVjdG9yKGlkLCB0aXRsZTogc3RyaW5nLCBjb250ZW50Pzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2lkID0gaWQ7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBjb250ZW50O1xuICAgIH1cblxuXG4gICAgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fdGl0bGUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgY29udGVudCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHNldCBsb2FkZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fbG9hZGVyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEJ1dHRvbiggdHlwZTogQnV0dG9uVHlwZSwgY29udGVudDogc3RyaW5nLCBvbmNsaWNrOiBGdW5jdGlvbiApXG4gICAge1xuICAgICAgICB0aGlzLl9idXR0b25zLnB1c2goe3R5cGU6IHR5cGUsIGNvbnRlbnQ6IGNvbnRlbnQsIG9uY2xpY2s6IG9uY2xpY2t9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3BlbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb250ZW50KVxuICAgICAgICAgICAgdGhpcy5fY29udGVudCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKHRoaXMuX2xvYWRlcilcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnQgKz0gXCI8YnI+PGRpdiBjbGFzcz1cXFwibGRzLWVsbGlwc2lzXFxcIj5cXG5cIiArXG4gICAgICAgICAgICAgICAgXCIgIDxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+XFxuXCIgK1xuICAgICAgICAgICAgICAgIFwiPC9kaXY+XCI7XG5cbiAgICAgICAgZm9yIChsZXQgYnRuIG9mIHRoaXMuX2J1dHRvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnQgKz0gYDxidXR0b24gY2xhc3M9XCJidG4gYnRuLSR7YnRuLnR5cGV9XCIgb25jbGljaz1cIigke2J0bi5vbmNsaWNrfSkoKTtcIj4ke2J0bi5jb250ZW50fTwvYnV0dG9uPmA7XG4gICAgICAgIH1cblxuICAgICAgICBNb2RhbC5vcGVuKHRoaXMuX3RpdGxlLCB0aGlzLl9jb250ZW50LCB0aGlzLl9pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHRpdGxlXG4gICAgICogQHBhcmFtIGNvbnRlbnRcbiAgICAgKiBAcGFyYW0gaWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIG9wZW4odGl0bGU6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBpZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibW9kYWxcIik7XG4gICAgICAgIGNvbnN0IG1vZGFsQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibW9kYWxJbm5lckNvbnRlbnRcIik7XG5cbiAgICAgICAgaWYgKCFtb2RhbCB8fCAhbW9kYWxDb250ZW50KVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIG1vZGFsQ29udGVudC5jbGFzc0xpc3QuYWRkKFwibW9kYWxCbGVuZEluXCIpO1xuICAgICAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKFwibW9kYWxCbGVuZEluXCIpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgbW9kYWxDb250ZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJtb2RhbEJsZW5kSW5cIik7XG4gICAgICAgICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKFwibW9kYWxCbGVuZEluXCIpO1xuICAgICAgICB9LCA4MDApO1xuXG4gICAgICAgIG1vZGFsQ29udGVudC5pbm5lckhUTUwgPSBgPGgxIGlkPVwibW9kYWxUaXRsZVwiPiR7dGl0bGV9PC9oMT4ke2NvbnRlbnR9YDtcbiAgICAgICAgbW9kYWwuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblxuICAgICAgICB0aGlzLmN1cnJlbnRNb2RhbElkID0gaWQgPyBpZCA6IFwibnVsbFwiO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xvc2UoaWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE1vZGFsSWQgIT0gaWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1vZGFsXCIpO1xuICAgICAgICBjb25zdCBtb2RhbENvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1vZGFsLWNvbnRlbnRcIik7XG4gICAgICAgIGNvbnN0IG1vZGFsSW5uZXJDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtb2RhbElubmVyQ29udGVudFwiKTtcblxuICAgICAgICBpZiAoIW1vZGFsIHx8ICFtb2RhbENvbnRlbnQgfHwgIW1vZGFsSW5uZXJDb250ZW50KVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIG1vZGFsQ29udGVudC5jbGFzc0xpc3QuYWRkKFwibW9kYWxCbGVuZE91dFwiKTtcbiAgICAgICAgbW9kYWwuY2xhc3NMaXN0LmFkZChcIm1vZGFsQmxlbmRPdXRcIik7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBtb2RhbC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICBtb2RhbElubmVyQ29udGVudC5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICAgICAgbW9kYWxDb250ZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJtb2RhbEJsZW5kT3V0XCIpO1xuICAgICAgICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZShcIm1vZGFsQmxlbmRPdXRcIik7XG4gICAgICAgIH0sIDgwMCk7XG4gICAgfVxufSIsImltcG9ydCB7TW9kYWx9IGZyb20gXCIuL01vZGFsXCI7XG5pbXBvcnQge1dlYlNvY2tldEV2ZW50fSBmcm9tIFwiLi4vV2ViU29ja2V0RXZlbnRcIjtcbmltcG9ydCB7V2ViU29ja2V0UGF5bG9hZH0gZnJvbSBcIi4uL1dlYlNvY2tldFBheWxvYWRcIjtcbmltcG9ydCB7QnV0dG9uVHlwZX0gZnJvbSBcIi4vQnV0dG9uVHlwZVwiO1xuXG5leHBvcnQgY2xhc3MgV2ViV2ViU29ja2V0SGFuZGxlciB7XG4gICAgcHJpdmF0ZSBzb2NrZXQ6IFdlYlNvY2tldDtcbiAgICBwcml2YXRlIHN0YXRpYyB1cmwgPSAod2luZG93LmxvY2F0aW9uLnByb3RvY29sID09IFwiaHR0cDpcIiA/IFwid3M6Ly9cIiA6IFwid3NzOi8vXCIpICsgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lICsgXCI6MzAwNVwiO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldChXZWJXZWJTb2NrZXRIYW5kbGVyLnVybCk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9IHRoaXMub25PcGVuO1xuICAgICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5vbkNsb3NlO1xuICAgICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gdGhpcy5vbkVycm9yO1xuICAgICAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLm9uTWVzc2FnZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uTWVzc2FnZShtc2dFdmVudDogTWVzc2FnZUV2ZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1dTXSBJbmNvbWluZyBtZXNzYWdlXCIsIG1zZ0V2ZW50KTtcbiAgICAgICAgbGV0IHBheWxvYWQgPSBXZWJTb2NrZXRQYXlsb2FkLnBhcnNlRnJvbUJhc2U2NEpzb24obXNnRXZlbnQuZGF0YSk7XG4gICAgICAgIGlmICghcGF5bG9hZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJbV1NdIENvdWxkIG5vdCBwYXJzZSBtZXNzYWdlOiBcIiwgbXNnRXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUuZGVidWcocGF5bG9hZClcblxuICAgICAgICBjb25zb2xlLmRlYnVnKHBheWxvYWQuZXZlbnQpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKFwiW1dTXSBSZWNlaXZlZCBcIiArIHBheWxvYWQuZXZlbnQgKyBcIiBFdmVudFwiKTtcblxuICAgICAgICBzd2l0Y2ggKHBheWxvYWQuZXZlbnQpIHtcbiAgICAgICAgICAgIGNhc2UgV2ViU29ja2V0RXZlbnQuU1RBVFVTOiB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1c0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN0YXR1c1wiKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzRWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzRWxlbWVudC5pbm5lclRleHQgPSBwYXlsb2FkLmRhdGEuc3RhdHVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbk9wZW4oZXZlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbV1NdIENvbm5lY3RlZFwiLCBldmVudCk7XG4gICAgICAgIE1vZGFsLmNsb3NlKFwic3RhcnRcIik7XG4gICAgICAgIGxldCBjb25uZWN0aW9uRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmlnaHRcIik7XG4gICAgICAgIGlmIChjb25uZWN0aW9uRWxlbWVudClcbiAgICAgICAgICAgIGNvbm5lY3Rpb25FbGVtZW50LmlubmVyVGV4dCA9IFwiVmVyYnVuZGVuXCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNsb3NlKGV2ZW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbV1NdIENsb3NlZCFcIiwgZXZlbnQpO1xuICAgICAgICBpZiggZXZlbnQud2FzQ2xlYW4gKVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgbW9kYWwgPSBuZXcgTW9kYWwoXCJzb2NrZXRDbG9zZWRcIiwgXCJTaXR6dW5nIGJlZW5kZXQhXCIpO1xuICAgICAgICAgICAgbW9kYWwuY29udGVudCA9IGBEaWVzZSBTaXR6dW5nIHd1cmRlIGJlZW5kZXQsIGRhIGRlciBpVGVuZGVyIG51biBhbiBlaW5lbSBhbmRlcmVuIEdlcsOkdCBiencuIGFuIGRlbSBIYXVwdGdlcsOkdCBnZXN0ZXVlcnQgd2lyZC48YnI+PGJyPmA7XG4gICAgICAgICAgICBtb2RhbC5hZGRCdXR0b24oQnV0dG9uVHlwZS5TVUNDRVNTLCBcIlNpdHp1bmcgd2llZGVyaGVyc3RlbGxlblwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtb2RhbC5vcGVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgbW9kYWwgPSBuZXcgTW9kYWwoXCJzb2NrZXRDbG9zZWRcIiwgXCJWZXJiaW5kdW5nc3Byb2JsZW0hXCIpO1xuICAgICAgICAgICAgbW9kYWwuY29udGVudCA9IGBEaWUgQmVudXR6ZXJvYmVyZmzDpGNoZSBoYXQgZGllIFZlcmJpbmR1bmcgbWl0IGRlbSBHZXLDpHQgdmVybG9yZW4uPGJyPkRpZSBWZXJiaW5kdW5nIHdpcmQgd2llZGVyaGVyZ2VzdGVsbHQuLi48YnI+YDtcbiAgICAgICAgICAgIG1vZGFsLmxvYWRlciA9IHRydWU7XG4gICAgICAgICAgICBtb2RhbC5vcGVuKCk7XG4gICAgICAgICAgICBzZXRJbnRlcnZhbCggKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICAgIH0sIDUwMDAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb25uZWN0aW9uRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmlnaHRcIik7XG4gICAgICAgIGlmIChjb25uZWN0aW9uRWxlbWVudClcbiAgICAgICAgICAgIGNvbm5lY3Rpb25FbGVtZW50LmlubmVyVGV4dCA9IFwiS2VpbmUgVmVyYmluZHVuZ1wiO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25FcnJvcihldmVudCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW1dTXSBFcnJvclwiLCBldmVudCk7XG4gICAgICAgIGxldCBjb25uZWN0aW9uRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicmlnaHRcIik7XG4gICAgICAgIGlmIChjb25uZWN0aW9uRWxlbWVudClcbiAgICAgICAgICAgIGNvbm5lY3Rpb25FbGVtZW50LmlubmVyVGV4dCA9IFwiRmVobGVyXCI7XG4gICAgICAgIC8vb3Blbk1vZGFsKFwiRWluZW4gQXVnZW5ibGljay4uLlwiLCBgRXMgd3VyZGUgZWluIGtyaXRpc2NoZXIgRmVobGVyIGZlc3RnZXN0ZWxsdC5cXG5CaXR0ZSB3YXJ0ZW4gU2llLCB3w6RocmVuZCBkZXIgUHJvemVzcyBuZXUgZ2VzdGFydGV0IHdpcmQuLi5gICk7XG4gICAgICAgIC8vd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH1cbn0iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiaW1wb3J0IHtXZWJXZWJTb2NrZXRIYW5kbGVyfSBmcm9tIFwiLi9XZWJXZWJTb2NrZXRIYW5kbGVyXCI7XG5pbXBvcnQge01vZGFsfSBmcm9tIFwiLi9Nb2RhbFwiO1xuXG5jb25zdCBtYWluID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtYWluXCIpO1xuY29uc3QgdGltZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidGl0bGVcIik7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IHtcbiAgIGNvbnNvbGUubG9nKFwiRE9NIExvYWRlZFwiKTtcblxuICAgbGV0IG1vZGFsID0gbmV3IE1vZGFsKFwic3RhcnRcIiwgXCJpVGVuZGVyXCIpO1xuICAgbW9kYWwuY29udGVudCA9IFwiV2lsbGtvbW1lblwiO1xuICAgbW9kYWwubG9hZGVyID0gdHJ1ZTtcbiAgIG1vZGFsLm9wZW4oKTtcbiAgIGNvbm5lY3QoKTtcblxuICAgc2V0VGltZW91dCggbG9hZCwgMTAwMCk7XG59KTtcblxuZnVuY3Rpb24gbG9hZCgpXG57XG4gICBpZighbWFpbnx8IXRpbWUpXG4gICAgICByZXR1cm47XG5cbiAgIHNldEludGVydmFsKCAoKSA9PiB7XG4gICAgICBsZXQgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgdGltZS5pbm5lclRleHQgPSBcIlwiICsgKCBjdXJyZW50RGF0ZS5nZXRIb3VycygpIDwgMTAgPyBcIjBcIiArIGN1cnJlbnREYXRlLmdldEhvdXJzKCkgOiBjdXJyZW50RGF0ZS5nZXRIb3VycygpICkgKyBcIjpcIiArICggY3VycmVudERhdGUuZ2V0TWludXRlcygpIDwgMTAgPyBcIjBcIiArIGN1cnJlbnREYXRlLmdldE1pbnV0ZXMoKSA6IGN1cnJlbnREYXRlLmdldE1pbnV0ZXMoKSApO1xuICAgfSwgMTAwMCApO1xuXG4gICBsZXQgbWF4SSA9IDIwO1xuXG4gICBtYWluLnN0eWxlLmdyaWRUZW1wbGF0ZVJvd3MgPSBgcmVwZWF0KCR7TWF0aC5yb3VuZChtYXhJLzMpfSwgY2FsYyg5MCUvMikpYDtcblxuXG4gICBmb3IoIGxldCBpID0gMDsgaTxtYXhJOyBpKysgKVxuICAge1xuICAgICAgbGV0IHRlc3REcmluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICB0ZXN0RHJpbmsuY2xhc3NMaXN0LmFkZChcImRyaW5rXCIpO1xuXG4gICAgICBsZXQgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcbiAgICAgIGltZy5jbGFzc0xpc3QuYWRkKFwidGh1bWJuYWlsXCIpO1xuICAgICAgdGVzdERyaW5rLmFwcGVuZChpbWcpO1xuXG4gICAgICBsZXQgbmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xuICAgICAgbmFtZS5jbGFzc0xpc3QuYWRkKFwibmFtZVwiKTtcbiAgICAgIHRlc3REcmluay5hcHBlbmQobmFtZSk7XG5cbiAgICAgIGltZy5hbHQ9XCJUaHVtYm5haWxcIjtcbiAgICAgIG5hbWUuaW5uZXJUZXh0ID0gXCJNaXhlcnlcIlxuXG4gICAgICBtYWluLmFwcGVuZCh0ZXN0RHJpbmspO1xuICAgfVxufVxuXG5sZXQgd3NIYW5kbGVyO1xuZnVuY3Rpb24gY29ubmVjdCgpXG57XG4gICB3c0hhbmRsZXIgPSBuZXcgV2ViV2ViU29ja2V0SGFuZGxlcigpO1xuXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file