Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
PeguinoheroPeguino Uno ESP32 Brick
#1
Peguino Uno ESP32 Brick



This Peguino unit houses and delivers the core control processing unit for your projects. It contains the powerful ESP32 Development Board Version 1 Type microcomputer board to control your project.
You can connect it to your computer directly via a USB connection and install your own programs. Or you install the Peguino Uno Brick ESP32 V1 Wifi upload Program to wireless update your own programs via your computers web browser.


[Image: Peguino_Uno_Brick_01b.png]

Pinout:

[Image: Peguino_ESP32_Dev_1_01.png]

Technical Specs:

[Image: ESP32Dev1_Specs_01.png]



Two 40/80 MHz low-power 32-bit microprocessors.
The internal memory includes:
    • 448 KB of ROM for booting and core functions.
    • 520 KB of on-chip SRAM for data and instructions.
    • 8 KB of SRAM in RTC, which is called RTC FAST Memory and can be used for data storage; it is accessed by the main CPU during RTC Boot from the Deep-sleep mode.
    • 8 KB of SRAM in RTC, which is called RTC SLOW Memory and can be accessed by the co-processor duringthe Deep-sleep mode.
    • 1 Kbit of eFuse: 256 bits are used for the system (MAC address and chip configuration) and the remaining 768 bits are reserved for customer applications, including flash-encryption and chip-ID.
    • Total up to 4MB Ram
It has already WIFI and Bluetooth on board:
WIFI: WiFi: 802.11 b/g/n/d/e/i/k/r (802.11n up to 150 Mbps),
Bluetooth v4.2 BR/EDR and BLE specification
Wi-Fi mode Station/softAP/SoftAP+station/P2P
Security WPA/WPA2/WPA2-Enterprise/WPS
Encryption AES/RSA/ECC/SHA
IPv4, IPv6, SSL, TCP/UDP/HTTP/FTP/MQTT
Interfaces: SD-card, UART, SPI, SDIO, I2C, LED PWM, Motor  PWM, I2S , IR, GPIO, capacitive touch sensor, ADC, DAC, Hall sensor, temperature sensor

WIFI-Usage:
The “Analog Input 2” -Ports cannot used when WIFI is activated at the same time.

Troubleshooting:
In case of failures while uploading a program with the Arduino IDE it might be helpful to unplug Bricks from the Peguino Uno Brick Unit.  
For some reasons sometimes the error message "Failed to connect to ESP32: Timed out waiting for packet header" appears while upload. In this case press and hold the "BOOT" button on the board while uploading.
More about the Arduino IDE see here: https://www.peguino.com/chat/thread-7.html and here: https://www.peguino.com/chat/thread-9.html

Example:
This script contains a webserver with the ability to upload scripts in the Peguino Uno ESP Board using WIFI.

Note:
You have to add also the Network name (SSID) of your WIFI and the password to let the Brick connect to your WIFI. If the script is running and connected to your WIFI (takes some seconds) type the following URL in your webbrowser: http://peguino01.connect
The default username in the form is "admin" and the password is "admin".
You have to include this script in your own project to keep the "upload via WIFI option" working - we plan to add this functionality later as a more simple solution for our Peguino Uno ESP32 V1 Boards.

Code:
/*
Peguino Uno Brick ESP32 V1 Wifi upload
(C) 2018 by Peguino LTD
 
Version 1


Peguino Uno ESP 32 Development Board Pinout
          ┌─╥─┐
3.3     1 │     │ 30  5V
GND     2 │     │ 29  GND
GPIO15  3 │     │ 28  GPIO13
GPIO2   4 │     │ 27  GPIO12
GPIO4   5 │     │ 26  GPIO14
GPIO16  6 │     │ 25  GPIO27
GPIO17  7 │     │ 24  GPIO26
GPIO5   8 │     │ 23  GPIO25
GPIO18  9 │     │ 22  GPIO33
GPIO19 10 │     │ 21  GPIO32
GPIO21 11 │     │ 20  GPIO35
GPIO3  12 │     │ 19  GPIO34
GPIO1  13 │     │ 18  GPIO39
GPIO22 14 │     │ 17  GPIO36
GPIO23 15 │     │ 16  Chip enable
          └───┘
Visit https://www.peguino.com          
*/

#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <Update.h>

const char* host = "Peguino01";
const char* ssid = "TypeYourWifiNetworkSsidInHere";                // Type your WIFI Network SSID in this field
const char* password = "TypeYourWifiNetworkPasswordInHere";        // Type your WIFI Network Password in here
const char* hostName = "Peguino01";                              // go to your webbrowser and type http://peguino01.connect

WebServer server(80);


/* This is the Peguino Uno Login page */

