From 241d39a2e492a94dbe86bbd9e458f6bac684b6c2 Mon Sep 17 00:00:00 2001 From: technyon Date: Sat, 6 Aug 2022 09:47:23 +0200 Subject: [PATCH] add favicon --- CMakeLists.txt | 1 + WebCfgServer.cpp | 16 +++++++- WebCfgServer.h | 9 +---- WebCfgServerConstants.h | 66 ++++++++++++++++++++++++++++++++ icon/favicon-16x16.png | Bin 0 -> 437 bytes icon/favicon-32x32.png | Bin 0 -> 820 bytes icon/icon-192x192.png | Bin 0 -> 6515 bytes icon/icon-512x512.png | Bin 0 -> 17891 bytes icon/link.txt | 2 + lib/WebServer/src/WebServer.cpp | 10 +++++ lib/WebServer/src/WebServer.h | 1 + 11 files changed, 95 insertions(+), 10 deletions(-) create mode 100644 WebCfgServerConstants.h create mode 100755 icon/favicon-16x16.png create mode 100755 icon/favicon-32x32.png create mode 100755 icon/icon-192x192.png create mode 100755 icon/icon-512x512.png create mode 100644 icon/link.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 8f5379e..1137d26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,7 @@ file(GLOB SRCFILES NukiOpenerWrapper.cpp MqttTopics.h Ota.cpp + WebCfgServerConstants.h WebCfgServer.cpp PresenceDetection.cpp PreferencesKeys.h diff --git a/WebCfgServer.cpp b/WebCfgServer.cpp index 994f312..80e8b14 100644 --- a/WebCfgServer.cpp +++ b/WebCfgServer.cpp @@ -1,4 +1,5 @@ #include "WebCfgServer.h" +#include "WebCfgServerConstants.h" #include "PreferencesKeys.h" #include "Version.h" #include "hardware/WifiEthServer.h" @@ -53,6 +54,12 @@ void WebCfgServer::initialize() } sendFontsInterMinCss(); }); + _server.on("/favicon.ico", HTTP_GET, [&]() { + if (_hasCredentials && !_server.authenticate(_credUser, _credPassword)) { + return _server.requestAuthentication(); + } + sendFavicon(); + }); _server.on("/cred", [&]() { if (_hasCredentials && !_server.authenticate(_credUser, _credPassword)) { return _server.requestAuthentication(); @@ -832,11 +839,16 @@ void WebCfgServer::handleOtaUpload() void WebCfgServer::sendNewCss() { // escaped by https://www.cescaper.com/ - _server.send(200, "text/plain", newcss); + _server.send(200, "text/plain", newcss, sizeof(newcss)); } void WebCfgServer::sendFontsInterMinCss() { // escaped by https://www.cescaper.com/ - _server.send(200, "text/plain", intercss); + _server.send(200, "text/plain", intercss, sizeof(intercss)); +} + +void WebCfgServer::sendFavicon() +{ + _server.send(200, "image/png", (const char*)favicon_32x32, sizeof(favicon_32x32)); } diff --git a/WebCfgServer.h b/WebCfgServer.h index 09b40da..f33f01e 100644 --- a/WebCfgServer.h +++ b/WebCfgServer.h @@ -39,6 +39,7 @@ private: void buildConfigureWifiHtml(String& response); void sendNewCss(); void sendFontsInterMinCss(); + void sendFavicon(); void processUnpair(bool opener); void buildHtmlHeader(String& response); @@ -61,14 +62,6 @@ private: Preferences* _preferences; Ota _ota; - // escaped by https://www.cescaper.com/ - // source: https://cdn.jsdelivr.net/npm/@exampledev/new.css@1.1.2/new.min.css - const String newcss = ":root{--nc-font-sans:\\'Inter\\',-apple-system,BlinkMacSystemFont,\\'Segoe UI\\',Roboto,Oxygen,Ubuntu,Cantarell,\\'Open Sans\\',\\'Helvetica Neue\\',sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\",\\\"Segoe UI Symbol\\\";--nc-font-mono:Consolas,monaco,\\'Ubuntu Mono\\',\\'Liberation Mono\\',\\'Courier New\\',Courier,monospace;--nc-tx-1:#000000;--nc-tx-2:#1A1A1A;--nc-bg-1:#FFFFFF;--nc-bg-2:#F6F8FA;--nc-bg-3:#E5E7EB;--nc-lk-1:#0070F3;--nc-lk-2:#0366D6;--nc-lk-tx:#FFFFFF;--nc-ac-1:#79FFE1;--nc-ac-tx:#0C4047}@media (prefers-color-scheme:dark){:root{--nc-tx-1:#ffffff;--nc-tx-2:#eeeeee;--nc-bg-1:#000000;--nc-bg-2:#111111;--nc-bg-3:#222222;--nc-lk-1:#3291FF;--nc-lk-2:#0070F3;--nc-lk-tx:#FFFFFF;--nc-ac-1:#7928CA;--nc-ac-tx:#FFFFFF}}*{margin:0;padding:0}address,area,article,aside,audio,blockquote,datalist,details,dl,fieldset,figure,form,iframe,img,input,meter,nav,ol,optgroup,option,output,p,pre,progress,ruby,section,table,textarea,ul,video{margin-bottom:1rem}button,html,input,select{font-family:var(--nc-font-sans)}body{margin:0 auto;max-width:750px;padding:2rem;border-radius:6px;overflow-x:hidden;word-break:break-word;overflow-wrap:break-word;background:var(--nc-bg-1);color:var(--nc-tx-2);font-size:1.03rem;line-height:1.5}::selection{background:var(--nc-ac-1);color:var(--nc-ac-tx)}h1,h2,h3,h4,h5,h6{line-height:1;color:var(--nc-tx-1);padding-top:.875rem}h1,h2,h3{color:var(--nc-tx-1);padding-bottom:2px;margin-bottom:8px;border-bottom:1px solid var(--nc-bg-2)}h4,h5,h6{margin-bottom:.3rem}h1{font-size:2.25rem}h2{font-size:1.85rem}h3{font-size:1.55rem}h4{font-size:1.25rem}h5{font-size:1rem}h6{font-size:.875rem}a{color:var(--nc-lk-1)}a:hover{color:var(--nc-lk-2)}abbr:hover{cursor:help}blockquote{padding:1.5rem;background:var(--nc-bg-2);border-left:5px solid var(--nc-bg-3)}abbr{cursor:help}blockquote :last-child{padding-bottom:0;margin-bottom:0}header{background:var(--nc-bg-2);border-bottom:1px solid var(--nc-bg-3);padding:2rem 1.5rem;margin:-2rem calc(0px - (50vw - 50%)) 2rem;padding-left:calc(50vw - 50%);padding-right:calc(50vw - 50%)}header h1,header h2,header h3{padding-bottom:0;border-bottom:0}header>:first-child{margin-top:0;padding-top:0}header>:last-child{margin-bottom:0}a button,button,input[type=button],input[type=reset],input[type=submit]{font-size:1rem;display:inline-block;padding:6px 12px;text-align:center;text-decoration:none;white-space:nowrap;background:var(--nc-lk-1);color:var(--nc-lk-tx);border:0;border-radius:4px;box-sizing:border-box;cursor:pointer;color:var(--nc-lk-tx)}a button[disabled],button[disabled],input[type=button][disabled],input[type=reset][disabled],input[type=submit][disabled]{cursor:default;opacity:.5;cursor:not-allowed}.button:focus,.button:hover,button:focus,button:hover,input[type=button]:focus,input[type=button]:hover,input[type=reset]:focus,input[type=reset]:hover,input[type=submit]:focus,input[type=submit]:hover{background:var(--nc-lk-2)}code,kbd,pre,samp{font-family:var(--nc-font-mono)}code,kbd,pre,samp{background:var(--nc-bg-2);border:1px solid var(--nc-bg-3);border-radius:4px;padding:3px 6px;font-size:.9rem}kbd{border-bottom:3px solid var(--nc-bg-3)}pre{padding:1rem 1.4rem;max-width:100%;overflow:auto}pre code{background:inherit;font-size:inherit;color:inherit;border:0;padding:0;margin:0}code pre{display:inline;background:inherit;font-size:inherit;color:inherit;border:0;padding:0;margin:0}details{padding:.6rem 1rem;background:var(--nc-bg-2);border:1px solid var(--nc-bg-3);border-radius:4px}summary{cursor:pointer;font-weight:700}details[open]{padding-bottom:.75rem}details[open] summary{margin-bottom:6px}details[open]>:last-child{margin-bottom:0}dt{font-weight:700}dd::before{content:\\'→ \\'}hr{border:0;border-bottom:1px solid var(--nc-bg-3);margin:1rem auto}fieldset{margin-top:1rem;padding:2rem;border:1px solid var(--nc-bg-3);border-radius:4px}legend{padding:auto .5rem}table{border-collapse:collapse;width:100%}td,th{border:1px solid var(--nc-bg-3);text-align:left;padding:.5rem}th{background:var(--nc-bg-2)}tr:nth-child(even){background:var(--nc-bg-2)}table caption{font-weight:700;margin-bottom:.5rem}textarea{max-width:100%}ol,ul{padding-left:2rem}li{margin-top:.4rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}mark{padding:3px 6px;background:var(--nc-ac-1);color:var(--nc-ac-tx)}input,select,textarea{padding:6px 12px;margin-bottom:.5rem;background:var(--nc-bg-2);color:var(--nc-tx-2);border:1px solid var(--nc-bg-3);border-radius:4px;box-shadow:none;box-sizing:border-box}img{max-width:100%}"; - - // escaped by https://www.cescaper.com/ - // source: https://cdn.jsdelivr.net/npm/open-fonts@1.1.1/fonts/inter.min.css - const String intercss = "@font-face{font-family:Inter;src:url(src/inter/Inter-Thin.woff2) format(\\'woff2\\'),url(src/inter/Inter-Thin.woff) format(\\'woff\\'),url(src/inter/Inter-Thin.ttf) format(\\'truetype\\');font-weight:100;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-ExtraLight.woff2) format(\\'woff2\\'),url(src/inter/Inter-ExtraLight.woff) format(\\'woff\\'),url(src/inter/Inter-ExtraLight.ttf) format(\\'truetype\\');font-weight:200;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-Light.woff2) format(\\'woff2\\'),url(src/inter/Inter-Light.woff) format(\\'woff\\'),url(src/inter/Inter-Light.ttf) format(\\'truetype\\');font-weight:300;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-Regular.woff2) format(\\'woff2\\'),url(src/inter/Inter-Regular.woff) format(\\'woff\\'),url(src/inter/Inter-Regular.ttf) format(\\'truetype\\');font-weight:400;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-Medium.woff2) format(\\'woff2\\'),url(src/inter/Inter-Medium.woff) format(\\'woff\\'),url(src/inter/Inter-Medium.ttf) format(\\'truetype\\');font-weight:500;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-SemiBold.woff2) format(\\'woff2\\'),url(src/inter/Inter-SemiBold.woff) format(\\'woff\\'),url(src/inter/Inter-SemiBold.ttf) format(\\'truetype\\');font-weight:600;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-Bold.woff2) format(\\'woff2\\'),url(src/inter/Inter-Bold.woff) format(\\'woff\\'),url(src/inter/Inter-Bold.ttf) format(\\'truetype\\');font-weight:700;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-ExtraBold.woff2) format(\\'woff2\\'),url(src/inter/Inter-ExtraBold.woff) format(\\'woff\\'),url(src/inter/Inter-ExtraBold.ttf) format(\\'truetype\\');font-weight:800;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-Black.woff2) format(\\'woff2\\'),url(src/inter/Inter-Black.woff) format(\\'woff\\'),url(src/inter/Inter-Black.ttf) format(\\'truetype\\');font-weight:900;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-ThinItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-ThinItalic.woff) format(\\'woff\\'),url(src/inter/Inter-ThinItalic.ttf) format(\\'truetype\\');font-weight:100;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-ExtraLightItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-ExtraLightItalic.woff) format(\\'woff\\'),url(src/inter/Inter-ExtraLightItalic.ttf) format(\\'truetype\\');font-weight:200;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-LightItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-LightItalic.woff) format(\\'woff\\'),url(src/inter/Inter-LightItalic.ttf) format(\\'truetype\\');font-weight:300;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-Italic.woff2) format(\\'woff2\\'),url(src/inter/Inter-Italic.woff) format(\\'woff\\'),url(src/inter/Inter-Italic.ttf) format(\\'truetype\\');font-weight:400;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-MediumItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-MediumItalic.woff) format(\\'woff\\'),url(src/inter/Inter-MediumItalic.ttf) format(\\'truetype\\');font-weight:500;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-SemiBoldItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-SemiBoldItalic.woff) format(\\'woff\\'),url(src/inter/Inter-SemiBoldItalic.ttf) format(\\'truetype\\');font-weight:600;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-BoldItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-BoldItalic.woff) format(\\'woff\\'),url(src/inter/Inter-BoldItalic.ttf) format(\\'truetype\\');font-weight:700;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-ExtraBoldItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-ExtraBoldItalic.woff) format(\\'woff\\'),url(src/inter/Inter-ExtraBoldItalic.ttf) format(\\'truetype\\');font-weight:800;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-BlackItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-BlackItalic.woff) format(\\'woff\\'),url(src/inter/Inter-BlackItalic.ttf) format(\\'truetype\\');font-weight:900;font-style:italic}"; - bool _hasCredentials = false; char _credUser[31] = {0}; char _credPassword[31] = {0}; diff --git a/WebCfgServerConstants.h b/WebCfgServerConstants.h new file mode 100644 index 0000000..a6bbb56 --- /dev/null +++ b/WebCfgServerConstants.h @@ -0,0 +1,66 @@ +#pragma once + + +// escaped by https://www.cescaper.com/ +// source: https://cdn.jsdelivr.net/npm/@exampledev/new.css@1.1.2/new.min.css +const char newcss[] = ":root{--nc-font-sans:\\'Inter\\',-apple-system,BlinkMacSystemFont,\\'Segoe UI\\',Roboto,Oxygen,Ubuntu,Cantarell,\\'Open Sans\\',\\'Helvetica Neue\\',sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\",\\\"Segoe UI Symbol\\\";--nc-font-mono:Consolas,monaco,\\'Ubuntu Mono\\',\\'Liberation Mono\\',\\'Courier New\\',Courier,monospace;--nc-tx-1:#000000;--nc-tx-2:#1A1A1A;--nc-bg-1:#FFFFFF;--nc-bg-2:#F6F8FA;--nc-bg-3:#E5E7EB;--nc-lk-1:#0070F3;--nc-lk-2:#0366D6;--nc-lk-tx:#FFFFFF;--nc-ac-1:#79FFE1;--nc-ac-tx:#0C4047}@media (prefers-color-scheme:dark){:root{--nc-tx-1:#ffffff;--nc-tx-2:#eeeeee;--nc-bg-1:#000000;--nc-bg-2:#111111;--nc-bg-3:#222222;--nc-lk-1:#3291FF;--nc-lk-2:#0070F3;--nc-lk-tx:#FFFFFF;--nc-ac-1:#7928CA;--nc-ac-tx:#FFFFFF}}*{margin:0;padding:0}address,area,article,aside,audio,blockquote,datalist,details,dl,fieldset,figure,form,iframe,img,input,meter,nav,ol,optgroup,option,output,p,pre,progress,ruby,section,table,textarea,ul,video{margin-bottom:1rem}button,html,input,select{font-family:var(--nc-font-sans)}body{margin:0 auto;max-width:750px;padding:2rem;border-radius:6px;overflow-x:hidden;word-break:break-word;overflow-wrap:break-word;background:var(--nc-bg-1);color:var(--nc-tx-2);font-size:1.03rem;line-height:1.5}::selection{background:var(--nc-ac-1);color:var(--nc-ac-tx)}h1,h2,h3,h4,h5,h6{line-height:1;color:var(--nc-tx-1);padding-top:.875rem}h1,h2,h3{color:var(--nc-tx-1);padding-bottom:2px;margin-bottom:8px;border-bottom:1px solid var(--nc-bg-2)}h4,h5,h6{margin-bottom:.3rem}h1{font-size:2.25rem}h2{font-size:1.85rem}h3{font-size:1.55rem}h4{font-size:1.25rem}h5{font-size:1rem}h6{font-size:.875rem}a{color:var(--nc-lk-1)}a:hover{color:var(--nc-lk-2)}abbr:hover{cursor:help}blockquote{padding:1.5rem;background:var(--nc-bg-2);border-left:5px solid var(--nc-bg-3)}abbr{cursor:help}blockquote :last-child{padding-bottom:0;margin-bottom:0}header{background:var(--nc-bg-2);border-bottom:1px solid var(--nc-bg-3);padding:2rem 1.5rem;margin:-2rem calc(0px - (50vw - 50%)) 2rem;padding-left:calc(50vw - 50%);padding-right:calc(50vw - 50%)}header h1,header h2,header h3{padding-bottom:0;border-bottom:0}header>:first-child{margin-top:0;padding-top:0}header>:last-child{margin-bottom:0}a button,button,input[type=button],input[type=reset],input[type=submit]{font-size:1rem;display:inline-block;padding:6px 12px;text-align:center;text-decoration:none;white-space:nowrap;background:var(--nc-lk-1);color:var(--nc-lk-tx);border:0;border-radius:4px;box-sizing:border-box;cursor:pointer;color:var(--nc-lk-tx)}a button[disabled],button[disabled],input[type=button][disabled],input[type=reset][disabled],input[type=submit][disabled]{cursor:default;opacity:.5;cursor:not-allowed}.button:focus,.button:hover,button:focus,button:hover,input[type=button]:focus,input[type=button]:hover,input[type=reset]:focus,input[type=reset]:hover,input[type=submit]:focus,input[type=submit]:hover{background:var(--nc-lk-2)}code,kbd,pre,samp{font-family:var(--nc-font-mono)}code,kbd,pre,samp{background:var(--nc-bg-2);border:1px solid var(--nc-bg-3);border-radius:4px;padding:3px 6px;font-size:.9rem}kbd{border-bottom:3px solid var(--nc-bg-3)}pre{padding:1rem 1.4rem;max-width:100%;overflow:auto}pre code{background:inherit;font-size:inherit;color:inherit;border:0;padding:0;margin:0}code pre{display:inline;background:inherit;font-size:inherit;color:inherit;border:0;padding:0;margin:0}details{padding:.6rem 1rem;background:var(--nc-bg-2);border:1px solid var(--nc-bg-3);border-radius:4px}summary{cursor:pointer;font-weight:700}details[open]{padding-bottom:.75rem}details[open] summary{margin-bottom:6px}details[open]>:last-child{margin-bottom:0}dt{font-weight:700}dd::before{content:\\'→ \\'}hr{border:0;border-bottom:1px solid var(--nc-bg-3);margin:1rem auto}fieldset{margin-top:1rem;padding:2rem;border:1px solid var(--nc-bg-3);border-radius:4px}legend{padding:auto .5rem}table{border-collapse:collapse;width:100%}td,th{border:1px solid var(--nc-bg-3);text-align:left;padding:.5rem}th{background:var(--nc-bg-2)}tr:nth-child(even){background:var(--nc-bg-2)}table caption{font-weight:700;margin-bottom:.5rem}textarea{max-width:100%}ol,ul{padding-left:2rem}li{margin-top:.4rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}mark{padding:3px 6px;background:var(--nc-ac-1);color:var(--nc-ac-tx)}input,select,textarea{padding:6px 12px;margin-bottom:.5rem;background:var(--nc-bg-2);color:var(--nc-tx-2);border:1px solid var(--nc-bg-3);border-radius:4px;box-shadow:none;box-sizing:border-box}img{max-width:100%}"; + +// escaped by https://www.cescaper.com/ +// source: https://cdn.jsdelivr.net/npm/open-fonts@1.1.1/fonts/inter.min.css +const char intercss[] = "@font-face{font-family:Inter;src:url(src/inter/Inter-Thin.woff2) format(\\'woff2\\'),url(src/inter/Inter-Thin.woff) format(\\'woff\\'),url(src/inter/Inter-Thin.ttf) format(\\'truetype\\');font-weight:100;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-ExtraLight.woff2) format(\\'woff2\\'),url(src/inter/Inter-ExtraLight.woff) format(\\'woff\\'),url(src/inter/Inter-ExtraLight.ttf) format(\\'truetype\\');font-weight:200;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-Light.woff2) format(\\'woff2\\'),url(src/inter/Inter-Light.woff) format(\\'woff\\'),url(src/inter/Inter-Light.ttf) format(\\'truetype\\');font-weight:300;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-Regular.woff2) format(\\'woff2\\'),url(src/inter/Inter-Regular.woff) format(\\'woff\\'),url(src/inter/Inter-Regular.ttf) format(\\'truetype\\');font-weight:400;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-Medium.woff2) format(\\'woff2\\'),url(src/inter/Inter-Medium.woff) format(\\'woff\\'),url(src/inter/Inter-Medium.ttf) format(\\'truetype\\');font-weight:500;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-SemiBold.woff2) format(\\'woff2\\'),url(src/inter/Inter-SemiBold.woff) format(\\'woff\\'),url(src/inter/Inter-SemiBold.ttf) format(\\'truetype\\');font-weight:600;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-Bold.woff2) format(\\'woff2\\'),url(src/inter/Inter-Bold.woff) format(\\'woff\\'),url(src/inter/Inter-Bold.ttf) format(\\'truetype\\');font-weight:700;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-ExtraBold.woff2) format(\\'woff2\\'),url(src/inter/Inter-ExtraBold.woff) format(\\'woff\\'),url(src/inter/Inter-ExtraBold.ttf) format(\\'truetype\\');font-weight:800;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-Black.woff2) format(\\'woff2\\'),url(src/inter/Inter-Black.woff) format(\\'woff\\'),url(src/inter/Inter-Black.ttf) format(\\'truetype\\');font-weight:900;font-style:normal}@font-face{font-family:Inter;src:url(src/inter/Inter-ThinItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-ThinItalic.woff) format(\\'woff\\'),url(src/inter/Inter-ThinItalic.ttf) format(\\'truetype\\');font-weight:100;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-ExtraLightItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-ExtraLightItalic.woff) format(\\'woff\\'),url(src/inter/Inter-ExtraLightItalic.ttf) format(\\'truetype\\');font-weight:200;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-LightItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-LightItalic.woff) format(\\'woff\\'),url(src/inter/Inter-LightItalic.ttf) format(\\'truetype\\');font-weight:300;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-Italic.woff2) format(\\'woff2\\'),url(src/inter/Inter-Italic.woff) format(\\'woff\\'),url(src/inter/Inter-Italic.ttf) format(\\'truetype\\');font-weight:400;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-MediumItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-MediumItalic.woff) format(\\'woff\\'),url(src/inter/Inter-MediumItalic.ttf) format(\\'truetype\\');font-weight:500;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-SemiBoldItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-SemiBoldItalic.woff) format(\\'woff\\'),url(src/inter/Inter-SemiBoldItalic.ttf) format(\\'truetype\\');font-weight:600;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-BoldItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-BoldItalic.woff) format(\\'woff\\'),url(src/inter/Inter-BoldItalic.ttf) format(\\'truetype\\');font-weight:700;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-ExtraBoldItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-ExtraBoldItalic.woff) format(\\'woff\\'),url(src/inter/Inter-ExtraBoldItalic.ttf) format(\\'truetype\\');font-weight:800;font-style:italic}@font-face{font-family:Inter;src:url(src/inter/Inter-BlackItalic.woff2) format(\\'woff2\\'),url(src/inter/Inter-BlackItalic.woff) format(\\'woff\\'),url(src/inter/Inter-BlackItalic.ttf) format(\\'truetype\\');font-weight:900;font-style:italic}"; + +// converted to char array by https://notisrac.github.io/FileToCArray/ +const unsigned char favicon_32x32[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a, + 0xf4, 0x00, 0x00, 0x02, 0xfb, 0x49, 0x44, 0x41, 0x54, 0x58, 0x47, 0xcd, 0x97, 0x4b, 0x4c, 0x53, + 0x41, 0x14, 0x86, 0xff, 0x69, 0xa5, 0x3c, 0x8a, 0x12, 0x14, 0x84, 0xa6, 0x96, 0x60, 0x6d, 0xd0, + 0x50, 0x14, 0x51, 0xd1, 0x6a, 0x4c, 0x51, 0x63, 0x88, 0x8a, 0x06, 0x63, 0x42, 0xc0, 0x85, 0x01, + 0xc3, 0xae, 0xe8, 0x0a, 0x0d, 0x4a, 0x30, 0x31, 0x18, 0xd1, 0x84, 0x18, 0x83, 0x46, 0x5d, 0xa9, + 0x09, 0xb8, 0x01, 0xa2, 0x31, 0x82, 0x31, 0x82, 0x6e, 0x48, 0x78, 0xb6, 0x74, 0xe1, 0x8b, 0x47, + 0xb0, 0x3e, 0x0a, 0xb4, 0x05, 0xa1, 0xe1, 0x25, 0x14, 0x68, 0xeb, 0x9d, 0x22, 0xb7, 0x40, 0x1f, + 0x1b, 0xef, 0xa5, 0xce, 0xea, 0xde, 0x99, 0xce, 0x39, 0xdf, 0xfc, 0x7f, 0x67, 0xee, 0x1c, 0xe2, + 0xbc, 0x0e, 0x81, 0xe3, 0x84, 0xba, 0x58, 0x40, 0x88, 0xc6, 0x09, 0x48, 0xb0, 0x0a, 0x8d, 0x00, + 0x26, 0x07, 0x71, 0x3e, 0x14, 0xd4, 0x37, 0x95, 0x11, 0x7b, 0x87, 0xba, 0x84, 0x10, 0x72, 0x63, + 0x15, 0xf2, 0x7a, 0xa4, 0x70, 0x12, 0xe7, 0x35, 0xe2, 0xe8, 0x48, 0x33, 0x81, 0x20, 0x36, 0x10, + 0x00, 0x4c, 0x4e, 0x33, 0x71, 0x68, 0xd3, 0x18, 0xe5, 0x03, 0xd7, 0xfe, 0x6f, 0x80, 0x86, 0xb6, + 0x51, 0xd4, 0xbe, 0x1b, 0x66, 0xe5, 0xd1, 0x64, 0x49, 0x91, 0xb2, 0x35, 0xdc, 0xaf, 0x5c, 0x25, + 0x8f, 0xbe, 0xc1, 0x36, 0xeb, 0x60, 0x7f, 0x93, 0x79, 0x28, 0x0a, 0x07, 0x93, 0x23, 0x7c, 0xce, + 0xf1, 0xab, 0xc0, 0x9d, 0x67, 0x46, 0x5c, 0xae, 0x30, 0xb0, 0x93, 0x93, 0xb6, 0x88, 0xa1, 0xad, + 0xdc, 0x85, 0x60, 0x91, 0xc0, 0x67, 0xc0, 0xc8, 0xc3, 0xcd, 0x18, 0x9b, 0x9c, 0x67, 0xc7, 0x2b, + 0x2e, 0x29, 0x70, 0x31, 0x5b, 0xca, 0x0d, 0x00, 0x8d, 0x72, 0xf5, 0x7c, 0x1c, 0x6e, 0x6a, 0x36, + 0xfb, 0x0c, 0xb8, 0xe1, 0x48, 0x33, 0xac, 0x13, 0x3c, 0x02, 0xac, 0x11, 0x12, 0xb4, 0x3c, 0x49, + 0xc1, 0x9e, 0xc4, 0xb5, 0x5e, 0x21, 0xa2, 0x8f, 0xb6, 0x60, 0x64, 0x6c, 0x8e, 0x3f, 0x05, 0x68, + 0x64, 0xa5, 0x5c, 0x0c, 0x5d, 0x95, 0x77, 0x2b, 0x62, 0xd2, 0x5b, 0x30, 0x6c, 0xe5, 0x19, 0xc0, + 0x9f, 0x15, 0x92, 0x63, 0xad, 0xb0, 0x8c, 0xcc, 0xf2, 0xab, 0x00, 0x8d, 0x4e, 0xad, 0x68, 0x66, + 0xac, 0x48, 0x5d, 0x61, 0xc5, 0xa6, 0xe3, 0xad, 0x18, 0xfc, 0xc5, 0x13, 0xc0, 0x3a, 0xb1, 0x10, + 0xe3, 0x53, 0x76, 0x76, 0x75, 0x4a, 0x79, 0x18, 0x63, 0xc5, 0xee, 0x65, 0xbb, 0x22, 0x2e, 0xa3, + 0x0d, 0xfd, 0x43, 0x36, 0x7e, 0x14, 0x50, 0xa7, 0x44, 0xb8, 0x92, 0x35, 0xb6, 0x5b, 0xd9, 0x04, + 0x57, 0xf2, 0x64, 0x28, 0x2b, 0x90, 0xb3, 0xef, 0xf1, 0xa7, 0xda, 0xf0, 0xd3, 0xcc, 0x13, 0x00, + 0x3d, 0x84, 0x6a, 0x6e, 0x27, 0x62, 0x47, 0x8e, 0x0e, 0xd3, 0xb6, 0x85, 0xc3, 0xc6, 0x65, 0xc5, + 0x63, 0xc6, 0x0a, 0xe5, 0xc2, 0xae, 0x90, 0x67, 0xb6, 0xe3, 0xfb, 0xe0, 0x0c, 0x3f, 0x0a, 0x50, + 0xc9, 0x3f, 0x56, 0xa7, 0xa2, 0xbc, 0xd2, 0x88, 0xa2, 0xfb, 0xee, 0x03, 0x2a, 0xf1, 0xaf, 0x15, + 0x21, 0x8c, 0x3a, 0x8a, 0xd3, 0xed, 0x30, 0x0c, 0xf0, 0x04, 0xb0, 0x2d, 0x3e, 0x0c, 0x5f, 0x6a, + 0x53, 0x31, 0x6f, 0x77, 0x42, 0x95, 0xab, 0x87, 0xbe, 0x67, 0x92, 0x5d, 0x69, 0x51, 0xae, 0x0c, + 0xb7, 0x2e, 0xc8, 0x91, 0x70, 0xa6, 0x03, 0x7d, 0xc6, 0x69, 0x7e, 0x14, 0x48, 0x88, 0x0b, 0x45, + 0xf7, 0xf3, 0xbd, 0xae, 0xe0, 0xfa, 0xee, 0x49, 0xa8, 0xf2, 0xf4, 0x2e, 0x18, 0xda, 0x84, 0x02, + 0xba, 0x2b, 0x76, 0x22, 0xbf, 0xb4, 0x17, 0x9f, 0x0d, 0x53, 0xfc, 0x00, 0x28, 0x64, 0xa1, 0xe8, + 0x7d, 0xb1, 0x00, 0x40, 0x5b, 0xd1, 0x3d, 0x03, 0xca, 0xab, 0x8c, 0xec, 0xfb, 0x76, 0x85, 0x18, + 0xa2, 0x20, 0x01, 0x3a, 0xbb, 0x26, 0xf8, 0x01, 0x90, 0x4b, 0x43, 0xd0, 0xf7, 0x72, 0x1f, 0x1b, + 0xfc, 0xf7, 0x8c, 0x1d, 0xc9, 0x67, 0x3b, 0xf1, 0xb5, 0xdf, 0x2d, 0x39, 0x23, 0x04, 0x1c, 0x4b, + 0x6e, 0x18, 0x9c, 0x7e, 0x8c, 0xe2, 0x25, 0x21, 0x30, 0xbc, 0x72, 0x03, 0x50, 0x92, 0xf7, 0x5a, + 0x2b, 0xd2, 0x35, 0x1f, 0xe0, 0xeb, 0x56, 0xc3, 0x29, 0x80, 0x2c, 0x36, 0x18, 0x3f, 0xea, 0x54, + 0xac, 0x02, 0x8b, 0x0f, 0xf9, 0xa5, 0x3d, 0x78, 0x5a, 0x67, 0xf6, 0xe8, 0xa7, 0x1d, 0x9c, 0x02, + 0x48, 0x37, 0x06, 0xc3, 0xf8, 0xda, 0x13, 0x60, 0x74, 0x7c, 0x0e, 0xca, 0x2c, 0x1d, 0x2c, 0xa3, + 0xee, 0x23, 0x78, 0x91, 0x86, 0x53, 0x00, 0x49, 0x94, 0x08, 0x03, 0x6f, 0xf6, 0x7b, 0x5d, 0x69, + 0x4d, 0xe3, 0x10, 0x72, 0x8a, 0xbb, 0x3c, 0xc6, 0x38, 0x05, 0x88, 0x59, 0x2f, 0x82, 0xe9, 0xad, + 0x77, 0x00, 0x9a, 0x39, 0xb3, 0xf0, 0x13, 0xea, 0x9a, 0x46, 0x96, 0x41, 0x70, 0x0a, 0x10, 0x1d, + 0x19, 0x04, 0x4b, 0xc3, 0x01, 0xaf, 0x0a, 0xd0, 0xce, 0x7e, 0x8b, 0x0d, 0x49, 0xd9, 0xda, 0x65, + 0x1f, 0xac, 0x7f, 0x02, 0x58, 0x79, 0x29, 0x0d, 0x0f, 0x15, 0xe2, 0x6e, 0xa1, 0xc2, 0x27, 0x00, + 0x1d, 0xa8, 0x66, 0xac, 0xa8, 0x5f, 0xa2, 0xc2, 0xb9, 0x8c, 0x58, 0xa4, 0xab, 0x22, 0x7d, 0xce, + 0xf9, 0xbf, 0xaf, 0xe5, 0x7e, 0x97, 0xca, 0xd1, 0x20, 0x55, 0xc0, 0xc4, 0xc4, 0x0a, 0x5c, 0x69, + 0x66, 0xd7, 0x31, 0xc5, 0xa9, 0x33, 0x30, 0xc5, 0x29, 0xa1, 0xc5, 0xa9, 0xab, 0x3c, 0x3f, 0xa9, + 0x2e, 0x66, 0x20, 0x0a, 0x56, 0x51, 0x09, 0x33, 0x93, 0xfc, 0x01, 0xf3, 0x6f, 0x2d, 0xfb, 0x03, + 0xed, 0x06, 0xb0, 0xce, 0xb5, 0xc4, 0xb4, 0x59, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, + 0xae, 0x42, 0x60, 0x82 +}; \ No newline at end of file diff --git a/icon/favicon-16x16.png b/icon/favicon-16x16.png new file mode 100755 index 0000000000000000000000000000000000000000..68ca69e3177a239b7a4cedcb8249ed7dc85128a8 GIT binary patch literal 437 zcmV;m0ZRUfP) z{QAdme7+&r5E#H}07%l#ke^}S41ESBCPuJY9^1nV-+qu_07%os5*3EraA~jseD+5e zzI^*joC}2cSr~xcW%vbj@`dFlV6O-`9AWtMl}H1`g;*I{G8Gw8TW`U=BI0t4;lt-Y z#JYf$;ni*{2ItI+3%+NCT5yP7gzlk$IkdKAo?Otn!+mF687(|@`2P7yg zKNA}Upm=`2-x?fvoeLf@R8GAQk2a#Bk(Y~^;p0IYu%_RCfQcvm9K(fMU%-5#3;-ph z&xarefWX=7pBXF?&olh}`yamnu%yfk^su*$FiKKBcB~qA~ fD9O%@!0ZeF(FEmh(2;(t00000NkvXXu0mjf>&L`C literal 0 HcmV?d00001 diff --git a/icon/favicon-32x32.png b/icon/favicon-32x32.png new file mode 100755 index 0000000000000000000000000000000000000000..d6c6c8bfb4b18fa47a1000240c30ffcc0784895b GIT binary patch literal 820 zcmV-41Izr0P)!Jn#tBHU3XK3J2XQ_W)Hjt8dxyG&5OQM`@_M9j66ZDI=twhxAT|&HOinX#Xww+w z1K0j>L<6i}x`xRN!tTiFCx@?b+)3$}f#%0B0#tP-au8?Q8iN5m8*xoXOdlMQLYTPF36E^rUQM(X?_$)hzmvc z^S!R%`tC`n^7Jkk+JpkSD|RBkv=^TZQ~UrZWTEJNu>e3@(LDpotBmaXc7+(CAOSkN zCinr6OGD82avvM~_lzCMXFKt=-z_;K1RP6l7@U5L;w2$4ymA9jlJ{CG(lsC8>sG@l zfGjo`Kk8Jh0*ep%r9F6BXZGl)9h?G4HwMG_+7n=Od=APi9W0~nBY2U9QvgYn2m^2S zdtGTw;}CL+yFA7?1&CQMg6XYy0Gc_o@Du8qMwUTv3J@I`1WUsKuL{u4ev1uB+1h0v ztbYPnc_|GK727r!$GV;duD7{-=;DLa*!$(l&k$Zim_Zy^k0DZ4_J?2+tL)-WhZ)|4$f zG1;<{^*4UsKkmKfdG2%0J?DJRd*1VY?lV1I4LWLeY5)M}v@})qNl(JX1*IU}^(P-u z0>EV@EmgGPW6O05%Ev~ZFXecE-e21|X%2Ppcl0wR zlUE%@h*iJ%&I?YzhtN2;e*b-A}z=AmyaXp93_se(U0hJ+YF&l`4Ic356VAZMAu zGIQsj0?xB4UE0RLYufn}Jqwvjub{eu9`lQdR4&g#_c~T?&z;-vm6mPSAPKQ3&VGYh z+QJW+F2%|&A{Jm`U<#dFg;2$>M|@kXr{DTTp6Aklmu{gRlq$|Qqx%A*WyE`ujnBUe z5VGTK2F6_{^agiVGy&7mEO(zGjehtbAxwMUHM4Wtr0m0r;7ckv_o<;>)<$~7w`_3# zL=wpu3ko@soaakh(sC5~_Bb$?oUqqQXWNn6-sbpiv7S(Un{^6}ltYi2kw>VD-EHJ- z$_29cZm+_EB}Uj+bo=y;;nfu2qqJX1gJLekqtmaaE!u$6`jA}*%R*oq!B-(zR?{H6TImJM9Z{NncCFxK@AUicgQbSF!#-=)gq z)!*RL{g>VNE^rbu=^h*RZNd8zVd$h9KqaN-tr}g?H9Y9it_JV+fD(@= z_)&+RhMab%YLKwFC|pPs)PwG4h(h68i6d$-5!C!v(Y9mDuQ1|fw@-IEG>P2f-x;id7gvM;&5<6u7-(^cMM4oR@EouGQh!yJH!|_U6P;>sY!h( z4aNYWToyxp!X)7hTniMcj)Kk(6pA(}s*waHUg6mRC=_%O;G-u0273QFaO({MFZ-ZU z!KgnQ9Jym3b=5)}J#C&b`LB1^zVN^tZ%|V|c5EskrJN#~oZW&bz=JMMiTwy`dq2|+a7fe7Gj5>-_Wjq#mQYCn}4a0SI$5$=6}qv*%;i0-{Y&-IF%mO zaE)4v{xdVbW7^9Lv8GV4-Oe5SD(nowom_GUJm2Pk|C6;Ww04 zSqm=`_+TB2Rl4u|)x}5_oW)UIE{P^zsb=EdLR2Y4dz$&^J3gslfEs|Se_AZ#kyNz> za`$1_8w_aV0Zohi5&X`5kDgoW7Uy@waI5zNEc8EfA?*dVS=1@VpHjnZ(Uhj6HPN## z0xm3AewQdWlQ{e>y{gz97^h5YxBO~XKWI5OmfRyD*+#(d0d6sYzU%(Wg9ohjhUI!y zThTVVVm!F}02$FFi4)767X1cOzJOeno`XKwonfSScs?ug30!?^Ez2M;#W`6e&t~eQ zR5mA;g(~aJ`a8GO6D0v)nVAQWY(4n7Q6>QQ4d=u%2BwAW$5+fDSI@`qkV#$^ z9ES~~DX?k$AO6HT)CzX$1TWA!_KmLLN zOu<(fe?;-KCBkZ9Rhi$=>iL6Am-@tQK@ALYHRPHb?DnaJ99U8WI_8h5rx5}WI8ENu zyboJPi}H4T3&>;Is#|^?F3JBnPIDhv;Z^LWcrTs+tDR5!3X$(Fmbgi_9*wZ(MqHHN z(hZV}fdzP41Ftb0GInLZMzh3ISQImd8fMYkw2s{S$<=!@M>`22r2>bfrp z3DA;B*?G0eh20cr@BMooF@lc(Y(Y$yWE$Us7m*zLFa$R7P^@vJ+}@GLYxbt!`ezd8 zkFsx|yzYKQ8@G}2QNXn`-pP@|o~{4dI~GnthDIW+bwZ!DL8RhuA(Q>|L)zsR=1x8~NEVw}K!+LyqF@|!y-bIqo z*7Vo*zs!sX0#2wJjLS`WW0oshr%g1Q`ttv|^25|1_-e~M>Z4jQuQ4&2jy1nMNIBd0 z>ndqgY_elUMWuelON|EQ7+zCpm6Zz83@9;)ok8ypyR*)H?!Q=68~yrS+l$DcRzI%8 zzq4Lz^zJ7gw=P{j-+-yRJ}+gVA;4;yZUEV1i-8J2zf~()Q-2}bjSpAr9taaB-wT!D zAKCBPmyCKUCtebEW+vseJOM~tgyNPYS#adv?08tT2m(J~H`)wYXSimc|ICu?9A3Ww z)XOgFceh*g)*)tbBzV;NcRHqRE zh;{V+sVnJb1v6(@@^1D=6T!@9c#!>Hwe(8eLVX3vu-fz+qj?Um;i!GUO?N6m zhq^Oeq6n$&z@fmY6!*!$?nrl0=bARG*7PxcZQLw?R+)XO>95j{hmGSp>r;{vEQH|R z>u2FXRH_J+moD(_cd#nW zmH*6`Cmh^^Nr-+9MO}J#!2aV)HP|c3lWHAM_ZKI(u$1pY*X<0_l^g}qn)v@65oN(4 z=7Z=;ssYJJgW6wSNgUZmU$;laDQRDMF-qE)C+2WtHe$$Ig zr0oi+&S$Tnb30KV6mNYyU$}OhY~Z8Ayq$Ktukh4z{~u_;7$*KHqtm zP1D+eGzJVnHy@|I+Wgra<8(%$t2vlY+R&sB!DO#6u-bo}BEa5fgYj4h)QzRH30v4o z1-g#lp>H*?0bw@hl&KAaWUMBxDp6j&K0kBAzjLEg{`w$c?=JCZ(abB!CZbdj11X7u z%)U3q0C&~9V%-hl$cDAf&8ddldiq|m)dp+0 zV|=eu#5ec-(x?GmNh6J>M4);_y|=1;%{4_FVyEw2>`Y{bR9v^Rq1c{%YD1XJ^gWKfhdr@|TQk4GOaS59kg>X+@R zywSQlD!4o=dz%-pT$>BUiU7aa%PdQWDWGH4~`G5>;M}IJ%gm{krVm5GR!}+)4Qv# zfAH_NoyqiIorrS@Y0@J;Ds6;R;04n@v{3N8w%Ur}16S^JP-3m8yP+e+)*U zsDmhzM@^8vt5o8S=@1^H7EZT*mC9Eee+->v7+*e2ZcuHOU_n-7kZeSUCXzec0vkro zN4|Ohl!j}f29kBnePVu6C*k9CBX2&I9xN&x!fWEp9&_V%Fo|Melji~(KUqb@P#N>% zv&+wnk^obS4bg1sd)4MLU9;ZQ*?0Q5ji-wq4XffND(VRW=Ea^dkHQs)_S&yB_|))& z^={tvUmUG4nYHiz9Pn(5+J0M~I4W5Rnz9N>8Vp|gk_@m`LP1!n#jZOrk>|`I?HU`C z0zh{C!M|PT9rMSTH_nP(b_%3E8Vr)X#Hiu~rzd+_+gBp zphc_I1{95_u5N8!YaOg*Nz_n`+-BWN5Q}0pxIO7F;v=%pBC}RYQ)lM~)nx#C6s(eg znK0m!n7fzBnfDTaAHK}v{3Y4E|D+e98o<}@{hqcDoH%LyZYO`zx+<~?r2^fbYiaXh z*3JtLkOnDc-oA_isOvH#crImYAZ%ygDwdaLkex*j2s6Sgc9K(Jqep9?+b{ZsF@Ua5 zur+9VA*glrjS>Dk1svCO7wsi}{5SGkoHcik!c{N zl3ol5Fb&PJMD(z!0{V0N2t-rx69rGjPr{3^!-04I=A?TcX=E*2jMb!hMKOyBTz!#= z>(8YDxl14^ksq3kQ6_@7wx|U@|M8}_PfnL@xGqEejb^Hgi=yd6mvAj)UUifbl9%$d zZ9pmqcun0hrF{%C%k`#?^gO{GWVRhH(Z*#2KYu4&1C$ewaDd`fmF41$pZVqOEI7k| zG?FF$-2QCEA;Fn9?C08ex6!5_C#AiXs781$(GaNro~D*5P!yF94oSQ4>vF;J%lnwF zv}fDN2(F-8;}DeY{H@*u0Sq949WF5;2XXZ{M5mknoU0+MiDeGG9emj!VsQ5?vL$ zTaE>pkTT@WV7xfBabdN+Xe=BxM|_I}TIlM0VJaYEe*D(X-45JWjd4D8#b`}Z!B*1i zh7mb~S6{(}5~*q%A`@EI>_-|8`d#><6W-oGuq+i(&aE78*)JQcj;4|5u(~;zo z9s!tl9}$_l6Sg3~mZO0pO+$gsH{5rh;KjHkzu(u10H`(YeCEQtldIhG0~1 zDYTmG07%`;22wHp(aqKgLjx~g-5W0-b)^D*j2hgdHe|5o$N?J(m!$y_;NNT&h(>al zw4;{?!gE<566n8rtvo^m{HeDzIXz*L6(iq36j_LGdpw-UQIrKI2=QB#XfT6>*i$TH zcOwU5B`m&hg`6C zYqDup!%!gtQC219i|06;K5tt1EX^EAn1J9V^4>} zxP@ZAFgSspinJsDmf_CUD_K#=RPsKP8-ueX1vt!UU%dy$T zTNE>BiM}i;-C?pElTkc_@P#{^d!*fHekDyC0rbPKZ7!EWrTiZTJUlW7kp;OuG1}cX zd2w(+&|31xW$&3oXK8uJLMvl{cTp+$B}pck>g6tzRNNQL!qOGBxFdbiCx%Saa2fa> z^tYp>D?odt-O{f>gg>E_ZN~luiB;hN71KYV<>g?}FUeTe`MlPc*1%NoaxR#M6jw=E zEnu}TNmF4JXqfMiBd^vPW;2}7S^eh=?(D$_QYr9~K5THD8d+~yM*)I{#IU(WmV_<5Ou1<{5kKXiRA=}+lu4ZdShgZg=hGV2@r%XyprG^vn zBy$gnGPd4GT%OHNrkoQAj5T@+N0Il0){`KyYfcT9sA4rL$?(*o+V$#2EVG>n0{QMP zE{r(T>*LP8qYWLO6whaH9L>1Qijf+weO((xI>u7VE;z+($0QK$Tsj?6`LCS@YvM}$ z1gudHRvB@~kC$Hpdo#bNTvKml$FbH+?sTbaBWU`dK?F zcyXFxm%8B7q!SZ%;}M{X;J@QCNK9LLfX{39H4=?B#*;?Td%?=}7V-t#X`o0gqDIEr zfyCE2a3TJ1D3g@^o)&?m`H&E)9iryU7)iPMmKa_7We_hQkTldgsr4rdNr(g(a9)nr zdw=47h(gm@K#2LLfM7L#0Kj~^Z2Z31IcO~khH2l z<6=>-U&?<@Jre zd7~4DjB&UR+1y)KE$XIBvggPF@xL@L$Tt;nX}2+ zK67HngLR$1w~Y7ke+E1Y3GegWsu2siH3izM?hxFxqJDi-tp|mSEnULkuKZJcwZ_3o zm5^F@C!-bbESjjCb@Dn~8=^TPn+z@E^Fq66glGYsKg}=@WY4pq|{Y(M0 M)O1xVG1lS#168)Q$N&HU literal 0 HcmV?d00001 diff --git a/icon/icon-512x512.png b/icon/icon-512x512.png new file mode 100755 index 0000000000000000000000000000000000000000..0918d602e0d995adbd4db0de40e3c8857cd6caba GIT binary patch literal 17891 zcmeIacRbbq`#=6T$H753NLg{DqL2|H>m+-ZjO?<>$jWw*w2UGWq0H=&y-U-~$SRag zviJHuj`4nfKEK=d-{0@A@9TDZt=oA#ALH8B{kpCmYN{(xk~5J504S9dWv>B%g#U>I zXcG9ZC6CSx0I)zw_VRTP^B+9q>7NaEr` z|1$EQAqg0Z|CgJo731sKqJLg3qi=IF;V#?8WZ(F8&s%kk{;7o>KXTgL!rem^gny{C z7P=4Itl={XY!|oRwQ4omF>=7EM4=IA96(yq_Ao?MORXtvS5C5-m=_CeI7U5R&vRVv zuP**PUf3yKY+Lki#`Ds#iPpToKQ#w6dvjmiE#w=Z4rKC1?al=mea_DyLt^j%^@t{8 zxgn2sS;MoEaiBn3ndzOE4F}kH{QOsn@37P0s$T=OPtFhYM|da(k9&*qiJjftiL{`! zp!VX_=H+!OJJr&v4LTh+{#;C;+iI)5E-~5YxUMAoje)Q`Hc2c%tiCING_~sQjzr#( zk&~d`zkj!Mh;;YkWyKT1)Q=XhVDCjXm>!k~btdL^z4rCm0i!mmZGA6d$#HYc{`oPp zCd@u~jqM>T4e9B3vDAC_es>D9#b2Y*Q2B9MS36ESAQp|^I9e;TMz>y{sGZ$Jw72OQ z+Bu2!$3kA+-t^j89l6rlh`Gc(o|v#uX$q;YyVFTeTWl_VSlhcOKv1A>A1NWpUEFAX z8E?t=mJDxV)cculG5rDGcE@de0sH4|Wb^Tz+i<5Z@;g4e6y2(P9lTuGnBG2HZ}jxMYK7*fAV?s%tElRb zP3z+M`3;>MwMUn4A%|+O_ja#tDFn_g-c`#K{S>gj3}-5iFqxWSuD+>cPj>1gFv#L= zwH{xmMxD;|UR(@3ScE-+WM(EJL`9ISjwhGHvW>&Sg`ZY6}sjG}IZ zZHJCSw~6fVou_25WvwmRGaK65wW2{EY4IDL&&Okm?fMqSFYbzVijnT|3mbt6Fclwq zCfbj9N^H7Gy2Cmi;xF@6;K&{ca7jYQ<$6-05E8Z{TX|d`WNGnfm7AVBi}fgx}V`-RpkLegZ-V&ula*^Va$lvC` z_Y}D1B!xintyg(BilX+#0)wy9MfrHX$-Xt#dlP>TK0W3f-(qKwug7JAl*6Nvgb}S2 z38#AQ{@}Hz?@a@@2UqjRNdD06+J7HuJ)p}vT?Tc+Ne^X%(jyK~10uJ#9M_71Ha8a) z2e*h)kpwk`8l#7#XxwO)C@BsypvP~-sF%OX&c1Ei(<@4~e-c1QqEQBjZuoa;@pZMw z$RVh)ED}K;N=~<|B=ujD@9zUpCoy`n>&6;+Z*1KPT=Z%1m$iIN&WG~TgvcD;nI>Q; zWGl$HHui%I1%CII#YO+{w85SAp+x!1*U0zDj6D}Hbgr(TUK<}=nW(!&j+gdtldN~# z-DPp34GTFCAsipFo_b?5Fbl-II}5f}@^qc99}te~DXzLyc#Wq{NxSjxiS!}D218Lp zj2~j2i!!EPIlKuOLSsw3%CAVim<#kvukWfm;S|(t(~cazMVS+-#<8IYqgtA_zvOt6 z3r_F&24+%QKcEkVYC;xU##hG|xQSHV$V{_Dw&`6^l$Zss(4|tCdrk4)5^nx`

!>(^FvB~?<+{pay#+LkWY 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 IGNyt554(H!ga7~l literal 0 HcmV?d00001 diff --git a/icon/link.txt b/icon/link.txt new file mode 100644 index 0000000..82b1972 --- /dev/null +++ b/icon/link.txt @@ -0,0 +1,2 @@ +Created by: +https://favicon.io/favicon-generator/ \ No newline at end of file diff --git a/lib/WebServer/src/WebServer.cpp b/lib/WebServer/src/WebServer.cpp index a37883b..4313ad4 100644 --- a/lib/WebServer/src/WebServer.cpp +++ b/lib/WebServer/src/WebServer.cpp @@ -413,6 +413,15 @@ void WebServer::send(int code, const char* content_type, const String& content) sendContent(content); } +void WebServer::send(int code, const char *content_type, const char *content, size_t contentLength) +{ + String header; + _prepareHeader(header, code, content_type, contentLength); + _currentClientWrite(header.c_str(), header.length()); + if(contentLength) + sendContent(content, contentLength); +} + void WebServer::send_P(int code, PGM_P content_type, PGM_P content) { size_t contentLength = 0; @@ -429,6 +438,7 @@ void WebServer::send_P(int code, PGM_P content_type, PGM_P content) { } void WebServer::send_P(int code, PGM_P content_type, PGM_P content, size_t contentLength) { + _chunked = true; String header; char type[64]; memccpy_P((void*)type, (PGM_VOID_P)content_type, 0, sizeof(type)); diff --git a/lib/WebServer/src/WebServer.h b/lib/WebServer/src/WebServer.h index e609ebf..5ed6c90 100644 --- a/lib/WebServer/src/WebServer.h +++ b/lib/WebServer/src/WebServer.h @@ -119,6 +119,7 @@ public: // content_type - HTTP content type, like "text/plain" or "image/png" // content - actual content body void send(int code, const char* content_type = NULL, const String& content = String("")); + void send(int code, const char* content_type, const char* content, size_t contentLength); void send(int code, char* content_type, const String& content); void send(int code, const String& content_type, const String& content); void send_P(int code, PGM_P content_type, PGM_P content);