const char* loginIndex =
"<!DOCTYPE html><html lang='en'><head><meta charset='UTF-8'><title>Peguino Uno Brick Login</title><style>.form {position: relative; z-index: 1; background: #eee; max-width: 300px; margin: 0 auto 100px; padding: 30px; border-radius: 4px; text-align: center;}"
".form input {outline: 0; background: #ddd; width: 100%; border: 0; margin: 0 0 15px; padding: 15px; border-radius: 4px; box-sizing: border-box; font-size: 14px; }"
"#button { outline: 0; background: #EF3B3A; width: 100%; border: 0; padding: 15px; border-radius: 4px; color: #FFFFFF; font-size: 14px; transition: all 0.3 ease; cursor: pointer; }"
".container { position: relative; max-width: 300px; margin: 0 auto; } .container .info { margin: 50px auto; text-align: center; }"
"body { font-family: sans-serif; } </style> </head> <body>"
"<div class='container'> <div class='info'> <h2>Connect your<br/> Peguino Uno Brick</h2> </div> <div class='form'>"
"<div><img src=' data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAN8AAACJCAYAAACsLu3GAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAEZ0FNQQAAsY58+1GTAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAEqxSURBVHja7L13sGXZdd7323ufeOPL/d7r3JMTJmAGaTAAhhgCIEVCAkFZtAgFWqVQtCVZtkqWXJbK/6hYliypSIpWSQwyJZkyxahEkRYJBlAUSQDEgMDk0DMdX343nrz39h/73Nvdk7unp9E9uAs1Neie924453x7rfWtb60lrLXMbGYzu/YmZ5dgZjObgW9mM5uBb2Yzm9kMfDOb2Qx8M5vZzGbgm9nMZuCb2cxmNgPfzGY2A9/MZjazGfhmNrMZ+GY2s5nNwDezmc3AN7OZzcA3s5nNbAa+mc1sBr6ZzWxmM/DNbGYz8M1sZjO7quZdTx/mS7//+3ieh5CCqqqoqoogCAAQQkx/zlpDWRZ4no+UCnHRaxhr0dq4L6fkJb/nftditAYhkPLS/25xIzUEAhCv+nxFkWGMJoobr/nfp5/BWIRwn1kIQW9/F60rsbh04E8i+AvW2HXAE0IgpTinpPxXG/uDH22EftUIAoy1WGsv+WxCCIpKk+QFc82IN5r+Mflv4vU/IkIIzu306TZjWrF7z9d8LSxJXgKC2FdgLVLKC29g3U9NXnMyluTi/3/hPd212R9nNEOfOPDRxrzq/k6+Q5IVhKFP4Mnp27z6NQW+rwAoK41AcGZjh2/75GMz8H2zm7WWuNGkyPP5fq//Q3GzseApNQVpmhXHTm3sfajdbnx5odX4/dlMnZnnm9nbtwAwAFEUP+J5wV86ffrUwl6vh7WWoqwYpQUbu302exmf/cQH/q6n1H+otP6qEGIB+BSwUrvYoRTiS0rKn7aW87NLOwPfzF4riZbyMwL7fRZ7C2CFEEIIbg595Xm+Ik0LirIizXKGSU6a5sRxQOirx4DHyrKohJBeEPgIIV1wKwRVWX3vdm/wSKsRfXZ2lWfgm9krco+iyE+UZfVv4jj2XD45yRVLzm73WJhfpNvRjJKUIi/odg2HDykOLC3QjEKMteRZ7u3s7REGEWApKsM4zTl5dhvpRx/5zkfv/zO61P9VCLFtrT0IPAgcxJFnLwG/J6V81tS51Mxm4Hu3mqofegncBeKvb21veVJ6WKAsKsZZwbntHrujgs9+4gN0O2263e4UsFKAMYZKG6SSeJ5CVxWjckye54zTgkGSs7M/4MCBaEnA/20hMVqf8jzvCNAQoqaI3L9753Z639Ntx78SeB6zHHIGvncLfTIBzR+1lm8HbqqvoS+EuDf0/aZEUhQFeVHWoWXJYJziez5KCLQ25EWBUgqlFFY4ZtX3PIwx5BUsLi6RpClSCqxUqCCk2+1y4ui6Y1KlbOzv7t6utSGMIgC0MSRJznOnNufa3fafe3jl5i/mRbVXf/AWcBxYAkbAOeDs7H7OwHfjuDnlU1XZB4ui/PkgCKQUEoRjRCqt2dobsLS0TJpnpGlKGIbETcPK8iKrK4tEgfOISTJmMBgRRTFWgNaacVrw4pkthBfy7R++l7KqMMYCFiEkga8wxlBqg5ISYzSD4RAzGJDlBUla0BtmvLzV4wP33fldAvFhC1+WQpwSQnzUWnscCIRASyGHSslfsZb/EezO7M7OwHfdm+8Hd+R5/lfPnjsngyDEWge6cVJwenOXYWH47sfeT7fTqmt1IKRASeFCy8qglEAKSZqlpFnugJPl9Mc5Z7Z7HFxbw+LqfFKClB5YS1XXLgPPQylJHDfIi5IsK6nrhXi+4tDqAusrc6oyZg1jvmOv1yOKY3zfn9TevLwowxfPbH+vHwb/7siBuX8zee3agvqfHChnd30GvmtNnghr+SjwLcAyUOBo/2/zPa9rtGY8TsiLnDQr6Y9ztveHRI0mWNDaUOkKz/PrP1tAEPjucnt+QLfbJU1ztDEExtIwguMHD3DHTYex2oW3uzu7SOURBqErUFtLlpc8f2aThbkudxw/wjjJqHSFNSClpNkIkVJSlhohBKPxmL1eH2sFRVkwzkp2+iNObw34jo899ANSym9Hm/8ipUytNY9Zy32AD+RCiGc8JX9aFNUvOi88sxn43inQITDWUJTF5zzf/xeeUmBrIkMKtNakpWZpcYlRkqA8iZQe0gtod9ocO7iKUgJrod/vU1aaMLwoJ8tyXjizTaPR4JH7byNJc4zVNXAEYeC8U1k54BRlwajXAyvIioIkK9nrJ5za7vPB++9ECkkYBDRU7DJSazDGOg8rBZ70iKKQolYLZUVBVpSUpabdiIgD/4Q19oTW1Z9J05IoilBSOZZWCIwx95/b6n02CP27O3H4rJhmvTObge+duCDKOzzoDz43ThLCKEJYqLRhlOY8f2aLIIr51AfvoVt2sNbUoaXE95z0qqw0UkqMNfQHAxBDsiwnyQr6o4xT231uu+kYWIOU4MlpODiVWikl8DxFI47J8pKirDDGoI1BCMFCt8Vit4kxGq01g0GfOG6glEJKV98oq5KXtrZpRDGH1zuMk5Q8Lyi15fhhxXy3TacZu3DWWra2t5DSQyDcQZGXbO0NOLXV97/jow/+7dBTP1tU+nHhoPkocAxru8AW8JwQ4lelFPtaz+A5A9+bezkPuA+4A7gV6AGHBOJ7hBCrSZYxTjPyvGCcFfSHOWd2+xw9tI6dai8lSkkHHK0BBxpPSqIoJopyiqJE4DSeyvM4sNDl2Noixhistezt7RFGEYHvIYXEWEtZVbx4dod2q8HxI4cYjVPyokQbg1QenWZEFIaUlUEI6PV77O73EAhKrUmyku39AS9v9vnEw/dzcGWeOG5M644TD6+1ASFQtcY1ywvKyrG047Rgp5dQGYun5OcsfM5auyMQKCmX6uo/AlBKkmb5H/RHxSc6zWh3BqsZ+F4vn0PrCuV5P+B54X+PtfFERaKkBCxBENJptUiyHK01vucRR5Yja8vcdXwdV8C27O7t4XsBvh8gpUBbQ5YVPH96k6WFOW49eohxklNWFVqb2ptF+J6iqEPL8XjM7n4PhKAsS8ZpyW5/zMnNHh996G6iKEBKhZS1uBiLMc5LSiGQSuF5HnmSUVZ6Cpzh2JUqQl+hjaEoCqyxBGHgRN91eUNIGIwKWu05GlXBOE1RUuJ5IY1Gi6XFeTrNCGOhKsulnd1dorhRHzpQlBXbvSEvnN194OH7b/tOJeUvamN69eU+CqziSh37wClg540E3zPwvctNed7h3b29z3peEAeBP83JRuOcp18+z5G1A7znloOM09yRGRaUUoSBj6y7C6SQZFnGXjbAGEtRODJjt59weqvPRx66GyUVURjSaMRQM5i2Dk2FEPieIggC0qKkqiVnaeZqhI3Qpx1HaG1dzlaWRGGEkO4AceJsy3ZvRNzs0Gq2GI1TorCg2dQsLi6yON/hwEIHbQzWGM5vbBBEEUpKtLHkRcVOb8jzZ/f41g/ew8G1VYqywlpTv4eHEA5g4JjbvChI84KiLEmygnFasLU3ZJBbmlHwTxH8LeBxIYStSxwH3NFGqTx5yhr7E0Wp/49mGOgZ+N79dgQ4AczhhM4P+b7/J7U2xwfDfbSxZEVOkhbsDVJObw85sLSIxQHO97y6dab2ONbiKYmnJFEUkRUlutJ1C5TGYpnvNJnvNNDGUFYF+TgnimJU3c0gpSu2v3B6h3aryaFOm/E4JS8KykpzSLicbL7Toqw01hg2t7ZQynftVlqT5hU7+0NeOLfLpx5+gCOrC3S7etqao+pun0mbjZQSbTTD4ZiyKsmynGFastMbM0qqOiLQGGOQUrrPOM1BpQtNCWg2W6RZRqU1SkiUUjQbDQ4d7BIGfmAttxZFfutonNBsNFFKTVqJ/GSQ3fTc6e2/c2h16Rfj0H/SXJofBvXzWH6zlDjeleCTQmCxLSnFjwjEd1oHPCGEq7kBRFHkiIy8cE+pdd5kbXmOAwtttLaUZUmSJjTihmMBpXB0f1LywtltDq4scPSQIzOKsqTSrtet02rRbIRU2mCB7Z1dhFRYoKo0aVay6cgMvv2j7+XAQpdmozlJoxA4Aqaa5JHKhcNpllFWFUmaM8oK9gYJRamRygGlqjRSOqBV9XOtlMSTitxaOp050jSF3JU/IiOY60qOHe7QrUPLsizp9/s0ms3pYWGMZTAa8/yZXe677Rgry4vkRUlVOecV+D6NuP6+dc9dr9ejPxhSaU1RlIzSkvO7ffqpDu+99ciPA78PfEFK6Vtr/whOgdMC9gU8p5T8l8BvzcB3o30pT5Hn2Z27w8GfbsYNlPKg1lAOxynPntrkrpuPcPRwlyTNqKoKbcBTilYrxlfKPfjWsrfXY1f0scZQlJpRmrO1P+Tc7pjPfPx9xFFMUNfhXFnCPaxau9At8DyEcOFaWVakec44KekPxwgBgeeUK0VR1KGo55p6xQXyZjCu6HTnKPKcJMmxViCkhx+E3H5Th8VuA20sVVWwt9+rmU/X8FpUml5/xDOnt/nw/XewvLRAUZROPSPA9zwC33MettaBDkcjBqOESmuyvA4t94fsjUvuvfUInudN81CsrUkiXXt1SRyGBIFPlleUZUWWF2R5QVVpus0YIcQHsHygrMq/orUmikLXwVFrVMF+dHNv8GmEvLfdijberfrUdwv4GrhiOAJC4LuEEN/X6/fp9QbuISpKRknBxu6AvXHBnTcdxvc82q1WHapZsBdEzkpJgsBHKUVelBSlU6KM0pI0K4hC30m+rCHPc4SQ+L43ZTZ9z3mNnd6Q+flFiiInTTN83ycMNZ1uh+XFeeY7bbSBsizY3d0jihtTciXLS7b3+ry4sc8nPvgelhfmLwKJwPdcOJjXfyeEIE1TRkk6fehHdU62n7qQWAhq8DjgWC4AR0lJHIUunM6LWpWj6/eElYUuUeRj6xw3LwoacYyUsiaroNIV57Z7dOeXWMDUUUFFqQ03HfNYXpyrr5vFGM35zQ18P6zDXkOWl2zsDTi12V/5jo89+L8rKT5faftlgcBiHwQO1fc7BZ4UQnxZCrFpbkCA3rjgcw/bUSHE38Dah2tWDSlloJScD3wfX3nkZUVZVVOxszGWhW6LKPAw1pKmKULIqYpESIkHFGXJxu6AleVlsjwjSVPivKTTMRxcVawsztFtxVOyZWdvjzCMEMKFdElWcG57j/P7Cd/1Le9jYa6NNhfGQ3hTz1RhrUQKSZ6/mszY3BsxruyU5XS1SOU8uQVdaWT9eoKAuM5Dy7KaerIg8DmxsEAzCrAG8jwnz3PiOK5zMhfmpmnGyXO7HFlbZMkTJElGWVZo6zzkwlz7QmnFGLa2tlC+72R2lSbJCjZ3B5zZHfGZj7+Pxbku7XabC10XrmZq6nqlFBIspGlGUV4ocWz3E0pt8JT4i9bYv2i02RMCI6VamnrHOoWotHluOM4/Fcf+i67oKmbge6fLBZ4fkGbpX/e94PsnukX3EBl29wfsDFOOra+TphlpllIUFcvGcpvns7TYJQoCrIUsz9nb7+G0mq7DfJwUnDy/Q2El3/3Y+2g2Yhbm52u9pUAK4ZQk2uVYSkrKsqQoSvKiIMkKhknJ5t4Qo3zAPaxGG2SdR5XaILB4UiGVwBifVrtNmjnJmaP7PVfrW5ynEQZYIE1Tsjyn2Wwg61BNa8NgnHDy3B7vufUwnmQa5lkg8AM69UEx8Tg7uy4PNcaQlxXjtGBjp8/OsODw+hLNRkwcxa+KCtx8GoGvXNiZ5wVl5ZjaUVLSH41rdY0Tf5dlibXg+/6Fe+epmnTy6HbnKIqCJM0QSITy8MKIe5cWaMVhHcLrhe2dHeK4geepqRBgMEp58qXzt9x87NBn7jx24McrdF/cQCKcG9TziUXP8/942ut9emu4i6c8Sq3Jy4r+MOXkuV3mFua5/dganufR6bRx3QGivnGaSms8z0MpRVVVlKV2Eq40Z5gU9IdjWu0uWKiMwRiN8hTGgMEi6txSSUGqPOa6XZIkxVhLoC1xKDiwNMehtZWppnM0TiiKnLjhgAN1nWy/z9ndIR++7zawjqDQdU4W+D6NKJiGhtYa9vb36fUHVFVFXlQMk5yzO32ySnDfbUcJAo8gCBxxU9cGJ+JpKSWB7zv9Z6VrL5szSgvSvCQK/Ro49qLaYFiXGiSecIRWkuZ05xeoSgcc3/MJAk2n22Z1aZF2M3SeWWs2t7eJohjP87DWMbC9wYinXt7m4ftv4/BBR+BMHJfvqVqfWtUtV5Y8y0jSnErrqfBhuzdmq5dy3+0n/p7W5q/6yvuakuKL1trfAj4/A9/b93K3WWs/B9yOa161wD1Kylt8pdBaU5QVWZaR5BW9UUZWFMSB50I1rTHW1jfe5TxSSLzQo6oqDIqlxUVG44QJ3SiVT7vd5tjhNcc+CkFvv48xhjCKp6RKlhe8dHabwkoefegOirx0dL21SOHCPU8pirJyVL+u2O/12O8NKKqKNC8YjHPObffxowZSgJAecey5Xj7rwFaUup6GJonCEE8pysrUr5GTFSVGG7qtVv17lizLEUIQ1sCZhqrG0htlLC0tUxYFSZYRRwXttmXtwAqrS/M0ogBjoCwrtra3CaMYKSQWS55XbO33eeHsHp/68P2sH5ijrJzoQCBqomdSy3TXrixLp54pNVmWM85diWN7kE8nkgkhpiSRNhZtLkyYa8QR7XabwWgM2mKsmUYha8tzLHaa0lPq8MZO7/ATL5z+9vPb+098+6e+9e4Z+N5GaGmtXaqq6peCIDgxqV9JIRAS+sME4YWsLC8xGqf4nocfVMRxg6OH1jhxaBVdudN+Z2cHIRWB70/p/sE45emXNlg/sMyH7r2ZtCYYLBYlFb6nXBha6Wn/XK8/wPZc/1yaF/RGGae3+hw6uDoFth8EdVnQTn9/EmrFUYTyfKrKaTKrqkJr51HXluZqeZkhSROU8gjr15qQGUmasrU/ZG1tjSzLyPKcvKiojOXWEz4ri3P4ngTENA8NgouF3QVnNvfYHeZ85lseZK7TmrKeLge7EE4L4Wp9la4ohiOKoiTNnYfc7o0ZZXrahW+tqw2K+n1sPV5QSYmnIlrtFsk4Q2vrVDlCEgUBtxyZp9uK0MZijGF/b4+42XQjIevULctyXjq/Q6fddFK7NKMqKgzQiCM6rQbbe31+5/GneencNmVZ0W03x7Ow84q5FIvneS1jzOc2NzdP+IFrkzHGkhdOt/js6R0+8tBdnFhfotu9QJNPCsJlVTkhspRUVUWajdHakOauoL4/SjmzM2JtZQlbPzCTgvAkNHIeQ9bysphxklEUFVhTM4eCuXaTo6tLDmzAcNAnCAI3b7T2pMYYNs7vkOQVRw8fJEkz8jyvPZokikIWOi20dZKxLM3o9Qf4foC2xk06S3JOntvBC2I++/EHaUQh09mhdShYaY0xziMo5TxtkiR1HloDZ3eEVQHUuaKeFNUFVEyuocJTEmsDOp0uaZa5WanaIwhgriO46dg8rUbkygwX1QY9z0Pg2p/Gac6zpza55eg6x44sk2UXFEOB79NsRFOwYi2D0ZDecIi1kJclaVqxNxjx0mafj3/wXqIoRHo+oe+imjMbu/zXrz7HmY0d15rle0jXGWJn4Lvc4riUSCkPWez3Wmu/RwhxX1VpsnxIUZZkWeFUGf0Ro3GBEtIRGfUDBK6XblpjqyntZtM1t2ZZgXDvQRgEHFld5MjqAqUx6KqiPx4TxzFeXRe0ddH5hTObLM53OXb0MONxSlmWVMYghKTViGlE4VQyNh4N2clLpJBUuiLNNfvDMS+e3+WmI4e4/fgqSnl02u1pUd19bo2xTv3iKafHrGrvltTh6SjJWI5bzntrU3tNz3ksLrCoDnwB83PzLvwEjBVYoTgURBxcXSbwFAhBmiYMR2OaTReyujBRsz8Y8dyZHR6+/1ZWFhcpygt5aOj5BIFXM6ruQg1HQ/ojd8DleUGSF2zvjzm/n3Di4AF8TyHiEClip2m4qDboarMeURgySjKqSpPnOUlekhUVoe/RiAMndLCa50+d56kXz3B2003JCDyFV5d2jDVIKdIZ+C7TBsPhDwe+/9kwCtc8z8P3febn5xgMR3XeZgh86LSaHFpbZWmuiTaQZSlZlhPXNbIJpd0fjHj+zA7vvfM4c3Mdsqyg0nrq5ZqNCCGEU2oIwaDfZ7/XxxhLWVaMsoLd3piXt3o8+oF7CTwPmg2ElIi6RmatpdB6qu73PA+dZq47oCYGhuMMow1xFDjGUbuw0w+Cab+gkgpfCqrKYJXH0uIi4yRBKscA+n7Iwvw8Jw6v1SCQDIc9siInjhp1G5Mlz0tOb+7QG5d84oN3o2tqf5JX+b6HEpKiqurQHkajUV0bLMlzx9Ru7A0Zl0wHMwVBMGU+jbFTvacUgjAKCcOINCvQ2pV2ylJTGcNcq0GzZi0dqBLXN6gUSsmaFLL0hwkqbLHW7jBOM7Iso93WrK96LC/MMddp8szJs3z9uVNs7vURFzUnv/oQJ5+B7zKt3+9/q7F2TSpF4HmEUUQjjlg9sIKoT8uJ8iMMfMrSAckYy/7+Hnu9PmU5YQAzzu8OGBeWB+487grIcVRLzy7kZBOvqaRr+Smyog5TM9LUEQWR79GMAow1jjo3Bj8MkHVepKTrchuMUsJGi5UwYpyk+FlGEDqy4NYTRzl2cGXqIR3VLwmCoJaSWae+eXmThYU5PvLAbU6JYl2NT0p3uhtt6hKHq7eNRmOGw8SFaZnzkGd3+rQ6nUmFAFnX8lzJw6LRNeAlzUZMGIbTnsFqGooK1pc7hHWJIM8yiqqaFtUvRBqac9s92p15FuZhnNbtT9pywvNY7LaJ44iq1olu7+wgpBuFYbQmKzX7gzHPntrioffczuFbDtFqVSgpa++qeeHUeX7zi0+y0xvUbO3rP7YCgTVUM/Bdbtip5AhjscaQ5TlpntPv91FKEQQ+UejUF67LW09JAt/zUZ5PUVZUVUmeuyKzsZaFTquWcFmyPHc3rx5IO2k8rSrN5k6fxcUliiInSTOiPKLVtqwdUMzPt1ma71BWruSwubmFHzogG23Iyord3ohnTm/xsYfu4fj64jQPnehJJx3qk7+zxjAaJ+j6uyZpyf4o4+zOgLm5zlS2NdknYY2hnHgbKQk8j0ajwShJ6jy0Zg2loN2IOXFwBeraZzIeY3F6VinkVKPaG4w4s93j+MFVtK7I85yyJjPCMGS+03Q5a02kuKJ6UDcNu8787f0hp7aGfPrRB1me69BsNi8pqk/ySleHBSkgK3KqSpNlGaOspDdMSbLCkVxYAl+RpDlPvHCap188w25viFd3lbx56iIYp9nM810+wymttdW0YD4xY4wrlqcZ0J8CKAxCoigkDEPW19ZqDWFGkTsG8DbfhSxukYYgS1N6/QFB6AbUVpVhlOSc2thhXFg++9hDNBoxc3NM64ITBrKq9PTPWmvyUc0AZjnjerzDKMmQggt5aP0dJjU2IZh2mzeaTSpjyYscJeW0Zenw6hLH15edp7DOowdBSOAHiMlhoTUvnt4grwx3Hj9Mkjo5WVU/5HEU0YzDaVd9URTs9XpI6bnSTKUZjjNOb+5TCY9bj64ShQHNRuOSovqEDBE1CeMGAxeXfO/eYIzAOoLnogPC87wJF4RXf+fKCNrdOYIsJ80yV7gXCil9jh1e5+bDK4zTnOdeOscTL56hP0zwPUUUBpf1HKmJen4GvsvD3+uVHS7dUgR5XpBlOf2B8wRhGBCFIa1mk2g+wPN917emdX3yuqe/0hX5qHLDj9KCQVKw2xsSNVs10B1jqJQrNRhbuVBXKaSSWGPpdFwnw4Q0CH1BpwXr6wdYnGuhjWMAh8MhjUYDVTOA2liSLOPZlzY4cXiNo0cOkaZZ3Q3g3rMRR455rDRCSpIkYW+/D0K4embuPMXJ83vcdPwQ995ymCiKaDTk9AJeLHQWdb2RmpXMioI0KxgmBVlZ0mk7wDkdZ4kQcgqcSflASkGWC+YWFinz3M0UVQrP1zSbTddw24qpahWMqw1GBL4bIFUaw3ic8uRLG9x67BB3HHMHpbYGTyniMCTJMr7y1Is8+/J5hqMU31dTVc/lmDGWRiOcKVyuwIq35iHr6P4iQGaZEy7LwdAxYEFAGASEYUgYBvi+K5xro0nGWT1sCJoojkQxNx1Zd/U8axkMXEE9jmOXQwgoS8357X22emMeeeA25udtXadzoxh83yMKXA1vSp0PBtO2mryeXr2zP+Lc3pgj6ysoKadhtL1IwqVrpYen6mbbrEBXFXlWM4B5jpSCbjOerhPL0hQ/COqREO53hZTu97Rg5cAKSZIRpBlhUNJoGNZWlzm8tjK9jnmWsd8fEEcNhBK1yqVia6/Pi+f3+eSH7mVpfo6yqqb3wRXvxdTjAdOaoAst68FPw4Szu0NuPnoQbS3K8wg9RW8w5itPneTZl86TpDm+r4hCv9blXGmtaiYvu3y3J8Xg7RTllVKkaeoS/KqkLAtG4xEAvucTRRFRHNNudVy+JwRK1MOP6o5tWXvLXq/H3n6/7mYoGSQ5Z7f6NNvtizxKMBUlT3ShQE0WOMBP+t4m4VpZaTrN2BE4xlKWBVprwjBGSqa1RgHsDUb4YYPVAw3GSUqc5zRLzeICvOeOJmsrC1MCZ7/Xo9J6us9wQuC8eGYbFUT8kQ/fS6el6z13dtr3p40rzUw7KbKMNMspawJnlBRs7Y8YV6JW9lyQqV0aUrvZoXEU0mo1GI1TKvQ0UhFCsLo4z+pSF99TbO32eerkGZ5/eYMsLwl8RRj6b/sZstYQh34xA98VcC5X/EWUYnN7FylhPBpz8vQ5grjFscOrzLVi8qIgy3O4iMAJgpAoDAnCoM5LHIvnqHCfQlf1DE6N1obAVxxY7DqixUKaJKi6JDJ5+ASud29rb8jKgQMUeU6a5eR5SWUsx44olue7NJtR/eBrNjY2XU9gDYa8qNjeH/Ls6S0++tA93HJ4hXarVRMo050MUwJnQhylacp4nE4H8Q7GOed3Bhw+tI6txd2TEH7SETEBkue5jvRms0meuwNhcqA1GhGHFxaIQ9+F2kVBkiQ0Wi3nYWtnk+UVL53dZnGhw7Eji4zTjLKosFjCMGKu02C3N+JXfudxTp/boSgrfM+berpvNru+wGcRV+r1ykqzNxizvrLAF7/6NFb6SFORnNrj7mMrdGIPbS+8fJpmTmeonEpeqkneGBGGIQcPrlGUJXmWk5cVFkEjipjvTpQoknEyZjga4/shxmrK0jBMMl46t4tVPp/5lvcShQGdTmdaL0OAuUgIIIUrGYzTlPIiImN36EAkJ9Ou6/LCpHPjgrd3ip5mq+WY06zA0xWe5xGGcGh1iTuOrU27Efr9PgiIo/gSYcJuf8jZrT4P3HkcrNsnUWlHGgVBQCMKXY20zin3ez32B0M3wr6oSPKS7d6IU1sDPvnh+wmWfSfpm3OP2Mb2Pp//3a/z0tktKq3xfe8tsZeX7/nA87xZkf1yTVd6JK6gH0sI10Kj/JBRViLjLnGjSRBG+GHEfunRjC+oaMbjMWVZ0mo22djZJW7EdFtNhkXOYDCcKmDCMCSOI+bmQnzfqyVcBjFdu+yka0XpaPo0K+knOYNRQnd+zo3oq9twLqwMq2esKFVrRi1zc/OMk8RdA2OokMwhOXJwldWFDlWtfdzd2aHRaOL5Xk2SOHH3c6c2mZvrcOfxQ6SZy7WMNSjlBjgpKaYaVScFGyCkoqwqsqJkOMo5u9PDC2Led/dNUJMuYjK7ph5nOAF84PtuWkDpWoayzA2PyvKC0PeIwwClFNpYTp/f5uvPn+bsxi7auDJCpPx3LC1z7UtqFnZevuO78nZkISRIH88LaM0t0mo2iEJXhvCDAM0YD9dMe35zl7UDS3zp8SfoJwV+3OLowQPctD7vOgngQp1xMKgVHi5MDUMHysD33aov4RhJR5pIrPBoNdscP7KGrT/XcLhPWWoaF1H5ZV1bPLPT46PvvZO5uS66qtC1h/I81/ozJXAEJEnKYJy4HryiJMncmMHTm30+9OBdrqnW8+q874KIwBhq1tJ1RQzq8YlFWdYaU3dd2q14KgrPywIpJH7dfjRdQSZgb5zRmV/EVhVpmpIGOVHTsLy0yNqKm5r2wqkNnnjuFOd3emAtvu9NH7Z3kg+REtKs1DPwXSvQGksYKLyoQSPyWF5uEwYBge8R1DpEVeRIXdEbJ6ggpD9KGVWK1vwKnh+yl0JnrFlpeejaU1nrdIrNRoOyKCiLgvHIKWR83yeKQuIoptNuIaRAImuJmarVMPoCgdPv0esPKMqCNK8YjnPO7/SRYVQ/jgLP9+sbYqczMSfeOvR9wjCgqmeJTpp3K61pNiLm243pVOssSwnDyCl3lJwSOGmWk1Vw8OAa43FKmufkecXCPNx8ImBtZWGqIsqzjP39Xt1CVXvZomRzr8/J8/t8+yMPsLTUmYamYeChteXk2U1+96tfYmOnhwB8/9o+Ykoptvf6M/Bd9ofxfcp6kNDlMstKCjfWQcJy5GO8JqEniHxJM1CMCo0RUGlQfkBhoNFdpNlqEscxQRhhPJ/KZNPa1ukzW8x1W5x86WXObe3R6sxx/PAqrTh0YynynH5/gJSKwPdcWSMKCYNgOifFeZsI33dyOFOTLMYYlPI4sDjnWoYEZGkKdQ+ea51yPXTGWE5v9uh05+nOWdcVUedkR4Viodum3W7U80QFu7t7WMS0h7EoNf1RwrOntjiwsshj77+bqAbVxR7NhauTth/hQurhsB7xUEzbidLc1U0t1g0ALiuefOE0X3v2FDv7Q5QUbygBe8efI6VmRfYrCtiv0IyFjq/JZIeABE+kdJpt5hoeo+GAsixQ9TKSUQGdZkCqWjTjiDAI8APfCad1haRkOE7JKzfQ5+mXNgniFvm4Ijvd465jSzQCiakJHFFLpoqyZJwkTkYlXY0uCgOiKGJ9bZ2ydEOHitJ1MERhwMJc21HxCPIiZ29vHz8IXXFaa8ZZyfntPc7vJfyxjz9Iu92qJVwuf7x4s+3FOXCaZlMCJskL+qOc3mDM+upyHYpeVDKod05MyiSep2g0mrTbruxgrEF5isAP6LYFNx+fZ2muRZoVPPPSOZ49eY69/sjNMv0GM5fW2huGPX1XjQ4UGGKRoMI2nknJBrtsD2GcZlMFfyP0GFQejUiwHDZQXkDgKwJP0QgU1QgwgiQrCeMGvaQk6i7SqAmcIIwZlD5xcIGmH41GaGOIo5C9vT5RHDPXaTIqCoZDOx3dEEYRURTSabvRelKIC/1sdX6otaFK3QDdNCsYZSX7/VENNDkVVou6y1vXWtGJOFwIQafTRcqRmwej3QqyZkNw67EWdxxfmzKtvd4+IIiiGKkuCKV39wec2R7w0N0nkFDnhKbuBIkpq4rHnzrJ0yfP0RuO8ZS6rh74G2WE0nUFPuWpqizLt3fZdYFJe3iNJr7nal+2viHu35ZuI6QSiq4sUY02caBoRwp0zna/rHcg+JgKwsinMxfSbDaIoogwCAl8D22HKDRVpTm/tcv6gWW++JUnGOcaP2pyeH2Fm9YXoO6imNQZB4N6tKDvO0a1DlP9IKDVbmFqwbUVAmMFRihWvYD1A8u0GiEWKIqCwWBAs9m8RLo2Tlx3/okjaxw7dNB5LeMG93pKEviBq/fVRfWqLOkPRgihKKqSvCgZ1Es6Vc18CiVo+m5w0ShJ+erTJ3ni+bOMktTpLoPry8tYawl8P5uB77KhczU6kAXWaEaj/oT/ulQXiiAWOZU/hyc0Mtsl8FqoSrK373r5kNCMAhItmW/6mMiFj6Hv4/suv1PZGGkNveGYIG6w2x+T2oDWfBsvCNkvFDtjw0pbTRlMJSVpltFoNKiqEl2VjOuOA89zu/TiOGZ5eWm6OUhKWTfISvKinCpqRqMRw3qwrRso5JjPs3sjjqyvTOdzirr1SEwnYF8ouURxzGA4RtdTxlxI7AYZLXSahIGHkpL9wZAnXjjDi6c2SNLiEgnY9WhSiNkYiSuoNVwlFAvEGwYfAq/s48UdoriJKTO2h26sw2RwUeQLGo0mSmmW2iEiaBAqQRxIIl8wSF3OVGrwPJ+s0DS7S7SaTcI4JowijO+hTQY40fS585s0GxFnz57j9Lkt4laHowcPMNeKa/aymNYZ/ZrdjMKQoCZwJp0Fvu/KHnlRYrSmrJdfmrp5tdWYjtyjSFOnH5WTfQuOYEnSjKSEw4cOMkoS8npe6JKBe+5osr4yz/5gxJMvnOGFU1dXAvZO0wZB6M9aiq4g7OxP+t2uhRVJD1P49bAkpjKtiXUCQ6laRHaMLz3mWk3akaTX20dXpWsDCkPypKTbaVD6gmYjdjNcfB/f97BVhbKFm2uZugnPT7xwFhXEZIlmfKbHnUc8uk0PYyYEjpiyqYmXTieuBUEwbaFaW1slzx2Bk2U5lYGblGSh26ERh5T10sudnR2kUijl1S0/muE45ZmXN1ldXeFb338nQRhOR9tLCTv7A77w5ad58fQGRanrwrl/wwzEDHxv1kx7BefWNa3PTBQqZT1SQbzCCfsUKOHhxx1UOSYZJIx7liTLEXUHRDP0GBmfViywUQPfq0NTTxGHCj20WA1JXhJEMb2kwG/N02g0CSNX4hjogPZFkrFKa4aDAXNzXfb29hDSo9tpUlYlw9Fo6hmjMCSKQ9rtJoHvo6SaLliZTHUGS5a5tiWn+XTMZ3+UsF5/BykFEsHZzR2+/vxpTp/foTKa4CLd5Q0ziVZAkt4Qju+662q45kTVK0F3aRQsEWWCtRV+o4EnDEmaXcKnKekIHC0Ec7JENto0Q0UzlChTsLFf1oOJFEjP7YeYW6LdahCGTtjt+z6VHeNTIKXk3JktFuY6PPXMC5zd2sOL3JLK24+uEngSY7lQZxxM1lJ7tWeMXAtVLfheXFyiPxhMZWee5xFHcMvRNe675RBYOLu5y9MvnuX0+V2M0S7kVZIb0ZSUbO70zAx8l2nVxeOsrp8TAV2VDPs93GbKS9cBWAQNkVP6XTwqZL5L4LcItGR3v4exFmGhEfoMCkG35VP4PnHkWNPJliC/yKEqyLKCXEOpLed7GY3uMl4QkdqQc4OKYwtOOvbKBuNJzjgajdwENM+xqXEcs7SwUBMvzoPFoY/veZze2OG3/+Apzm/vA25StOfd+B0GYTCr8122pWlmJ0r76wuA4k3yUItfDvAbXULPp8oTNgfFJQRO4AmazQZCGZbbIQRNQgVhIGmFHqM9TYWg1BblhRTaErXnabVaRJEjcPwgJDclgShf1QDyemC8EKZ6hEFIsxFzaq/HV589xdZuD4nL9XiXrGo2xrI4154RLlcSAt6Y5nKrYryH9gI3E5NLCRwLdENDIZpENsFTAZ12g26kSJMhRZHXHkuB54iVhaWQRuxanELfx/N9JCm2KngztLwSjEXhxgKOxyMef+48e4PkXddHNxmoJdwG4hn4Liter3cv3Lh3X9Yd9OVUL3nJ97MVoczx4i6qHJH1x1RDwSjJXDHeQuhJokaTwIflhRjphQSecjNNAg9ZFOTl5W/CmoBRSjfyYrI/8N1k1loqo5mba/Vn4Pum8XyvfMhf30PKKsVmmqDRwJduJ569xI9Z5hs+FT5zXgVRh8j3iANoB5Kd7fxGW0P3DTjE5Wxc/JUcXu/6J2NC4Ax6CCFfAbxagSNLci9GCoUq9ojDDl3fZzTskeYp12VefM28G9Ohvq9JjrsZw7Oc73JNSrlzLYvs31gPL6bZ4qufH0FQDfGiLlHQQmdjtkYVaVFM9/q9ndNt0tFwo4Gu0hqlJAeXO2ht2dwf8coRnUopvvbsqXIGvssHX3l1Hm5X73E5gHkTqdn1a1W6T1aF0964twu8G9XTTebXHDowz8HlLt1GwLOndzDWol7F+oKxZtbPdwWnsnz7ABaMkpyd3ph2I2Sh06DU1fThFW9aNri+QtSyLCiK3C2K/CZK9KaeTgrWl+e46fAKC90WaZK6cYtv4L1vlOt0vXm+t63Jk0KQ5iUbvYR7bruN244foj8a0ev3GYwGpGlKVV0Yz3C9g/GGOiyuQsIvauBZLGtLXW4+sspCpzGdwl1dBDrxBgfwDHyXD76rUmfQxnJ8bYnVhSY7e/s0Gw2OHDyE73mUVUl/OHBgHA5Is8xpO28QML57E2HwpKwngMPdxw5wYLGLH4YU9Qq3V64MeD1rNxszYfUVnPLy6ryOm6Q8GLt1Vb16UG5lLEEQsrq0wPLxBYRw/XX94ZBev8dgNCTLsmnX9syu4cF70eRvKSWtRugWouZuoanb56fqrn/xZqnHrNRw2R6rKsdXR+fkdiXIuoFVCIh8n+fObPO1F88z14qZb8esLHZZX15gca7L4twCCEtZlJzbPM/ZjfPvTgDaN4nZvkFmjH31n+u/ssZQak1Zh+Gekq/J2E6Y8lYzng3NvVxLkzR5uyHfZFamqP/ghhtVbOwOKUqNpxRJXjFKB7y0sU+ncZ4P3HW0Xkri0261CcPoXU9mXN9e8NWCi8t5LsQNUi++7tjOq3EgC3A7yiUEUpHnFV97cQMpmMqqvHpfnFs06TbtJGlGkmXkRf6WC9lutTFuS88sX7x6CaAFK9xUNykgL6rpcpc3OUBsHIU3RJ3vuioceZ6nr+YNTPOSF87uMspyfO+Vs1yc+UpyZqfP1v4Qz1Moqd4SgNyyEcMTJzd57swOQRjjez66cmMddL37fWZXGBXXg36fPLnJy5sD1tZXaDTi6c+Y17+2Jor8GeFyuRYEQZmm6VWCHlSV4YmTW/iedBPJpARrL4lJpJBs7Y8xxnJgvk1lzVv3XhbGac69t93FfXfcgrVu8lhv0KM/HJCMU1djrNc1T+qMM3vzmzcB3zDJKAzcevstmErzxNefYljvYHydkNpmWTnrariCc+/tP5n2wphANQ0pX32ygpvQrK0l9hSVMSglKbUHb1EaaKyl3YhZbMecPnuGIAhpxg0Orq5z4shRirJkUNcY+8O6xqgr3AxOgZDihlXfvP7Db6czZ8yVen4r0LqFFBmV1izEIUVW1Ati6qbg13jterKbObOxMxsXf9kHnrg6FLG7+YLeKK3LBnL6YGAtpXZ/d/DAPCsLbc5s7DHKch5/bov7bs0pysW37F0tbqisQJLnI4bDkVuhNcpZWZhjZbHLTUeOIKUizTMGwxH9QZ/BaEiSpmij3xWsqrWCooI4FDSjgGFyZdpmYyRRI+eeu36P8xvv4f3vuZ0jqwvsbO64dQJ1u9YbPUOzGS5XYFEUpaNR8rYVCrZGxt4gxVhQNfCqyu2FO7y6SLfVYDhOefalDfKiJM1b3HT4N/HEJlp//1un4qfTpp038z1FVRm+/sJ5ymfO0Ix85jsNVubbHF5dYmGuw3y3ixCSUlecPXeOs5vnUPLaANDW/7tatQZjBFb7xEHG4bWK1eWbGacZX3txA+8Kui+EUFg75sWTf5vV7g9z/JY/xijfoTSaIs+n/Z7GvnqZo7UWz1N6vtOaCau/0Zm7G+Hg1jVHYcCRtSUaUcD+cMxzL58nL0u3abVqcPtNm9x35A9AfQqlygnV9tbxJ0Eiee70LkiL77klJ3llOLs94KVze4yTjOPrCxiLK2s0226LzzXiZSbll6vBAwkrUJVHGGiGc6fZvuUZ/szczTy5fS+D0fiKoe2YTcnZs21e8E+xHj7DMdmmq5pIFFtI7BtdMHvjtKVdX+ATF4a6U+dsbg+4vez8QdQ5XRB4HF1bIgp8esOE0xvnKettPALL0vwyD92zwnLr56nKE2Afx9gPvSXfcPEnUtKVMfaGCZt7Q+LQr7sQLNJT+J5ica6JXy+VzPKCPNslK26s/jxhBUXloYKSJ5bO8onbz3DcbvPzUYYu3XTut/v4S2FY9DT/bP93eHK8wWE/4nhwgHuio9xql/GEet1DUEpZtpuN2XLMy7V+v6/FRSHn2Z0BvhJ0miGekAQycMtFMFTo14WElG4ByZHlLo1mg/5ozMmzWzX9735qfXmB+247xq3HjiLs3+XlU/M0Gxso2SIO/5De4DiI/M09SX1oPHt6hzj0wVpC/9I1kNaC70n6o4yXN3rcenjpwgqtG4X9tIKy8rBBxUPHTvMrrRf4jdYuj3aaiJ0YYT2qyNY11sv3rn/qp36c4yefx1X2DELmfFz8PoYvTq+zBSJ8FJKPX7Rg5vThY/zzP/0XpzdEKuxrXNd/CPxZruxo2AI+DOy+Mt1414Cvqqop+6ekYLs3Yqc3phkGrBxqsd3dplnFrIou87Lt9pm/xrUUdfTRaQR88elT6Hq7qxCCo+vLPHD7CQ4eWECpGMEv8OLL5+m2t9DlHJINdHUQId46YSaB7V7C/igl9L3X9GQCt/Lr9FafIwe6RIGHsXY6zu96hqC1Aqkstx84zc82n+T7boffeknQ3ReEDY9KaBpBikJcsdOL04RGmlzKAbzmHCTn1PxX/O4UnYIqDMPXunktYP5KH8134hZdb2ynuVh76Cu31fVD99/G0YPL7JZ9TmXbvJSdZ5wUHDcHXtcDunEDFolAeB7HDy7x4F0nWFuaJy8qjDVgRujqPtbXD1NkTxIGf4g1HmG4ibWHQZRvfM1rMTA10eLXapdXfo6y0gS+G2zrKelkPDYGSuD6lyFardi56Sm+96aT/MRWRlYtUJYZEiflMxW0c4lsXPk0NPM2CCczPewsUgobh+FrofbtlB/ekaL99bYoJb04odLGsrzQZWWxCxYWZZfV5gIf7NzFxv42W7u7bqvra/gZi631apb333OCu245ys7+iJ/5//4rawstDq4s4Ac+jWieIFyj0boP7Hcj1SmKjRRB780PO5djsD9MGaeXjniYNIN6nuTo2gKL8y3Obe4jBfzBM30+eO/XiNRRYOGGCDlNPKYsFVXWwWqBjivGvkArgzWagnwaib1dZc+pT36KJ//cn8crXrtWXgaS23/qpzj+iz/3GuyrtaMkfcMPsHvvfXzpb/1vqOq1f6wKJIf/869y14/+k29OtrPShluOrHB47QC+p5yKXQgyWyJ05cLI1/egdfjqlCXCaF586TS/9fiL9EcZq3MN0jRlMBqzL3ooTxH6IXEcorwlDOd4q8GglE7GlpclXt3yUmpDFPisLXdpN0NGSc4Tz5+lqjR5GXPw8IssNX+B/eFfu7aKF+EOBWPe4Nq9IikSgBEWr/QJrUQEBUYqZCmp8ha0FCYoEGEHKapXEVGX772gf+stPPPHv4vwdfxN7sHK4384Bd/kd6WUlGVln3ruZfu68SqQHFjj2T/xWXz92h829yDuDeEC+Aww+qYBnxCCyBNsbm3Ve81Dt6Gn3kfwhoXWi8hTa9zKaCUEoe8jRAFWEKoAiUZbQ1UZqjJhnKREYehyz7cCiroaMfnZoqyIgoDDa0t0WzHb+wOee3mTsjJgDdoEHD8sef9tv04c3wbeNmc315msRbgepKCv+xE8jZYWrxK0rKQSFbaZ4MVNlk7fzvKTn2T73i+j5FtTdj32+V+u9UwCK2Bxd/vCgVaWBBr811GR2Q6o4kIpb35/j4//+q/UH7NqPvCVL/4VoPeKsPGD09tWVQQZeNlrf2HbBZVfQrZ1gb9f5wgCVzr+n95V4AuCoCiKCyzxpLygtWY0HjMaj+uhrz6C1+4gmFzLUmv0dH2ywFg3tWt1qc1OuMcgG9CiQUc2iGWIkAIrjBNgv3VH4gTWxuIpj8MHF2hEIfuDMU88f4ay1FhrMMDa0gLvu/sujq7+Q7a3DiN4lnT8MYqqoDcqaTd8PCmp5aeUetLicZ2UrYyiMpDaElSOX65w/7OfpXl0h9xu8uSpu4i8kA/dvod9CyrBxz7/n67gBLjowU0vOKL53h7f+mu/dDGx8tfe8L5Z86ZrWGVxyXLbNvA/vOJH3l3gE6/Tgfxao8/htXu8JuMgeoOEUZHz6EO3EAYeVaV5712HWeg00Wh6xYheNeJUuYmuDLENmRNN2qZxWcSW1ob5dsTdNx1kc2/Ay+d20LquIwrBobUl7rvtKMfXTxDHP8Yzz6TMzQ0o83XmF/4zz5/7s7xwPiEOPeJQESjfsbuLBl2CVD5FCdZqhPjG6YU9ArS1dJPbib2X6D75CIsbN/PL2+toa9g4/Vvsd0qUmsPat/c5ZfXm/IY3Tq789cs3LwPKPL0G1/QGtDcKCY2xRIHH++85xtJ8hyDwEUIQhpI4Cqi0QVjJoj/Hij+PjSG1GfvViKRIadnmZYmdjYVmHPD0qbNs7Y2cGl/A0fVlHrzzBIfXFsGGeN6XOHnyadrdjDyxRPE5tP4wYWiQQlBpS39UsTifcPPx54nMS3z12bs5v7vM3TcrWq0lSh1RlBprrp16ys2gtSx5c3S8l7j56c/xRe9xjH8rlerT6+2SZQn9/fNIFi+fkReC0cGDmCBw3R9aky6v8EbnjDCQrqwwPHIYqy7vERZaMz546A29qzBQdOcveX1hLc2zZ5Fl+e4En+d5VU5ueBt9hm6/uaTIc86c38BTHkHgE0924QW+mwWCpbSuUOvjs+4vopVhfJmiXAFYYxG4HQjH1hd44I4THFldZJRmZHmBUoZKr7G08pcpy6+j4pPk2Uv44SZFURemjWShk/Op+3+drz6teG7jvSwemOOexd/nQHuLz39B8fTJRR577D3MzR1D6+qawU8IjXn2EZ6zAQif/+e3389o/zlG/XMsLB5AeQJpQ5RT0V4WAKsw4ld++hfp334rMrcIYzF+iP8G9IY/hsf/57/NH/6Vv4G9TB2wMBbr+ag3uM3+EJ7/43+Wk3/0T7jXVwKZJXznJz7G/DNPvzvBV89bfNv034S4kEKgdUWSVCRJ4uZ/eB5RGBJGIVEQuPxRCjQWKyGKfPLyMlXxAipdcfvRJR6+/3aSXPMLv/4lrC65+6Z1POUTxQ3iqEUYfBwpIIr3GQ2HKLULWDxlGKWKX/ztDzDIFjE24pPHP0872ibNQ4RK+Pgjpzm66rM3PvE2ro2ta5OXkYurio1+lx/9tc8w2n+aQX8TY4wbbESASUEvDNBrFvT85ckrBVTNLkWrjfIveJ43jLAt6DCiiq9s3Iew8GYaChME6Chwb6fA80O4yt0n11vYqWydrV8tCv7C4hL3elVVMSwvrFeegDGOI4IgIPR9GnFI74r23Fg2N7f5yvPnePrlbe48dgBdaZI0ZzgaIqTC93yi0CeOY6oqAltNJWZaS4b5Kp1mye3HT6LEkGeeN/y/P7/Lt33LHI99LObMVsD2EN7O4tjLVclK5bG9+Synz40RokJJD88GlEPYuPdx5PqIUedJTOe9iPKWy67zCV0hK7icqa1vCtC3+9xc9PrWOob0atPR15fnU/KrjUbjzxdF8agx5n3W2mPWWu/qg/HVSyQHwyFKKcIgQCl1Ge/nQk5XP6una0mFkk6dEwgPoSTaagyWsnTrnJM0c50P4sINlgoevu8FDi88zd7OkF//8v187evbHD/xPCdu9vm1L+zz1SdbfOgjAnON20XTtAd4KBNSpQIzP2LtkxnFLRv0q3O8t7XMQb1Eld04K96sdP8ASH3tieXri+2EgeepH6sq+WO+73W1MXeBeNgY81Gj9UPW2hV7Uf/c1QajMYY0cyu73srIcYErhxRVgRAQ+GrKgC532/hLlq+VJ4l1RFc2aYiIQPhYZVGeRKkL76GNpNPMOBA9xW9/aYXN0aM8cFePjz74PA2vwY/+5D6PP5nxbZ9soCTXDHxiMgqs8hFZgFgasvzxDRbeW7G2GFCN2/SydZ6rzrCT9uoS0I0BPpUlSOMWjeqg6cgV+00KvklOUlsf+B3PU78D6u8rGa5nWX6/lPJhrfWHjDH3W2s71KPFrwYYJ6/x1l7JvWdRVZzfG/K+e44Rhz7WWm46ukSrERJ6HsMqpa9H7JdDzus9lBY0iZjPWsReMGVWPWUYjAP+45ceI69iGrHm7tWvQ7HP8y8Kbru9xX/z3S2EDDm1abmWXUjCSEyUM/7Qs+i7zuIvRURVg3M7mm29y9ZgzP3+e/jkgUfomIjy/MZ1TpdDFcKjf/n7Wf/CrwOCz//4T3H+kQ/hJd/E4HstMNagOAecC0L/P+pKeUKK40VefADBR6wxD2pj7sGirlWLgLVuPOG9txxiaXGe0HfjB5WSzHebGGMptCYSIW2/wSEfKqsZm5SdakBRVDRFdAmYKw1S+tx3ywbvWX+O8/0eP/sMPP7LCX/zv53jUCvniVP62rZAWLdkOX30KVoHS+5u38dCKHmi9xWe2tnk/cF7+RsHv407Wkd47tw5Pv/s0+zsD/GUvO4B2Dx/jtapUw4IWXI1Jgi9u8D3Op6xEkI8JxDP+YH/L60xLYS4pSzLh7F8zBhznzHmJvej79y+Pylc/Le5uT1V3kRRSBRFBL6P53lIKSitZuKhmzKmG7ZIbFZv2nELQKzxWFgyfOTOz7M3OMWPvFDx2/4yD923yA88kJPv5/zNL1b4G4bvvl9w7VIr62qZjYiDrYhB+RSPb2xyu7iTv3z4v+M9zWOc3Nrmp7/8Xzi7tVfPRr0xHivj+xflf9f+sLjhx0jU1PlISvkV4CthFP7jqqyWENypK/0w8HFjzN3GmANXO1+cMIdSuj62onBkSr8/QClFEATTssaEyAEo0fiRhykrtDYszcXcddNB1pc97GjEDo9SrW7xAwe+xML5Hf75VsXvhB0+ev8cn9ZNxuftFXo/UatP7GX9jhSKfvkyz57d5r3qfv7O8p/goblbObW1w89+5Xc5vbEDcFET8du4ngqMf3k3QL2FytDF5AoCjMcljcxWKYxX//3kcK1m4LsSz7gjpfwtI8xvRXH0A1rrI7qq7jXGPGKM/YjR+k4L7ckMz6uSL9bsxMXkTZZlpGmKEGLKpIaRK/YHQYAKAk4cWeH2m9aRSpCXFhs9yp0NeK8QlIMjnA0ijq0nfHr+Cyxtn+QLuwU3Ra9BirxTRIGFnIJ7/Lv5Xw59gAcat3B2d4ef+cLvcGpjD4HF97y3TLJoY14X+1ZC0O/T2Dj7ljyRsBbj+4wOHce+UT+gqMmVMgUhQYBMBaK6oFbxxgOCvR5+bpl25cYdR0HPwPc2wGg5JYQ4pZT691EcyKosb6u0fp/V5hFj7QeMMbfjaoxXzTNOyZtpDU8zThLGSeIWuHgeYRjSiCOsDeoQVQIZpYHcWghvYimGzwhFVSzRa8EtQUW1N7jkM2ptUUq4AQtWUtVjNq5G+mtwK7v+0vqnqXLNzz/+u5zZ2MVeMi7jLbyOsRhraDXipw6tLf0I8I9f+TNlC0783H/gY3/p+2rwiTcBn2G8fohf+MKXybtzr+upyiY8+A/+Hrf/5E9MQW2FoLG5Of2Zj3z/X6CKI0Q9XtJEEb/8c/+J/okT75gHfNeD75UkCa436ykp5VMI8ZO+VE0Ed5dF+WHgw8aY+40xR6/2bvhX1herqqIsS0ajEUoqfN8jCAOiMCIMJ2CssBbGpsB6XZqBROoh5+xg6mk8JXl5e5+dvQQOl6gIVu0ci7JNJALAUjj9zpU/JFLx61/9Opu7A7Q205LKWwWdxdKMo2dXl+d/ZHGu+y/CQPVeC3wIUEV+WfrJsLf/pm7fKmhunKN1+vTr/kxj89UMrSzKd5Tc+qYC3+uEqGOB+D0hxO+FYfAPrLUrVaXv1kY/aox5BMudRptlyzsHRoslLwqyPGeAK/ZPyZswIgh8lNIIQe3PLg05jbVs90e8//ab8VbgxeF5nsnOIyvBkmlxXK24+uIVfk5rLRs7PZSUqLcIPGMs1hqiMDwbx8EPr68s/Ohcu7lXVdYtwHyt9yohWTvExsMfwSj15p7PGNLlFazy37BFSBaw8cGP4A8T97rCESyHPv+rNM+eAeD0Y58kWVtDaIPAov2AotNF6Bn4riUYt6QUnzdWfN73faSQJ4D7i7L4qDX2w9bam40x7atN3Lyy2J/lOVmWAX08zyPwfRqN2HWhi1fnZYUu6aoGd7UP80B8C4nJ2Sx7nEo3KQeWQL+9GNR7i7rGiXY08P3zc932P+u24h/LyvKMtQ509g0+hJ/A2Y99gtOPfeKycm1ZvLFW00vgue/5HM/8qc9Nf6ny4NN/5NNT8P3B//p3OPXoh/DLS39Pls5zzsD3jbEXPc97sazKnwujwAPuNNY8WJb6I0brD1prjwHBZGPq1cCjG4PBRZpPTao1SU3eXAx6Y9x80wfuvIm1A/OMyozKaCSSg/4iR4MVXk7OkOgUVZdB3wlyxliLMQbP87bn2s0fW5xr/xMp5WljzGsusnx9bwbqandMCceITllRASJy7UVTIKQZfuE6Jq6VzcD31j0iFioBf+j7/h8aw094nmoJIe7XWn/AaPNwrUddu9qF/leSNxdbpQ0HV+aY67Yo8hzrAOA6NaymtG5S27RHsSbzxFW8NtoYwsDvHVha/Ffa2B8WiGcR4rJA90pPfi3s4txSmGvfqDwD3xUzqBaEGAFf8H3/C0aavx9F4YGiKN5bFuVHjbUf1FrfA8xdbfLmlTmftYbdvR7gvKAfBIRhSByGBGHwjgzmtdZNEQ98b3Bgfv5fzXdb/1cU+E9s7PRviL2EwsDo0CGGx45jpaCKGwg7A98NCcYaYJtCiF9SnvolhVBBEBwF3l8UxUestQ8bY26x1kZXO18ELmxsBfI6X+wj8DzF1QS/tRZjLL7vpc3Q/6m5TvMHF+c7X6u0fl0i5fq7YS4E/Z2/94+RusQKgQka11TXOQPfOwtILaV8UQjxopTyXyvlxVKJ26yx7y/L4lGtzfustUesden8O0XeTIZIXZW8zhiUUmm3Hf9Mu9n4IW30l6dEyvU+dvs1TMcNqsmI+W/2lqJ3ORhTKeXjQqnHjdH/VHle1xp7n5DiQ7rSH9ZaP/hOtUxdjZxOClk14uhn5jqtf+R58ovCQmnsJW1RN5oJ/Y09L2bg+waRN1j6Qojf9H3/NwWCIPDXgfdXWn+oKqsPWmvvNca0vpFrpKtKI5U0aysL/8H3vH80SrLfmIxKlLP11jPwvWvACOeElL8QKPULWAJr7RGl1MNVVX3EGPOQMeYOa60nEG/7uH4jtYutw0spJctLc/9+dWnuB7vtxq/t7A0YjJLZDZuB710PxkII8bwQ4vkg8H6yqkxbKnmLgA8XZfkxa8wDxtijVxKi2jdIbVx4KWjG0a92W/H/eWh95VdE/ffmHWMwBWWzSdEAL7hO74kC4zeuetvRDHzXPRgBGAoh/kBJ8QehCn7IartSltWdSqmPVlX1iLXmXq3N0pXmeBMQt5vxbyx02z+olPx3ldZGa4OUAvUOZkZCa478p3/L4tfWkdV1ypZKgSwKgn5/Br5vciACbAkhtjzP+w0pBUJwFHjAGPtIXhQfwnKPMabxZmDU2iCkIPC8/7K40PmHrUb0b7FCF/W67Gthqsh55K/95VnYObMbNl982ff9l0H8grHWV0reWhbVB5WSHyvL6v46XxQXg05rw1yn+ZVup/FDo3H2U4HvFcbaa15onuV8M3s3AbEE8YRS6okoCn/M2rQjpX+HNuYjUoiPVkl2X6sR7c/PtX+w047/dVlU48Eo/UaoUnpcN1tgLj8QvSoh940gBZrZzN6NJmeXYGYzm4FvZjObgW9mM5vZDHwzm9kMfDOb2cxm4JvZzGbgm9nMZjYD38xmNgPfzGY2sxn4ZjazGfhmNrOZzcA3s5ldN/b/DwCpT8Dqc3R7KgAAAABJRU5ErkJggg==' /></div>"
"<form class='login-form'> <input type='text' size=25 name='userid' placeholder='username'> <input type='Password' size=25 name='pwd' placeholder='password'> <input id='button' type='submit' onclick='check(this.form)' value='Login'> </form> </div> </body> </html>"
"<script>"
   "function check(form)"
   "{"
   "if(form.userid.value=='admin' && form.pwd.value=='admin')"
   "{"
   "window.open('/serverIndex')"
   "}"
   "else"
   "{"
   " alert('Error Password or Username')/*displays error message*/"
   "}"
   "}"
"</script>";

/*  This is the Index Page after Login  */

const char* serverIndex =
"<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'></script>"
"<form method='POST' action='#' enctype='multipart/form-data' id='upload_form'>"
  "<input type='file' name='update'>"
       "<input type='submit' value='Update'>"
   "</form>"
"<div id='prg'>progress: 0%</div>"
"<script>"
 "$('form').submit(function(e){"
 "e.preventDefault();"
 "var form = $('#upload_form')[0];"
 "var data = new FormData(form);"
 " $.ajax({"
 "url: '/update',"
 "type: 'POST',"
 "data: data,"
 "contentType: false,"
 "processData:false,"
 "xhr: function() {"
 "var xhr = new window.XMLHttpRequest();"
 "xhr.upload.addEventListener('progress', function(evt) {"
 "if (evt.lengthComputable) {"
 "var per = evt.loaded / evt.total;"
 "$('#prg').html('progress: ' + Math.round(per*100) + '%');"
 "}"
 "}, false);"
 "return xhr;"
 "},"
 "success:function(d, s) {"
 "console.log('success!')"
"},"
"error: function (a, b, c) {"
"}"
"});"
"});"
"</script>";


/* and here the program code  */


void setup(void) {
 Serial.begin(115200);

 // Connect to WiFi network
 WiFi.mode(WIFI_STA);
 WiFi.softAP(hostName);
 WiFi.begin(ssid, password);
 WiFi.setHostname(hostName);
 Serial.println("");

 // Wait for connection
 Serial.println("Try to connect...");
 while (WiFi.status() != WL_CONNECTED) {
   delay(400);
   Serial.print(".");
 }
 Serial.println("");
 Serial.print("Connected to ");
 Serial.println(ssid);
 Serial.print("IP address: ");
 Serial.println(WiFi.localIP());

 /*use mdns for host name resolution*/
 if (!MDNS.begin(host)) { //http://esp32.local
   Serial.println("Error setting up MDNS responder!");
   while (1) {
     delay(1000);
   }
 }
 Serial.println("mDNS responder started");
 /*return index page which is stored in serverIndex */
 server.on("/", HTTP_GET, []() {
   server.sendHeader("Connection", "close");
   server.send(200, "text/html", loginIndex);
 });
 server.on("/serverIndex", HTTP_GET, []() {
   server.sendHeader("Connection", "close");
   server.send(200, "text/html", serverIndex);
 });
 /*handling uploading firmware file */
 server.on("/update", HTTP_POST, []() {
   server.sendHeader("Connection", "close");
   server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
   ESP.restart();
 }, []() {
   HTTPUpload& upload = server.upload();
   if (upload.status == UPLOAD_FILE_START) {
     Serial.printf("Update: %s\n", upload.filename.c_str());
     if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size
       Update.printError(Serial);
     }
   } else if (upload.status == UPLOAD_FILE_WRITE) {
     /* flashing firmware to ESP*/
     if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
       Update.printError(Serial);
     }
   } else if (upload.status == UPLOAD_FILE_END) {
     if (Update.end(true)) { //true to set the size to the current progress
       Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
     } else {
       Update.printError(Serial);
     }
   }
 });
 server.begin();
}

void loop(void) {
 server.handleClient();
 delay(1);
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)